Skip to content

Commit 9c43977

Browse files
authored
Fix friendly fire does not prevent the player from burning (PR #4320, Fixes #399)
1 parent 602b26e commit 9c43977

File tree

6 files changed

+48
-88
lines changed

6 files changed

+48
-88
lines changed

Client/mods/deathmatch/logic/CClientGame.cpp

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3551,9 +3551,9 @@ void CClientGame::StaticDeathHandler(CPed* pKilledPed, unsigned char ucDeathReas
35513551
g_pClientGame->DeathHandler(pKilledPed, ucDeathReason, ucBodyPart);
35523552
}
35533553

3554-
void CClientGame::StaticFireHandler(CFire* pFire)
3554+
bool CClientGame::StaticFireHandler(CEntitySAInterface* target, CEntitySAInterface* creator)
35553555
{
3556-
g_pClientGame->FireHandler(pFire);
3556+
return g_pClientGame->FireHandler(target, creator);
35573557
}
35583558

35593559
void CClientGame::StaticRender3DStuffHandler()
@@ -3813,10 +3813,22 @@ bool CClientGame::BreakTowLinkHandler(CVehicle* pTowedVehicle)
38133813
return true;
38143814
}
38153815

3816-
void CClientGame::FireHandler(CFire* pFire)
3816+
bool CClientGame::FireHandler(CEntitySAInterface* target, CEntitySAInterface* creator)
38173817
{
3818-
// Disable spreading fires
3819-
pFire->SetNumGenerationsAllowed(0);
3818+
CClientEntity* creatorClientEntity = g_pGame->GetPools()->GetClientEntity((DWORD*)creator);
3819+
CClientEntity* targetClientEntity = g_pGame->GetPools()->GetClientEntity((DWORD*)target);
3820+
3821+
if (creatorClientEntity && targetClientEntity && IS_PLAYER(targetClientEntity) && IS_PLAYER(creatorClientEntity))
3822+
{
3823+
CClientPlayer* targetPlayer = static_cast<CClientPlayer*>(targetClientEntity);
3824+
CClientPlayer* creatorPlayer = static_cast<CClientPlayer*>(creatorClientEntity);
3825+
3826+
CClientTeam* targetPlayerTeam = targetPlayer->GetTeam();
3827+
if (targetPlayerTeam && targetPlayer->IsOnMyTeam(creatorPlayer) && !targetPlayerTeam->GetFriendlyFire() && creatorPlayer != targetPlayer)
3828+
return false;
3829+
}
3830+
3831+
return true;
38203832
}
38213833

38223834
void CClientGame::ProjectileInitiateHandler(CClientProjectile* pProjectile)

Client/mods/deathmatch/logic/CClientGame.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ class CClientModelCacheManager;
5353
class CDebugHookManager;
5454
class CResourceFileDownloadManager;
5555
class CServerInfo;
56+
class CFire;
5657
enum class eAnimID;
5758

5859
struct SVehExtrapolateSettings
@@ -522,7 +523,7 @@ class CClientGame
522523

523524
static bool StaticDamageHandler(CPed* pDamagePed, CEventDamage* pEvent);
524525
static void StaticDeathHandler(CPed* pKilledPed, unsigned char ucDeathReason, unsigned char ucBodyPart);
525-
static void StaticFireHandler(CFire* pFire);
526+
static bool StaticFireHandler(CEntitySAInterface* target, CEntitySAInterface* creator);
526527
static bool StaticBreakTowLinkHandler(CVehicle* pTowedVehicle);
527528
static void StaticDrawRadarAreasHandler();
528529
static void StaticRender3DStuffHandler();
@@ -573,7 +574,7 @@ class CClientGame
573574

574575
bool DamageHandler(CPed* pDamagePed, CEventDamage* pEvent);
575576
void DeathHandler(CPed* pKilledPed, unsigned char ucDeathReason, unsigned char ucBodyPart);
576-
void FireHandler(CFire* pFire);
577+
bool FireHandler(CEntitySAInterface* target, CEntitySAInterface* creator);
577578
bool BreakTowLinkHandler(CVehicle* pTowedVehicle);
578579
void DrawRadarAreasHandler();
579580
void Render3DStuffHandler();

Client/multiplayer_sa/CMultiplayerSA.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1583,6 +1583,10 @@ void CMultiplayerSA::InitHooks()
15831583
MemCpy((void*)0x72565A, "\xDD\xD8\x90", 3);
15841584
MemCpy((void*)0x7259B0, "\xDD\xD8\x90", 3);
15851585
MemSet((void*)0x7258B8, 0x90, 6);
1586+
1587+
// Disable spreading fires (Moved from multiplayer_shotsync)
1588+
MemCpy((void*)0x53A23F, "\x33\xC0\x90\x90\x90", 5);
1589+
MemCpy((void*)0x53A00A, "\x33\xC0\x90\x90\x90", 5);
15861590

15871591
InitHooks_CrashFixHacks();
15881592
InitHooks_DeviceSelection();

Client/multiplayer_sa/multiplayer_shotsync.cpp

Lines changed: 22 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Client/multiplayer_sa/multiplayer_shotsync.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,7 @@
2727
#define HOOKRET_CWeapon__Fire_Sniper 0x7424D7
2828
#define HOOKPOS_CEventDamage__AffectsPed 0x4B35A0
2929
#define HOOKPOS_CEventVehicleExplosion__AffectsPed 0x4B0E58
30-
#define HOOKPOS_CFireManager__StartFire 0x539F00
31-
#define HOOKPOS_CFireManager__StartFire_ 0x53A050
30+
#define HOOKPOS_CFireManager__StartFire 0x53A050
3231
#define HOOKPOS_CProjectileInfo__AddProjectile 0x737C80
3332
#define HOOKPOS_CProjectile__CProjectile 0x5A4030
3433
#define HOOKPOS_IKChainManager_PointArm 0x618B66

Client/sdk/multiplayer/CMultiplayer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ typedef void(BulletImpactHandler)(class CPed* pInitiator, class CEntity* pVictim
8585
typedef void(BulletFireHandler)(class CPed* pInitiator, const CVector* pvecStartPosition, const CVector* pvecEndPosition);
8686
typedef bool(DamageHandler)(class CPed* pDamagePed, class CEventDamage* pEvent);
8787
typedef void(DeathHandler)(class CPed* pKilledPed, unsigned char ucDeathReason, unsigned char ucBodyPart);
88-
typedef void(FireHandler)(class CFire* pFire);
88+
typedef bool(FireHandler)(class CEntitySAInterface* target, class CEntitySAInterface* creator);
8989
typedef bool(ProjectileStopHandler)(class CEntity* owner, enum eWeaponType weaponType, class CVector* origin, float fForce, class CVector* target,
9090
class CEntity* targetEntity);
9191
typedef void(ProjectileHandler)(class CEntity* owner, class CProjectile* projectile, class CProjectileInfo* projectileInfo, enum eWeaponType weaponType,

0 commit comments

Comments
 (0)