
今天的宏是回答评论区观众的问题,打破甲,破甲叠满放别的技能,先分析下需求:
1 破甲buff不足5层,使用宏打破甲;
2 破甲buff满5层,使用别的技能;
3.1 破甲buff持续到一定时间,要再打1次破甲,保证buff续航;
3.2 游戏过程中玩家不会一直盯着buff持续时间,也可能有频繁按键的习惯,所以在接近设定好的打破甲事件,如果出现已经把技能加入施放序列的情况(例如英勇打击),应当添加打断施法的功能;
4 加入自动攻击。
综合以上需求,我写了这样一个宏:
/run SpellStopCasting()
/run C,S=CastSpellByName,'破甲攻击'for i=1,5 do B={UnitDebuff('target',i)}if string.find(B[1],'Sunder')then if B[2]<5 then t=time()else if(time()-t)<21 then S='英勇打击'else if UnitMana('player')>15 then t=time()end end end end end
/run C(S)
/run StartAttack()
我们分段讲解(红色划线内容已做调整,鉴于不影响分析,这里暂时不改变,文章最后给出调整后的宏):
/run SpellStopCasting() —— 打断施法;
C,S=CastSpellByName,'破甲攻击' —— 定义施法函数和技能名称两个变量,方便后续使用;
'for i=1,5 do B={UnitDebuff('target',i)} —— 做5次循环检测目标身上debuff,保存成集合,集合包含参数为{名称、层数、类型};
if string.find(B[1],'Sunder')then if B[2]<5 then t=time() —— 如果找到debuff并且层数小于5层,使用宏时会记录一个时间t(小于5层时,完整的宏执行过程是会施放破甲攻击的,可以看作记录破甲攻击的施放时间,当检测到B[2]为4层时,使用宏会放第5次破甲攻击并且记录t,此时B[2]等于5,t不再有变化,保存第五次破甲的施放时间);
else if(time()-t)<21 then S='英勇打击' —— B[2]等于5以后,当前时间减去第五次破甲时间小于21秒,技能名称变成英勇打击,完整执行宏时开始释放英勇打击;
else if UnitMana('player')>15 then t=time()end end end end end —— 大于等于21秒,根据之前宏的设定,技能名称变回破甲攻击,检测玩家身上能量值,如果战士玩家身上能量能够满足施放破甲攻击,此时使用宏会施放破甲攻击,并且记录施放时间t;
/run C(S) —— 使用技能;
/run StartAttack() —— 开始攻击;
大家可以根据我给出的分析,结合自身需求去修改这个宏,有什么问题请在视频处留言反馈。
如果好用,请给视频来个三连,多谢。
感谢@斬妹的夜 的评论问题:
看了视频过来提问,这个破甲记录时间只能记录自己打的第5层时间,团本中第5层不是自己打的话能生效吗?
我测试了下,同时网上查找了些资料,类似团战中叠加层数的debuff,好像是可以互相叠加的,比如两个战士打破甲,两个人一共打了5次,那么总共会叠加5层破甲,而不是分开计数,其他职业能叠层数的debuff好像也是这个情况,也就是说这类buff是共享层数的。这个宏只要成功使用了debuff技能,里面的变量t就会记录一次施放时间,这个过程中第5次不是自己放的也没关系,因为只要有5层buff和自己施放技能的时间,他就会按照一个设定好的周期进行技能变化,比如5破 —> 21秒内打英勇 —> 超过21秒续5破,你只要打过破甲,并且检测到目标5破了,那么就会按照你自己的21秒周期去变换破甲和英勇打击,如果有多个战士在用这个宏,确实会出现短时间内有人重复打破甲的情况,但这本身也是这个宏给大家带来方便的同时会出现的问题,我近战玩得少,这种情况在团战中会不会出现,出现了是否在团战容错允许范围内,这个就得大家自己讨论了,我只做说明,不深入探讨。
那么现在回归@斬妹的夜 的问题,团本中第5层不是自己打的话能生效吗?答案是如果打过破甲可以生效,因为变量t获得了有效参数,如果没打过就5破了,那没办法生效,系统会报错t是nil,所以我们要稍微修改下这个宏:
/run SpellStopCasting()
/run C,S,t=CastSpellByName,'破甲攻击',t or 0 for i=1,5 do B={UnitDebuff('target',i)}if string.find(B[1],'Sunder')then if B[2]<5 then t=time()else if(time()-t)<21 then S='英勇打击'else if UnitMana('player')>15 then t=time()end end end end end
/run C(S)
/run StartAttack()
第二段加入了一个t=t or 0,这样当一开始t没有有效参数时为0,这样第一次用这个宏,没有5破打破甲,5破了但自己一次破甲都没打,time()-t也会有一个远大于21的数字结果,这就回归到5破大于21秒的情况了,所以不管目标有几层debuff,他第一时间都会先来一发破甲,宏正常运行下去。
请大家复制修改后的宏使用,再次感谢@斬妹的夜 的提问,欢迎大家多做讨论。