diff --git a/saco/game/hooks.cpp b/saco/game/hooks.cpp index cb9dcbc..09b8960 100644 --- a/saco/game/hooks.cpp +++ b/saco/game/hooks.cpp @@ -1195,9 +1195,55 @@ NUDE CWorld__CameraToIgnoreThisObject_Hook() //----------------------------------------------------------- +// shared by the four ProcessEntityCollision hooks below +DWORD dwCollisionThis; +DWORD dwCollisionEntity; +DWORD dwCollisionRetAddr; + NUDE CAutomobile__ProcessEntityCollision_Hook() { - // TODO: CAutomobile__ProcessEntityCollision_Hook + __asm + { + mov dwCollisionThis, ecx + mov edx, [esp] + mov dwCollisionRetAddr, edx + mov edx, [esp+4] + mov dwCollisionEntity, edx + pushad + cmp pNetGame, 0 + jz process_collision + mov eax, pNetGame + movzx ecx, byte ptr [eax+0x232] // pNetGame->field_232 + test ecx, ecx + jz process_collision + cmp dwCollisionThis, 0 + jz process_collision + cmp dwCollisionEntity, 0 + jz process_collision + mov edx, dwCollisionEntity + movzx eax, word ptr [edx+0x22] // entity.nModelIndex + cmp eax, 400 + jl process_collision + mov ecx, dwCollisionEntity + movzx edx, word ptr [ecx+0x22] + cmp edx, 611 // only vehicle models pass + jg process_collision + mov eax, dwCollisionThis + cmp dword ptr [eax+0x460], 0 // pVehicle->pDriver + jz process_collision + mov ecx, dwCollisionEntity + cmp dword ptr [ecx+0x460], 0 + jz process_collision + popad + + // both vehicles are being driven, so don't collide them + mov eax, 0 + retn 8 + process_collision: + popad + mov edx, 0x6ACE70 // CAutomobile::ProcessEntityCollision + jmp edx + } } //-----------------------------------------------------------