Skip to content

Commit 6e48849

Browse files
committed
prevent Die() VScript function from calling ontakedamagealive hooks which would lead to recursion
in case someone uses Die in the hook
1 parent f558c13 commit 6e48849

4 files changed

Lines changed: 22 additions & 2 deletions

File tree

src/game/server/basecombatcharacter.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2274,7 +2274,7 @@ int CBaseCombatCharacter::OnTakeDamage_Alive( const CTakeDamageInfo &info )
22742274
float flDamage = info.GetDamage();
22752275
CBaseEntity* pInflictor = info.GetInflictor();
22762276
#ifdef RD_VSCRIPT_INTERCEPT_ENTITY_DAMAGE
2277-
if ( m_ScriptScope.IsInitialized() && m_ScriptScope.ValueExists( "OnTakeDamage_Alive" ) )
2277+
if ( m_ScriptScope.IsInitialized() && m_ScriptScope.ValueExists( "OnTakeDamage_Alive" ) && info.GetCallVScriptHook() )
22782278
{
22792279
ScriptVariant_t newDamage;
22802280
ScriptStatus_t nStatus = m_ScriptScope.Call( "OnTakeDamage_Alive", &newDamage, ToHScript( pInflictor ), ToHScript( info.GetAttacker() ), ToHScript( info.GetWeapon() ), flDamage, info.GetDamageType(), info.GetAmmoName() );
@@ -2287,7 +2287,9 @@ int CBaseCombatCharacter::OnTakeDamage_Alive( const CTakeDamageInfo &info )
22872287
newDamage.AssignTo( &flDamage );
22882288
}
22892289
}
2290-
if ( CAlienSwarm *pAlienSwarm = ASWGameRules() )
2290+
2291+
CAlienSwarm *pAlienSwarm = ASWGameRules();
2292+
if ( pAlienSwarm && info.GetCallVScriptHook() )
22912293
{
22922294
ScriptVariant_t args[7];
22932295

src/game/server/swarm/asw_inhabitable_npc.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,8 @@ void CASW_Inhabitable_NPC::Die()
353353
SetHealth( 1 );
354354

355355
CTakeDamageInfo info( NULL, NULL, 100, DMG_FALL );
356+
info.SetCallVScriptHook( false );
357+
356358
TakeDamage( info );
357359
}
358360

src/game/shared/takedamageinfo.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ BEGIN_SIMPLE_DATADESC( CTakeDamageInfo )
2929
DEFINE_FIELD( m_iDamageStats, FIELD_INTEGER),
3030
DEFINE_FIELD( m_iAmmoType, FIELD_INTEGER),
3131
DEFINE_FIELD( m_flRadius, FIELD_FLOAT),
32+
DEFINE_FIELD( m_bCallVScriptHook, FIELD_BOOLEAN),
3233
END_DATADESC()
3334

3435
void CTakeDamageInfo::Init( CBaseEntity *pInflictor, CBaseEntity *pAttacker, CBaseEntity *pWeapon, const Vector &damageForce, const Vector &damagePosition, const Vector &reportedPosition, float flDamage, int bitsDamageType, int iCustomDamage )
@@ -58,6 +59,7 @@ void CTakeDamageInfo::Init( CBaseEntity *pInflictor, CBaseEntity *pAttacker, CBa
5859
m_vecReportedPosition = reportedPosition;
5960
m_iAmmoType = -1;
6061
m_flRadius = 0.0f;
62+
m_bCallVScriptHook = true;
6163
}
6264

6365
CTakeDamageInfo::CTakeDamageInfo()

src/game/shared/takedamageinfo.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,9 @@ class CTakeDamageInfo
8383
float GetRadius() const;
8484
void SetRadius( float fRadius );
8585

86+
bool GetCallVScriptHook() const;
87+
void SetCallVScriptHook( bool bCall );
88+
8689
void Set( CBaseEntity *pInflictor, CBaseEntity *pAttacker, float flDamage, int bitsDamageType, int iKillType = 0 );
8790
void Set( CBaseEntity *pInflictor, CBaseEntity *pAttacker, CBaseEntity *pWeapon, float flDamage, int bitsDamageType, int iKillType = 0 );
8891
void Set( CBaseEntity *pInflictor, CBaseEntity *pAttacker, const Vector &damageForce, const Vector &damagePosition, float flDamage, int bitsDamageType, int iKillType = 0, Vector *reportedPosition = NULL );
@@ -116,6 +119,7 @@ class CTakeDamageInfo
116119
int m_iDamageStats;
117120
int m_iAmmoType; // AmmoType of the weapon used to cause this damage, if any
118121
float m_flRadius;
122+
bool m_bCallVScriptHook;
119123

120124
DECLARE_SIMPLE_DATADESC();
121125
};
@@ -344,6 +348,16 @@ inline void CTakeDamageInfo::SetRadius( float flRadius )
344348
m_flRadius = flRadius;
345349
}
346350

351+
inline bool CTakeDamageInfo::GetCallVScriptHook() const
352+
{
353+
return m_bCallVScriptHook;
354+
}
355+
356+
inline void CTakeDamageInfo::SetCallVScriptHook( bool bCall )
357+
{
358+
m_bCallVScriptHook = bCall;
359+
}
360+
347361

348362
// -------------------------------------------------------------------------------------------------- //
349363
// Inlines.

0 commit comments

Comments
 (0)