上一节,我们介绍了较为复杂的全传奇威能功能制作,这一节,我们将用类似的原理讲解全饰品的制作
1. 游戏里的翅膀,旗帜,宠物等装饰品稀有且难获取,也是我们最想收集全的,无奈掉率太低,而且还有一些隐藏的没有在掉落当中,为此,我们有了制作全饰品功能的想法。首先,搜索learnCosmetic,意思就是学会装饰物,找打了函数SCosmeticItems_LearnCosmeticItem,从伪代码分析中知道了,装饰品数组在player中的偏移是0x9F00,数量偏移再加0x800,我们找到2.6.6中的偏移其实是0x9F18,所以后面就按0x9F18来计算
2. 我们搜索AllCosmetic,发现了函数SCosmeticItems_LearnAllCosmeticsCheat,在里面又找到了 GBEnumerate(2, &listResults);,分析上下文,可知,这个函数是遍历所有2类型的物品,其中包括了所有装饰品,因此我们就在GBEnumerate里做hack
3. 跳转到GBEnumerate里,然后在跳转sGBEnumerateType里面,找到了要做装饰品复位的地方,然后找到2.6.6对应的地址,做hack
4. 找空白区域编写复位装饰品代码
5. 接下来我们开始在遍历物品时做hack,确保每一个装饰品被添加到数组当中,我们找到了遍历的while循环开始处,然后找到2.6.6对应的地址做hack跳转
6. 我们在SCosmeticItems_LearnAllCosmeticsCheat中发现了ItemIsCosmeticItem,意思是判断物品是否属于装饰品,找到2.6.6对应的函数地址为sub_4E1400,这个记下来,后面写代码时会用到
7. 找空白区域编写代码
8. 这样我们清空和添加装饰品的代码都写完了,两段合在一起写成金手指代码
9. 然后我们想怎么触发这段代码呢?因为触发的话需要调用GBEnumerate(2, &listResults);,因此我们在此函数上右击跳转到外部引用,看看有哪些地方调用了这个函数,经过一番分析,我们发现了UIDyeItem::GetAllDyes,又发现了UIMystic::Console::UIDyeItemView::DyeDataSource::PopulateDyes调用它,也就是获取所有染色,知道了在附魔工匠那里可以触发
10. 我们进游戏测试,开启金手指,然后去附魔工匠那里点一下,再打开背包,看看装饰品,是不是全都有了?甚至包含未开发完成和隐藏的装饰品也获得了,成功。
好了,本节到此结束,通过本节,我们学会了如何通过在系统遍历时添加装饰品,达到制作全饰品的功能,下一节,我们将进军全幻化