Brushman 让道具支持自动堆叠到可支持的最大堆叠数
-
本文只提供思路,不提供具体修改方法,因为我暂时没找到什么位置来放这些代码,有兴趣的人可以帮忙找找空位来实现修复这个bug
首先,按照小男生曾经提出的方法,0xEFA9C的8D修改为8E的确可以解决1个番茄酱换16个小麦粉的问题,但是依旧存在的问题是
1.换到的小麦粉不会堆叠,即每个小麦粉都是16份
2.即便道具栏空位不足还是会进行兑换下面介绍如果解决第一个问题,即小麦粉不堆叠.
首先,ida打开gmsv,跳转到文件偏移0xEFA9C,可以看到```
cmp eax, 1
mov ebx, eax
jge loc_8137BF0
```jge的意思是大于等于则转跳,小男把这里修改为了jle,即小于等于则转跳
这个思路是正确的,因为这块代码的意义是
如果要兑换的道具的最大堆叠数小于等于1,则不进行道具堆叠.那么对于问题一,小麦粉不堆叠的问题就应该往下看了,为了方便,直接用ida+f5反编译出代码,这样更加直白
else { if ( v7 > v12 ) v8 = v12; ITEM_setInt(v4, 9, v8); v12 -= v8; }
v7: 道具的最大堆叠量
v12: 兑换的数量
v8: 给予玩家的道具堆叠数我们再转跳到这个函数开始,可以看到
v5 = get_num2_4(&v14); ++v14; v13 = v5; v4 = CHAR_getItemIndex("npc/npc_brushman.c", 754, a1, v5); v12 = get_num2_4(&v14);
v12为传递来的封包参数的偶数位参数,通过抓取封包,可以得到
WN 3Q 1j 5z 28s 0 0\\z2
我们需要的参数即0\\z2->0|2
0是窗口中可以兑换的道具的顺序ID,从0开始
2是我兑换的数量,即兑换2个番茄酱
于是问题就出现在这里了,我们兑换2个番茄酱,但是传递给这个函数的数量却不是兑换后的数量,通过if ( v7 > v12 ) v8 = v12;
这里不难看出,只有当我们兑换的番茄酱的数量超过小麦粉的最大堆叠值的时候,才会处理.
所以,一个简单的思路,就是修改v12,也就是兑换数量的值,将这个值修改为
v12 = 番茄酱数量 * 每个番茄酱可以换到的小麦粉的数量
也就是说,这样修改后,我们传递的值是v12 = 2*16 = 32
这样就不会造成小麦粉自身不堆叠了.至于第二点,即道具栏空位不足还是会进行兑换,这点是由于客户端自身认为一个番茄酱只能换一个小麦粉,所以在空位判定的时候无效,如果单纯的通过修改gmsv来实现,需要改动大量的代码,因为gmsv是先删除所有兑换的番茄酱,然后再给予小麦粉,这样就是造成即便道具栏空位不足任然后兑换的原因.
不过通过第一点的修复,只要小麦粉的最大堆叠数/16 > 番茄酱的最大堆叠数, 就不会造成番茄酱的浪费了.
比如,小麦粉80个算一组,番茄酱3个算一组,这样的设定利用第一点的修复就可以完美实现番茄酱的全部兑换了.
-
好东西,回复一下......
-
支持支持。
-
好東西支持;P
-
大力支持啊
-
大力的支持啊。学习了
-
大力的支持啊。学习了
-
大力支持,凑字
-
完全的看不明白啊
-
完全看不明白啊。。
-
前来学习了
-
QQQQQQQQQQQ
-
谢谢分享~~
-
支持~~~~~~~~~~~
-
精品阿~~~~~~~~
-
做做实验看
-
完全崩溃!!!
-
学习了!!!!!!!!!!!!!!!!
-
楼主高手啊 ida还在学习中@~!~~
-
好东西,支持一下
-
給你頂一下
單人玩不需要這麼細緻