diff --git a/extension.cpp b/extension.cpp index f71d1e7..0fc7acc 100644 --- a/extension.cpp +++ b/extension.cpp @@ -488,10 +488,8 @@ IterationRetval_t EnumElement(IHandleEntity *pHandleEntity) { RETURN_META_VALUE(MRES_IGNORED, ITERATION_CONTINUE); } - else - { - RETURN_META_VALUE(MRES_SUPERCEDE, ITERATION_CONTINUE); - } + + RETURN_META_VALUE(MRES_SUPERCEDE, ITERATION_CONTINUE); } cell_t FilterTriggerMoved(IPluginContext *pContext, const cell_t *params) @@ -500,6 +498,35 @@ cell_t FilterTriggerMoved(IPluginContext *pContext, const cell_t *params) return 0; } +volatile int gv_BlockSolidMoved = -1; +// void IVEngineServer::SolidMoved( edict_t *pSolidEnt, ICollideable *pSolidCollide, const Vector* pPrevAbsOrigin, bool testSurroundingBoundsOnly ) = 0; +SH_DECL_HOOK4_void(IVEngineServer, SolidMoved, SH_NOATTRIB, 0, edict_t *, ICollideable *, const Vector *, bool); +void SolidMoved(edict_t *pSolidEnt, ICollideable *pSolidCollide, const Vector *pPrevAbsOrigin, bool testSurroundingBoundsOnly) +{ + if(gv_BlockSolidMoved == -1) + { + RETURN_META(MRES_IGNORED); + } + else if(gv_BlockSolidMoved == 0) + { + RETURN_META(MRES_SUPERCEDE); + } + + int Entity = gamehelpers->IndexOfEdict(pSolidEnt); + + if(Entity != gv_BlockSolidMoved) + { + RETURN_META(MRES_SUPERCEDE); + } + + RETURN_META(MRES_IGNORED); +} + +cell_t BlockSolidMoved(IPluginContext *pContext, const cell_t *params) +{ + gv_BlockSolidMoved = params[1]; + return 0; +} bool CSSFixes::SDK_OnLoad(char *error, size_t maxlength, bool late) { @@ -625,9 +652,6 @@ bool CSSFixes::SDK_OnLoad(char *error, size_t maxlength, bool late) g_SH_SkipTwoEntitiesShouldHitEntity = SH_ADD_DVPHOOK(CTraceFilterSkipTwoEntities, ShouldHitEntity, g_CTraceFilterSkipTwoEntities, SH_STATIC(ShouldHitEntity), true); g_SH_SimpleShouldHitEntity = SH_ADD_DVPHOOK(CTraceFilterSimple, ShouldHitEntity, g_CTraceFilterSimple, SH_STATIC(ShouldHitEntity), true); - - SH_ADD_HOOK(IVEngineServer, TriggerMoved, engine, SH_STATIC(TriggerMoved), false); - // Find VTable for CTriggerMoved uintptr_t pCTriggerMoved; if(!g_pGameConf->GetMemSig("CTriggerMoved", (void **)(&pCTriggerMoved)) || !pCTriggerMoved) @@ -641,6 +665,9 @@ bool CSSFixes::SDK_OnLoad(char *error, size_t maxlength, bool late) g_SH_TriggerMoved = SH_ADD_DVPHOOK(CTriggerMoved, EnumElement, g_CTriggerMoved, SH_STATIC(EnumElement), false); + SH_ADD_HOOK(IVEngineServer, TriggerMoved, engine, SH_STATIC(TriggerMoved), false); + SH_ADD_HOOK(IVEngineServer, SolidMoved, engine, SH_STATIC(SolidMoved), false); + if(!g_pGameConf->GetMemSig("Physics_SimulateEntity", (void **)(&g_pPhysics_SimulateEntity)) || !g_pPhysics_SimulateEntity) { snprintf(error, maxlength, "Failed to find Physics_SimulateEntity.\n"); @@ -755,12 +782,14 @@ bool CSSFixes::SDK_OnLoad(char *error, size_t maxlength, bool late) const sp_nativeinfo_t MyNatives[] = { { "FilterTriggerMoved", FilterTriggerMoved }, + { "BlockSolidMoved", BlockSolidMoved }, { NULL, NULL } }; void CSSFixes::SDK_OnAllLoaded() { sharesys->AddNatives(myself, MyNatives); + sharesys->RegisterLibrary(myself, "CSSFixes"); } void CSSFixes::SDK_OnUnload() @@ -846,6 +875,9 @@ void CSSFixes::SDK_OnUnload() if(g_SH_TriggerMoved) SH_REMOVE_HOOK_ID(g_SH_TriggerMoved); + SH_REMOVE_HOOK(IVEngineServer, TriggerMoved, engine, SH_STATIC(TriggerMoved), false); + SH_REMOVE_HOOK(IVEngineServer, SolidMoved, engine, SH_STATIC(SolidMoved), false); + gameconfs->CloseGameConfigFile(g_pGameConf); // Revert all applied patches diff --git a/include/CSSFixes.inc b/include/CSSFixes.inc index 4045590..0d5fee5 100644 --- a/include/CSSFixes.inc +++ b/include/CSSFixes.inc @@ -14,6 +14,12 @@ forward void OnRunThinkFunctionsPost(bool simulating); // REMEMBER TO CALL THIS AGAIN WITH -1 AFTER USING IT !!! native void FilterTriggerMoved(int entity); +// -1 = Ignore, normal operation. +// 0 = Block ALL SV_TriggerMoved. +// >0 = Entity index for which to allow SV_TriggerMoved to be called. +// REMEMBER TO CALL THIS AGAIN WITH -1 AFTER USING IT !!! +native void BlockSolidMoved(int entity); + public Extension __ext_CSSFixes = { name = "CSSFixes", diff --git a/smsdk_config.h b/smsdk_config.h index 21ea980..8aef4e1 100644 --- a/smsdk_config.h +++ b/smsdk_config.h @@ -40,7 +40,7 @@ /* Basic information exposed publicly */ #define SMEXT_CONF_NAME "CSSFixes" #define SMEXT_CONF_DESCRIPTION "Patches bugs in the CSS server binary and more..." -#define SMEXT_CONF_VERSION "1.8" +#define SMEXT_CONF_VERSION "1.9" #define SMEXT_CONF_AUTHOR "BotoX" #define SMEXT_CONF_URL "" #define SMEXT_CONF_LOGTAG "CSSFIXES"