本站域名:
www.chinamods.com
     

- 地图下载 -

- MOD站点链接 -
御天暗黑MOD战网


Game Park

暗黑破坏神官方网站

暗黑破坏神官方战网网站

 
Unsock——反镶嵌
Unsock——反镶嵌。 作者:SeeYouQK 
 

Unsock,反镶嵌,这个并不是新的论题,在2002年9月,Sir General在PH上发表过同样的论题“Unsocketing Items, Almost...”。然而这个问题Sir General只有一个理论的例子,而且版本也是1.09的。他提出修改物品列表数据,再想办法把物品放到物品栏。测试的结果是镶嵌的东西消失了,而没有完成物品放到物品栏。几天后他说了一句:物品放到物品栏了,问题是神符之语不能去掉,会再研究的。关键地方没有进一步的说明和可行的例子,其修改物品位置数据和相关的所有数据的方法也不知是否完整,帖子沉了,所以现在PH上仍然有人在讨论和研究如何反镶嵌。

由于1.10的物品数据结构发生很大变化,而且关键的部分,如何把物品放到物品栏没有说明,我重新研究了这个问题。最后结果发现,根本不用修改物品列表和物品数据。尝试修改物品列表数据和物品数据是徒劳的,1.10的物品数据结构比1.09复杂多了!Sir General自己的a "replacement" function指导了我去修改物品数据。我弱,不能写自己的"replacement function",在偶然中找到了d2game.dll的放物品函数,这个函数可以代劳,自动修改。使用这个函数比起Sir General自己修改安全多了,而关键是修改物品的一个标志和物品所在的页。对于神符之语的问题,去掉神符之语是很简单的,而要去掉神符之语的属性却横复杂,因为神符之语的属性是直接加到物品上的。要去掉神符之语的属性,首先要进行神符之语的检测。接着要将物品的属性对应神符之语的属性进行修改,接着重新排列。再就是去掉神符之语标志,编解码物品,生成一个新物品。最后把原来的物品删除。整个修改非常复杂,我放弃,采用参数确定是否对有神符之语的物品进行反镶嵌。

以下是我在d2game.dll代码末尾写的一个函数,其功能是将物品根的第一个镶嵌物放到物品栏,物品栏放不下放到储存箱,再放不下就不反镶嵌。(或许你们会问,为什么不放到转化箱呢?因为在合成后会清除箱内的东西,如果用合成公式去反镶嵌,宝石会消失的!)另外再加上一些检测代码。返回 1、0,成功、不能反镶嵌第一个镶嵌物。可以看到,只需要很少的代码(有大半的检测代码),包括物品栏放。

6FD26BA0 . 53 push ebx
6FD26BA1 . 55 push ebp
6FD26BA2 . 56 push esi
6FD26BA3 . 57 push edi
6FD26BA4 . 8B7C24 14 mov edi,dword ptr ss:[esp+14]
6FD26BA8 . 8B47 60 mov eax,dword ptr ds:[edi+60]
6FD26BAB . 85C0 test eax,eax
6FD26BAD . 74 7A je short D2Game.6FD26C29
6FD26BAF . 8B70 0C mov esi,dword ptr ds:[eax+C]
6FD26BB2 . 85F6 test esi,esi
6FD26BB4 . 74 73 je short D2Game.6FD26C29
6FD26BB6 . 8B4F 14 mov ecx,dword ptr ds:[edi+14]
6FD26BB9 . 8B5C24 20 mov ebx,dword ptr ss:[esp+20]
6FD26BBD . 85DB test ebx,ebx
6FD26BBF . 74 04 je short D2Game.6FD26BC5
6FD26BC1 . 33DB xor ebx,ebx
6FD26BC3 . EB 02 jmp short D2Game.6FD26BC7
6FD26BC5 > F7D3 not ebx
6FD26BC7 > 8B49 18 mov ecx,dword ptr ds:[ecx+18]
6FD26BCA . 81E1 00000004 and ecx,4000000
6FD26BD0 . 21D9 and ecx,ebx
6FD26BD2 . 85C9 test ecx,ecx
6FD26BD4 75 53 jnz short D2Game.6FD26C29
6FD26BD6 . C746 10 04000000 mov dword ptr ds:[esi+10],4 ;改标志
6FD26BDD . 8B46 14 mov eax,dword ptr ds:[esi+14]
6FD26BE0 . C640 45 00 mov byte ptr ds:[eax+45],0 ;物品栏页
6FD26BE4 . EB 04 jmp short D2Game.6FD26BEA
6FD26BE6 > C640 45 04 mov byte ptr ds:[eax+45],4 ;储存箱页
6FD26BEA > 8B6C24 18 mov ebp,dword ptr ss:[esp+18]
6FD26BEE . 8B5C24 1C mov ebx,dword ptr ss:[esp+1C]
6FD26BF2 . 8B46 0C mov eax,dword ptr ds:[esi+C]
6FD26BF5 . 6A 00 push 0
6FD26BF7 . 6A 01 push 1
6FD26BF9 . 6A 01 push 1
6FD26BFB . 6A 00 push 0
6FD26BFD . 6A 00 push 0
6FD26BFF . 50 push eax
6FD26C00 . 53 push ebx
6FD26C01 . 55 push ebp
6FD26C02 . BA F7150000 mov edx,15F7
6FD26C07 . B9 A8E0D26F mov ecx,D2Game.6FD2E0A8 ; ASCII "C:\projects\D2\head\Diablo2\Source\D2Game\ITEMS\ItemMode.cpp"
6FD26C0C . E8 FFD7F1FF call D2Game.6FC44410 ;放物品函数
6FD26C11 . 85C0 test eax,eax
6FD26C13 . 75 16 jnz short D2Game.6FD26C2B
6FD26C15 . 8B46 14 mov eax,dword ptr ds:[esi+14]
6FD26C18 . 8078 45 00 cmp byte ptr ds:[eax+45],0
6FD26C1C .^ 74 C8 je short D2Game.6FD26BE6
6FD26C1E . C640 45 FF mov byte ptr ds:[eax+45],0FF
6FD26C22 . C746 10 06000000 mov dword ptr ds:[esi+10],6
6FD26C29 > 33C0 xor eax,eax
6FD26C2B > 5F pop edi
6FD26C2C . 5E pop esi
6FD26C2D . 5D pop ebp
6FD26C2E . 5B pop ebx
6FD26C2F . C2 1000 retn 10
53 55 56 57 8B 7C 24 14 8B 47 60 85 C0 74 7A 8B 70 0C 85 F6 74 73 8B 4F 14 8B 5C 24 20 85 DB 74
04 33 DB EB 02 F7 D3 8B 49 18 81 E1 00 00 00 04 21 D9 85 C9 75 53 C7 46 10 04 00 00 00 8B 46 14
C6 40 45 00 EB 04 C6 40 45 04 8B 6C 24 18 8B 5C 24 1C 8B 46 0C 6A 00 6A 01 6A 01 6A 00 6A 00 50
53 55 BA F7 15 00 00 B9 A8 E0 D2 6F E8 FF D7 F1 FF 85 C0 75 16 8B 46 14 80 78 45 00 74 C8 C6 40
45 FF C7 46 10 06 00 00 00 33 C0 5F 5E 5D 5B C2 10 00

用到参考地址D2Game.6FD2E0A8,需修改重载列表
offsect
00119292 08 3C

如何使用这个函数呢,我写了个pSpell函数来调用。这个12号pSpell函数是对物品的镶嵌物一个接一个的取下,直到不能取下为止,对于有神符之语的物品不反镶嵌。

6FD26C40 . 55 push ebp
6FD26C41 . 56 push esi
6FD26C42 . 57 push edi
6FD26C43 . 8BF2 mov esi,edx
6FD26C45 . 8BF9 mov edi,ecx
6FD26C47 . 8B6C24 24 mov ebp,dword ptr ss:[esp+24]
6FD26C4B > 6A 00 push 0
6FD26C4D . 56 push esi
6FD26C4E . 57 push edi
6FD26C4F . 55 push ebp
6FD26C50 . E8 4BFFFFFF call D2Game.6FD26BA0
6FD26C55 . 85C0 test eax,eax
6FD26C57 .^ 75 F2 jnz short D2Game.6FD26C4B
6FD26C59 . 5F pop edi
6FD26C5A . 5E pop esi
6FD26C5B . 5D pop ebp
6FD26C5C . C2 1400 retn 14

修改pSpell函数地址列表
OFFSECT
001106EC 40 6C D2 6F

修改重载列表相关
1、在00119D58前插入 EC 36 00 00 ,在重载列表末00处如00119F00,删去4个00。
2、00119AA4 的 B8 02 改为 BC 02
3、00000260 的 1A 69 改为 1E 69

我又写了个properties的func函数来调用。同上,这个26号func函数是对物品的镶嵌物一个接一个的取下,直到不能取下为止,对于有神符之语的物品不反镶嵌。

00A5D600 . 53 push ebx
00A5D601 . 55 push ebp
00A5D602 . 56 push esi
00A5D603 . 57 push edi
00A5D604 . 8BB424 C4000000 mov esi,dword ptr ss:[esp+C4]
00A5D60B . 8BBC24 CC000000 mov edi,dword ptr ss:[esp+CC]
00A5D612 . 8B6C24 14 mov ebp,dword ptr ss:[esp+14]
00A5D616 . 8B8424 AC000000 mov eax,dword ptr ss:[esp+AC]
00A5D61D . 66:3D F606 cmp ax,6F6
00A5D621 . 75 12 jnz short D2Common.00A5D635
00A5D623 . 05 AA640900 add eax,964AA
00A5D628 . 8BD8 mov ebx,eax
00A5D62A > 6A 00 push 0 ;神符之语的物品不反镶嵌
00A5D62C . 56 push esi ;ptplayer
00A5D62D . 57 push edi ;ptgame
00A5D62E . 55 push ebp ;ptitem
00A5D62F . FFD3 call ebx
00A5D631 . 85C0 test eax,eax
00A5D633 .^ 75 F5 jnz short D2Common.00A5D62A
00A5D635 > 5F pop edi
00A5D636 . 5E pop esi
00A5D637 . 5D pop ebp
00A5D638 . 5B pop ebx
00A5D639 . C2 2400 retn 24
53 55 56 57 8B B4 24 C4 00 00 00 8B BC 24 CC 00 00 00 8B 6C 24 14 8B 84 24 AC 00 00 00 66 3D F6
06 75 12 05 AA 64 09 00 8B D8 6A 00 56 57 55 FF D3 85 C0 75 F5 5F 5E 5D 5B C2 24 00
修改func函数地址列表
OFFSECT
000A3980 00 D6 DC 6F

修改重载列表相关
1、在000AFA6C前插入 88 39 00 00 ,在重载列表末00处如000AFC00,删去4个00。
2、000AF844 的 2C 02 改为 30 02
3、00000258 的 12 65 改为 16 65

最后添加一个合成公式,在镶嵌了东西的物品上使用26号func函数。
如: r05+an socketed item ->get out all socketfiller 1 100 2 "any,sock" r05 useitem getoutsocket 1 1 0


最后添加一个合成公式,在镶嵌了东西的物品上使用26号func函数。如
r05+an socketed item ->get out all socketfiller 1 100 2 "any,sock" r05 useitem getoutsocket 1 1 0

CopyRight (c) 2003-2008 游戏小站(Game Park)版权所有

如转载,请注明出处。