0

焦点头条

【小雪】插件制作教学系列(二)《无界面插件教学》

2014-02-23 14:51| 查看: 9587 |作者: 小雪


释放技能自动下马(取消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
buffID
nStackNum
:叠加的层数
dwSkillSrcID
:释放该buff的人物ID0为系统释放
nEndFrame
buff结束时间

这个列表到了4,表明有4buff的存在,然而这里显示的却只有两个,表明了那两个buff应该是不重要的,所以系统才将之隐藏,可以忽略。这里只需要知道相应的骑御buff就行了。

如果想要知道是什么buff可以将IDLevel填入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

bCanCancelxxx
nIndex
xxx
nLevel
xxx
dwID
xxx
nStackNum
xxx
dwSkillSrcID
xxx
nEndFrame
xxx

2

bCanCancelxxx
nIndex
xxx
nLevel
xxx
dwID
xxx
nStackNum
xxx
dwSkillSrcID
xxx
nEndFrame
xxx

左边的数字一般叫做array(序号),一般用于排序,右边则是数值。
buffbuffinfo的作用就是在于给这个表格安上一个标题,见下:

buff

buffinfo

1

bCanCancelxxx
nIndex
xxx
nLevel
xxx
dwID
xxx
nStackNum
xxx
dwSkillSrcID
xxx
nEndFrame
xxx

2

bCanCancelxxx
nIndex
xxx
nLevel
xxx
dwID
xxx
nStackNum
xxx
dwSkillSrcID
xxx
nEndFrame
xxx


buffinfo.dwID
点在这里可以看做是包含,即:bufflist一列的数值中所包含的dwID值。

如何在使用技能的时候执行命令

首先得了解一下技能释放的过程,看看骑御的释放过程:

这是先运功,再获得buff,由此推测这应该是两个触发event,我们只需要其中一个。
顺藤摸瓜,找到战斗记录相关的luaCombatText.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

持续搜索:

找到了触发的eventarg0="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实现释放。然而即便这样,网络有延迟插件没延迟,可能导致按一次键相当于猛按该技能。另外一点就是使用技能的和谐,所以,还是让手抽筋一下吧,至少比按两个键来得好吧。


收藏 分享 邀请

发表评论

查看全部评论(1)
游客 2014-09-26 06:29
<p>1、找到自己最好的微笑,并将它随时奉献给客人。 <br><br>2、愿我的微笑像春风一样温暖着客人的心。 <br><br>3、愿我的每一个微笑都能给您带来一份轻松与快乐! <br><br>4、有了它家庭充满幸福,有了它生意兴隆荣耀,它还是朋友间交流的暗号。 <br><br>5、用我的真诚微笑留住每位客人。 <br><br>6、永远微笑吧!在人生的旅途上,最好的身份证就是——微笑。 <br><br>7、营业员的微笑必须是发自内心的,不能皮笑肉不笑。要出会心 ...
引用

查看全部评论(1)

关注订阅号"剑网3PVE"
获取第一手剑三资讯


您当前使用的浏览器版本过低,网站部分功能可能失效,请更换合适的浏览器。了解更多