From 48cde4dbdcc5a5eef95b0285602de9603e32338d Mon Sep 17 00:00:00 2001 From: Mohab Date: Mon, 4 Aug 2025 20:22:02 +0300 Subject: [PATCH 01/12] Fix onClientExplosion event not firing for client-side createExplosion function --- .../logic/CClientExplosionManager.cpp | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/Client/mods/deathmatch/logic/CClientExplosionManager.cpp b/Client/mods/deathmatch/logic/CClientExplosionManager.cpp index 583bbd62209..a47849ea2b9 100644 --- a/Client/mods/deathmatch/logic/CClientExplosionManager.cpp +++ b/Client/mods/deathmatch/logic/CClientExplosionManager.cpp @@ -53,7 +53,42 @@ bool CClientExplosionManager::Hook_ExplosionCreation(CEntity* pGameExplodingEnti CClientEntity* const pResponsible = pPools->GetClientEntity(reinterpret_cast(pResponsibleGameEntity->GetInterface())); if (!pResponsible) + { + if (pGameCreator) + { + CClientPlayer* pLocalPlayer = m_pManager->GetPlayerManager()->GetLocalPlayer(); + if (pLocalPlayer && pLocalPlayer->GetGameEntity() == pGameCreator) + { + eWeaponType explosionWeaponType = WEAPONTYPE_EXPLOSION; + switch (explosionType) + { + case EXP_TYPE_GRENADE: + explosionWeaponType = WEAPONTYPE_GRENADE; + break; + case EXP_TYPE_MOLOTOV: + explosionWeaponType = WEAPONTYPE_MOLOTOV; + break; + case EXP_TYPE_ROCKET: + case EXP_TYPE_ROCKET_WEAK: + explosionWeaponType = WEAPONTYPE_ROCKET; + break; + case EXP_TYPE_TANK_GRENADE: + explosionWeaponType = WEAPONTYPE_TANK_GRENADE; + break; + default: + break; + } + + CLuaArguments arguments; + arguments.PushNumber(vecPosition.fX); + arguments.PushNumber(vecPosition.fY); + arguments.PushNumber(vecPosition.fZ); + arguments.PushNumber(explosionWeaponType); + return pLocalPlayer->CallEvent("onClientExplosion", arguments, true); + } + } return false; + } // Determine the used weapon eWeaponType explosionWeaponType = WEAPONTYPE_EXPLOSION; @@ -189,6 +224,23 @@ CExplosion* CClientExplosionManager::Create(eExplosionType explosionType, CVecto } } + if (pCreator && pCreator->IsLocalEntity()) + { + bool bAllowExplosion = Hook_ExplosionCreation(nullptr, pGameCreator, vecPosition, explosionType); + if (!bAllowExplosion) + return nullptr; + } + else if (!pCreator) + { + CClientPlayer* pLocalPlayer = m_pManager->GetPlayerManager()->GetLocalPlayer(); + if (pLocalPlayer) + { + bool bAllowExplosion = Hook_ExplosionCreation(nullptr, pLocalPlayer->GetGameEntity(), vecPosition, explosionType); + if (!bAllowExplosion) + return nullptr; + } + } + CExplosion* pExplosion = g_pGame->GetExplosionManager()->AddExplosion(NULL, pGameCreator, explosionType, vecPosition, 0, bMakeSound, fCamShake, bNoDamage); return pExplosion; } From 1566e9148fcbf8fc32290b9bb939a67051244bb9 Mon Sep 17 00:00:00 2001 From: Mohab Date: Tue, 5 Aug 2025 16:38:54 +0300 Subject: [PATCH 02/12] Add GetWeaponTypeFromExplosionType and refactor explosion logic --- .../logic/CClientExplosionManager.cpp | 89 +++++++------------ .../logic/CClientExplosionManager.h | 3 +- 2 files changed, 34 insertions(+), 58 deletions(-) diff --git a/Client/mods/deathmatch/logic/CClientExplosionManager.cpp b/Client/mods/deathmatch/logic/CClientExplosionManager.cpp index a47849ea2b9..4135c5ae159 100644 --- a/Client/mods/deathmatch/logic/CClientExplosionManager.cpp +++ b/Client/mods/deathmatch/logic/CClientExplosionManager.cpp @@ -39,6 +39,23 @@ bool CClientExplosionManager::Hook_StaticExplosionCreation(CEntity* pGameExplodi return g_pExplosionManager->Hook_ExplosionCreation(pGameExplodingEntity, pGameCreator, vecPosition, explosionType); } +eWeaponType CClientExplosionManager::GetWeaponTypeFromExplosionType(eExplosionType explosionType) +{ + switch (explosionType) { + case EXP_TYPE_GRENADE: + return WEAPONTYPE_GRENADE; + case EXP_TYPE_MOLOTOV: + return WEAPONTYPE_MOLOTOV; + case EXP_TYPE_ROCKET: + case EXP_TYPE_ROCKET_WEAK: + return WEAPONTYPE_ROCKET; + case EXP_TYPE_TANK_GRENADE: + return WEAPONTYPE_TANK_GRENADE; + default: + return WEAPONTYPE_EXPLOSION; + } +} + bool CClientExplosionManager::Hook_ExplosionCreation(CEntity* pGameExplodingEntity, CEntity* pGameCreator, const CVector& vecPosition, eExplosionType explosionType) { @@ -52,42 +69,20 @@ bool CClientExplosionManager::Hook_ExplosionCreation(CEntity* pGameExplodingEnti CClientEntity* const pResponsible = pPools->GetClientEntity(reinterpret_cast(pResponsibleGameEntity->GetInterface())); - if (!pResponsible) - { - if (pGameCreator) - { - CClientPlayer* pLocalPlayer = m_pManager->GetPlayerManager()->GetLocalPlayer(); - if (pLocalPlayer && pLocalPlayer->GetGameEntity() == pGameCreator) - { - eWeaponType explosionWeaponType = WEAPONTYPE_EXPLOSION; - switch (explosionType) - { - case EXP_TYPE_GRENADE: - explosionWeaponType = WEAPONTYPE_GRENADE; - break; - case EXP_TYPE_MOLOTOV: - explosionWeaponType = WEAPONTYPE_MOLOTOV; - break; - case EXP_TYPE_ROCKET: - case EXP_TYPE_ROCKET_WEAK: - explosionWeaponType = WEAPONTYPE_ROCKET; - break; - case EXP_TYPE_TANK_GRENADE: - explosionWeaponType = WEAPONTYPE_TANK_GRENADE; - break; - default: - break; - } - - CLuaArguments arguments; - arguments.PushNumber(vecPosition.fX); - arguments.PushNumber(vecPosition.fY); - arguments.PushNumber(vecPosition.fZ); - arguments.PushNumber(explosionWeaponType); - return pLocalPlayer->CallEvent("onClientExplosion", arguments, true); - } - } - return false; + if (!pResponsible) { + if (!pGameCreator) return false; + + CClientPlayer* pLocalPlayer = m_pManager->GetPlayerManager()->GetLocalPlayer(); + if (!pLocalPlayer || pLocalPlayer->GetGameEntity() != pGameCreator) return false; + + eWeaponType explosionWeaponType = GetWeaponTypeFromExplosionType(explosionType); + + CLuaArguments arguments; + arguments.PushNumber(vecPosition.fX); + arguments.PushNumber(vecPosition.fY); + arguments.PushNumber(vecPosition.fZ); + arguments.PushNumber(explosionWeaponType); + return pLocalPlayer->CallEvent("onClientExplosion", arguments, true); } // Determine the used weapon @@ -202,27 +197,7 @@ CExplosion* CClientExplosionManager::Create(eExplosionType explosionType, CVecto if (responsibleWeapon != WEAPONTYPE_UNARMED) m_LastWeaponType = responsibleWeapon; else - { - switch (explosionType) - { - case EXP_TYPE_GRENADE: - m_LastWeaponType = WEAPONTYPE_GRENADE; - break; - case EXP_TYPE_MOLOTOV: - m_LastWeaponType = WEAPONTYPE_MOLOTOV; - break; - case EXP_TYPE_ROCKET: - case EXP_TYPE_ROCKET_WEAK: - m_LastWeaponType = WEAPONTYPE_ROCKET; - break; - case EXP_TYPE_TANK_GRENADE: - m_LastWeaponType = WEAPONTYPE_TANK_GRENADE; - break; - default: - m_LastWeaponType = WEAPONTYPE_EXPLOSION; - break; - } - } + m_LastWeaponType = GetWeaponTypeFromExplosionType(explosionType); if (pCreator && pCreator->IsLocalEntity()) { diff --git a/Client/mods/deathmatch/logic/CClientExplosionManager.h b/Client/mods/deathmatch/logic/CClientExplosionManager.h index 0bfb37978f7..fcb55e931ac 100644 --- a/Client/mods/deathmatch/logic/CClientExplosionManager.h +++ b/Client/mods/deathmatch/logic/CClientExplosionManager.h @@ -34,5 +34,6 @@ class CClientExplosionManager CClientEntityPtr m_pLastCreator; private: - CClientManager* m_pManager; + CClientManager* m_pManager; + eWeaponType GetWeaponTypeFromExplosionType(eExplosionType explosionType); }; From c3226fa0041141d0e83e26d5a7ca9fd95e5de5ae Mon Sep 17 00:00:00 2001 From: Mohab Date: Thu, 7 Aug 2025 18:18:19 +0300 Subject: [PATCH 03/12] applying reviews --- Client/mods/deathmatch/logic/CClientExplosionManager.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Client/mods/deathmatch/logic/CClientExplosionManager.cpp b/Client/mods/deathmatch/logic/CClientExplosionManager.cpp index 4135c5ae159..8bbe425aacb 100644 --- a/Client/mods/deathmatch/logic/CClientExplosionManager.cpp +++ b/Client/mods/deathmatch/logic/CClientExplosionManager.cpp @@ -69,11 +69,13 @@ bool CClientExplosionManager::Hook_ExplosionCreation(CEntity* pGameExplodingEnti CClientEntity* const pResponsible = pPools->GetClientEntity(reinterpret_cast(pResponsibleGameEntity->GetInterface())); - if (!pResponsible) { - if (!pGameCreator) return false; + if (!pResponsible) + if (!pGameCreator) + return false; CClientPlayer* pLocalPlayer = m_pManager->GetPlayerManager()->GetLocalPlayer(); - if (!pLocalPlayer || pLocalPlayer->GetGameEntity() != pGameCreator) return false; + if (!pLocalPlayer || pLocalPlayer->GetGameEntity() != pGameCreator) + return false; eWeaponType explosionWeaponType = GetWeaponTypeFromExplosionType(explosionType); From 1892f3db1c794e5bdb4412c26a6d80581ef1319c Mon Sep 17 00:00:00 2001 From: Mohab Date: Thu, 7 Aug 2025 19:29:51 +0300 Subject: [PATCH 04/12] fix typo --- Client/mods/deathmatch/logic/CClientExplosionManager.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Client/mods/deathmatch/logic/CClientExplosionManager.cpp b/Client/mods/deathmatch/logic/CClientExplosionManager.cpp index 8bbe425aacb..33f0748c6e1 100644 --- a/Client/mods/deathmatch/logic/CClientExplosionManager.cpp +++ b/Client/mods/deathmatch/logic/CClientExplosionManager.cpp @@ -70,6 +70,7 @@ bool CClientExplosionManager::Hook_ExplosionCreation(CEntity* pGameExplodingEnti CClientEntity* const pResponsible = pPools->GetClientEntity(reinterpret_cast(pResponsibleGameEntity->GetInterface())); if (!pResponsible) + { if (!pGameCreator) return false; From 580c3381672f5bc0500b13cc2720fb5a647d105e Mon Sep 17 00:00:00 2001 From: Dutchman101 <12105539+Dutchman101@users.noreply.github.com> Date: Tue, 12 Aug 2025 20:00:16 +0000 Subject: [PATCH 05/12] Update Client/mods/deathmatch/logic/CClientExplosionManager.cpp Co-authored-by: Nico <122193236+Nico8340@users.noreply.github.com> --- Client/mods/deathmatch/logic/CClientExplosionManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Client/mods/deathmatch/logic/CClientExplosionManager.cpp b/Client/mods/deathmatch/logic/CClientExplosionManager.cpp index 33f0748c6e1..0b3fb5cc365 100644 --- a/Client/mods/deathmatch/logic/CClientExplosionManager.cpp +++ b/Client/mods/deathmatch/logic/CClientExplosionManager.cpp @@ -39,7 +39,7 @@ bool CClientExplosionManager::Hook_StaticExplosionCreation(CEntity* pGameExplodi return g_pExplosionManager->Hook_ExplosionCreation(pGameExplodingEntity, pGameCreator, vecPosition, explosionType); } -eWeaponType CClientExplosionManager::GetWeaponTypeFromExplosionType(eExplosionType explosionType) +eWeaponType CClientExplosionManager::GetWeaponTypeFromExplosionType(const eExplosionType explosionType) { switch (explosionType) { case EXP_TYPE_GRENADE: From ef75488aa6a30921287efd3eee5709ea27ade6ff Mon Sep 17 00:00:00 2001 From: Dutchman101 <12105539+Dutchman101@users.noreply.github.com> Date: Tue, 12 Aug 2025 20:00:25 +0000 Subject: [PATCH 06/12] Update Client/mods/deathmatch/logic/CClientExplosionManager.cpp Co-authored-by: Nico <122193236+Nico8340@users.noreply.github.com> --- Client/mods/deathmatch/logic/CClientExplosionManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Client/mods/deathmatch/logic/CClientExplosionManager.cpp b/Client/mods/deathmatch/logic/CClientExplosionManager.cpp index 0b3fb5cc365..cd5e8d3a377 100644 --- a/Client/mods/deathmatch/logic/CClientExplosionManager.cpp +++ b/Client/mods/deathmatch/logic/CClientExplosionManager.cpp @@ -74,7 +74,7 @@ bool CClientExplosionManager::Hook_ExplosionCreation(CEntity* pGameExplodingEnti if (!pGameCreator) return false; - CClientPlayer* pLocalPlayer = m_pManager->GetPlayerManager()->GetLocalPlayer(); + CClientPlayer* localPlayer = m_pManager->GetPlayerManager()->GetLocalPlayer(); if (!pLocalPlayer || pLocalPlayer->GetGameEntity() != pGameCreator) return false; From 4264f9b307f5dcdc0c435999d12a20764db7b35e Mon Sep 17 00:00:00 2001 From: Dutchman101 <12105539+Dutchman101@users.noreply.github.com> Date: Tue, 12 Aug 2025 20:00:31 +0000 Subject: [PATCH 07/12] Update Client/mods/deathmatch/logic/CClientExplosionManager.cpp Co-authored-by: Nico <122193236+Nico8340@users.noreply.github.com> --- Client/mods/deathmatch/logic/CClientExplosionManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Client/mods/deathmatch/logic/CClientExplosionManager.cpp b/Client/mods/deathmatch/logic/CClientExplosionManager.cpp index cd5e8d3a377..b81de481e9b 100644 --- a/Client/mods/deathmatch/logic/CClientExplosionManager.cpp +++ b/Client/mods/deathmatch/logic/CClientExplosionManager.cpp @@ -75,7 +75,7 @@ bool CClientExplosionManager::Hook_ExplosionCreation(CEntity* pGameExplodingEnti return false; CClientPlayer* localPlayer = m_pManager->GetPlayerManager()->GetLocalPlayer(); - if (!pLocalPlayer || pLocalPlayer->GetGameEntity() != pGameCreator) + if (!localPlayer || localPlayer->GetGameEntity() != pGameCreator) return false; eWeaponType explosionWeaponType = GetWeaponTypeFromExplosionType(explosionType); From 1f8350c29c229f5893ce715bc9b4fe7440bd1943 Mon Sep 17 00:00:00 2001 From: Dutchman101 <12105539+Dutchman101@users.noreply.github.com> Date: Tue, 12 Aug 2025 20:00:40 +0000 Subject: [PATCH 08/12] Update Client/mods/deathmatch/logic/CClientExplosionManager.cpp Co-authored-by: Nico <122193236+Nico8340@users.noreply.github.com> --- Client/mods/deathmatch/logic/CClientExplosionManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Client/mods/deathmatch/logic/CClientExplosionManager.cpp b/Client/mods/deathmatch/logic/CClientExplosionManager.cpp index b81de481e9b..796bf5511c6 100644 --- a/Client/mods/deathmatch/logic/CClientExplosionManager.cpp +++ b/Client/mods/deathmatch/logic/CClientExplosionManager.cpp @@ -85,7 +85,7 @@ bool CClientExplosionManager::Hook_ExplosionCreation(CEntity* pGameExplodingEnti arguments.PushNumber(vecPosition.fY); arguments.PushNumber(vecPosition.fZ); arguments.PushNumber(explosionWeaponType); - return pLocalPlayer->CallEvent("onClientExplosion", arguments, true); + return localPlayer->CallEvent("onClientExplosion", arguments, true); } // Determine the used weapon From b824d382f485f18051930f85b822a1f8d9fc0f81 Mon Sep 17 00:00:00 2001 From: Dutchman101 <12105539+Dutchman101@users.noreply.github.com> Date: Tue, 12 Aug 2025 20:00:47 +0000 Subject: [PATCH 09/12] Update Client/mods/deathmatch/logic/CClientExplosionManager.cpp Co-authored-by: Nico <122193236+Nico8340@users.noreply.github.com> --- Client/mods/deathmatch/logic/CClientExplosionManager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Client/mods/deathmatch/logic/CClientExplosionManager.cpp b/Client/mods/deathmatch/logic/CClientExplosionManager.cpp index 796bf5511c6..63b68420d29 100644 --- a/Client/mods/deathmatch/logic/CClientExplosionManager.cpp +++ b/Client/mods/deathmatch/logic/CClientExplosionManager.cpp @@ -204,8 +204,8 @@ CExplosion* CClientExplosionManager::Create(eExplosionType explosionType, CVecto if (pCreator && pCreator->IsLocalEntity()) { - bool bAllowExplosion = Hook_ExplosionCreation(nullptr, pGameCreator, vecPosition, explosionType); - if (!bAllowExplosion) + bool allowExplosion = Hook_ExplosionCreation(nullptr, pGameCreator, vecPosition, explosionType); + if (!allowExplosion) return nullptr; } else if (!pCreator) From 895e81a4c99770a2d3a85c927886810a4e0335e1 Mon Sep 17 00:00:00 2001 From: Dutchman101 <12105539+Dutchman101@users.noreply.github.com> Date: Tue, 12 Aug 2025 20:00:56 +0000 Subject: [PATCH 10/12] Update Client/mods/deathmatch/logic/CClientExplosionManager.cpp Co-authored-by: Nico <122193236+Nico8340@users.noreply.github.com> --- Client/mods/deathmatch/logic/CClientExplosionManager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Client/mods/deathmatch/logic/CClientExplosionManager.cpp b/Client/mods/deathmatch/logic/CClientExplosionManager.cpp index 63b68420d29..46f9def79db 100644 --- a/Client/mods/deathmatch/logic/CClientExplosionManager.cpp +++ b/Client/mods/deathmatch/logic/CClientExplosionManager.cpp @@ -210,8 +210,8 @@ CExplosion* CClientExplosionManager::Create(eExplosionType explosionType, CVecto } else if (!pCreator) { - CClientPlayer* pLocalPlayer = m_pManager->GetPlayerManager()->GetLocalPlayer(); - if (pLocalPlayer) + CClientPlayer* localPlayer = m_pManager->GetPlayerManager()->GetLocalPlayer(); + if (localPlayer) { bool bAllowExplosion = Hook_ExplosionCreation(nullptr, pLocalPlayer->GetGameEntity(), vecPosition, explosionType); if (!bAllowExplosion) From a7d12ca9d19b5abfc20026ddb28f2b12f70ebcc0 Mon Sep 17 00:00:00 2001 From: Dutchman101 <12105539+Dutchman101@users.noreply.github.com> Date: Tue, 12 Aug 2025 20:01:03 +0000 Subject: [PATCH 11/12] Update Client/mods/deathmatch/logic/CClientExplosionManager.cpp Co-authored-by: Nico <122193236+Nico8340@users.noreply.github.com> --- Client/mods/deathmatch/logic/CClientExplosionManager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Client/mods/deathmatch/logic/CClientExplosionManager.cpp b/Client/mods/deathmatch/logic/CClientExplosionManager.cpp index 46f9def79db..29807b3887c 100644 --- a/Client/mods/deathmatch/logic/CClientExplosionManager.cpp +++ b/Client/mods/deathmatch/logic/CClientExplosionManager.cpp @@ -213,8 +213,8 @@ CExplosion* CClientExplosionManager::Create(eExplosionType explosionType, CVecto CClientPlayer* localPlayer = m_pManager->GetPlayerManager()->GetLocalPlayer(); if (localPlayer) { - bool bAllowExplosion = Hook_ExplosionCreation(nullptr, pLocalPlayer->GetGameEntity(), vecPosition, explosionType); - if (!bAllowExplosion) + bool allowExplosion = Hook_ExplosionCreation(nullptr, localPlayer->GetGameEntity(), vecPosition, explosionType); + if (!allowExplosion) return nullptr; } } From 8b8bb3165fca26dd16c81cb16744cef7ef9eeb9d Mon Sep 17 00:00:00 2001 From: Dutchman101 <12105539+Dutchman101@users.noreply.github.com> Date: Tue, 12 Aug 2025 20:01:09 +0000 Subject: [PATCH 12/12] Update Client/mods/deathmatch/logic/CClientExplosionManager.h Co-authored-by: Nico <122193236+Nico8340@users.noreply.github.com> --- Client/mods/deathmatch/logic/CClientExplosionManager.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Client/mods/deathmatch/logic/CClientExplosionManager.h b/Client/mods/deathmatch/logic/CClientExplosionManager.h index fcb55e931ac..3931c0ae5fa 100644 --- a/Client/mods/deathmatch/logic/CClientExplosionManager.h +++ b/Client/mods/deathmatch/logic/CClientExplosionManager.h @@ -35,5 +35,5 @@ class CClientExplosionManager private: CClientManager* m_pManager; - eWeaponType GetWeaponTypeFromExplosionType(eExplosionType explosionType); + eWeaponType GetWeaponTypeFromExplosionType(const eExplosionType explosionType); };