diff --git a/Client/mods/deathmatch/logic/CClientExplosionManager.cpp b/Client/mods/deathmatch/logic/CClientExplosionManager.cpp index 583bbd6220..33f0748c6e 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) { @@ -53,7 +70,23 @@ bool CClientExplosionManager::Hook_ExplosionCreation(CEntity* pGameExplodingEnti CClientEntity* const pResponsible = pPools->GetClientEntity(reinterpret_cast(pResponsibleGameEntity->GetInterface())); if (!pResponsible) - return false; + { + 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 eWeaponType explosionWeaponType = WEAPONTYPE_EXPLOSION; @@ -167,25 +200,22 @@ CExplosion* CClientExplosionManager::Create(eExplosionType explosionType, CVecto if (responsibleWeapon != WEAPONTYPE_UNARMED) m_LastWeaponType = responsibleWeapon; else + m_LastWeaponType = GetWeaponTypeFromExplosionType(explosionType); + + if (pCreator && pCreator->IsLocalEntity()) { - switch (explosionType) + bool bAllowExplosion = Hook_ExplosionCreation(nullptr, pGameCreator, vecPosition, explosionType); + if (!bAllowExplosion) + return nullptr; + } + else if (!pCreator) + { + CClientPlayer* pLocalPlayer = m_pManager->GetPlayerManager()->GetLocalPlayer(); + if (pLocalPlayer) { - 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; + bool bAllowExplosion = Hook_ExplosionCreation(nullptr, pLocalPlayer->GetGameEntity(), vecPosition, explosionType); + if (!bAllowExplosion) + return nullptr; } } diff --git a/Client/mods/deathmatch/logic/CClientExplosionManager.h b/Client/mods/deathmatch/logic/CClientExplosionManager.h index 0bfb37978f..fcb55e931a 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); };