本站域名:
www.chinamods.com
     

- 地图下载 -

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


Game Park

暗黑破坏神官方网站

暗黑破坏神官方战网网站

 
[CE]eComponent错误附加信息和修正方法简述
[CE]eComponent错误附加信息和修正方法简述。 作者:SeeYouQK 
 

我想为自己增加怪物的人一定有过这个问题,eComponent < NUM_COMPONENTS line #1437的错误。我简单的看过这段代码,做了个截取更多一些DEBUG信息的patch,希望可以帮助大家找到问题所在。
1、增加了对怪物(或物品OBJECT)的信息截取
2、增加了对动画模式的信息截取
3、增加了对应模式COF的内容截取
4、增加了寄存器内容的截取


下面的是Component检测,大于16个就去显示eComponent < NUM_COMPONENTS line #1437的错误。改为截取一些有用信息:
6FB5F358 . 83FA 10 cmp edx,10
6FB5F35B . 0F8D 9FDA0000 jge D2Client.6FB6CE00

截取一些有用信息部分,每段以"////"开始,还有一些提示信息,如寄存器内容--"reg ",怪物信息--"mon ",COF内容--"cof ",模式--"mod ",指针--"pt "
6FB6CE00 > \50 push eax
6FB6CE01 . 53 push ebx
6FB6CE02 . 51 push ecx
6FB6CE03 . 52 push edx
6FB6CE04 . 55 push ebp
6FB6CE05 . 56 push esi
6FB6CE06 . 57 push edi
6FB6CE07 68 72656720 push 20676572
6FB6CE0C 68 2F2F2F2F push 2F2F2F2F ;寄存器内容的截取
6FB6CE11 . 8BF8 mov edi,eax
6FB6CE13 . B9 0C000000 mov ecx,0C
6FB6CE18 . 8BD5 mov edx,ebp
6FB6CE1A . E8 B1FFFFFF call D2Client.6FB6CDD0
6FB6CE1F 68 6D6F6E20 push 206E6F6D
6FB6CE24 68 2F2F2F2F push 2F2F2F2F ;怪物(或物品OBJECT)的信息截取
6FB6CE29 . B9 40000000 mov ecx,40
6FB6CE2E . 8BD6 mov edx,esi
6FB6CE30 . E8 9BFFFFFF call D2Client.6FB6CDD0
6FB6CE35 68 636F6620 push 20666F63
6FB6CE3A 68 2F2F2F2F push 2F2F2F2F ;对应模式COF的内容截取
6FB6CE3F . 8B45 54 mov eax,dword ptr ss:[ebp+54]
6FB6CE42 . 8B58 28 mov ebx,dword ptr ds:[eax+28]
6FB6CE45 > 8B4B 08 mov ecx,dword ptr ds:[ebx+8]
6FB6CE48 . 3B71 14 cmp esi,dword ptr ds:[ecx+14]
6FB6CE4B . 74 16 je short D2Client.6FB6CE63
6FB6CE4D . 8B5B 10 mov ebx,dword ptr ds:[ebx+10]
6FB6CE50 . 85DB test ebx,ebx
6FB6CE52 .^ 75 F1 jnz short D2Client.6FB6CE45 ;搜索动画模式
6FB6CE54 68 74612F2F push 2F2F6174
6FB6CE59 68 2F2F6461 push 61642F2F
6FB6CE5E .^ E9 9C25FFFF jmp D2Client.6FB5F3FF ;结束信息截取,回去继续line #1437的错误信息输出
6FB6CE63 > 8B51 14 mov edx,dword ptr ds:[ecx+14]
6FB6CE66 . 52 push edx
6FB6CE67 . 51 push ecx
6FB6CE68 . 53 push ebx
6FB6CE69 . 50 push eax
6FB6CE6A 68 70742020 push 20207470
6FB6CE6F 68 2F2F2F2F push 2F2F2F2F ;怪物->模式->COF的搜索过程的指针
6FB6CE74 . 8BD1 mov edx,ecx
6FB6CE76 . B9 10000000 mov ecx,10
6FB6CE7B . E8 50FFFFFF call D2Client.6FB6CDD0
6FB6CE80 68 6D6F6420 push 20646F6D
6FB6CE85 68 2F2F2F2F push 2F2F2F2F ;动画模式的信息截取
6FB6CE8A .^ EB C8 jmp short D2Client.6FB6CE54 ;结束

信息截取函数,以"begi"开始,"end"结束,前后还有信息地址。
6FB6CDD0 /$ 5B pop ebx
6FB6CDD1 |. 52 push edx
6FB6CDD2 |. 68 656E6420 push 20646E65
6FB6CDD7 |. 8BC1 mov eax,ecx
6FB6CDD9 |. C1E0 02 shl eax,2
6FB6CDDC |. 03D0 add edx,eax
6FB6CDDE |> 49 /dec ecx
6FB6CDDF |. 83EA 04 |sub edx,4
6FB6CDE2 |. 8B02 |mov eax,dword ptr ds:[edx]
6FB6CDE4 |. 50 |push eax
6FB6CDE5 |. 85C9 |test ecx,ecx
6FB6CDE7 |.^ 75 F5 \jnz short D2Client.6FB6CDDE
6FB6CDE9 |. 68 62656769 push 69676562
6FB6CDEE |. 52 push edx
6FB6CDEF |. 68 64617461 push 61746164
6FB6CDF4 |. 53 push ebx
6FB6CDF5 \. C3 retn

当然,原来输出的错误信息中也是有部分有用信息的,下面就以一些例子看看附加的和原来信息,进而分析错误。

暗月2.1的30D号怪,双翼骑士
Assertion Failure
Location : D2Client\Engine\GfxUtil.cpp, line #1437
Expression : eComponent < NUM_COMPONENTS
23:21:52.421 Stack bytes:
23:21:52.421 0012F760: 908C5311 008C5311 80CEB66F FEFFFFFF ..S...S..味o?
0012F770: 00EE9502 4BEDF56F 70F71200 96F1F56F .?.K眭op?..聃o
0012F780: 60F71200 2470B96F 13F4B56F 2470B96F `?.$p筼.舻o$p筼
0012F790: 6C71B96F 9D050000 2F2F6461 74612F2F lq筼....//data//
;"//data//",代表我的错误信息开始处.
0012F7A0: 2F2F2F2F 6D6F6420 64617461 40893B00 ////mod data@.;.
0012F7B0: 62656769 E0693B00 01000000 90000000 begi鄆;.........
0012F7C0: 39306768 68746800 008C5311 00000000 90ghhth...S.....
0012F7D0: 00000000 05000000 68746820 80893B00 ........hth ..;.
0012F7E0: 00000000 408D3B00 00000000 00000000 ....@.;.........
0012F7F0: 00000000 656E6420 40893B00 2F2F2F2F ....end @.;.////
;从"////mod data"中可以看到,出错的是90ghhth这个模式
0012F800: 70742020 4049E60D 408D3B00 40893B00 pt @I?@.;.@.;.
0012F810: 008C5311 2F2F2F2F 636F6620 64617461 ..S.////cof data
;这里就是90ghhth.cof的部分内容
0012F820: 008C5311 62656769 010C0814 01F0FD7F ..S.begi.....瘕
0012F830: C1FFFFFF 2E000000 E6FFFFFF 18000000 ?....?....
0012F840: 00010000 01010100 00687468 00000000 .........hth....
0012F850: 00000000 00000000 01010101 01010101 ................
0012F860: 01010101 01010101 01010101 01010101 ................
0012F870: 01010101 01010101 01010101 01010101 ................
0012F880: 01010101 01010101 01010101 01010101 ................
0012F890: 01010101 01010101 01010101 01010101 ................
0012F8A0: 01010101 01010101 01010101 01010101 ................
0012F8B0: 01010101 01010101 5060FFFF 50C60200 ........P`P?.
0012F8C0: 01000000 03000000 00000000 01400000 .............@..
0012F8D0: D4C4120C 11000000 00000000 00000000 阅..............
0012F8E0: FFFFFF00 00000000 A060FFFF 78C60200 .....燻x?.
0012F8F0: 02000000 03000000 00000000 01400000 .............@..
0012F900: 14C4120C 13000000 00000000 00000000 .?.............
0012F910: FFFFFF00 00000000 00000000 00000000 .............
0012F920: 00000000 00000000 656E6420 008C5311 ........end ..S.
0012F930: 2F2F2F2F 6D6F6E20 64617461 00EE9502 ////mon data.?.
0012F940: 62656769 01000000 0D030000 00000000 begi............
;怪物(或物品OBJECT)的信息,"begi"后的01代表怪物(02代表OBJ),再后的是怪物编号30D号怪.
0012F950: 82050000 03000000 80BE7613 00000000 .........緑.....
0012F960: 00000000 F7CCC57A 99A5A917 88B5677E ....魈舲.ォ..礸~
0012F970: 009AE80D 656E6420 00EE9502 2F2F2F2F ..?end .?.////
0012F980: 72656720 008C5311 008C5311 00EE9502 reg ..S...S..?.
0012F990: 50000000 00EE9502 00000000 908C5311 P....?.......S.
;寄存器中有些有用内容,如COF的开始地址11538C00("reg"后的"008C5311"),现在读取地址11538C90("reg"后的第7堆,"908C5311").即读取COF的11538C90 - 11538C00 +1 =91 H =145 BYTE
;下面的就是原来的错误信息
0012F9A0: 008C5311 00EE9502 908C5311 00000000 ..S..?...S.....
0012F9B0: 00000000 008C5311 00EE9502 04000000 ......S..?.....
0012F9C0: 04000000 50FA1200 C514DF6F 08000000 ....P?.?遫....
0012F9D0: 04000000 08000000 F8F2B56F 38000000 ........祇8...
0012F9E0: 08000000 008C5311 00EE9502 68746820 ......S..?.hth
0012F9F0: 008C5311 00EE9502 C89AB56F 03000000 ..S..?.?祇....
0012FA00: 03000000 1B9BB56F 908C5311 60FA1200 ......祇..S.`?.
0012FA10: 38000000 0B000000 0C807403 CC837403 8.........t.?t.
0012FA20: 6852FE0A 00000000 05000000 008C5311 hR?..........S.
0012FA30: 60790200 D0630200 00000000 008C5311 `y..衏........S.
0012FA40: 03000000 0C010000 00000000 5E010000 ............^...
0012FA50: 38000000 0D030000 0B000000 01000000 8...............
;这里有有用信息,"0D030000",单位编号(对应上面是怪物编号30D),其后的是帧0B ("0B000000") +1 H=12帧
0012FA60: 00000000 07000000 04000000 0C000000 ................

;第二堆,"07000000",即方向07 +1 H = 第8个方向。

有了上面的信息,就可以看原来的文件有什么问题了。看90ghhth.cof,只有144BYTE,不可能到145 BYTE,首先怀疑cof错了,检察,90ghhth.cof的确有问题。修正,再检查animdata.d2、DCC、90ghhth.cof对应信息、检查monstat,有用到monseq,检查monseq,用的帧没有超过COF。检查正确。测试,通过。

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

如转载,请注明出处。