mirror of
https://github.com/voided/CollisionHook.git
synced 2025-12-06 18:28:22 +00:00
Fix hook leaks, affecting FPS over map restarts
(cherry picked from commit 567a221693b0f6ae223950847607e3a007beefa8)
This commit is contained in:
parent
3930ca47df
commit
c2363cee43
@ -33,6 +33,8 @@ IPhysics *g_pPhysics = NULL;
|
|||||||
IForward *g_pCollisionFwd = NULL;
|
IForward *g_pCollisionFwd = NULL;
|
||||||
IForward *g_pPassFwd = NULL;
|
IForward *g_pPassFwd = NULL;
|
||||||
|
|
||||||
|
int gSetCollisionSolverHookId, gShouldCollideHookId;
|
||||||
|
|
||||||
|
|
||||||
DETOUR_DECL_STATIC2( PassServerEntityFilterFunc, bool, const IHandleEntity *, pTouch, const IHandleEntity *, pPass )
|
DETOUR_DECL_STATIC2( PassServerEntityFilterFunc, bool, const IHandleEntity *, pTouch, const IHandleEntity *, pPass )
|
||||||
{
|
{
|
||||||
@ -120,16 +122,19 @@ bool CollisionHook::SDK_OnMetamodLoad( ISmmAPI *ismm, char *error, size_t maxlen
|
|||||||
{
|
{
|
||||||
GET_V_IFACE_CURRENT( GetPhysicsFactory, g_pPhysics, IPhysics, VPHYSICS_INTERFACE_VERSION );
|
GET_V_IFACE_CURRENT( GetPhysicsFactory, g_pPhysics, IPhysics, VPHYSICS_INTERFACE_VERSION );
|
||||||
|
|
||||||
SH_ADD_HOOK( IPhysics, CreateEnvironment, g_pPhysics, SH_MEMBER( this, &CollisionHook::CreateEnvironment ), false );
|
SH_ADD_HOOK( IPhysics, CreateEnvironment, g_pPhysics, SH_MEMBER( this, &CollisionHook::CreateEnvironment ), true );
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CollisionHook::SDK_OnMetamodUnload(char *error, size_t maxlength)
|
bool CollisionHook::SDK_OnMetamodUnload(char *error, size_t maxlength)
|
||||||
{
|
{
|
||||||
SH_REMOVE_HOOK( IPhysics, CreateEnvironment, g_pPhysics, SH_MEMBER( this, &CollisionHook::CreateEnvironment ), false );
|
SH_REMOVE_HOOK( IPhysics, CreateEnvironment, g_pPhysics, SH_MEMBER( this, &CollisionHook::CreateEnvironment ), true );
|
||||||
|
SH_REMOVE_HOOK_ID( gSetCollisionSolverHookId );
|
||||||
|
SH_REMOVE_HOOK_ID( gShouldCollideHookId );
|
||||||
|
|
||||||
g_pPhysics = NULL;
|
g_pPhysics = NULL;
|
||||||
|
gSetCollisionSolverHookId = gShouldCollideHookId = 0;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -140,13 +145,17 @@ IPhysicsEnvironment *CollisionHook::CreateEnvironment()
|
|||||||
// in order to hook IPhysicsCollisionSolver::ShouldCollide, we need to know when a solver is installed
|
// in order to hook IPhysicsCollisionSolver::ShouldCollide, we need to know when a solver is installed
|
||||||
// in order to hook any installed solvers, we need to hook any created physics environments
|
// in order to hook any installed solvers, we need to hook any created physics environments
|
||||||
|
|
||||||
IPhysicsEnvironment *pEnvironment = SH_CALL( g_pPhysics, &IPhysics::CreateEnvironment )();
|
IPhysicsEnvironment *pEnvironment = META_RESULT_ORIG_RET( IPhysicsEnvironment * );
|
||||||
|
|
||||||
if ( !pEnvironment )
|
if ( !pEnvironment )
|
||||||
RETURN_META_VALUE( MRES_SUPERCEDE, pEnvironment ); // just in case
|
RETURN_META_VALUE( MRES_SUPERCEDE, pEnvironment ); // just in case
|
||||||
|
|
||||||
// hook so we know when a solver is installed
|
// Hook globally so we know when any solver is installed
|
||||||
SH_ADD_HOOK( IPhysicsEnvironment, SetCollisionSolver, pEnvironment, SH_MEMBER( this, &CollisionHook::SetCollisionSolver ), false );
|
gSetCollisionSolverHookId = SH_ADD_VPHOOK( IPhysicsEnvironment, SetCollisionSolver, pEnvironment,
|
||||||
|
SH_MEMBER( this, &CollisionHook::SetCollisionSolver ), true );
|
||||||
|
|
||||||
|
SH_REMOVE_HOOK( IPhysics, CreateEnvironment, g_pPhysics,
|
||||||
|
SH_MEMBER( this, &CollisionHook::CreateEnvironment ), true ); // No longer needed
|
||||||
|
|
||||||
RETURN_META_VALUE( MRES_SUPERCEDE, pEnvironment );
|
RETURN_META_VALUE( MRES_SUPERCEDE, pEnvironment );
|
||||||
}
|
}
|
||||||
@ -156,8 +165,12 @@ void CollisionHook::SetCollisionSolver( IPhysicsCollisionSolver *pSolver )
|
|||||||
if ( !pSolver )
|
if ( !pSolver )
|
||||||
RETURN_META( MRES_IGNORED ); // this shouldn't happen, but knowing valve...
|
RETURN_META( MRES_IGNORED ); // this shouldn't happen, but knowing valve...
|
||||||
|
|
||||||
// the game is installing a solver, hook the func we want
|
// The game installed a solver, globally hook ShouldCollide
|
||||||
SH_ADD_HOOK( IPhysicsCollisionSolver, ShouldCollide, pSolver, SH_MEMBER( this, &CollisionHook::VPhysics_ShouldCollide ), false );
|
gShouldCollideHookId = SH_ADD_VPHOOK( IPhysicsCollisionSolver, ShouldCollide, pSolver,
|
||||||
|
SH_MEMBER( this, &CollisionHook::VPhysics_ShouldCollide ), false );
|
||||||
|
|
||||||
|
SH_REMOVE_HOOK_ID( gSetCollisionSolverHookId ); // No longer needed
|
||||||
|
gSetCollisionSolverHookId = 0;
|
||||||
|
|
||||||
RETURN_META( MRES_IGNORED );
|
RETURN_META( MRES_IGNORED );
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user