Skip to content

Latest commit

 

History

History
173 lines (130 loc) · 6.12 KB

PLUGIN_DOCUMENT.md

File metadata and controls

173 lines (130 loc) · 6.12 KB

MAClient Plugin Document

本文档给出maclient插件制作的标准和一些参考

For English Users

##概述

MAClient1.50版本开始支持插件,通过在配置项中的“启用插件”功能(enable_plugins)和“禁用单个插件”选项(disabled)来控制插件的启用与否。

插件为py脚本,放置在plugins目录下,由maclient_plugin在运行时载入;其中下划线开头的脚本和子目录中的脚本 不会 被载入;同名脚本的优先级为pyd>py>pyc=pyo

插件分为两类,一类在指定的事件发生前和发生后作出响应(下称hook插件),另一类给命令行界面(cli)增加新命令(下称extra_cmd插件);两种类型可以存在于同一个文件内

##HOOK插件

###示例

example_hook bgm

###结构

下面以example_hook为例;在这个例子中,在开始攻击妖精 、 结束攻击妖精 和 进入探索 三个事件发生时分别在屏幕上打印一句话

开头需从_prototype导入plugin_prototype父类;然后定义插件名称,作者,版本:

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:

hooks = {'ENTER__fairy_battle':1,'EXIT__fairy_battle':1,'ENTER_explore':1}

###可用事件名称

tasker 任务调度器
auto_check 自动检查卡片、绊点是否已满 
check_strict_bc 检查是否触发严格BC
set_card 设置卡组
red_tea 嗑红茶
green_tea 嗑绿茶
_use_item 使用道具 (1.68及以上版本)
explore 探索:选择地区
_explore_floor 探索:走路
gacha 转蛋
select_card_sell 自动卖卡(1.72以后取消)
_select_card_exchange 选卡来卖或者合成(1.72及以上版本)
sell_card 卡片贩卖(1.72及以上版本)
buildup_card 卡片合成(1.72及以上版本)
fairy_battle_loop 刷新妖精列表循环
fairy_select 选择妖精
_fairy_battle 攻击妖精
like 问好
friends 好友相关
reward_box 领取礼物盒
point_setting 分配点数
factor_battle 因子战
invoke_autoset 自动配卡
_exit 程序退出 (1.67及以上版本)
sleeper 睡眠调度器 (1.68及以上版本)

冒号后的数值表示钩子的优先级,越大则越先被调用

如例子中定义了在 开始攻击妖精 、 结束攻击妖精 和 进入探索 三个事件的钩子,优先级为1(最低)

如果不需要extra_cmd,此处留空字典

extra_cmd={}

类示例

class plugin(plugin_prototype):
    def __init__(self):
        self.__name__=__plugin_name__

    def ENTER_explore(self,*args, **kwargs):
        print 'explore!'
        print args
        return args,kwargs

    def EXIT__fairy_battle(self,*args, **kwargs):
        print 'fairy_battle done!'

    def ENTER__fairy_battle(self,*args, **kwargs):
        print 'fairy_battle!'
        return args,kwargs

类名称必须为plugin,且继承plugin_prototype父类

对每个事件钩子,必须有一个同名的类方法,*args**kwargs 中被传入了这个事件被调用时传入的参数。返回argskwargs可以修改真正传递给被hook事件的参数。

可以使用self.tuple_assign(继承自父类)修改args中参数内容,如self.tuple_assign(args, 0, '123')#将args第一个参数改为123

如果没有return语句或return后无参数,则默认为不修改参数

类运行时会先生成一个实例,因此你可以保存一些状态信息等

关于参数的具体内容可以 参阅maclient.py

###应用

示例中的bgm插件,仅额外使用了一个栈结构就实现了bgm的切换

##EXTRA_CMD插件

###示例

web_helper query_tool

###结构

meta部分与hook插件相同,区别仅在于extra_cmd字典中需填入扩展命令的值和内容

字典的key表示扩展命令,value表示要执行的函数:

extra_cmd={'web':'start_webproxy','w':'start_webproxy'}

采用函数式结构,返回函数的名称随便取,不一定是do:

def start_webproxy(plugin_vals):
    def do(*args):
        .....
    return do

在plugin_vals中传入了maclient在运行中的 所有实例变量。实际上它就是 self.__dict__

###有用的变量

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['logger'] 输出日志用

其他变量请 参阅maclient.py,所有以self.开头的变量均可使用

###应用

web_helper借助小饼干和一个代理,实现了在电脑浏览器上查看活动信息等