【我也帮yj修bug】明日方舟19日热更bug成因(近战打多干员造成双击)
fux2
编辑于 2021年09月19日 20:23

本文结论由本人@fux2 与 @网页链接​ 共同完成

首先给出故障原因:这是热更的lua脚本上下文混乱产生的bug

热更代码内容

备注:以下内容皆以史尔特尔阻挡敌人开启黄昏时造成双击为例

正确的索敌过程是什么样子的?

    作为近战干员,通常索敌选择器使用的是BlockedOrAdvancedSelector

而这个BlockedOrAdvancedSelector的父类正是经过热修的RangeSelector

BlockedOrAdvancedSelector原有的索敌步骤应该如下

  1. 搜寻被干员阻挡的可用目标并加入结果列表

  2. 调用RangeSelector的索敌函数(父类)再搜寻攻击范围内的可用目标并在去重后加入结果列表

问题就出在热修脚本的self:DoFindTargets(pos)上,这个self实际上是个BlockedOrAdvancedSelector的实例,所以DoFindTargets也是调用的BlockedOrAdvancedSelector类的函数,导致逻辑变成以下顺序:

  1. 搜寻被干员阻挡的可用目标并加入结果列表

  2. 调用RangeSelector的索敌函数--函数被lua脚本修正,再次进入BlockedOrAdvancedSelector的索敌函数--同时,由于lua脚本系统内部的处理,置空了这个lua脚本的指针(防死循环)

  3. 搜寻被干员阻挡的可用目标并加入结果列表

  4. 调用RangeSelector的索敌函数(父类)再搜寻攻击范围内的可用目标并在去重后加入结果列表--lua脚本处理完毕,恢复该脚本的指针

问题就出在搜寻阻挡目标这一过程并不会给结果去重,所以最终结果就是把阻挡的目标都双倍加入了结果列表

可行的处理方案?

    目前想不到十分简单的通过热更就能实现的解决方法(指修复问题而不是回滚),我甚至不太明白这个热更脚本的目的是什么,具体操作似乎也就在索敌之前隐藏了一个战斗记录的表,并且在索敌完成后恢复。无法给出有效意见