为了提高游戏的可玩性,也为了提高外挂制作的难度,很多游戏对BOSS的技能伤害都设计的特别高,为了达到及时躲避的效果,我们需要对技能做预判。预判的方式有很多,比如通过收包的方式,这种方式判断的速度最快,但是代码写起来比较复杂,HOOK收包时也往往会被检测导致封号或崩溃。另一种方式就是在释放技能时进行遍历,很多游戏会加技能释放的状态和人物本身的BOSS存放在一起,比如《天涯明月刀》,《梦三国》等。接下来我们以天涯明月刀为例来分析下技能的预判。
首先我们通过搜索BUFF状态的名字,来找到技能状态库,这里要注意的是游戏内的汉字大多是以UTF-8编码的。过程很简单,我们就不去分析了,直接给公式。
[BUFF基地址]+1144]+64 BUFF名字遍历起始地址
[[BUFF基地址]+1144]+68 BUFF名字遍历数组成员数量
[[BUFF基地址]+1144]+5C BUFF名字遍历对象数量
[[[[BUFF基地址]+1144]+64]+n*4]+0 BUFFID
[[[[BUFF基地址]+1144]+64]+n*4]+4 BUFF对象
[[[[BUFF基地址]+1144]+64]+n*4]+8 BUFF链表
[[[[[BUFF基地址]+1144]+54]+n*4]+4]+0 BUFFID
[[[[[[BUFF基地址]+1144]+54]+n*4]+4]+4]+0 BUFF名字
我们得到一个数组套链表的结构,这个结构被广泛的应用于这款游戏当中。
接下来我们去分析NPC和角色当前所有的BUFF和技能状态。我们接着之前的BUFF库的代码继续分析,取状态名字的函数传入了一个技能ID的参数,当我们访问角色身上的BUFF时会断下(如图)
向上分析技能,我们发现追到了一个结构体数组,而我们角色当前BUFF状态和即将释放技能时的预备动作,都会存放在这个数组里,每一个动作都对应一个不同的ID。继续向上分析,发现这个数组是在角色对象下存放的(如图)
通过代码输出,我们发现这个数组也同样适用于怪物和其他玩家。公式如下
[NPC或角色对象]+304 BUFF数组起始地址
[NPC或角色对象]+308 BUFF数组结束地址
[[NPC或角色对象]+304]+80*n+0 BUFFID 技能预判ID
这个数组中出了ID,还有很多的未知数据,很有可能是当前释放技能的范围,目标,朝向,形状等信息,这需要通过大量的对比和分析来判断。
这样我们就达到了一个对技能的预判效果,通过遍历到BOSS的不同的技能名字采取不同的躲避方式即可。