https://github.com/fffonion/MAClient/blob/master/PLUGIN_DOCUMENT.md
關於MAClient請 戳這裡
MAClient Plugin Document
本文檔給出maclient插件製作的標準和一些參考
概述
maclient1.50版本開始支持插件,通過在配置項中的“啟用插件”功能(enable_plguins)和“禁用單個插件”選項(disabled)來控制插件的啟用與否。
插件為py腳本,放置在plugins目錄下,由maclient_plugin在運行時載入;其中下劃線開頭的腳本和子目錄中的腳本 不會 被載入;同名腳本的優先級為pyd>py>pyc=pyo
插件分為兩類,一類在指定的事件發生前和發生後作出響應(下稱hook插件),另一類擴展命令行界面(cli)的可用命令數(下稱extra_cmd插件);兩種類型可以存在於同一個文件內。
HOOK插件
示例
結構
下面以example_hook為例;在這個例子中,在開始攻擊妖精 、 結束攻擊妖精 和 進入探索 三個事件發生時分別在屏幕上打印一句話
開頭需從prototype導入pluginprototype父類;然後定義插件名稱,作者,版本:
1 2 3 4 5 6 |
from _prototype import plugin_prototype __plugin_name__='sample plugin' __author='fffonion' __version__=0.1 require_version = 1.71 #需要這個版本以上的MAClient require_feature_nologin = True #無需登錄即可運行的命令(extra_cmd用) |
定義事件鉤子,即ENTER/EXIT _ EVENT_NAME:
1 |
hooks={'ENTER__fairy_battle':1,'EXIT__fairy_battle':1,'ENTER_explore':1} |
可用事件名稱
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
tasker 任務調度器 auto_check 自動檢查卡片、絆點是否已滿 check_strict_bc 檢查是否觸發嚴格BC set_card 設置卡組 red_tea 嗑紅茶 green_tea 嗑綠茶 explore 探索:選擇地區 _explore_floor 探索:走路 gacha 轉蛋 select_card_sell 自動賣卡 fairy_battle_loop 刷新妖精列表循環 fairy_select 選擇妖精 _fairy_battle 攻擊妖精 like 問好 friends 好友相關 reward_box 領取禮物盒 point_setting 分配點數 factor_battle 因子戰 invoke_autoset 自動配卡 |
冒號後的數值表示鉤子的優先級,越大則越先被調用
如例子中定義了在 開始攻擊妖精 、 結束攻擊妖精 和 進入探索 三個事件的鉤子,優先級為1(最低)
如果不需要extra_cmd,此處留空字典
1 |
extra_cmd={} |
類實例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
class plugin(plugin_prototype): def __init__(self): self.__name__=__plugin_name__ def ENTER_explore(self,*args, **kwargs): print 'explore!' print args #must return input vals. no matter you've changed it or not return args,kwargs def EXIT__fairy_battle(self,*args, **kwargs): print 'fairy_battle done!' return args,kwargs def ENTER__fairy_battle(self,*args, **kwargs): print 'fairy_battle!' return args,kwargs |
類名稱必須為plugin,且繼承plugin_prototype父類
對每個事件鉤子,必須有一個同名的類方法,args 和 kwargs 中被傳入了這個事件被調用時傳入的參數。
可以使用self.tuple_assign(繼承自父類)修改args中參數內容,如self.tuple_assign(args, 0, ‘123’)#將args第一個參數改為123
如果沒有return語句或return後無參數,則默認為不修改參數
類運行時會先生成一個實例,因此你可以保存一些狀態信息等
關於參數的具體內容可以 參閱maclient.py
應用
示例中的bgm插件,僅額外使用了一個棧結構就實現了bgm的切換
EXTRA_CMD插件
示例
結構
meta部分與hook插件相同,區別僅在於extra_cmd字典中需填入擴展命令的值和內容
字典的key表示擴展命令,value表示要執行的函數:
1 |
extra_cmd={'web':'start_webproxy','w':'start_webproxy'} |
採用函數式結構,返回函數的名稱隨便取,不一定是do:
1 2 3 4 |
def start_webproxy(plugin_vals): def do(*args): ..... return do |
在plugin_vals中傳入了maclient在運行中的 所有實例變量
有用的變量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
plugin_vals['poster'] maclient_network中的poster實例,可用於通信,返回已解密的內容 plugin_vals['player'] 玩家實例 ├─.cards 卡片數據 │ └ .db 卡片數據庫 {1:['第一型蘭斯洛特','5','19'],……} │ └ .cards 玩家所擁有的卡片 ,列表,元素為object_dict類型 │ └ .sid(xxx) 按serial_id找卡片 │ └ .mid(xxx) 按master_card_id找卡片,返回列表 ├─.item 卡片數據 │ └ .name 道具數據庫 {'1':'AP回復葯',……} │ └ .count 道具數量,如{'1':123}表示1號道具有123個 ├─.ap / bc │ └ ['cur'] 當前值 │ └ ['max'] 最大值 ├─.friendship_point / gold plugin_vals['loc'] 服務器名稱 plugin_vals['cookie'] 小餅乾 plugin_vals['poster'].logger 輸出日誌用 |
其他變量請 參閱maclient.py,所有以self.開頭的變量均可使用
應用
web_helper藉助小餅乾和一個代理,實現了在電腦瀏覽器上查看活動信息等
from: MAClient - 掰彎亞瑟王python客戶端【非公式 ; 論野生技術&二次元