@@ -95,7 +95,6 @@ VOID InitShotsyncHooks()
9595 HookInstall (HOOKPOS_CEventDamage__AffectsPed, (DWORD)HOOK_CEventDamage__AffectsPed, 6 );
9696 HookInstall (HOOKPOS_CEventVehicleExplosion__AffectsPed, (DWORD)HOOK_CEventVehicleExplosion__AffectsPed, 5 );
9797 HookInstall (HOOKPOS_CFireManager__StartFire, (DWORD)HOOK_CFireManager__StartFire, 6 );
98- HookInstall (HOOKPOS_CFireManager__StartFire_, (DWORD)HOOK_CFireManager__StartFire_, 6 );
9998 HookInstall (HOOKPOS_CProjectileInfo__AddProjectile, (DWORD)HOOK_CProjectileInfo__AddProjectile, 7 );
10099 HookInstall (HOOKPOS_CProjectile__CProjectile, (DWORD)HOOK_CProjectile__CProjectile, 7 );
101100 HookInstall (HOOKPOS_IKChainManager_PointArm, (DWORD)HOOK_IKChainManager_PointArm, 7 );
@@ -837,95 +836,40 @@ void _declspec(naked) HOOK_CEventDamage__AffectsPed()
837836 }
838837}
839838
840- void ProcessStartFire (CFireSAInterface* fire)
841- {
842- if (m_pFireHandler)
843- {
844- DWORD dwID = ((DWORD)fire - 0xB71F80 /* CLASS_CFireManager */ ) / 40 ;
845- CFire* pFire = pGameInterface->GetFireManager ()->GetFire (dwID);
846- if (pFire)
847- {
848- m_pFireHandler (pFire);
849- }
850- }
851- }
852-
853- CFireSAInterface* tempFire;
854- DWORD dwStoredReturn;
855-
856- // CFire* StartFire(CVector vecLocation, float fFireSize=DEFAULT_FIRE_PARTICLE_SIZE, bool8 bExtinguishEnabled=TRUE, CEntity* pStartedFireEntity = NULL, UInt32
857- // ArgBurnTime = FIRE_AVERAGE_BURNTIME, Int8 NumGenerationsAllowed = 100, Bool8 bReportFire = true);
858- void _declspec (naked) HOOK_CFireManager__StartFire()
859- {
860- // replacement code
861- _asm
862- {
863- mov edx, [esp]
864- mov dwStoredReturn, edx
865- mov edx, returnHere
866- mov [esp], edx
867-
868- push ecx
869- push ebp
870- mov ebp, [esp+0x10 ]
871-
872- mov edx, HOOKPOS_CFireManager__StartFire
873- add edx, 6
874- jmp edx
875-
876- returnHere:
877- mov tempFire, eax
878-
879- pushad
880- }
881-
882- ProcessStartFire (tempFire);
883-
884- _asm
885- {
886- popad
887-
888- mov eax, tempFire
889- mov edx, dwStoredReturn
890- jmp edx
891- }
892- }
893-
894839// CFire* StartFire(CEntity *pBurningEntity, CEntity *pStartedFireEntity, float fFireSize=DEFAULT_FIRE_PARTICLE_SIZE, bool8 bExtinguishEnabled=TRUE, UInt32
895840// ArgBurnTime = FIRE_AVERAGE_BURNTIME, Int8 NumGenerationsAllowed = 100);
896- void _declspec (naked) HOOK_CFireManager__StartFire_()
841+ static constexpr std::uintptr_t SKIP_CFireManager_StartFire = 0x53A0C5 ;
842+ static constexpr std::uintptr_t RETURN_CFireManager_StartFire = 0x53A056 ;
843+
844+ static void _declspec (naked) HOOK_CFireManager__StartFire()
897845{
898846 _asm
899847 {
900- // replacement code
901- mov edx, [esp]
902- mov dwStoredReturn, edx
903- mov edx, returnHere
904- mov [esp], edx
848+ push esi
849+ push edi
850+ mov edi, [esp+0Ch]
905851
906- push esi
907- push edi
908- mov edi, [esp+ 0xC ]
852+ mov eax, m_pFireHandler
853+ test eax, eax
854+ jz startFire
909855
910- //
911- mov edx, HOOKPOS_CFireManager__StartFire_
912- add edx, 6
913- jmp edx
856+ push ecx
914857
915- returnHere:
916- mov tempFire, eax
858+ push [esp+14h]
859+ push edi
860+ call m_pFireHandler
861+ add esp, 8
917862
918- pushad
919- }
863+ pop ecx
920864
921- ProcessStartFire (tempFire);
865+ test al, al
866+ jz abortCreatingFire
922867
923- _asm
924- {
925- popad
868+ startFire:
869+ jmp RETURN_CFireManager_StartFire
926870
927- mov eax, tempFire
928- jmp dwStoredReturn
871+ abortCreatingFire:
872+ jmp SKIP_CFireManager_StartFire
929873 }
930874}
931875
0 commit comments