自动挤地图(窗体操作) 攻防挤地图,帮会挤地图等都可以使用这种方法,这里主要介绍窗口操作。
该插件的核心如下:
1.获取窗体信息
2.窗体操作
获取窗体信息:
获取窗体信息的方法有两种,一种是通过事件的获取,一种是遍历窗口信息,比较简单的是通过事件获取。
通过翻查解包的文件,找到DialoguePanel.lua这个文件
研究系统文件通常是做一个插件的基础
在这个文件里面找到了一个事件:OPEN_WINDOW
再向下找,就可以发现这个事件的有效参数
从下图可以得到很多信息,比如说事件的相应参数,同时也了解到了会触发另外一个对话事件
测试与对照这个事件的参数
测试与对照这个事件的参数 RegisterEvent("OPEN_WINDOW",function() Output(arg0,arg1,arg2,arg3) end)
通过对比验证得知:
arg0=窗口ID
arg1=窗口内容
arg2=产生窗口事件的类型(Npc)
arg3=产生窗口事件的ID(NpcID)
经过反复校验后发现arg0是随时在变,基本上是打开一次变一次,而arg1基本上为固定。虽然arg2,arg3对于插件帮助不大,但可以用在保护措施,比如说判断是哪个NPC触发的。
最大用处的arg1是窗口内容,可以通过字符串操作来对比或者获取部分内容。
打开不同功能的npc会发现一个有趣的现象:
这里只是部分,根据DialoguePanel.lua总结:
text = 普通文本
$ = 选项
A = 动画
AT = 动作
B = 银行
BF = 战场
C = 自己体型对应称呼
CB = 寄卖通宝
CS = 购买通宝
E = 生活技能学习
F = 字体
FE = 五行石相关
G = 4个英文空格
GB = 帮会仓库
H = 控制行高
HS = 发型商店
I = 物品
J = 金钱
K = 技能学习
L = 邮件
M = 商店
MB = 通宝换购金钱
MS = 金钱求购通宝
MT = 地图内交通
N = 自己名字
O = 对象
P = 玩家
PG = 页码
Q = 任务
S = 字串符id
SD = 声音
T = 图片
U = 马车路径
W = 需要确认的选项
WT = 延迟
X = 输入框
Y = 拍卖行
有了这些,就可以通过字符操作来获取商店ID等其他有用的信息了
例: local shopid =
string.match(arg1,"M (%d+)") 再用tonumber转为数字就可以用来打开商店了,其他的以此类推。
遍历法:
上面的列表其实就是通过遍历得来的,具体代码如下: local frame =
Station.Lookup("Normal/DialoguePanel")
local aInfo = frame.aInfo
local nCount = #aInfo --#aInfo为表格项的数量,同getn(aInfo)
for i = 1, nCount, 1 do
local Info = aInfo
if Info.name == "M" then
OpenShopRequest(tonumber(Info.attribute.shopid),
frame.dwTargetId) -- 开启商店函数
end
end
关于这个aInfo的表格架构,就不多说了,有兴趣的可以自己导出来研究下,个人还是觉得用字符串方法比较简单- -
窗体操作:
说了这么多貌似跟挤地图没什么关系,其实这楼主要是讲窗体操作方式,而挤地图是其中最简单的一种。
上面可以看到,对于不同类型的东西要使用不同的函数,比如说打开商店就要用打开商店的函数,如果用选择的函数,是没效果的
如何寻找该操作函数?
在游戏中我们是用左键来选择的,所以在这个lua里面就寻找左键按下相关的函数:OnItemLButtonClick()
上图所见,不同的类型有不同的操作方式
插件制作:
前面主要讲了下窗体相关的基础知识,现在来实际应用,在这里简单的制作一个通过方超或者图霸返回浩气盟或者恶人谷的插件。
讲过的步骤就不再重复了,见图
由于是使用命令来选择选项的,所以,选择了一次后面板不会关闭,于是就可以无限的选择,直到进入地图为止
首先建立一个空窗体用来Breathe
再建立3个变量,一个当开关,一个保存窗口ID,一个保存窗口内容。
这是因为如果是通过事件来获取的话,就需要在窗口打开是保存先来窗口ID跟内容,因为arg0跟arg1是随时在变的。
如果是通过遍历法提取对话内容的话就不用保存arg1,可以直接遍历提取,但是还是建议保存一下,避免循环时一直遍历增加资源消耗
注意OnFrameBreathe要放在调用打开窗体函数之前。
GetClientPlayer().WindowSelect(窗口id,选项)
选项从0开始
总结:
这个插件相对来说比上一楼的要简单,主要是因为这楼是介绍窗体操作相关的功能,个人觉得最有代表性的插件就是挤地图了。有兴趣的可以自己加上阵营门派传送人的选项,直接elseif string.find就可以了。
|