释放技能自动下马(取消buff)
在魔兽世界中,如果是骑在坐骑上使用技能会自动下马释放,然后在剑三中并没有这样的功能,这是因为有马上的技能,然而,对于释放技能就下马来说,这应该是个很不错的想法。
我们的基础目的是要使得使用技能的时候自动下马
联想到游戏中下马可以通过两种方式来实现:
1.使用骑乘技能
2.取消骑御增益(buff)
前者被和谐了,虽然有法子钻孔,但是相比较下后者的生存能力会比较久。
所以我们就从取消buff着手。
需要知道的是:
1.怎么判断与取消buff
2.如何在使用技能的时候执行命令
3.马上技能该如何保留
这便是插件的雏形
怎么判断与取消buff
通过简单的代码来导出一下buff这个大型表格。 local
player=GetClientPlayer()
local bufflist=player.GetBuffList()
Output(bufflist) 导出如下
bCanCancel:是否可以右键取消
nIndex:该buff所对应的编号
nLevel:buff的等级
dwID:buff的ID
nStackNum:叠加的层数
dwSkillSrcID:释放该buff的人物ID,0为系统释放
nEndFrame:buff结束时间
这个列表到了4,表明有4个buff的存在,然而这里显示的却只有两个,表明了那两个buff应该是不重要的,所以系统才将之隐藏,可以忽略。这里只需要知道相应的骑御buff就行了。
如果想要知道是什么buff可以将ID跟Level填入Table_GetBuffName(dwID,nLevel),然后再导出。
通过对bufflist.lua文件的搜索,发现了取消buff的命令: function
BuffList.OnItemRButtonClick()
GetClientPlayer().CancelBuff(this.Info.nIndex)
end 可见取消buff需要用到nIndex这个参数,由此尝试模仿写出取消骑御buff的命令。 local
bufflist=GetClientPlayer().GetBuffList()
for buff,buffinfo in pairs(bufflist) do
if buffinfo.dwID==244 then
GetClientPlayer().CancelBuff(buffinfo.nIndex)
break --脱离循环减轻系统负担
end
end for i,v in pairs(表格) do 执行命令 end
这是一个遍历循环的命令,在前一篇提到过的。
i,v这两个值可以换成任何变量,主要是方便辨识。
i,v一起遍历的时候是一行一行执行,从上到下。
bufflist这个表格实际上是这样的:
1
|
bCanCancel:xxx
nIndex:xxx
nLevel:xxx
dwID:xxx
nStackNum:xxx
dwSkillSrcID:xxx
nEndFrame:xxx
|
2
|
bCanCancel:xxx
nIndex:xxx
nLevel:xxx
dwID:xxx
nStackNum:xxx
dwSkillSrcID:xxx
nEndFrame:xxx | 左边的数字一般叫做array(序号),一般用于排序,右边则是数值。
而buff,buffinfo的作用就是在于给这个表格安上一个标题,见下:
buff
|
buffinfo
|
1
|
bCanCancel:xxx
nIndex:xxx
nLevel:xxx
dwID:xxx
nStackNum:xxx
dwSkillSrcID:xxx
nEndFrame:xxx
|
2
|
bCanCancel:xxx
nIndex:xxx
nLevel:xxx
dwID:xxx
nStackNum:xxx
dwSkillSrcID:xxx
nEndFrame:xxx
|
buffinfo.dwID点在这里可以看做是包含,即:bufflist一列的数值中所包含的dwID值。
如何在使用技能的时候执行命令
首先得了解一下技能释放的过程,看看骑御的释放过程:
这是先运功,再获得buff,由此推测这应该是两个触发event,我们只需要其中一个。
顺藤摸瓜,找到战斗记录相关的lua:CombatText.lua
在这里面找到了疑似可用的一个触发event:"DO_SKILL_CAST"
测试一下是否如此
function testevent()
Output(arg0,arg1,arg2)
end
RegisterEvent("DO_SKILL_CAST",testevent) 使用扶摇直上技能作为测试
arg0=使用者的ID
arg1=使用技能的ID
arg2=使用技能的等级
为什么我会知道是使用者的ID呢,因为我对自己角色ID非常熟悉=w=。
建议在测试后小退清除注册函数,不然会刷屏无极限。
于是可以将取消骑御buff的函数绑定到使用技能上面了,但是问题又来了:天策的马上技能情何以堪?
马上技能该如何保留
如果是使用技能就判断在马上的话,天策在使用马上技能的时候就会自己下马- -!这是我们不想要看到的。
于是思索了两个解决办法:
1.对天策的马上技能进行判断
2.对错误信息进行判断
第一点对天策马上技能的判断,这要涉及到很多技能,一一判断的话显得麻烦,然后如果没有更好的解决办法这便是不是办法的办法。
第二点对错误信息进行判断,如果在马上使用技能的时候,就会出现这么一个信息,而天策的马上技能则不受到限制。
权衡过后,使用第二种方法来解决问题。
搜索string.lua文件里的:"该招式无法在骑马时施展"
继续搜索:STR_ERROR_SKILL_NOT_ON_HORSE
发现目的地是在GlobalEventHandle.lua
持续搜索后发现:
向上看看这个属于什么函数
GetSkillRespondText=function(nRespondCode)
这是个匿名函数,继续搜索GetSkillRespond看看在其他什么地方被调用过。
又发现了匿名函数:OnSkillRespond 持续搜索:
找到了触发的event是arg0="UI_OME_SKILL_RESPOND"的时候,就是技能释放是否成功的回应,可以理解为报错。
向上看发现触发event其实是"SYS_MSG"而不是"UI_OME_SKILL_RESPOND"
原来是触发事件搞错了,嗯,立马修正。
先来测试下触发事件在马上报错的返回值是什么,才好进行判断
找到了SKILL_RESULT_CODE.ERROR_BY_HORSE,这个就是传说中的由马导致的使用技能错误项目。
可以Output一下,也可以直接用这个,Output值为35。
由于系统更新可能会改变该值,所以最好是使用变量SKILL_RESULT_CODE.ERROR_BY_HORSE,这样系统改的时候我们就不用跟着更新插件. function testevent()
if arg0=="UI_OME_SKILL_RESPOND" then
Output(arg0,arg1)
end
end
RegisterEvent("SYS_MSG",testevent)
这是马上使用技能的错误,其他错误信息可以自行摸索,测试后请小退清除注册函数。
这个插件于是就做出来了。
总结
经过实测后发现这个下马的速度跟网络有很大的关系(废话,网络游戏嘛- -),另外就是在下马后还需要在按一次技能才能释放,而非魔兽的那种按一次技能就下马外加释放,不过这对于抽筋党来说问题不大。因为释放技能被报错截取了,所以想要下马加释放首先的截取在马上释放了什么技能,然后先下马再用OnUseSkill实现释放。然而即便这样,网络有延迟插件没延迟,可能导致按一次键相当于猛按该技能。另外一点就是使用技能的和谐,所以,还是让手抽筋一下吧,至少比按两个键来得好吧。
|