@@ -39,6 +39,23 @@ bool CClientExplosionManager::Hook_StaticExplosionCreation(CEntity* pGameExplodi
39
39
return g_pExplosionManager->Hook_ExplosionCreation (pGameExplodingEntity, pGameCreator, vecPosition, explosionType);
40
40
}
41
41
42
+ eWeaponType CClientExplosionManager::GetWeaponTypeFromExplosionType (const eExplosionType explosionType)
43
+ {
44
+ switch (explosionType) {
45
+ case EXP_TYPE_GRENADE:
46
+ return WEAPONTYPE_GRENADE;
47
+ case EXP_TYPE_MOLOTOV:
48
+ return WEAPONTYPE_MOLOTOV;
49
+ case EXP_TYPE_ROCKET:
50
+ case EXP_TYPE_ROCKET_WEAK:
51
+ return WEAPONTYPE_ROCKET;
52
+ case EXP_TYPE_TANK_GRENADE:
53
+ return WEAPONTYPE_TANK_GRENADE;
54
+ default :
55
+ return WEAPONTYPE_EXPLOSION;
56
+ }
57
+ }
58
+
42
59
bool CClientExplosionManager::Hook_ExplosionCreation (CEntity* pGameExplodingEntity, CEntity* pGameCreator, const CVector& vecPosition,
43
60
eExplosionType explosionType)
44
61
{
@@ -53,7 +70,23 @@ bool CClientExplosionManager::Hook_ExplosionCreation(CEntity* pGameExplodingEnti
53
70
CClientEntity* const pResponsible = pPools->GetClientEntity (reinterpret_cast <DWORD*>(pResponsibleGameEntity->GetInterface ()));
54
71
55
72
if (!pResponsible)
56
- return false ;
73
+ {
74
+ if (!pGameCreator)
75
+ return false ;
76
+
77
+ CClientPlayer* localPlayer = m_pManager->GetPlayerManager ()->GetLocalPlayer ();
78
+ if (!localPlayer || localPlayer->GetGameEntity () != pGameCreator)
79
+ return false ;
80
+
81
+ eWeaponType explosionWeaponType = GetWeaponTypeFromExplosionType (explosionType);
82
+
83
+ CLuaArguments arguments;
84
+ arguments.PushNumber (vecPosition.fX );
85
+ arguments.PushNumber (vecPosition.fY );
86
+ arguments.PushNumber (vecPosition.fZ );
87
+ arguments.PushNumber (explosionWeaponType);
88
+ return localPlayer->CallEvent (" onClientExplosion" , arguments, true );
89
+ }
57
90
58
91
// Determine the used weapon
59
92
eWeaponType explosionWeaponType = WEAPONTYPE_EXPLOSION;
@@ -167,25 +200,22 @@ CExplosion* CClientExplosionManager::Create(eExplosionType explosionType, CVecto
167
200
if (responsibleWeapon != WEAPONTYPE_UNARMED)
168
201
m_LastWeaponType = responsibleWeapon;
169
202
else
203
+ m_LastWeaponType = GetWeaponTypeFromExplosionType (explosionType);
204
+
205
+ if (pCreator && pCreator->IsLocalEntity ())
170
206
{
171
- switch (explosionType)
207
+ bool allowExplosion = Hook_ExplosionCreation (nullptr , pGameCreator, vecPosition, explosionType);
208
+ if (!allowExplosion)
209
+ return nullptr ;
210
+ }
211
+ else if (!pCreator)
212
+ {
213
+ CClientPlayer* localPlayer = m_pManager->GetPlayerManager ()->GetLocalPlayer ();
214
+ if (localPlayer)
172
215
{
173
- case EXP_TYPE_GRENADE:
174
- m_LastWeaponType = WEAPONTYPE_GRENADE;
175
- break ;
176
- case EXP_TYPE_MOLOTOV:
177
- m_LastWeaponType = WEAPONTYPE_MOLOTOV;
178
- break ;
179
- case EXP_TYPE_ROCKET:
180
- case EXP_TYPE_ROCKET_WEAK:
181
- m_LastWeaponType = WEAPONTYPE_ROCKET;
182
- break ;
183
- case EXP_TYPE_TANK_GRENADE:
184
- m_LastWeaponType = WEAPONTYPE_TANK_GRENADE;
185
- break ;
186
- default :
187
- m_LastWeaponType = WEAPONTYPE_EXPLOSION;
188
- break ;
216
+ bool allowExplosion = Hook_ExplosionCreation (nullptr , localPlayer->GetGameEntity (), vecPosition, explosionType);
217
+ if (!allowExplosion)
218
+ return nullptr ;
189
219
}
190
220
}
191
221
0 commit comments