Reworked the OnDeath VScript hook so it could cheat death properly

This commit is contained in:
Blixibon 2021-05-11 11:17:06 -05:00
parent 6f515a2d34
commit 8ad19cbf0a
5 changed files with 58 additions and 45 deletions

View File

@ -1725,25 +1725,6 @@ Killed
*/
void CBaseCombatCharacter::Event_Killed( const CTakeDamageInfo &info )
{
#ifdef MAPBASE_VSCRIPT
if (m_ScriptScope.IsInitialized() && g_Hook_OnDeath.CanRunInScope( m_ScriptScope ))
{
HSCRIPT hInfo = g_pScriptVM->RegisterInstance( const_cast<CTakeDamageInfo*>(&info) );
// info
ScriptVariant_t functionReturn;
ScriptVariant_t args[] = { ScriptVariant_t( hInfo ) };
if ( g_Hook_OnDeath.Call( m_ScriptScope, &functionReturn, args ) && (functionReturn.m_type == FIELD_BOOLEAN && functionReturn.m_bool == false) )
{
// Make this entity cheat death
g_pScriptVM->RemoveInstance( hInfo );
return;
}
g_pScriptVM->RemoveInstance( hInfo );
}
#endif
extern ConVar npc_vphysics;
// Advance life state to dying
@ -2893,6 +2874,12 @@ int CBaseCombatCharacter::OnTakeDamage( const CTakeDamageInfo &info )
#endif
if ( m_iHealth <= 0 )
{
#ifdef MAPBASE_VSCRIPT
// False = Cheat death
if (ScriptDeathHook( const_cast<CTakeDamageInfo*>(&info) ) == false)
return retVal;
#endif
IPhysicsObject *pPhysics = VPhysicsGetObject();
if ( pPhysics )
{

View File

@ -1719,22 +1719,9 @@ int CBaseEntity::VPhysicsTakeDamage( const CTakeDamageInfo &info )
void CBaseEntity::Event_Killed( const CTakeDamageInfo &info )
{
#ifdef MAPBASE_VSCRIPT
if (m_ScriptScope.IsInitialized() && g_Hook_OnDeath.CanRunInScope( m_ScriptScope ))
{
HSCRIPT hInfo = g_pScriptVM->RegisterInstance( const_cast<CTakeDamageInfo*>(&info) );
// info
ScriptVariant_t functionReturn;
ScriptVariant_t args[] = { ScriptVariant_t( hInfo ) };
if ( g_Hook_OnDeath.Call( m_ScriptScope, &functionReturn, args ) && (functionReturn.m_type == FIELD_BOOLEAN && functionReturn.m_bool == false) )
{
// Make this entity cheat death
g_pScriptVM->RemoveInstance( hInfo );
// False = Cheat death
if (ScriptDeathHook( const_cast<CTakeDamageInfo*>(&info) ) == false)
return;
}
g_pScriptVM->RemoveInstance( hInfo );
}
#endif
if( info.GetAttacker() )
@ -4668,6 +4655,16 @@ bool CBaseEntity::AcceptInput( const char *szInputName, CBaseEntity *pActivator,
return false;
}
#ifdef MAPBASE_VSCRIPT
bool CBaseEntity::ScriptAcceptInput( const char *szInputName, const char *szValue, HSCRIPT hActivator, HSCRIPT hCaller )
{
variant_t value;
value.SetString( MAKE_STRING( szValue ) );
return AcceptInput( szInputName, ToEnt( hActivator ), ToEnt( hCaller ), value, 0 );
}
#endif
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
@ -4700,12 +4697,26 @@ bool CBaseEntity::ScriptInputHook( const char *szInputName, CBaseEntity *pActiva
}
#ifdef MAPBASE_VSCRIPT
bool CBaseEntity::ScriptAcceptInput( const char *szInputName, const char *szValue, HSCRIPT hActivator, HSCRIPT hCaller )
bool CBaseEntity::ScriptDeathHook( CTakeDamageInfo *info )
{
variant_t value;
value.SetString( MAKE_STRING(szValue) );
if (m_ScriptScope.IsInitialized() && g_Hook_OnDeath.CanRunInScope( m_ScriptScope ))
{
HSCRIPT hInfo = g_pScriptVM->RegisterInstance( info );
return AcceptInput( szInputName, ToEnt(hActivator), ToEnt(hCaller), value, 0 );
// info
ScriptVariant_t functionReturn;
ScriptVariant_t args[] = { ScriptVariant_t( hInfo ) };
if ( g_Hook_OnDeath.Call( m_ScriptScope, &functionReturn, args ) && (functionReturn.m_type == FIELD_BOOLEAN && functionReturn.m_bool == false) )
{
// Make this entity cheat death
g_pScriptVM->RemoveInstance( hInfo );
return false;
}
g_pScriptVM->RemoveInstance( hInfo );
}
return true;
}
#endif

View File

@ -693,6 +693,9 @@ public:
#endif
bool ScriptInputHook( const char *szInputName, CBaseEntity *pActivator, CBaseEntity *pCaller, variant_t Value, ScriptVariant_t &functionReturn );
#ifdef MAPBASE_VSCRIPT
bool ScriptDeathHook( CTakeDamageInfo *info );
#endif
//
// Input handlers.

View File

@ -688,11 +688,17 @@ int CCombineDropshipContainer::OnTakeDamage( const CTakeDamageInfo &info )
}
if ( m_iHealth <= 0 )
{
#ifdef MAPBASE_VSCRIPT
// False = Cheat death
if (ScriptDeathHook( const_cast<CTakeDamageInfo*>(&info) ) != false)
#endif
{
m_iHealth = 0;
Event_Killed( dmgInfo );
return 0;
}
}
// Spawn damage effects
if ( nPrevHealth != GetHealth() )

View File

@ -561,10 +561,16 @@ int CPropAPC::OnTakeDamage( const CTakeDamageInfo &info )
m_iHealth -= dmgInfo.GetDamage();
if ( m_iHealth <= 0 )
{
#ifdef MAPBASE_VSCRIPT
// False = Cheat death
if (ScriptDeathHook( const_cast<CTakeDamageInfo*>(&info) ) != false)
#endif
{
m_iHealth = 0;
Event_Killed( dmgInfo );
return 0;
}
}
// Chain
// BaseClass::OnTakeDamage( dmgInfo );