Skip to content

Lay a player's collision footprint by pattern - #247

Open
ResurrectedTrader wants to merge 1 commit into
ThePhrozenKeep:masterfrom
ResurrectedTrader:fix/path-player-collision-pattern
Open

ResurrectedTrader wants to merge 1 commit into
ThePhrozenKeep:masterfrom
ResurrectedTrader:fix/path-player-collision-pattern

Conversation

@ResurrectedTrader

Copy link
Copy Markdown
Contributor

PATH_AddCollisionFootprintForUnit (#10222) lays the collision pattern (COLLISION_SetMaskWithPattern) for monsters only. Players fall to the default branch, COLLISION_SetMaskWithSize, which stamps the size mask without the pattern's COLLIDE_NO_PATH centre. PATH_RemoveCollisionFootprintForUnit (#10223) already removes players by pattern, so adding and removing a player's footprint don't match.

1.10f

The whole of D2Common.0x6FDA8320 (#10222). Unit types 0 and 1 share the pattern branch, which passes pDynamicPath->dwCollisionPattern (+0x48) to #10130. Objects get #10129 and everything else #10128:

6FDA8320  push    ebx
6FDA8321  push    ebp
6FDA8322  push    esi
6FDA8323  mov     esi, [esp+0Ch+arg_0]
6FDA8327  test    esi, esi
6FDA8329  push    edi
6FDA832A  jz      loc_6FDA83DC
6FDA8330  mov     eax, [esi]                        ; dwUnitType
6FDA8332  test    eax, eax
6FDA8334  jl      loc_6FDA83DC
6FDA833A  cmp     eax, 1                            ; <== player (0) or monster (1)
6FDA833D  jle     short loc_6FDA837C                ; <== -> pattern
6FDA833F  cmp     eax, 2                            ; object
6FDA8342  jnz     loc_6FDA83DC                      ; others -> size
6FDA8348  mov     ecx, [esi+2Ch]
6FDA834B  mov     ebx, [ecx+10h]
6FDA834E  mov     edi, [ecx+0Ch]
6FDA8351  mov     ecx, esi
6FDA8353  call    D2Common_10338
6FDA8358  push    eax
6FDA8359  push    esi
6FDA835A  call    D2Common_10337
6FDA835F  push    eax
6FDA8360  push    esi
6FDA8361  call    D2Common_10336
6FDA8366  push    eax
6FDA8367  push    ebx
6FDA8368  push    edi
6FDA8369  push    esi
6FDA836A  call    D2Common_10342
6FDA836F  push    eax
6FDA8370  call    D2Common_10129                    ; COLLISION_SetMaskWithSizeXY
6FDA8375  pop     edi
6FDA8376  pop     esi
6FDA8377  pop     ebp
6FDA8378  pop     ebx
6FDA8379  retn    4
6FDA837C  mov     ecx, [esi+2Ch]                    ; pDynamicPath
6FDA837F  cmp     eax, 2
6FDA8382  mov     ebp, [ecx+48h]                    ; <== dwCollisionPattern
6FDA8385  jz      short loc_6FDA839D
6FDA8387  cmp     eax, 3
6FDA838A  jle     short loc_6FDA8391
6FDA838C  cmp     eax, 5
6FDA838F  jle     short loc_6FDA839D
6FDA8391  xor     ebx, ebx
6FDA8393  test    ecx, ecx
6FDA8395  jz      short loc_6FDA83A0
6FDA8397  mov     bx, [ecx+6]
6FDA839B  jmp     short loc_6FDA83A0
6FDA839D  mov     ebx, [ecx+10h]
6FDA83A0  cmp     eax, 2
6FDA83A3  jz      short loc_6FDA83BB
6FDA83A5  cmp     eax, 3
6FDA83A8  jle     short loc_6FDA83AF
6FDA83AA  cmp     eax, 5
6FDA83AD  jle     short loc_6FDA83BB
6FDA83AF  xor     edi, edi
6FDA83B1  test    ecx, ecx
6FDA83B3  jz      short loc_6FDA83BE
6FDA83B5  mov     di, [ecx+2]
6FDA83B9  jmp     short loc_6FDA83BE
6FDA83BB  mov     edi, [ecx+0Ch]
6FDA83BE  mov     ecx, esi
6FDA83C0  call    D2Common_10338                    ; UNITS_GetCollisionMask
6FDA83C5  push    eax
6FDA83C6  push    ebp                               ; <== pattern
6FDA83C7  push    ebx
6FDA83C8  push    edi
6FDA83C9  push    esi
6FDA83CA  call    D2Common_10342                    ; UNITS_GetRoom
6FDA83CF  push    eax
6FDA83D0  call    D2Common_10130                    ; <== COLLISION_SetMaskWithPattern
6FDA83D5  pop     edi
6FDA83D6  pop     esi
6FDA83D7  pop     ebp
6FDA83D8  pop     ebx
6FDA83D9  retn    4
6FDA83DC  mov     ecx, [esi]
6FDA83DE  cmp     ecx, 2
6FDA83E1  jz      short loc_6FDA83FC
6FDA83E3  cmp     ecx, 3
6FDA83E6  jle     short loc_6FDA83ED
6FDA83E8  cmp     ecx, 5
6FDA83EB  jle     short loc_6FDA83FC
6FDA83ED  mov     eax, [esi+2Ch]
6FDA83F0  xor     ebx, ebx
6FDA83F2  test    eax, eax
6FDA83F4  jz      short loc_6FDA8402
6FDA83F6  mov     bx, [eax+6]
6FDA83FA  jmp     short loc_6FDA8402
6FDA83FC  mov     eax, [esi+2Ch]
6FDA83FF  mov     ebx, [eax+10h]
6FDA8402  cmp     ecx, 2
6FDA8405  jz      short loc_6FDA8423
6FDA8407  cmp     ecx, 3
6FDA840A  jle     short loc_6FDA8411
6FDA840C  cmp     ecx, 5
6FDA840F  jle     short loc_6FDA8423
6FDA8411  test    eax, eax
6FDA8413  jz      short loc_6FDA841F
6FDA8415  push    eax
6FDA8416  call    D2Common_10162
6FDA841B  mov     edi, eax
6FDA841D  jmp     short loc_6FDA8426
6FDA841F  xor     edi, edi
6FDA8421  jmp     short loc_6FDA8426
6FDA8423  mov     edi, [eax+0Ch]
6FDA8426  mov     ecx, esi
6FDA8428  call    D2Common_10338                    ; UNITS_GetCollisionMask
6FDA842D  push    eax
6FDA842E  push    esi
6FDA842F  call    D2Common_10336                    ; UNITS_GetUnitSizeX
6FDA8434  push    eax
6FDA8435  push    ebx
6FDA8436  push    edi
6FDA8437  push    esi
6FDA8438  call    D2Common_10342                    ; UNITS_GetRoom
6FDA843D  push    eax
6FDA843E  call    D2Common_10128                    ; COLLISION_SetMaskWithSize
6FDA8443  pop     edi
6FDA8444  pop     esi
6FDA8445  pop     ebp
6FDA8446  pop     ebx
6FDA8447  retn    4

1.14d

The same in PATH_AddUnitCollision (Game.exe 0x649400):

00649400  push    ebp
00649401  mov     ebp, esp
00649403  push    ebx
00649404  push    esi
00649405  mov     esi, [ebp+arg_0]
00649408  test    esi, esi
0064940A  push    edi
0064940B  jz      loc_6494DC
00649411  mov     eax, [esi]                        ; dwUnitType
00649413  test    eax, eax
00649415  jl      loc_6494DC
0064941B  cmp     eax, 1                            ; <== player (0) or monster (1)
0064941E  jle     short loc_649462                  ; <== -> pattern
00649420  cmp     eax, 2                            ; object
00649423  jnz     loc_6494DC                        ; others -> size
00649429  mov     ecx, esi
0064942B  call    GetCollisionType
00649430  push    eax
00649431  push    esi
00649432  call    GetUnitSizeY
00649437  push    eax
00649438  push    esi
00649439  call    GetUnitSizeX
0064943E  push    eax
0064943F  mov     ecx, esi
00649441  call    GetYPosFromDynamicPathUnit
00649446  push    eax
00649447  mov     ecx, esi
00649449  call    GetXPosFromDynamicPathUnit
0064944E  push    eax
0064944F  push    esi
00649450  call    GetRoom
00649455  push    eax
00649456  call    AddCollision_Vector               ; COLLISION_SetMaskWithSizeXY
0064945B  pop     edi
0064945C  pop     esi
0064945D  pop     ebx
0064945E  pop     ebp
0064945F  retn    4
00649462  cmp     eax, 2
00649465  mov     ecx, [esi+2Ch]
00649468  mov     edx, [ecx+48h]                    ; <== dwCollisionPattern
0064946B  mov     [ebp+arg_0], edx
0064946E  jz      short loc_64948C
00649470  cmp     eax, 3
00649473  jle     short loc_64947A
00649475  cmp     eax, 5
00649478  jle     short loc_64948C
0064947A  test    ecx, ecx
0064947C  jz      short loc_649488
0064947E  push    ecx
0064947F  call    GetYPos
00649484  mov     ebx, eax
00649486  jmp     short loc_64948F
00649488  xor     ebx, ebx
0064948A  jmp     short loc_64948F
0064948C  mov     ebx, [ecx+10h]
0064948F  mov     eax, [esi]
00649491  cmp     eax, 2
00649494  jz      short loc_6494B5
00649496  cmp     eax, 3
00649499  jle     short loc_6494A0
0064949B  cmp     eax, 5
0064949E  jle     short loc_6494B5
006494A0  mov     eax, [esi+2Ch]
006494A3  test    eax, eax
006494A5  jz      short loc_6494B1
006494A7  push    eax
006494A8  call    GetXPos
006494AD  mov     edi, eax
006494AF  jmp     short loc_6494BB
006494B1  xor     edi, edi
006494B3  jmp     short loc_6494BB
006494B5  mov     eax, [esi+2Ch]
006494B8  mov     edi, [eax+0Ch]
006494BB  mov     ecx, esi
006494BD  call    GetCollisionType
006494C2  mov     ecx, [ebp+arg_0]
006494C5  push    eax
006494C6  push    ecx                               ; <== pattern
006494C7  push    ebx
006494C8  push    edi
006494C9  push    esi
006494CA  call    GetRoom
006494CF  push    eax
006494D0  call    AddCollision_Type                 ; <== COLLISION_SetMaskWithPattern
006494D5  pop     edi
006494D6  pop     esi
006494D7  pop     ebx
006494D8  pop     ebp
006494D9  retn    4

A live 1.14d client's collision map shows the result: the player's own subtile holds 0x1080 (COLLIDE_PLAYER | COLLIDE_NO_PATH). MOO produces 0x80 there.

Change

case UNIT_PLAYER: shares the UNIT_MONSTER branch. Not version-gated, since 1.10f and 1.14d agree.

🤖 Generated with Claude Code

PATH_AddCollisionFootprintForUnit used the collision pattern for
monsters only and sent players to COLLISION_SetMaskWithSize, which
stamps the size mask without the pattern's COLLIDE_NO_PATH centre.
PATH_RemoveCollisionFootprintForUnit already removes players by
pattern.

1.10f (D2Common.0x6FDA8320, #10222) branches on "type <= 1" at
0x6FDA833A and calls COLLISION_SetMaskWithPattern (#10130) with
pDynamicPath->dwCollisionPattern for players and monsters alike. 1.14d
is the same (Game.exe.0x64941B).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant