Skip to content

Commit

Permalink
Merge pull request mapbase-source#192 from samisalreadytaken/scripthooks
Browse files Browse the repository at this point in the history
Script hooks fixes and script hook manager
  • Loading branch information
Blixibon committed Jul 23, 2022
2 parents a9c9567 + e05b418 commit 9d2a6b8
Show file tree
Hide file tree
Showing 12 changed files with 481 additions and 193 deletions.
2 changes: 1 addition & 1 deletion sp/src/game/client/c_baseentity.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1353,7 +1353,7 @@ void C_BaseEntity::Term()
if ( m_hScriptInstance )
{
#ifdef MAPBASE_VSCRIPT
if ( m_ScriptScope.IsInitialized() )
if ( m_ScriptScope.IsInitialized() && g_Hook_UpdateOnRemove.CanRunInScope( m_ScriptScope ) )
{
g_Hook_UpdateOnRemove.Call( m_ScriptScope, NULL, NULL );
}
Expand Down
11 changes: 9 additions & 2 deletions sp/src/game/client/vscript_client.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ class CScriptClientEntityIterator : public IClientEntityListener

void OnEntityCreated( CBaseEntity *pEntity )
{
if ( g_pScriptVM )
if ( g_pScriptVM && GetScriptHookManager().IsEventHooked( "OnEntityCreated" ) )
{
// entity
ScriptVariant_t args[] = { ScriptVariant_t( pEntity->GetScriptInstance() ) };
Expand All @@ -124,7 +124,7 @@ class CScriptClientEntityIterator : public IClientEntityListener

void OnEntityDeleted( CBaseEntity *pEntity )
{
if ( g_pScriptVM )
if ( g_pScriptVM && GetScriptHookManager().IsEventHooked( "OnEntityDeleted" ) )
{
// entity
ScriptVariant_t args[] = { ScriptVariant_t( pEntity->GetScriptInstance() ) };
Expand Down Expand Up @@ -645,6 +645,11 @@ bool VScriptClientInit()
#else
Log( "VSCRIPT: Started VScript virtual machine using script language '%s'\n", g_pScriptVM->GetLanguageName() );
#endif

#ifdef MAPBASE_VSCRIPT
GetScriptHookManager().OnInit();
#endif

ScriptRegisterFunction( g_pScriptVM, GetMapName, "Get the name of the map.");
ScriptRegisterFunction( g_pScriptVM, Time, "Get the current server time" );
ScriptRegisterFunction( g_pScriptVM, DoUniqueString, SCRIPT_ALIAS( "UniqueString", "Generate a string guaranteed to be unique across the life of the script VM, with an optional root string." ) );
Expand Down Expand Up @@ -770,6 +775,8 @@ class CVScriptGameSystem : public CAutoGameSystemPerFrame
{
#ifdef MAPBASE_VSCRIPT
g_ScriptNetMsg->LevelShutdownPreVM();

GetScriptHookManager().OnShutdown();
#endif
VScriptClientTerm();
}
Expand Down
2 changes: 1 addition & 1 deletion sp/src/game/server/baseentity.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2646,7 +2646,7 @@ void CBaseEntity::UpdateOnRemove( void )
if ( m_hScriptInstance )
{
#ifdef MAPBASE_VSCRIPT
if (m_ScriptScope.IsInitialized())
if ( m_ScriptScope.IsInitialized() && g_Hook_UpdateOnRemove.CanRunInScope( m_ScriptScope ) )
{
g_Hook_UpdateOnRemove.Call( m_ScriptScope, NULL, NULL );
}
Expand Down
10 changes: 5 additions & 5 deletions sp/src/game/server/filters.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2157,7 +2157,7 @@ class CFilterScript : public CBaseFilter
public:
bool PassesFilterImpl( CBaseEntity *pCaller, CBaseEntity *pEntity )
{
if (m_ScriptScope.IsInitialized())
if ( m_ScriptScope.IsInitialized() && g_Hook_PassesFilter.CanRunInScope( m_ScriptScope ) )
{
// caller, activator
ScriptVariant_t functionReturn;
Expand All @@ -2176,7 +2176,7 @@ class CFilterScript : public CBaseFilter

bool PassesDamageFilterImpl( CBaseEntity *pCaller, const CTakeDamageInfo &info )
{
if (m_ScriptScope.IsInitialized())
if ( m_ScriptScope.IsInitialized() && g_Hook_PassesDamageFilter.CanRunInScope( m_ScriptScope ) )
{
HSCRIPT pInfo = g_pScriptVM->RegisterInstance( const_cast<CTakeDamageInfo*>(&info) );

Expand All @@ -2201,7 +2201,7 @@ class CFilterScript : public CBaseFilter

bool PassesFinalDamageFilter( CBaseEntity *pCaller, const CTakeDamageInfo &info )
{
if (m_ScriptScope.IsInitialized())
if ( m_ScriptScope.IsInitialized() && g_Hook_PassesFinalDamageFilter.CanRunInScope( m_ScriptScope ) )
{
HSCRIPT pInfo = g_pScriptVM->RegisterInstance( const_cast<CTakeDamageInfo*>(&info) );

Expand All @@ -2225,7 +2225,7 @@ class CFilterScript : public CBaseFilter

bool BloodAllowed( CBaseEntity *pCaller, const CTakeDamageInfo &info )
{
if (m_ScriptScope.IsInitialized())
if ( m_ScriptScope.IsInitialized() && g_Hook_BloodAllowed.CanRunInScope( m_ScriptScope ) )
{
HSCRIPT pInfo = g_pScriptVM->RegisterInstance( const_cast<CTakeDamageInfo*>(&info) );

Expand All @@ -2249,7 +2249,7 @@ class CFilterScript : public CBaseFilter

bool DamageMod( CBaseEntity *pCaller, CTakeDamageInfo &info )
{
if (m_ScriptScope.IsInitialized())
if ( m_ScriptScope.IsInitialized() && g_Hook_DamageMod.CanRunInScope( m_ScriptScope ) )
{
HSCRIPT pInfo = g_pScriptVM->RegisterInstance( &info );

Expand Down
12 changes: 9 additions & 3 deletions sp/src/game/server/vscript_server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ class CScriptEntityIterator : public IEntityListener

void OnEntityCreated( CBaseEntity *pEntity )
{
if ( g_pScriptVM )
if ( g_pScriptVM && GetScriptHookManager().IsEventHooked( "OnEntityCreated" ) )
{
// entity
ScriptVariant_t args[] = { ScriptVariant_t( pEntity->GetScriptInstance() ) };
Expand All @@ -164,7 +164,7 @@ class CScriptEntityIterator : public IEntityListener

void OnEntitySpawned( CBaseEntity *pEntity )
{
if ( g_pScriptVM )
if ( g_pScriptVM && GetScriptHookManager().IsEventHooked( "OnEntitySpawned" ) )
{
// entity
ScriptVariant_t args[] = { ScriptVariant_t( pEntity->GetScriptInstance() ) };
Expand All @@ -174,7 +174,7 @@ class CScriptEntityIterator : public IEntityListener

void OnEntityDeleted( CBaseEntity *pEntity )
{
if ( g_pScriptVM )
if ( g_pScriptVM && GetScriptHookManager().IsEventHooked( "OnEntityDeleted" ) )
{
// entity
ScriptVariant_t args[] = { ScriptVariant_t( pEntity->GetScriptInstance() ) };
Expand Down Expand Up @@ -600,6 +600,10 @@ bool VScriptServerInit()
Log( "VSCRIPT: Started VScript virtual machine using script language '%s'\n", g_pScriptVM->GetLanguageName() );
#endif

#ifdef MAPBASE_VSCRIPT
GetScriptHookManager().OnInit();
#endif

#ifdef MAPBASE_VSCRIPT
// MULTIPLAYER
// ScriptRegisterFunctionNamed( g_pScriptVM, UTIL_PlayerByIndex, "GetPlayerByIndex", "PlayerInstanceFromIndex" );
Expand Down Expand Up @@ -836,6 +840,8 @@ class CVScriptGameSystem : public CAutoGameSystemPerFrame
{
#ifdef MAPBASE_VSCRIPT
g_ScriptNetMsg->LevelShutdownPreVM();

GetScriptHookManager().OnShutdown();
#endif
VScriptServerTerm();
}
Expand Down
2 changes: 1 addition & 1 deletion sp/src/game/shared/baseentity_shared.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1613,7 +1613,7 @@ typedef CTraceFilterSimpleList CBulletsTraceFilter;
void CBaseEntity::FireBullets( const FireBulletsInfo_t &info )
{
#if defined(MAPBASE_VSCRIPT) && defined(GAME_DLL)
if (m_ScriptScope.IsInitialized())
if ( m_ScriptScope.IsInitialized() && g_Hook_FireBullets.CanRunInScope( m_ScriptScope ) )
{
HSCRIPT hInfo = g_pScriptVM->RegisterInstance( const_cast<FireBulletsInfo_t*>(&info) );

Expand Down
6 changes: 4 additions & 2 deletions sp/src/game/shared/mapbase/vscript_singletons.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -872,7 +872,8 @@ class CScriptSaveRestoreUtil : public CAutoGameSystem
{
if ( g_pScriptVM )
{
g_Hook_OnSave.Call( NULL, NULL, NULL );
if ( GetScriptHookManager().IsEventHooked( "OnSave" ) )
g_Hook_OnSave.Call( NULL, NULL, NULL );

// Legacy hook
HSCRIPT hFunc = g_pScriptVM->LookupFunction( "OnSave" );
Expand All @@ -893,7 +894,8 @@ class CScriptSaveRestoreUtil : public CAutoGameSystem
{
if ( g_pScriptVM )
{
g_Hook_OnRestore.Call( NULL, NULL, NULL );
if ( GetScriptHookManager().IsEventHooked( "OnRestore" ) )
g_Hook_OnRestore.Call( NULL, NULL, NULL );

// Legacy hook
HSCRIPT hFunc = g_pScriptVM->LookupFunction( "OnRestore" );
Expand Down
9 changes: 7 additions & 2 deletions sp/src/game/shared/mapbase/weapon_custom_scripted.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -177,8 +177,13 @@ CWeaponCustomScripted::CWeaponCustomScripted()

bool CWeaponCustomScripted::RunWeaponHook( ScriptHook_t &hook, HSCRIPT &cached, ScriptVariant_t *retVal, ScriptVariant_t *pArgs )
{
if (!hook.CheckFuncValid(cached))
cached = hook.CanRunInScope(m_ScriptScope);
if ( !cached )
{
if ( hook.CanRunInScope( m_ScriptScope ) )
{
cached = hook.m_hFunc;
}
}

if (cached)
{
Expand Down
4 changes: 4 additions & 0 deletions sp/src/game/shared/vscript_shared.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -451,6 +451,10 @@ class CVScriptSaveRestoreBlockHandler : public CDefSaveRestoreBlockHandler
}
m_InstanceMap.Purge();

#ifdef MAPBASE_VSCRIPT
GetScriptHookManager().OnRestore();
#endif

#if defined(MAPBASE_VSCRIPT) && defined(CLIENT_DLL)
VScriptSaveRestoreUtil_OnVMRestore();
#endif
Expand Down
Loading

0 comments on commit 9d2a6b8

Please sign in to comment.