From db16bb9c6c322b8f078a86c7e8cf4d83be2639ad Mon Sep 17 00:00:00 2001 From: Vauff Date: Fri, 18 Apr 2025 01:44:47 -0400 Subject: [PATCH 01/24] Switch to Metamod KHook development branch --- .github/workflows/build.yml | 2 +- Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f99795020..8ac56d1f9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -47,7 +47,7 @@ jobs: uses: actions/checkout@v4 with: repository: alliedmodders/metamod-source - ref: master + ref: k/sourcehook_alternative path: mmsource-2.0 submodules: recursive diff --git a/Dockerfile b/Dockerfile index 19b85ae7e..37039b5ac 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,7 @@ RUN apt update && apt install -y clang-16 RUN ln -sf /usr/bin/clang-16 /usr/bin/clang && ln -sf /usr/bin/clang++-16 /usr/bin/clang++ RUN git clone https://github.com/alliedmodders/ambuild RUN cd ambuild && python setup.py install && cd .. -RUN git clone https://github.com/alliedmodders/metamod-source +RUN git clone -b k/sourcehook_alternative https://github.com/alliedmodders/metamod-source RUN git config --global --add safe.directory /app COPY ./docker-entrypoint.sh ./ From 022936d4ab13e3928ae616faa7a0e2405a83ea9f Mon Sep 17 00:00:00 2001 From: Vauff Date: Fri, 18 Apr 2025 02:50:41 -0400 Subject: [PATCH 02/24] fix includes, some definitely wrong messing around with api --- AMBuildScript | 2 +- CS2Fixes.vcxproj | 4 ++-- src/cs2fixes.cpp | 10 +++++++--- src/cs2fixes.h | 1 - 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/AMBuildScript b/AMBuildScript index abe002b1c..a4ec8d1c7 100644 --- a/AMBuildScript +++ b/AMBuildScript @@ -292,7 +292,7 @@ class MMSPluginConfig(object): cxx.cxxincludes += [ os.path.join(context.currentSourcePath), os.path.join(mms_core_path), - os.path.join(mms_core_path, 'sourcehook'), + os.path.join(mms_core_path, 'khook', 'include'), ] defines = [] diff --git a/CS2Fixes.vcxproj b/CS2Fixes.vcxproj index e2cd6d4fe..b0b26a349 100644 --- a/CS2Fixes.vcxproj +++ b/CS2Fixes.vcxproj @@ -124,7 +124,7 @@ NotUsing pch.h stdcpp20 - protobuf/generated;src/utils;src/cs2_sdk;sdk/public;sdk/public/tier0;sdk/game/shared;sdk/game/server;sdk/public/tier1;sdk/public/mathlib;minhook/include;$(MMSOURCE112)/core;$(MMSOURCE112)/core/sourcehook;vendor/subhook;vendor/funchook/include;sdk/public/entity2;sdk/public/game/server;sdk/thirdparty/protobuf-3.21.8/src;$(SolutionDir);%(AdditionalIncludeDirectories) + protobuf/generated;src/utils;src/cs2_sdk;sdk/public;sdk/public/tier0;sdk/game/shared;sdk/game/server;sdk/public/tier1;sdk/public/mathlib;minhook/include;$(MMSOURCE112)/core;$(MMSOURCE112)/core/khook/include;vendor/subhook;vendor/funchook/include;sdk/public/entity2;sdk/public/game/server;sdk/thirdparty/protobuf-3.21.8/src;$(SolutionDir);%(AdditionalIncludeDirectories) %(UndefinePreprocessorDefinitions) MultiThreadedDebug true @@ -150,7 +150,7 @@ NotUsing pch.h stdcpp20 - protobuf/generated;src/utils;src/cs2_sdk;sdk/public;sdk/public/tier0;sdk/game/shared;sdk/game/server;sdk/public/tier1;sdk/public/mathlib;minhook/include;$(MMSOURCE112)/core;$(MMSOURCE112)/core/sourcehook;vendor/subhook;vendor/funchook/include;sdk/public/entity2;sdk/public/game/server;sdk/thirdparty/protobuf-3.21.8/src;$(SolutionDir);%(AdditionalIncludeDirectories) + protobuf/generated;src/utils;src/cs2_sdk;sdk/public;sdk/public/tier0;sdk/game/shared;sdk/game/server;sdk/public/tier1;sdk/public/mathlib;minhook/include;$(MMSOURCE112)/core;$(MMSOURCE112)/core/khook/include;vendor/subhook;vendor/funchook/include;sdk/public/entity2;sdk/public/game/server;sdk/thirdparty/protobuf-3.21.8/src;$(SolutionDir);%(AdditionalIncludeDirectories) MultiThreaded %(UndefinePreprocessorDefinitions) true diff --git a/src/cs2fixes.cpp b/src/cs2fixes.cpp index 1b4ae95ca..6fafbe5d1 100644 --- a/src/cs2fixes.cpp +++ b/src/cs2fixes.cpp @@ -44,6 +44,7 @@ #include "icvar.h" #include "idlemanager.h" #include "interface.h" +#include "khook.hpp" #include "leader.h" #include "map_votes.h" #include "networkstringtabledefs.h" @@ -98,7 +99,8 @@ void Panic(const char* msg, ...) class GameSessionConfiguration_t {}; -SH_DECL_HOOK3_void(IServerGameDLL, GameFrame, SH_NOATTRIB, 0, bool, bool, bool); +KHook::VirtualMemberHook GameFrameHook(&IServerGameDLL::GameFrame, DISABLE_ME_SOMEHOW, &CS2Fixes::Hook_GameFramePost); +//SH_DECL_HOOK3_void(IServerGameDLL, GameFrame, SH_NOATTRIB, 0, bool, bool, bool); SH_DECL_HOOK0_void(IServerGameDLL, GameServerSteamAPIActivated, SH_NOATTRIB, 0); SH_DECL_HOOK0_void(IServerGameDLL, GameServerSteamAPIDeactivated, SH_NOATTRIB, 0); SH_DECL_HOOK1_void(IServerGameDLL, ApplyGameSettings, SH_NOATTRIB, 0, KeyValues*); @@ -860,7 +862,7 @@ void CS2Fixes::Hook_ClientDisconnect(CPlayerSlot slot, ENetworkDisconnectionReas g_playerManager->OnClientDisconnect(slot); } -void CS2Fixes::Hook_GameFramePost(bool simulating, bool bFirstTick, bool bLastTick) +KHook::HookAction CS2Fixes::Hook_GameFramePost(bool simulating, bool bFirstTick, bool bLastTick) { /** * simulating: @@ -872,7 +874,7 @@ void CS2Fixes::Hook_GameFramePost(bool simulating, bool bFirstTick, bool bLastTi VPROF_BUDGET("CS2Fixes::Hook_GameFramePost", "CS2FixesPerFrame"); if (!GetGlobals()) - return; + return {KHook::Action::Ignore}; if (simulating && g_bHasTicked) g_flUniversalTime += GetGlobals()->curtime - g_flLastTickedTime; @@ -909,6 +911,8 @@ void CS2Fixes::Hook_GameFramePost(bool simulating, bool bFirstTick, bool bLastTi CZRRegenTimer::Tick(); EntityHandler_OnGameFramePost(simulating, GetGlobals()->tickcount); + + return {KHook::Action::Ignore}; } extern CConVar g_cvarFlashLightTransmitOthers; diff --git a/src/cs2fixes.h b/src/cs2fixes.h index e334bed01..bbe1a5c02 100644 --- a/src/cs2fixes.h +++ b/src/cs2fixes.h @@ -24,7 +24,6 @@ #include #include #include -#include struct CTakeDamageInfoContainer; class CCSPlayer_MovementServices; From 32027b4a5dd9de9dde09cd9313696b6d6f74d9b8 Mon Sep 17 00:00:00 2001 From: Vauff Date: Fri, 18 Apr 2025 12:43:29 -0400 Subject: [PATCH 03/24] first khook theoretically working --- src/cs2fixes.cpp | 9 ++++----- src/cs2fixes.h | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/cs2fixes.cpp b/src/cs2fixes.cpp index 6fafbe5d1..c47e4eea7 100644 --- a/src/cs2fixes.cpp +++ b/src/cs2fixes.cpp @@ -99,8 +99,7 @@ void Panic(const char* msg, ...) class GameSessionConfiguration_t {}; -KHook::VirtualMemberHook GameFrameHook(&IServerGameDLL::GameFrame, DISABLE_ME_SOMEHOW, &CS2Fixes::Hook_GameFramePost); -//SH_DECL_HOOK3_void(IServerGameDLL, GameFrame, SH_NOATTRIB, 0, bool, bool, bool); +KHook::Virtual gameFrameHook(&IServerGameDLL::GameFrame, &g_CS2Fixes, 0, &CS2Fixes::Hook_GameFramePost); SH_DECL_HOOK0_void(IServerGameDLL, GameServerSteamAPIActivated, SH_NOATTRIB, 0); SH_DECL_HOOK0_void(IServerGameDLL, GameServerSteamAPIDeactivated, SH_NOATTRIB, 0); SH_DECL_HOOK1_void(IServerGameDLL, ApplyGameSettings, SH_NOATTRIB, 0, KeyValues*); @@ -211,7 +210,7 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool int offset = g_GameConfig->GetOffset("IGameTypes_CreateWorkshopMapGroup"); SH_MANUALHOOK_RECONFIGURE(CreateWorkshopMapGroup, offset, 0, 0); - SH_ADD_HOOK(IServerGameDLL, GameFrame, g_pSource2Server, SH_MEMBER(this, &CS2Fixes::Hook_GameFramePost), true); + gameFrameHook.Add(g_pSource2Server, true); SH_ADD_HOOK(IServerGameDLL, GameServerSteamAPIActivated, g_pSource2Server, SH_MEMBER(this, &CS2Fixes::Hook_GameServerSteamAPIActivated), false); SH_ADD_HOOK(IServerGameDLL, GameServerSteamAPIDeactivated, g_pSource2Server, SH_MEMBER(this, &CS2Fixes::Hook_GameServerSteamAPIDeactivated), false); SH_ADD_HOOK(IServerGameDLL, ApplyGameSettings, g_pSource2Server, SH_MEMBER(this, &CS2Fixes::Hook_ApplyGameSettings), false); @@ -414,7 +413,7 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool bool CS2Fixes::Unload(char* error, size_t maxlen) { - SH_REMOVE_HOOK(IServerGameDLL, GameFrame, g_pSource2Server, SH_MEMBER(this, &CS2Fixes::Hook_GameFramePost), true); + gameFrameHook.Remove(g_pSource2Server, true); SH_REMOVE_HOOK(IServerGameDLL, GameServerSteamAPIActivated, g_pSource2Server, SH_MEMBER(this, &CS2Fixes::Hook_GameServerSteamAPIActivated), false); SH_REMOVE_HOOK(IServerGameDLL, GameServerSteamAPIDeactivated, g_pSource2Server, SH_MEMBER(this, &CS2Fixes::Hook_GameServerSteamAPIDeactivated), false); SH_REMOVE_HOOK(IServerGameDLL, ApplyGameSettings, g_pSource2Server, SH_MEMBER(this, &CS2Fixes::Hook_ApplyGameSettings), false); @@ -862,7 +861,7 @@ void CS2Fixes::Hook_ClientDisconnect(CPlayerSlot slot, ENetworkDisconnectionReas g_playerManager->OnClientDisconnect(slot); } -KHook::HookAction CS2Fixes::Hook_GameFramePost(bool simulating, bool bFirstTick, bool bLastTick) +KHook::Return CS2Fixes::Hook_GameFramePost(IServerGameDLL* pThis, bool simulating, bool bFirstTick, bool bLastTick) { /** * simulating: diff --git a/src/cs2fixes.h b/src/cs2fixes.h index bbe1a5c02..81e821fa8 100644 --- a/src/cs2fixes.h +++ b/src/cs2fixes.h @@ -53,7 +53,7 @@ class CS2Fixes : public ISmmPlugin, public IMetamodListener bool loadGame, bool background); void OnLevelShutdown(); - void Hook_GameFramePost(bool simulating, bool bFirstTick, bool bLastTick); + KHook::Return Hook_GameFramePost(IServerGameDLL* pThis, bool simulating, bool bFirstTick, bool bLastTick); void Hook_ClientActive(CPlayerSlot slot, bool bLoadGame, const char* pszName, uint64 xuid); void Hook_ClientDisconnect(CPlayerSlot slot, ENetworkDisconnectionReason reason, const char* pszName, uint64 xuid, const char* pszNetworkID); void Hook_ClientPutInServer(CPlayerSlot slot, char const* pszName, int type, uint64 xuid); From e507b6e48a2f208e4e9d5da8aff6202995637f1e Mon Sep 17 00:00:00 2001 From: Vauff Date: Sun, 20 Apr 2025 10:42:03 -0400 Subject: [PATCH 04/24] Finish migration of main virtual hooks Still needs testing --- Dockerfile | 2 +- src/cs2fixes.cpp | 449 ++++++++++++++++++++++++++--------------------- src/cs2fixes.h | 64 ++++--- 3 files changed, 284 insertions(+), 231 deletions(-) diff --git a/Dockerfile b/Dockerfile index 37039b5ac..a40ad999f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,7 @@ RUN apt update && apt install -y clang-16 RUN ln -sf /usr/bin/clang-16 /usr/bin/clang && ln -sf /usr/bin/clang++-16 /usr/bin/clang++ RUN git clone https://github.com/alliedmodders/ambuild RUN cd ambuild && python setup.py install && cd .. -RUN git clone -b k/sourcehook_alternative https://github.com/alliedmodders/metamod-source +RUN git clone --recurse-submodules -b k/sourcehook_alternative https://github.com/alliedmodders/metamod-source RUN git config --global --add safe.directory /app COPY ./docker-entrypoint.sh ./ diff --git a/src/cs2fixes.cpp b/src/cs2fixes.cpp index c47e4eea7..b17cc9e97 100644 --- a/src/cs2fixes.cpp +++ b/src/cs2fixes.cpp @@ -44,7 +44,6 @@ #include "icvar.h" #include "idlemanager.h" #include "interface.h" -#include "khook.hpp" #include "leader.h" #include "map_votes.h" #include "networkstringtabledefs.h" @@ -99,31 +98,30 @@ void Panic(const char* msg, ...) class GameSessionConfiguration_t {}; -KHook::Virtual gameFrameHook(&IServerGameDLL::GameFrame, &g_CS2Fixes, 0, &CS2Fixes::Hook_GameFramePost); -SH_DECL_HOOK0_void(IServerGameDLL, GameServerSteamAPIActivated, SH_NOATTRIB, 0); -SH_DECL_HOOK0_void(IServerGameDLL, GameServerSteamAPIDeactivated, SH_NOATTRIB, 0); -SH_DECL_HOOK1_void(IServerGameDLL, ApplyGameSettings, SH_NOATTRIB, 0, KeyValues*); -SH_DECL_HOOK4_void(IServerGameClients, ClientActive, SH_NOATTRIB, 0, CPlayerSlot, bool, const char*, uint64); -SH_DECL_HOOK5_void(IServerGameClients, ClientDisconnect, SH_NOATTRIB, 0, CPlayerSlot, ENetworkDisconnectionReason, const char*, uint64, const char*); -SH_DECL_HOOK4_void(IServerGameClients, ClientPutInServer, SH_NOATTRIB, 0, CPlayerSlot, char const*, int, uint64); -SH_DECL_HOOK1_void(IServerGameClients, ClientSettingsChanged, SH_NOATTRIB, 0, CPlayerSlot); -SH_DECL_HOOK6_void(IServerGameClients, OnClientConnected, SH_NOATTRIB, 0, CPlayerSlot, const char*, uint64, const char*, const char*, bool); -SH_DECL_HOOK6(IServerGameClients, ClientConnect, SH_NOATTRIB, 0, bool, CPlayerSlot, const char*, uint64, const char*, bool, CBufferString*); -SH_DECL_HOOK8_void(IGameEventSystem, PostEventAbstract, SH_NOATTRIB, 0, CSplitScreenSlot, bool, int, const uint64*, - INetworkMessageInternal*, const CNetMessage*, unsigned long, NetChannelBufType_t) - SH_DECL_HOOK3_void(INetworkServerService, StartupServer, SH_NOATTRIB, 0, const GameSessionConfiguration_t&, ISource2WorldSession*, const char*); -SH_DECL_HOOK7_void(ISource2GameEntities, CheckTransmit, SH_NOATTRIB, 0, CCheckTransmitInfo**, int, CBitVec<16384>&, const Entity2Networkable_t**, const uint16*, int, bool); -SH_DECL_HOOK2_void(IServerGameClients, ClientCommand, SH_NOATTRIB, 0, CPlayerSlot, const CCommand&); -SH_DECL_HOOK3_void(ICvar, DispatchConCommand, SH_NOATTRIB, 0, ConCommandRef, const CCommandContext&, const CCommand&); -SH_DECL_MANUALHOOK1_void(CGamePlayerEquipUse, 0, 0, 0, InputData_t*); -SH_DECL_MANUALHOOK1_void(CGamePlayerEquipPrecache, 0, 0, 0, void**); -SH_DECL_MANUALHOOK2_void(CreateWorkshopMapGroup, 0, 0, 0, const char*, const CUtlStringList&); -SH_DECL_MANUALHOOK1(OnTakeDamage_Alive, 0, 0, 0, bool, CTakeDamageInfoContainer*); -SH_DECL_MANUALHOOK1_void(CheckMovingGround, 0, 0, 0, double); -SH_DECL_HOOK2(IGameEventManager2, LoadEventsFromFile, SH_NOATTRIB, 0, int, const char*, bool); -SH_DECL_MANUALHOOK1_void(GoToIntermission, 0, 0, 0, bool); -SH_DECL_MANUALHOOK2_void(PhysicsTouchShuffle, 0, 0, 0, CUtlVector*, bool); -SH_DECL_MANUALHOOK3_void(DropWeapon, 0, 0, 0, CBasePlayerWeapon*, Vector*, Vector*); +KHook::Virtual gameFrameHook(&IServerGameDLL::GameFrame, &g_CS2Fixes, nullptr, &CS2Fixes::Hook_GameFrame_Post); +KHook::Virtual gameServerSteamAPIActivatedHook(&IServerGameDLL::GameServerSteamAPIActivated, &g_CS2Fixes, &CS2Fixes::Hook_GameServerSteamAPIActivated, nullptr); +KHook::Virtual gameServerSteamAPIDeactivatedHook(&IServerGameDLL::GameServerSteamAPIDeactivated, &g_CS2Fixes, &CS2Fixes::Hook_GameServerSteamAPIDeactivated, nullptr); +KHook::Virtual applyGameSettingsHook(&IServerGameDLL::ApplyGameSettings, &g_CS2Fixes, &CS2Fixes::Hook_ApplyGameSettings, nullptr); +KHook::Virtual clientActiveHook(&IServerGameClients::ClientActive, &g_CS2Fixes, nullptr, &CS2Fixes::Hook_ClientActive_Post); +KHook::Virtual clientDisconnectHook(&IServerGameClients::ClientDisconnect, &g_CS2Fixes, nullptr, &CS2Fixes::Hook_ClientDisconnect_Post); +KHook::Virtual clientPutInServerHook(&IServerGameClients::ClientPutInServer, &g_CS2Fixes, nullptr, &CS2Fixes::Hook_ClientPutInServer_Post); +KHook::Virtual clientSettingsChangedHook(&IServerGameClients::ClientSettingsChanged, &g_CS2Fixes, &CS2Fixes::Hook_ClientSettingsChanged, nullptr); +KHook::Virtual onClientConnectedHook(&IServerGameClients::OnClientConnected, &g_CS2Fixes, &CS2Fixes::Hook_OnClientConnected, nullptr); +KHook::Virtual clientConnectHook(&IServerGameClients::ClientConnect, &g_CS2Fixes, &CS2Fixes::Hook_ClientConnect, nullptr); +KHook::Virtual clientCommandHook(&IServerGameClients::ClientCommand, &g_CS2Fixes, &CS2Fixes::Hook_ClientCommand, nullptr); +KHook::Virtual postEventAbstractHook(&IGameEventSystem::PostEventAbstract, &g_CS2Fixes, &CS2Fixes::Hook_PostEventAbstract, nullptr); +KHook::Virtual startupServerHook(&INetworkServerService::StartupServer, &g_CS2Fixes, nullptr, &CS2Fixes::Hook_StartupServer_Post); +KHook::Virtual checkTransmitHook(&ISource2GameEntities::CheckTransmit, &g_CS2Fixes, nullptr, &CS2Fixes::Hook_CheckTransmit_Post); +KHook::Virtual dispatchConCommandHook(&ICvar::DispatchConCommand, &g_CS2Fixes, &CS2Fixes::Hook_DispatchConCommand, nullptr); +KHook::Virtual loadEventsFromFileHook(&IGameEventManager2::LoadEventsFromFile, &g_CS2Fixes, &CS2Fixes::Hook_LoadEventsFromFile, nullptr); +KHook::Virtual playerEquipUseHook(&g_CS2Fixes, &CS2Fixes::Hook_PlayerEquipUse, nullptr); +KHook::Virtual playerEquipPrecacheHook(&g_CS2Fixes, nullptr, &CS2Fixes::Hook_PlayerEquipPrecache_Post); +KHook::Virtual createWorkshopMapGroupHook(&g_CS2Fixes, &CS2Fixes::Hook_CreateWorkshopMapGroup, nullptr); +KHook::Virtual onTakeDamageAliveHook(&g_CS2Fixes, &CS2Fixes::Hook_OnTakeDamage_Alive, nullptr); +KHook::Virtual checkMovingGroundHook(&g_CS2Fixes, &CS2Fixes::Hook_CheckMovingGround, nullptr); +KHook::Virtual goToIntermissionHook(&g_CS2Fixes, &CS2Fixes::Hook_GoToIntermission, nullptr); +KHook::Virtual physicsTouchShuffleHook(&g_CS2Fixes, nullptr, &CS2Fixes::Hook_PhysicsTouchShuffle_Post); +KHook::Virtual dropWeaponHook(&g_CS2Fixes, nullptr, &CS2Fixes::Hook_DropWeapon_Post); CS2Fixes g_CS2Fixes; @@ -137,15 +135,13 @@ CGameConfig* g_GameConfig = nullptr; ISteamHTTP* g_http = nullptr; CSteamGameServerAPIContext g_steamAPI; CCSGameRules* g_pGameRules = nullptr; // Will be null between map end & new map startup, null check if necessary! -int g_iCGamePlayerEquipUseId = -1; -int g_iCGamePlayerEquipPrecacheId = -1; -int g_iCreateWorkshopMapGroupId = -1; -int g_iOnTakeDamageAliveId = -1; -int g_iCheckMovingGroundId = -1; -int g_iLoadEventsFromFileId = -1; -int g_iGoToIntermissionId = -1; -int g_iPhysicsTouchShuffle = -1; -int g_iWeaponServiceDropWeaponId = -1; +IGameEventManager2* g_pCGameEventManagerVTable = nullptr; +CGamePlayerEquip* g_pCGamePlayerEquipVTable = nullptr; +CCSPlayerPawn* g_pCCSPlayerPawnVTable = nullptr; +CCSPlayer_MovementServices* g_pCCSPlayer_MovementServicesVTable = nullptr; +CCSGameRules* g_pCCSGameRulesVTable = nullptr; +CVPhys2World* g_pCVPhys2WorldVTable = nullptr; +CCSPlayer_WeaponServices* g_pCCSPlayer_WeaponServicesVTable = nullptr; CGameEntitySystem* GameEntitySystem() { @@ -207,27 +203,21 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool return false; } - int offset = g_GameConfig->GetOffset("IGameTypes_CreateWorkshopMapGroup"); - SH_MANUALHOOK_RECONFIGURE(CreateWorkshopMapGroup, offset, 0, 0); - - gameFrameHook.Add(g_pSource2Server, true); - SH_ADD_HOOK(IServerGameDLL, GameServerSteamAPIActivated, g_pSource2Server, SH_MEMBER(this, &CS2Fixes::Hook_GameServerSteamAPIActivated), false); - SH_ADD_HOOK(IServerGameDLL, GameServerSteamAPIDeactivated, g_pSource2Server, SH_MEMBER(this, &CS2Fixes::Hook_GameServerSteamAPIDeactivated), false); - SH_ADD_HOOK(IServerGameDLL, ApplyGameSettings, g_pSource2Server, SH_MEMBER(this, &CS2Fixes::Hook_ApplyGameSettings), false); - SH_ADD_HOOK(IServerGameClients, ClientActive, g_pSource2GameClients, SH_MEMBER(this, &CS2Fixes::Hook_ClientActive), true); - SH_ADD_HOOK(IServerGameClients, ClientDisconnect, g_pSource2GameClients, SH_MEMBER(this, &CS2Fixes::Hook_ClientDisconnect), true); - SH_ADD_HOOK(IServerGameClients, ClientPutInServer, g_pSource2GameClients, SH_MEMBER(this, &CS2Fixes::Hook_ClientPutInServer), true); - SH_ADD_HOOK(IServerGameClients, ClientSettingsChanged, g_pSource2GameClients, SH_MEMBER(this, &CS2Fixes::Hook_ClientSettingsChanged), false); - SH_ADD_HOOK(IServerGameClients, OnClientConnected, g_pSource2GameClients, SH_MEMBER(this, &CS2Fixes::Hook_OnClientConnected), false); - SH_ADD_HOOK(IServerGameClients, ClientConnect, g_pSource2GameClients, SH_MEMBER(this, &CS2Fixes::Hook_ClientConnect), false); - SH_ADD_HOOK(IServerGameClients, ClientCommand, g_pSource2GameClients, SH_MEMBER(this, &CS2Fixes::Hook_ClientCommand), false); - SH_ADD_HOOK(IGameEventSystem, PostEventAbstract, g_gameEventSystem, SH_MEMBER(this, &CS2Fixes::Hook_PostEvent), false); - SH_ADD_HOOK(INetworkServerService, StartupServer, g_pNetworkServerService, SH_MEMBER(this, &CS2Fixes::Hook_StartupServer), true); - SH_ADD_HOOK(ISource2GameEntities, CheckTransmit, g_pSource2GameEntities, SH_MEMBER(this, &CS2Fixes::Hook_CheckTransmit), true); - SH_ADD_HOOK(ICvar, DispatchConCommand, g_pCVar, SH_MEMBER(this, &CS2Fixes::Hook_DispatchConCommand), false); - g_iCreateWorkshopMapGroupId = SH_ADD_MANUALVPHOOK(CreateWorkshopMapGroup, g_pGameTypes, SH_MEMBER(this, &CS2Fixes::Hook_CreateWorkshopMapGroup), false); - - META_CONPRINTF("All hooks started!\n"); + gameFrameHook.Add(g_pSource2Server); + gameServerSteamAPIActivatedHook.Add(g_pSource2Server); + gameServerSteamAPIDeactivatedHook.Add(g_pSource2Server); + applyGameSettingsHook.Add(g_pSource2Server); + clientActiveHook.Add(g_pSource2GameClients); + clientDisconnectHook.Add(g_pSource2GameClients); + clientPutInServerHook.Add(g_pSource2GameClients); + clientSettingsChangedHook.Add(g_pSource2GameClients); + onClientConnectedHook.Add(g_pSource2GameClients); + clientConnectHook.Add(g_pSource2GameClients); + clientCommandHook.Add(g_pSource2GameClients); + postEventAbstractHook.Add(g_gameEventSystem); + startupServerHook.Add(g_pNetworkServerService); + checkTransmitHook.Add(g_pSource2GameEntities); + dispatchConCommandHook.Add(g_pCVar); bool bRequiredInitLoaded = true; @@ -243,98 +233,150 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool if (!InitGameSystems()) bRequiredInitLoaded = false; - const auto pCGamePlayerEquipVTable = modules::server->FindVirtualTable("CGamePlayerEquip"); - if (!pCGamePlayerEquipVTable) + g_pCGameEventManagerVTable = (IGameEventManager2*)modules::server->FindVirtualTable("CGameEventManager"); + + if (!g_pCGameEventManagerVTable) { - snprintf(error, maxlen, "Failed to find CGamePlayerEquip vtable\n"); + Panic("Failed to find CGameEventManager vtable\n"); bRequiredInitLoaded = false; } - offset = g_GameConfig->GetOffset("CBaseEntity::Use"); + loadEventsFromFileHook.Add(g_pCGameEventManagerVTable); + + g_pCGamePlayerEquipVTable = (CGamePlayerEquip*)modules::server->FindVirtualTable("CGamePlayerEquip"); + if (!g_pCGamePlayerEquipVTable) + { + Panic("Failed to find CGamePlayerEquip vtable\n"); + bRequiredInitLoaded = false; + } + + int offset = g_GameConfig->GetOffset("CBaseEntity::Use"); + if (offset == -1) { - snprintf(error, maxlen, "Failed to find CBaseEntity::Use\n"); + Panic("Failed to find CBaseEntity::Use\n"); bRequiredInitLoaded = false; } - SH_MANUALHOOK_RECONFIGURE(CGamePlayerEquipUse, offset, 0, 0); - g_iCGamePlayerEquipUseId = SH_ADD_MANUALDVPHOOK(CGamePlayerEquipUse, pCGamePlayerEquipVTable, SH_MEMBER(this, &CS2Fixes::Hook_CGamePlayerEquipUse), false); + + playerEquipUseHook.SetIndex(offset); + playerEquipUseHook.Add(g_pCGamePlayerEquipVTable); offset = g_GameConfig->GetOffset("CBaseEntity::Precache"); if (offset == -1) { - snprintf(error, maxlen, "Failed to find CBaseEntity::Precache\n"); + Panic("Failed to find CBaseEntity::Precache\n"); + bRequiredInitLoaded = false; + } + + playerEquipPrecacheHook.SetIndex(offset); + playerEquipPrecacheHook.Add(g_pCGamePlayerEquipVTable); + + offset = g_GameConfig->GetOffset("IGameTypes_CreateWorkshopMapGroup"); + + if (offset == -1) + { + Panic("Failed to find IGameTypes_CreateWorkshopMapGroup\n"); bRequiredInitLoaded = false; } - SH_MANUALHOOK_RECONFIGURE(CGamePlayerEquipPrecache, offset, 0, 0); - g_iCGamePlayerEquipPrecacheId = SH_ADD_MANUALDVPHOOK(CGamePlayerEquipPrecache, pCGamePlayerEquipVTable, SH_MEMBER(this, &CS2Fixes::Hook_CGamePlayerEquipPrecache), true); - const auto pCCSPlayerPawnVTable = modules::server->FindVirtualTable("CCSPlayerPawn"); - if (!pCCSPlayerPawnVTable) + createWorkshopMapGroupHook.SetIndex(offset); + createWorkshopMapGroupHook.Add(g_pGameTypes); + + g_pCCSPlayerPawnVTable = (CCSPlayerPawn*)modules::server->FindVirtualTable("CCSPlayerPawn"); + + if (!g_pCCSPlayerPawnVTable) { - snprintf(error, maxlen, "Failed to find CCSPlayerPawn vtable\n"); + Panic("Failed to find CCSPlayerPawn vtable\n"); bRequiredInitLoaded = false; } offset = g_GameConfig->GetOffset("CBasePlayerPawn::OnTakeDamage_Alive"); if (offset == -1) { - snprintf(error, maxlen, "Failed to find CBasePlayerPawn::OnTakeDamage_Alive\n"); + Panic("Failed to find CBasePlayerPawn::OnTakeDamage_Alive\n"); + bRequiredInitLoaded = false; + } + + onTakeDamageAliveHook.SetIndex(offset); + onTakeDamageAliveHook.Add(g_pCCSPlayerPawnVTable); + + g_pCCSPlayer_MovementServicesVTable = (CCSPlayer_MovementServices*)modules::server->FindVirtualTable("CCSPlayer_MovementServices"); + + if (!g_pCCSPlayer_MovementServicesVTable) + { + Panic("Failed to find CCSPlayer_MovementServices vtable\n"); bRequiredInitLoaded = false; } - SH_MANUALHOOK_RECONFIGURE(OnTakeDamage_Alive, offset, 0, 0); - g_iOnTakeDamageAliveId = SH_ADD_MANUALDVPHOOK(OnTakeDamage_Alive, pCCSPlayerPawnVTable, SH_MEMBER(this, &CS2Fixes::Hook_OnTakeDamage_Alive), false); - const auto pCCSPlayer_MovementServicesVTable = modules::server->FindVirtualTable("CCSPlayer_MovementServices"); offset = g_GameConfig->GetOffset("CCSPlayer_MovementServices::CheckMovingGround"); if (offset == -1) { - snprintf(error, maxlen, "Failed to find CCSPlayer_MovementServices::CheckMovingGround\n"); + Panic("Failed to find CCSPlayer_MovementServices::CheckMovingGround\n"); bRequiredInitLoaded = false; } - SH_MANUALHOOK_RECONFIGURE(CheckMovingGround, offset, 0, 0); - g_iCheckMovingGroundId = SH_ADD_MANUALDVPHOOK(CheckMovingGround, pCCSPlayer_MovementServicesVTable, SH_MEMBER(this, &CS2Fixes::Hook_CheckMovingGround), false); - auto pCVPhys2WorldVTable = modules::vphysics2->FindVirtualTable("CVPhys2World"); + checkMovingGroundHook.SetIndex(offset); + checkMovingGroundHook.Add(g_pCCSPlayer_MovementServicesVTable); - offset = g_GameConfig->GetOffset("CVPhys2World::GetTouchingList"); - if (offset == -1) + g_pCCSGameRulesVTable = (CCSGameRules*)modules::server->FindVirtualTable("CCSGameRules"); + + if (!g_pCCSGameRulesVTable) { - snprintf(error, maxlen, "Failed to find CVPhys2World::GetTouchingList\n"); + Panic("Failed to find CCSGameRules vtable\n"); bRequiredInitLoaded = false; } - SH_MANUALHOOK_RECONFIGURE(PhysicsTouchShuffle, offset, 0, 0); - g_iPhysicsTouchShuffle = SH_ADD_MANUALDVPHOOK(PhysicsTouchShuffle, pCVPhys2WorldVTable, SH_MEMBER(this, &CS2Fixes::Hook_PhysicsTouchShuffle), true); - const auto pCCSPlayer_WeaponServicesVTable = modules::server->FindVirtualTable("CCSPlayer_WeaponServices"); - offset = g_GameConfig->GetOffset("CCSPlayer_WeaponServices::DropWeapon"); + offset = g_GameConfig->GetOffset("CCSGameRules_GoToIntermission"); if (offset == -1) { - snprintf(error, maxlen, "Failed to find CCSPlayer_WeaponServices::DropWeapon\n"); + Panic("Failed to find CCSGameRules_GoToIntermission\n"); bRequiredInitLoaded = false; } - SH_MANUALHOOK_RECONFIGURE(DropWeapon, offset, 0, 0); - g_iWeaponServiceDropWeaponId = SH_ADD_MANUALDVPHOOK(DropWeapon, pCCSPlayer_WeaponServicesVTable, SH_MEMBER(this, &CS2Fixes::Hook_DropWeaponPost), true); - auto pCGameEventManagerVTable = (IGameEventManager2*)modules::server->FindVirtualTable("CGameEventManager"); + goToIntermissionHook.SetIndex(offset); + goToIntermissionHook.Add(g_pCCSGameRulesVTable); - g_iLoadEventsFromFileId = SH_ADD_DVPHOOK(IGameEventManager2, LoadEventsFromFile, pCGameEventManagerVTable, SH_MEMBER(this, &CS2Fixes::Hook_LoadEventsFromFile), false); + g_pCVPhys2WorldVTable = (CVPhys2World*)modules::vphysics2->FindVirtualTable("CVPhys2World"); - if (!bRequiredInitLoaded) + if (!g_pCVPhys2WorldVTable) { - snprintf(error, maxlen, "One or more address lookups, patches or detours failed, please refer to startup logs for more information"); - return false; + Panic("Failed to find CVPhys2World vtable\n"); + bRequiredInitLoaded = false; } - auto pCCSGameRulesVTable = modules::server->FindVirtualTable("CCSGameRules"); + offset = g_GameConfig->GetOffset("CVPhys2World::GetTouchingList"); + if (offset == -1) + { + Panic("Failed to find CVPhys2World::GetTouchingList\n"); + bRequiredInitLoaded = false; + } - offset = g_GameConfig->GetOffset("CCSGameRules_GoToIntermission"); + physicsTouchShuffleHook.SetIndex(offset); + physicsTouchShuffleHook.Add(g_pCVPhys2WorldVTable); + + g_pCCSPlayer_WeaponServicesVTable = (CCSPlayer_WeaponServices*)modules::server->FindVirtualTable("CCSPlayer_WeaponServices"); + + if (!g_pCCSPlayer_WeaponServicesVTable) + { + Panic("Failed to find CCSPlayer_WeaponServices vtable\n"); + bRequiredInitLoaded = false; + } + + offset = g_GameConfig->GetOffset("CCSPlayer_WeaponServices::DropWeapon"); if (offset == -1) { - snprintf(error, maxlen, "Failed to find CCSGameRules::GoToIntermission\n"); + Panic("Failed to find CCSPlayer_WeaponServices::DropWeapon\n"); bRequiredInitLoaded = false; } - SH_MANUALHOOK_RECONFIGURE(GoToIntermission, offset, 0, 0); - g_iGoToIntermissionId = SH_ADD_MANUALDVPHOOK(GoToIntermission, pCCSGameRulesVTable, SH_MEMBER(this, &CS2Fixes::Hook_GoToIntermission), false); + + dropWeaponHook.SetIndex(offset); + dropWeaponHook.Add(g_pCCSPlayer_WeaponServicesVTable); + + if (!bRequiredInitLoaded) + { + snprintf(error, maxlen, "One or more address lookups, patches or detours failed, please refer to startup logs for more information"); + return false; + } Message("All hooks started!\n"); @@ -413,32 +455,30 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool bool CS2Fixes::Unload(char* error, size_t maxlen) { - gameFrameHook.Remove(g_pSource2Server, true); - SH_REMOVE_HOOK(IServerGameDLL, GameServerSteamAPIActivated, g_pSource2Server, SH_MEMBER(this, &CS2Fixes::Hook_GameServerSteamAPIActivated), false); - SH_REMOVE_HOOK(IServerGameDLL, GameServerSteamAPIDeactivated, g_pSource2Server, SH_MEMBER(this, &CS2Fixes::Hook_GameServerSteamAPIDeactivated), false); - SH_REMOVE_HOOK(IServerGameDLL, ApplyGameSettings, g_pSource2Server, SH_MEMBER(this, &CS2Fixes::Hook_ApplyGameSettings), false); - SH_REMOVE_HOOK(IServerGameClients, ClientActive, g_pSource2GameClients, SH_MEMBER(this, &CS2Fixes::Hook_ClientActive), true); - SH_REMOVE_HOOK(IServerGameClients, ClientDisconnect, g_pSource2GameClients, SH_MEMBER(this, &CS2Fixes::Hook_ClientDisconnect), true); - SH_REMOVE_HOOK(IServerGameClients, ClientPutInServer, g_pSource2GameClients, SH_MEMBER(this, &CS2Fixes::Hook_ClientPutInServer), true); - SH_REMOVE_HOOK(IServerGameClients, ClientSettingsChanged, g_pSource2GameClients, SH_MEMBER(this, &CS2Fixes::Hook_ClientSettingsChanged), false); - SH_REMOVE_HOOK(IServerGameClients, OnClientConnected, g_pSource2GameClients, SH_MEMBER(this, &CS2Fixes::Hook_OnClientConnected), false); - SH_REMOVE_HOOK(IServerGameClients, ClientConnect, g_pSource2GameClients, SH_MEMBER(this, &CS2Fixes::Hook_ClientConnect), false); - SH_REMOVE_HOOK(IServerGameClients, ClientCommand, g_pSource2GameClients, SH_MEMBER(this, &CS2Fixes::Hook_ClientCommand), false); - SH_REMOVE_HOOK(IGameEventSystem, PostEventAbstract, g_gameEventSystem, SH_MEMBER(this, &CS2Fixes::Hook_PostEvent), false); - SH_REMOVE_HOOK(INetworkServerService, StartupServer, g_pNetworkServerService, SH_MEMBER(this, &CS2Fixes::Hook_StartupServer), true); - SH_REMOVE_HOOK(ISource2GameEntities, CheckTransmit, g_pSource2GameEntities, SH_MEMBER(this, &CS2Fixes::Hook_CheckTransmit), true); - SH_REMOVE_HOOK(ICvar, DispatchConCommand, g_pCVar, SH_MEMBER(this, &CS2Fixes::Hook_DispatchConCommand), false); - SH_REMOVE_HOOK_ID(g_iLoadEventsFromFileId); - SH_REMOVE_HOOK_ID(g_iCreateWorkshopMapGroupId); - SH_REMOVE_HOOK_ID(g_iOnTakeDamageAliveId); - SH_REMOVE_HOOK_ID(g_iCheckMovingGroundId); - SH_REMOVE_HOOK_ID(g_iPhysicsTouchShuffle); - SH_REMOVE_HOOK_ID(g_iWeaponServiceDropWeaponId); - SH_REMOVE_HOOK_ID(g_iGoToIntermissionId); - SH_REMOVE_HOOK_ID(g_iCGamePlayerEquipUseId); - - if (g_iCGamePlayerEquipPrecacheId != -1) - SH_REMOVE_HOOK_ID(g_iCGamePlayerEquipPrecacheId); + gameFrameHook.Remove(g_pSource2Server); + gameServerSteamAPIActivatedHook.Remove(g_pSource2Server); + gameServerSteamAPIDeactivatedHook.Remove(g_pSource2Server); + applyGameSettingsHook.Remove(g_pSource2Server); + clientActiveHook.Remove(g_pSource2GameClients); + clientDisconnectHook.Remove(g_pSource2GameClients); + clientPutInServerHook.Remove(g_pSource2GameClients); + clientSettingsChangedHook.Remove(g_pSource2GameClients); + onClientConnectedHook.Remove(g_pSource2GameClients); + clientConnectHook.Remove(g_pSource2GameClients); + clientCommandHook.Remove(g_pSource2GameClients); + postEventAbstractHook.Remove(g_gameEventSystem); + startupServerHook.Remove(g_pNetworkServerService); + checkTransmitHook.Remove(g_pSource2GameEntities); + dispatchConCommandHook.Remove(g_pCVar); + loadEventsFromFileHook.Remove(g_pCGameEventManagerVTable); + playerEquipUseHook.Remove(g_pCGamePlayerEquipVTable); + playerEquipPrecacheHook.Remove(g_pCGamePlayerEquipVTable); + createWorkshopMapGroupHook.Remove(g_pGameTypes); + onTakeDamageAliveHook.Remove(g_pCCSPlayerPawnVTable); + checkMovingGroundHook.Remove(g_pCCSPlayer_MovementServicesVTable); + goToIntermissionHook.Remove(g_pCCSGameRulesVTable); + physicsTouchShuffleHook.Remove(g_pCVPhys2WorldVTable); + dropWeaponHook.Remove(g_pCCSPlayer_WeaponServicesVTable); ConVar_Unregister(); @@ -506,17 +546,17 @@ bool CS2Fixes::Unload(char* error, size_t maxlen) return true; } -void CS2Fixes::Hook_DispatchConCommand(ConCommandRef cmdHandle, const CCommandContext& ctx, const CCommand& args) +KHook::Return CS2Fixes::Hook_DispatchConCommand(ICvar* pThis, ConCommandRef cmdHandle, const CCommandContext& ctx, const CCommand& args) { VPROF_BUDGET("CS2Fixes::Hook_DispatchConCommand", "ConCommands"); if (!g_pEntitySystem) - RETURN_META(MRES_IGNORED); + return {KHook::Action::Ignore}; auto iCommandPlayerSlot = ctx.GetPlayerSlot(); if (!g_cvarEnableCommands.Get()) - RETURN_META(MRES_IGNORED); + return {KHook::Action::Ignore}; bool bSay = !V_strcmp(args.Arg(0), "say"); bool bTeamSay = !V_strcmp(args.Arg(0), "say_team"); @@ -547,8 +587,8 @@ void CS2Fixes::Hook_DispatchConCommand(ConCommandRef cmdHandle, const CCommandCo if (!bGagged && !bSilent && !bFlooding) { - SH_CALL(g_pCVar, &ICvar::DispatchConCommand) - (cmdHandle, ctx, args); + auto originalFunc = *(std::function*)KHook::GetOriginalFunction(); + originalFunc(cmdHandle, ctx, args); } else if (bFlooding) { @@ -591,13 +631,13 @@ void CS2Fixes::Hook_DispatchConCommand(ConCommandRef cmdHandle, const CCommandCo ParseChatCommand(pszMessage, pController); } - RETURN_META(MRES_SUPERCEDE); + return {KHook::Action::Supercede}; } - RETURN_META(MRES_IGNORED); + return {KHook::Action::Ignore}; } -void CS2Fixes::Hook_StartupServer(const GameSessionConfiguration_t& config, ISource2WorldSession* pSession, const char* pszMapName) +KHook::Return CS2Fixes::Hook_StartupServer_Post(INetworkServerService* pThis, const GameSessionConfiguration_t& config, ISource2WorldSession* pSession, const char* pszMapName) { g_pEntitySystem = GameEntitySystem(); g_pEntitySystem->AddListenerEntity(g_pEntityListener); @@ -615,22 +655,25 @@ void CS2Fixes::Hook_StartupServer(const GameSessionConfiguration_t& config, ISou g_pVoteManager->VoteManager_Init(); g_pIdleSystem->Reset(); + + return {KHook::Action::Ignore}; } -class CGamePlayerEquip; -void CS2Fixes::Hook_CGamePlayerEquipUse(InputData_t* pInput) +KHook::Return CS2Fixes::Hook_PlayerEquipUse(CGamePlayerEquip* pThis, InputData_t* pInput) { - CGamePlayerEquipHandler::Use(META_IFACEPTR(CGamePlayerEquip), pInput); - RETURN_META(MRES_IGNORED); + CGamePlayerEquipHandler::Use(pThis, pInput); + + return {KHook::Action::Ignore}; } -void CS2Fixes::Hook_CGamePlayerEquipPrecache(void** param) +KHook::Return CS2Fixes::Hook_PlayerEquipPrecache_Post(CGamePlayerEquip* pThis, void** param) { const auto kv = reinterpret_cast(*param); - CGamePlayerEquipHandler::OnPrecache(META_IFACEPTR(CGamePlayerEquip), kv); - RETURN_META(MRES_IGNORED); + CGamePlayerEquipHandler::OnPrecache(pThis, kv); + + return {KHook::Action::Ignore}; } -void CS2Fixes::Hook_GameServerSteamAPIActivated() +KHook::Return CS2Fixes::Hook_GameServerSteamAPIActivated(IServerGameDLL* pThis) { g_steamAPI.Init(); g_http = g_steamAPI.SteamHTTP(); @@ -640,24 +683,20 @@ void CS2Fixes::Hook_GameServerSteamAPIActivated() if (g_cvarVoteManagerEnable.Get() && !g_pMapVoteSystem->IsMapListLoaded()) g_pMapVoteSystem->LoadMapList(); - RETURN_META(MRES_IGNORED); + return {KHook::Action::Ignore}; } -void CS2Fixes::Hook_GameServerSteamAPIDeactivated() +KHook::Return CS2Fixes::Hook_GameServerSteamAPIDeactivated(IServerGameDLL* pThis) { g_http = nullptr; - RETURN_META(MRES_IGNORED); + return {KHook::Action::Ignore}; } -void CS2Fixes::Hook_PostEvent(CSplitScreenSlot nSlot, bool bLocalOnly, int nClientCount, const uint64* clients, +KHook::Return CS2Fixes::Hook_PostEventAbstract(IGameEventSystem* pThis, CSplitScreenSlot nSlot, bool bLocalOnly, int nClientCount, const uint64* clients, INetworkMessageInternal* pEvent, const CNetMessage* pData, unsigned long nSize, NetChannelBufType_t bufType) { // Message( "Hook_PostEvent(%d, %d, %d, %lli)\n", nSlot, bLocalOnly, nClientCount, clients ); - // Need to explicitly get a pointer to the right function as it's overloaded and SH_CALL can't resolve that - static void (IGameEventSystem::*PostEventAbstract)(CSplitScreenSlot, bool, int, const uint64*, - INetworkMessageInternal*, const CNetMessage*, unsigned long, NetChannelBufType_t) = &IGameEventSystem::PostEventAbstract; - NetMessageInfo_t* info = pEvent->GetNetMessageInfo(); if (g_cvarEnableStopSound.Get() && info->m_MessageId == GE_FireBulletsId) @@ -680,8 +719,8 @@ void CS2Fixes::Hook_PostEvent(CSplitScreenSlot nSlot, bool bLocalOnly, int nClie uint64 clientMask = *(uint64*)clients & g_playerManager->GetSilenceSoundMask(); - SH_CALL(g_gameEventSystem, PostEventAbstract) - (nSlot, bLocalOnly, nClientCount, &clientMask, pEvent, msg, nSize, bufType); + auto originalFunc = *(std::function*)KHook::GetOriginalFunction(); + originalFunc(nSlot, bLocalOnly, nClientCount, &clientMask, pEvent, msg, nSize, bufType); msg->set_weapon_id(weapon_id); msg->set_sound_type(sound_type); @@ -722,6 +761,8 @@ void CS2Fixes::Hook_PostEvent(CSplitScreenSlot nSlot, bool bLocalOnly, int nClie *(uint64*)clients &= ~g_playerManager->GetSilenceSoundMask(); } } + + return {KHook::Action::Ignore}; } void CS2Fixes::AllPluginsLoaded() @@ -769,12 +810,14 @@ CON_COMMAND_F(cs2f_fullupdate, "- Force a full update for all clients.", FCVAR_L FullUpdateAllClients(); } -void CS2Fixes::Hook_ClientActive(CPlayerSlot slot, bool bLoadGame, const char* pszName, uint64 xuid) +KHook::Return CS2Fixes::Hook_ClientActive_Post(IServerGameClients* pThis, CPlayerSlot slot, bool bLoadGame, const char* pszName, uint64 xuid) { Message("Hook_ClientActive(%d, %d, \"%s\", %lli)\n", slot, bLoadGame, pszName, xuid); + + return {KHook::Action::Ignore}; } -void CS2Fixes::Hook_ClientCommand(CPlayerSlot slot, const CCommand& args) +KHook::Return CS2Fixes::Hook_ClientCommand(IServerGameClients* pThis, CPlayerSlot slot, const CCommand& args) { #ifdef _DEBUG Message("Hook_ClientCommand(%d, \"%s\")\n", slot, args.GetCommandString()); @@ -791,26 +834,30 @@ void CS2Fixes::Hook_ClientCommand(CPlayerSlot slot, const CCommand& args) if (g_cvarVoteManagerEnable.Get() && V_stricmp(args[0], "endmatch_votenextmap") == 0 && args.ArgC() == 2) { if (g_pMapVoteSystem->RegisterPlayerVote(slot, atoi(args[1]))) - RETURN_META(MRES_HANDLED); + return {KHook::Action::Ignore}; else - RETURN_META(MRES_SUPERCEDE); + return {KHook::Action::Supercede}; } if (g_cvarEnableZR.Get() && slot != -1 && !V_strncmp(args.Arg(0), "jointeam", 8)) { ZR_Hook_ClientCommand_JoinTeam(slot, args); - RETURN_META(MRES_SUPERCEDE); + return {KHook::Action::Supercede}; } + + return {KHook::Action::Ignore}; } -void CS2Fixes::Hook_ClientSettingsChanged(CPlayerSlot slot) +KHook::Return CS2Fixes::Hook_ClientSettingsChanged(IServerGameClients* pThis, CPlayerSlot slot) { #ifdef _DEBUG Message("Hook_ClientSettingsChanged(%d)\n", slot); #endif + + return {KHook::Action::Ignore}; } -void CS2Fixes::Hook_OnClientConnected(CPlayerSlot slot, const char* pszName, uint64 xuid, const char* pszNetworkID, const char* pszAddress, bool bFakePlayer) +KHook::Return CS2Fixes::Hook_OnClientConnected(IServerGameClients* pThis, CPlayerSlot slot, const char* pszName, uint64 xuid, const char* pszNetworkID, const char* pszAddress, bool bFakePlayer) { Message("Hook_OnClientConnected(%d, \"%s\", %lli, \"%s\", \"%s\", %d)\n", slot, pszName, xuid, pszNetworkID, pszAddress, bFakePlayer); @@ -820,48 +867,55 @@ void CS2Fixes::Hook_OnClientConnected(CPlayerSlot slot, const char* pszName, uin // Ideally we would use CServerSideClient::IsHLTV().. but it doesn't work :( if (bFakePlayer && V_strcmp(pszName, pszTvName)) g_playerManager->OnBotConnected(slot); + + return {KHook::Action::Ignore}; } -bool CS2Fixes::Hook_ClientConnect(CPlayerSlot slot, const char* pszName, uint64 xuid, const char* pszNetworkID, bool unk1, CBufferString* pRejectReason) +KHook::Return CS2Fixes::Hook_ClientConnect(IServerGameClients* pThis, CPlayerSlot slot, const char* pszName, uint64 xuid, const char* pszNetworkID, bool unk1, CBufferString* pRejectReason) { Message("Hook_ClientConnect(%d, \"%s\", %lli, \"%s\", %d, \"%s\")\n", slot, pszName, xuid, pszNetworkID, unk1, pRejectReason->Get()); // Player is banned if (!g_playerManager->OnClientConnected(slot, xuid, pszNetworkID)) - RETURN_META_VALUE(MRES_SUPERCEDE, false); + return {KHook::Action::Supercede, false}; - RETURN_META_VALUE(MRES_IGNORED, true); + // TODO: verify true return isn't needed + return {KHook::Action::Ignore}; } -void CS2Fixes::Hook_ClientPutInServer(CPlayerSlot slot, char const* pszName, int type, uint64 xuid) +KHook::Return CS2Fixes::Hook_ClientPutInServer_Post(IServerGameClients* pThis, CPlayerSlot slot, char const* pszName, int type, uint64 xuid) { Message("Hook_ClientPutInServer(%d, \"%s\", %d, %d, %lli)\n", slot, pszName, type, xuid); if (!g_playerManager->GetPlayer(slot)) - return; + return {KHook::Action::Ignore}; g_playerManager->OnClientPutInServer(slot); if (g_cvarEnableZR.Get()) ZR_Hook_ClientPutInServer(slot, pszName, type, xuid); + + return {KHook::Action::Ignore}; } -void CS2Fixes::Hook_ClientDisconnect(CPlayerSlot slot, ENetworkDisconnectionReason reason, const char* pszName, uint64 xuid, const char* pszNetworkID) +KHook::Return CS2Fixes::Hook_ClientDisconnect_Post(IServerGameClients* pThis, CPlayerSlot slot, ENetworkDisconnectionReason reason, const char* pszName, uint64 xuid, const char* pszNetworkID) { Message("Hook_ClientDisconnect(%d, %d, \"%s\", %lli)\n", slot, reason, pszName, xuid); ZEPlayer* pPlayer = g_playerManager->GetPlayer(slot); if (!pPlayer) - return; + return {KHook::Action::Ignore}; // Dont add to c_listdc clients that are downloading MultiAddonManager stuff or were present during a map change if (reason != NETWORK_DISCONNECT_LOOPSHUTDOWN && reason != NETWORK_DISCONNECT_SHUTDOWN) g_pAdminSystem->AddDisconnectedPlayer(pszName, xuid, pPlayer ? pPlayer->GetIpAddress() : ""); g_playerManager->OnClientDisconnect(slot); + + return {KHook::Action::Ignore}; } -KHook::Return CS2Fixes::Hook_GameFramePost(IServerGameDLL* pThis, bool simulating, bool bFirstTick, bool bLastTick) +KHook::Return CS2Fixes::Hook_GameFrame_Post(IServerGameDLL* pThis, bool simulating, bool bFirstTick, bool bLastTick) { /** * simulating: @@ -916,7 +970,7 @@ KHook::Return CS2Fixes::Hook_GameFramePost(IServerGameDLL* pThis, bool sim extern CConVar g_cvarFlashLightTransmitOthers; -void CS2Fixes::Hook_CheckTransmit(CCheckTransmitInfo** ppInfoList, int infoCount, CBitVec<16384>& unionTransmitEdicts, +KHook::Return CS2Fixes::Hook_CheckTransmit_Post(ISource2GameEntities* pThis, CCheckTransmitInfo** ppInfoList, int infoCount, CBitVec<16384>& unionTransmitEdicts, const Entity2Networkable_t** pNetworkables, const uint16* pEntityIndicies, int nEntities, bool bEnablePVSBits) { if (!g_pEntitySystem || !GetGlobals()) @@ -988,40 +1042,43 @@ void CS2Fixes::Hook_CheckTransmit(CCheckTransmitInfo** ppInfoList, int infoCount if (pGlowModel) pInfo->m_pTransmitEntity->Clear(pGlowModel->entindex()); } + + return {KHook::Action::Ignore}; } -void CS2Fixes::Hook_ApplyGameSettings(KeyValues* pKV) +KHook::Return CS2Fixes::Hook_ApplyGameSettings(IServerGameDLL* pThis, KeyValues* pKV) { g_pMapVoteSystem->ApplyGameSettings(pKV); + + return {KHook::Action::Ignore}; } -void CS2Fixes::Hook_CreateWorkshopMapGroup(const char* name, const CUtlStringList& mapList) +KHook::Return CS2Fixes::Hook_CreateWorkshopMapGroup(IGameTypes* pThis, const char* name, CUtlStringList& mapList) { + // TODO: does this even work? just guessing how param override might work in khook.. if (g_cvarVoteManagerEnable.Get() && g_pMapVoteSystem->IsMapListLoaded()) - RETURN_META_MNEWPARAMS(MRES_HANDLED, CreateWorkshopMapGroup, (name, g_pMapVoteSystem->CreateWorkshopMapGroup())); - else - RETURN_META(MRES_IGNORED); + mapList = g_pMapVoteSystem->CreateWorkshopMapGroup(); + + return {KHook::Action::Ignore}; } -void CS2Fixes::Hook_GoToIntermission(bool bAbortedMatch) +KHook::Return CS2Fixes::Hook_GoToIntermission(CCSGameRules* pThis, bool bAbortedMatch) { if (!g_pMapVoteSystem->IsIntermissionAllowed()) - RETURN_META(MRES_SUPERCEDE); + return {KHook::Action::Supercede}; if (g_cvarVoteManagerEnable.Get()) g_pVoteManager->OnIntermission(); - RETURN_META(MRES_IGNORED); + return {KHook::Action::Ignore}; } CConVar g_cvarDropMapWeapons("cs2f_drop_map_weapons", FCVAR_NONE, "Whether to force drop map-spawned weapons on death", false); -bool CS2Fixes::Hook_OnTakeDamage_Alive(CTakeDamageInfoContainer* pInfoContainer) +KHook::Return CS2Fixes::Hook_OnTakeDamage_Alive(CCSPlayerPawn* pPawn, CTakeDamageInfoContainer* pInfoContainer) { - CCSPlayerPawn* pPawn = META_IFACEPTR(CCSPlayerPawn); - if (g_cvarEnableZR.Get() && ZR_Hook_OnTakeDamage_Alive(pInfoContainer->pInfo, pPawn)) - RETURN_META_VALUE(MRES_SUPERCEDE, false); + return {KHook::Action::Supercede, false}; // This is a shit place to be doing this, but player_death event is too late and there is no pre-hook alternative // Check if this is going to kill the player @@ -1037,7 +1094,8 @@ bool CS2Fixes::Hook_OnTakeDamage_Alive(CTakeDamageInfoContainer* pInfoContainer) pPawn->DropMapWeapons(); } - RETURN_META_VALUE(MRES_IGNORED, true); + // TODO: verify true return isn't needed + return {KHook::Action::Ignore}; } CConVar g_cvarFixPhysicsPlayerShuffle("cs2f_shuffle_player_physics_sim", FCVAR_NONE, "Whether to enable shuffle player list in physics simulate", false); @@ -1068,9 +1126,9 @@ struct TouchLinked_t } }; static_assert(sizeof(TouchLinked_t) == 240, "Touch_t size mismatch"); -void CS2Fixes::Hook_PhysicsTouchShuffle(CUtlVector* pList, bool unknown) +KHook::Return CS2Fixes::Hook_PhysicsTouchShuffle_Post(CVPhys2World* pThis, CUtlVector* pList, bool unknown) { - if (!g_cvarFixPhysicsPlayerShuffle.Get() || g_SHPtr->GetStatus() == MRES_SUPERCEDE || pList->Count() <= 1) + if (!g_cvarFixPhysicsPlayerShuffle.Get() || pList->Count() <= 1) return; // [Kxnrl] @@ -1108,20 +1166,21 @@ void CS2Fixes::Hook_PhysicsTouchShuffle(CUtlVector* pList, bool u pList->AddToTail(link); for (const auto& link : unTouchLinks) pList->AddToTail(link); + + return {KHook::Action::Ignore}; } -void CS2Fixes::Hook_CheckMovingGround(double frametime) +KHook::Return CS2Fixes::Hook_CheckMovingGround(CCSPlayer_MovementServices* pThis, double frametime) { - CCSPlayer_MovementServices* pMove = META_IFACEPTR(CCSPlayer_MovementServices); - CCSPlayerPawn* pPawn = pMove->GetPawn(); + CCSPlayerPawn* pPawn = pThis->GetPawn(); if (!pPawn || !GetGlobals()) - RETURN_META(MRES_IGNORED); + return {KHook::Action::Ignore}; CCSPlayerController* pController = pPawn->GetOriginalController(); if (!pController) - RETURN_META(MRES_IGNORED); + return {KHook::Action::Ignore}; int iSlot = pController->GetPlayerSlot(); @@ -1130,29 +1189,27 @@ void CS2Fixes::Hook_CheckMovingGround(double frametime) // The point of doing this is to avoid running the function (and applying/resetting basevelocity) multiple times per tick // This can happen when the client or server lags if (aPlayerTicks[iSlot] == GetGlobals()->tickcount) - RETURN_META(MRES_SUPERCEDE); + return {KHook::Action::Supercede}; aPlayerTicks[iSlot] = GetGlobals()->tickcount; - RETURN_META(MRES_IGNORED); + return {KHook::Action::Ignore}; } -void CS2Fixes::Hook_DropWeaponPost(CBasePlayerWeapon* pWeapon, Vector* pVecTarget, Vector* pVelocity) +KHook::Return CS2Fixes::Hook_DropWeapon_Post(CCSPlayer_WeaponServices* pThis, CBasePlayerWeapon* pWeapon, Vector* pVecTarget, Vector* pVelocity) { if (g_cvarEnableEntWatch.Get()) - { - CCSPlayer_WeaponServices* pWeaponService = META_IFACEPTR(CCSPlayer_WeaponServices); - EW_DropWeapon(pWeaponService, pWeapon); - } + EW_DropWeapon(pThis, pWeapon); - RETURN_META(MRES_IGNORED); + return {KHook::Action::Ignore}; } -int CS2Fixes::Hook_LoadEventsFromFile(const char* filename, bool bSearchAll) +KHook::Return CS2Fixes::Hook_LoadEventsFromFile(IGameEventManager2* pThis, const char* filename, bool bSearchAll) { - ExecuteOnce(g_gameEventManager = META_IFACEPTR(IGameEventManager2)); + ExecuteOnce(g_gameEventManager = pThis); - RETURN_META_VALUE(MRES_IGNORED, 0); + // TODO: verify 0 return isn't needed + return {KHook::Action::Ignore}; } void CS2Fixes::OnLevelInit(char const* pMapName, diff --git a/src/cs2fixes.h b/src/cs2fixes.h index 81e821fa8..4afa9870b 100644 --- a/src/cs2fixes.h +++ b/src/cs2fixes.h @@ -20,6 +20,7 @@ #pragma once #include "igameevents.h" +#include "khook.hpp" #include "networksystem/inetworkserializer.h" #include #include @@ -31,21 +32,17 @@ class CServerSideClient; struct TouchLinked_t; class CCSPlayer_WeaponServices; class CBasePlayerWeapon; +//class CGamePlayerEquip; TODO: does this still need forward definition? +class CVPhys2World; class CS2Fixes : public ISmmPlugin, public IMetamodListener { public: bool Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool late); - void Hook_PostEvent(CSplitScreenSlot nSlot, bool bLocalOnly, int nClientCount, const uint64* clients, - INetworkMessageInternal* pEvent, const CNetMessage* pData, unsigned long nSize, NetChannelBufType_t bufType); bool Unload(char* error, size_t maxlen); bool Pause(char* error, size_t maxlen); bool Unpause(char* error, size_t maxlen); void AllPluginsLoaded(); - -public: // hooks - void Hook_GameServerSteamAPIActivated(); - void Hook_GameServerSteamAPIDeactivated(); void OnLevelInit(char const* pMapName, char const* pMapEntities, char const* pOldLevel, @@ -53,35 +50,34 @@ class CS2Fixes : public ISmmPlugin, public IMetamodListener bool loadGame, bool background); void OnLevelShutdown(); - KHook::Return Hook_GameFramePost(IServerGameDLL* pThis, bool simulating, bool bFirstTick, bool bLastTick); - void Hook_ClientActive(CPlayerSlot slot, bool bLoadGame, const char* pszName, uint64 xuid); - void Hook_ClientDisconnect(CPlayerSlot slot, ENetworkDisconnectionReason reason, const char* pszName, uint64 xuid, const char* pszNetworkID); - void Hook_ClientPutInServer(CPlayerSlot slot, char const* pszName, int type, uint64 xuid); - void Hook_ClientSettingsChanged(CPlayerSlot slot); - void Hook_OnClientConnected(CPlayerSlot slot, const char* pszName, uint64 xuid, const char* pszNetworkID, const char* pszAddress, bool bFakePlayer); - bool Hook_ClientConnect(CPlayerSlot slot, const char* pszName, uint64 xuid, const char* pszNetworkID, bool unk1, CBufferString* pRejectReason); - void Hook_ClientCommand(CPlayerSlot nSlot, const CCommand& _cmd); - void Hook_CheckTransmit(CCheckTransmitInfo** ppInfoList, int infoCount, CBitVec<16384>& unionTransmitEdicts, + +public: // hooks + KHook::Return Hook_PostEventAbstract(IGameEventSystem* pThis, CSplitScreenSlot nSlot, bool bLocalOnly, int nClientCount, const uint64* clients, + INetworkMessageInternal* pEvent, const CNetMessage* pData, unsigned long nSize, NetChannelBufType_t bufType); + KHook::Return Hook_GameServerSteamAPIActivated(IServerGameDLL* pThis); + KHook::Return Hook_GameServerSteamAPIDeactivated(IServerGameDLL* pThis); + KHook::Return Hook_GameFrame_Post(IServerGameDLL* pThis, bool simulating, bool bFirstTick, bool bLastTick); + KHook::Return Hook_ClientActive_Post(IServerGameClients* pThis, CPlayerSlot slot, bool bLoadGame, const char* pszName, uint64 xuid); + KHook::Return Hook_ClientDisconnect_Post(IServerGameClients* pThis, CPlayerSlot slot, ENetworkDisconnectionReason reason, const char* pszName, uint64 xuid, const char* pszNetworkID); + KHook::Return Hook_ClientPutInServer_Post(IServerGameClients* pThis, CPlayerSlot slot, char const* pszName, int type, uint64 xuid); + KHook::Return Hook_ClientSettingsChanged(IServerGameClients* pThis, CPlayerSlot slot); + KHook::Return Hook_OnClientConnected(IServerGameClients* pThis, CPlayerSlot slot, const char* pszName, uint64 xuid, const char* pszNetworkID, const char* pszAddress, bool bFakePlayer); + KHook::Return Hook_ClientConnect(IServerGameClients* pThis, CPlayerSlot slot, const char* pszName, uint64 xuid, const char* pszNetworkID, bool unk1, CBufferString* pRejectReason); + KHook::Return Hook_ClientCommand(IServerGameClients* pThis, CPlayerSlot nSlot, const CCommand& _cmd); + KHook::Return Hook_CheckTransmit_Post(ISource2GameEntities* pThis, CCheckTransmitInfo** ppInfoList, int infoCount, CBitVec<16384>& unionTransmitEdicts, const Entity2Networkable_t** pNetworkables, const uint16* pEntityIndicies, int nEntities, bool bEnablePVSBits); - void Hook_DispatchConCommand(ConCommandRef cmd, const CCommandContext& ctx, const CCommand& args); - void Hook_CGamePlayerEquipUse(class InputData_t*); - void Hook_CGamePlayerEquipPrecache(void**); - void Hook_StartupServer(const GameSessionConfiguration_t& config, ISource2WorldSession*, const char*); - void Hook_ApplyGameSettings(KeyValues* pKV); - void Hook_CreateWorkshopMapGroup(const char* name, const CUtlStringList& mapList); - void Hook_GoToIntermission(bool bAbortedMatch); - bool Hook_OnTakeDamage_Alive(CTakeDamageInfoContainer* pInfoContainer); - void Hook_PhysicsTouchShuffle(CUtlVector* pList, bool unknown); -#ifdef PLATFORM_WINDOWS - Vector* Hook_GetEyePosition(Vector*); - QAngle* Hook_GetEyeAngles(QAngle*); -#else - Vector Hook_GetEyePosition(); - QAngle Hook_GetEyeAngles(); -#endif - void Hook_CheckMovingGround(double frametime); - void Hook_DropWeaponPost(CBasePlayerWeapon* pWeapon, Vector* pVecTarget, Vector* pVelocity); - int Hook_LoadEventsFromFile(const char* filename, bool bSearchAll); + KHook::Return Hook_DispatchConCommand(ICvar* pThis, ConCommandRef cmd, const CCommandContext& ctx, const CCommand& args); + KHook::Return Hook_PlayerEquipUse(CGamePlayerEquip* pThis, class InputData_t*); + KHook::Return Hook_PlayerEquipPrecache_Post(CGamePlayerEquip* pThis, void**); + KHook::Return Hook_StartupServer_Post(INetworkServerService* pThis, const GameSessionConfiguration_t& config, ISource2WorldSession*, const char*); + KHook::Return Hook_ApplyGameSettings(IServerGameDLL* pThis, KeyValues* pKV); + KHook::Return Hook_CreateWorkshopMapGroup(IGameTypes* pThis, const char* name, CUtlStringList& mapList); + KHook::Return Hook_GoToIntermission(CCSGameRules* pThis, bool bAbortedMatch); + KHook::Return Hook_OnTakeDamage_Alive(CCSPlayerPawn* pPawn, CTakeDamageInfoContainer* pInfoContainer); + KHook::Return Hook_PhysicsTouchShuffle_Post(CVPhys2World* pThis, CUtlVector* pList, bool unknown); + KHook::Return Hook_CheckMovingGround(CCSPlayer_MovementServices* pThis, double frametime); + KHook::Return Hook_DropWeapon_Post(CCSPlayer_WeaponServices* pThis, CBasePlayerWeapon* pWeapon, Vector* pVecTarget, Vector* pVelocity); + KHook::Return Hook_LoadEventsFromFile(IGameEventManager2* pThis, const char* filename, bool bSearchAll); public: const char* GetAuthor(); From 03b959e3cc333b9a00e41e2d9a5ba9ab929b19b7 Mon Sep 17 00:00:00 2001 From: Vauff Date: Wed, 23 Apr 2025 08:47:02 -0400 Subject: [PATCH 05/24] fix building docker container --- Dockerfile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index a40ad999f..15d6bbc67 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,9 @@ RUN apt update && apt install -y clang-16 RUN ln -sf /usr/bin/clang-16 /usr/bin/clang && ln -sf /usr/bin/clang++-16 /usr/bin/clang++ RUN git clone https://github.com/alliedmodders/ambuild RUN cd ambuild && python setup.py install && cd .. -RUN git clone --recurse-submodules -b k/sourcehook_alternative https://github.com/alliedmodders/metamod-source +RUN git clone -b k/sourcehook_alternative https://github.com/alliedmodders/metamod-source +# no recursive submodules, steamrt3 doesn't support ssh checkout +RUN cd metamod-source && git submodule update --init && cd .. RUN git config --global --add safe.directory /app COPY ./docker-entrypoint.sh ./ From a5c05dda16ac4f93d017943344d4ef5873b89991 Mon Sep 17 00:00:00 2001 From: Vauff Date: Wed, 23 Apr 2025 09:00:49 -0400 Subject: [PATCH 06/24] fix build errors --- src/cs2fixes.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/cs2fixes.h b/src/cs2fixes.h index 4afa9870b..e61632b68 100644 --- a/src/cs2fixes.h +++ b/src/cs2fixes.h @@ -32,7 +32,10 @@ class CServerSideClient; struct TouchLinked_t; class CCSPlayer_WeaponServices; class CBasePlayerWeapon; -//class CGamePlayerEquip; TODO: does this still need forward definition? +class IGameEventSystem; +class CGamePlayerEquip; +class CCSGameRules; +class CCSPlayerPawn; class CVPhys2World; class CS2Fixes : public ISmmPlugin, public IMetamodListener From 1a0c1457e010726920ae9680af0a091ad96d9b21 Mon Sep 17 00:00:00 2001 From: Vauff Date: Wed, 23 Apr 2025 09:07:26 -0400 Subject: [PATCH 07/24] fix more build errors --- src/cs2fixes.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cs2fixes.cpp b/src/cs2fixes.cpp index b17cc9e97..9c36b4a62 100644 --- a/src/cs2fixes.cpp +++ b/src/cs2fixes.cpp @@ -974,7 +974,7 @@ KHook::Return CS2Fixes::Hook_CheckTransmit_Post(ISource2GameEntities* pThi const Entity2Networkable_t** pNetworkables, const uint16* pEntityIndicies, int nEntities, bool bEnablePVSBits) { if (!g_pEntitySystem || !GetGlobals()) - return; + return {KHook::Action::Ignore}; VPROF("CS2Fixes::Hook_CheckTransmit"); @@ -1129,7 +1129,7 @@ static_assert(sizeof(TouchLinked_t) == 240, "Touch_t size mismatch"); KHook::Return CS2Fixes::Hook_PhysicsTouchShuffle_Post(CVPhys2World* pThis, CUtlVector* pList, bool unknown) { if (!g_cvarFixPhysicsPlayerShuffle.Get() || pList->Count() <= 1) - return; + return {KHook::Action::Ignore}; // [Kxnrl] // seems it sorted by flags? @@ -1152,7 +1152,7 @@ KHook::Return CS2Fixes::Hook_PhysicsTouchShuffle_Post(CVPhys2World* pThis, } if (touchingLinks.size() <= 1) - return; + return {KHook::Action::Ignore}; for (size_t i = touchingLinks.size() - 1; i > 0; --i) { From e9825a7fbce967a4e0aea87d9437a14138bfcbca Mon Sep 17 00:00:00 2001 From: Vauff Date: Tue, 29 Apr 2025 15:38:42 -0400 Subject: [PATCH 08/24] update khook include path --- AMBuildScript | 2 +- CS2Fixes.vcxproj | 4 ++-- Dockerfile | 4 +--- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/AMBuildScript b/AMBuildScript index a4ec8d1c7..e75522676 100644 --- a/AMBuildScript +++ b/AMBuildScript @@ -292,7 +292,7 @@ class MMSPluginConfig(object): cxx.cxxincludes += [ os.path.join(context.currentSourcePath), os.path.join(mms_core_path), - os.path.join(mms_core_path, 'khook', 'include'), + os.path.join(self.mms_root, 'third_party', 'khook', 'include'), ] defines = [] diff --git a/CS2Fixes.vcxproj b/CS2Fixes.vcxproj index b0b26a349..4e67a4bce 100644 --- a/CS2Fixes.vcxproj +++ b/CS2Fixes.vcxproj @@ -124,7 +124,7 @@ NotUsing pch.h stdcpp20 - protobuf/generated;src/utils;src/cs2_sdk;sdk/public;sdk/public/tier0;sdk/game/shared;sdk/game/server;sdk/public/tier1;sdk/public/mathlib;minhook/include;$(MMSOURCE112)/core;$(MMSOURCE112)/core/khook/include;vendor/subhook;vendor/funchook/include;sdk/public/entity2;sdk/public/game/server;sdk/thirdparty/protobuf-3.21.8/src;$(SolutionDir);%(AdditionalIncludeDirectories) + protobuf/generated;src/utils;src/cs2_sdk;sdk/public;sdk/public/tier0;sdk/game/shared;sdk/game/server;sdk/public/tier1;sdk/public/mathlib;minhook/include;$(MMSOURCE112)/core;$(MMSOURCE112)/third_party/khook/include;vendor/subhook;vendor/funchook/include;sdk/public/entity2;sdk/public/game/server;sdk/thirdparty/protobuf-3.21.8/src;$(SolutionDir);%(AdditionalIncludeDirectories) %(UndefinePreprocessorDefinitions) MultiThreadedDebug true @@ -150,7 +150,7 @@ NotUsing pch.h stdcpp20 - protobuf/generated;src/utils;src/cs2_sdk;sdk/public;sdk/public/tier0;sdk/game/shared;sdk/game/server;sdk/public/tier1;sdk/public/mathlib;minhook/include;$(MMSOURCE112)/core;$(MMSOURCE112)/core/khook/include;vendor/subhook;vendor/funchook/include;sdk/public/entity2;sdk/public/game/server;sdk/thirdparty/protobuf-3.21.8/src;$(SolutionDir);%(AdditionalIncludeDirectories) + protobuf/generated;src/utils;src/cs2_sdk;sdk/public;sdk/public/tier0;sdk/game/shared;sdk/game/server;sdk/public/tier1;sdk/public/mathlib;minhook/include;$(MMSOURCE112)/core;$(MMSOURCE112)/third_party/khook/include;vendor/subhook;vendor/funchook/include;sdk/public/entity2;sdk/public/game/server;sdk/thirdparty/protobuf-3.21.8/src;$(SolutionDir);%(AdditionalIncludeDirectories) MultiThreaded %(UndefinePreprocessorDefinitions) true diff --git a/Dockerfile b/Dockerfile index 15d6bbc67..a40ad999f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,9 +6,7 @@ RUN apt update && apt install -y clang-16 RUN ln -sf /usr/bin/clang-16 /usr/bin/clang && ln -sf /usr/bin/clang++-16 /usr/bin/clang++ RUN git clone https://github.com/alliedmodders/ambuild RUN cd ambuild && python setup.py install && cd .. -RUN git clone -b k/sourcehook_alternative https://github.com/alliedmodders/metamod-source -# no recursive submodules, steamrt3 doesn't support ssh checkout -RUN cd metamod-source && git submodule update --init && cd .. +RUN git clone --recurse-submodules -b k/sourcehook_alternative https://github.com/alliedmodders/metamod-source RUN git config --global --add safe.directory /app COPY ./docker-entrypoint.sh ./ From 7db7c33d5e49ab2c6a594f9f4b6a06785f549883 Mon Sep 17 00:00:00 2001 From: Vauff Date: Tue, 29 Apr 2025 18:51:57 -0400 Subject: [PATCH 09/24] Fix VTable hooks --- src/cs2fixes.cpp | 120 +++++++++++++++++++--------------------- src/utils/module.h | 2 +- src/utils/plat_unix.cpp | 4 +- src/utils/plat_win.cpp | 4 +- 4 files changed, 62 insertions(+), 68 deletions(-) diff --git a/src/cs2fixes.cpp b/src/cs2fixes.cpp index 9c36b4a62..7419877b5 100644 --- a/src/cs2fixes.cpp +++ b/src/cs2fixes.cpp @@ -113,15 +113,15 @@ KHook::Virtual postEventAbstractHook(&IGameEventSystem::PostEventAbstract, &g_CS KHook::Virtual startupServerHook(&INetworkServerService::StartupServer, &g_CS2Fixes, nullptr, &CS2Fixes::Hook_StartupServer_Post); KHook::Virtual checkTransmitHook(&ISource2GameEntities::CheckTransmit, &g_CS2Fixes, nullptr, &CS2Fixes::Hook_CheckTransmit_Post); KHook::Virtual dispatchConCommandHook(&ICvar::DispatchConCommand, &g_CS2Fixes, &CS2Fixes::Hook_DispatchConCommand, nullptr); -KHook::Virtual loadEventsFromFileHook(&IGameEventManager2::LoadEventsFromFile, &g_CS2Fixes, &CS2Fixes::Hook_LoadEventsFromFile, nullptr); -KHook::Virtual playerEquipUseHook(&g_CS2Fixes, &CS2Fixes::Hook_PlayerEquipUse, nullptr); -KHook::Virtual playerEquipPrecacheHook(&g_CS2Fixes, nullptr, &CS2Fixes::Hook_PlayerEquipPrecache_Post); KHook::Virtual createWorkshopMapGroupHook(&g_CS2Fixes, &CS2Fixes::Hook_CreateWorkshopMapGroup, nullptr); -KHook::Virtual onTakeDamageAliveHook(&g_CS2Fixes, &CS2Fixes::Hook_OnTakeDamage_Alive, nullptr); -KHook::Virtual checkMovingGroundHook(&g_CS2Fixes, &CS2Fixes::Hook_CheckMovingGround, nullptr); -KHook::Virtual goToIntermissionHook(&g_CS2Fixes, &CS2Fixes::Hook_GoToIntermission, nullptr); -KHook::Virtual physicsTouchShuffleHook(&g_CS2Fixes, nullptr, &CS2Fixes::Hook_PhysicsTouchShuffle_Post); -KHook::Virtual dropWeaponHook(&g_CS2Fixes, nullptr, &CS2Fixes::Hook_DropWeapon_Post); +KHook::Member loadEventsFromFileHook(&g_CS2Fixes, &CS2Fixes::Hook_LoadEventsFromFile, nullptr); +KHook::Member playerEquipUseHook(&g_CS2Fixes, &CS2Fixes::Hook_PlayerEquipUse, nullptr); +KHook::Member playerEquipPrecacheHook(&g_CS2Fixes, nullptr, &CS2Fixes::Hook_PlayerEquipPrecache_Post); +KHook::Member onTakeDamageAliveHook(&g_CS2Fixes, &CS2Fixes::Hook_OnTakeDamage_Alive, nullptr); +KHook::Member checkMovingGroundHook(&g_CS2Fixes, &CS2Fixes::Hook_CheckMovingGround, nullptr); +KHook::Member goToIntermissionHook(&g_CS2Fixes, &CS2Fixes::Hook_GoToIntermission, nullptr); +KHook::Member physicsTouchShuffleHook(&g_CS2Fixes, nullptr, &CS2Fixes::Hook_PhysicsTouchShuffle_Post); +KHook::Member dropWeaponHook(&g_CS2Fixes, nullptr, &CS2Fixes::Hook_DropWeapon_Post); CS2Fixes g_CS2Fixes; @@ -135,13 +135,6 @@ CGameConfig* g_GameConfig = nullptr; ISteamHTTP* g_http = nullptr; CSteamGameServerAPIContext g_steamAPI; CCSGameRules* g_pGameRules = nullptr; // Will be null between map end & new map startup, null check if necessary! -IGameEventManager2* g_pCGameEventManagerVTable = nullptr; -CGamePlayerEquip* g_pCGamePlayerEquipVTable = nullptr; -CCSPlayerPawn* g_pCCSPlayerPawnVTable = nullptr; -CCSPlayer_MovementServices* g_pCCSPlayer_MovementServicesVTable = nullptr; -CCSGameRules* g_pCCSGameRulesVTable = nullptr; -CVPhys2World* g_pCVPhys2WorldVTable = nullptr; -CCSPlayer_WeaponServices* g_pCCSPlayer_WeaponServicesVTable = nullptr; CGameEntitySystem* GameEntitySystem() { @@ -233,58 +226,64 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool if (!InitGameSystems()) bRequiredInitLoaded = false; - g_pCGameEventManagerVTable = (IGameEventManager2*)modules::server->FindVirtualTable("CGameEventManager"); + int offset = g_GameConfig->GetOffset("IGameTypes_CreateWorkshopMapGroup"); - if (!g_pCGameEventManagerVTable) + if (offset == -1) { - Panic("Failed to find CGameEventManager vtable\n"); + Panic("Failed to find IGameTypes_CreateWorkshopMapGroup\n"); bRequiredInitLoaded = false; } - loadEventsFromFileHook.Add(g_pCGameEventManagerVTable); + createWorkshopMapGroupHook.SetIndex(offset); + createWorkshopMapGroupHook.Add(g_pGameTypes); + + void** pCGameEventManagerVTable = modules::server->FindVirtualTable("CGameEventManager"); - g_pCGamePlayerEquipVTable = (CGamePlayerEquip*)modules::server->FindVirtualTable("CGamePlayerEquip"); - if (!g_pCGamePlayerEquipVTable) + if (!pCGameEventManagerVTable) { - Panic("Failed to find CGamePlayerEquip vtable\n"); + Panic("Failed to find CGameEventManager vtable\n"); bRequiredInitLoaded = false; } - int offset = g_GameConfig->GetOffset("CBaseEntity::Use"); + offset = KHook::GetVtableIndex(&IGameEventManager2::LoadEventsFromFile); if (offset == -1) { - Panic("Failed to find CBaseEntity::Use\n"); + Panic("Failed to find offset for IGameEventManager2::LoadEventsFromFile\n"); bRequiredInitLoaded = false; } - playerEquipUseHook.SetIndex(offset); - playerEquipUseHook.Add(g_pCGamePlayerEquipVTable); + loadEventsFromFileHook.Configure(pCGameEventManagerVTable[offset]); - offset = g_GameConfig->GetOffset("CBaseEntity::Precache"); - if (offset == -1) + void** pCGamePlayerEquipVTable = modules::server->FindVirtualTable("CGamePlayerEquip"); + if (!pCGamePlayerEquipVTable) { - Panic("Failed to find CBaseEntity::Precache\n"); + Panic("Failed to find CGamePlayerEquip vtable\n"); bRequiredInitLoaded = false; } - playerEquipPrecacheHook.SetIndex(offset); - playerEquipPrecacheHook.Add(g_pCGamePlayerEquipVTable); + offset = g_GameConfig->GetOffset("CBaseEntity::Use"); + + if (offset == -1) + { + Panic("Failed to find CBaseEntity::Use\n"); + bRequiredInitLoaded = false; + } - offset = g_GameConfig->GetOffset("IGameTypes_CreateWorkshopMapGroup"); + playerEquipUseHook.Configure(pCGamePlayerEquipVTable[offset]); + offset = g_GameConfig->GetOffset("CBaseEntity::Precache"); if (offset == -1) { - Panic("Failed to find IGameTypes_CreateWorkshopMapGroup\n"); + Panic("Failed to find CBaseEntity::Precache\n"); bRequiredInitLoaded = false; } - createWorkshopMapGroupHook.SetIndex(offset); - createWorkshopMapGroupHook.Add(g_pGameTypes); + playerEquipPrecacheHook.Configure(pCGamePlayerEquipVTable[offset]); - g_pCCSPlayerPawnVTable = (CCSPlayerPawn*)modules::server->FindVirtualTable("CCSPlayerPawn"); + void** pCCSPlayerPawnVTable = modules::server->FindVirtualTable("CCSPlayerPawn"); - if (!g_pCCSPlayerPawnVTable) + if (!pCCSPlayerPawnVTable) { Panic("Failed to find CCSPlayerPawn vtable\n"); bRequiredInitLoaded = false; @@ -297,12 +296,11 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool bRequiredInitLoaded = false; } - onTakeDamageAliveHook.SetIndex(offset); - onTakeDamageAliveHook.Add(g_pCCSPlayerPawnVTable); + onTakeDamageAliveHook.Configure(pCCSPlayerPawnVTable[offset]); - g_pCCSPlayer_MovementServicesVTable = (CCSPlayer_MovementServices*)modules::server->FindVirtualTable("CCSPlayer_MovementServices"); + void** pCCSPlayer_MovementServicesVTable = modules::server->FindVirtualTable("CCSPlayer_MovementServices"); - if (!g_pCCSPlayer_MovementServicesVTable) + if (!pCCSPlayer_MovementServicesVTable) { Panic("Failed to find CCSPlayer_MovementServices vtable\n"); bRequiredInitLoaded = false; @@ -315,12 +313,11 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool bRequiredInitLoaded = false; } - checkMovingGroundHook.SetIndex(offset); - checkMovingGroundHook.Add(g_pCCSPlayer_MovementServicesVTable); + checkMovingGroundHook.Configure(pCCSPlayer_MovementServicesVTable[offset]); - g_pCCSGameRulesVTable = (CCSGameRules*)modules::server->FindVirtualTable("CCSGameRules"); + void** pCCSGameRulesVTable = modules::server->FindVirtualTable("CCSGameRules"); - if (!g_pCCSGameRulesVTable) + if (!pCCSGameRulesVTable) { Panic("Failed to find CCSGameRules vtable\n"); bRequiredInitLoaded = false; @@ -333,12 +330,11 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool bRequiredInitLoaded = false; } - goToIntermissionHook.SetIndex(offset); - goToIntermissionHook.Add(g_pCCSGameRulesVTable); + goToIntermissionHook.Configure(pCCSGameRulesVTable[offset]); - g_pCVPhys2WorldVTable = (CVPhys2World*)modules::vphysics2->FindVirtualTable("CVPhys2World"); + void** pCVPhys2WorldVTable = modules::vphysics2->FindVirtualTable("CVPhys2World"); - if (!g_pCVPhys2WorldVTable) + if (!pCVPhys2WorldVTable) { Panic("Failed to find CVPhys2World vtable\n"); bRequiredInitLoaded = false; @@ -351,12 +347,11 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool bRequiredInitLoaded = false; } - physicsTouchShuffleHook.SetIndex(offset); - physicsTouchShuffleHook.Add(g_pCVPhys2WorldVTable); + physicsTouchShuffleHook.Configure(pCVPhys2WorldVTable[offset]); - g_pCCSPlayer_WeaponServicesVTable = (CCSPlayer_WeaponServices*)modules::server->FindVirtualTable("CCSPlayer_WeaponServices"); + void** pCCSPlayer_WeaponServicesVTable = modules::server->FindVirtualTable("CCSPlayer_WeaponServices"); - if (!g_pCCSPlayer_WeaponServicesVTable) + if (!pCCSPlayer_WeaponServicesVTable) { Panic("Failed to find CCSPlayer_WeaponServices vtable\n"); bRequiredInitLoaded = false; @@ -369,8 +364,7 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool bRequiredInitLoaded = false; } - dropWeaponHook.SetIndex(offset); - dropWeaponHook.Add(g_pCCSPlayer_WeaponServicesVTable); + dropWeaponHook.Configure(pCCSPlayer_WeaponServicesVTable[offset]); if (!bRequiredInitLoaded) { @@ -470,15 +464,15 @@ bool CS2Fixes::Unload(char* error, size_t maxlen) startupServerHook.Remove(g_pNetworkServerService); checkTransmitHook.Remove(g_pSource2GameEntities); dispatchConCommandHook.Remove(g_pCVar); - loadEventsFromFileHook.Remove(g_pCGameEventManagerVTable); - playerEquipUseHook.Remove(g_pCGamePlayerEquipVTable); - playerEquipPrecacheHook.Remove(g_pCGamePlayerEquipVTable); createWorkshopMapGroupHook.Remove(g_pGameTypes); - onTakeDamageAliveHook.Remove(g_pCCSPlayerPawnVTable); - checkMovingGroundHook.Remove(g_pCCSPlayer_MovementServicesVTable); - goToIntermissionHook.Remove(g_pCCSGameRulesVTable); - physicsTouchShuffleHook.Remove(g_pCVPhys2WorldVTable); - dropWeaponHook.Remove(g_pCCSPlayer_WeaponServicesVTable); + loadEventsFromFileHook.~Member(); + playerEquipUseHook.~Member(); + playerEquipPrecacheHook.~Member(); + onTakeDamageAliveHook.~Member(); + checkMovingGroundHook.~Member(); + goToIntermissionHook.~Member(); + physicsTouchShuffleHook.~Member(); + dropWeaponHook.~Member(); ConVar_Unregister(); diff --git a/src/utils/module.h b/src/utils/module.h index 67b33bcb1..75760160e 100644 --- a/src/utils/module.h +++ b/src/utils/module.h @@ -170,7 +170,7 @@ class CModule #ifdef _WIN32 void InitializeSections(); #endif - void* FindVirtualTable(const std::string& name); + void** FindVirtualTable(const std::string& name); public: const char* m_pszModule; diff --git a/src/utils/plat_unix.cpp b/src/utils/plat_unix.cpp index 22d0a2206..2798aad5c 100644 --- a/src/utils/plat_unix.cpp +++ b/src/utils/plat_unix.cpp @@ -205,7 +205,7 @@ void Plat_WriteMemory(void* pPatchAddress, uint8_t* pPatch, int iPatchSize) result = mprotect(align_addr, align_size, old_prot); } -void* CModule::FindVirtualTable(const std::string& name) +void** CModule::FindVirtualTable(const std::string& name) { auto readOnlyData = GetSection(".rodata"); auto readOnlyRelocations = GetSection(".data.rel.ro"); @@ -248,7 +248,7 @@ void* CModule::FindVirtualTable(const std::string& name) while (void* vtable = sigIt3.FindNext(false)) if (*(int64_t*)((uintptr_t)vtable - 0x8) == 0) - return (void*)((uintptr_t)vtable + 0x8); + return (void**)((uintptr_t)vtable + 0x8); } Warning("Failed to find vtable for %s\n", name.c_str()); diff --git a/src/utils/plat_win.cpp b/src/utils/plat_win.cpp index bda650e5f..c37179c78 100644 --- a/src/utils/plat_win.cpp +++ b/src/utils/plat_win.cpp @@ -48,7 +48,7 @@ void CModule::InitializeSections() } } -void* CModule::FindVirtualTable(const std::string& name) +void** CModule::FindVirtualTable(const std::string& name) { auto runTimeData = GetSection(".data"); auto readOnlyData = GetSection(".rdata"); @@ -98,7 +98,7 @@ void* CModule::FindVirtualTable(const std::string& name) return nullptr; } - return (void*)((uintptr_t)vtable + 0x8); + return (void**)((uintptr_t)vtable + 0x8); } Warning("Failed to find RTTI Complete Object Locator for %s\n", name.c_str()); From 8c8d52f2d0ac6be81d803f399a6bf443057f5cb5 Mon Sep 17 00:00:00 2001 From: Vauff Date: Wed, 30 Apr 2025 20:25:45 -0400 Subject: [PATCH 10/24] Migrate EntWatch virtual hooks --- src/cs2fixes.cpp | 4 +- src/entwatch.cpp | 290 +++++++++++++++++------------------------------ src/entwatch.h | 36 ++---- 3 files changed, 113 insertions(+), 217 deletions(-) diff --git a/src/cs2fixes.cpp b/src/cs2fixes.cpp index 7419877b5..01907aa49 100644 --- a/src/cs2fixes.cpp +++ b/src/cs2fixes.cpp @@ -393,6 +393,7 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool g_pPanoramaVoteHandler = new CPanoramaVoteHandler(); g_pEWHandler = new CEWHandler(); + g_pEWHandler->CreateHooks(); RegisterWeaponCommands(); // Check hide distance @@ -532,8 +533,7 @@ bool CS2Fixes::Unload(char* error, size_t maxlen) if (g_pEWHandler) { - g_pEWHandler->RemoveAllUseHooks(); - g_pEWHandler->RemoveAllTriggers(); + g_pEWHandler->RemoveHooks(); delete g_pEWHandler; } diff --git a/src/entwatch.cpp b/src/entwatch.cpp index 8fa230e00..479b67370 100644 --- a/src/entwatch.cpp +++ b/src/entwatch.cpp @@ -56,21 +56,21 @@ extern CCSGameRules* g_pGameRules; CEWHandler* g_pEWHandler = nullptr; -SH_DECL_MANUALHOOK1_void(CBaseButton_Use, 0, 0, 0, InputData_t*); -SH_DECL_MANUALHOOK1_void(CPhysBox_Use, 0, 0, 0, InputData_t*); -SH_DECL_MANUALHOOK1_void(CRotButton_Use, 0, 0, 0, InputData_t*); -SH_DECL_MANUALHOOK1_void(CMomentaryRotButton_Use, 0, 0, 0, InputData_t*); -SH_DECL_MANUALHOOK1_void(CPhysicalButton_Use, 0, 0, 0, InputData_t*); - -SH_DECL_MANUALHOOK1_void(CTriggerTeleport_StartTouch, 0, 0, 0, CBaseEntity*); -SH_DECL_MANUALHOOK1_void(CTriggerTeleport_Touch, 0, 0, 0, CBaseEntity*); -SH_DECL_MANUALHOOK1_void(CTriggerTeleport_EndTouch, 0, 0, 0, CBaseEntity*); -SH_DECL_MANUALHOOK1_void(CTriggerOnce_StartTouch, 0, 0, 0, CBaseEntity*); -SH_DECL_MANUALHOOK1_void(CTriggerOnce_Touch, 0, 0, 0, CBaseEntity*); -SH_DECL_MANUALHOOK1_void(CTriggerOnce_EndTouch, 0, 0, 0, CBaseEntity*); -SH_DECL_MANUALHOOK1_void(CTriggerMultiple_StartTouch, 0, 0, 0, CBaseEntity*); -SH_DECL_MANUALHOOK1_void(CTriggerMultiple_Touch, 0, 0, 0, CBaseEntity*); -SH_DECL_MANUALHOOK1_void(CTriggerMultiple_EndTouch, 0, 0, 0, CBaseEntity*); +KHook::Member baseButtonUseHook(g_pEWHandler, &CEWHandler::Hook_Use, nullptr); +KHook::Member physBoxUseHook(g_pEWHandler, &CEWHandler::Hook_Use, nullptr); +KHook::Member rotButtonUseHook(g_pEWHandler, &CEWHandler::Hook_Use, nullptr); +KHook::Member momentaryRotButtonUseHook(g_pEWHandler, &CEWHandler::Hook_Use, nullptr); +KHook::Member physicalButtonUseHook(g_pEWHandler, &CEWHandler::Hook_Use, nullptr); + +KHook::Member triggerTeleportStartTouchHook(g_pEWHandler, &CEWHandler::Hook_Touch, nullptr); +KHook::Member triggerOnceStartTouchHook(g_pEWHandler, &CEWHandler::Hook_Touch, nullptr); +KHook::Member triggerMultipleStartTouchHook(g_pEWHandler, &CEWHandler::Hook_Touch, nullptr); +KHook::Member triggerTeleportTouchHook(g_pEWHandler, &CEWHandler::Hook_Touch, nullptr); +KHook::Member triggerOnceTouchHook(g_pEWHandler, &CEWHandler::Hook_Touch, nullptr); +KHook::Member triggerMultipleTouchHook(g_pEWHandler, &CEWHandler::Hook_Touch, nullptr); +KHook::Member triggerTeleportEndTouchHook(g_pEWHandler, &CEWHandler::Hook_Touch, nullptr); +KHook::Member triggerOnceEndTouchHook(g_pEWHandler, &CEWHandler::Hook_Touch, nullptr); +KHook::Member triggerMultipleEndTouchHook(g_pEWHandler, &CEWHandler::Hook_Touch, nullptr); CConVar g_cvarEnableEntWatch("entwatch_enable", FCVAR_NONE, "INCOMPATIBLE WITH CS#. Whether to enable EntWatch features", false); CConVar g_cvarEnableFiltering("entwatch_auto_filter", FCVAR_NONE, "Whether to automatically block non-item holders from triggering uses", true); @@ -211,7 +211,7 @@ void EWItemHandler::RegisterEntity(CBaseEntity* pEntity) switch (type) { case Button: - g_pEWHandler->AddUseHook(pEntity); + g_pEWHandler->vecUseHookedEntities.push_back(pEntity->GetHandle()); break; case CounterDown: case CounterUp: @@ -636,7 +636,7 @@ bool EWItemInstance::RemoveHandler(CBaseEntity* pEnt) if (vecHandlers[i]->iEntIndex == pEnt->entindex()) { if (vecHandlers[i]->type == EWHandlerType::Button) - g_pEWHandler->RemoveUseHook(pEnt); + g_pEWHandler->RemoveUseEntity(pEnt); vecHandlers[i]->iEntIndex = -1; return true; } @@ -895,8 +895,8 @@ void CEWHandler::UnLoadConfig() vecItems[i]->vecHandlers[j]->RemoveHook(); vecItems.clear(); - RemoveAllUseHooks(); - RemoveAllTriggers(); + vecUseHookedEntities.clear(); + vecHookedTriggers.clear(); bConfigLoaded = false; } @@ -1146,7 +1146,7 @@ bool CEWHandler::RegisterTrigger(CBaseEntity* pEnt) if (strcmp(sHammerid, pItem->vecTriggers[j].c_str())) continue; - AddTouchHook(pEnt); + vecHookedTriggers.push_back(pEnt->GetHandle()); return true; } @@ -1154,74 +1154,93 @@ bool CEWHandler::RegisterTrigger(CBaseEntity* pEnt) return false; } -void CEWHandler::AddTouchHook(CBaseEntity* pEnt) +void CEWHandler::CreateHooks() { - static int startOffset = g_GameConfig->GetOffset("CBaseEntity::StartTouch"); - static int touchOffset = g_GameConfig->GetOffset("CBaseEntity::Touch"); - static int endOffset = g_GameConfig->GetOffset("CBaseEntity::EndTouch"); + void** pCBaseButtonVTable = modules::server->FindVirtualTable("CBaseButton"); + void** pCPhysBoxVTable = modules::server->FindVirtualTable("CPhysBox"); + void** pCRotButtonVTable = modules::server->FindVirtualTable("CRotButton"); + void** pCMomentaryRotButtonVTable = modules::server->FindVirtualTable("CMomentaryRotButton"); + void** pCPhysicalButtonVTable = modules::server->FindVirtualTable("CPhysicalButton"); + void** pCTriggerTeleportVTable = modules::server->FindVirtualTable("CTriggerTeleport"); + void** pCTriggerOnceVTable = modules::server->FindVirtualTable("CTriggerOnce"); + void** pCTriggerMultipleVTable = modules::server->FindVirtualTable("CTriggerMultiple"); + + int offset = g_GameConfig->GetOffset("CBaseEntity::Use"); - if (!V_strcmp(pEnt->GetClassname(), "trigger_teleport")) + if (offset == -1) { - if (iTriggerTeleportTouchHooks[0] == -1) - { - const auto pTeleport_VTable = modules::server->FindVirtualTable("CTriggerTeleport"); + Panic("Failed to find CBaseEntity::Use offset\n"); + return; + } - SH_MANUALHOOK_RECONFIGURE(CTriggerTeleport_StartTouch, startOffset, 0, 0); - iTriggerTeleportTouchHooks[0] = SH_ADD_MANUALDVPHOOK(CTriggerTeleport_StartTouch, pTeleport_VTable, SH_MEMBER(this, &CEWHandler::Hook_Touch), false); + baseButtonUseHook.Configure(pCBaseButtonVTable[offset]); + physBoxUseHook.Configure(pCPhysBoxVTable[offset]); + rotButtonUseHook.Configure(pCRotButtonVTable[offset]); + momentaryRotButtonUseHook.Configure(pCMomentaryRotButtonVTable[offset]); + physicalButtonUseHook.Configure(pCPhysicalButtonVTable[offset]); - SH_MANUALHOOK_RECONFIGURE(CTriggerTeleport_Touch, touchOffset, 0, 0); - iTriggerTeleportTouchHooks[1] = SH_ADD_MANUALDVPHOOK(CTriggerTeleport_Touch, pTeleport_VTable, SH_MEMBER(this, &CEWHandler::Hook_Touch), false); + offset = g_GameConfig->GetOffset("CBaseEntity::StartTouch"); - SH_MANUALHOOK_RECONFIGURE(CTriggerTeleport_EndTouch, endOffset, 0, 0); - iTriggerTeleportTouchHooks[2] = SH_ADD_MANUALDVPHOOK(CTriggerTeleport_EndTouch, pTeleport_VTable, SH_MEMBER(this, &CEWHandler::Hook_Touch), false); - } - } - else if (!V_strcmp(pEnt->GetClassname(), "trigger_multiple")) + if (offset == -1) { - if (iTriggerMultipleTouchHooks[0] == -1) - { - const auto pMultiple_VTable = modules::server->FindVirtualTable("CTriggerMultiple"); + Panic("Failed to find CBaseEntity::StartTouch offset\n"); + return; + } - SH_MANUALHOOK_RECONFIGURE(CTriggerMultiple_StartTouch, startOffset, 0, 0); - iTriggerMultipleTouchHooks[0] = SH_ADD_MANUALDVPHOOK(CTriggerMultiple_StartTouch, pMultiple_VTable, SH_MEMBER(this, &CEWHandler::Hook_Touch), false); + triggerTeleportStartTouchHook.Configure(pCTriggerTeleportVTable[offset]); + triggerOnceStartTouchHook.Configure(pCTriggerOnceVTable[offset]); + triggerMultipleStartTouchHook.Configure(pCTriggerMultipleVTable[offset]); - SH_MANUALHOOK_RECONFIGURE(CTriggerMultiple_Touch, touchOffset, 0, 0); - iTriggerMultipleTouchHooks[1] = SH_ADD_MANUALDVPHOOK(CTriggerMultiple_Touch, pMultiple_VTable, SH_MEMBER(this, &CEWHandler::Hook_Touch), false); + offset = g_GameConfig->GetOffset("CBaseEntity::Touch"); - SH_MANUALHOOK_RECONFIGURE(CTriggerMultiple_EndTouch, endOffset, 0, 0); - iTriggerMultipleTouchHooks[2] = SH_ADD_MANUALDVPHOOK(CTriggerMultiple_EndTouch, pMultiple_VTable, SH_MEMBER(this, &CEWHandler::Hook_Touch), false); - } - } - else if (!V_strcmp(pEnt->GetClassname(), "trigger_once")) + if (offset == -1) { - if (iTriggerOnceTouchHooks[0] == -1) - { - const auto pOnce_VTable = modules::server->FindVirtualTable("CTriggerOnce"); + Panic("Failed to find CBaseEntity::Touch offset\n"); + return; + } - SH_MANUALHOOK_RECONFIGURE(CTriggerOnce_StartTouch, startOffset, 0, 0); - iTriggerOnceTouchHooks[0] = SH_ADD_MANUALDVPHOOK(CTriggerOnce_StartTouch, pOnce_VTable, SH_MEMBER(this, &CEWHandler::Hook_Touch), false); + triggerTeleportTouchHook.Configure(pCTriggerTeleportVTable[offset]); + triggerOnceTouchHook.Configure(pCTriggerOnceVTable[offset]); + triggerMultipleTouchHook.Configure(pCTriggerMultipleVTable[offset]); - SH_MANUALHOOK_RECONFIGURE(CTriggerOnce_Touch, touchOffset, 0, 0); - iTriggerOnceTouchHooks[1] = SH_ADD_MANUALDVPHOOK(CTriggerOnce_Touch, pOnce_VTable, SH_MEMBER(this, &CEWHandler::Hook_Touch), false); + offset = g_GameConfig->GetOffset("CBaseEntity::EndTouch"); - SH_MANUALHOOK_RECONFIGURE(CTriggerOnce_EndTouch, endOffset, 0, 0); - iTriggerOnceTouchHooks[2] = SH_ADD_MANUALDVPHOOK(CTriggerOnce_EndTouch, pOnce_VTable, SH_MEMBER(this, &CEWHandler::Hook_Touch), false); - } + if (offset == -1) + { + Panic("Failed to find CBaseEntity::EndTouch offset\n"); + return; } - vecHookedTriggers.push_back(pEnt->GetHandle()); + triggerTeleportEndTouchHook.Configure(pCTriggerTeleportVTable[offset]); + triggerOnceEndTouchHook.Configure(pCTriggerOnceVTable[offset]); + triggerMultipleEndTouchHook.Configure(pCTriggerMultipleVTable[offset]); } -void CEWHandler::Hook_Touch(CBaseEntity* pOther) +void CEWHandler::RemoveHooks() { - CBaseEntity* pEntity = META_IFACEPTR(CBaseEntity); - if (!pEntity) - RETURN_META(MRES_IGNORED); + baseButtonUseHook.~Member(); + physBoxUseHook.~Member(); + rotButtonUseHook.~Member(); + momentaryRotButtonUseHook.~Member(); + physicalButtonUseHook.~Member(); + triggerTeleportStartTouchHook.~Member(); + triggerOnceStartTouchHook.~Member(); + triggerMultipleStartTouchHook.~Member(); + triggerTeleportTouchHook.~Member(); + triggerOnceTouchHook.~Member(); + triggerMultipleTouchHook.~Member(); + triggerTeleportEndTouchHook.~Member(); + triggerOnceEndTouchHook.~Member(); + triggerMultipleEndTouchHook.~Member(); +} + +KHook::Return CEWHandler::Hook_Touch(CBaseEntity* pThis, CBaseEntity* pOther) +{ bool bFound = false; for (int i = 0; i < (vecHookedTriggers).size(); i++) { - if (vecHookedTriggers[i] == pEntity->GetHandle()) + if (vecHookedTriggers[i] == pThis->GetHandle()) { bFound = true; break; @@ -1229,24 +1248,24 @@ void CEWHandler::Hook_Touch(CBaseEntity* pOther) } if (!bFound) - RETURN_META(MRES_IGNORED); + return {KHook::Action::Ignore}; CCSPlayerPawn* pPawn = (CCSPlayerPawn*)pOther; if (!pPawn) - RETURN_META(MRES_IGNORED); + return {KHook::Action::Ignore}; CCSPlayerController* pController = pPawn->GetOriginalController(); if (!pController) - RETURN_META(MRES_IGNORED); + return {KHook::Action::Ignore}; ZEPlayer* zpPlayer = pController->GetZEPlayer(); if (!zpPlayer) - RETURN_META(MRES_IGNORED); + return {KHook::Action::Ignore}; if (zpPlayer->IsEbanned()) - RETURN_META(MRES_SUPERCEDE); + return {KHook::Action::Supercede}; - RETURN_META(MRES_IGNORED); + return {KHook::Action::Ignore}; } bool CEWHandler::RemoveTrigger(CBaseEntity* pEnt) @@ -1263,23 +1282,6 @@ bool CEWHandler::RemoveTrigger(CBaseEntity* pEnt) return false; } -void CEWHandler::RemoveAllTriggers() -{ - Message("[EntWatch] Fully unhooking touch hooks\n"); - for (int i = 0; i < 3; i++) - { - SH_REMOVE_HOOK_ID(iTriggerTeleportTouchHooks[i]); - iTriggerTeleportTouchHooks[i] = -1; - - SH_REMOVE_HOOK_ID(iTriggerMultipleTouchHooks[i]); - iTriggerMultipleTouchHooks[i] = -1; - - SH_REMOVE_HOOK_ID(iTriggerOnceTouchHooks[i]); - iTriggerOnceTouchHooks[i] = -1; - } - vecHookedTriggers.clear(); -} - void CEWHandler::RemoveHandler(CBaseEntity* pEnt) { for (int i = 0; i < (vecItems).size(); i++) @@ -1611,65 +1613,7 @@ void CEWHandler::Transfer(CCSPlayerController* pCaller, int iItemInstance, CHand } } -void CEWHandler::AddUseHook(CBaseEntity* pEnt) -{ - static int offset = g_GameConfig->GetOffset("CBaseEntity::Use"); - if (offset == -1) - { - Panic("Failed to find CBaseEntity::Use offset in entwatch.cpp::AddUseHook() !!\n"); - return; - } - - if (!V_strcmp(pEnt->GetClassname(), "func_button")) - { - if (iBaseBtnUseHookId == -1) - { - const auto pBaseButton_VTable = modules::server->FindVirtualTable("CBaseButton"); - SH_MANUALHOOK_RECONFIGURE(CBaseButton_Use, offset, 0, 0); - iBaseBtnUseHookId = SH_ADD_MANUALDVPHOOK(CBaseButton_Use, pBaseButton_VTable, SH_MEMBER(this, &CEWHandler::Hook_Use), false); - } - } - else if (!V_strcmp(pEnt->GetClassname(), "func_physbox")) - { - if (iPhysboxUseHookId == -1) - { - const auto pPhysbox_VTable = modules::server->FindVirtualTable("CPhysBox"); - SH_MANUALHOOK_RECONFIGURE(CPhysBox_Use, offset, 0, 0); - iPhysboxUseHookId = SH_ADD_MANUALDVPHOOK(CPhysBox_Use, pPhysbox_VTable, SH_MEMBER(this, &CEWHandler::Hook_Use), false); - } - } - else if (!V_strcmp(pEnt->GetClassname(), "func_rot_button")) - { - if (iRotBtnUseHookId == -1) - { - const auto pCRotButton_VTable = modules::server->FindVirtualTable("CRotButton"); - SH_MANUALHOOK_RECONFIGURE(CRotButton_Use, offset, 0, 0); - iRotBtnUseHookId = SH_ADD_MANUALDVPHOOK(CRotButton_Use, pCRotButton_VTable, SH_MEMBER(this, &CEWHandler::Hook_Use), false); - } - } - else if (!V_strcmp(pEnt->GetClassname(), "momentary_rot_button")) - { - if (iMomRotBtnUseHookId == -1) - { - const auto pCMomentaryRotButton_VTable = modules::server->FindVirtualTable("CMomentaryRotButton"); - SH_MANUALHOOK_RECONFIGURE(CMomentaryRotButton_Use, offset, 0, 0); - iMomRotBtnUseHookId = SH_ADD_MANUALDVPHOOK(CMomentaryRotButton_Use, pCMomentaryRotButton_VTable, SH_MEMBER(this, &CEWHandler::Hook_Use), false); - } - } - else if (!V_strcmp(pEnt->GetClassname(), "func_physical_button")) - { - if (iPhysicalBtnUseHookId == -1) - { - const auto pCPhysicalButton_VTable = modules::server->FindVirtualTable("CPhysicalButton"); - SH_MANUALHOOK_RECONFIGURE(CPhysicalButton_Use, offset, 0, 0); - iPhysicalBtnUseHookId = SH_ADD_MANUALDVPHOOK(CPhysicalButton_Use, pCPhysicalButton_VTable, SH_MEMBER(this, &CEWHandler::Hook_Use), false); - } - } - - vecUseHookedEntities.push_back(pEnt->GetHandle()); -} - -void CEWHandler::RemoveUseHook(CBaseEntity* pEnt) +void CEWHandler::RemoveUseEntity(CBaseEntity* pEnt) { for (int i = 0; i < (vecUseHookedEntities).size(); i++) { @@ -1681,39 +1625,13 @@ void CEWHandler::RemoveUseHook(CBaseEntity* pEnt) } } -void CEWHandler::RemoveAllUseHooks() -{ - Message("[EntWatch] Fully unhooking use hooks\n"); - - SH_REMOVE_HOOK_ID(iBaseBtnUseHookId); - iBaseBtnUseHookId = -1; - - SH_REMOVE_HOOK_ID(iPhysboxUseHookId); - iPhysboxUseHookId = -1; - - SH_REMOVE_HOOK_ID(iRotBtnUseHookId); - iRotBtnUseHookId = -1; - - SH_REMOVE_HOOK_ID(iMomRotBtnUseHookId); - iMomRotBtnUseHookId = -1; - - SH_REMOVE_HOOK_ID(iPhysicalBtnUseHookId); - iPhysicalBtnUseHookId = -1; - - vecUseHookedEntities.clear(); -} - -void CEWHandler::Hook_Use(InputData_t* pInput) +KHook::Return CEWHandler::Hook_Use(CBaseEntity* pThis, InputData_t* pInput) { // Message("##### USE HOOK #####\n"); - CBaseEntity* pEntity = META_IFACEPTR(CBaseEntity); - if (!pEntity) - RETURN_META(MRES_IGNORED); - bool bFound = false; for (int i = 0; i < (vecUseHookedEntities).size(); i++) { - if (vecUseHookedEntities[i] == pEntity->GetHandle()) + if (vecUseHookedEntities[i] == pThis->GetHandle()) { bFound = true; break; @@ -1721,9 +1639,9 @@ void CEWHandler::Hook_Use(InputData_t* pInput) } if (!bFound) - RETURN_META(MRES_IGNORED); + return {KHook::Action::Ignore}; - int index = pEntity->entindex(); + int index = pThis->entindex(); int itemIndex = -1; int handlerIndex = -1; for (int i = 0; i < (vecItems).size(); i++) @@ -1738,32 +1656,32 @@ void CEWHandler::Hook_Use(InputData_t* pInput) } if (itemIndex == -1 || handlerIndex == -1) - RETURN_META(MRES_IGNORED); + return {KHook::Action::Ignore}; // Prevent uses from non item owners if we are filtering - META_RES resVal = MRES_IGNORED; + KHook::Return returnVal = {KHook::Action::Ignore}; if (g_cvarEnableFiltering.Get()) - resVal = MRES_SUPERCEDE; + returnVal = {KHook::Action::Supercede}; CBaseEntity* pActivator = pInput->pActivator; if (!pActivator || !pActivator->IsPawn()) - RETURN_META(resVal); + return returnVal; std::shared_ptr pItem = vecItems[itemIndex]; CCSPlayerPawn* pPawn = (CCSPlayerPawn*)pActivator; CCSPlayerController* pController = pPawn->GetOriginalController(); if (!pController || pController->GetPlayerSlot() != pItem->iOwnerSlot) - RETURN_META(resVal); + return returnVal; - const char* classname = pEntity->GetClassname(); + const char* classname = pThis->GetClassname(); if (!strcmp(classname, "func_button") || !strcmp(classname, "func_rot_button") || !strcmp(classname, "momentary_rot_button") || !strcmp(classname, "func_physical_button")) { - CBaseButton* pButton = (CBaseButton*)pEntity; + CBaseButton* pButton = (CBaseButton*)pThis; if (pButton->m_bLocked || pButton->m_bDisabled) - RETURN_META(resVal); + return returnVal; } // @@ -1771,7 +1689,7 @@ void CEWHandler::Hook_Use(InputData_t* pInput) // This is just to prevent unnecessary stuff with buttons like movement // - RETURN_META(MRES_IGNORED); + return {KHook::Action::Ignore}; } // Update cd and uses of all held items diff --git a/src/entwatch.h b/src/entwatch.h index 25c3d918c..9125fdefd 100644 --- a/src/entwatch.h +++ b/src/entwatch.h @@ -25,6 +25,7 @@ #include "entity/ccsplayerpawn.h" #include "eventlistener.h" #include "gamesystem.h" +#include "khook.hpp" #include "vendor/nlohmann/json_fwd.hpp" using ordered_json = nlohmann::ordered_json; @@ -202,21 +203,11 @@ class CEWHandler { bConfigLoaded = false; m_bHudTicking = false; - - iBaseBtnUseHookId = -1; - iPhysboxUseHookId = -1; - iPhysicalBtnUseHookId = -1; - iRotBtnUseHookId = -1; - iMomRotBtnUseHookId = -1; - - for (int i = 0; i < 3; i++) - { - iTriggerTeleportTouchHooks[i] = -1; - iTriggerMultipleTouchHooks[i] = -1; - iTriggerOnceTouchHooks[i] = -1; - } } + void CreateHooks(); + void RemoveHooks(); + bool bConfigLoaded; bool IsConfigLoaded() { return bConfigLoaded; } @@ -235,10 +226,8 @@ class CEWHandler void RegisterHandler(CBaseEntity* pEnt); bool RegisterTrigger(CBaseEntity* pEnt); - void AddTouchHook(CBaseEntity* pEnt); - void Hook_Touch(CBaseEntity* pOther); + KHook::Return Hook_Touch(CBaseEntity* pThis, CBaseEntity* pOther); bool RemoveTrigger(CBaseEntity* pEnt); - void RemoveAllTriggers(); void RemoveHandler(CBaseEntity* pEnt); void ResetAllClantags(); @@ -248,25 +237,14 @@ class CEWHandler void PlayerDrop(EWDropReason reason, int iItemInstance, CCSPlayerController* pController); void Transfer(CCSPlayerController* pCaller, int iItemInstance, CHandle hReceiver); - void AddUseHook(CBaseEntity* pEnt); - void RemoveUseHook(CBaseEntity* pEnt); - void RemoveAllUseHooks(); - void Hook_Use(InputData_t* pInput); + void RemoveUseEntity(CBaseEntity* pEnt); + KHook::Return Hook_Use(CBaseEntity* pThis, InputData_t* pInput); std::map> mapItemConfig; /* items defined in the config */ std::vector> vecItems; /* all items found spawned */ std::vector> vecHookedTriggers; - int iTriggerTeleportTouchHooks[3]; - int iTriggerMultipleTouchHooks[3]; - int iTriggerOnceTouchHooks[3]; - std::vector> vecUseHookedEntities; - int iBaseBtnUseHookId; - int iPhysboxUseHookId; - int iPhysicalBtnUseHookId; - int iRotBtnUseHookId; - int iMomRotBtnUseHookId; bool m_bHudTicking; From 8a1f25845264a968f8a4e676dcc9e615267e09a8 Mon Sep 17 00:00:00 2001 From: Vauff Date: Wed, 11 Mar 2026 15:26:32 -0400 Subject: [PATCH 11/24] various fixes & remove/add some todo's --- Dockerfile | 2 +- src/cs2fixes.cpp | 62 +++++++++++++++++++++++------------------------- src/cs2fixes.h | 2 +- src/entwatch.cpp | 59 +++++++++++++++++++++++---------------------- 4 files changed, 63 insertions(+), 62 deletions(-) diff --git a/Dockerfile b/Dockerfile index d6abf00e1..7bfed8735 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,7 +9,7 @@ RUN apt update && apt install -y clang-21 RUN ln -sf /usr/bin/clang-21 /usr/bin/clang && ln -sf /usr/bin/clang++-21 /usr/bin/clang++ RUN git clone https://github.com/alliedmodders/ambuild RUN cd ambuild && python setup.py install && cd .. -RUN git clone --recurse-submodules -b fix-submodule https://github.com/Vauff/metamod-source +RUN git clone --recurse-submodules -b k/sourcehook_alternative https://github.com/alliedmodders/metamod-source RUN git config --global --add safe.directory /app COPY ./docker-entrypoint.sh ./ diff --git a/src/cs2fixes.cpp b/src/cs2fixes.cpp index 4b5824546..4c811502b 100644 --- a/src/cs2fixes.cpp +++ b/src/cs2fixes.cpp @@ -213,7 +213,7 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool bRequiredInitLoaded = false; } - loadEventsFromFileHook.AddGlobal(g_pCGameEventManagerVTable); + loadEventsFromFileHook.AddGlobal((IGameEventManager2*)&g_pCGameEventManagerVTable); g_pCEntitySystemVTable = (CEntitySystem*)modules::server->FindVirtualTable("CGameEntitySystem"); if (!g_pCEntitySystemVTable) @@ -222,7 +222,7 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool bRequiredInitLoaded = false; } - spawnHook.AddGlobal(g_pCEntitySystemVTable); + spawnHook.AddGlobal((CEntitySystem*)&g_pCEntitySystemVTable); int offset = g_GameConfig->GetOffset("IGameTypes_CreateWorkshopMapGroup"); if (offset == -1) @@ -249,7 +249,7 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool } getTouchingListHook.Configure(offset); - getTouchingListHook.AddGlobal(g_pCVPhys2WorldVTable); + getTouchingListHook.AddGlobal((CVPhys2World*)&g_pCVPhys2WorldVTable); g_pCCSPlayer_MovementServicesVTable = (CCSPlayer_MovementServices*)modules::server->FindVirtualTable("CCSPlayer_MovementServices"); if (!g_pCCSPlayer_MovementServicesVTable) @@ -266,7 +266,7 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool } checkMovingGroundHook.Configure(offset); - checkMovingGroundHook.AddGlobal(g_pCCSPlayer_MovementServicesVTable); + checkMovingGroundHook.AddGlobal((CCSPlayer_MovementServices*)&g_pCCSPlayer_MovementServicesVTable); g_pCCSPlayer_WeaponServicesVTable = (CCSPlayer_WeaponServices*)modules::server->FindVirtualTable("CCSPlayer_WeaponServices"); if (!g_pCCSPlayer_WeaponServicesVTable) @@ -283,7 +283,7 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool } dropWeaponHook.Configure(offset); - dropWeaponHook.AddGlobal(g_pCCSPlayer_WeaponServicesVTable); + dropWeaponHook.AddGlobal((CCSPlayer_WeaponServices*)&g_pCCSPlayer_WeaponServicesVTable); g_pCCSGameRulesVTable = (CCSGameRules*)modules::server->FindVirtualTable("CCSGameRules"); if (!g_pCCSGameRulesVTable) @@ -300,7 +300,8 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool } goToIntermissionHook.Configure(offset); - goToIntermissionHook.AddGlobal(g_pCCSGameRulesVTable); + // TODO: this crashes, borked in khook for some reason + //goToIntermissionHook.AddGlobal((CCSGameRules*)&g_pCCSGameRulesVTable); g_pCGamePlayerEquipVTable = (CGamePlayerEquip*)modules::server->FindVirtualTable("CGamePlayerEquip"); if (!g_pCGamePlayerEquipVTable) @@ -317,7 +318,7 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool } playerEquipUseHook.Configure(offset); - playerEquipUseHook.AddGlobal(g_pCGamePlayerEquipVTable); + playerEquipUseHook.AddGlobal((CGamePlayerEquip*)&g_pCGamePlayerEquipVTable); offset = g_GameConfig->GetOffset("CBaseEntity::Precache"); if (offset == -1) @@ -327,7 +328,7 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool } playerEquipPrecacheHook.Configure(offset); - playerEquipPrecacheHook.AddGlobal(g_pCGamePlayerEquipVTable); + playerEquipPrecacheHook.AddGlobal((CGamePlayerEquip*)&g_pCGamePlayerEquipVTable); g_pTriggerGravityVTable = (CTriggerGravity*)modules::server->FindVirtualTable("CTriggerGravity"); if (!g_pTriggerGravityVTable) @@ -337,7 +338,7 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool } triggerGravityPrecacheHook.Configure(offset); - triggerGravityPrecacheHook.AddGlobal(g_pTriggerGravityVTable); + triggerGravityPrecacheHook.AddGlobal((CTriggerGravity*)&g_pTriggerGravityVTable); offset = g_GameConfig->GetOffset("CBaseEntity::EndTouch"); if (offset == -1) @@ -347,7 +348,7 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool } triggerGravityEndTouchHook.Configure(offset); - triggerGravityEndTouchHook.AddGlobal(g_pTriggerGravityVTable); + triggerGravityEndTouchHook.AddGlobal((CTriggerGravity*)&g_pTriggerGravityVTable); g_pCCSPlayerPawnVTable = (CCSPlayerPawn*)modules::server->FindVirtualTable("CCSPlayerPawn"); if (!g_pCCSPlayerPawnVTable) @@ -364,7 +365,7 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool } onTakeDamageAliveHook.Configure(offset); - onTakeDamageAliveHook.AddGlobal(g_pCCSPlayerPawnVTable); + onTakeDamageAliveHook.AddGlobal((CCSPlayerPawn*)&g_pCCSPlayerPawnVTable); if (!bRequiredInitLoaded) { @@ -461,19 +462,19 @@ bool CS2Fixes::Unload(char* error, size_t maxlen) startupServerHook.Remove(g_pNetworkServerService); checkTransmitHook.Remove(g_pSource2GameEntities); dispatchConCommandHook.Remove(g_pCVar); - loadEventsFromFileHook.RemoveGlobal(g_pCGameEventManagerVTable); - spawnHook.RemoveGlobal(g_pCEntitySystemVTable); + loadEventsFromFileHook.RemoveGlobal((IGameEventManager2*)&g_pCGameEventManagerVTable); + spawnHook.RemoveGlobal((CEntitySystem*)&g_pCEntitySystemVTable); setGameSpawnGroupMgrHook.Remove(GetNetworkGameServer()); createWorkshopMapGroupHook.Remove(g_pGameTypes); - getTouchingListHook.RemoveGlobal(g_pCVPhys2WorldVTable); - checkMovingGroundHook.RemoveGlobal(g_pCCSPlayer_MovementServicesVTable); - dropWeaponHook.RemoveGlobal(g_pCCSPlayer_WeaponServicesVTable); - goToIntermissionHook.RemoveGlobal(g_pCCSGameRulesVTable); - playerEquipUseHook.RemoveGlobal(g_pCGamePlayerEquipVTable); - playerEquipPrecacheHook.RemoveGlobal(g_pCGamePlayerEquipVTable); - triggerGravityPrecacheHook.RemoveGlobal(g_pTriggerGravityVTable); - triggerGravityEndTouchHook.RemoveGlobal(g_pTriggerGravityVTable); - onTakeDamageAliveHook.RemoveGlobal(g_pCCSPlayerPawnVTable); + getTouchingListHook.RemoveGlobal((CVPhys2World*)&g_pCVPhys2WorldVTable); + checkMovingGroundHook.RemoveGlobal((CCSPlayer_MovementServices*)&g_pCCSPlayer_MovementServicesVTable); + dropWeaponHook.RemoveGlobal((CCSPlayer_WeaponServices*)&g_pCCSPlayer_WeaponServicesVTable); + goToIntermissionHook.RemoveGlobal((CCSGameRules*)&g_pCCSGameRulesVTable); + playerEquipUseHook.RemoveGlobal((CGamePlayerEquip*)&g_pCGamePlayerEquipVTable); + playerEquipPrecacheHook.RemoveGlobal((CGamePlayerEquip*)&g_pCGamePlayerEquipVTable); + triggerGravityPrecacheHook.RemoveGlobal((CTriggerGravity*)&g_pTriggerGravityVTable); + triggerGravityEndTouchHook.RemoveGlobal((CTriggerGravity*)&g_pTriggerGravityVTable); + onTakeDamageAliveHook.RemoveGlobal((CCSPlayerPawn*)&g_pCCSPlayerPawnVTable); ConVar_Unregister(); @@ -583,8 +584,8 @@ KHook::Return CS2Fixes::Hook_DispatchConCommand(ICvar* pThis, ConCommandRe if (!bGagged && !bSilent && !bFlooding) { - auto originalFunc = *(std::function*)KHook::GetOriginalFunction(); - originalFunc(cmdHandle, ctx, args); + // TODO: upstream issue + //KHook::CallOriginal(&ICvar::DispatchConCommand, pThis, cmdHandle, ctx, args); } else if (bFlooding) { @@ -732,8 +733,8 @@ KHook::Return CS2Fixes::Hook_PostEventAbstract(IGameEventSystem* pThis, CS uint64 clientMask = *(uint64*)clients & g_playerManager->GetSilenceSoundMask(); - auto originalFunc = *(std::function*)KHook::GetOriginalFunction(); - originalFunc(nSlot, bLocalOnly, nClientCount, &clientMask, pEvent, msg, nSize, bufType); + // TODO: upstream issue + //KHook::CallOriginal(&IGameEventSystem::PostEventAbstract, pThis, nSlot, bLocalOnly, nClientCount, &clientMask, pEvent, msg, nSize, bufType); msg->set_weapon_id(weapon_id); msg->set_sound_type(sound_type); @@ -912,7 +913,6 @@ KHook::Return CS2Fixes::Hook_ClientConnect(IServerGameClients* pThis, CPla if (!g_playerManager->OnClientConnected(slot, xuid, pszNetworkID)) return {KHook::Action::Supersede, false}; - // TODO: verify true return isn't needed return {KHook::Action::Ignore}; } @@ -1081,11 +1081,11 @@ KHook::Return CS2Fixes::Hook_ApplyGameSettings(IServerGameDLL* pThis, KeyV return {KHook::Action::Ignore}; } -KHook::Return CS2Fixes::Hook_CreateWorkshopMapGroup(IGameTypes* pThis, const char* name, CUtlStringList& mapList) +KHook::Return CS2Fixes::Hook_CreateWorkshopMapGroup(IGameTypes* pThis, const char* name, const CUtlStringList& mapList) { - // TODO: does this even work? just guessing how param override might work in khook.. + // TODO: this isn't working even with recall, upstream issue? if (g_cvarVoteManagerEnable.Get() && g_pMapVoteSystem->IsMapListLoaded()) - mapList = g_pMapVoteSystem->CreateWorkshopMapGroup(); + KHook::Recall(KHook::Return{KHook::Action::Ignore}, pThis, name, g_pMapVoteSystem->CreateWorkshopMapGroup()); return {KHook::Action::Ignore}; } @@ -1126,7 +1126,6 @@ KHook::Return CS2Fixes::Hook_OnTakeDamage_Alive(CCSPlayerPawn* pPawn, CTak pPawn->DropMapWeapons(); } - // TODO: verify true return isn't needed return {KHook::Action::Ignore}; } @@ -1240,7 +1239,6 @@ KHook::Return CS2Fixes::Hook_LoadEventsFromFile(IGameEventManager2* pThis, { ExecuteOnce(g_gameEventManager = pThis); - // TODO: verify 0 return isn't needed return {KHook::Action::Ignore}; } diff --git a/src/cs2fixes.h b/src/cs2fixes.h index 28d41c954..231a77cdb 100644 --- a/src/cs2fixes.h +++ b/src/cs2fixes.h @@ -96,7 +96,7 @@ class CS2Fixes : public ISmmPlugin, public IMetamodListener, public ICS2Fixes KHook::Return Hook_LoadEventsFromFile(IGameEventManager2* pThis, const char* filename, bool bSearchAll); KHook::Return Hook_Spawn_Post(CEntitySystem* pThis, int nCount, const EntitySpawnInfo_t* pInfo); KHook::Return Hook_SetGameSpawnGroupMgr(INetworkGameServer* pThis, IGameSpawnGroupMgr* pSpawnGroupMgr); - KHook::Return Hook_CreateWorkshopMapGroup(IGameTypes* pThis, const char* name, CUtlStringList& mapList); + KHook::Return Hook_CreateWorkshopMapGroup(IGameTypes* pThis, const char* name, const CUtlStringList& mapList); KHook::Return Hook_GetTouchingList_Post(CVPhys2World* pThis, CUtlVector* pList, bool unknown); KHook::Return Hook_CheckMovingGround(CCSPlayer_MovementServices* pThis, double frametime); KHook::Return Hook_DropWeapon_Post(CCSPlayer_WeaponServices* pThis, CBasePlayerWeapon* pWeapon, Vector* pVecTarget, Vector* pVelocity); diff --git a/src/entwatch.cpp b/src/entwatch.cpp index 076c64a96..bf7dbd928 100644 --- a/src/entwatch.cpp +++ b/src/entwatch.cpp @@ -1356,20 +1356,23 @@ void CEWHandler::CreateHooks() return; } + //TODO: these hooks crash with khook for some reason + return; + baseButtonUseHook.Configure(offset); - baseButtonUseHook.AddGlobal(g_pCBaseButtonVTable); + baseButtonUseHook.AddGlobal((CBaseEntity*)&g_pCBaseButtonVTable); physBoxUseHook.Configure(offset); - physBoxUseHook.AddGlobal(g_pCPhysBoxVTable); + physBoxUseHook.AddGlobal((CBaseEntity*)&g_pCPhysBoxVTable); rotButtonUseHook.Configure(offset); - rotButtonUseHook.AddGlobal(g_pCRotButtonVTable); + rotButtonUseHook.AddGlobal((CBaseEntity*)&g_pCRotButtonVTable); momentaryRotButtonUseHook.Configure(offset); - momentaryRotButtonUseHook.AddGlobal(g_pCMomentaryRotButtonVTable); + momentaryRotButtonUseHook.AddGlobal((CBaseEntity*)&g_pCMomentaryRotButtonVTable); physicalButtonUseHook.Configure(offset); - physicalButtonUseHook.AddGlobal(g_pCPhysicalButtonVTable); + physicalButtonUseHook.AddGlobal((CBaseEntity*)&g_pCPhysicalButtonVTable); offset = g_GameConfig->GetOffset("CBaseEntity::StartTouch"); @@ -1380,13 +1383,13 @@ void CEWHandler::CreateHooks() } triggerTeleportStartTouchHook.Configure(offset); - triggerTeleportStartTouchHook.AddGlobal(g_pCTriggerTeleportVTable); + triggerTeleportStartTouchHook.AddGlobal((CBaseEntity*)&g_pCTriggerTeleportVTable); triggerOnceStartTouchHook.Configure(offset); - triggerOnceStartTouchHook.AddGlobal(g_pCTriggerOnceVTable); + triggerOnceStartTouchHook.AddGlobal((CBaseEntity*)&g_pCTriggerOnceVTable); triggerMultipleStartTouchHook.Configure(offset); - triggerMultipleStartTouchHook.AddGlobal(g_pCTriggerMultipleVTable); + triggerMultipleStartTouchHook.AddGlobal((CBaseEntity*)&g_pCTriggerMultipleVTable); offset = g_GameConfig->GetOffset("CBaseEntity::Touch"); @@ -1397,13 +1400,13 @@ void CEWHandler::CreateHooks() } triggerTeleportTouchHook.Configure(offset); - triggerTeleportTouchHook.AddGlobal(g_pCTriggerTeleportVTable); + triggerTeleportTouchHook.AddGlobal((CBaseEntity*)&g_pCTriggerTeleportVTable); triggerOnceTouchHook.Configure(offset); - triggerOnceTouchHook.AddGlobal(g_pCTriggerOnceVTable); + triggerOnceTouchHook.AddGlobal((CBaseEntity*)&g_pCTriggerOnceVTable); triggerMultipleTouchHook.Configure(offset); - triggerMultipleTouchHook.AddGlobal(g_pCTriggerMultipleVTable); + triggerMultipleTouchHook.AddGlobal((CBaseEntity*)&g_pCTriggerMultipleVTable); offset = g_GameConfig->GetOffset("CBaseEntity::EndTouch"); @@ -1414,31 +1417,31 @@ void CEWHandler::CreateHooks() } triggerTeleportEndTouchHook.Configure(offset); - triggerTeleportEndTouchHook.AddGlobal(g_pCTriggerTeleportVTable); + triggerTeleportEndTouchHook.AddGlobal((CBaseEntity*)&g_pCTriggerTeleportVTable); triggerOnceEndTouchHook.Configure(offset); - triggerOnceEndTouchHook.AddGlobal(g_pCTriggerOnceVTable); + triggerOnceEndTouchHook.AddGlobal((CBaseEntity*)&g_pCTriggerOnceVTable); triggerMultipleEndTouchHook.Configure(offset); - triggerMultipleEndTouchHook.AddGlobal(g_pCTriggerMultipleVTable); + triggerMultipleEndTouchHook.AddGlobal((CBaseEntity*)&g_pCTriggerMultipleVTable); } void CEWHandler::RemoveHooks() { - baseButtonUseHook.RemoveGlobal(g_pCBaseButtonVTable); - physBoxUseHook.RemoveGlobal(g_pCPhysBoxVTable); - rotButtonUseHook.RemoveGlobal(g_pCRotButtonVTable); - momentaryRotButtonUseHook.RemoveGlobal(g_pCMomentaryRotButtonVTable); - physicalButtonUseHook.RemoveGlobal(g_pCPhysicalButtonVTable); - triggerTeleportStartTouchHook.RemoveGlobal(g_pCTriggerTeleportVTable); - triggerOnceStartTouchHook.RemoveGlobal(g_pCTriggerOnceVTable); - triggerMultipleStartTouchHook.RemoveGlobal(g_pCTriggerMultipleVTable); - triggerTeleportTouchHook.RemoveGlobal(g_pCTriggerTeleportVTable); - triggerOnceTouchHook.RemoveGlobal(g_pCTriggerOnceVTable); - triggerMultipleTouchHook.RemoveGlobal(g_pCTriggerMultipleVTable); - triggerTeleportEndTouchHook.RemoveGlobal(g_pCTriggerTeleportVTable); - triggerOnceEndTouchHook.RemoveGlobal(g_pCTriggerOnceVTable); - triggerMultipleEndTouchHook.RemoveGlobal(g_pCTriggerMultipleVTable); + baseButtonUseHook.RemoveGlobal((CBaseEntity*)&g_pCBaseButtonVTable); + physBoxUseHook.RemoveGlobal((CBaseEntity*)&g_pCPhysBoxVTable); + rotButtonUseHook.RemoveGlobal((CBaseEntity*)&g_pCRotButtonVTable); + momentaryRotButtonUseHook.RemoveGlobal((CBaseEntity*)&g_pCMomentaryRotButtonVTable); + physicalButtonUseHook.RemoveGlobal((CBaseEntity*)&g_pCPhysicalButtonVTable); + triggerTeleportStartTouchHook.RemoveGlobal((CBaseEntity*)&g_pCTriggerTeleportVTable); + triggerOnceStartTouchHook.RemoveGlobal((CBaseEntity*)&g_pCTriggerOnceVTable); + triggerMultipleStartTouchHook.RemoveGlobal((CBaseEntity*)&g_pCTriggerMultipleVTable); + triggerTeleportTouchHook.RemoveGlobal((CBaseEntity*)&g_pCTriggerTeleportVTable); + triggerOnceTouchHook.RemoveGlobal((CBaseEntity*)&g_pCTriggerOnceVTable); + triggerMultipleTouchHook.RemoveGlobal((CBaseEntity*)&g_pCTriggerMultipleVTable); + triggerTeleportEndTouchHook.RemoveGlobal((CBaseEntity*)&g_pCTriggerTeleportVTable); + triggerOnceEndTouchHook.RemoveGlobal((CBaseEntity*)&g_pCTriggerOnceVTable); + triggerMultipleEndTouchHook.RemoveGlobal((CBaseEntity*)&g_pCTriggerMultipleVTable); } KHook::Return CEWHandler::Hook_Touch(CBaseEntity* pThis, CBaseEntity* pOther) From 644af85f8b5a715c2c3afdd09970ea0b40489a79 Mon Sep 17 00:00:00 2001 From: Vauff Date: Wed, 11 Mar 2026 17:23:05 -0400 Subject: [PATCH 12/24] more fixes --- src/cs2fixes.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/cs2fixes.cpp b/src/cs2fixes.cpp index 4c811502b..5e679974b 100644 --- a/src/cs2fixes.cpp +++ b/src/cs2fixes.cpp @@ -584,8 +584,7 @@ KHook::Return CS2Fixes::Hook_DispatchConCommand(ICvar* pThis, ConCommandRe if (!bGagged && !bSilent && !bFlooding) { - // TODO: upstream issue - //KHook::CallOriginal(&ICvar::DispatchConCommand, pThis, cmdHandle, ctx, args); + KHook::CallOriginal(&ICvar::DispatchConCommand, pThis, cmdHandle, ctx, args); } else if (bFlooding) { @@ -733,7 +732,7 @@ KHook::Return CS2Fixes::Hook_PostEventAbstract(IGameEventSystem* pThis, CS uint64 clientMask = *(uint64*)clients & g_playerManager->GetSilenceSoundMask(); - // TODO: upstream issue + // TODO: not doing something right with params //KHook::CallOriginal(&IGameEventSystem::PostEventAbstract, pThis, nSlot, bLocalOnly, nClientCount, &clientMask, pEvent, msg, nSize, bufType); msg->set_weapon_id(weapon_id); @@ -1083,9 +1082,8 @@ KHook::Return CS2Fixes::Hook_ApplyGameSettings(IServerGameDLL* pThis, KeyV KHook::Return CS2Fixes::Hook_CreateWorkshopMapGroup(IGameTypes* pThis, const char* name, const CUtlStringList& mapList) { - // TODO: this isn't working even with recall, upstream issue? if (g_cvarVoteManagerEnable.Get() && g_pMapVoteSystem->IsMapListLoaded()) - KHook::Recall(KHook::Return{KHook::Action::Ignore}, pThis, name, g_pMapVoteSystem->CreateWorkshopMapGroup()); + KHook::Recall(nullptr, {KHook::Action::Ignore}, pThis, name, g_pMapVoteSystem->CreateWorkshopMapGroup()); return {KHook::Action::Ignore}; } From 1a6664b514f8ce3f477bb7085ab7b64592d81a2d Mon Sep 17 00:00:00 2001 From: Vauff Date: Tue, 17 Mar 2026 13:39:53 -0400 Subject: [PATCH 13/24] "fix" another calloriginal --- src/cs2fixes.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cs2fixes.cpp b/src/cs2fixes.cpp index 5e679974b..2c404b1d2 100644 --- a/src/cs2fixes.cpp +++ b/src/cs2fixes.cpp @@ -732,8 +732,8 @@ KHook::Return CS2Fixes::Hook_PostEventAbstract(IGameEventSystem* pThis, CS uint64 clientMask = *(uint64*)clients & g_playerManager->GetSilenceSoundMask(); - // TODO: not doing something right with params - //KHook::CallOriginal(&IGameEventSystem::PostEventAbstract, pThis, nSlot, bLocalOnly, nClientCount, &clientMask, pEvent, msg, nSize, bufType); + // TODO: this crashes, borked in khook for some reason + //KHook::CallOriginal(nullptr, pThis, nSlot, bLocalOnly, nClientCount, &clientMask, pEvent, msg, nSize, bufType); msg->set_weapon_id(weapon_id); msg->set_sound_type(sound_type); From 2e79ae1bcdcf2bf1de962d78e4f935289b65fb2c Mon Sep 17 00:00:00 2001 From: Vauff Date: Wed, 8 Apr 2026 22:36:56 -0400 Subject: [PATCH 14/24] Fix EntWatch crashes --- src/cs2fixes.cpp | 4 -- src/entwatch.cpp | 122 ++++++++++++++++++++--------------------------- src/entwatch.h | 43 +++++++++++++++-- 3 files changed, 91 insertions(+), 78 deletions(-) diff --git a/src/cs2fixes.cpp b/src/cs2fixes.cpp index 2c404b1d2..a5fd2e6f2 100644 --- a/src/cs2fixes.cpp +++ b/src/cs2fixes.cpp @@ -395,7 +395,6 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool g_pEWHandler = new CEWHandler(); g_pMapMigrations = new CMapMigrations(); - g_pEWHandler->CreateHooks(); RegisterWeaponCommands(); // Check hide distance @@ -531,10 +530,7 @@ bool CS2Fixes::Unload(char* error, size_t maxlen) delete g_pPanoramaVoteHandler; if (g_pEWHandler) - { - g_pEWHandler->RemoveHooks(); delete g_pEWHandler; - } if (g_pMapMigrations) delete g_pMapMigrations; diff --git a/src/entwatch.cpp b/src/entwatch.cpp index bf7dbd928..bb7bb1cea 100644 --- a/src/entwatch.cpp +++ b/src/entwatch.cpp @@ -53,21 +53,6 @@ CEWHandler* g_pEWHandler = nullptr; -KHook::Virtual baseButtonUseHook(g_pEWHandler, &CEWHandler::Hook_Use, nullptr); -KHook::Virtual physBoxUseHook(g_pEWHandler, &CEWHandler::Hook_Use, nullptr); -KHook::Virtual rotButtonUseHook(g_pEWHandler, &CEWHandler::Hook_Use, nullptr); -KHook::Virtual momentaryRotButtonUseHook(g_pEWHandler, &CEWHandler::Hook_Use, nullptr); -KHook::Virtual physicalButtonUseHook(g_pEWHandler, &CEWHandler::Hook_Use, nullptr); -KHook::Virtual triggerTeleportStartTouchHook(g_pEWHandler, &CEWHandler::Hook_Touch, nullptr); -KHook::Virtual triggerOnceStartTouchHook(g_pEWHandler, &CEWHandler::Hook_Touch, nullptr); -KHook::Virtual triggerMultipleStartTouchHook(g_pEWHandler, &CEWHandler::Hook_Touch, nullptr); -KHook::Virtual triggerTeleportTouchHook(g_pEWHandler, &CEWHandler::Hook_Touch, nullptr); -KHook::Virtual triggerOnceTouchHook(g_pEWHandler, &CEWHandler::Hook_Touch, nullptr); -KHook::Virtual triggerMultipleTouchHook(g_pEWHandler, &CEWHandler::Hook_Touch, nullptr); -KHook::Virtual triggerTeleportEndTouchHook(g_pEWHandler, &CEWHandler::Hook_Touch, nullptr); -KHook::Virtual triggerOnceEndTouchHook(g_pEWHandler, &CEWHandler::Hook_Touch, nullptr); -KHook::Virtual triggerMultipleEndTouchHook(g_pEWHandler, &CEWHandler::Hook_Touch, nullptr); - CBaseEntity* g_pCBaseButtonVTable = nullptr; CBaseEntity* g_pCPhysBoxVTable = nullptr; CBaseEntity* g_pCRotButtonVTable = nullptr; @@ -1061,7 +1046,7 @@ bool EWItemInstance::IsEmpty() void CEWHandler::UnLoadConfig() { - if (!bConfigLoaded) + if (!m_bConfigLoaded) return; if (EW_IsFireOutputHooked()) @@ -1080,7 +1065,7 @@ void CEWHandler::UnLoadConfig() vecUseHookedEntities.clear(); vecHookedTriggers.clear(); - bConfigLoaded = false; + m_bConfigLoaded = false; } /* @@ -1144,13 +1129,13 @@ void CEWHandler::LoadConfig(const char* sFilePath) mapIOFunctions["entwatch"] = EW_FireOutput; } - bConfigLoaded = true; + m_bConfigLoaded = true; } void CEWHandler::PrintLoadedConfig(CPlayerSlot slot) { CCSPlayerController* player = CCSPlayerController::FromSlot(slot); - if (!bConfigLoaded) + if (!m_bConfigLoaded) { ClientPrint(player, HUD_PRINTTALK, EW_PREFIX "No config loaded."); return; @@ -1356,23 +1341,20 @@ void CEWHandler::CreateHooks() return; } - //TODO: these hooks crash with khook for some reason - return; - - baseButtonUseHook.Configure(offset); - baseButtonUseHook.AddGlobal((CBaseEntity*)&g_pCBaseButtonVTable); + m_hBaseButtonUse.Configure(offset); + m_hBaseButtonUse.AddGlobal((CBaseEntity*)&g_pCBaseButtonVTable); - physBoxUseHook.Configure(offset); - physBoxUseHook.AddGlobal((CBaseEntity*)&g_pCPhysBoxVTable); + m_hPhysBoxUse.Configure(offset); + m_hPhysBoxUse.AddGlobal((CBaseEntity*)&g_pCPhysBoxVTable); - rotButtonUseHook.Configure(offset); - rotButtonUseHook.AddGlobal((CBaseEntity*)&g_pCRotButtonVTable); + m_hRotButtonUse.Configure(offset); + m_hRotButtonUse.AddGlobal((CBaseEntity*)&g_pCRotButtonVTable); - momentaryRotButtonUseHook.Configure(offset); - momentaryRotButtonUseHook.AddGlobal((CBaseEntity*)&g_pCMomentaryRotButtonVTable); + m_hMomentaryRotButtonUse.Configure(offset); + m_hMomentaryRotButtonUse.AddGlobal((CBaseEntity*)&g_pCMomentaryRotButtonVTable); - physicalButtonUseHook.Configure(offset); - physicalButtonUseHook.AddGlobal((CBaseEntity*)&g_pCPhysicalButtonVTable); + m_hPhysicalButtonUse.Configure(offset); + m_hPhysicalButtonUse.AddGlobal((CBaseEntity*)&g_pCPhysicalButtonVTable); offset = g_GameConfig->GetOffset("CBaseEntity::StartTouch"); @@ -1382,14 +1364,14 @@ void CEWHandler::CreateHooks() return; } - triggerTeleportStartTouchHook.Configure(offset); - triggerTeleportStartTouchHook.AddGlobal((CBaseEntity*)&g_pCTriggerTeleportVTable); + m_hTriggerTeleportStartTouch.Configure(offset); + m_hTriggerTeleportStartTouch.AddGlobal((CBaseEntity*)&g_pCTriggerTeleportVTable); - triggerOnceStartTouchHook.Configure(offset); - triggerOnceStartTouchHook.AddGlobal((CBaseEntity*)&g_pCTriggerOnceVTable); + m_hTriggerOnceStartTouch.Configure(offset); + m_hTriggerOnceStartTouch.AddGlobal((CBaseEntity*)&g_pCTriggerOnceVTable); - triggerMultipleStartTouchHook.Configure(offset); - triggerMultipleStartTouchHook.AddGlobal((CBaseEntity*)&g_pCTriggerMultipleVTable); + m_hTriggerMultipleStartTouch.Configure(offset); + m_hTriggerMultipleStartTouch.AddGlobal((CBaseEntity*)&g_pCTriggerMultipleVTable); offset = g_GameConfig->GetOffset("CBaseEntity::Touch"); @@ -1399,14 +1381,14 @@ void CEWHandler::CreateHooks() return; } - triggerTeleportTouchHook.Configure(offset); - triggerTeleportTouchHook.AddGlobal((CBaseEntity*)&g_pCTriggerTeleportVTable); + m_hTriggerTeleportTouch.Configure(offset); + m_hTriggerTeleportTouch.AddGlobal((CBaseEntity*)&g_pCTriggerTeleportVTable); - triggerOnceTouchHook.Configure(offset); - triggerOnceTouchHook.AddGlobal((CBaseEntity*)&g_pCTriggerOnceVTable); + m_hTriggerOnceTouch.Configure(offset); + m_hTriggerOnceTouch.AddGlobal((CBaseEntity*)&g_pCTriggerOnceVTable); - triggerMultipleTouchHook.Configure(offset); - triggerMultipleTouchHook.AddGlobal((CBaseEntity*)&g_pCTriggerMultipleVTable); + m_hTriggerMultipleTouch.Configure(offset); + m_hTriggerMultipleTouch.AddGlobal((CBaseEntity*)&g_pCTriggerMultipleVTable); offset = g_GameConfig->GetOffset("CBaseEntity::EndTouch"); @@ -1416,32 +1398,32 @@ void CEWHandler::CreateHooks() return; } - triggerTeleportEndTouchHook.Configure(offset); - triggerTeleportEndTouchHook.AddGlobal((CBaseEntity*)&g_pCTriggerTeleportVTable); + m_hTriggerTeleportEndTouch.Configure(offset); + m_hTriggerTeleportEndTouch.AddGlobal((CBaseEntity*)&g_pCTriggerTeleportVTable); - triggerOnceEndTouchHook.Configure(offset); - triggerOnceEndTouchHook.AddGlobal((CBaseEntity*)&g_pCTriggerOnceVTable); + m_hTriggerOnceEndTouch.Configure(offset); + m_hTriggerOnceEndTouch.AddGlobal((CBaseEntity*)&g_pCTriggerOnceVTable); - triggerMultipleEndTouchHook.Configure(offset); - triggerMultipleEndTouchHook.AddGlobal((CBaseEntity*)&g_pCTriggerMultipleVTable); + m_hTriggerMultipleEndTouch.Configure(offset); + m_hTriggerMultipleEndTouch.AddGlobal((CBaseEntity*)&g_pCTriggerMultipleVTable); } void CEWHandler::RemoveHooks() { - baseButtonUseHook.RemoveGlobal((CBaseEntity*)&g_pCBaseButtonVTable); - physBoxUseHook.RemoveGlobal((CBaseEntity*)&g_pCPhysBoxVTable); - rotButtonUseHook.RemoveGlobal((CBaseEntity*)&g_pCRotButtonVTable); - momentaryRotButtonUseHook.RemoveGlobal((CBaseEntity*)&g_pCMomentaryRotButtonVTable); - physicalButtonUseHook.RemoveGlobal((CBaseEntity*)&g_pCPhysicalButtonVTable); - triggerTeleportStartTouchHook.RemoveGlobal((CBaseEntity*)&g_pCTriggerTeleportVTable); - triggerOnceStartTouchHook.RemoveGlobal((CBaseEntity*)&g_pCTriggerOnceVTable); - triggerMultipleStartTouchHook.RemoveGlobal((CBaseEntity*)&g_pCTriggerMultipleVTable); - triggerTeleportTouchHook.RemoveGlobal((CBaseEntity*)&g_pCTriggerTeleportVTable); - triggerOnceTouchHook.RemoveGlobal((CBaseEntity*)&g_pCTriggerOnceVTable); - triggerMultipleTouchHook.RemoveGlobal((CBaseEntity*)&g_pCTriggerMultipleVTable); - triggerTeleportEndTouchHook.RemoveGlobal((CBaseEntity*)&g_pCTriggerTeleportVTable); - triggerOnceEndTouchHook.RemoveGlobal((CBaseEntity*)&g_pCTriggerOnceVTable); - triggerMultipleEndTouchHook.RemoveGlobal((CBaseEntity*)&g_pCTriggerMultipleVTable); + m_hBaseButtonUse.RemoveGlobal((CBaseEntity*)&g_pCBaseButtonVTable); + m_hPhysBoxUse.RemoveGlobal((CBaseEntity*)&g_pCPhysBoxVTable); + m_hRotButtonUse.RemoveGlobal((CBaseEntity*)&g_pCRotButtonVTable); + m_hMomentaryRotButtonUse.RemoveGlobal((CBaseEntity*)&g_pCMomentaryRotButtonVTable); + m_hPhysicalButtonUse.RemoveGlobal((CBaseEntity*)&g_pCPhysicalButtonVTable); + m_hTriggerTeleportStartTouch.RemoveGlobal((CBaseEntity*)&g_pCTriggerTeleportVTable); + m_hTriggerOnceStartTouch.RemoveGlobal((CBaseEntity*)&g_pCTriggerOnceVTable); + m_hTriggerMultipleStartTouch.RemoveGlobal((CBaseEntity*)&g_pCTriggerMultipleVTable); + m_hTriggerTeleportTouch.RemoveGlobal((CBaseEntity*)&g_pCTriggerTeleportVTable); + m_hTriggerOnceTouch.RemoveGlobal((CBaseEntity*)&g_pCTriggerOnceVTable); + m_hTriggerMultipleTouch.RemoveGlobal((CBaseEntity*)&g_pCTriggerMultipleVTable); + m_hTriggerTeleportEndTouch.RemoveGlobal((CBaseEntity*)&g_pCTriggerTeleportVTable); + m_hTriggerOnceEndTouch.RemoveGlobal((CBaseEntity*)&g_pCTriggerOnceVTable); + m_hTriggerMultipleEndTouch.RemoveGlobal((CBaseEntity*)&g_pCTriggerMultipleVTable); } KHook::Return CEWHandler::Hook_Touch(CBaseEntity* pThis, CBaseEntity* pOther) @@ -2029,7 +2011,7 @@ void EW_RoundPreStart() void EW_OnEntitySpawned(CEntityInstance* pEntity) { - if (!g_pEWHandler || !g_pEWHandler->bConfigLoaded) + if (!g_pEWHandler || !g_pEWHandler->m_bConfigLoaded) return; CBaseEntity* pEnt = (CBaseEntity*)pEntity; @@ -2075,7 +2057,7 @@ void EW_OnEntitySpawned(CEntityInstance* pEntity) void EW_OnEntityDeleted(CEntityInstance* pEntity) { - if (!g_pEWHandler || !g_pEWHandler->bConfigLoaded) + if (!g_pEWHandler || !g_pEWHandler->m_bConfigLoaded) return; CBaseEntity* pEnt = (CBaseEntity*)pEntity; @@ -2110,7 +2092,7 @@ void EW_OnWeaponDeleted(CBaseEntity* pEntity) bool EW_Detour_CCSPlayer_WeaponServices_CanUse(CCSPlayer_WeaponServices* pWeaponServices, CBasePlayerWeapon* pPlayerWeapon) { // false=block it, true=dont block it - if (!g_pEWHandler || !g_pEWHandler->bConfigLoaded) + if (!g_pEWHandler || !g_pEWHandler->m_bConfigLoaded) return true; CCSPlayerPawn* pPawn = pWeaponServices->GetPawn(); @@ -2154,7 +2136,7 @@ bool EW_Detour_CCSPlayer_WeaponServices_CanUse(CCSPlayer_WeaponServices* pWeapon void EW_Detour_CCSPlayer_WeaponServices_EquipWeapon(CCSPlayer_WeaponServices* pWeaponServices, CBasePlayerWeapon* pWeapon) { - if (!g_pEWHandler || !g_pEWHandler->bConfigLoaded) + if (!g_pEWHandler || !g_pEWHandler->m_bConfigLoaded) return; CCSPlayerPawn* pPawn = pWeaponServices->GetPawn(); @@ -2174,7 +2156,7 @@ void EW_Detour_CCSPlayer_WeaponServices_EquipWeapon(CCSPlayer_WeaponServices* pW void EW_DropWeapon(CCSPlayer_WeaponServices* pWeaponServices, CBasePlayerWeapon* pWeapon) { - if (!g_pEWHandler || !g_pEWHandler->bConfigLoaded) + if (!g_pEWHandler || !g_pEWHandler->m_bConfigLoaded) return; CCSPlayerPawn* pPawn = pWeaponServices->GetPawn(); @@ -2343,7 +2325,7 @@ CON_COMMAND_CHAT_FLAGS(ew_reload, "- Reloads the current map's entwatch config", // LoadConfig unloads the current config already g_pEWHandler->LoadMapConfig(GetGlobals()->mapname.ToCStr()); - if (!g_pEWHandler->bConfigLoaded) + if (!g_pEWHandler->m_bConfigLoaded) { ClientPrint(player, HUD_PRINTTALK, EW_PREFIX "Error reloading config, check console log for details."); return; diff --git a/src/entwatch.h b/src/entwatch.h index 81c207659..5b9b11173 100644 --- a/src/entwatch.h +++ b/src/entwatch.h @@ -216,16 +216,35 @@ struct EActiveTransfer class CEWHandler { public: - CEWHandler() + CEWHandler() : + m_bConfigLoaded(false), + m_hBaseButtonUse(this, &CEWHandler::Hook_Use, nullptr), + m_hPhysBoxUse(this, &CEWHandler::Hook_Use, nullptr), + m_hRotButtonUse(this, &CEWHandler::Hook_Use, nullptr), + m_hMomentaryRotButtonUse(this, &CEWHandler::Hook_Use, nullptr), + m_hPhysicalButtonUse(this, &CEWHandler::Hook_Use, nullptr), + m_hTriggerTeleportStartTouch(this, &CEWHandler::Hook_Touch, nullptr), + m_hTriggerOnceStartTouch(this, &CEWHandler::Hook_Touch, nullptr), + m_hTriggerMultipleStartTouch(this, &CEWHandler::Hook_Touch, nullptr), + m_hTriggerTeleportTouch(this, &CEWHandler::Hook_Touch, nullptr), + m_hTriggerOnceTouch(this, &CEWHandler::Hook_Touch, nullptr), + m_hTriggerMultipleTouch(this, &CEWHandler::Hook_Touch, nullptr), + m_hTriggerTeleportEndTouch(this, &CEWHandler::Hook_Touch, nullptr), + m_hTriggerOnceEndTouch(this, &CEWHandler::Hook_Touch, nullptr), + m_hTriggerMultipleEndTouch(this, &CEWHandler::Hook_Touch, nullptr) { - bConfigLoaded = false; + CreateHooks(); + } + + ~CEWHandler() + { + RemoveHooks(); } void CreateHooks(); void RemoveHooks(); - bool bConfigLoaded; - bool IsConfigLoaded() { return bConfigLoaded; } + bool IsConfigLoaded() { return m_bConfigLoaded; } void UnLoadConfig(); void LoadMapConfig(const char* sMapName); @@ -263,9 +282,25 @@ class CEWHandler std::vector> vecUseHookedEntities; std::weak_ptr m_pHudTimer; + bool m_bConfigLoaded; std::map> mapTransfers; // Any etransfers that target multiple items std::vector> vecActiveTransfers; // Active transfers where only the receiver can pickup the weapon + + KHook::Virtual m_hBaseButtonUse; + KHook::Virtual m_hPhysBoxUse; + KHook::Virtual m_hRotButtonUse; + KHook::Virtual m_hMomentaryRotButtonUse; + KHook::Virtual m_hPhysicalButtonUse; + KHook::Virtual m_hTriggerTeleportStartTouch; + KHook::Virtual m_hTriggerOnceStartTouch; + KHook::Virtual m_hTriggerMultipleStartTouch; + KHook::Virtual m_hTriggerTeleportTouch; + KHook::Virtual m_hTriggerOnceTouch; + KHook::Virtual m_hTriggerMultipleTouch; + KHook::Virtual m_hTriggerTeleportEndTouch; + KHook::Virtual m_hTriggerOnceEndTouch; + KHook::Virtual m_hTriggerMultipleEndTouch; }; extern CEWHandler* g_pEWHandler; From f1c4dca633c0dba7c8ce39c406575cea61ffe20e Mon Sep 17 00:00:00 2001 From: Vauff Date: Fri, 10 Apr 2026 23:12:39 -0400 Subject: [PATCH 15/24] Re-enable GoToIntermission hook Seems to have stopped crashing? --- src/cs2fixes.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/cs2fixes.cpp b/src/cs2fixes.cpp index a5fd2e6f2..852ece2b9 100644 --- a/src/cs2fixes.cpp +++ b/src/cs2fixes.cpp @@ -300,8 +300,7 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool } goToIntermissionHook.Configure(offset); - // TODO: this crashes, borked in khook for some reason - //goToIntermissionHook.AddGlobal((CCSGameRules*)&g_pCCSGameRulesVTable); + goToIntermissionHook.AddGlobal((CCSGameRules*)&g_pCCSGameRulesVTable); g_pCGamePlayerEquipVTable = (CGamePlayerEquip*)modules::server->FindVirtualTable("CGamePlayerEquip"); if (!g_pCGamePlayerEquipVTable) From cac7bca926facb636690d79eca139801570f4d9d Mon Sep 17 00:00:00 2001 From: Vauff Date: Sat, 11 Apr 2026 10:23:15 -0400 Subject: [PATCH 16/24] Fix PostEventAbstract crash --- src/cs2fixes.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/cs2fixes.cpp b/src/cs2fixes.cpp index 852ece2b9..0c87427dc 100644 --- a/src/cs2fixes.cpp +++ b/src/cs2fixes.cpp @@ -727,8 +727,7 @@ KHook::Return CS2Fixes::Hook_PostEventAbstract(IGameEventSystem* pThis, CS uint64 clientMask = *(uint64*)clients & g_playerManager->GetSilenceSoundMask(); - // TODO: this crashes, borked in khook for some reason - //KHook::CallOriginal(nullptr, pThis, nSlot, bLocalOnly, nClientCount, &clientMask, pEvent, msg, nSize, bufType); + postEventAbstractHook.CallOriginal(pThis, nSlot, bLocalOnly, nClientCount, &clientMask, pEvent, msg, nSize, bufType); msg->set_weapon_id(weapon_id); msg->set_sound_type(sound_type); From c1b3be76d8ee7d1284389554e1aa04dcb5fe6093 Mon Sep 17 00:00:00 2001 From: Vauff Date: Mon, 1 Jun 2026 05:05:04 -0400 Subject: [PATCH 17/24] Migrate detour system to KHook --- AMBuilder | 7 - CS2Fixes.vcxproj | 21 +- CS2Fixes.vcxproj.filters | 3 - cfg/cs2fixes/cs2fixes.cfg | 4 +- src/buttonwatch.cpp | 23 +- src/buttonwatch.h | 3 +- src/cdetour.h | 153 -------- src/cs2fixes.cpp | 53 ++- src/cs2fixes.h | 1 + src/detours.cpp | 447 ++++++++++++---------- src/detours.h | 79 ++-- src/entities.cpp | 4 +- src/entities.h | 2 +- src/entwatch.cpp | 19 +- src/entwatch.h | 1 - vendor/funchook/LICENSE | 360 ----------------- vendor/funchook/README.md | 273 ------------- vendor/funchook/include/funchook.h | 167 -------- vendor/funchook/lib/Debug/distorm.lib | Bin 167786 -> 0 bytes vendor/funchook/lib/Debug/distorm.pdb | Bin 110592 -> 0 bytes vendor/funchook/lib/Debug/funchook.lib | Bin 227472 -> 0 bytes vendor/funchook/lib/Debug/funchook.pdb | Bin 143360 -> 0 bytes vendor/funchook/lib/Debug/libdistorm.a | Bin 380066 -> 0 bytes vendor/funchook/lib/Debug/libfunchook.a | Bin 172680 -> 0 bytes vendor/funchook/lib/Release/distorm.lib | Bin 80218 -> 0 bytes vendor/funchook/lib/Release/funchook.lib | Bin 71794 -> 0 bytes vendor/funchook/lib/Release/libdistorm.a | Bin 85698 -> 0 bytes vendor/funchook/lib/Release/libfunchook.a | Bin 46806 -> 0 bytes 28 files changed, 327 insertions(+), 1293 deletions(-) delete mode 100644 src/cdetour.h delete mode 100644 vendor/funchook/LICENSE delete mode 100644 vendor/funchook/README.md delete mode 100644 vendor/funchook/include/funchook.h delete mode 100644 vendor/funchook/lib/Debug/distorm.lib delete mode 100644 vendor/funchook/lib/Debug/distorm.pdb delete mode 100644 vendor/funchook/lib/Debug/funchook.lib delete mode 100644 vendor/funchook/lib/Debug/funchook.pdb delete mode 100644 vendor/funchook/lib/Debug/libdistorm.a delete mode 100644 vendor/funchook/lib/Debug/libfunchook.a delete mode 100644 vendor/funchook/lib/Release/distorm.lib delete mode 100644 vendor/funchook/lib/Release/funchook.lib delete mode 100644 vendor/funchook/lib/Release/libdistorm.a delete mode 100644 vendor/funchook/lib/Release/libfunchook.a diff --git a/AMBuilder b/AMBuilder index bb02216f2..d48208dcd 100644 --- a/AMBuilder +++ b/AMBuilder @@ -13,23 +13,16 @@ for sdk_target in MMSPlugin.sdk_targets: os.path.join(builder.sourcePath, 'src', 'utils'), os.path.join(builder.sourcePath, 'public'), os.path.join(builder.sourcePath, 'sdk', 'thirdparty', 'protobuf-3.21.8', 'src'), - os.path.join(builder.sourcePath, 'vendor', 'funchook', 'include'), ] - target_folder = 'Debug' if builder.options.debug else 'Release' - if binary.compiler.target.platform == 'linux': binary.compiler.postlink += [ - os.path.join(builder.sourcePath, 'vendor', 'funchook', 'lib', target_folder, 'libfunchook.a'), - os.path.join(builder.sourcePath, 'vendor', 'funchook', 'lib', target_folder, 'libdistorm.a'), os.path.join(builder.sourcePath, 'sdk', 'lib', 'linux64', 'release', 'libprotobuf.a'), ] binary.sources += ['src/utils/plat_unix.cpp'] elif binary.compiler.target.platform == 'windows': binary.compiler.postlink += [ os.path.join('psapi.lib'), - os.path.join(builder.sourcePath, 'vendor', 'funchook', 'lib', target_folder, 'funchook.lib'), - os.path.join(builder.sourcePath, 'vendor', 'funchook', 'lib', target_folder, 'distorm.lib'), os.path.join(builder.sourcePath, 'sdk', 'lib' ,'public', 'win64', '2015', 'libprotobuf.lib'), os.path.join(builder.sourcePath, 'sdk', 'lib', 'public', 'win64', 'steam_api64.lib') ] diff --git a/CS2Fixes.vcxproj b/CS2Fixes.vcxproj index 5f8ed2e59..e564762d4 100644 --- a/CS2Fixes.vcxproj +++ b/CS2Fixes.vcxproj @@ -73,12 +73,12 @@ cs2fixes - sdk\lib\public\win64;vendor/funchook/lib;$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64) + sdk\lib\public\win64;$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64) $(SolutionDir)/package/addons/cs2fixes/bin/win64/ cs2fixes - sdk\lib\public\win64;vendor/funchook/lib;$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64) + sdk\lib\public\win64;$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64) $(SolutionDir)/package/addons/cs2fixes/bin/win64/ @@ -119,12 +119,12 @@ Level3 true - __STDC_LIMIT_MACROS;X64BITS;WIN32;COMPILER_MSVC;COMPILER_MSVC64;_CRT_NO_VA_START_VALIDATION;_ITERATOR_DEBUG_LEVEL=0;_DEBUG;CS2Fixes_EXPORTS;_WINDOWS;_USRDLL;META_IS_SOURCE2;SUBHOOK_STATIC;%(PreprocessorDefinitions) + __STDC_LIMIT_MACROS;X64BITS;WIN32;COMPILER_MSVC;COMPILER_MSVC64;_CRT_NO_VA_START_VALIDATION;_ITERATOR_DEBUG_LEVEL=0;_DEBUG;CS2Fixes_EXPORTS;_WINDOWS;_USRDLL;META_IS_SOURCE2;%(PreprocessorDefinitions) true NotUsing pch.h stdcpp20 - build/cs2fixes.cs2/windows-x86_64;src/utils;src/cs2_sdk;sdk/public;sdk/public/tier0;sdk/game/shared;sdk/game/server;sdk/public/tier1;sdk/public/mathlib;minhook/include;$(MMSOURCE112)/core;$(MMSOURCE112)/third_party/khook/include;$(MMSOURCE_DEV)/core;$(MMSOURCE_DEV)/third_party/khook/include;vendor/subhook;vendor/funchook/include;sdk/public/entity2;sdk/public/game/server;sdk/thirdparty/protobuf-3.21.8/src;$(SolutionDir);%(AdditionalIncludeDirectories) + build/cs2fixes.cs2/windows-x86_64;src/utils;src/cs2_sdk;sdk/public;sdk/public/tier0;sdk/game/shared;sdk/game/server;sdk/public/tier1;sdk/public/mathlib;$(MMSOURCE112)/core;$(MMSOURCE112)/third_party/khook/include;$(MMSOURCE_DEV)/core;$(MMSOURCE_DEV)/third_party/khook/include;sdk/public/entity2;sdk/public/game/server;sdk/thirdparty/protobuf-3.21.8/src;$(SolutionDir);%(AdditionalIncludeDirectories) %(UndefinePreprocessorDefinitions) MultiThreadedDebug true @@ -133,8 +133,8 @@ Windows true false - interfaces.lib;mathlib.lib;tier0.lib;tier1.lib;psapi.lib;funchook.lib;distorm.lib;steam_api64.lib;vendor/protobuf-lib/Debug/libprotobufd.lib;$(CoreLibraryDependencies);%(AdditionalDependencies) - sdk/lib/public/win64;vendor/funchook/lib/Debug;%(AdditionalLibraryDirectories) + interfaces.lib;mathlib.lib;tier0.lib;tier1.lib;psapi.lib;steam_api64.lib;vendor/protobuf-lib/Debug/libprotobufd.lib;$(CoreLibraryDependencies);%(AdditionalDependencies) + sdk/lib/public/win64;%(AdditionalLibraryDirectories) @@ -145,12 +145,12 @@ true true true - __STDC_LIMIT_MACROS;X64BITS;WIN32;COMPILER_MSVC;COMPILER_MSVC64;_CRT_NO_VA_START_VALIDATION;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_WINDOWS;CS2Fixes_EXPORTS;_USRDLL;META_IS_SOURCE2;SUBHOOK_STATIC;%(PreprocessorDefinitions) + __STDC_LIMIT_MACROS;X64BITS;WIN32;COMPILER_MSVC;COMPILER_MSVC64;_CRT_NO_VA_START_VALIDATION;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_WINDOWS;CS2Fixes_EXPORTS;_USRDLL;META_IS_SOURCE2;%(PreprocessorDefinitions) Default NotUsing pch.h stdcpp20 - build/cs2fixes.cs2/windows-x86_64;src/utils;src/cs2_sdk;sdk/public;sdk/public/tier0;sdk/game/shared;sdk/game/server;sdk/public/tier1;sdk/public/mathlib;minhook/include;$(MMSOURCE112)/core;$(MMSOURCE112)/third_party/khook/include;$(MMSOURCE_DEV)/core;$(MMSOURCE_DEV)/third_party/khook/include;vendor/subhook;vendor/funchook/include;sdk/public/entity2;sdk/public/game/server;sdk/thirdparty/protobuf-3.21.8/src;$(SolutionDir);%(AdditionalIncludeDirectories) + build/cs2fixes.cs2/windows-x86_64;src/utils;src/cs2_sdk;sdk/public;sdk/public/tier0;sdk/game/shared;sdk/game/server;sdk/public/tier1;sdk/public/mathlib;$(MMSOURCE112)/core;$(MMSOURCE112)/third_party/khook/include;$(MMSOURCE_DEV)/core;$(MMSOURCE_DEV)/third_party/khook/include;sdk/public/entity2;sdk/public/game/server;sdk/thirdparty/protobuf-3.21.8/src;$(SolutionDir);%(AdditionalIncludeDirectories) MultiThreaded %(UndefinePreprocessorDefinitions) true @@ -161,8 +161,8 @@ true true false - interfaces.lib;mathlib.lib;tier0.lib;tier1.lib;psapi.lib;funchook.lib;distorm.lib;steam_api64.lib;vendor/protobuf-lib/Release/libprotobuf.lib;$(CoreLibraryDependencies);%(AdditionalDependencies) - sdk/lib/public/win64;vendor/funchook/lib/Release;%(AdditionalLibraryDirectories) + interfaces.lib;mathlib.lib;tier0.lib;tier1.lib;psapi.lib;steam_api64.lib;vendor/protobuf-lib/Release/libprotobuf.lib;$(CoreLibraryDependencies);%(AdditionalDependencies) + sdk/lib/public/win64;%(AdditionalLibraryDirectories) @@ -262,7 +262,6 @@ - diff --git a/CS2Fixes.vcxproj.filters b/CS2Fixes.vcxproj.filters index 68bb9f351..2696c312e 100644 --- a/CS2Fixes.vcxproj.filters +++ b/CS2Fixes.vcxproj.filters @@ -253,9 +253,6 @@ Header Files - - Header Files - Header Files diff --git a/cfg/cs2fixes/cs2fixes.cfg b/cfg/cs2fixes/cs2fixes.cfg index b3819b0e4..a586683bc 100644 --- a/cfg/cs2fixes/cs2fixes.cfg +++ b/cfg/cs2fixes/cs2fixes.cfg @@ -152,10 +152,10 @@ cs2f_idle_kick_min_players 0 // Minimum amount of connected clients to kick id cs2f_idle_kick_admins 1 // Whether to kick idle players with ADMFLAG_GENERIC // Button watch -cs2f_enable_button_watch 0 // INCOMPATIBLE WITH CS#. Whether to enable button watch or not. +cs2f_enable_button_watch 0 // Whether to enable button watch or not. // EntWatch Settings -entwatch_enable 0 // INCOMPATIBLE WITH CS#. Whether to enable EntWatch features +entwatch_enable 0 // Whether to enable EntWatch features entwatch_auto_filter 1 // Whether to automatically block non-item holders from triggering uses entwatch_clantag 1 // Whether to set item holder's clantag and set 9999 score entwatch_hud 1 // Whether to enable the EntWatch hud and related commands diff --git a/src/buttonwatch.cpp b/src/buttonwatch.cpp index ace819a0f..b8e0c00a1 100644 --- a/src/buttonwatch.cpp +++ b/src/buttonwatch.cpp @@ -32,21 +32,11 @@ #include "entity/clogiccase.h" #include "entity/cpointviewcontrol.h" -CConVar g_cvarEnableButtonWatch( - "cs2f_enable_button_watch", FCVAR_NONE, "INCOMPATIBLE WITH CS#. Whether to enable button watch or not.", false, - [](CConVar* cvar, CSplitScreenSlot slot, const bool* new_val, const bool* old_val) { - if (!(*new_val) || !SetupFireOutputInternalDetour()) - { - mapIOFunctions.erase("buttonwatch"); - cvar->Set(false); - } - else if (!IsButtonWatchEnabled()) - mapIOFunctions["buttonwatch"] = ButtonWatch; - }); +CConVar g_cvarEnableButtonWatch("cs2f_enable_button_watch", FCVAR_NONE, "Whether to enable button watch or not.", false); CON_COMMAND_CHAT_FLAGS(bw, "- Toggle button watch display", ADMFLAG_GENERIC) { - if (!IsButtonWatchEnabled()) + if (!g_cvarEnableButtonWatch.Get()) { ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "Button watch is disabled on this server."); return; @@ -84,17 +74,10 @@ CON_COMMAND_CHAT_FLAGS(bw, "- Toggle button watch display", ADMFLAG_GENERIC) } } -bool IsButtonWatchEnabled() -{ - return std::any_of(mapIOFunctions.begin(), mapIOFunctions.end(), [](const auto& p) { - return p.first == "buttonwatch"; - }); -} - std::map mapRecentEnts; void ButtonWatch(const CEntityIOOutput* pThis, CEntityInstance* pActivator, CEntityInstance* pCaller, const CVariant* value, float flDelay) { - if (!IsButtonWatchEnabled() || !GetGlobals() || V_stricmp(pThis->m_pDesc->m_pName, "OnPressed") || !pActivator || !((CBaseEntity*)pActivator)->IsPawn() || !pCaller || mapRecentEnts.contains(pCaller->GetEntityIndex().Get())) + if (!GetGlobals() || V_stricmp(pThis->m_pDesc->m_pName, "OnPressed") || !pActivator || !((CBaseEntity*)pActivator)->IsPawn() || !pCaller || mapRecentEnts.contains(pCaller->GetEntityIndex().Get())) return; CCSPlayerController* ccsPlayer = CCSPlayerController::FromPawn(static_cast(pActivator)); diff --git a/src/buttonwatch.h b/src/buttonwatch.h index 1d22e9b4c..d7e9a825b 100644 --- a/src/buttonwatch.h +++ b/src/buttonwatch.h @@ -20,5 +20,6 @@ #pragma once #include "detours.h" -bool IsButtonWatchEnabled(); +extern CConVar g_cvarEnableButtonWatch; + void ButtonWatch(const CEntityIOOutput* pThis, CEntityInstance* pActivator, CEntityInstance* pCaller, const CVariant* value, float flDelay); \ No newline at end of file diff --git a/src/cdetour.h b/src/cdetour.h deleted file mode 100644 index 2c34db3cf..000000000 --- a/src/cdetour.h +++ /dev/null @@ -1,153 +0,0 @@ -/** - * ============================================================================= - * CS2Fixes - * Copyright (C) 2023-2026 Source2ZE - * ============================================================================= - * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, version 3.0, as published by the - * Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. - * - * You should have received a copy of the GNU General Public License along with - * this program. If not, see . - */ - -#pragma once -#include "addresses.h" -#include "funchook.h" -#include "gameconfig.h" -#include "module.h" -#include "plat.h" -#include "utlvector.h" -#include - -class CDetourBase -{ -public: - virtual const char* GetName() = 0; - virtual bool CreateDetour(CGameConfig* gameConfig) = 0; - virtual void FreeDetour() = 0; - virtual void EnableDetour() = 0; - virtual void DisableDetour() = 0; -}; - -extern CUtlVector g_vecDetours; - -template -class CDetour : public CDetourBase -{ -public: - CDetour(T* pfnDetour, const char* pszName); - - ~CDetour() - { - FreeDetour(); - } - - bool CreateDetour(CGameConfig* gameConfig) override; - void EnableDetour(); - void DisableDetour(); - void FreeDetour() override; - const char* GetName() override { return m_pszName; } - T* GetFunc() { return m_pfnFunc; } - - // Shorthand for calling original. - template - auto operator()(Args&&... args) - { - return std::invoke(m_pfnFunc, std::forward(args)...); - } - -private: - CModule** m_pModule; - T* m_pfnDetour; - const char* m_pszName; - byte* m_pSignature; - const char* m_pSymbol; - T* m_pfnFunc; - funchook_t* m_hook; - bool m_bInstalled; -}; - -template -CDetour::CDetour(T* pfnDetour, const char* pszName) : - m_pfnDetour(pfnDetour), m_pszName(pszName) -{ - m_hook = nullptr; - m_bInstalled = false; - m_pSignature = nullptr; - m_pSymbol = nullptr; - m_pModule = nullptr; - - g_vecDetours.AddToTail(this); -} - -template -bool CDetour::CreateDetour(CGameConfig* gameConfig) -{ - m_pfnFunc = (T*)gameConfig->ResolveSignature(m_pszName); - if (!m_pfnFunc) - return false; - - T* pFunc = m_pfnFunc; - - m_hook = funchook_create(); - funchook_prepare(m_hook, (void**)&m_pfnFunc, (void*)m_pfnDetour); - - Message("Detoured %s at 0x%p\n", m_pszName, pFunc); - return true; -} - -template -void CDetour::EnableDetour() -{ - if (!m_hook) - return; - - int error = funchook_install(m_hook, 0); - - if (!error) - m_bInstalled = true; - else - Warning("funchook_install error for %s: %d %s\n", m_pszName, error, funchook_error_message(m_hook)); -} - -template -void CDetour::DisableDetour() -{ - if (!m_hook) - return; - - int error = funchook_uninstall(m_hook, 0); - - if (!error) - m_bInstalled = false; - else - Warning("funchook_uninstall error for %s: %d %s\n", m_pszName, error, funchook_error_message(m_hook)); -} - -template -void CDetour::FreeDetour() -{ - if (!m_hook) - return; - - if (m_bInstalled) - DisableDetour(); - - int error = funchook_destroy(m_hook); - m_hook = nullptr; - - if (error == 0) - Message("Removed detour %s\n", m_pszName); - else - Warning("funchook_destroy error for %s: %d %s\n", m_pszName, error, funchook_error_message(m_hook)); -} - -#define DECLARE_DETOUR(name, detour) \ - CDetour name(detour, #name) diff --git a/src/cs2fixes.cpp b/src/cs2fixes.cpp index 499a1fbb4..d8a6c785d 100644 --- a/src/cs2fixes.cpp +++ b/src/cs2fixes.cpp @@ -115,6 +115,7 @@ CCSPlayerPawn* g_pCCSPlayerPawnVTable = nullptr; double g_flUniversalTime = 0.0; float g_flLastTickedTime = 0.0f; bool g_bHasTicked = false; +bool g_bRequiredInitLoaded = true; CGameEntitySystem* GameEntitySystem() { @@ -184,25 +185,22 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool checkTransmitHook.Add(g_pSource2GameEntities); dispatchConCommandHook.Add(g_pCVar); - bool bRequiredInitLoaded = true; - if (!addresses::Initialize(g_GameConfig)) - bRequiredInitLoaded = false; + g_bRequiredInitLoaded = false; if (!InitPatches(g_GameConfig)) - bRequiredInitLoaded = false; + g_bRequiredInitLoaded = false; - if (!InitDetours(g_GameConfig)) - bRequiredInitLoaded = false; + InitDetours(g_GameConfig); if (!InitGameSystems()) - bRequiredInitLoaded = false; + g_bRequiredInitLoaded = false; g_pCGameEventManagerVTable = (IGameEventManager2*)modules::server->FindVirtualTable("CGameEventManager"); if (!g_pCGameEventManagerVTable) { Panic("Failed to find CGameEventManager vtable\n"); - bRequiredInitLoaded = false; + g_bRequiredInitLoaded = false; } loadEventsFromFileHook.AddGlobal((IGameEventManager2*)&g_pCGameEventManagerVTable); @@ -211,7 +209,7 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool if (!g_pCEntitySystemVTable) { Panic("Failed to find CGameEntitySystem vtable\n"); - bRequiredInitLoaded = false; + g_bRequiredInitLoaded = false; } spawnHook.AddGlobal((CEntitySystem*)&g_pCEntitySystemVTable); @@ -220,7 +218,7 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool if (offset == -1) { Panic("Failed to find IGameTypes_CreateWorkshopMapGroup\n"); - bRequiredInitLoaded = false; + g_bRequiredInitLoaded = false; } createWorkshopMapGroupHook.Configure(offset); @@ -230,14 +228,14 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool if (!g_pCVPhys2WorldVTable) { Panic("Failed to find CVPhys2World vtable\n"); - bRequiredInitLoaded = false; + g_bRequiredInitLoaded = false; } offset = g_GameConfig->GetOffset("CVPhys2World::GetTouchingList"); if (offset == -1) { Panic("Failed to find offset for CVPhys2World::GetTouchingList\n"); - bRequiredInitLoaded = false; + g_bRequiredInitLoaded = false; } getTouchingListHook.Configure(offset); @@ -247,14 +245,14 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool if (!g_pCCSPlayer_MovementServicesVTable) { Panic("Failed to find CCSPlayer_MovementServices vtable\n"); - bRequiredInitLoaded = false; + g_bRequiredInitLoaded = false; } offset = g_GameConfig->GetOffset("CCSPlayer_MovementServices::CheckMovingGround"); if (offset == -1) { Panic("Failed to find offset for CCSPlayer_MovementServices::CheckMovingGround\n"); - bRequiredInitLoaded = false; + g_bRequiredInitLoaded = false; } checkMovingGroundHook.Configure(offset); @@ -264,14 +262,14 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool if (!g_pCCSPlayer_WeaponServicesVTable) { Panic("Failed to find CCSPlayer_WeaponServices vtable\n"); - bRequiredInitLoaded = false; + g_bRequiredInitLoaded = false; } offset = g_GameConfig->GetOffset("CCSPlayer_WeaponServices::DropWeapon"); if (offset == -1) { Panic("Failed to find offset for CCSPlayer_WeaponServices::DropWeapon\n"); - bRequiredInitLoaded = false; + g_bRequiredInitLoaded = false; } dropWeaponHook.Configure(offset); @@ -281,14 +279,14 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool if (!g_pCGamePlayerEquipVTable) { Panic("Failed to find CGamePlayerEquip vtable\n"); - bRequiredInitLoaded = false; + g_bRequiredInitLoaded = false; } offset = g_GameConfig->GetOffset("CBaseEntity::Use"); if (offset == -1) { Panic("Failed to find offset for CBaseEntity::Use\n"); - bRequiredInitLoaded = false; + g_bRequiredInitLoaded = false; } playerEquipUseHook.Configure(offset); @@ -298,7 +296,7 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool if (offset == -1) { Panic("Failed to find offset for CBaseEntity::Precache\n"); - bRequiredInitLoaded = false; + g_bRequiredInitLoaded = false; } playerEquipPrecacheHook.Configure(offset); @@ -308,7 +306,7 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool if (!g_pTriggerGravityVTable) { Panic("Failed to find CTriggerGravity vtable\n"); - bRequiredInitLoaded = false; + g_bRequiredInitLoaded = false; } triggerGravityPrecacheHook.Configure(offset); @@ -318,7 +316,7 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool if (offset == -1) { Panic("Failed to find offset for CBaseEntity::EndTouch\n"); - bRequiredInitLoaded = false; + g_bRequiredInitLoaded = false; } triggerGravityEndTouchHook.Configure(offset); @@ -328,14 +326,14 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool if (!g_pCCSPlayerPawnVTable) { Panic("Failed to find CCSPlayerPawn vtable\n"); - bRequiredInitLoaded = false; + g_bRequiredInitLoaded = false; } offset = g_GameConfig->GetOffset("CCSPlayerPawn::OnTakeDamage_Alive"); if (offset == -1) { Panic("Failed to find offset for CCSPlayerPawn::OnTakeDamage_Alive\n"); - bRequiredInitLoaded = false; + g_bRequiredInitLoaded = false; } onTakeDamageAliveHook.Configure(offset); @@ -345,13 +343,13 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool if (offset == -1) { Panic("Failed to find offset for Teleport\n"); - bRequiredInitLoaded = false; + g_bRequiredInitLoaded = false; } playerPawnTeleportHook.Configure(offset); playerPawnTeleportHook.AddGlobal((CCSPlayerPawn*)&g_pCCSPlayerPawnVTable); - if (!bRequiredInitLoaded) + if (!g_bRequiredInitLoaded) { snprintf(error, maxlen, "One or more address lookups, patches or detours failed, please refer to startup logs for more information"); return false; @@ -463,7 +461,6 @@ bool CS2Fixes::Unload(char* error, size_t maxlen) UnregisterGameSystem(); CommandList().clear(); - FlushAllDetours(); UndoPatches(); RemoveAllTimers(); UnregisterEventListeners(); @@ -564,7 +561,7 @@ KHook::Return CS2Fixes::Hook_DispatchConCommand(ICvar* pThis, ConCommandRe if (!bGagged && !bSilent && !bFlooding) { - KHook::CallOriginal(&ICvar::DispatchConCommand, pThis, cmdHandle, ctx, args); + dispatchConCommandHook.CallOriginal(pThis, cmdHandle, ctx, args); } else if (bFlooding) { @@ -1071,7 +1068,7 @@ KHook::Return CS2Fixes::Hook_ApplyGameSettings(IServerGameDLL* pThis, KeyV KHook::Return CS2Fixes::Hook_CreateWorkshopMapGroup(IGameTypes* pThis, const char* name, const CUtlStringList& mapList) { if (g_cvarVoteManagerEnable.Get() && g_pMapVoteSystem->IsMapListLoaded()) - KHook::Recall(nullptr, {KHook::Action::Ignore}, pThis, name, g_pMapVoteSystem->CreateWorkshopMapGroup()); + return KHook::Recall(nullptr, {KHook::Action::Ignore}, pThis, name, g_pMapVoteSystem->CreateWorkshopMapGroup()); return {KHook::Action::Ignore}; } diff --git a/src/cs2fixes.h b/src/cs2fixes.h index 37c50373b..643abc2cd 100644 --- a/src/cs2fixes.h +++ b/src/cs2fixes.h @@ -56,6 +56,7 @@ extern IVEngineServer2* g_pEngineServer2; extern CCSGameRules* g_pGameRules; extern CSpawnGroupMgrGameSystem* g_pSpawnGroupMgr; extern double g_flUniversalTime; +extern bool g_bRequiredInitLoaded; extern INetworkGameServer* GetNetworkGameServer(); extern CGlobalVars* GetGlobals(); extern CConVar g_cvarDropMapWeapons; diff --git a/src/detours.cpp b/src/detours.cpp index 683881c72..a93beac33 100644 --- a/src/detours.cpp +++ b/src/detours.cpp @@ -23,7 +23,6 @@ #include "addresses.h" #include "buttonwatch.h" -#include "cdetour.h" #include "commands.h" #include "common.h" #include "ctimer.h" @@ -56,45 +55,111 @@ #include "tier0/memdbgon.h" -CUtlVector g_vecDetours; - -DECLARE_DETOUR(UTIL_SayTextFilter, Detour_UTIL_SayTextFilter); -DECLARE_DETOUR(UTIL_SayText2Filter, Detour_UTIL_SayText2Filter); -DECLARE_DETOUR(IsHearingClient, Detour_IsHearingClient); -DECLARE_DETOUR(TriggerPush_Touch, Detour_TriggerPush_Touch); -DECLARE_DETOUR(CBaseEntity_TakeDamageOld, Detour_CBaseEntity_TakeDamageOld); -DECLARE_DETOUR(CCSPlayer_WeaponServices_CanUse, Detour_CCSPlayer_WeaponServices_CanUse); -DECLARE_DETOUR(CCSPlayer_WeaponServices_EquipWeapon, Detour_CCSPlayer_WeaponServices_EquipWeapon); -DECLARE_DETOUR(CEntityIdentity_AcceptInput, Detour_CEntityIdentity_AcceptInput); -DECLARE_DETOUR(CNavMesh_GetNearestNavArea, Detour_CNavMesh_GetNearestNavArea); -DECLARE_DETOUR(ProcessMovement, Detour_ProcessMovement); -DECLARE_DETOUR(ProcessUsercmds, Detour_ProcessUsercmds); -DECLARE_DETOUR(CGamePlayerEquip_InputTriggerForAllPlayers, Detour_CGamePlayerEquip_InputTriggerForAllPlayers); -DECLARE_DETOUR(CGamePlayerEquip_InputTriggerForActivatedPlayer, Detour_CGamePlayerEquip_InputTriggerForActivatedPlayer); -DECLARE_DETOUR(CTriggerGravity_GravityTouch, Detour_CTriggerGravity_GravityTouch); -DECLARE_DETOUR(GetFreeClient, Detour_GetFreeClient); +KHook::Member takeDamageOldHook(Detour_CBaseEntity_TakeDamageOld, Detour_CBaseEntity_TakeDamageOld_Post); +KHook::Member triggerPushTouchHook(Detour_TriggerPush_Touch, nullptr); +KHook::Function isHearingClientHook(Detour_IsHearingClient, nullptr); +KHook::Function sayTextFilterHook(Detour_UTIL_SayTextFilter, nullptr); +KHook::Function sayText2FilterHook(Detour_UTIL_SayText2Filter, nullptr); +KHook::Member canUseHook(Detour_CCSPlayer_WeaponServices_CanUse, nullptr); +KHook::Member equipWeaponHook(Detour_CCSPlayer_WeaponServices_EquipWeapon, nullptr); +KHook::Member acceptInputHook(Detour_CEntityIdentity_AcceptInput, nullptr); +KHook::Member getNearestNavAreaHook(Detour_CNavMesh_GetNearestNavArea, nullptr); +KHook::Member processMovementHook(Detour_ProcessMovement, Detour_ProcessMovement_Post); +KHook::Member processUsercmdsHook(Detour_ProcessUsercmds, nullptr); +KHook::Member inputTriggerForAllPlayersHook(Detour_CGamePlayerEquip_InputTriggerForAllPlayers, nullptr); +KHook::Member inputTriggerForActivatedPlayerHook(Detour_CGamePlayerEquip_InputTriggerForActivatedPlayer, nullptr); +KHook::Member gravityTouchHook(Detour_CTriggerGravity_GravityTouch, nullptr); +KHook::Function getFreeClientHook(Detour_GetFreeClient, nullptr); +KHook::Member getMaxSpeedHook(Detour_CCSPlayerPawn_GetMaxSpeed, nullptr); +KHook::Member findUseEntityHook(Detour_FindUseEntity, Detour_FindUseEntity_Post); +KHook::Function traceFuncHook(Detour_TraceFunc, nullptr); +KHook::Function traceShapeHook(Detour_TraceShape, nullptr); +KHook::Member fireOutputInternalHook(Detour_CEntityIOOutput_FireOutputInternal, nullptr); +#ifdef PLATFORM_WINDOWS +KHook::Member getEyePositionHook(Detour_CBasePlayerPawn_GetEyePosition, nullptr); +KHook::Member getEyeAnglesHook(Detour_CBasePlayerPawn_GetEyeAngles, nullptr); +#else +KHook::Member getEyePositionHook(Detour_CBasePlayerPawn_GetEyePosition, nullptr); +KHook::Member getEyeAnglesHook(Detour_CBasePlayerPawn_GetEyeAngles, nullptr); +#endif +KHook::Member inputTestActivatorHook(Detour_CBaseFilter_InputTestActivator, nullptr); +KHook::Function checkSteamBanHook(nullptr, Detour_GameSystem_Think_CheckSteamBan_Post); +KHook::Member canAcquireHook(Detour_CCSPlayer_ItemServices_CanAcquire, nullptr); +KHook::Function scriptSetModelHook(Detour_CS_Script_SetModel, Detour_CS_Script_SetModel_Post); +KHook::Member setModelHook(Detour_CBaseModelEntity_SetModel, nullptr); +KHook::Member goToIntermissionHook(Detour_CCSGameRules_GoToIntermission, nullptr); + +template +void SetupDetour(CGameConfig* gameConfig, KHook::Function& hook, const char* name) +{ + auto pfnFunc = reinterpret_cast(gameConfig->ResolveSignature(name)); + + if (!pfnFunc) + { + g_bRequiredInitLoaded = false; + return; + } + + hook.Configure(pfnFunc); + Message("Detoured %s at 0x%p\n", name, pfnFunc); +} + +template +void SetupDetour(CGameConfig* gameConfig, KHook::Member& hook, const char* name) +{ + void* pfnFunc = gameConfig->ResolveSignature(name); + + if (!pfnFunc) + { + g_bRequiredInitLoaded = false; + return; + } + + hook.Configure(pfnFunc); + Message("Detoured %s at 0x%p\n", name, pfnFunc); +} + +void InitDetours(CGameConfig* gameConfig) +{ + SetupDetour(gameConfig, takeDamageOldHook, "CBaseEntity_TakeDamageOld"); + SetupDetour(gameConfig, triggerPushTouchHook, "TriggerPush_Touch"); + SetupDetour(gameConfig, isHearingClientHook, "IsHearingClient"); + SetupDetour(gameConfig, sayTextFilterHook, "UTIL_SayTextFilter"); + SetupDetour(gameConfig, sayText2FilterHook, "UTIL_SayText2Filter"); + SetupDetour(gameConfig, canUseHook, "CCSPlayer_WeaponServices_CanUse"); + SetupDetour(gameConfig, equipWeaponHook, "CCSPlayer_WeaponServices_EquipWeapon"); + SetupDetour(gameConfig, acceptInputHook, "CEntityIdentity_AcceptInput"); + SetupDetour(gameConfig, getNearestNavAreaHook, "CNavMesh_GetNearestNavArea"); + SetupDetour(gameConfig, processMovementHook, "ProcessMovement"); + SetupDetour(gameConfig, processUsercmdsHook, "ProcessUsercmds"); + SetupDetour(gameConfig, inputTriggerForAllPlayersHook, "CGamePlayerEquip_InputTriggerForAllPlayers"); + SetupDetour(gameConfig, inputTriggerForActivatedPlayerHook, "CGamePlayerEquip_InputTriggerForActivatedPlayer"); + SetupDetour(gameConfig, gravityTouchHook, "CTriggerGravity_GravityTouch"); + SetupDetour(gameConfig, getFreeClientHook, "GetFreeClient"); #ifdef __linux__ -// Inlined by MSVC as of 2025-07-28 CS2 update -// TODO: Find some alternative that supports Windows -DECLARE_DETOUR(CCSPlayerPawn_GetMaxSpeed, Detour_CCSPlayerPawn_GetMaxSpeed); + // Inlined by MSVC as of 2025-07-28 CS2 update + // TODO: Find some alternative that supports Windows + SetupDetour(gameConfig, getMaxSpeedHook, "CCSPlayerPawn_GetMaxSpeed"); #endif -DECLARE_DETOUR(FindUseEntity, Detour_FindUseEntity); -DECLARE_DETOUR(TraceFunc, Detour_TraceFunc); -DECLARE_DETOUR(TraceShape, Detour_TraceShape); -DECLARE_DETOUR(CBasePlayerPawn_GetEyePosition, Detour_CBasePlayerPawn_GetEyePosition); -DECLARE_DETOUR(CBasePlayerPawn_GetEyeAngles, Detour_CBasePlayerPawn_GetEyeAngles); -DECLARE_DETOUR(CBaseFilter_InputTestActivator, Detour_CBaseFilter_InputTestActivator); -DECLARE_DETOUR(GameSystem_Think_CheckSteamBan, Detour_GameSystem_Think_CheckSteamBan); -DECLARE_DETOUR(CCSPlayer_ItemServices_CanAcquire, Detour_CCSPlayer_ItemServices_CanAcquire); -DECLARE_DETOUR(CS_Script_SetModel, Detour_CS_Script_SetModel); -DECLARE_DETOUR(CBaseModelEntity_SetModel, Detour_CBaseModelEntity_SetModel); -DECLARE_DETOUR(CCSGameRules_GoToIntermission, Detour_CCSGameRules_GoToIntermission); + SetupDetour(gameConfig, findUseEntityHook, "FindUseEntity"); + SetupDetour(gameConfig, traceFuncHook, "TraceFunc"); + SetupDetour(gameConfig, traceShapeHook, "TraceShape"); + SetupDetour(gameConfig, fireOutputInternalHook, "CEntityIOOutput_FireOutputInternal"); + SetupDetour(gameConfig, getEyePositionHook, "CBasePlayerPawn_GetEyePosition"); + SetupDetour(gameConfig, getEyeAnglesHook, "CBasePlayerPawn_GetEyeAngles"); + SetupDetour(gameConfig, inputTestActivatorHook, "CBaseFilter_InputTestActivator"); + SetupDetour(gameConfig, checkSteamBanHook, "GameSystem_Think_CheckSteamBan"); + SetupDetour(gameConfig, canAcquireHook, "CCSPlayer_ItemServices_CanAcquire"); + SetupDetour(gameConfig, scriptSetModelHook, "CS_Script_SetModel"); + SetupDetour(gameConfig, setModelHook, "CBaseModelEntity_SetModel"); + SetupDetour(gameConfig, goToIntermissionHook, "CCSGameRules_GoToIntermission"); +} CConVar g_cvarBlockMolotovSelfDmg("cs2f_block_molotov_self_dmg", FCVAR_NONE, "Whether to block self-damage from molotovs", false); CConVar g_cvarBlockAllDamage("cs2f_block_all_dmg", FCVAR_NONE, "Whether to block all damage to players", false); CConVar g_cvarFixBlockDamage("cs2f_fix_block_dmg", FCVAR_NONE, "Whether to fix block-damage on players", false); -int64 FASTCALL Detour_CBaseEntity_TakeDamageOld(CBaseEntity* pThis, CTakeDamageInfo* pInfo, CTakeDamageResult* pResult) +KHook::Return Detour_CBaseEntity_TakeDamageOld(CBaseEntity* pThis, CTakeDamageInfo* pInfo, CTakeDamageResult* pResult) { // NOTE valve always return 1 here, since 2025/10/15 update. @@ -117,7 +182,7 @@ int64 FASTCALL Detour_CBaseEntity_TakeDamageOld(CBaseEntity* pThis, CTakeDamageI // Block all player damage if desired if (g_cvarBlockAllDamage.Get() && pThis->IsPawn()) - return 1; + return {KHook::Action::Supersede, 1}; CEntityInstance* pInflictor = pInfo->m_hInflictor.Get(); const char* pszInflictorClass = pInflictor ? pInflictor->GetClassname() : ""; @@ -143,11 +208,11 @@ int64 FASTCALL Detour_CBaseEntity_TakeDamageOld(CBaseEntity* pThis, CTakeDamageI // Prevent molly on self if (g_cvarBlockMolotovSelfDmg.Get() && pInfo->m_hAttacker == pThis && !V_strncmp(pszInflictorClass, "inferno", 7)) - return 1; + return {KHook::Action::Supersede, 1}; // Fix disconnected players grenades being able to damage teammates if (!V_strcasecmp(pszInflictorClass, "hegrenade_projectile") && pInfo->m_AttackerInfo.m_bIsPawn && pInfo->m_AttackerInfo.m_nTeam == 0) - return 1; + return {KHook::Action::Supersede, 1}; // maybe call in flow CTakeDamageResult damageResult(0); @@ -155,50 +220,47 @@ int64 FASTCALL Detour_CBaseEntity_TakeDamageOld(CBaseEntity* pThis, CTakeDamageI if (pResult == nullptr) { damageResult.CopyFrom(pInfo); - pResult = &damageResult; + return KHook::Recall(nullptr, {KHook::Action::Ignore}, pThis, pInfo, &damageResult); } - CBaseEntity_TakeDamageOld(pThis, pInfo, pResult); + return {KHook::Action::Ignore}; +} +KHook::Return Detour_CBaseEntity_TakeDamageOld_Post(CBaseEntity* pThis, CTakeDamageInfo* pInfo, CTakeDamageResult* pResult) +{ if (pResult->m_flDamageDealt > 0.0f && !pResult->m_bWasDamageSuppressed && g_cvarEnableZR.Get() && pThis->IsPawn()) ZR_OnPlayerTakeDamage(reinterpret_cast(pThis), pInfo, pResult->m_flDamageDealt); - return 1; + return {KHook::Action::Ignore}; } CConVar g_cvarUseOldPush("cs2f_use_old_push", FCVAR_NONE, "Whether to use the old CSGO trigger_push behavior", false); CConVar g_cvarLogPushes("cs2f_log_pushes", FCVAR_NONE, "Whether to log pushes (cs2f_use_old_push must be enabled)", false); -void FASTCALL Detour_TriggerPush_Touch(CTriggerPush* pPush, CBaseEntity* pOther) +KHook::Return Detour_TriggerPush_Touch(CTriggerPush* pPush, CBaseEntity* pOther) { // This trigger pushes only once (and kills itself) or pushes only on StartTouch, both of which are fine already if (!g_cvarUseOldPush.Get() || pPush->m_spawnflags() & SF_TRIG_PUSH_ONCE || pPush->m_bTriggerOnStartTouch()) - { - TriggerPush_Touch(pPush, pOther); - return; - } + return {KHook::Action::Ignore}; MoveType_t movetype = pOther->m_nActualMoveType(); // VPhysics handling doesn't need any changes if (movetype == MOVETYPE_VPHYSICS) - { - TriggerPush_Touch(pPush, pOther); - return; - } + return {KHook::Action::Ignore}; if (movetype == MOVETYPE_NONE || movetype == MOVETYPE_PUSH || movetype == MOVETYPE_NOCLIP) - return; + return {KHook::Action::Supersede}; CCollisionProperty* collisionProp = pOther->m_pCollision(); if (!IsSolid(collisionProp->m_nSolidType(), collisionProp->m_usSolidFlags())) - return; + return {KHook::Action::Supersede}; if (!pPush->PassesTriggerFilters(pOther)) - return; + return {KHook::Action::Supersede}; if (pOther->m_CBodyComponent()->m_pSceneNode()->m_pParent()) - return; + return {KHook::Action::Supersede}; Vector vecAbsDir; matrix3x4_t matTransform = pPush->m_CBodyComponent()->m_pSceneNode()->EntityToWorldTransform(); @@ -241,24 +303,23 @@ void FASTCALL Detour_TriggerPush_Touch(CTriggerPush* pPush, CBaseEntity* pOther) flags |= (1 << 23); // TODO: is FL_BASEVELOCITY really gone? pOther->m_fFlags(flags); + + return {KHook::Action::Supersede}; } -bool FASTCALL Detour_IsHearingClient(void* serverClient, int index) +KHook::Return Detour_IsHearingClient(void* serverClient, int index) { ZEPlayer* player = g_playerManager->GetPlayer(index); if (player && player->IsMuted()) - return false; + return {KHook::Action::Supersede, false}; - return IsHearingClient(serverClient, index); + return {KHook::Action::Ignore}; } -void SayChatMessageWithTimer(IRecipientFilter& filter, const char* pText, CCSPlayerController* pPlayer, uint64 eMessageType) +KHook::Return SayChatMessageWithTimer(IRecipientFilter& filter, const char* pText, CCSPlayerController* pPlayer, uint64 eMessageType) { VPROF("SayChatMessageWithTimer"); - if (!GetGlobals() || !g_pGameRules) - return; - char buf[256]; // Filter console message - remove non-alphanumeric chars and convert to lowercase @@ -354,26 +415,26 @@ void SayChatMessageWithTimer(IRecipientFilter& filter, const char* pText, CCSPla else V_snprintf(buf, sizeof(buf), "%s %s", " \7CONSOLE:\4", pText + sizeof("Console:")); - UTIL_SayTextFilter(filter, buf, pPlayer, eMessageType); + return KHook::Recall(nullptr, {KHook::Action::Ignore}, filter, buf, pPlayer, eMessageType); } CConVar g_cvarEnableTriggerTimer("cs2f_trigger_timer_enable", FCVAR_NONE, "Whether to process countdown messages said by Console (e.g. Hold for 10 seconds) and append the round time where the countdown resolves", false); -void FASTCALL Detour_UTIL_SayTextFilter(IRecipientFilter& filter, const char* pText, CCSPlayerController* pPlayer, uint64 eMessageType) +KHook::Return Detour_UTIL_SayTextFilter(IRecipientFilter& filter, const char* pText, CCSPlayerController* pPlayer, uint64 eMessageType) { if (pPlayer) - return UTIL_SayTextFilter(filter, pText, pPlayer, eMessageType); + return {KHook::Action::Ignore}; - if (g_cvarEnableTriggerTimer.Get()) + if (g_cvarEnableTriggerTimer.Get() && GetGlobals() && g_pGameRules) return SayChatMessageWithTimer(filter, pText, pPlayer, eMessageType); char buf[256]; V_snprintf(buf, sizeof(buf), "%s %s", " \7CONSOLE:\4", pText + sizeof("Console:")); - UTIL_SayTextFilter(filter, buf, pPlayer, eMessageType); + return KHook::Recall(nullptr, {KHook::Action::Ignore}, filter, buf, pPlayer, eMessageType); } -void FASTCALL Detour_UTIL_SayText2Filter( +KHook::Return Detour_UTIL_SayText2Filter( IRecipientFilter& filter, CCSPlayerController* pEntity, uint64 eMessageType, @@ -391,25 +452,25 @@ void FASTCALL Detour_UTIL_SayText2Filter( Message("Chat from %s to %s: %s\n", param1, target->GetPlayerName().c_str(), param2); #endif - UTIL_SayText2Filter(filter, pEntity, eMessageType, msg_name, pEntity->GetPlayerName().c_str(), param2, param3, param4); + return KHook::Recall(nullptr, {KHook::Action::Ignore}, filter, pEntity, eMessageType, msg_name, pEntity->GetPlayerName().c_str(), param2, param3, param4); } -bool FASTCALL Detour_CCSPlayer_WeaponServices_CanUse(CCSPlayer_WeaponServices* pWeaponServices, CBasePlayerWeapon* pPlayerWeapon) +KHook::Return Detour_CCSPlayer_WeaponServices_CanUse(CCSPlayer_WeaponServices* pWeaponServices, CBasePlayerWeapon* pPlayerWeapon) { if (g_cvarEnableEntWatch.Get() && !EW_Detour_CCSPlayer_WeaponServices_CanUse(pWeaponServices, pPlayerWeapon)) - return false; + return {KHook::Action::Supersede, false}; - return CCSPlayer_WeaponServices_CanUse(pWeaponServices, pPlayerWeapon); + return {KHook::Action::Ignore}; } -void FASTCALL Detour_CCSPlayer_WeaponServices_EquipWeapon(CCSPlayer_WeaponServices* pWeaponServices, CBasePlayerWeapon* pPlayerWeapon) +KHook::Return Detour_CCSPlayer_WeaponServices_EquipWeapon(CCSPlayer_WeaponServices* pWeaponServices, CBasePlayerWeapon* pPlayerWeapon) { if (g_cvarEnableEntWatch.Get()) EW_Detour_CCSPlayer_WeaponServices_EquipWeapon(pWeaponServices, pPlayerWeapon); g_pMapMigrations->OnEquipWeapon(pPlayerWeapon); - return CCSPlayer_WeaponServices_EquipWeapon(pWeaponServices, pPlayerWeapon); + return {KHook::Action::Ignore}; } CConVar g_cvarDisableSetModel("cs2f_disable_setmodel", FCVAR_NONE, "Whether to disable SetModel usage from maps (custom input, cs_script function)", false); @@ -430,7 +491,7 @@ bool PrepareMapSetModel(CBaseModelEntity* pModel) return true; } -bool FASTCALL Detour_CEntityIdentity_AcceptInput(CEntityIdentity* pThis, CUtlSymbolLarge* pInputName, CEntityInstance* pActivator, CEntityInstance* pCaller, variant_t* value, int nOutputID, void* a7, void* a8) +KHook::Return Detour_CEntityIdentity_AcceptInput(CEntityIdentity* pThis, CUtlSymbolLarge* pInputName, CEntityInstance* pActivator, CEntityInstance* pCaller, variant_t* value, int nOutputID, void* a7, void* a8) { VPROF_SCOPE_BEGIN("Detour_CEntityIdentity_AcceptInput"); @@ -439,7 +500,7 @@ bool FASTCALL Detour_CEntityIdentity_AcceptInput(CEntityIdentity* pThis, CUtlSym bool result = ZR_Detour_CEntityIdentity_AcceptInput(pThis, pInputName, pActivator, pCaller, value, nOutputID); if (!result) - return result; + return {KHook::Action::Supersede, result}; } // Handle KeyValue(s) @@ -448,10 +509,10 @@ bool FASTCALL Detour_CEntityIdentity_AcceptInput(CEntityIdentity* pThis, CUtlSym if ((value->m_type == FIELD_CSTRING || value->m_type == FIELD_STRING) && value->m_pszString) { // always const char*, even if it's FIELD_STRING (that is bug string from lua 'EntFire') - return CustomIO_HandleInput(pThis->m_pInstance, value->m_pszString, pActivator, pCaller); + return {KHook::Action::Supersede, CustomIO_HandleInput(pThis->m_pInstance, value->m_pszString, pActivator, pCaller)}; } Message("Invalid value type for input %s\n", pInputName->String()); - return false; + return {KHook::Action::Supersede, false}; } if (!V_strnicmp(pInputName->String(), "IgniteL", 7)) // Override IgniteLifetime @@ -466,7 +527,7 @@ bool FASTCALL Detour_CEntityIdentity_AcceptInput(CEntityIdentity* pThis, CUtlSym CCSPlayerPawn* pPawn = reinterpret_cast(pThis->m_pInstance); if (pPawn->IsPawn() && IgnitePawn(pPawn, flDuration, pPawn, pPawn)) - return true; + return {KHook::Action::Supersede, true}; } else if (!V_strnicmp(pInputName->String(), "AddScore", 8)) { @@ -482,7 +543,7 @@ bool FASTCALL Detour_CEntityIdentity_AcceptInput(CEntityIdentity* pThis, CUtlSym if (pPawn->IsPawn() && pPawn->GetOriginalController()) { pPawn->GetOriginalController()->AddScore(iScore); - return true; + return {KHook::Action::Supersede, true}; } } else if (!V_strcasecmp(pInputName->String(), "SetMessage")) @@ -491,7 +552,7 @@ bool FASTCALL Detour_CEntityIdentity_AcceptInput(CEntityIdentity* pThis, CUtlSym { if ((value->m_type == FIELD_CSTRING || value->m_type == FIELD_STRING) && value->m_pszString) pHudHint->m_iszMessage(GameEntitySystem()->AllocPooledString(value->m_pszString)); - return true; + return {KHook::Action::Supersede, true}; } } else if (!V_strcasecmp(pInputName->String(), "SetModel")) @@ -501,69 +562,74 @@ bool FASTCALL Detour_CEntityIdentity_AcceptInput(CEntityIdentity* pThis, CUtlSym if ((value->m_type == FIELD_CSTRING || value->m_type == FIELD_STRING) && value->m_pszString && PrepareMapSetModel(pModelEntity)) pModelEntity->SetModel(value->m_pszString); - return true; + return {KHook::Action::Supersede, true}; } } else if (const auto pGameUI = reinterpret_cast(pThis->m_pInstance)->AsGameUI()) { if (!V_strcasecmp(pInputName->String(), "Activate")) - return CGameUIHandler::OnActivate(pGameUI, reinterpret_cast(pActivator)); + return {KHook::Action::Supersede, CGameUIHandler::OnActivate(pGameUI, reinterpret_cast(pActivator))}; if (!V_strcasecmp(pInputName->String(), "Deactivate")) - return CGameUIHandler::OnDeactivate(pGameUI, reinterpret_cast(pActivator)); + return {KHook::Action::Supersede, CGameUIHandler::OnDeactivate(pGameUI, reinterpret_cast(pActivator))}; } else if (const auto pViewControl = reinterpret_cast(pThis->m_pInstance)->AsPointViewControl()) { if (!V_strcasecmp(pInputName->String(), "EnableCamera")) - return CPointViewControlHandler::OnEnable(pViewControl, reinterpret_cast(pActivator)); + return {KHook::Action::Supersede, CPointViewControlHandler::OnEnable(pViewControl, reinterpret_cast(pActivator))}; if (!V_strcasecmp(pInputName->String(), "DisableCamera")) - return CPointViewControlHandler::OnDisable(pViewControl, reinterpret_cast(pActivator)); + return {KHook::Action::Supersede, CPointViewControlHandler::OnDisable(pViewControl, reinterpret_cast(pActivator))}; if (!V_strcasecmp(pInputName->String(), "EnableCameraAll")) - return CPointViewControlHandler::OnEnableAll(pViewControl); + return {KHook::Action::Supersede, CPointViewControlHandler::OnEnableAll(pViewControl)}; if (!V_strcasecmp(pInputName->String(), "DisableCameraAll")) - return CPointViewControlHandler::OnDisableAll(pViewControl); + return {KHook::Action::Supersede, CPointViewControlHandler::OnDisableAll(pViewControl)}; } VPROF_SCOPE_END(); - return CEntityIdentity_AcceptInput(pThis, pInputName, pActivator, pCaller, value, nOutputID, a7, a8); + return {KHook::Action::Ignore}; } CConVar g_cvarBlockNavLookup("cs2f_block_nav_lookup", FCVAR_NONE, "Whether to block navigation mesh lookup, improves server performance but breaks bot navigation", false); -void* FASTCALL Detour_CNavMesh_GetNearestNavArea(int64_t unk1, float* unk2, unsigned int* unk3, unsigned int unk4, int64_t unk5, float unk6, int64_t unk7) +KHook::Return Detour_CNavMesh_GetNearestNavArea(CNavMesh* pNavMesh, float* unk2, unsigned int* unk3, unsigned int unk4, int64_t unk5, float unk6, int64_t unk7) { if (g_cvarBlockNavLookup.Get()) - return nullptr; + return {KHook::Action::Supersede, nullptr}; - return CNavMesh_GetNearestNavArea(unk1, unk2, unk3, unk4, unk5, unk6, unk7); + return {KHook::Action::Ignore}; } -void FASTCALL Detour_ProcessMovement(CCSPlayer_MovementServices* pThis, void* pMove) +float g_flStoreFrametime = 0.0f; + +KHook::Return Detour_ProcessMovement(CCSPlayer_MovementServices* pThis, void* pMove) { CCSPlayerPawn* pPawn = pThis->GetPawn(); if (!pPawn->IsAlive() || !GetGlobals()) - return ProcessMovement(pThis, pMove); + return {KHook::Action::Ignore}; CCSPlayerController* pController = pPawn->GetOriginalController(); if (!pController || !pController->IsConnected()) - return ProcessMovement(pThis, pMove); + return {KHook::Action::Ignore}; float flSpeedMod = pController->GetZEPlayer()->GetSpeedMod(); if (flSpeedMod == 1.f) - return ProcessMovement(pThis, pMove); + return {KHook::Action::Ignore}; // Yes, this is what source1 does to scale player speed // Scale frametime during the entire movement processing step and revert right after - float flStoreFrametime = GetGlobals()->frametime; - + g_flStoreFrametime = GetGlobals()->frametime; GetGlobals()->frametime *= flSpeedMod; - ProcessMovement(pThis, pMove); + return {KHook::Action::Ignore}; +} - GetGlobals()->frametime = flStoreFrametime; +KHook::Return Detour_ProcessMovement_Post(CCSPlayer_MovementServices* pThis, void* pMove) +{ + GetGlobals()->frametime = g_flStoreFrametime; + return {KHook::Action::Ignore}; } CConVar g_cvarDisableSubtickMovement("cs2f_disable_subtick_move", FCVAR_NONE, "Whether to disable subtick movement", false); @@ -580,7 +646,7 @@ class CUserCmd #endif }; -void* FASTCALL Detour_ProcessUsercmds(CCSPlayerController* pController, CUserCmd* cmds, int numcmds, bool paused, float margin) +KHook::Return Detour_ProcessUsercmds(CCSPlayerController* pController, CUserCmd* cmds, int numcmds, bool paused, float margin) { VPROF_SCOPE_BEGIN("Detour_ProcessUsercmds"); @@ -626,40 +692,42 @@ void* FASTCALL Detour_ProcessUsercmds(CCSPlayerController* pController, CUserCmd VPROF_SCOPE_END(); - return ProcessUsercmds(pController, cmds, numcmds, paused, margin); + return {KHook::Action::Ignore}; } -void FASTCALL Detour_CGamePlayerEquip_InputTriggerForAllPlayers(CGamePlayerEquip* pEntity, InputData_t* pInput) +KHook::Return Detour_CGamePlayerEquip_InputTriggerForAllPlayers(CGamePlayerEquip* pEntity, InputData_t* pInput) { CGamePlayerEquipHandler::TriggerForAllPlayers(pEntity, pInput); - CGamePlayerEquip_InputTriggerForAllPlayers(pEntity, pInput); + return {KHook::Action::Ignore}; } -void FASTCALL Detour_CGamePlayerEquip_InputTriggerForActivatedPlayer(CGamePlayerEquip* pEntity, InputData_t* pInput) +KHook::Return Detour_CGamePlayerEquip_InputTriggerForActivatedPlayer(CGamePlayerEquip* pEntity, InputData_t* pInput) { if (CGamePlayerEquipHandler::TriggerForActivatedPlayer(pEntity, pInput)) - CGamePlayerEquip_InputTriggerForActivatedPlayer(pEntity, pInput); + return {KHook::Action::Ignore}; + + return {KHook::Action::Supersede}; } -void FASTCALL Detour_CTriggerGravity_GravityTouch(CBaseEntity* pEntity, CBaseEntity* pOther) +KHook::Return Detour_CTriggerGravity_GravityTouch(CTriggerGravity* pEntity, CBaseEntity* pOther) { // no need to call original function here // because original function calls CBaseEntity::SetGravityScale internal // but passes the wrong gravity scale value if (CTriggerGravityHandler::GravityTouching(pEntity, pOther)) - return; + return {KHook::Action::Supersede}; - CTriggerGravity_GravityTouch(pEntity, pOther); + return {KHook::Action::Ignore}; } -CServerSideClient* FASTCALL Detour_GetFreeClient(int64_t unk1, const __m128i* unk2, unsigned int unk3, int64_t unk4, char unk5, void* unk6) +KHook::Return Detour_GetFreeClient(int64_t unk1, const __m128i* unk2, unsigned int unk3, int64_t unk4, char unk5, void* unk6) { // Not sure if this function can even be called in this state, but if it is, we can't do shit anyways if (!GetClientList() || !GetGlobals()) - return nullptr; + return {KHook::Action::Supersede, nullptr}; // Check if there is still unused slots, this should never break so just fall back to original behaviour for ease (we don't have a CServerSideClient constructor) if (GetGlobals()->maxClients != GetClientList()->Count()) - return GetFreeClient(unk1, unk2, unk3, unk4, unk5, unk6); + return {KHook::Action::Ignore}; // Phantom client fix for (int i = 0; i < GetClientList()->Count(); i++) @@ -667,49 +735,51 @@ CServerSideClient* FASTCALL Detour_GetFreeClient(int64_t unk1, const __m128i* un CServerSideClient* pClient = (*GetClientList())[i]; if (pClient && pClient->GetSignonState() < SIGNONSTATE_CONNECTED) - return pClient; + return {KHook::Action::Supersede, pClient}; } // Server is actually full for real - return nullptr; + return {KHook::Action::Supersede, nullptr}; } -#ifdef __linux__ -float FASTCALL Detour_CCSPlayerPawn_GetMaxSpeed(CCSPlayerPawn* pPawn) +KHook::Return Detour_CCSPlayerPawn_GetMaxSpeed(CCSPlayerPawn* pPawn) { - auto flMaxSpeed = CCSPlayerPawn_GetMaxSpeed(pPawn); + auto flMaxSpeed = getMaxSpeedHook.CallOriginal(pPawn); const auto pController = reinterpret_cast(pPawn->GetController()); if (const auto pPlayer = pController != nullptr ? pController->GetZEPlayer() : nullptr) flMaxSpeed *= pPlayer->GetMaxSpeed(); - return flMaxSpeed; + return {KHook::Action::Supersede, flMaxSpeed}; } -#endif CConVar g_cvarPreventUsingPlayers("cs2f_prevent_using_players", FCVAR_NONE, "Whether to prevent +use from hitting players (0=can use players, 1=cannot use players)", false); - bool g_bFindingUseEntity = false; -int64 FASTCALL Detour_FindUseEntity(CCSPlayer_UseServices* pThis, float a2) + +KHook::Return Detour_FindUseEntity(CCSPlayer_UseServices* pThis, float a2) { g_bFindingUseEntity = true; - int64 ent = FindUseEntity(pThis, a2); + return {KHook::Action::Ignore}; +} + +KHook::Return Detour_FindUseEntity_Post(CCSPlayer_UseServices* pThis, float a2) +{ g_bFindingUseEntity = false; - return ent; + return {KHook::Action::Ignore}; } -bool FASTCALL Detour_TraceFunc(int64* a1, int* a2, float* a3, uint64 traceMask) +KHook::Return Detour_TraceFunc(int64* a1, int* a2, float* a3, uint64 traceMask) { if (g_cvarPreventUsingPlayers.Get() && g_bFindingUseEntity) { uint64 newMask = traceMask & (~(CONTENTS_PLAYER & CONTENTS_NPC)); - return TraceFunc(a1, a2, a3, newMask); + KHook::Recall(nullptr, {KHook::Action::Ignore}, a1, a2, a3, newMask); } - return TraceFunc(a1, a2, a3, traceMask); + return {KHook::Action::Ignore}; } -bool FASTCALL Detour_TraceShape(int64* a1, int64 a2, int64 a3, int64 a4, CTraceFilter* filter, int64 a6) +KHook::Return Detour_TraceShape(int64* a1, int64 a2, int64 a3, int64 a4, CTraceFilter* filter, int64 a6) { if (g_cvarPreventUsingPlayers.Get() && g_bFindingUseEntity) { @@ -717,174 +787,137 @@ bool FASTCALL Detour_TraceShape(int64* a1, int64 a2, int64 a3, int64 a4, CTraceF filter->DisableInteractsWithLayer(LAYER_INDEX_CONTENTS_NPC); } - return TraceShape(a1, a2, a3, a4, filter, a6); + return {KHook::Action::Ignore}; } -CDetour* CEntityIOOutput_FireOutputInternal = nullptr; -std::map> mapIOFunctions{}; -void FASTCALL Detour_CEntityIOOutput_FireOutputInternal(const CEntityIOOutput* pThis, CEntityInstance* pActivator, CEntityInstance* pCaller, const CVariant* value, float flDelay, void* a6, void* a7) +KHook::Return Detour_CEntityIOOutput_FireOutputInternal(const CEntityIOOutput* pThis, CEntityInstance* pActivator, CEntityInstance* pCaller, const CVariant* value, float flDelay, void* a6, void* a7) { - for (const auto& [name, cb] : mapIOFunctions) - cb(pThis, pActivator, pCaller, value, flDelay); + if (g_cvarEnableButtonWatch.Get()) + ButtonWatch(pThis, pActivator, pCaller, value, flDelay); - (*CEntityIOOutput_FireOutputInternal)(pThis, pActivator, pCaller, value, flDelay, a6, a7); -} - -// Tries to setup Detour_CEntityIOOutput_FireOutputInternal if it is not already setup. This is not -// enabled unless a feature needs it, as the detour breaks CS# compatibility -// Returns true if detour is usable, otherwise false. -bool SetupFireOutputInternalDetour() -{ - if (CEntityIOOutput_FireOutputInternal != nullptr) - return true; + if (g_cvarEnableEntWatch.Get()) + EW_FireOutput(pThis, pActivator, pCaller, value, flDelay); - CEntityIOOutput_FireOutputInternal = new CDetour(Detour_CEntityIOOutput_FireOutputInternal, "CEntityIOOutput_FireOutputInternal"); - if (!CEntityIOOutput_FireOutputInternal->CreateDetour(g_GameConfig)) - { - Panic("Failed to detour CEntityIOOutput_FireOutputInternal\n"); - delete CEntityIOOutput_FireOutputInternal; - CEntityIOOutput_FireOutputInternal = nullptr; - return false; - } - CEntityIOOutput_FireOutputInternal->EnableDetour(); - return true; + return {KHook::Action::Ignore}; } #ifdef PLATFORM_WINDOWS -Vector* FASTCALL Detour_CBasePlayerPawn_GetEyePosition(CBasePlayerPawn* pPawn, Vector* pRet) +KHook::Return Detour_CBasePlayerPawn_GetEyePosition(CBasePlayerPawn* pPawn, Vector* pRet) { if (pPawn->IsAlive() && CPointViewControlHandler::IsViewControl(reinterpret_cast(pPawn))) { const auto& origin = pPawn->GetEyePosition(); pRet->Init(origin.x, origin.y, origin.z); - return pRet; + return {KHook::Action::Supersede, pRet}; } - return CBasePlayerPawn_GetEyePosition(pPawn, pRet); + return {KHook::Action::Ignore}; } -QAngle* FASTCALL Detour_CBasePlayerPawn_GetEyeAngles(CBasePlayerPawn* pPawn, QAngle* pRet) +KHook::Return Detour_CBasePlayerPawn_GetEyeAngles(CBasePlayerPawn* pPawn, QAngle* pRet) { if (pPawn->IsAlive() && CPointViewControlHandler::IsViewControl(reinterpret_cast(pPawn))) { const auto& angles = pPawn->v_angle(); pRet->Init(angles.x, angles.y, angles.z); - return pRet; + return {KHook::Action::Supersede, pRet}; } - return CBasePlayerPawn_GetEyeAngles(pPawn, pRet); + return {KHook::Action::Ignore}; } #else -Vector FASTCALL Detour_CBasePlayerPawn_GetEyePosition(CBasePlayerPawn* pPawn) +KHook::Return Detour_CBasePlayerPawn_GetEyePosition(CBasePlayerPawn* pPawn) { if (pPawn->IsAlive() && CPointViewControlHandler::IsViewControl(reinterpret_cast(pPawn))) { const auto& origin = pPawn->GetEyePosition(); - return origin; + return {KHook::Action::Supersede, origin}; } - return CBasePlayerPawn_GetEyePosition(pPawn); + return {KHook::Action::Ignore}; } -QAngle FASTCALL Detour_CBasePlayerPawn_GetEyeAngles(CBasePlayerPawn* pPawn) +KHook::Return Detour_CBasePlayerPawn_GetEyeAngles(CBasePlayerPawn* pPawn) { if (pPawn->IsAlive() && CPointViewControlHandler::IsViewControl(reinterpret_cast(pPawn))) { const auto& angles = pPawn->v_angle(); - return angles; + return {KHook::Action::Supersede, angles}; } - return CBasePlayerPawn_GetEyeAngles(pPawn); + return {KHook::Action::Ignore}; } #endif -void FASTCALL Detour_CBaseFilter_InputTestActivator(CBaseEntity* pThis, InputData_t& inputdata) +KHook::Return Detour_CBaseFilter_InputTestActivator(CBaseFilter* pThis, InputData_t& inputdata) { // If null activator (player disconnected & pawn removed), block the real function from executing and crashing the server if (!inputdata.pActivator) - return; + return {KHook::Action::Supersede}; - CBaseFilter_InputTestActivator(pThis, inputdata); + return {KHook::Action::Ignore}; } CConVar g_cvarFixGameBans("cs2f_fix_game_bans", FCVAR_NONE, "Whether to fix CS2 game bans spreading to all new joining players", false); -void FASTCALL Detour_GameSystem_Think_CheckSteamBan() +KHook::Return Detour_GameSystem_Think_CheckSteamBan_Post() { // Implementation shared by @aiolos1045 - GameSystem_Think_CheckSteamBan(); - if (!g_cvarFixGameBans.Get()) - return; + return {KHook::Action::Ignore}; - CUtlMap* pMap = addresses::sm_mapGcBanInformation; - unsigned int count = pMap->Count(); + auto pMap = addresses::sm_mapGcBanInformation; // After player has been kicked, remove any ban entries, to prevent spreading to all new joining players - if (count > 0) + if (pMap->Count() > 0) pMap->RemoveAll(); + + return {KHook::Action::Ignore}; } -AcquireResult FASTCALL Detour_CCSPlayer_ItemServices_CanAcquire(CCSPlayer_ItemServices* pItemServices, CEconItemView* pEconItem, AcquireMethod iAcquireMethod, uint64_t unk4) +KHook::Return Detour_CCSPlayer_ItemServices_CanAcquire(CCSPlayer_ItemServices* pItemServices, CEconItemView* pEconItem, AcquireMethod iAcquireMethod, uint64_t unk4) { if (g_cvarEnableZR.Get()) { AcquireResult zrResult = ZR_Detour_CCSPlayer_ItemServices_CanAcquire(pItemServices, pEconItem); if (zrResult != AcquireResult::Allowed) - return zrResult; + return {KHook::Action::Supersede, zrResult}; } - return CCSPlayer_ItemServices_CanAcquire(pItemServices, pEconItem, iAcquireMethod, unk4); + return {KHook::Action::Ignore}; } bool g_bInScriptSetModel = false; -void FASTCALL Detour_CS_Script_SetModel(uint64_t unk1) +KHook::Return Detour_CS_Script_SetModel(uint64_t unk1) { g_bInScriptSetModel = true; - CS_Script_SetModel(unk1); + return {KHook::Action::Ignore}; +} + +KHook::Return Detour_CS_Script_SetModel_Post(uint64_t unk1) +{ g_bInScriptSetModel = false; + return {KHook::Action::Ignore}; } -void FASTCALL Detour_CBaseModelEntity_SetModel(CBaseModelEntity* pModel, const char* pszModel) +KHook::Return Detour_CBaseModelEntity_SetModel(CBaseModelEntity* pModel, const char* pszModel) { if (!g_bInScriptSetModel) - return CBaseModelEntity_SetModel(pModel, pszModel); + return {KHook::Action::Ignore}; if (PrepareMapSetModel(pModel)) - return CBaseModelEntity_SetModel(pModel, pszModel); + return {KHook::Action::Ignore}; + + return {KHook::Action::Supersede}; } -void FASTCALL Detour_CCSGameRules_GoToIntermission(CCSGameRules* pThis, bool bAbortedMatch) +KHook::Return Detour_CCSGameRules_GoToIntermission(CCSGameRules* pThis, bool bAbortedMatch) { if (!g_pMapVoteSystem->IsIntermissionAllowed(false) && g_cvarVoteManagerEnable.Get()) - return; + return {KHook::Action::Supersede}; if (g_cvarVoteManagerEnable.Get()) g_pVoteManager->OnIntermission(); - return CCSGameRules_GoToIntermission(pThis, bAbortedMatch); -} - -bool InitDetours(CGameConfig* gameConfig) -{ - bool success = true; - - FOR_EACH_VEC(g_vecDetours, i) - { - if (!g_vecDetours[i]->CreateDetour(gameConfig)) - success = false; - - g_vecDetours[i]->EnableDetour(); - } - - return success; + return {KHook::Action::Ignore}; } - -void FlushAllDetours() -{ - FOR_EACH_VEC_BACK(g_vecDetours, i) - { - g_vecDetours[i]->FreeDetour(); - g_vecDetours.FastRemove(i); - } -} \ No newline at end of file diff --git a/src/detours.h b/src/detours.h index 2700e6ef7..a21ecbd62 100644 --- a/src/detours.h +++ b/src/detours.h @@ -18,19 +18,20 @@ */ #pragma once -#include "cdetour.h" #include "cs2_sdk/entityio.h" +#include "khook.hpp" #include class CCheckTransmitInfo; class IRecipientFilter; class ISoundEmitterSystemBase; class CBaseEntity; -class CBaseEntity; +class CBaseFilter; class CCSPlayerController; class CEntityIndex; class CCommand; class CTriggerPush; +class CTriggerGravity; class CGameConfig; class CGameRules; class CTakeDamageInfo; @@ -49,16 +50,14 @@ class InputData_t; class CCSPlayerPawn; class CCSPlayer_UseServices; class CTraceFilter; +class CNavMesh; +class CBaseModelEntity; class Vector; class QAngle; class CEconItemView; class CCSGameRules; struct CTakeDamageResult; -// Add callback functions to this map that wish to hook into Detour_CEntityIOOutput_FireOutputInternal -// to make it more modular/cleaner than shoving everything into the detour (buttonwatch, entwatch, etc.) -extern std::map> mapIOFunctions; - enum class AcquireMethod { PickUp, @@ -80,40 +79,42 @@ enum class AcquireResult NotAllowedByProhibition, }; -bool InitDetours(CGameConfig* gameConfig); -void FlushAllDetours(); -bool SetupFireOutputInternalDetour(); +void InitDetours(CGameConfig* gameConfig); -void FASTCALL Detour_UTIL_SayTextFilter(IRecipientFilter&, const char*, CCSPlayerController*, uint64); -void FASTCALL Detour_UTIL_SayText2Filter(IRecipientFilter&, CCSPlayerController*, uint64, const char*, const char*, const char*, const char*, const char*); -bool FASTCALL Detour_IsHearingClient(void*, int); -void FASTCALL Detour_TriggerPush_Touch(CTriggerPush* pPush, CBaseEntity* pOther); -int64 FASTCALL Detour_CBaseEntity_TakeDamageOld(CBaseEntity* pThis, CTakeDamageInfo* pInfo, CTakeDamageResult* pResult); -bool FASTCALL Detour_CCSPlayer_WeaponServices_CanUse(CCSPlayer_WeaponServices*, CBasePlayerWeapon*); -void FASTCALL Detour_CCSPlayer_WeaponServices_EquipWeapon(CCSPlayer_WeaponServices*, CBasePlayerWeapon*); -bool FASTCALL Detour_CEntityIdentity_AcceptInput(CEntityIdentity* pThis, CUtlSymbolLarge* pInputName, CEntityInstance* pActivator, CEntityInstance* pCaller, variant_t* value, int nOutputID, void*, void*); -void* FASTCALL Detour_CNavMesh_GetNearestNavArea(int64_t unk1, float* unk2, unsigned int* unk3, unsigned int unk4, int64_t unk5, float unk6, int64_t unk7); -void FASTCALL Detour_ProcessMovement(CCSPlayer_MovementServices* pThis, void* pMove); -void* FASTCALL Detour_ProcessUsercmds(CCSPlayerController* pController, CUserCmd* cmds, int numcmds, bool paused, float margin); -void FASTCALL Detour_CGamePlayerEquip_InputTriggerForAllPlayers(CGamePlayerEquip*, InputData_t*); -void FASTCALL Detour_CGamePlayerEquip_InputTriggerForActivatedPlayer(CGamePlayerEquip*, InputData_t*); -void FASTCALL Detour_CTriggerGravity_GravityTouch(CBaseEntity* pEntity, CBaseEntity* pOther); -CServerSideClient* FASTCALL Detour_GetFreeClient(int64_t unk1, const __m128i* unk2, unsigned int unk3, int64_t unk4, char unk5, void* unk6); -float FASTCALL Detour_CCSPlayerPawn_GetMaxSpeed(CCSPlayerPawn*); -int64 FASTCALL Detour_FindUseEntity(CCSPlayer_UseServices* pThis, float); -bool FASTCALL Detour_TraceFunc(int64*, int*, float*, uint64); -bool FASTCALL Detour_TraceShape(int64*, int64, int64, int64, CTraceFilter*, int64); -void FASTCALL Detour_CEntityIOOutput_FireOutputInternal(const CEntityIOOutput* pThis, CEntityInstance* pActivator, CEntityInstance* pCaller, const CVariant* value, float flDelay, void*, void*); +KHook::Return Detour_CBaseEntity_TakeDamageOld(CBaseEntity* pThis, CTakeDamageInfo* pInfo, CTakeDamageResult* pResult); +KHook::Return Detour_CBaseEntity_TakeDamageOld_Post(CBaseEntity* pThis, CTakeDamageInfo* pInfo, CTakeDamageResult* pResult); +KHook::Return Detour_TriggerPush_Touch(CTriggerPush* pPush, CBaseEntity* pOther); +KHook::Return Detour_IsHearingClient(void*, int); +KHook::Return Detour_UTIL_SayTextFilter(IRecipientFilter&, const char*, CCSPlayerController*, uint64); +KHook::Return Detour_UTIL_SayText2Filter(IRecipientFilter&, CCSPlayerController*, uint64, const char*, const char*, const char*, const char*, const char*); +KHook::Return Detour_CCSPlayer_WeaponServices_CanUse(CCSPlayer_WeaponServices*, CBasePlayerWeapon*); +KHook::Return Detour_CCSPlayer_WeaponServices_EquipWeapon(CCSPlayer_WeaponServices*, CBasePlayerWeapon*); +KHook::Return Detour_CEntityIdentity_AcceptInput(CEntityIdentity* pThis, CUtlSymbolLarge* pInputName, CEntityInstance* pActivator, CEntityInstance* pCaller, variant_t* value, int nOutputID, void*, void*); +KHook::Return Detour_CNavMesh_GetNearestNavArea(CNavMesh* pNavMesh, float* unk2, unsigned int* unk3, unsigned int unk4, int64_t unk5, float unk6, int64_t unk7); +KHook::Return Detour_ProcessMovement(CCSPlayer_MovementServices* pThis, void* pMove); +KHook::Return Detour_ProcessMovement_Post(CCSPlayer_MovementServices* pThis, void* pMove); +KHook::Return Detour_ProcessUsercmds(CCSPlayerController* pController, CUserCmd* cmds, int numcmds, bool paused, float margin); +KHook::Return Detour_CGamePlayerEquip_InputTriggerForAllPlayers(CGamePlayerEquip*, InputData_t*); +KHook::Return Detour_CGamePlayerEquip_InputTriggerForActivatedPlayer(CGamePlayerEquip*, InputData_t*); +KHook::Return Detour_CTriggerGravity_GravityTouch(CTriggerGravity* pEntity, CBaseEntity* pOther); +KHook::Return Detour_GetFreeClient(int64_t unk1, const __m128i* unk2, unsigned int unk3, int64_t unk4, char unk5, void* unk6); +KHook::Return Detour_CCSPlayerPawn_GetMaxSpeed(CCSPlayerPawn*); +KHook::Return Detour_FindUseEntity(CCSPlayer_UseServices* pThis, float a2); +KHook::Return Detour_FindUseEntity_Post(CCSPlayer_UseServices* pThis, float a2); +KHook::Return Detour_TraceFunc(int64*, int*, float*, uint64); +KHook::Return Detour_TraceShape(int64*, int64, int64, int64, CTraceFilter*, int64); +KHook::Return Detour_CEntityIOOutput_FireOutputInternal(const CEntityIOOutput* pThis, CEntityInstance* pActivator, CEntityInstance* pCaller, const CVariant* value, float flDelay, void*, void*); #ifdef PLATFORM_WINDOWS -Vector* FASTCALL Detour_CBasePlayerPawn_GetEyePosition(CBasePlayerPawn*, Vector*); -QAngle* FASTCALL Detour_CBasePlayerPawn_GetEyeAngles(CBasePlayerPawn*, QAngle*); +KHook::Return Detour_CBasePlayerPawn_GetEyePosition(CBasePlayerPawn*, Vector*); +KHook::Return Detour_CBasePlayerPawn_GetEyeAngles(CBasePlayerPawn*, QAngle*); #else -Vector FASTCALL Detour_CBasePlayerPawn_GetEyePosition(CBasePlayerPawn*); -QAngle FASTCALL Detour_CBasePlayerPawn_GetEyeAngles(CBasePlayerPawn*); +KHook::Return Detour_CBasePlayerPawn_GetEyePosition(CBasePlayerPawn*); +KHook::Return Detour_CBasePlayerPawn_GetEyeAngles(CBasePlayerPawn*); #endif -void FASTCALL Detour_CBaseFilter_InputTestActivator(CBaseEntity* pThis, InputData_t& inputdata); -void FASTCALL Detour_GameSystem_Think_CheckSteamBan(); -AcquireResult FASTCALL Detour_CCSPlayer_ItemServices_CanAcquire(CCSPlayer_ItemServices* pItemServices, CEconItemView* pEconItem, AcquireMethod iAcquireMethod, uint64_t unk4); -void FASTCALL Detour_CS_Script_SetModel(uint64_t unk1); -void FASTCALL Detour_CBaseModelEntity_SetModel(CBaseModelEntity* pModel, const char* pszModel); -void FASTCALL Detour_CCSGameRules_GoToIntermission(CCSGameRules* pThis, bool bAbortedMatch); \ No newline at end of file +KHook::Return Detour_CBaseFilter_InputTestActivator(CBaseFilter* pThis, InputData_t& inputdata); +KHook::Return Detour_GameSystem_Think_CheckSteamBan_Post(); +KHook::Return Detour_CCSPlayer_ItemServices_CanAcquire(CCSPlayer_ItemServices* pItemServices, CEconItemView* pEconItem, AcquireMethod iAcquireMethod, uint64_t unk4); +KHook::Return Detour_CS_Script_SetModel(uint64_t unk1); +KHook::Return Detour_CS_Script_SetModel_Post(uint64_t unk1); +KHook::Return Detour_CBaseModelEntity_SetModel(CBaseModelEntity* pModel, const char* pszModel); +KHook::Return Detour_CCSGameRules_GoToIntermission(CCSGameRules* pThis, bool bAbortedMatch); diff --git a/src/entities.cpp b/src/entities.cpp index 254a7bc09..da4526314 100644 --- a/src/entities.cpp +++ b/src/entities.cpp @@ -135,9 +135,9 @@ namespace CTriggerGravityHandler s_gravityMap[hEntity] = flGravity; } - bool GravityTouching(CBaseEntity* pEntity, CBaseEntity* pOther) + bool GravityTouching(CTriggerGravity* pEntity, CBaseEntity* pOther) { - const auto hEntity = GetEntityUnique(pEntity); + const auto hEntity = GetEntityUnique((CBaseEntity*)pEntity); if (hEntity == ENTITY_UNIQUE_INVALID) return false; diff --git a/src/entities.h b/src/entities.h index 45a44a8c3..a32771e9f 100644 --- a/src/entities.h +++ b/src/entities.h @@ -31,7 +31,7 @@ class CTriggerGravity; namespace CTriggerGravityHandler { void OnPrecache(CTriggerGravity* pEntity, const CEntityKeyValues* kv); - bool GravityTouching(CBaseEntity* pEntity, CBaseEntity* pOther); + bool GravityTouching(CTriggerGravity* pEntity, CBaseEntity* pOther); void OnEndTouch(CTriggerGravity* pEntity, CBaseEntity* pOther); } // namespace CTriggerGravityHandler diff --git a/src/entwatch.cpp b/src/entwatch.cpp index e7cb49e8f..cc199c27e 100644 --- a/src/entwatch.cpp +++ b/src/entwatch.cpp @@ -1049,9 +1049,6 @@ void CEWHandler::UnLoadConfig() if (!m_bConfigLoaded) return; - if (EW_IsFireOutputHooked()) - mapIOFunctions.erase("entwatch"); - // Clantags first so scores can be set back properly ResetAllClantags(); @@ -1120,15 +1117,6 @@ void CEWHandler::LoadConfig(const char* sFilePath) mapItemConfig[hash_32_fnv1a_const(sHammerid.c_str())] = item; } - if (mapItemConfig.size() > 0) - { - // Hook FireOutput - if (!SetupFireOutputInternalDetour()) - mapIOFunctions.erase("entwatch"); - else if (!EW_IsFireOutputHooked()) - mapIOFunctions["entwatch"] = EW_FireOutput; - } - m_bConfigLoaded = true; } @@ -2242,14 +2230,9 @@ void EW_PlayerDisconnect(int slot) g_pEWHandler->PlayerDrop(EWDropReason::Disconnect, -1, pController); } -bool EW_IsFireOutputHooked() -{ - return std::any_of(mapIOFunctions.begin(), mapIOFunctions.end(), [](const auto& p) { return p.first == "entwatch"; }); -} - void EW_FireOutput(const CEntityIOOutput* pThis, CEntityInstance* pActivator, CEntityInstance* pCaller, const CVariant* value, float flDelay) { - if (!EW_IsFireOutputHooked() || !pCaller) + if (!g_pEWHandler->IsConfigLoaded() || !pCaller) return; for (int i = 0; i < (g_pEWHandler->vecItems).size(); i++) diff --git a/src/entwatch.h b/src/entwatch.h index 8f8feb354..0132c240b 100644 --- a/src/entwatch.h +++ b/src/entwatch.h @@ -315,7 +315,6 @@ void EW_DropWeapon(CCSPlayer_WeaponServices* pWeaponServices, CBasePlayerWeapon* void EW_PlayerDeath(IGameEvent* pEvent); void EW_PlayerDeathPre(CCSPlayerController* pController); void EW_PlayerDisconnect(int slot); -bool EW_IsFireOutputHooked(); void EW_FireOutput(const CEntityIOOutput* pThis, CEntityInstance* pActivator, CEntityInstance* pCaller, const CVariant* value, float flDelay); int GetTemplateSuffixNumber(const char* szName); float EW_UpdateHud(); \ No newline at end of file diff --git a/vendor/funchook/LICENSE b/vendor/funchook/LICENSE deleted file mode 100644 index 2da840da3..000000000 --- a/vendor/funchook/LICENSE +++ /dev/null @@ -1,360 +0,0 @@ -Funchook is distributed under the terms of the GNU General Public -License version 2 or later with the following clarification and -special exception. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from or -based on this library. If you modify this library, you must extend this -exception to your version of the library. - -===================================================================== - - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/vendor/funchook/README.md b/vendor/funchook/README.md deleted file mode 100644 index 419021f8b..000000000 --- a/vendor/funchook/README.md +++ /dev/null @@ -1,273 +0,0 @@ -Funchook - an API hook library -============================== - -[![tests](https://github.com/kubo/funchook/actions/workflows/run-tests.yml/badge.svg?branch=master)](https://github.com/kubo/funchook/actions/workflows/run-tests.yml) - -This library depends on one of the following disassemblers. - -On x86_64 and x86 -* [diStorm3][] (default) -* [zydis][] (when `-DFUNCHOOK_DISASM=zydis` is passed to the `cmake` command) -* [capstone][] (when `-DFUNCHOOK_DISASM=capstone` is passed to the `cmake` command) - -On arm64 -* [capstone][] - -TODO ----- - -* write documents. - -News ----- - -### 2.0.0 (20XX-XX-XX) - -* Add `funchook_prepare_with_params()` to support prehook. -* Add `funchook_get_arg()` to get arguments in prehook. - -### 1.1.1 (2022-10-02) - -* More permissive check for page allocation mmap ([#25][]) -* Flush instruction cache for arm64. It does nothing for intel CPU. -* Disassember engine - * Upgrade capstone to 4.0.2 - * Upgrade distorm to 3.5.2 -* CMake - * Allow user to specify FUNCHOOK_CPU explicitly ([#19][]) - * Avoid polluting global include and link dirs ([#20][]) - * Use target based compile options for gcc's -Wall ([#21][]) - * Use ExternalProject_add to download captone only ([#30][]) - * Add option FUNCHOOK_INSTALL ([#31][]) - * Use "FUNCHOOK_CPU MATCHES " ([#32][]) -* Documentation - * added example usage from python ([#22][]) -* Fix tests on Android ([#29][]) - -### 1.1.0 (2020-03-22) - -* Arm64 Linux support. [capstone][] is used as the disassembler library on arm64. -* Options to use [zydis][] and [capstone][] as a disassembler library on x86_64 and x86. -* `extern "C"` was added in funchook.h for C++. ([#15][]) -* Libc-compatible functions were removed to simplify code. - -### 1.0.0 (2020-01-19) - -* [diStorm3][] is used as the disassembler library. -* Libc-compatible functions were implemented on Linux in order not to hook function calls issued by funchook itself. - -Supported Platforms -------------------- - -* Linux x86_64 -* Linux x86 -* Linux arm64 (since 1.1.0) -* macOS x86_64 (Functions in executables cannot be hooked when Xcode version >= 11.0. (*1)) -* Windows x64 (except C-runtime functions under [Wine][]) -* Windows 32-bit - -*1 [`mprotect`] fails with EACCES. - -Unsupported Platforms ---------------------- - -* macOS arm64 (*1) - -*1 I received a mail that [`mprotect`] failed with `EINVAL`. Apple seems to prevent executable memory regions from being writable. - -Compilation and installation ------------ - -### Unix - -```shell -$ git clone --recursive https://github.com/kubo/funchook.git -$ mkdir build -$ cd build -$ cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/path/to/install/directory ../funchook -$ make -$ make install -``` - -* Available [`CMAKE_BUILD_TYPE`][] values are empty(default), `Debug`, `Release`, `RelWithDebInfo`(release build with debug information) and `MinSizeRel`. -* When [`CMAKE_INSTALL_PREFIX`][] isn't set, funchook is installed at `/usr/local`. - - installed files: - * `${CMAKE_INSTALL_PREFIX}/include/funchook.h` (header file) - * `${CMAKE_INSTALL_PREFIX}/lib/libfunchook.so` (symbolic link to `libfunchook.so.1`) - * `${CMAKE_INSTALL_PREFIX}/lib/libfunchook.so.1` ([soname][]; symbolic link to `libfunchook.so.1.1.0`) - * `${CMAKE_INSTALL_PREFIX}/lib/libfunchook.so.1.1.0` (shared library) - * `${CMAKE_INSTALL_PREFIX}/lib/libfunchook.a` (static library) - -### Windows - -Here is an example to compile funchook with Visual Studio 2017 Win64. -Change the argument of `-G` to use other compilers. - -```shell -$ git clone --recursive https://github.com/kubo/funchook.git -$ mkdir build -$ cd build -$ cmake -G "Visual Studio 15 2017 Win64" -DCMAKE_INSTALL_PREFIX=c:\path\to\install\directory ..\funchook -$ cmake --build . --config Release --target INSTALL -``` - -* Available `-G` arguments (generators) are listed in the output of `cmake --help`. -* Available `--config` arguments are `Debug`(default), `Release`, `RelWithDebInfo` and `MinSizeRel`. -* When [`CMAKE_INSTALL_PREFIX`][] isn't set, funchook is installed at `c:\Program Files\funchook`. - - installed files: - * `${CMAKE_INSTALL_PREFIX}\include\funchook.h` (header file) - * `${CMAKE_INSTALL_PREFIX}\bin\funchook.dll` (shared library) - * `${CMAKE_INSTALL_PREFIX}\bin\funchook.pdb` (debug file for `funchook.dll` when `--config` is `Debug` or `RelWithDebInfo`) - * `${CMAKE_INSTALL_PREFIX}\lib\funchook.lib` (static library) - * `${CMAKE_INSTALL_PREFIX}\lib\funchook_dll.lib` (import library for `funchook.dll`) - -Example -------- - -```c -static ssize_t (*send_func)(int sockfd, const void *buf, size_t len, int flags); -static ssize_t (*recv_func)(int sockfd, void *buf, size_t len, int flags); - -static ssize_t send_hook(int sockfd, const void *buf, size_t len, int flags); -{ - ssize_t rv; - - ... do your task: logging, etc. ... - rv = send_func(sockfd, buf, len, flags); /* call the original send(). */ - ... do your task: logging, checking the return value, etc. ... - return rv; -} - -static ssize_t recv_hook(int sockfd, void *buf, size_t len, int flags); -{ - ssize_t rv; - - ... do your task: logging, etc. ... - rv = recv_func(sockfd, buf, len, flags); /* call the original recv(). */ - ... do your task: logging, checking received data, etc. ... - return rv; -} - -int install_hooks() -{ - funchook_t *funchook = funchook_create(); - int rv; - - /* Prepare hooking. - * The return value is used to call the original send function - * in send_hook. - */ - send_func = send; - rv = funchook_prepare(funchook, (void**)&send_func, send_hook); - if (rv != 0) { - /* error */ - ... - } - - /* ditto */ - recv_func = recv; - rv = funchook_prepare(funchook, (void**)&recv_func, recv_hook); - if (rv != 0) { - /* error */ - ... - } - - /* Install hooks. - * The first 5-byte code of send() and recv() are changed respectively. - */ - rv = funchook_install(funchook, 0); - if (rv != 0) { - /* error */ - ... - } -} - -``` - -Example - Using Python ctypes ------------------------------ -```python -# should work on python 2.7/3 windows/linux - -# load funchook -import ctypes -fh_lib = ctypes.cdll.LoadLibrary('/path/to/funchook/dll/or/so') - -# define signatures -funchook_create = fh_lib.funchook_create -funchook_create.restype = ctypes.c_void_p -funchook_create.argtypes = [] - -funchook_prepare = fh_lib.funchook_prepare -funchook_prepare.restype = ctypes.c_ssize_t -funchook_prepare.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p] - -funchook_install = fh_lib.funchook_install -funchook_install.restype = ctypes.c_ssize_t -funchook_install.argtypes = [ctypes.c_void_p, ctypes.c_int] - -PySys_WriteStdout = ctypes.pythonapi.PySys_WriteStdout -PySys_WriteStdout.restype = None -PySys_WriteStdout.argtypes=[ctypes.c_char_p] - -# must keep those references alive, or stuff will be GC'd and weird errors will occur -global orig_write, hook, orig_write_ptr - -# create hook (this function will replace the original function) -hook_type = ctypes.PYFUNCTYPE(None, ctypes.c_char_p) -orig_write = None -def hook_impl(msg): - print('about to write: ' + str(msg)) # do what we want - orig_write(msg) # call the original function - -hook = hook_type(hook_impl) - -fh = funchook_create() -# create a pointer object with the function address -orig_write_ptr = ctypes.c_void_p(ctypes.c_void_p.from_address(ctypes.addressof(PySys_WriteStdout)).value) -# orig_write_ptr.value will get a ptr to the original PySys_WriteStdout and PySys_WriteStdout will now point to the hook -ret = funchook_prepare(fh, ctypes.addressof(orig_write_ptr), hook) -assert not ret, 'ret is ' + str(ret) -ret = funchook_install(fh, 0) -assert not ret, 'ret is ' + str(ret) -orig_write = hook_type.from_address(ctypes.addressof(orig_write_ptr)) -PySys_WriteStdout(b'hi there\n') -``` - -License -------- - -GPLv2 or later with a [GPL linking exception][]. - -You can use funchook in any software. Though funchook is licensed under -the GPL, it doesn't affect outside of funchook due to the linking exception. -You have no need to open your souce code under the GPL except funchook itself. - -If you modify funchook itself and release it, the modifed part must be -open under the GPL with or without the linking exception because funchook -itself is under the GPL. - -[diStorm3][] and [capstone][] are released under the 3-clause BSD license. -[zydis][] is released under the MIT license. They are compatible with the GPL. - -[GPL linking exception]: https://en.wikipedia.org/wiki/GPL_linking_exception -[diStorm3]: https://github.com/gdabah/distorm/ -[zydis]: https://github.com/zyantific/zydis -[capstone]: https://github.com/aquynh/capstone -[Wine]: https://www.winehq.org/ -[`CMAKE_BUILD_TYPE`]: https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html -[`CMAKE_INSTALL_PREFIX`]: https://cmake.org/cmake/help/latest/variable/CMAKE_INSTALL_PREFIX.html -[soname]: https://en.wikipedia.org/wiki/Soname -[#15]: https://github.com/kubo/funchook/issues/15 -[#19]: https://github.com/kubo/funchook/pull/19 -[#20]: https://github.com/kubo/funchook/pull/20 -[#21]: https://github.com/kubo/funchook/pull/21 -[#22]: https://github.com/kubo/funchook/pull/22 -[#25]: https://github.com/kubo/funchook/pull/25 -[#29]: https://github.com/kubo/funchook/pull/29 -[#30]: https://github.com/kubo/funchook/pull/30 -[#31]: https://github.com/kubo/funchook/pull/31 -[#32]: https://github.com/kubo/funchook/pull/32 -[`mprotect`]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/mprotect.2.html diff --git a/vendor/funchook/include/funchook.h b/vendor/funchook/include/funchook.h deleted file mode 100644 index 5c6ed34ee..000000000 --- a/vendor/funchook/include/funchook.h +++ /dev/null @@ -1,167 +0,0 @@ -/* - * This file is part of Funchook. - * https://github.com/kubo/funchook - * - * Funchook is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation, either version 2 of the License, or (at your - * option) any later version. - * - * As a special exception, the copyright holders of this library give you - * permission to link this library with independent modules to produce an - * executable, regardless of the license terms of these independent - * modules, and to copy and distribute the resulting executable under - * terms of your choice, provided that you also meet, for each linked - * independent module, the terms and conditions of the license of that - * module. An independent module is a module which is not derived from or - * based on this library. If you modify this library, you may extend this - * exception to your version of the library, but you are not obliged to - * do so. If you do not wish to do so, delete this exception statement - * from your version. - * - * Funchook is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * for more details. - * - * You should have received a copy of the GNU General Public License - * along with Funchook. If not, see . - */ -#ifndef FUNCHOOK_H -#define FUNCHOOK_H 1 - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Only functions with FUNCHOOK_EXPORT are visible from outside of funchook.dll - * or libfunchook.so. Others are invisible. - */ -#ifdef FUNCHOOK_EXPORTS -#if defined(_WIN32) -#define FUNCHOOK_EXPORT __declspec(dllexport) -#elif defined(__GNUC__) -#define FUNCHOOK_EXPORT __attribute__((visibility("default"))) -#endif -#endif /* FUNCHOOK_EXPORTS */ -#ifndef FUNCHOOK_EXPORT -#define FUNCHOOK_EXPORT -#endif - -typedef struct funchook funchook_t; - -#define FUNCHOOK_ERROR_INTERNAL_ERROR -1 -#define FUNCHOOK_ERROR_SUCCESS 0 -#define FUNCHOOK_ERROR_OUT_OF_MEMORY 1 -#define FUNCHOOK_ERROR_ALREADY_INSTALLED 2 -#define FUNCHOOK_ERROR_DISASSEMBLY 3 -#define FUNCHOOK_ERROR_IP_RELATIVE_OFFSET 4 -#define FUNCHOOK_ERROR_CANNOT_FIX_IP_RELATIVE 5 -#define FUNCHOOK_ERROR_FOUND_BACK_JUMP 6 -#define FUNCHOOK_ERROR_TOO_SHORT_INSTRUCTIONS 7 -#define FUNCHOOK_ERROR_MEMORY_ALLOCATION 8 /* memory allocation error */ -#define FUNCHOOK_ERROR_MEMORY_FUNCTION 9 /* other memory function errors */ -#define FUNCHOOK_ERROR_NOT_INSTALLED 10 -#define FUNCHOOK_ERROR_NO_AVAILABLE_REGISTERS 11 -#define FUNCHOOK_ERROR_NO_SPACE_NEAR_TARGET_ADDR 12 - -#define FUNCHOOK_FLAG_THISCALL (1u << 0) -#define FUNCHOOK_FLAG_FASTCALL (1u << 1) - -typedef struct funchook_arg_handle funchook_arg_handle_t; - -typedef struct funchook_info { - void *original_target_func; - void *target_func; - void *trampoline_func; - void *hook_func; - void *user_data; - funchook_arg_handle_t *arg_handle; -} funchook_info_t; - -typedef void (*funchook_hook_t)(funchook_info_t *fi); - -typedef struct { - void *hook_func; - funchook_hook_t prehook; - void *user_data; - unsigned int flags; -} funchook_params_t; - -/** - * Create a funchook handle - * - * @return allocated funchook handle. NULL when out-of-memory. - */ -FUNCHOOK_EXPORT funchook_t *funchook_create(void); - -/** - * Prepare hooking - * - * @param funchook a funchook handle created by funchook_create() - * @param target_func function pointer to be intercepted. The pointer to trampoline function is set on success. - * @param hook_func function pointer which is called istead of target_func - * @return error code. one of FUNCHOOK_ERROR_*. - */ -FUNCHOOK_EXPORT int funchook_prepare(funchook_t *funchook, void **target_func, void *hook_func); - -FUNCHOOK_EXPORT int funchook_prepare_with_params(funchook_t *funchook, - void **target_func, const funchook_params_t *params); - -/** - * Install hooks prepared by funchook_prepare(). - * - * @param funchook a funchook handle created by funchook_create() - * @param flags reserved. Set zero. - * @return error code. one of FUNCHOOK_ERROR_*. - */ -FUNCHOOK_EXPORT int funchook_install(funchook_t *funchook, int flags); - -/** - * Uninstall hooks installed by funchook_install(). - * - * @param funchook a funchook handle created by funchook_create() - * @param flags reserved. Set zero. - * @return error code. one of FUNCHOOK_ERROR_*. - */ -FUNCHOOK_EXPORT int funchook_uninstall(funchook_t *funchook, int flags); - -/** - * Destroy a funchook handle - * - * @param funchook a funchook handle created by funchook_create() - * @return error code. one of FUNCHOOK_ERROR_*. - */ -FUNCHOOK_EXPORT int funchook_destroy(funchook_t *funchook); - -/** - * Get error message - * - * @param funchook a funchook handle created by funchook_create() - * @return pointer to buffer containing error message - */ -FUNCHOOK_EXPORT const char *funchook_error_message(const funchook_t *funchook); - -/** - * Set log file name to debug funchook itself. - * - * @param name log file name - * @return error code. one of FUNCHOOK_ERROR_*. - */ -FUNCHOOK_EXPORT int funchook_set_debug_file(const char *name); - -/* This function is under developemnt. It will be used by C++ template functions later. */ -FUNCHOOK_EXPORT void *funchook_arg_get_int_reg_addr(const funchook_arg_handle_t *arg_handle, int pos); - -/* This function is under developemnt. It will be used by C++ template functions later. */ -FUNCHOOK_EXPORT void *funchook_arg_get_flt_reg_addr(const funchook_arg_handle_t *arg_handle, int pos); - -/* This function is under developemnt. It will be used by C++ template functions later. */ -FUNCHOOK_EXPORT void *funchook_arg_get_stack_addr(const funchook_arg_handle_t *arg_handle, int pos); - -#ifdef __cplusplus -} // extern "C" -#endif - -#endif diff --git a/vendor/funchook/lib/Debug/distorm.lib b/vendor/funchook/lib/Debug/distorm.lib deleted file mode 100644 index c6fb39830937162e00aa1e4c1c3e7e78cacd0460..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 167786 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 diff --git a/vendor/funchook/lib/Debug/distorm.pdb b/vendor/funchook/lib/Debug/distorm.pdb deleted file mode 100644 index c15ddfee1494077819053352780738a5821b0ef6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 110592 zcmeHw37lL-wRd%QHbMvqkOdN8l0aB9nI#EHgpgT!k|wjId$xp;W-`;0G|a~IOcp=^ z0YyYvgeS5IJ~t5Ip(qcO#Ra#A0*a!B_e50W!-W@=&4qmbv(>#FlE>5VzW3?x&hOVr z{ZE}bb?Vfqx>fg{Tel(KJv>+#>>VkoSy*%2aU~6zx{?!0%gXkfct~x=;ctp_G5j|R zzti!fzk}t!=-7oF5LqCyKxBc)0+9tG3q%%(ED%}X@5BO6uRQY4JEOnI z0+9tG3q%%(ED%{BvOr{k$O4fCA`3(oh%69U;2+uo&i&*cx_wdOA`3(oh%69UAhJMY zfye@p1tJSX7KkhmSs=1NWPzPKUw`5C7bw1;e)3NcxUh3)f&tly65;TTy_%jcP+c0mYwX&#-^MV(qW3yCqsug=u<;7 zNETY*4p12fdKvL4XF)e=uhmbO%1*;iFT9SNEfmJ*=7i7v&}5! zH@#*9TiZ;pLqQ`Mhbiw0mpC9kEdeRDx$eQ9T=|mf{7Av=AX-dml@$RkuCyhKgjVXt zQ|UPMK?!7LMNG@Kp`0r{xvG6ph_G^{+p)xro#x#6WVX;>ws|<$o8Oul=^Ei;tziO+ ziBHW{ohQ4*v^gkEZJOxZj#GRanv*Tr#-_%k=}$PF>_B;HPuvl1OLkOLuWLzW9MKX+ zs}$N2v}cUA=SXUgXqMbM5^7Qr4eI@#^ova?fj-t3N2#vQLbv@;&nWVo>tP%BNcmg= zdRg8WH(JOA8J<4Dbq|gXj5y+>HcxV+17XgFuELpAKjj~RIw!lK-mR&Dp4`^lu+is( zKGO}ciLD{TPklDqJ~Gy54OLtZ`NMeihvU&U^#`-CxVZGE z(!?K1ckkz^fx<{?pm&hQMr+m(iqM!Wg?ySHO4Vnmznv>=>Ke}VuyFMkqQ~9f5RKPV zkJ~|Y#X%|y*?x@k(%(?m9(1cAab7n=s#}HXW^-31@I3rzPN%tRA=jO7i|{|SWikGz zwtPU_BJ&Sv+|=7!$c<1RkPi}lg6rz(8D>xRv?*>Nw{@hLmwav}#zRj|e30iH#`U=Y zvkiETa6Mi=`SH=NH`g^XI*b9wwxa$#0etocKeg71tqh^<%lF)m8SR*GZw55A+cLGo zb!vwauC%wWYhyvWRP8|Ym@DwuqjcQ$_;kYc5BB7H^SPcnD#wN*+Y#RwH zu$G3OG>emHja+9|Yq_~@+_d0Ym2KP62Q(-`}r(EaRdlUlBo!gj) z#|#I4M6ybBKCy9G4}Io>X4j|^@Kg|P9Q1x!=?b`Rh(46R$Q5!M`*XNj1wOdgZRje5 zc$TvQCHXk%wtNr%PkATq!T%|5#UA{h`~i#7cmvxUjQCrL zmCK&|f#x0ZJ@P~9J4-ifx}s=okI>SG=dlvVjk!EsjC~)))n?>33Fwdx>3}(VkA8FM zI9sPR=@Q4TfxxMThNZB%tZ@XFFOlnE!U@jSwbs`w&lsguRtV2n!kHvXAsOQcr<1Ep z=6J;>bAsZq%zcz*GADYRU9w2)-Ir)pH8m!8l46s)pW?9G$zdAS11*q7I_^*Obh5st zTG}whuoPxnOeI>XI-6FW0}O|F4kTJbQ(awVDa$>`V_~AYrV$PHNM)0ml(uDhK&v&{ zjDS|%QB}|KW(G7YD5Q@LR$6U`=zfUeWK9Q`nMJs+xfP2Q#P{aK+hl1IsBPjCO#f%y{MytsTV53hF4f+gzfxks#4`p2>lSSh*vJwl3f~(l9xr zmYdJCpv+N(+t&H~qXm-?uJ;(iHBF6~mU7njSi(@Pre5-o<9rZQ{_%us1H6E6CcveP zgLU9S!ceb#Nw(bDQKqz|AW>hJdtAY|f^c(78fAC{5lQE2cjI1kmT10d-hIkfB znlia&(`koZfDl2sStWa9E zsky~$aWZHmW1CB7(M#nvZqHV{Slf9Ha80_5>pK_e*2dOMvR3drI8SW%PEJ=c-+7#t zv3tHRBR0RlV=4D8kEQH|Tvpn55z@6<_r;tR8Smz_lz$JWrR*h0i+)n~dp%yvdR@xA zOE~>LPM?75-1upiVQ!}NpJcE=sJx*#wAF|bzJb*HNQ;r zx9-AE*J$FOxl4K4!)qj3qZ2=^&25b&>+~`1yIST^ zEo1Uaz)x!{l27%}dhBuK{oXFTwg(8W^PW)NA9!Bd8^oREJsHZwH4uL>ceCzi2IDB=fIz;3faSANv>ECWLAK7|y4?2jRyi3%~i-)iJ>)@2RQ9@`jEVZ1T=O zP_X&;Sw{&r|Gi-xVd*dOi34>{X#Vp&Xyl*2#{afA{WS9d7yi^_W#^a2aZBtHu88)*F&)HBZgLCe0RWob;8pe)%CdyXCR zAq)NH%0rs_8>e-&m9-UBj}h{sdKzonm6D*mw;77aJ$05f8P!EH3>$q&TLy zL@`9~Fn!6!)b`^2AMVGh{D~@maN}@Se@R`wFIVVn@Mq4n zMQ6=mfB)z}eq>u`TTN%n;9wv4Gf0*%Dy>{vT3K0MS=QM#(%0YH-I*Wg?i=mN&82br zx*IzkYPgaGsky6`cQz0IZ539HZq4`QyM|GF#>*#}HM__xIeP2TCC7BOW3@lHrBJd4 zH&Hvw%Q{n{5|X85r4Dtel?v027 z-zV8?F+hwh=FJqz7khc+f#>N+yDYdRN|F7;hIN*2Pss@(8E zSKsoz^0qy=xB2xRs&Nxz>g)eA!)XuI{?&tb4`V50x?MYVcYW|*4l1|9+u|+ik|L$w zFwTlhvsc>h;zWBROUIkrG1rZmj{AC!uG@4EgYL~Ai{Ekh(Yjn&>_Bdd2b~*6^L;&?*`C}`p%b^L@L;5W zL1DPNlYa6TXSlSR@162>=1t_(<~EFOG&!Y1JsW7wI>aTWk9G8viSD45;a83ytiBDEvdBws_zk23|I+{xs4s`Y7ISMUd zG-mlE!p=bd}*(wJ*M z)wwIHoIC5s*vF=^65YqS@BB;LZN~=uf|YT1BJO^6N5b84 zfpgP8pKx#glXKriJ=pz1|XY zcRw3qxYknMaGfU#`2Q3Nr%Rbog!i4KQFX4{AB<|Y2@7!;`1RD*- z-8pDW=~tY4^5M8U8@e9*&$tWx&6xXTUCh1oV%&Y|7qDF-;lA5}d)kdL_k%w;cRLz( z)z@RL{+*z`5_hj)kw17}!cD@H#f3iu|IWCZd1%}<-4k=iz(!}>9d|cf9CI5kM?E(u z+>J*$_rbb^8(5KW6V^HRHF(DM2V<`1#F)DTeOmcQ!kzh-xcl*@xck%paqd2N%IYg( z?n1OPac0~dcbIeMp`AZ{&AHEf-MR6Q_iQrZj=3@6mJKG{_5T@n=VRxz7;RjHKD%^z z!ae*6*!&03|New~0e)5XcIQ5PlXD;WPRz~tPQneLt+Qvu-EYv&u4`iMwLimF&&1vB z==WLZ;|JhJ<;Ta|`iXJ(#aEnbLm%GsdfeT!Pt5%m{kQ|Z^h|Huy>M^BJ%M&#eu{(5 zox2!rzdi5VuVKg9Z^zuxYn}Ui0uBCt+&w#-aQEE>T~3UdJ z_r-(b?yh$x+(Ge}J7n0o_H&@y$K&qjXy3w~nA`u%n7a#pe%e>DXGQy7UIpLjin;4P z8h3~167DPi4q30FkKP}1XFurNAs9zb+#GWcU5Bzu5u0*h+?CI8?qT>=DeU~Q%i}Kl zF6VB(Kh6)VXmFp2E7TRIQ!4t4ED%{BvOr{k$O4fCA`3(oh%69U;P2T2^nB}d{MO*N zX*2%8-|g5R(;5FO@eu5GY;*8@8c&R5J3#!{*5LUZ_O19$!f!wPz>2sThd3RIXs2ga z4sq}D7sda}y9-hLzdD3PRliA`cohFn<132)w>XTL#p*}#|55xuo|$mGFz!u7@&5@| zf~hr%|Cd;nDE?pGKa1l3argB*Vs7dAcoy6eN3eXtP5xlQt-LAW zwx1ezw+u$l|D)&s(ewX*r04%z-WzxOAhv{FT&2G#4nXV>{To>zvOr{k$O4fCA`3(o zh%69U;P2G}bnXNWNZ|M3SJD{)gmI&g-mk7QtY-*R8(u2!{?`z$Z%8)aFoJBw;wAQ+ zu9oO&98scYS0n|a7CASePB3Z_yoxcsTAd|T`22*`!Xt+;sGJnh+S5=kI5XiC=97aN zP$QRJ6Q*g~>P4OuRe23U!%+`VMQM#z7Q)B|O&&v#@-#Eej)Mr=xwe?@+nXkO16ftt zn-L7F3T`2cQ!%XVt%^~A+ta4l&V^_`bBwz;qH>s;9!A?K9ESDp_CL zON*b%^--Oqhd+~T5Bkcx;bbp**PHA`uh_gD|5IB|!~gPrxA57y2y=)He0GLHm-3zF z&qb(B)})geIZjV}3}-tEEz??4lg#)tWN^Nt&@qgg((97xwD?@Y=&8o$))peaxP#6y zK%5WzK{x8uqaM?_!e}2KtmRLC6cV~*hrRD_@6gkGiR2s9-X8opMyXC}BenjuM2j#}PO`wmf_h&)i+>ctExX_3b7o^SAE|smSs$&1YI7aDOPM^FqhA?Rzrl&A@c*8 z?~7SSfG?Rrhe#hB?{R%qrbTEw<}pvQQF-FR103)?Ej+0P<;l(GGHa6SRwWy&G8r6j z!EHQ-+Sn*AK@QIo#9GRv4Ge&W?t}1P`UqF|d>UOU0kCd)m%jp*+?a!I~(>UbSSJha# z-;k_&so%vZEjHN~`q$Lg)wgC=vz#^K39s^JKE2H4hTxf~8TQT={JdFWuW?H4Go zp{cD(+x{WLnDZ$A3dPl$e}`ese^IfWv-FH%&EKxr&J%myu;yQ)xKYns`MzO2qw{Nq z)t5eDc)jR%f#N3B?-9k;m-j0+U;BvS^~%4B?BCGLwz!aN+R&U_tA4l0W9jEP2WUP< zE7|6ImX9fs@HK+#lUlycW67_S^7R;|%>N6^*YcMsZqf25c`W6R)$%P`e!Jys`P&3H zas#xlPYr0k|5u9~@IjFBz2^CX`TYTZn=0iu->&=5fV1N?CaRJk!&b+L-&xM9`WVQYQN) z!z#Cn!`=vS(C2u>&K5D0^HV8yS5^**?#+Zns57^!q;3|fr(0O zdp*_LhR&;K_VdhFalKNSFWWsuXsas%TmEbxp`}9gJ{iz_*%_isb0$>py;?^mRJLF1 z0ByDDcctnFn%D16p=D|-g7fg66nRAR^}Zy!WKtD@kNi5IdA{#x*-VJ<<5~x3zTWG^ zeq<~dP}US3!lwol+8k+bi!@kh4aUa}5!!&#q#;7mQvta zUDGV(w9G4Ql*Yn==CA==e{d)jr@sT;kcOj(?5``fxpcc=7)pT0Y&n%DN74F@(|qg43e8We{KrUs zvNna$!t>$^T$AhA5yX$a&H0UfEWJV)XDB9B{*i=J)TzQ>$rue(yxg$Xx0W$^weWWs z*8R$*i~}Dyo^eB~tyz9b?MXHI_TNT6kZMe|sJv^L9}8o($4!dO9#<%a`MAB+f?I8V zPZ?HyDyTkP=Z#9*pFw$w;F@-=yIOFv5ofPc-&`oTzC!)&9K*Vvy-M+_3gN#_aiik* z3C08}w)&{x_13nrgvm78)`O^Tfvv3{B->y^fdRt$e3UU8i*Y-ZZ*21Cs-OUZ%-6nZ@X_wK1?C}GdUk_rG0Z8^$qPDHUBWpw{ba7^KD$_ zDZeG~Mk-JFm{_Q9#u`>Xzrgr0u~7aX$?vH0^VC|#HU9ej_4$;a zX5$n8qXG8!yKZAz;4h!`7%bZEhgmLPH@MzA39qZKurqaEFx)J0T-z}JtV*_IZ121U z*O=9^X=fii&#@@|;{gKOszqtl0P}2R~g4>!EpH20plYV~u z1lo2=mB{)ar{y|#Ii>YFdJCt8{%MpyrKZErL3a_x0m!z8`!?~aZVz!<%6*B_dLHn@ zoEG|bsl4v_zAtIss*~=Q5+63Bl)i`4;=6ZnTKeM#POq1?Qd;+}pQE(;{=bskbfDvH zl&3y%Ev0q;ItP69Rjcc)FD9Zd>T%nE>K~bfbZzb0R_(`Mz}M?*8#-z-lHWvSYelD@ zLS}tZ`r}lhCuvHRdEpes!uN0RoBBH3^3nP08my1%>m=`!=;!)XwZ5OOqr6p;_ZiAd z1$h?{t`G3Ngc~pwsedk`I-8)J;*T>9=KX(C+^BZANwM|m{$z)YoQwTF(nI&Smr^|~ z(*6b5W7V&(!OSh~+yQ$vRAts+HAY5b-~ClU^ZS^6CKF$WU)RPJ+ZuC*V85=NqS*3( z2^%(qYSWn=hL;d~}^d;KB>HDzVYT0TrTpr8 zOg&V7jnu!|^r)ij`n=AkOIv-vXT&y{)zlf<){iPreTcSBY33iFmUdix((`5%^a)P{?&zoq4z`SLpyn=V%g_HBBfV$1&n z$!f3iYvUf^MjWe7vXdCowDhBNmgr4#y_yAoxAoTkkk^zBd|@BK-lkuLjhkAf-1$_l zHMp;NEPSFFdp}!OuU2erS*F<5OUI!LP5*iIVOwe9Q5-wFn@*;M!|@uN=0tt#Kz z^9#%c%~kcORgE%_?BMda{jI)s9G7pbwYBfb@T2A`oX4*7=W@<(TV?vMgda6mwXL%H zH)_7s_c-pkH}j2p?0&V5$4LjKiH?uM*P3hU;ZkdTyMIe|=Nqlkt^+Zj3YKyAEcFxT z%eZnrUu2fd*ZfRN+V&~?glM+*zn1z4a#poSJr8&+_1sJS%K1{yr+vQE)2K4>%){4n zLWpMdyh3fJn-bcO6R6FEb$m`StnGWA0pK8B(F zw4L+e2#Tk1J{yev;%?5ThRJ&88INV${F*U+v`Vg<_Y1}{RPbRek7fkH|IGP~qyYQr zrx`ahf&B7ojMFu?&v?;r3Lj@szc`X*f+yADpO^nx_%drleE()N?2t(I6O6IIR$a!i z9AMp_?VvG0i*>bioP3h7j*+J=Uu~T$p?tbpH)UFtb`qC?OqJ1SSY;eM6DZ2i?q{f))B`NO*mtNcq1t3UiJ`2+E*{ApBQ1KQAvr&8MPuhQH=G`+Vsh1!8G zw7FxBVXdQ0_&Xqg`|J=JyWoc*8P_O(tMXSER{lq5Y`{z=|KANO|4f#TeC2fn$kWU z&^%u=>(b*Rmd3irzU0Ul=lKbRp?)TRE)oEB& z^<7B*j-j|3&Ozg0GxsAfoR{!>4Xa&SxE~P?qy6+QwllEi{|on9Ykey!rSj7q>L9GIkw*(`)^8fFy}*92atz7RHR~{q0erL|*%IvMFT#4qXpJqhH@PxIYbg`C zH->5DLc29g(|c3rhU&0!@k7!ox? zlw!+orT)yMz5Gj9KCsH~(R`C%r`XC*Wc##M+kASoVyo{2#a8}ht{)STwtqb9%M%mZ z`#zT6T5W5D?|3ZsJXqyf{Y%N8=~=tl?*+17OAEFFg6of>{4|Aba2wZheoMyk&%hW<*8=N(j3nAa zw{A$^4U+cb{~M%VleFa#PK&O?SP$VFC_a88>#^*kt~IRttcyLC{9%%nkrcgs@=q1)zbV?F*z#8i_V>_R6kGmI^a<+6T`1|Zm6G3R>#It| z<|hX$wtFY9NqK*NZ@J|AJ?8?!zP$$u_V?EknD;ZG`y1Df0}kC6+D`ndrQiD`?XRy- zGZq`4D`}ti4Awa`72DYViDBKR-a_?+?lG-}FJ{&R&knXxe(0Xl=Lm=HIi=tm>?-Qp zRfbjmI>m51@qNRZAEWwOg4mlKn0cMJCW?oP#)zkzhZw2Iqx+_r;A-*xn$ zLi(v!usmK>U51p_f!#XkFi$WIcb4&8=*LsD^3Q=^w1n=r{RsC*`1Ze!<3~M~al8!j zT5Bs<_93{Q%M>2$?WY7ZZ=e6f^?~{57KGOOY(VpTIoua$!*bYs>FtKK{iBMlulo&a zei^P)R6cC;w}ohC*Lj$m+BC3^Y_v4M95hF?*X9Wi1=bOstUMN2N3`dZhXU&eZ=Nq@ ziURAjy^eLoJ{^rC-dEtKZJ4nebq@TgVr%=8hP7?qp!zLnN<3{bN!Q9hTO*UdJ^(;16Of;s=4w+ti?MhY&lXG_TkE z8Ac0aUOmmzJl{QDUbZQtwmR}a<0G2*;dU<%H1*Zg^bnt3OV$PQS}g|b8(zOGXd>?& zfxK1Ta9^8Y>;g={k{DLnI_pFx}=y!wZM|`T^L|;ds-*nY49DjF__BUwW zF3YuSIR5TastahI?{P0L(C=i`ubyox_It_83-s&O_A;N^Z<5Ii+3#%AFJ!+mlNYkz zO{QPSeqZzQ0{tpXKenmp_nem(=+|cYu}y_wp9$oOqRKx@b%kuAd;Yfvb;@W|{(n;&Fh5NiO20t;Na(@X zc_A#HMx*loHl#l$A3xSk4aw(8N%^OSU!D-8&bv%so)Cn# z(e&jBL1;fP-FQL}+CBlTNZ&1{F9v(qz6(rWrU&|7Z~6+|>$}wJ8`$>~Uf;mJonGI- zzTft`1@`?@Ag@T@yw|tbzK45#i|zYsV$6d`c9^GG=(#1AB^=_ z>VFvb!rFZBwA67t_F+adIgcq{IQI89w5Iog(o*&WEgO#g{h9G`u(R-e4f`r88;<>r zYgq|m7QTtb$3e_O+lf6Emj%uAdqwNWa1gWb-D_n-vBdXkJ1~0b5jXo$wbqN#>uDEj zSyhnvws{&0WZLsoRsxC{KVw+^@sEnlXJ0g|`S;M?gae92=i3xpyDrDxx{Y2p)9b-C zg8jYpM&j3iV&26l-{KG*&d$31vIM+!^uVROlETi(Cx28#6Q9@_rm5e&SVR-Pzsxat z73GyG?>~!Z!Z%}Xh)?BBETReDG}=$HeifDFDsMs&P52guX)14S5l#3$<#oo6Sends zxOP{%+UFs!JNTtZ%>OUD(v|;5z753BDl`8#ccm-;!6L^iL-wCkL=(L$!!&K*{34q0 zl}kNdS(0}|5l#5kglQ^oMG;N-Qes2j7?O8l5l#5I!!(uGRzwrNZ;G8E&$}Gk=U;cF zt9_pKZ3KVF{*UcSSN>Oh8;C!!|8u+2mA{eYGzJ4e$I8lLy1#awQA9^WmA|u??)iJU zUY0M~D}P5Z-SfYzh#trvDW-e=ce0H|KDSoo4;9lr|8+(5K>lULbkF~8ZI^dYmA|!^ z?)g7jL=WU&T}=1ar%is_#Jz9M=c|Mp_K=l_DX%R8{j|5P#E^M9|19?1V% zG2QdO2QeFM8bnKD;|h<(-*07%+I8;wtjCgHMRPJ9FC*xcr)rY1C7}5=$vJqw(k4NY zJYHU*`)U>>scrfT@q_{cN!CI?e;63ynR1VO2JYLoHPp4*JGpnzHBW*Gng0`pRo(-Nt-dc9*8E4g zzWOQ%^v|dka~<`#e8M6z<0|4#lk9 zU_1yUBpDy~Sl(Iryq4iWLhY9!t%rgMsmw-?rQWwI=3qiC^G%gQw}+|BgC0wnCA4OP zt`blv>xAP%G+QhDhSoOV+)Np+e=e5&7J>|@O>^pu#&97y-I8-VrQ z?P?lp4e6x$!;jf#(#cF~L(PCZ)nbB9VjRTX-$H9h2^3^M{jg!x`!2=S{#y-e z{(9D-J)LTi7^R=H4jnjLSA4XL+tATu_0OjA92h8enx@$Lvz+clOYk4-(_~nEex+f3 zPQRG?%Lo67%=gpS^}&Ban@K)FG!Fg~+IHjP;6I@?;5j$=DEN=-Khv<*e>U}j1pjgV zi8Lo^@E`S2gU9mRd_4K51^a2gcA89W!*A)Hz6Ja#&nr@of9JhIOK55%exE>Aa(|Vp_J|Eb}vR-DJ@(q6fY;-pDvjz8Q*%!Dkn9s+;>=W?$ z_4;x1ttt>YU3&5zr!a9=W?ulMeN&)2)o>X5)cuD3c& z(|R*(mt?x3B6ucpH$D4k1}zoD(B2xNnZNFovK%x>{XdiKDM5pT=Xfk}I*-#{R)Yp9 z|26gn349~GFV~@gZ)$_*JdgO)S+tf61;0_bq?E&jSmug$kAoPbMV=;ddRR9KSd(X$ zS9vTluJ>4Ue~5J_ekotV@_c|B+xHRne+_U`{b#bi668j@9^b_?dl~}9 zl$PfgOOalE1&`%Ryp< zzbf)2NK9?^!+_@PSYmQjkC)kQ9D%@k?BKcD2Zu53aPAKu9LBUVvWz97gg^5Am72er`7fdx>A)OY2Sv@M76tR*V~QjL)HKfCWma zT{Z$?(0tn$(mLD+qDVg-5u(}kd90@e*YQ8n+FOHDjBgpOL(%0>i`!LhSoK~? z>zegR1WyF#108R))@G~}q+A_r#;?t&?&WddYJMw|<^C39xIJAQ|2L7!q>JPKPN8z? zApY-#L@L`+Ro#SedY1E9#=&_AuMnjGRq&2F?ZJlh=kvyGQba1Hox^ zyHe%cy19B*oSdsx$Zf>fr*q%v%&{?Uu(ua@3C^R7x*`h1n{1NhT)v#z7s$@@dlV*n;IEW@pXxotvI`rwjpX=jx)R0=xvr^_zh!W^ z$Ddv297E2hGuE6d^e`o)pL0SYeGe3#v%);{m?k9R5!}_&Gc0HA^>cfMMuyd%gN$=q z$p&-XxM}!)$`SnkCglU-sO^$E#c=^W!_;Fo#?lU>7@+QN8( zkzxsCb4NN$+>&m(9s(Z!~0LBSYwq4VjsB2DMhkzOTQ500cmTM`FY zpE}o<8`wCq$@=+hlo{iO9Mv6%|C|GCf0LZA?G1HP9Y=we+Cp_u{qNBFDP01ho((vK zY+yQ`AL7aTbZp9Mq>bmo5PeOEezB*=r@Y&zV^he6R`wF5lYT>>lYaOfDCkQ{v6LS?n~gEi#{9=<;adSW~pDO?@2z5lj5^K$GZnWr+O)m{^%RSAHZ0n z^#o3+m7`B}EfE7w>-)=bq*D#@UII?{r8HlYsoWUB{@q4=CkDB*>5?ADbct&pPw84oPoT8M0PjQTWwOSaNa^x2ma{LX z%Q-!X(-H^1AEzssKAF?9j@zHpi7?pEmC~yJ0hCt#52Uo}e-Ncr|7lDY{iics zbe=(J)qf_^>7}xFIhfMRBz*{_%gg*)cNXJvk7qNk@c2;1l^!3)c#+44GhXa*2{4+) z{XYk3G>g-7kw&vPJr8L#i_=FSjb?HBNTO?cKGF4zgQJi}vzX^-q|-~~9>Xz|UMA^d zDP3OX_u0oWF8BC&#uXkfU|i{ODdR;RFJ!#f<1%2pa>F{5BaPRaI9-8st)?rHuGaJ- z;$JO1i-}*;ONd|7ClJ4;mm;0UX^7;X%P74}(#t7bUgq!lzKwCY$0stb@c1Ogl^(BP zyvXB|887yDC2$7E(o(%uNLOpRn&>H^*C1W1=~|?dy6;OOU8Ctb;@9*l;@9+Qq;d2L z+bV^$y}NM=(rGH5bPK*3jPK*3DPK*3@PK*2wPK*3?oEG`(IW6)}MH;7pm)X46DcH}OZx`(6 z&C>)|8h=*sBEzQ(UTnBa@Djrt1fO8ITd+S*zDMvf%g+hMtR?euui|pW8x>b5-lVuv zabEEv#b+p9toTe|9Hs8t-zV6&zhAI#|A1iM{z1XM{X>F%`_B^W+dnMWx4$6Rw|_*i zZ~v%Z-~P>tt^HdRTl=>vruJ|DSoHnB7431i`84PLaCgi-JS*njvmoJ~ITz0gzLju) z#%iMTiI|(SBIfS9FYcxujx(Ju!?piT=MFw5?$+NEcej2l;VyYT=A!TaMc@DXNBsWZ z8N+e6VRPI)dU-th79edlqQA%jkp&_PL>7oF5LqCyKxBc)0)M9#_%?3vALe4yN&O$= z9`(?0t~b9mSIFi!4h#~uD=KFd&vpuL#QuB$&==<3a7NAm+COX<1w zoABU+gm21&uhP6J4+1!h=hwT_r%%QgbmuG!GAM9Pa8bsmu4}3Y`u4?%~10VDCstTfQ*b)mM@k z8STjrc2<;CRCLx1_VgC6$QJjG0c)C@EHezFl|>e#hc>9Dc{+w*bGFVI%sUVaP_Qxi!1Az2xYv zOP3te*`6Qh8QfARS(6_rbe5NOrlc+;OUp_tDwb4~mzH&I$qx*VppD+-dnc}YXy|X0 z*qCgo>&Vou>0DI0)T=t$57p=l+PxYF;&2!RyUx!WVM!VXz4*PjgPsYOIEuBX&kX=m z%ndywKEm}B#Z(;adUIVPqrogohCbzq?}kcnf+0MDUB3I64+{3k zZ0Z`OC=V-DOhZ|E?!654&~xwWH14B>EA8#;+E_>p^hlfr=}q*QEBJV=xRcl{q9+_C zpnPvW*HcI38oCN+dcHAkB!^(7P>$Gv%8hlSsG>JN5YEQ6fbE3*ajri%(nYayW2cc# z-WIY6Vz7$aBbF(qX&dS4EU_XIcQFr`d_RZ-h`SZQWRH_~;idkfXZFNPX{h0}CE%$b+&JicuQC*? zMEQ%HT?hjoT?<`HLI7(L(jqQ+iKjz4jPVg6Z}gi>$5|W*zQx?w)M)2QB9^6vf>xHIpXhlq;#nBmx1$l$!dO0> zEj);8VVZqU8gVTxIGmEDkPO7N;CtQ4RVEX0EsRYjVp|x8Wg^CfX(n@`$HBL`_az!m z95=a>6r0@r6o=(b4%6uC0vaQ{Khe|4`Wk(oVTxfX%(j?Hv{W@>V&r-J0fs|72NJCT zuPA1g^0V`UJQgOh$26kB9{5TfLNvsN(*qhpHH0=JpjCJ1d8IQ0nm?QUV5M1n$RUa? zCT134e0QA!La6@P9)p1KNwh;fE#>3j4Z`k%l>%O3KY=T2SUF!fkkRu5ynSOhUL##}KY*YRuq> zd1~XagrSTqr7Z=C>MZwI;v^~v zBX|pC=!5jkQ%N*@yH0FI)|K`yB03sFau!RPGP!L_7zeRpCn&b@vee^Xyew0i#k()} zIP1@Ae4EmUK=qzzIHd1M0j;t^$Il9-WkWIcCxf={x65NoX+osA4Qv0h&9qL~xf9>{ z#=n@c@K**vKbpE$QU?AgK9R0b7N1C*6hAu-aeS0d*Y^>`DAOOs=Fwc5pgK?@SSJK| zV>OTDk}Q)up6HNkafb=Wq;(+G&2qSogxg2!nCRuir*K(F3YVRP{9ViLr)4Mmvau;= zg>;yrbc-{c8j?Y>&p zIW}boX|v5N@Jw5> zNNA;qX-uHOycUN{jfM_|GzvcvumIYzhZt&EvSdcO@X7*(zGg!Nzb>1rI@218uJ6<) z#8d7##kZk3sTW5cb1_Fa?Z4|8XN=Q=DyrAvwId!c38PgCZAs{x_H^e-6-jO#2{lQS zQySF6{6ck>R#L!@NQ30?Hf1YcrqW=@YQO8O5yyTR%+t zFV=WRpw7u|sCO&xEbsyY^rCXKKA)+(cxwpJsn2G+e4%NG)?W<>DDT4UxNTe)=~Uu2 z=eFXVAk*;(w;4C11k;-6Xv%LMEKohvuN2!#dtm#+zADs>d+ygcIxeoVems9?b6rQO zwnG*=+?UQNiMmtgbM&vU)i&0%9_!kJZno={jxwaWRj6(@cU1z@K9A;fn!D((EX`eu z@ISR>G5)8vPz*NtkIX;a*k(5sz4Jiy36AzPyjx*kBia-ajYm26!McPS zSb=vR*E#pKm~-17jN<>J_7oF5LqCyKxBc)0+9v&zqG&-yvsgm zHev_2$J~DSe=2@6@mp|H+|9=S^YA+gzgGO#<99lK8}VzxZ{8ho_uOO7J^1B>dwHXC zzqmEwvYpPQk=KD=8-AVmz51)T`^tTYuUq3>*MkZ7$=Nuk^^G_dfh?I}g#3A4#}JE|0nMe~7Z+`Q)p3-t=n1O}RGa z=6?)t3tT38eH8V50>2ya8;7#vd!4)ee(XzUAx27oF5LqCyKxBc)0+9tG3+#;rqWJ%Wi{k&I_!kaYm4V&ow|LFby=>2~@1EY74aUMYQ{y*%1*U6*z|6zyd z{eQfnFXsvTZ@m8>J^zoM|I>;s`im?OSs=1NWP!*6kp&_PL>7oF5LqCyKxBb`Yzu^+ z|K|~BK7v!@$M16f-^UPwPQM8-#qIc?{{H5(^7TM%`xZdyCi;H!xaoYB59&Vyvfqlc zq&M-s_i@wdEHpZQ@F2*gdg#1v!X=97++xBrfdA$;z2RF1o477Ixq2Lacfw{=_fn)O zmLK8%j8D}38#SN4MnL($(ENA}ahHpLdHwStH z-aH+-Y`TztsSF(W&j-l6#=rHu4(3O}cNaF%`E6w9Gf~e$_#LNq>PMRFa*5(W#W>1< z?RJ*pZNPZm$!(zX67k7|fj*oxZr^L@0?pf!zO^97FK7GdfNs=nW$6sc{#-wO>3xTN zTjMm)$Qao^d?90WC|lVxFt`OiYGvqb%q&jM9~g9=M(06p>Bc8B&U8CW2RbJ+n;+QR z)tB$d4t3!;{TwWr9T?2hx#TbU`r5%~pBKpDWHtKsL0CsR>k>M44{ZzTQ(FJv<{W*u zo9#g7x`p)i_Mvkwp_|(0zw-?coP8bi^;`TYfDQS9&eem3k&Y#cI=A9iQ(v0fnxppq zPU~FIjn4%9)gLKQCo5U7K3}q6V6bm+<6y}G`sP7<$AXdtJ^3ztB&9Ht?=CFw9_$1!tpaoJ5I&-i>&_Q)(4u?!mTnvmn8gny4Dxn(xbZ4dc5L8UO7E`oP5Ae8OS0o4?@j z)+yGCFJrXe7(lO~^M1b9y3z+7_O7{dfaP9`vCmYzQ5hQ7f7EgP*L+GN^zDl`3f-Nc zJ%927Gpc+5Wv@E*O+Re1+iKjzn9R3t)rVAe`P50#w?_8jvn_iVOQAOH^`LS)ye+~X zNO`N2e#1B`GRbTdjlUT!F+A`4~Fu^tdehg zgoi@;n{&g3{NMnu(Z2#Z*#fUgGyWRV)b>MR3tK~94UD#DH{s-DllOk5VZ)Kl_Yd`v zE_>$-@(nxkh2s9C-Bi$@*52=d>h}!!LY5cq@JG|{5#;mwns#8ihPQ8VJ!N^iXHYpk zVS7GmJP6&*;Vg|9iXRJ$lO~+31h+GE(>1jqfgJt|M-vp#_Io1t*xZ2=r6KBWP!*6kp&_PL>7oF5LqCyKxBc) z0+9tG3q%(9|Iq>z(|{1W(0#gAg{qrb=kkp&_PL>7oF5LqCyKxBc)0+9tG3q%%(ED%}X zf8PQ#|MyjhG>9w^Ss=1NWP!*6kp&_PL>7oF5LqCyKxBc)0+9tG3q%%(ED%{BvOr{k d$O4fCA`3(oh%69UAhJMYfye@p1@_Vc{}-IUOt}C6 diff --git a/vendor/funchook/lib/Debug/funchook.lib b/vendor/funchook/lib/Debug/funchook.lib deleted file mode 100644 index 319115e752692772cd047286121a194b16cf1d83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 227472 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 w! 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≦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 L*UQ>*LHp?+fDk0Q diff --git a/vendor/funchook/lib/Debug/funchook.pdb b/vendor/funchook/lib/Debug/funchook.pdb deleted file mode 100644 index 4f5c4a8f1facd4e1ac135e3cea9e10311ba71c75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143360 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
`Pl6QO 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%0Dvv zVeQYK8~)&E=uh(>bGCT*ty@0NN-S|2~+a=!cOb$Sw6vJ;3(Od;n~V38-A+ZuRPrFUCJ{J|6J{VzTp`vPGK0w_| z4R6-*+i3W`x^6tt@QZa`IL+|g%Fi_1okyQ%_!}DjBEvUp|G3idX}S)-&hS%}-(vVy z-FMt&_+4rTwj2Jg@<$DC)pmT^@Z;6azhL-Zbba!Q;UTprZyElOrt`kxM~_82eros< z|;p+@POvA4*e1Y;+hTrJsJHtOwzR~bpt=HLxpQ-!;!y9zJbGhLk4?_937=D_r z+ix=bblr#EY52cY58DiXS;z0ghL`Ak^rYdh={SAP@Mm;>dD-w9b-!Ww8tvzM4F7%{ z>idb|Kk4}W((oLe2fsHwsCxL>@NBh9L2WnJulnftN;JG$!*?`Px4ZH~cm|Z_G5jUh~a2yra%LVZ#?|_&JvAzT+6fPgP!H z_&3^KOAUWi+oREN_Z-ZLhCibA{4~R7Pe4C8)9}w!|K}OLROkJR4gW#UA^&3di5mWT z!|8_%<#VgyXKMJn4Zl{$*Zqbct$N;J_*+`vorW(|d;6l{lXQalr{OP;M>*d%{A~^Y zf#GwMe`fftI^MrA{1ok<`wgG2MCDU5DRc_~9DL^dB)Xrl!___v zF#JEN=b?sIC?8|^ZcTrZ;n%7AFvDNebzp|!ZQ9TC3=gYaDlz;8UFTOCUZL%BwBZM7 zyDT#NOYP6c8~&88uiW!uPXCu{zH3bQkF@;j3@=f=oniQOx^6$$@Ryal=lfi~19e0fJj;RN)Pn+^YRBKVz#r)$0LHQfDJw|lv)-Bc+5nEpKf@Z@=U{fDbF)J zSM^hDcxUAmhP(S}^9=u1!yjw-f0QpVJb5b0UvIchBVLo?owQv~G`ySgb%u}8b~(fF z2^#(!!^@Ss=QUhE8Ls{LaufdFhoJmh4Bw{n{!NCTtM>U$!`JJ&berMdDu2lEe@;Zc zPZ)l%t{idY=&v#AuCv~3s*zg~!c*8GI-e7p4w$mEJeck7- zGyHp9Z=YfKhuZ(oG2H#%!i9#r|2Me8@JgK*t~GqEt_N;5e4V!AR>S`W^?Uaj-cj9; z7+$FErwm`C^Z4_Izo_ete;EF$@;411tozOP40rz*x7YBXw(nPlAFK1u4~Ac?{1?NM zbUeoD_;ce<)#fD`evrDm8s4gQuaDtZDo-_hlDdZ*{<8LyafW}U{1C%;YrDIBtt)?7 zDjGP;gnv!L7a0DP+OgS&myJg{&OW*HZyg2h&YvP2*sC?^yr6uU;hB@*(PVg$+Od-i zZ&kkD@a@_kS`FW&dfR09mujyrG5jW-U)=NHu3k?lzrlq6P|JUt;h!u2o8d)jA09Bg zyPoqrX83UJx4R7gMa%zp!^h~n@K3|t|7X5!`25b${|APz(0TAP!>?95`L*HhKF5!S z|5NScuZCZz{lV9II6Y6*c1$*Wtd7%ehP(fV>1%jc-GdAtsO#GihP&rl#v5Lt;inir zQtj9b!`CX$HvA5C&oVry^IfUoO`7jq!$)dAoNxGJJ`}pxaQ7Trz2VgwzS;2C^_=!( z!}}?3F?^1;<5`BM=z3|h;hS~8e5v6pwZC0$_|$R8;6}qUl;3XnT;=x|ezNih4d0;) z?#B%;jzzxD7=D`8Yq#NT%3m}5d)3c7hQFubKQjEkI=((P{F5$7=v%{oQT~(R8EWSP z+P~cRTB$tV@N1Q)82)cPf9Pp=-61H?L5AO}<9&$Xw`e&>8$MK@uShd|q^^4pHGFU? z@=Z7V3hh_9hL6$k#fD!u3h7iBey`>`&+w^Q--U)3C_m2dV|2W@^{mr>o$}Qt{NyPp z&sxJ@QupbG*Jyj6V|az`gDx~YTkXjeh9~K`yVmfH8vbU(FVK9q8oo`}Z}%B~h~Bq) z#PFXq{8NUXtLwAp4S!epKMemy*Z*%C-a+;Jp5a54?=}2Tm7cH~d=FXRG0FE8k>zK-=*W!%x+Ayvp!9)Xv{vcy}%TZHC{X<^P-EB?m)q4;X%| zw%22Zzp3@zW%yTWxBqUqYwuSLpR4QAe;NL98p`vb;j^^-pBX+z?ZDTD$LKohN5dy+ z_+Je_Qq%W!T)Od9uKg|9@Kn`XH^YmxUHTecq4sBx;m0Z;VfbWSUyV2XKf2zSVtA6) zcZT8Jm1i5iN&EjS!ync9mKwfP)0u1dX6?804ZmFZV#D_!Frzdt>HInKl#b< zTeLq1bpCPacZq|Z;|(98<1xkX<1}6Oo)VW%Pc7#`Cj6JWJ{)5By}GX-ZTRWB&QCM^ zLe<+e!`=UT&osP2+dX7>Pi>b%!+ou9nc*9BydP=!bX{L9FnoZfv&8VLbX~XH@OwHz z|0@m8)OE=zhA+|dHy9qP?b2rWK-~wOZ}@7p1D6@TRp+m34F6L5+g}aO9F6kdVR*Ij zdksHH=c$Jbzg77YhF9wO#EhwQc?bc4DYYuhZw$I`_E{@ zM{4*q!_QIs@7C9@{1Y^Mx(R>oNR%hn@Q&I)iw%#}`J%#bH^0s^e1L{uXn4Ao=QzW2 zm7idEvGUc1AESJ&;aS>$PB%QD>%(&lPZ|Y1Txj@PYA3HSe3*v6*6?SCA)T8I|3&T3 zR>R-Z`SCu(?^iqah~Y!DA3kMxwf5uZ4gXd3{}01`wYP5?-llf@J;O)pI%lup`_=A! zW%x?9KR+0Lx9a~F!?!DsReigDyIJjRlHn889(FanLhV=|!ynahrW)R1D%xwf;r#>P zV+}u4^*Pz_j%p7NH~e$ebEe_Xs@=;syjks1*zm{H?#(g$sL3ejF@~R`>*^ZAZ_|C^ zQp3MhcZ1>c)&8t8e2=!@I>Y;Gd!1qUCfy&MYxq&z(Db>;@N!-MTxs}wsT|t#t}}e1 zmh%?FpHe$^m*L0izG=JR&FX&Ca956}4gX5V%L|5|tK<3=!y9xQIlJQed0Z^&<<^gm zzc3j5Qe>1KHuPN-f;IGE;sI-{@)md@F$z_HEQ2l44*I-;mG<<^gtJ@7fPwnSDhCiYFLBo&Ie*3uL*C~I-@J~=oZ@1xtHT~BNpQ+`1 z$MC(nPWZ_1TXY@ux#909|JLwYRxEvfGWKPXA%G+wq3G=ZsSfe^T@9Y4|V7 z4>J69ZTBID_f_|3!#_~FlxFx~-G3cwct4#_(+zk3@11M-dbR(>hF1)S-YN`FQ@y$O zj5@u2uj|!?Cj0}szc|kDx0Rn@_=#Gt)rPz0Gu9e@qK>cA4d0^t9K(~eU%B_iy7C{Q z{0bBPR;|~yhIbhS{oHJLauWDf!?$aB?lb&3P3IBAduTs-%J7kD2c9>4mhyiX{)_TA z4X@RH{+{7mwLk1N+`SLpVWr@Z?mK=Mcl!>NT{Ff?mb8D z{~cYsKb?$xuQK6(P=15qn{`~c^|DK6oUW_?X2QRy`_Kmr59<2lF~iT+dhIgYy+85q zhSzF;c-8Q}YPbJo_|LlU_|S0oT*W@ar|S6mx8e6I|BvC{s#{)GPO5eK`AqvyoQ^-o zN2nd{WVrjklpcmZqV3z?@NwFo4>tU=c(m^*!=G2~-W%%5vqbIZG!y<@d z;ioAtGCWi5Ub*4FYC9ff_;YHvk2QR{+MhbZTXh~;VfX{eR~dec?l(_0e68}0hJUB_ z*}cEP=`BtB+XW{48@lef+;F!Za_@U^>Aax(h?`9KksZ*EcN%`0t^>Cj{<`vq4d1Bi z|0fNfr|ZM#41Y=c?aPMmQT~SEN2uM{WB6stKQY{`^S(6vHErMT4Zm2|13z1?{VJFW zJvn{;pyf<7{2)!gi{X>i-P`cRs{et8$7#O94DY6Vtl_WgKF;Oi%K4klUx%CUS8ID^ z8h*R>=X}G{)&7JHKUeu2!g_>amzF#I;PW1kuRf%0z*uTSyhv)}O3fxX`hFV^)zR<^wcWcLeyj3+hP(5Q!G<5L`Wb2X*VAU-5F8o!>mz(gFYM0z|i!OYV+Kp38 z_3LyQ5 z4F8MrCk!9n1L2=Fe3kN-40q4Fyl(jS`kcqRhP(Ztd;f&fe~Q|NFHHC!Qc<4o44yk&TYuF%{2h99Nl_fx}ns6M|o z{BZ66KN`MJ=eu7GZ_;#pt%ocBcHNJ=_q;m(tA^`l!e{6@wXfmVsl6R!c&*MmBMkrE zo&OvDu+9rp48H_w^W1w@TshtS_-qqCr23p?_;I=}Dm8p#Dl(XB_;bqV8~&cI{}&rx zr1NII;k&ipHXFWD$M4C8yZ0ls7`~(n%6XRI>y>Xdym}PEUuyU;4S%)a$LqMb(eOLf zPTp?#hd$E3$M9aN{|60sznA9Dv0OWDNkBT!nD9?3-);DE)&FaT-=O>*!^^b%9~r(x z?a$|iqcooPt>I5-y?!$MW90$e_q%%a)bSE;cqs>D_dp0;z_c5ZkVbA20+vWg0HsM1ii(tgLyRa`QBlFMjyN_3Y@>)e zU>U{UM;uX6oUtoberv7w+Bac=zptOq_pjgc{O`hPL|en3Qr^+<7nCO& zepJ`PeGO02@JWVG(s4S%@LaV&ZlC1J|DMj{87BNN)laVBcWXbNZ1|^Y_sR|bMtOzd z@9KPAWq3CoU-J$BoA$#R!~2g!KR@4a_kB-m4DYJ*ru$tur-zG_yXWeTzo+xpH71>J zl)L?<3-7+S;#L#BR{PU-!`=6@KVbN`8vbF!-S-_oVR)3<;eCb=&~|^(@C>!9uN%G~ z9Qu6E@WHz8K4^HZ^23Jj)_lJ<{6V$PKN|j;a!=QfPM@oMl&6{D3F>ZTcpn|7?F{d& z>#;6|uhaEmPs81NX&XZ`7jgN%p!PP#@OZULZ495F z`F1e;B-KMV!_OXocI;z#8$CB0Z1}Hw?mFD?`?T&?E`)h7HB-RGWX_B}+hWlzidl>G%=dQou?!C;RhIdIuy+#>cq4Vqn!{c-v z5-|Keop_JK1b*M zI>Vzi{fiAx8w9;=H2g75=NiMu>pI-Erz_6}-H+UA!q@8jwcT*{fA|j=K2Gi4!-gNw z{mT=E|D^NaKEo4r{&>;wXSl%hdBgAwP5(pXJWO~=u|)fcJFj*1Jx|vgUDQrE{+X6% zu;EM8j!iH;QTal{U)TQTet*@a?|%P!lL>!B_576KEw%r@X81X(pN|dyRO|bLa;Jw+ zTd~$WZ}0#}SDt0jaF15*!bho{nQy|^>bSVm@LAfQA2Qti9?Ua_U##VK?+eFJF}Q0c zsvZuR@Kbc$9WnfDwUeICZ?63A_iUOgcj>>T>z_6zy!#&DPEEq=lqL#tzhm#xIbX+h znhCGdyO-O9bG`CoB^hs;a#zm#l%He5->R8kW%%>juI~2?T{>4HdGBcx-n~Ecq2W&d z-xxkh`-%JhMVJ0`O~0qw8>a`Cev09r=sC|=$_%D*`VIl1^;elEK$|14s*OoY5|Qu*q6XUVnkV#6*aFUvS|Fb#3;cNxNYT-e3L zPgMSWT7K8hxcss7=aO^0ju_|f>Pffq@pB;)M=4O@%If5$#7`8z_i98i-6vFj7ylZK zugQnRWQ`vJdgJ0bemmVXqd(J4ymF17=mM&A^>_Gjy5Tf!{AC*dfD5S7#($XjiS&O! z^}kW$vHp2TyZBE3C(4_nl&|5d=XKD5&D$;hv+HL5*X!0>mDboq# z$0Fo2P2%#cjX!H{ba)g zDTa9yj!U2O?AM_&OezB})obsarbWG^&e%|uQ-xjU;AZtL*UEo4MmY8k7PG^ z*$r*8>*L^H@nwTozdJi@kC6Jfjb}U=N}%rZM3+c?>F3$?`3JJ=RvhqZn?1-mAD&OH zBVJ7^$81PVT(^7K2;BCnI}*OMza-d@+97-0?wT$X^h>X%UEPY$y_(ht)vxYAMBR}H zN{uyrxLbBZ?SY2;&$Am!xyVOy>c4!9E0tZp_YlixnwD!QmFo~y?m&I%yL$t_uz%f( zcf(e8rK?v*)w0xuG)X^{>O{X@ZB z4XBkip15;n*O$IYNpV*kwRU&wwX0F^1KAC!(KITSkI{Vo;SJV1Qhu1+$_PckAKuKa z=aEZ)Jp*!oxL+vZ!2g$s604MB(olKbHS;lLeQFgAq|G#tHd0yF&&qCy?A?zGNl}w` zXYUQ{KT4myfvqekoy`rY{d#+=JdcKSD|Smw>I3@^4^iK`1L5Qs`=CT%kCQ?kVdN2w zG^PDEl3G$)@7zrTp3=$fKyqVtLvb7xRY=?Zuh)NF|8n+*;cW=4&)$$*Q@{zb6{ zlx-fV*6og?0Q=~E-@`nA9X~|&W!LSF;4lrPPi1eQppBa4SpSf!5oLS2p2Egu_oqVd zhr7P0h2qrgy_CG?eY%H6qOwfQnk$xAHNH>Sk}2e)u2aL7=7?)&>hN)^mW))N4rBvj z*ajSkkSwT$dX3pr+g`nUsfnl$Z2k0OTFg^Za;|#=x3Kv1F+v=&q4X9pDmybbhKtJX zty^)6SJR99_Q|876YC+I3tYG2-muyr7Ji{_HTCT=r)_aUeXqL5Yk}OnB>cKTxT(=!w*{akYb*CM-6u?nrdaNnGHD{EbNH1@7AKQ$iZEgXn|i zqna~M6uUNC!tM0d?p{8gZmG?9_;JIAg<62R&SSf2IZV<@uVlCryhkOfKog$0h$?>aUcB-+CP{ zzK&PWV@E_mRNK=iWm8-3Q%iF-^WoHZbq7}dq4vA%2bbzto2u9bjJOkNkc0ojJELi= zPY0k5QLWeU4|pA4ho3^ZowyE1YvPWr!(soyqoj@cz;?&S9c{g3xAgHl>Q-!}>A${d zmmA+VtTsyeeu6}hfjBs9(~$?^Jjvb&pSg5I+*JepYc6qIL?Kj4ZGd)3@ zG^9ozXA%#Or?et!J91jI3$Z5cFs=;agq4kw)Yr+B#lKa%A?gq+ZL&DRfPFiD-^(P@)Fj{)(_KX%7 z6r{yf2qHN&B($OR5YGoxF<#a2jMb1&_q=?eRU6G;lj*Khe6jq|;B4zI>_(CH$r7`^ zl#<`ddx;Hl!rgjjLd^O&_C8K;CtScZlpY8zo*u>G>By|?6s#U=d|9G3T@ydW>&!c7 zow>EXbW45y=DhmA#?1QsODIQPaILZ{&xXJ%tdHteZ1I-I$PV$-cBH_%6`RACsM{wu z?JKu>H7!YO^lHd*U*grO?a!yPGuu-ef2b>CrLv62@XhT2sPTw+?KZV2q=?J4C?O2_sTon{qvIkO*2o^74?<86N(B4ALT;v&*jkI=fyLI-GJ{U`H5ryi)>?F5bdD zsbK|cf1Iq{kJJ8x;eLd7#*-ZHm``3|#-v0d#et%NX>`*>GG;ep`EU=VMVkE494%*- zUiuV|XTZtymp-*5z{eNfl)~anxyjT!Z?d~7(Li3NB5$hmq7?rB&;QpnkeN>HJt)x| zFw7e;+#4|3%cN6H?i_R+$0NgQ!I!2V_p27n!oz6eLx*&O`98cE--ky+M2nD=B6_!* z#y(-(`H*--pY|LF-hDeQXYX*apg{e)j0t)7PuNWNexyH_9;U#1z)7hg??D}R(S3My zlh}hhPh`|2zsL@43tWuIj`8zD_nqP|3Eg*&zsueG9pb0ceMA`PK(h2ZCaem1c1pM@ zbl*9F54fV5MW(ViyVVqmAyvmU4B9{kJr2`y`qgX$QF|%sCsA|c-7d&cOr;x_V)d*Vq9baZ45pqSF;`hCygfx>Y8o9X_9UZkkd@7|9Q(ZaRi>hzYmeTiP z7FJbxQ4KA+O70Zqvhedc%-m!zYNJrPALd1E(hx18qn0<1rbD)t6xoY9zxhifaDPDz zw*>B2#Jm^c7shf<;45Q34e?d6oGJL~nD0V-O)M)Ne4S{t)gpRU7j;P_>!4NTGB4`# zNUn&g>xu|2adc$VRm}rbFzEGWDU3Sq6h|0*c1m%=HS(^A1d0=#8g;OFHfcX*?)>>) z)W=dojeJOoqb>Yd(-!_*QqmUwuQ)m(k1wTaUEugyd=g_8E~@sTzK!K<@GZkp-%GiM zA=nXd;P*hIeiFxU`1~S{5$cFzEsuobSMeDI$5F{=w7l>V6&5D0vCh?%+hCk?4Pn;= zFOKz9PUUGck+d1%$vaX};b9SziAS(U{P3vgu;!Q19ilc5Yn@6#y@W+xR7_YLdqjG1 zgNfYak{P1O#D+zj%_-aw)i$j8ub~v;!!Uf1UINmKhO1pzEGN?fu9M(Og{wVWHJW;d zu!!vxw4ILW?P0BWYcC!Cm_aSX)ogp%#2x7aWEfuBH&8C`}={L&PLP5zHl-7SWyJ9tjLuoF65Wkk&&8-=z*=%dL5&Mba`!Z9lo7< z6%1XT=%kxmW5qwag@`nWGKfNmE*-_M4@75t-}E4euX>7KI9vzds_Y{v_ZP1(kijPq z`yrl*l@R#K=Eo5EE{KotJ=gExXI$}R&t2L`QvD!yM~G_<#BC58A(leyLvFSPk(!#NQ!q!ZbZmic*Jy4TtF7R^ZEUT?LT^kpjPia9sj19%2Ce-ht~c5T`+8 z!|zA99)nm2aXS23LhJyngeV4#fY=AP9HI)aJ;Y!r@J9F*LX3mof8bh!wrhrd_Dct; z=C3g#zJr*KiSDSdJam{_JBh1hOA+_Lbv?pAi5@&NPW(P-F5(S{_K5Hhg3L#dO^A07 z#2fJY4iOGR{1fn21i23RmBZB?Y39SV0Agm0^t|un`l(!#*-VrGwXF?o>URxrEG>C~1XCTP+T_nO;zKBH-b0BVo z*ah)dh$kSHL&PGLLvT$&(ro}c!_^IbuLJgm7z@9Fa1DcNKSEBxKzJ6eA0T=|q(F>? zm<&-4aWTXoi1(57Ur@izfHy*Hgh+?Tff$AewGg=w=@4}g=R;f$aUDbh#LW;sL;`Ab z1#-U`Vha53gKI5BHN0p$rS1w>Pq^m7^&65t08s!xA7VA&LWGzrCx;i3&i~pPb0`Z5MMwn zN4qaYPhJV}Z}jqO;o1gKjWuqqWbiml{bU(f_}8HMy~SrTLN7!Tb0FS@sDT)WJTIiF zls=C~iI|Fc;4;9AAkITJw@Efv$n`S0Zj(57A-($$>RIvGE!Rio`m}_40ij+&sEfsC zmt6lU*DZ3rNUje^j0X|)FM>7;>W)NWQ1qJ40uMs5g$Rys-K?HgUT-;j3cKq7L7R(`+0A2}E55Gx>mjN*r;yUgBRdRR`mF)`K-VWj&1Q`lfUx;PM_6n4xFI09GatI>Zo8g)YaTk&v)mJi_ z444CP6Z{@SpPs8Ng{f!-#N`kT5Z@xmEQkPFssegMo3uv2<`7S!&#aQX2cWLm5Mv+) zqCRzKwN~9E} zn1-t$TA_gNz|{_}9dP{{;xNSDA-W>SpW(U-;wgx)A$lXoFK|5v@hU_V{Jw$)!=aD^ za8<%gjR!1%7zA-CqW=lvbkt}K#KjN~qJHfV;Yl=H9MbF#Q3luv&5;2(4B~m{^F4?T z2zdZ)dlc}$5Vr!(LsPAWm;$jI;%bPyAc_#L65IL zN>JQ2D8#*;#jKtr*BR1V5@5sHVa)bNMHWMGYcX^;LEHdwC&UE^@;V~Ch&I`Y-uW2B zUWmU!Oh+l}AQnShj_B8-BW{DM4x$`2$bl$D4b~&%EV!~DVvu`3h*1#VBVIEk_Ao;J z6QU!6jE2U(Kv_P<*hoNer$YP+I00fFL@NABTZtay-`X~ z13rq1ybV#VMhhaZuOv1ZuCt-(0Fs^ou@|X453v{{xB_A`#5#z@2(k{jUkcF~seA;# zi{bhVTMk4!6|65pw19|$NQ5{IA|GNRL#7bKDHsPdbbN?(K+gMghd*y13*M1TDl zq7t*&84$G)^C5VtnZ7aAA!L_81Ko8M>fO6i4cmrZDBJ69H77)K-K!qnrnv1aY?bBXdSGE(e3x2)h#q|#Sa`1y-Q{lH4@m9d^Fyi%sxE%4a z(fB(N?*hd84Dq%iUMu+JBi=&xhY5h}R!}=OEr&@VgB0eudvQ#A^+| zrx7m&e#;Q=WB6@Bych&I3GvpVoMQp+K!lgzcPiq22fvv}vjzOlL%gBzyAko8g5NO2 zI|RQn#2XC1>k)4<{2oWVdiebSzq{er8S&0Qkmr!*YSiHi`27d*PJ>??_^pIr75rXB zninI@BSWs-gx+}L%eU`cPHYtN03CsyA=6l0^W}Z|AJp0;)NsLBBa?0uieFXdn$H4qmfqeT$cL0kfH5uz`HxEbO~h#L`oBgDfH+aY!$`W+B2Lp%lXCu~19Lfi>) zKSUauaVf<4SQq_($>vwMhF~$<6QU26SY07TLL@=#MGxtV3AsHc*uSDn-3IX(#7>A8 z5n%*E4uW_AJ^5*f3$d1a7jxIR9dNtxLM`ACj3t|z(Y>2&3T~|~(9y5A6wEGt7*BccZ53vnH^je7fAnt^ihIk($ z-cY331%B-yk}-!DLZm{BK&dyN9Xg<5@4%Ih#q>E4=b?b((6;#y&7hFe5#&EuLHvM_ z!{C<&u>j&XRQhd%d>5|oQHU<6!xt!7bGQcfkT0B{P#aEMumemTVT5WA6BB7!^*Ep;Z*L0vrqRDr)o*L?S{SfEu6&3#$aVZGK)es37(~DsM&xTk7 zaUR4zRONAq!>~&qKn#IF>ILCL`~*uhMhyhSXbikT5Lw7JIb4R}f1vpoz+AvDBE;{0 zh##=od{tPtW+IwFY{dE8cwqyOTTh5rklQ;Dk3j5!_z%Pn5Ur6`NniKaJo@CYR@e4D z=7BNt!CveSy;mYTeLUmBW8D@)TFMot0j=d8X9DqNO`%QZ)?xpJK(S3KU&m-_;_;yZeZF zS%XhpD#_PEVKr1;yQhy0#c%uk>_RoyP;2839}|kd1;7j68rF%^bRT(dh8$sAq zqX5hKZMuj}>q7x9ZX+>Pg}}B{iSf&YE|cBuCB&B(c3Vte*ARYoSR5BDV$&TfyUm>I zg`X4Fg5Q0M*mUp8ZseSYcZ4D~-Lf)~5@OIcm1M-G?JMcMIeuj(Hkw~Bij8L6o&LP= z_52Ud@|mMwpAoiY-vD~^iZfV0f^WIZJ!Y|U;tS$jwX!G22wy)HH8^r%FaDB<@C|KV z75@kEbkj7T&E36N=x2b!Fx^HgHtrouNEcrSIiTp6V6~v##p+p|n zNLyD@*TLs@%^azI5{;JKtf?MS_m-8O7mAXvQ4%?Y@Qg4`)HO|}19xa!1svF}AS+A@ zTf`0a5hWKJT`7&nZ;{1D^E>+eB=JQpS@35&1a;N1^z|)0q)`@)=6h1JG~uF2+=Stq ziqL|K%J~(-Pzx>A2Af0ab5kPyF_NVY|_@+51Zu>0$`Wb3Jb)Jz*!NWJ5uFea1 zxKQ1w^gJ$NqxsD|ss<&Q;0C#u#%}tAZQ-xT5*>vl3_u;`^jKUun*yh?7k3j<16zWy zHetP6#m7dp>fEYLSlecC?a8;77aKc)5RH#MUJi|-$dkN?R%2sNi5(NmPG1AiOT|%< zVH09wiNZIGe4F*7z+GbLrM395*w{wiyk(O_Mw5RGfoPX1gV@%TF=x<%-t=n{lYX$d zY4)v}#-q0q)z|03aWZ6qbKLRl1OD}UXx${W6R<+p`{scd_2+-C+$(! z)o;m=_u0vXPt$kZ9b&Z-=;Z1l*A zk;4Z|q`~xkK|^NDt*Q3@uQC{tl;n~}Ui0S87&3e2%;WPK6AI@oC8IcZ!R(|tT*1(n zVz8rT`J&2d;$-8hYi7~=`Ge_i!7-q=k+`UH_**?F{H)3<3QG27{({Q+3m43t$w`ry zNBO{$JF}%Qa_6R>maPwk7rTs z$L0C$s{N>G{*cxFNmKoVTEE#Gzio}*=@dWaG{5;$KP>u<;eJ%~Y`KZ}H)>ld?FB3( z^irRS5?|*>t??tL`dy;$_FJu~^&{W%+sdsUkw-Nf8qs20bd4YTi66Drk6z}-*Z6+9 zKa|QEmg_fv(@&`JqsIBe;BIxd-;u(O^GCsb&PA-|k>mV=HU9WD{?sIYe2t${<%j3` z?W22e_8qtSaclgpv;8>I=WM_A8o%vYKaP^QiQ6S&Qh2ZU=KtdaB=?!c(R_Ci(vB z;r-*O8HV~D*Z8fd;FHKJHhPI4xsAfLiWc=pJ2`Tl7Y8OMbquTbO+HU9C z4kR}#KZYIT(YlU2sIJqvY1;a&h8!y+hjw?V&yKDW^<2&k92>osMOQ9n#KkMA>n3p7 za{X`?+x@VJpS+EJcu&7`c<)Z!_c~JFqxUQ6x<-3o$2!ix#UvWi3I0jcLi_xa#`869 zJe4q)%|vIqMpyZX7x<*cX4FI5=K9TU^rM#eRHzOQQz_c|5kvj9;k^^MH-~MFt_UB{ z*6;YK?{D*CX1nXnemgEzjo+V(Tf;ta5iM@?W9s~tb(~Zy3R;T}MxEv+e;^01^5gIJ zshTard&K+AH*s&4c1@=L=%aRxzEP5+f^lbKr{Fcxo)OU}LlZQ3Bbt-t;{?Y?9gJG; zH?Q-p+>=vLR9NKYRAlCq1v5#O6_pkgWlYMZf9xf;a(M_)*2Vec$eNlrtehkzFWKh@ z)5-#H2PG_d1k2MiDY^3e{Gp7p^3yUilT(Ii<$^gA3%Gzq*;I1Mm&%2jWR#TzGlvCp zC~9dzX)usE6p17cr!c`lNqT_Xfy^9EQzCQyR9BP&`AG?=00kvfMGB=U1~nZIl^!`f zohM>dL2+eu?L4VwdS0M_bwi1!l}$`1nO|6tQ&Lz=cg~NroH7hrNecug1*T366r=@% zq#ep5Ezg@jeOb-|nr~}o*34bFpjrx%Uz8W9D4ZNb=`zyt@(5=ICl{Bn%r9kU8JfIE z!sKOUPA(;wQykzRWktd4(kxUczo>u`E1fL5M4_~HV<;pmlvCjHvtqLfq+^9zK#~tm z4Qd(6IJ~6Gon>;G>X}lSiYWxFWqsl*PJ3s;k9PNkMl(Q%)FEg)T7>A@vr8Ox!-4<756c3Xt zCrU-qx@G0iU===^I4dI$%E&4z4&?J#D@!jfOv}tj3zlRh592^ZY1E}jqD_&MwDz-rVZU%Btx)4)fE3lPDZzRgpn9Du=(>(R4#U-45m7ry))B7BaE#n+p(hjwDO<~F|GsO9eczr&pgtURh*hC<@z88MM@g#GF?IG3X16IQ`5t(pv>D+j%<3shConALPdvi-E;OqvaZ~yc{Hr}Mv@av za|kX5l^#Ycn8vA7nrxSfa=dv97tBs1g%HfmD4)i$$vj|K6$SJ1XgbU<2(YowkUk`X zlZ>pCo3x(6sTXDBQKZRD%^VqZRH!(R6)4HbrchD_w%u7|RfcirquI2ujHWKA3)*Ep z^Yl%ff3(zJ%vGuAk}@X?%1OJj6y#AoI6m7n2_%VgXMo9K&$NQf0*nSuU?R^Ep#%b$ zE(%LaIHc50nz@+mD5(L{V#+X?7OBKMn~}n$X>#+6$VN+RQA8;Tm3mCNcka@Ki)V2W zWP0aO?#fHqHQsVL*gzB~597KcbDpvSH0&uan%9fCpO6&8Agz|kvk4oO6!PIQQp#E? zr|FqQMsY^UFyX32Dgz};>l&&QM;b|ntt^k5#cfJUtATsFb=&Y0sv)b7d(Do&&g?lm}XYETKekq$n#b zBg3mGn?A3$Qq$rdubFY2DQRMMxkD9d2%do1&E7iDvUqyu{>Gd;JF656tLnM4$)+UE zoHKnf@v_h|foHQ~uhC{ed$8QJETshv1*a<0l?P_2^kS|HX5k`T#5h7Wr*bxZ`DP{O zLgP44Tq4TE5}-*>$x6!$($Xj>4Og5as|hUV@@Q6pzDkNqsWW2{kyRYTa*PHg2QDJz z@Ss7)tOIJgVr@DeE~V0nd1={M96AKJ9YT2{T4;1v&zvrcZ8pSGhR{TgUQH85pdcfU zCU#1a*3$VIWUY@?ETt`r8qS7>q9h}Ow^-~aDO>tov2+Pp++|BG%1SaP4?}2P@d+~Q=QfJ8IHHuF1bbd8+;rvAlt1D^QK%*vy z`x^BWE6Eoi=H_jb%D%xJcl~1Gve3`}- zy;6atV7z{0>yH7)DiiZZ)kOy=n5exhv@1dZU_R0Ov_=Vdix$(IxhzQAmTI?Sa?`J* z#mm@$PQ0Q! zh=K$8`CPAzJYMEx&}>JhG%t<2Z(gD74>Iz2&y`+8m*O$(os~mFg=ATNQ7|nNr6ZFl zgE&8{v_RHNq|H29JW((=Ox#tYoiqM|^tu1k_f%EE*!ej4xSipNM* z#ISJZ%FdHmNFD`u^A_dDAS*}5ms@~P4+`cC6F*+kaG8SHQc+$;uv4~z8YGJrLPcyo zf|GP1%aJ(YbY9}J3}$&%yz-)ZwlQ2RS`Vc;o5Nu;XyD6;;hX`;9@1U)Idc~k()Yqo zUoeZ~b33}-LAtEOLe>?PDHo$gqmbGoFO%!eh34Xr3fwMrmKtGMGL_28h!w=MH&3Fv zp5h_JfO|J}ZrvtQ*CCrdB{cG@=u45O*HrNSp2E8I6)Y!#yr48aB_SpS+!A_XqvCk9VNNQx}xDqxG~7|iHoc6R>s^i6iISvJaC}?64X{hKG51R zm_zW0mMtBpLYr!6K3&XjI`ztGT?AzXY3vnpB3v=pE9r8Q1}zhU-YmCX3RQxGhjy~E zp_C@a5si2TN@OCJZ82LewzTDG>4kD~fSfqoF@{Yy9>J0{RtW{7wP$U0$HS(gLmu$54@2U1ecKN<7_6G4@x4C$!kBZdaI zyxmaB-Lzy{h8!8tARt#(i71x#Y@y>hr%Lpu$zs#^#0$%X+yHh)MQM4ozr=W!;b>I#de28yM^X}n3K2A5$HC}1IDSq=rLqU6unV6#tWfU(_rVHyGko&yaQ*4eg3t;A=RZ{*icVd`T zoKch`&06M`HDw_KM2jssmms5sW~PiMmV}NZ2=h|`vIKmDD7jMrTH|8Y>{iCJ`ZPV^l zDlXypj;0PyELf6XoEWFJm3LL63Qg!qeQyJMT-c%IR=7M0ZoDR5WC-jU%&O604k;?gSNkVZKmBpy6E=Z%LCE6OkOL1g-KI7IUE9bIBSpwbg6ewtca5m%ZV1nlMrceXKW~u$vDBl$f9E@n&}o%`bE5N z&y-IW zWt+o?M%5V$Yw4i9X8xi~s=iF`Tu*KYcZNr&^=TP0czBk{B;!_4D4jslOdgp|EGIu- zG^h&*G6ULs$%2Y~ZA?{^C5sQYddFkWtYPJ{P@o5%fpR%H&C1Ajnq?yoHS>ufSC6w` zU##ru1`P!Lb8a|PmjTHSF1Qr@Ohjg34(m=TgC2cxCgvzS5ECtC74Y#crHWHf-E9?> z&|-lz&165)2aPycWpIMne@lj;>TwCD6gOJl&DYA1G^73xiLl6 z;zupCG6@v354Q#HZfVBJkWG&yJQ*#K48b#k9A|I@K0D$SBd?mL@k2l;Ov)^ZmF-Yy zRnXW0_^GofTBdg_Qs`Dzd|5ELoUD`wnj_=jHMR1ZB{u*!-elK#wI8wSkR6w^G;^5q zr-`eSs>@p!3c@=xF14&i;NX$N69>;u99&hDlR?)d zbF1ghm^*K7&GPYc=F-b`3y4jxUQX{JE?&4`VQux`+67B#D>j&Z8F5}^HF?U<5e}vw zA*`vKNk4Q&KTk*jIX!sHoHxCCj`OCM5y)d^RTDSWkRHKMd*h7?)d)?fu)z9ih#tqw z8jb5Ky-3!Ml-*1^Mw%jLTG+|RsLszzqZ7hxNtqSMtwm2#(;4dxmr4ms6gcM$;o%>OT}Dlt^-lxadeegW};R0E3JddeUBGwm3Yh$j=+37BtYw z>gh>7ZyMZ#E_X11V7lz!*mML&2RZmzv5F;?i>pbkCxLdh8dxet@85Fdv*FbrhSQ64u3*Au?*r{OoqfaBnhGT`%_z0nlEsNSrXpcH_ z1^rH@J{OkyZ~)fzFuA5sVcEhr(N!rwo8kFCAnyaQkEF{A3}u_AM-Q}O2^2{mAYI8K zL?Y|S?!rZ^5y~hi&l+57P!7CSr868}tm4I=!Ea4eqv zr7MLpXBV^$)k~+LRktKtCZ~N8fjH(9iJylxWm%K+9@-QqQ(C+@nLJD;JT8NaOOFwB zB`-&tdccc%h_x4;rc1BaL?x=&DqLNdtDaDOd38lhW$({t8Tzy0n3 zR}Pst4xO`$9gxK{-kD$nP%4Ldk`sp)wdw=zTscn)%By6QJRU$(5E&|@Gd?+%IK1%X zw1e{e?3g|Xt17{;;-Zs*Y+8#H@nVU|6xlLRTagLlaV%w5qeksIx0;rZ^y+(Y<+-(U z7gx@bSo->*duxiA&PKWe zc^aDqUb$kTX?&4}%76$s+Silu(2`6}W<@1>P{u=qjTD+)PL{;G=@@0xNfrHr|MftL z(SQg|K=QOy)WliH(h~0z;!!W2^3GUZQ^|$Um5P{vP;iN?2ZHh($*qaS?1?YUxN>07 zSPR(nW8NBTvR07JCQXgQ25u{7X>bDN4s*CrGzj^egN`8SyrX)~!o@ZECK6|dLeN=h zs1B?xX@jQql^oaxXUd$W=g?{{*%Mn;zN7aeSa3IJ9CG=^rCbK-@mP_BjIdOd*R$kb zoT+b$QBM3UIGs2Bhyov7V30H#Cqj$xroah|%JP@6Ox}>}rkUW%&$lE@#>{6^_ zbC;e6^M=JRB__GE2W7!I$Yd)|YkBJ?v!WY3l33$@L*_#1>vA4Bl+ut2@H6(>1>B>G zZ zG>|KzG$EY@(rD)lbczuf~E1jRQQ0ZW_xIOUFB_~hM%Xw$W`X&#& zRl|>tdBl|jc`+eU<_2y*&M`lqI}Fv+JrAXrdHT+i%p_8t#sePwO9DR*rJhCaXH%MT zrU^IaC0TQoIl2^%j{3AN$)b8abHg-Y&m*~DoP0nQtXVnI?=W1lWl>54U;Y(?-v0}F zGp1MbteBW|a3ZT}z2yXp@%)zd!tOB@F9~EC;+cR;T;|THnmm7S14pccdjjCr zP)MGN#mS3asX^&U0H=jCI9bxev~p}prL$0{(aDWg0b<2ybu8Jt*N`$q1*~CyIi2G3 zQ*90*BU1h|Ldx58K}%_gU1R-YFa>0)BCgL;xq#&2nAB)m|{-b7jfrQErpr9&!XrV4Opz z$y7yI_n~&QbdY~3L9cOdgqNq&fgVp0W%*PTd1;r^l_xdG|bW9kW+^uH7o znb!NBH!&k)Y+}FC8FX4)i-WSk$+hB2zHr#kq@lx;hV=*Mf7tctzf8S2`s061r{gvL zkJa7G_}@+WlK|m`omcFIEsG25+@e|ZM*0s|{(1}fiVKoy9462z?xOIFmQl+nfclMN zP9OPaeCHp2nFQdtr;D%W$yWh5|A;HYIRN`#p#Jhz1kOMF&!PBR)L*`B!udy3#JKp6 zs=s{eM##T5%=y2o{__9)&Ob|%SD)hrRh@M975$pt@t+9(*WVL-B0}0c)-yu1e=MVa zo~JfwOhb**bn=kh~M!${GQ+8+*di@9z6KyubD25rtef&Ow21xPs^*IeGJVQ6(wo3nym0}EX=2{m5UclpGR*% z&Y!txIhT=H#oYOe=9v=Fa)^EB&?{I?9@sSbhn0#7Iq$ESIp>^;s_AnZ*Lz@46pT8z%9R2ZU=kM@l9FRUP{5%a8|2uq;;V$3d z%DFr|rX4@iglGHDpQ_&pztMzuBXjfbgx_Prvo84a?C*sC)`U-#&{W>v3Exxg8hf)o z0Gaz?R^*ebLGKzf}tNaP5%lt*|uJP{T=@G@9@*~3qfqYe^zeO z|DZY73SXhqw46hAO0em?_B*^EPmm`_XX)?oXO%mB9#MV1tlaAJOB4QQ4S(c!!k^Rv z<#Fl%rs2CPx9OkXgg0%M+kS^X{X6`l-{Cd-1xu_?{^~E+A0AN7<>W5!`0IubB0v5N z)dB9pX99a`m2=gWV)Ri7?@$M-9D z>k`LbRi4L*(8uvNl@|er_`AwW3_qZ}-0*|SPdEIK^0N&8T=^`+oqd>N__rEJOX*BhRo{1U@EDBoy!7v)zPo~WGH zSNvfo|MgP7g&}<$@27mL&_?d&#aj#?s^RZ2+|8HU4Ii!H?=^g!@*Re!Du2-MOy!Rn zo~?Yh;d#oRGQ3FnKEq3tKW})s^8JRNuKZQQ&r<%T;j@&#Yxo@H2Ml-V95j59hCgI@ zjq=Y8U#9#^!!J<&t>G@6BZjZl@V^+oUO8=oyF_`U;Tx6X$DkYgn@gvK3BOsx z#~Hpwd4l0vm3J`w7Uf+Gcj+V=zFoujGW=fU{S4ose30P}Dj#aNOJ}&@yEXi1!=F+< z&hUN8Qw@J!d8XkmoovHj)$n)@OPD$7=A!`x#2FI(+xkQ;mJqR(^}&w=2KH@Vk_6H~b#u_ZnWJe23w?ls{yR;vIfDfDS zZXf%&;Ww)u{%QEP+W0RUo~7=88NO=}z-NZL@&CQyFMl3D2En~qhF{hL9?K1n(SCT5;Ss9;D-0i? z?d$BY)6aMvD0iFi3*>9GJ?|fezs#M2K5rY|NzYAwH2f%UM(K0ZaC|d9J>Sql>&g?~ z4dG)AzabI4jp4T_Z*O=H`8HzOYg;bAPEX(LYWQn9?)n=(RP{5&ay4M<3=h|S;^t>p zuTyoLy5|6nKcWWjPLs~j9;ol%4F9M0&nFE3Skw8Z;Rzc4EyH(e|NO}C&$}RB_ucHS zoGtl=K3&z`JAP2@^FYJ5CLsK1!*5r6m}U5(9tc0j@He!d*Bb81xyJCT)!4grjVou0 z+OaJr{EW89_fEq<(Q>+Z%%yWqUxeRp!n=CCXZQ`;-##Eiu`qUaeS?%Xm!z*;W?=t*lE&tPoJH5SP z`14vGcdqO7P^|U(!i2v<$K!8?pRD?E_Q|D_-W~NyRJ-N)IxT-6!*A36Jjn1Fnof%0 zOV!?`8h#D3_3{kwt?5iP-069Z;S3~^}NLJ^HuLF48K|Di?xPt&~emY_yh6C_j1GkqWoIJ&(ZeU zYWNJbOSc)Gq4UMvhIiI>*o~=);WYB)x?aL>-!$@l8XmuN)5yO_MmaAt?e&d@zuNFmb$+_R@C3CFw-|n^?wjs1 z{286s?l-(j`@=(qf2HAf8{Sp>)n3Dsv^*~uK2rH>hEGubuHj|MKQ!F^Qo*N&yYrtf z4gXr#Nk14qU+vOwhJU8qSINa-6|B>CX<_)!%Hs`xLHk=L!+UGL>TdX6t#3cWQ*~W8 z#PFvzosou*(DoW{_+p)pG7W!I?ffLeNA*SjEH=DB`BcLP^h5Zw4Bw!9w&4%zJhH&> z!8(3x4bSP1^e-^{IpuYR_Zx!n7aM+`@=b;p>-u)H;rA)O$?%yvf8A#IOUmyy{B515 zb{IYz#q=IAJVwLsF?@vDy=M&HsC>WS_p2R#!|*7bPyc23Z5sX~%XOXex#7KZpY@I5 zck8*qPlnIda=KT_-1r)-^e`t>g3=!+%n~-|&02U%g@YoqeF^e;K|< z!+&J>Q#yV>H~e6Kr1Op8LsSnx8J@1|&oCYL?9Kf)GZE=T8-AaLZ*BNWP4^_j=^MV~ zbF$$ZbzJu{JWKgN!|&1k#W2G!)%kmj;qU7_?$)QSUTPk^i6;EU-Y92*;a6xsFE#v8 z?VqO`{*vx%W*RGw@}G57qjvG`y4c&x;ISq3yN7@_|VIO2hZ6 z{;xOOy_a~i;lV_tbEn}?YyZF3@R6#|U51ydU46{(soKws?RSB|48lL_lCFDe*3H8?!D4TomXA|oTlR?*6@5CUu_L{ z>(`Ek_tE(%(eNj-zBc@4wZlIeext58JhjKJ9V6PJ0?iB`t>c$| zic~%>{C9euPro604F5{)SSQ2hX*!99zp3TxYxujI5q**j|4sL0BMi?~`!mk)cwIka z82*g%T*H6Xb;4xB_v&~oH@rgk%N2(ITl;^N;qPg?%s0H9>dn13?)2=QbDwX*Pu1|N z4d1T)?N5fEso^&me!aH)6^5U!cI-OC>(oAMGyFnL|8~QB#G@VWHhi0gckjcy`fgJ_ zKV-u1*Y?_N`1LyP?=^hjVC4Hx!#At_dByNMmA_^9tIFRue3`cIM~3g!dL1@=g@*sy z@b@+R5yQi^pZ{ifh0YiByNvR2daKk0TnoduX@841yqoH|li@!OLb}}z&rbsHYj~E< z%SnbG)bJw=pRV?2oZ+`C&oKNp9bdVI->&P}$%eaM0WUY){r_Br;j2(BugdUCv|Z*K zzD(UUhToNhgw8j7MxRebdgDFAr)l~J4R5V_J8Zan zZ}n@#e^onn#PHhTsMk@$XX^P&l;-c+Wtz5&n};1QK{B5Ek#fgp>3rAOq|-_5TMxst z)DHJI{8{Bg4PUG0A)^dGN853N;U6mx7=EkrJj4I32`%*N!vQ z9)4`Xzpng0h9A*+;akK1q;}wE!(UVG{vXZd``QpFsJV`B$2$)Nk25@6$FFp;m>Km8f18p?ypk}e?Z6GSi?`z@set|JFlN;cor9!J_Uwb%w@VE_U(anWG<>1%kJcG}i`vgi4Bw*t;0nXHE5FY0 z$8}!YW_Y;H7k3!GTg!Qm;dP0kW^bqA@w$KfyWyjC-Sw2=4XU^243E=(<=&rl{qWD) zuii4@59OAtU;U{T7{Lt`UhN7IG8Gc$a_*aJSQ~ew<{J(0KjvC%i+bc@@yVLV)iAcYt z;s4O^35LI^_N24nJ+*)KF#J0t@AWtQW(_~o@bCeMFv{?Ylus~xx6XF~!`*&9&v3Vo z4H`Z~*WYe^?euf2?u)0J@ULn+&N2K)9d`>2U!nbEiQ!ANy;c~0vd&*?4Zl{`Ee(cW zs_TKv4R5RC`dY&uQaicT@EdeKz1{GC>Avr;hTp}CqR-z9Pt|sL)bRIo{61;;`#P^Z zYj~3O^Op=iP5GOKk5Ik6Z@7D3{A0tv)_LkbhR@S>`PT3`!%*L!4X;)nuH(k_A05_S zbHg7^L^^SX57Bvd&nq=Npn5*d@P~#Y#tg&n*Y(6)!zv$&#PEA`eR752za^pk*BQP~$LTi1ck1}M!|)M$9(a%8ZCW7xorbqi_uma))*IoU zGJJ#fx91FZ@6*3*_&K`2e#`KCw44VFPaceXKQa8zYH!^-!i|^5m49c#f2{5Ji{ZPp z|3s+$aOqsF124w#@3dXo7(Q0@;NI_c>3pi^f!$2_2(51)!*?kkYFj+*f996UbhdT;X&2^8-`z|{pUTyGj)DCX!tq} zf7tL;)$`YepRV)%kA}aX>ty*dJJPr7=OZ+oX4-!p|4iGrmEkEmUfLPHRnzZccrTsD zdm8@E0BLq_fZ+w2Z?fUdHQ&*OPtbmKs^M*Q9?vqoR{Kf5;U8+hDlz;nU00lD_yFyn zGYog%n={w&)3rY=GW>1jOARm8aeATQk1Jni_&S}xE-}2Pt{<*2yqUJkb%vj=e4F9! zdv)$G{2^_Zdko*AdfRFEMqNk!-S9kJC%E;L>xZZ5dcd7qJN~TlmrXja>G*xi@JYJ< zIbisHU2lJ4_;l^h|26zI&G$RQFV*$TFNPQCzCJ?xi!1*GZO0hH-%rH2Xk&PRj_VGF z->>b}&G3`ezV$IYUeh0JxO;Bo-XnJ9oUH4gQ%v~1nohdmJv4ld;ceB<6dC?4XGEVV zhA-0obEe_$c~zz1x9GT@XZVe(=W4?TYJWJ-@R@3VRvUg=q7>6xZ}?l8ezndocNu=_0F>u`!!y}>cmnqLpY2Wz|cH+-4$p@uKi@iNNrZ0zNSospeOSE6DFua}i=e34M>bPz&yh{1yhQFuh zx7Qk;qT^_*;g{=pyxs6`mH*Z7H`Ffu&G3;epod2dzfRpx8a_hz1kg7({;aG zX80DZ?-_=>|C66(c)dPvJ;(4jbUs~d_~SZ`mK*NguU%z$yxJM}K9Os$b;>U_;V;&C z>MFw{wcWQEo~rZ0pAGM(^Y32_@2lhDKEpp({-EI>>-zI?!zbwZ!aoduSNr!r4R`JR zs^K^5y34(H>GZQu$LYUK_zr3xJ~e!ghX2y=i?uvI7=E_)=idxpqV@Gvy7HW_{iKEA z?m0oc;X8D{)5-7>wPW24-=n;r;f2~RLku4g1$#Ks@VUDFA8&ZaNQBQcJX`JXB*Q<_ zb#<}f@9MlZ)o}OIE@v73cOAd84S!wdYxjMAPS3vXvuaKFDatP}Ja+)Ytn>8;hVNH?$nY};p!{DLepu(P?+xFmcJ)`o z4=azKJVD#B-0<$YKCdwRIW2#c;g@QA%{P3Ht_NxiKU?kU`G!BH ze2w7`sDA1VzgzA0M#DeXdR=4qZk;b~G~9g;-K~bF=)QHk;oquVdcg3Tw7)%UctG{} zgyBKu`wVZT_Tfdt6Lj73y5U#qy81oCACE#mJZN}J?azk||5p3e*M__I;D0o{yY@Hv zksHd&jjtA3uVyM8|4i32tqd>H^A@)+bm8y%e`tFT@TjUS?t3QTkc1X`5roidLRC-! zNtuv95<(im7BD0bsgi`^6$^+8*ubk|xe9viyf0OfnPs49x{|+$RpI;0$`~l9NqYQtU>(|kS z51>C}8$OZODfxz<9S{4L7=8rT&0`JUP5Yl{_^Gsejp1j|PZk)yjCNRTcop|=ry1Us zcJ|-5>g|69?R=imzl-&}*zjvPF0L^AO76oq8t%U@^(Mo&&_C}q+@I5JGQ2(Kx5o_6 zqrW|4c!=ZZCBuhupYw*{=WraoXLviVN81hmfa~U0hTob3fB4q${+#!IGW*!S~mR97jzI|C#e=E5m=IpL8^Q0`1?;@Dm21{(TI87&w$__zJGaBMkT7uYHu^ zSMfT_@4tMzPUg7FHTtEjr~llK*KfuB`4pqylic55_4-$FpH^k`cd$Nl46o#PtTp@( z`ok%P$Fu*=G`ti0>s-T6X1`o$_&xLoe}3=le>Cm<52Jq(=jVSK{xj=ytKnZz{~p61 zp&k79m-uoM=?|NY{?GLDErxgCeDbQ{R}6&%y={27JNO5NzsL2?fBwMN=VH!pUmN{J zsvxiL48Mfu8+#3Zi1pcL_?bM1X`JG+i>`Nb+alcD@Jq1=o|c@M*@I4|`# zyc@^$5W~M`xg!l<&Glle;a6~eix{5B^()Wt-5htthF=}R>lnk6=vUJX|Af~Ivkc!u zKc8=SDg9@W;a^gJnc*)`|1875BVS|qEbiad8GgaAkb7Njxc^9x&D4* z_}T3D9}WMO{CC4Y;Qk?wrjd=KY0|Gn=% z|9GzBgN*+1^xNTvpFn&1=c9c-{~Uq(ryKnjfkQclw_<%J8J(U*bG4 z!|;{7ZklcQRL(R0du@IF|HbjX)ad_8{WA>TM?0Kj`0E@;7Z~1?`03D)@tjC$OIW`}=*lC7l1CGx}GuKCc*_!twH!;bXb~ zeBbb{oS#26{CAeS)9_Qcj_)zt-yi+O@G32KJI3QU&wQtHil<# z-aEwb;T(6}4S$s5sGs5f`w<2keir@eaKk6iK4T0Y!1X)J@Kebr8vYB{!6L)ga2}p& z_+89rn&B^TUoq40i4%Q;@cyw33LN*#c9B^utF`6L@YnEln> z@UMC!pF<5loBNqwhTqL~WT4@%vLA;Tei-NfBMkTJ{W!xH$Duys4L>3tyuk1h`clZMf5gKM zR~qiWPv=_0`>Mmp>t@40-vKaGJI?!@ZpC4#{N3e@Ym>vlMOFn{!|A6H~d+)x8Cs6sQ)*^mvMeP({TSiq~{pkmHmFc;g`@qFE)HSsvo-C z@Y5N-#_*L4UvKyx=6|c<=P>`f4NqlzA29qCX83~P zsL;;UU`LSHnMJyY?A=Bij{l9rNS# z49-hU4IjaJwlaJf$4dvpzh*rTHT-tYpFIsQ7mzm)#}tl1KEq`?0s-PjUVqX!!HwLk)kGe5B!Tk&iL_QqEVIhBxE*^3VJGc2%+8 zCmH<#&0wEW!|SMjtl<+muBRJ5h2_pP+&@=3*YLkH|60Shp*o?ZhF8*mPB(lg{d}e2 zqsZ47el+=7!{g~^ml-~q{2zw<@7K7_@SCacf8W5{Kb_YLcN+cm)W6^Gv_>$*BZePN z{-oheIgYj%-kElL#qf)n&zpvK=XLjchNtm-=3~SC@6dcF3=I|A_j14IeoG^+`2+ z$Z+uChPUGUbA;vW$D<9ulJj%K@QvgX4S$&SnQV9y`l0{67H`kC1!T>wl)<{aBxK3?D{*zTtVy=VHU3;Qrw*!-sSIeT-bY zgH3fExy|V3a6k5$(dRN7`orjRyB$jE2fy(7=O7qrP44^U&Yp95p+^4| z>W?w{et%wK^!@LWR~hbqXMB<2{<-AK48NA^%T0#AOn-jJ@Xu)f-wc1A=ha>Nqut&P z-}v>HT(ea>^q^lIWAuG}PBHvV=D*7Dc&8nAzl-D7Klj~4ifbwVy&WDf`o6uN7`}@0$qsT~ zpG6$RT{ymd{=VM_8t(lh-SAmjDS73P`~2Sn4xMWB7jivYW4QO%D-EB=add;pKb`r% zWc0nC|I2Vc?sgjP$6dhj=k4$SuV7ld}YimPkjxL-J;sP_OPOP6qS}UX@QGg@)29=g*y6HBZW$H@~hbZG1s#YHi*0%GnIhoL8T=VB!1)RSWBuGViKc z71ax;&#hwX{_jPKB-K9j{qJ)c$2b0anmuQ?`(Q}dJDuXjMG4+)Uk*8r^NJpWXxcFaiQsgu zD(;f35EE5_6#XFK7=t63Xv<$NO!M^hl(+6RCkOJ!5d;*z zd@s)zexUTzmLY-Z{%Bi$`b(Lf*+<2BOdkb&jwI|AVyuO-!f#uS3G8_x*C9vNg#~r|I8Ns3Ru^-Tvu+n?6aH zojU}DHlL|~L!m>B!AvmJN^}mCep&};KJRjA_+!%#9+I-(D>jJt_5l-*$5r>Z& z<=#zea(W~$J1*RiV>mQ6>K_dyhC&N|X$XyTZ^wx(+J=5e?)qD4&Z;j~?Oj#B_uR-I z$(tg7tSR05`qxi>nizg6XN{Y>SG}>O(M88U?R9fjEfeh@bJj%mCO?qVOy!!=A9E_- zNPZxzutn07t6o%8y{fQTOd>5{NA;@6?k$l&wEW};BD;I*la;HUS`*n3Ez0H6s8AKF zS1j8ds!w=OwRaUZ=u0IfZS|8onpdyb8?NuPCh|wl`keFIu2eE8nvfC1I-YX5-z9!UrT1qH1 zCM19A204*@&KaV$V(+-REcvr|(aOzr2`l!d)D`cV%?x(FBnt9gdq^|cGOmk%yC!tT z=O3>U8%MUUYPs_|=;;_jVJo&j5sf?>k?LeVGMaMN9FL~0*gLJhiL=+vmt#~@q*{ka z9S)qlw@*G!)H;gV0jsbjvPbKEk(ypQd)2m8TXuB+Yu~<{Rgt|bmhB1E9i6jc+1^my zP{~caLb`XW?+WpYO^voDZ;AopPQBHPD>wW8?dFo#x7GZ0J_$+wPyUJgHOm(oyl=(s zj?M%3sYys{T$@ zk|l2njecTr`xTKrjn$+8i~@5{fZwa#Xm3pvblOoWSjQxyISEbkq;oY z>s%&@HcN&2NzUg+-h3|dR_M9N+oJP1bap`OUXT(JpNwo?6Y3e+E%s;cJt}?R@VJgE z_Qutx%BXzvm#t6kjbE`n`P|6c$(u^w)@W&y#;n*Lzbf*sl&?LsYYb4gRgn)GDlsm6 zZsaYAck{Q}TwUv3L)e|tw_@;Zy9Su>Atub0d@prc z6L~ir*)ElNKH446qdOExcTo2^(G}ZoQCTI ztI1_;+)K8g;arIJRxg&7wDE5KIrz?DXNhPx=pA6|v2&PcXgUAqowiph zEy*N8d@INu`A)sxjS^K*}t9t*~0zZ`wGcVQ|#Adac{kX zk~W3wyG8Rm;FeNt^WWUVHTi#RtKS5*bZZdjiJxSj=32j7-e`fc0J(0y`$y^KcLc_2 zZ*k$>0mfsre)}&J(GK6=9BWuWtT{eUu5Z0!*^cD;=-{YA3Gt^FIurGXmT@2x?HtKG z|Jxu+My?6<9W*~T4ZB8GYa_qM{^$Q<{5%+w(vP1XrQVH_SAJpL<;Q~!i~X%sC0S}6 zW39CNf3!w_ru}c$2ve`Y4k!E&yAt=r=ouGRJ*I2l`gR->i=ut>qzrlIGY?{VmRVr$ z|J>Z|(z@;YwGOku_WyMjpyK~uvw-fI&s_GS&H{_Ntcm=Xssle}`n&u)aT$$u7T6?j zq{C%E+$is&&Z-0A$AiufydYS1fPS9vzf25S(Q*#HZtUtNIVHGDoEU#!B$YqVu1T+P zc5r>dp8Gdx-VSVVSlw(Ty2f}<|AQ*H=GlQww$tF&VTW!)rLMoNDgDC@x8wKh+xNoL zE&AaEM$SgWe?lQW<=XGnxMf2yE>YHSS*+unh;J0s$fQz`EoZH$6WZ5Kt~AJTSt^nK^H zm&p6Z35_(n;G`CM_~9ypzhP7ig$5^$my0;QpVLvdnTbP!c}cZm2|XDK1@l|Pt5p~{ zL<5NkEO0R`5jeS(Ch3U4!p28Ql9VPh>Ow)SE58>a>XNli{X$I>Z`Zu#e<-MrPnMMK zedAWn1gv_vZ3`XH|5L(4{*;jG!P5_x&~bE6z)U(Uct(;X z4hg3u>F>3<%7(i)St-y5I%}X2VtTq}zzpGDP45w{W{Bz2RMWRWpl>U!KWq~2?`+Zq zF#}x&DF~#x04x+vb9U?(YOa}HuX(8lG-5pm$0rGDu1$SP-Xv?>zOcKG7z&SScDJxr zi3$G*C+R|@r-h+}tHVt;>YFyTp@eJjKHO%8zHhEP4qDeE20yZ%a05b(5O*U&0YW#0 zU3(k51L07@&Efc0wbVulcZQQ@M@zj6TCBs}2*okYJ>mE)(QMT$;fZjPF6qem$#65x zfT3qthc@%&$=-x#SqBM?&``409Y0N$@EmeaL@v*T+utK`O<2~JaQqUir6!i(V+ zy<{8ozqp3eY3%+cFthiI$PJoA$7LVw;vjCDdGvUL1qlcg#_&jXEg?cW7Oq zSQ~z34DQ%=kz%dh`WW1)_4yKVGf-le)*6fVU1Q&OiQ)Yl-uG&)WkY{p%=l^jV=`7s-M)Yi=yVM<-5QNc>7!xv$C3C}h%XLx@cl!b#w-`;g0HRa2eCQc z!C4SDKwJc|7~**}w-K8AxyuTV_Ws+Y{k^dhyP+0}bD^fleqw?P{fxLn5%(2Bn-IDT z;v$GUAijtA6ykk|uOZHbcoX6oh#Mfzgm@X^F^Frh!j5-US%Hd;fau=Z!8Z`P1R@(^ zIO0A>=sbuq5CahRK0>!Z91D?yxL*-^9AZAiafoXUaUWn6L=j*-#PfhlA*um8K%~Ne zS0io`#Aw8QgV1vHT>|{<4}2y0pZF&8pCG2kyRO8yGUvfzu0O=tqj_^D?nLNH=syh) zu59VzKEbyTyaUkz2_AyVT&S!?x;r7>LEKMBunXc9!0VxM1dYF2S_Gi3Jd|Ag+ga0OAgaCn1(XG(|2u5SoIlTLE@Ps2k$80rrMC z5^)0&8ivqTXpY4|coCsrAbLX#hd2^qGDJDVYKTD)A0z8q(7yG6S3_I`kpYnlF$@Xn zAtpd%K&*iH8^k(@D zZ-|GGpcO*zLUe-IhXi{eMnas21gAob27Df&jtC7zt-B)B6QLS}{zBHNSX4Ant*97Aki_{2O8^`h77x`E-a+;pLYjv=O2f+mm`%z!RA2C%Ykq zU%#H)+r>_bT`IZ1?wGm*PRF-r~@Dhq@z^Ca8K{ zX9qurVJAWTW510(CvHo0 z;wr2m=K=m5Vin>hB3&lLkq}oPZXHB->{2>Fe1<9h*RC$>2hrHBnA_VyybqNj2=#?n zf?_X5UHZag(@;V&ioF)0sSvj!>ydq3L6ZS7Q*#pql9Ec+z2BJMH&}%L5(;%-Sl#Ll=21G5IJObrJApQbu z1yhwm^KY}+h!?Oaxe8OmB@iu8!S@krhtPcpeG0J);xUM>P`M7F zTOpo-_#UD+RQ^EdC5X2m8YAvISTGI-*^W>Zrl~Q21rUQEE8c=(g7_!IDG(Pzyp05ZM;iviSc_2IRS+ep?s8P(F8s)QdpEhB=)9#Z=CF1cv;EPK zg)rP%7`kgA{sD0_#Hmo(h6JynPd33jABWfiaRx>)O790T65?m1OF(81L-Q4gPEZ*Ii~SpQ`4VHJEvh>e;!nV_5OW~L zA+EHAvtvv5_gH7m7BJ&X6#6=5vRg5^-UG1>@KH46Ul8S-v>@{Oy38gcbP_BbLDnZi zY(XwBLoCDyu7Fq%u@Yh-R92$&3m`fpmoE^v8lkUo$$?}?gY|_*Gl<3zDGy zD1q3Ax{pI>I7BCiUlDgCLa7jKAmZVUS2lJQcpq>M#CC{NAwIF zh+MQe9bziPWQZ^le23Nss96N?cffF8SC`=kosM;7xMQVQvkM?9A&!GM5t+0_memjo zAbR4O_f?lkcQpB3ETykO90A2cFxXl`?18_22~maB?0ATJh`A6$;O9p{^hB4Ag7~$k zE4BqfI}lpb$H5Si{{rKD4Dk-c79_Y2;s;ElJ0K3hOwFxb*GQ!G-?b z&WQ&Q*Sn1iy^pxu_AWFPaa)jX8RB*!T`!1rNSA}o--L9hBHhaT}2?8F9}d-EhP$LAoyycNNk#fl7O%I}7zZ z67VJ@cpY&^Bi&Dkt3;m75O)gF4ME)1NcRllh9TV!#FZgkD&nq0y2*%p0_j#E?ia+} zj=0W9cRW;HLY`-$4gW^mH%NCZ;#wi@bi`F7?k(iG8hP$TWSnN8Hg!cRSKmBHinV%S5`nk!~i^y^RD(5Q~v673r=-x=~1X1JWIbbT1;o?})2G zx^75!KGGE+?op&$h;-YLt^>qMq&o`fZbrIWk**WsUPHPuh+BztKOpXAr0W2c6r{TV znms0lE()CqWzsQ4N)Hh~*G<5T~J_1rS$2oCk3>k}rX{ z7UJ&^S0njF5D!D#2C)grZ-RIO;u(l@aQSf&#LW=*K%}D^7eo9F`=Vd4*!+pmU~Fc4 zLiE8Ft1HCe5NQxw;30jnAa}q5dk0+V28hQYHbK0G1cyO$5X7tSTVz0t5S5F0T>FNe4r;%10rknS_28-hH$Ag&$6P^{sTAjUx)hFYJG ze&~pXy^l~nHq)~qPC*4nqi^#e5@3+ypz;lN5Whfk7~;|)=0W_0M*j<%A0YHID$xaP z_%~{ngwVh~ZuGZ>*hqhYcna0M522}0$$%*4rUpBfn<4fAc0{q=AzsJa`YYPd6q-8_ zIvImG0yqU?1jGy^Uk7m|#Aalc0+p9xrH;s@Kg0=uJz$WDfJZ{Sg%*7Qkpj&fuxA2P zen#A#fQw+PH4xJwUWC{HaX-W{NH-rM0&xe#SrC^)e24^BqYbB{o@*hFLnT(D^oLNv zG>DHN-ht`1qEp|4_za>3d9Hyt1>$m~+lY?438B>x6)3ilrK8x3pg9|%e27*kb}+

dVd(NC6wW-lpa!96B3R7ljMEe z+Vajd^Fnb`;+p9V_PDk9fu*>qaqhv6xV3ZSsTRH6-ZXKkJRX4DGs64jez?0UE{~~P zHLW*u&j|O_+~e0ic={m=YC~}u;lng8e(hbSAF6c`Ft*x(oA66aaamz^Q$22NiTkD? z2_NE~8(LfL!@Uunfp8?u3LfX`pB-lX3p&?G>&AzhYfIzS&VqK1*PhmurU>anLHZga z)sQTPh2kE&cQwlPao#39vyY+;W@ zRZBu~U$}>1;?`y&_KQQ^GcaqjdMuK-z6eAR_a)6%!eCpizjy(HJKe)Uachr@nrX5Y zFRw~zgfnf2a0{4rT7#7epaX@&y}~ScSV|+}w(e(`)2ST3>Jx96t;67pv%0GxwvK}< z&giaPxpfkXE0_M%yr#hr)0p>J`{jLS7@3E!%Ihme*WAt;hTM*GHa{y%Z7v;%_MS~^ zOhfP-250oplF#)%6p|#8XzG4NU4fFs>#y`hO&!RhP}Ql!_p|M>%zTdfaC9h~&aa#Z zg$|2mrC(E`^$e${qMoz5FQ}2wIDP&rZtaYa#LGZCvW4dCU;eYC;j6k=&XUM9eHKMV zZg+W5EqvryeNavYf+TAd?%kqI)A$yhTeJ$dPG~7lw#e6KHf=gqkc>^fm52Qr^$F$5 z_b>(RL-8$+YkHfhRSONjXa5&~vowdbLAdf`))VXa`<4{SW=8bA}Z7My~IzhARhPN_+ z(xg5x+<%nWon^ZI(HwiQ%qZv?YdF>D#WJHBy$_WCWoT2M*f_M7F@0lWyd@+~45-d1 z^P;@mQ={&k{)v6sGz#TSA5n`BjTQF}hktL;T>iRGzG`^z+RSRkd�-bo4;^wYVE?x!SX*exW0Db;F@`rbLwYQ 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%0Dt*LX>WRZ)^oTf$ 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

=i_Uwwfa&J7s10uy+#l_HOZ*t8&FcQdtsXXu zp9PvV%62jF7AKSJVodS*w zq9`w|FPSl=m=+rTaY2<^KX$-+q895((Gbg)9?!UM2szt^6Pb%{Mmn^PqUdZQ``?|$-bE_)rTP)TJE$p*v zsl}`<*Nf>ozvcza|K$}_GWyGq?B1vR*)>!nrC-xENK4%cr0xdk@4Yh@qf33$vz+dPp)B#GwEr$hRNp5uukSL(BkP-Y$iv4^A~9G#?MZ(>>cUl z>4iy%ho%f5?i3z+B0m5dJ^BKVIla)r?Ql0~J5bp84z~74g#PPmnC#5wAo|rR&9~%R zd|AV!cGNl22=Ip?sxvmTUR@vJ%?2x>evNye=AJS+BP%CWL~Yl2K({5TPlJ9l=-PMj zx<;tj3{-LmmuaMOVRFdrmSw3WCMD6*>QZ0i5H7RhG0SZmHIFOxbs z^fyrPN}BXI0v950r{eIZw%`(P5&U9rIaGg{^Lj_)tX$qT$uYy7Lh_^FFDHIC{Bw!x zS_OG`D2M7l9GOu2D_7f{?ZiX!YL|lIIs5< z&dQ&F{|(~O-sSk#okDt&k)9q%uj;uOa>r%qG6VhW5NOiR-ugR}gQ2 z{6oYq0oOGHay#@GWv*W#`L&RL16)p$bZxgCkq^z6R^9^QJ)uXxRZu-6!OtUkVDEBp zk#G51n(RX>hsLY*Uj7e~9ID^>ntziKdHK^rdn}eu6JQSJNtQYrASz4piI0STHgUDv zpZLw}fPZai{_myy$IImTHD+6d1OB1q|G)p=B|lZ6m|$hM)1u62@pSp%;4RyPXxNU3w7v+FgZ)PuCOSF%4o;{9HV5N0u$Fa8NMh^K6 zOLTJlI{{dp{dp$r!R!}>jH;c)eljL%c;!IR5hull*HsA?~e4rO_<>UB%GZ*-#75*|c$vtg~wA0^YDyl|3ZY5@|P;1;k8^27Pkc1fcW>qIPxO!VBrt-8{8W7e-lMni-T<~ U^H%OVM0_FA|5l5za>?QUA5f1%y#N3J diff --git a/vendor/funchook/lib/Debug/libfunchook.a b/vendor/funchook/lib/Debug/libfunchook.a deleted file mode 100644 index 572919fb8875da340ce412a23d5f4bebb44e0c4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172680 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 F{{xJ)LHGaw diff --git a/vendor/funchook/lib/Release/funchook.lib b/vendor/funchook/lib/Release/funchook.lib deleted file mode 100644 index 7ce89598149889093ecca226d6fb5926af1d0818..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71794 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 NMC>nng+ZJ0{|^ym-97*S diff --git a/vendor/funchook/lib/Release/libfunchook.a b/vendor/funchook/lib/Release/libfunchook.a deleted file mode 100644 index 1b25984bd77f74380fa77ad902ec3030bdc361c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46806 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 From 94818931e7af1ae2437a2707af0b4290a806ce69 Mon Sep 17 00:00:00 2001 From: Vauff Date: Mon, 1 Jun 2026 05:32:08 -0400 Subject: [PATCH 18/24] fix TakeDamage crash --- src/addresses.cpp | 1 + src/addresses.h | 2 ++ src/cs2_sdk/entity/cbaseentity.h | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/addresses.cpp b/src/addresses.cpp index b13538fc5..c5bc2ba13 100644 --- a/src/addresses.cpp +++ b/src/addresses.cpp @@ -71,6 +71,7 @@ bool addresses::Initialize(CGameConfig* g_GameConfig) RESOLVE_SIG(g_GameConfig, "CTakeDamageInfo", addresses::CTakeDamageInfo_Constructor); RESOLVE_SIG(g_GameConfig, "CCSPlayer_WeaponServices_EquipWeapon", addresses::CCSPlayer_WeaponServices_EquipWeapon); RESOLVE_SIG(g_GameConfig, "GetSpawnGroups", addresses::GetSpawnGroups); + RESOLVE_SIG(g_GameConfig, "CBaseEntity_TakeDamageOld", addresses::CBaseEntity_TakeDamageOld); return InitializeBanMap(g_GameConfig); } diff --git a/src/addresses.h b/src/addresses.h index 04c8ccb88..bd44dd036 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -59,6 +59,7 @@ class CBasePlayerWeapon; class CSpawnGroupMgrGameSystem; struct EmitSound_t; struct StartSoundEventInfo; +struct CTakeDamageResult; // Can't be forward-declared, can't include cgamerules.h.. just define it here struct CGcBanInformation_t @@ -106,4 +107,5 @@ namespace addresses const Vector* vecDamageForce, const Vector* vecDamagePosition, float flDamage, int bitsDamageType, int iCustomDamage, void* a10); inline void(FASTCALL* CCSPlayer_WeaponServices_EquipWeapon)(CCSPlayer_WeaponServices* pWeaponServices, CBasePlayerWeapon* pPlayerWeapon); inline void(FASTCALL* GetSpawnGroups)(CSpawnGroupMgrGameSystem* pSpawnGroupMgr, CUtlVector* pList); + inline int64(FASTCALL* CBaseEntity_TakeDamageOld)(CBaseEntity* pThis, CTakeDamageInfo* pInfo, CTakeDamageResult* pResult); } // namespace addresses \ No newline at end of file diff --git a/src/cs2_sdk/entity/cbaseentity.h b/src/cs2_sdk/entity/cbaseentity.h index c76556579..e502d01dd 100644 --- a/src/cs2_sdk/entity/cbaseentity.h +++ b/src/cs2_sdk/entity/cbaseentity.h @@ -171,7 +171,7 @@ class CBaseEntity : public CEntityInstance void TakeDamage(CTakeDamageInfo& info) { - Detour_CBaseEntity_TakeDamageOld(this, &info, 0); + addresses::CBaseEntity_TakeDamageOld(this, &info, 0); } void Teleport(const Vector* pPosition, const QAngle* pAngles, const Vector* pVelocity) From ebe7aeb3f45e264516089e29b832d3886d628bd4 Mon Sep 17 00:00:00 2001 From: Benoist <14257866+Kenzzer@users.noreply.github.com> Date: Mon, 8 Jun 2026 23:50:44 +0200 Subject: [PATCH 19/24] Fix template deduction for windows compilation (#449) * Fix template deduction * alternative workaround: explicitly define template arguments --------- Co-authored-by: Kenzzer Co-authored-by: Vauff --- src/cs2fixes.cpp | 56 ++++++++++++++++++++++++------------------------ src/cs2fixes.h | 4 ++-- src/entwatch.h | 28 ++++++++++++------------ 3 files changed, 44 insertions(+), 44 deletions(-) diff --git a/src/cs2fixes.cpp b/src/cs2fixes.cpp index d8a6c785d..45828ab20 100644 --- a/src/cs2fixes.cpp +++ b/src/cs2fixes.cpp @@ -67,33 +67,33 @@ class GameSessionConfiguration_t {}; -KHook::Virtual gameFrameHook(&IServerGameDLL::GameFrame, &g_CS2Fixes, nullptr, &CS2Fixes::Hook_GameFrame_Post); -KHook::Virtual gameServerSteamAPIActivatedHook(&IServerGameDLL::GameServerSteamAPIActivated, &g_CS2Fixes, &CS2Fixes::Hook_GameServerSteamAPIActivated, nullptr); -KHook::Virtual applyGameSettingsHook(&IServerGameDLL::ApplyGameSettings, &g_CS2Fixes, &CS2Fixes::Hook_ApplyGameSettings, nullptr); -KHook::Virtual clientActiveHook(&IServerGameClients::ClientActive, &g_CS2Fixes, nullptr, &CS2Fixes::Hook_ClientActive_Post); -KHook::Virtual clientDisconnectHook(&IServerGameClients::ClientDisconnect, &g_CS2Fixes, nullptr, &CS2Fixes::Hook_ClientDisconnect_Post); -KHook::Virtual clientPutInServerHook(&IServerGameClients::ClientPutInServer, &g_CS2Fixes, nullptr, &CS2Fixes::Hook_ClientPutInServer_Post); -KHook::Virtual clientSettingsChangedHook(&IServerGameClients::ClientSettingsChanged, &g_CS2Fixes, &CS2Fixes::Hook_ClientSettingsChanged, nullptr); -KHook::Virtual onClientConnectedHook(&IServerGameClients::OnClientConnected, &g_CS2Fixes, &CS2Fixes::Hook_OnClientConnected, nullptr); -KHook::Virtual clientConnectHook(&IServerGameClients::ClientConnect, &g_CS2Fixes, &CS2Fixes::Hook_ClientConnect, nullptr); -KHook::Virtual clientCommandHook(&IServerGameClients::ClientCommand, &g_CS2Fixes, &CS2Fixes::Hook_ClientCommand, nullptr); -KHook::Virtual postEventAbstractHook(&IGameEventSystem::PostEventAbstract, &g_CS2Fixes, &CS2Fixes::Hook_PostEventAbstract, nullptr); -KHook::Virtual startupServerHook(&INetworkServerService::StartupServer, &g_CS2Fixes, nullptr, &CS2Fixes::Hook_StartupServer_Post); -KHook::Virtual checkTransmitHook(&ISource2GameEntities::CheckTransmit, &g_CS2Fixes, nullptr, &CS2Fixes::Hook_CheckTransmit_Post); -KHook::Virtual dispatchConCommandHook(&ICvar::DispatchConCommand, &g_CS2Fixes, &CS2Fixes::Hook_DispatchConCommand, nullptr); -KHook::Virtual loadEventsFromFileHook(&IGameEventManager2::LoadEventsFromFile, &g_CS2Fixes, &CS2Fixes::Hook_LoadEventsFromFile, nullptr); -KHook::Virtual spawnHook(&CEntitySystem::Spawn, &g_CS2Fixes, nullptr, &CS2Fixes::Hook_Spawn_Post); -KHook::Virtual setGameSpawnGroupMgrHook(&INetworkGameServer::SetGameSpawnGroupMgr, &g_CS2Fixes, &CS2Fixes::Hook_SetGameSpawnGroupMgr, nullptr); -KHook::Virtual createWorkshopMapGroupHook(&g_CS2Fixes, &CS2Fixes::Hook_CreateWorkshopMapGroup, nullptr); -KHook::Virtual getTouchingListHook(&g_CS2Fixes, nullptr, &CS2Fixes::Hook_GetTouchingList_Post); -KHook::Virtual checkMovingGroundHook(&g_CS2Fixes, &CS2Fixes::Hook_CheckMovingGround, nullptr); -KHook::Virtual dropWeaponHook(&g_CS2Fixes, nullptr, &CS2Fixes::Hook_DropWeapon_Post); -KHook::Virtual playerEquipUseHook(&g_CS2Fixes, &CS2Fixes::Hook_PlayerEquipUse, nullptr); -KHook::Virtual playerEquipPrecacheHook(&g_CS2Fixes, nullptr, &CS2Fixes::Hook_PlayerEquipPrecache_Post); -KHook::Virtual triggerGravityPrecacheHook(&g_CS2Fixes, nullptr, &CS2Fixes::Hook_TriggerGravityPrecache_Post); -KHook::Virtual triggerGravityEndTouchHook(&g_CS2Fixes, nullptr, &CS2Fixes::Hook_TriggerGravityEndTouch_Post); -KHook::Virtual onTakeDamageAliveHook(&g_CS2Fixes, &CS2Fixes::Hook_OnTakeDamage_Alive, nullptr); -KHook::Virtual playerPawnTeleportHook(&g_CS2Fixes, &CS2Fixes::Hook_CCSPlayerPawn_Teleport, nullptr); +KHook::Virtual gameFrameHook(&IServerGameDLL::GameFrame, &g_CS2Fixes, nullptr, &CS2Fixes::Hook_GameFrame_Post); +KHook::Virtual gameServerSteamAPIActivatedHook(&IServerGameDLL::GameServerSteamAPIActivated, &g_CS2Fixes, &CS2Fixes::Hook_GameServerSteamAPIActivated, nullptr); +KHook::Virtual applyGameSettingsHook(&IServerGameDLL::ApplyGameSettings, &g_CS2Fixes, &CS2Fixes::Hook_ApplyGameSettings, nullptr); +KHook::Virtual clientActiveHook(&IServerGameClients::ClientActive, &g_CS2Fixes, nullptr, &CS2Fixes::Hook_ClientActive_Post); +KHook::Virtual clientDisconnectHook(&IServerGameClients::ClientDisconnect, &g_CS2Fixes, nullptr, &CS2Fixes::Hook_ClientDisconnect_Post); +KHook::Virtual clientPutInServerHook(&IServerGameClients::ClientPutInServer, &g_CS2Fixes, nullptr, &CS2Fixes::Hook_ClientPutInServer_Post); +KHook::Virtual clientSettingsChangedHook(&IServerGameClients::ClientSettingsChanged, &g_CS2Fixes, &CS2Fixes::Hook_ClientSettingsChanged, nullptr); +KHook::Virtual onClientConnectedHook(&IServerGameClients::OnClientConnected, &g_CS2Fixes, &CS2Fixes::Hook_OnClientConnected, nullptr); +KHook::Virtual clientConnectHook(&IServerGameClients::ClientConnect, &g_CS2Fixes, &CS2Fixes::Hook_ClientConnect, nullptr); +KHook::Virtual clientCommandHook(&IServerGameClients::ClientCommand, &g_CS2Fixes, &CS2Fixes::Hook_ClientCommand, nullptr); +KHook::Virtual postEventAbstractHook(&IGameEventSystem::PostEventAbstract, &g_CS2Fixes, &CS2Fixes::Hook_PostEventAbstract, nullptr); +KHook::Virtual startupServerHook(&INetworkServerService::StartupServer, &g_CS2Fixes, nullptr, &CS2Fixes::Hook_StartupServer_Post); +KHook::Virtual&, CBitVec<16384>&, const Entity2Networkable_t**, const uint16*, int> checkTransmitHook(&ISource2GameEntities::CheckTransmit, &g_CS2Fixes, nullptr, &CS2Fixes::Hook_CheckTransmit_Post); +KHook::Virtual dispatchConCommandHook(&ICvar::DispatchConCommand, &g_CS2Fixes, &CS2Fixes::Hook_DispatchConCommand, nullptr); +KHook::Virtual loadEventsFromFileHook(&IGameEventManager2::LoadEventsFromFile, &g_CS2Fixes, &CS2Fixes::Hook_LoadEventsFromFile, nullptr); +KHook::Virtual spawnHook(&CEntitySystem::Spawn, &g_CS2Fixes, nullptr, &CS2Fixes::Hook_Spawn_Post); +KHook::Virtual setGameSpawnGroupMgrHook(&INetworkGameServer::SetGameSpawnGroupMgr, &g_CS2Fixes, &CS2Fixes::Hook_SetGameSpawnGroupMgr, nullptr); +KHook::Virtual createWorkshopMapGroupHook(0U, &g_CS2Fixes, &CS2Fixes::Hook_CreateWorkshopMapGroup, nullptr); +KHook::Virtual*, bool> getTouchingListHook(0U, &g_CS2Fixes, nullptr, &CS2Fixes::Hook_GetTouchingList_Post); +KHook::Virtual checkMovingGroundHook(0U, &g_CS2Fixes, &CS2Fixes::Hook_CheckMovingGround, nullptr); +KHook::Virtual dropWeaponHook(0U, &g_CS2Fixes, nullptr, &CS2Fixes::Hook_DropWeapon_Post); +KHook::Virtual playerEquipUseHook(0U, &g_CS2Fixes, &CS2Fixes::Hook_PlayerEquipUse, nullptr); +KHook::Virtual playerEquipPrecacheHook(0U, &g_CS2Fixes, nullptr, &CS2Fixes::Hook_PlayerEquipPrecache_Post); +KHook::Virtual triggerGravityPrecacheHook(0U, &g_CS2Fixes, nullptr, &CS2Fixes::Hook_TriggerGravityPrecache_Post); +KHook::Virtual triggerGravityEndTouchHook(0U, &g_CS2Fixes, nullptr, &CS2Fixes::Hook_TriggerGravityEndTouch_Post); +KHook::Virtual onTakeDamageAliveHook(0U, &g_CS2Fixes, &CS2Fixes::Hook_OnTakeDamage_Alive, nullptr); +KHook::Virtual playerPawnTeleportHook(0U, &g_CS2Fixes, &CS2Fixes::Hook_CCSPlayerPawn_Teleport, nullptr); CS2Fixes g_CS2Fixes; IGameEventSystem* g_gameEventSystem = nullptr; @@ -900,7 +900,7 @@ KHook::Return CS2Fixes::Hook_ClientConnect(IServerGameClients* pThis, CPla return {KHook::Action::Ignore}; } -KHook::Return CS2Fixes::Hook_ClientPutInServer_Post(IServerGameClients* pThis, CPlayerSlot slot, char const* pszName, int type, uint64 xuid) +KHook::Return CS2Fixes::Hook_ClientPutInServer_Post(IServerGameClients* pThis, CPlayerSlot slot, const char* pszName, int type, uint64 xuid) { Message("Hook_ClientPutInServer(%d, \"%s\", %d, %d, %lli)\n", slot, pszName, type, xuid); diff --git a/src/cs2fixes.h b/src/cs2fixes.h index 643abc2cd..bb205e5bb 100644 --- a/src/cs2fixes.h +++ b/src/cs2fixes.h @@ -83,7 +83,7 @@ class CS2Fixes : public ISmmPlugin, public IMetamodListener, public ICS2Fixes KHook::Return Hook_ApplyGameSettings(IServerGameDLL* pThis, KeyValues* pKV); KHook::Return Hook_ClientActive_Post(IServerGameClients* pThis, CPlayerSlot slot, bool bLoadGame, const char* pszName, uint64 xuid); KHook::Return Hook_ClientDisconnect_Post(IServerGameClients* pThis, CPlayerSlot slot, ENetworkDisconnectionReason reason, const char* pszName, uint64 xuid, const char* pszNetworkID); - KHook::Return Hook_ClientPutInServer_Post(IServerGameClients* pThis, CPlayerSlot slot, char const* pszName, int type, uint64 xuid); + KHook::Return Hook_ClientPutInServer_Post(IServerGameClients* pThis, CPlayerSlot slot, const char* pszName, int type, uint64 xuid); KHook::Return Hook_ClientSettingsChanged(IServerGameClients* pThis, CPlayerSlot slot); KHook::Return Hook_OnClientConnected(IServerGameClients* pThis, CPlayerSlot slot, const char* pszName, uint64 xuid, const char* pszNetworkID, const char* pszAddress, bool bFakePlayer); KHook::Return Hook_ClientConnect(IServerGameClients* pThis, CPlayerSlot slot, const char* pszName, uint64 xuid, const char* pszNetworkID, bool unk1, CBufferString* pRejectReason); @@ -101,7 +101,7 @@ class CS2Fixes : public ISmmPlugin, public IMetamodListener, public ICS2Fixes KHook::Return Hook_GetTouchingList_Post(CVPhys2World* pThis, CUtlVector* pList, bool unknown); KHook::Return Hook_CheckMovingGround(CCSPlayer_MovementServices* pThis, double frametime); KHook::Return Hook_DropWeapon_Post(CCSPlayer_WeaponServices* pThis, CBasePlayerWeapon* pWeapon, Vector* pVecTarget, Vector* pVelocity); - KHook::Return Hook_PlayerEquipUse(CGamePlayerEquip* pThis, class InputData_t*); + KHook::Return Hook_PlayerEquipUse(CGamePlayerEquip* pThis, InputData_t* pInput); KHook::Return Hook_PlayerEquipPrecache_Post(CGamePlayerEquip* pThis, CEntityPrecacheContext*); KHook::Return Hook_TriggerGravityPrecache_Post(CTriggerGravity* pThis, CEntityPrecacheContext* param); KHook::Return Hook_TriggerGravityEndTouch_Post(CTriggerGravity* pThis, CBaseEntity* pOther); diff --git a/src/entwatch.h b/src/entwatch.h index 0132c240b..a318446dd 100644 --- a/src/entwatch.h +++ b/src/entwatch.h @@ -218,20 +218,20 @@ class CEWHandler public: CEWHandler() : m_bConfigLoaded(false), - m_hBaseButtonUse(this, &CEWHandler::Hook_Use, nullptr), - m_hPhysBoxUse(this, &CEWHandler::Hook_Use, nullptr), - m_hRotButtonUse(this, &CEWHandler::Hook_Use, nullptr), - m_hMomentaryRotButtonUse(this, &CEWHandler::Hook_Use, nullptr), - m_hPhysicalButtonUse(this, &CEWHandler::Hook_Use, nullptr), - m_hTriggerTeleportStartTouch(this, &CEWHandler::Hook_Touch, nullptr), - m_hTriggerOnceStartTouch(this, &CEWHandler::Hook_Touch, nullptr), - m_hTriggerMultipleStartTouch(this, &CEWHandler::Hook_Touch, nullptr), - m_hTriggerTeleportTouch(this, &CEWHandler::Hook_Touch, nullptr), - m_hTriggerOnceTouch(this, &CEWHandler::Hook_Touch, nullptr), - m_hTriggerMultipleTouch(this, &CEWHandler::Hook_Touch, nullptr), - m_hTriggerTeleportEndTouch(this, &CEWHandler::Hook_Touch, nullptr), - m_hTriggerOnceEndTouch(this, &CEWHandler::Hook_Touch, nullptr), - m_hTriggerMultipleEndTouch(this, &CEWHandler::Hook_Touch, nullptr) + m_hBaseButtonUse(0U, this, &CEWHandler::Hook_Use, nullptr), + m_hPhysBoxUse(0U, this, &CEWHandler::Hook_Use, nullptr), + m_hRotButtonUse(0U, this, &CEWHandler::Hook_Use, nullptr), + m_hMomentaryRotButtonUse(0U, this, &CEWHandler::Hook_Use, nullptr), + m_hPhysicalButtonUse(0U, this, &CEWHandler::Hook_Use, nullptr), + m_hTriggerTeleportStartTouch(0U, this, &CEWHandler::Hook_Touch, nullptr), + m_hTriggerOnceStartTouch(0U, this, &CEWHandler::Hook_Touch, nullptr), + m_hTriggerMultipleStartTouch(0U, this, &CEWHandler::Hook_Touch, nullptr), + m_hTriggerTeleportTouch(0U, this, &CEWHandler::Hook_Touch, nullptr), + m_hTriggerOnceTouch(0U, this, &CEWHandler::Hook_Touch, nullptr), + m_hTriggerMultipleTouch(0U, this, &CEWHandler::Hook_Touch, nullptr), + m_hTriggerTeleportEndTouch(0U, this, &CEWHandler::Hook_Touch, nullptr), + m_hTriggerOnceEndTouch(0U, this, &CEWHandler::Hook_Touch, nullptr), + m_hTriggerMultipleEndTouch(0U, this, &CEWHandler::Hook_Touch, nullptr) { CreateHooks(); } From 338985f7f645ea57fe43a9514dc60604c8cf0ed0 Mon Sep 17 00:00:00 2001 From: Vauff Date: Wed, 15 Jul 2026 19:50:24 -0400 Subject: [PATCH 20/24] fix bad copy paste --- src/cs2fixes.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cs2fixes.cpp b/src/cs2fixes.cpp index fee043dfc..95d7c0a6a 100644 --- a/src/cs2fixes.cpp +++ b/src/cs2fixes.cpp @@ -216,7 +216,7 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool spawnHook.AddGlobal((CEntitySystem*)&g_pCEntitySystemVTable); - g_pCServerSideClientVTable = (CServerSideClient*)modules::server->FindVirtualTable("CServerSideClient"); + g_pCServerSideClientVTable = (CServerSideClient*)modules::engine->FindVirtualTable("CServerSideClient"); if (!g_pCServerSideClientVTable) { Panic("Failed to find CServerSideClient vtable\n"); From 56aeaf8ea6c5b974effe388eff75624a9a411c7f Mon Sep 17 00:00:00 2001 From: Vauff Date: Thu, 16 Jul 2026 19:18:59 -0400 Subject: [PATCH 21/24] Replace our signature lookup with KHook's implementation This allows for signature lookups to always work even on signatures modified by another plugins KHook detour --- src/gameconfig.cpp | 52 ++++++++++++++++++++++++++++++++++------------ src/gameconfig.h | 2 ++ src/utils/module.h | 41 ------------------------------------ 3 files changed, 41 insertions(+), 54 deletions(-) diff --git a/src/gameconfig.cpp b/src/gameconfig.cpp index ceab26717..1b6c821f4 100644 --- a/src/gameconfig.cpp +++ b/src/gameconfig.cpp @@ -1,5 +1,6 @@ #include "gameconfig.h" #include "addresses.h" +#include "khook.hpp" #undef snprintf #include "vendor/nlohmann/json.hpp" @@ -219,17 +220,12 @@ void* CGameConfig::ResolveSignature(const char* name) return nullptr; } - size_t iLength = 0; - byte* pSignature = IDASigToUint8Array(signature, iLength); - if (!pSignature) - return nullptr; - - int error; + std::string fixedSignature = IDASigToDoubleWildcardIDASig(signature); - address = (*module)->FindSignature(pSignature, iLength, error); + if (fixedSignature.empty()) + return nullptr; - if (error == SIG_FOUND_MULTIPLE) - Panic("!!!!!!!!!! Signature for %s occurs multiple times! Using first match but this might end up crashing!\n", name); + address = KHook::LookupSignature((*module)->m_base, (*module)->m_size, fixedSignature.c_str()); } if (!address) @@ -287,21 +283,30 @@ bool CGameConfig::ParsePatternBytes(const char* pattern, std::vector& b return !bytes.empty(); } -byte* CGameConfig::IDASigToUint8Array(const char* signature, size_t& length) +bool CGameConfig::IsValidIDASignature(const char* signature, std::vector& bytes) { if (!signature || strlen(signature) <= 0) { Panic("Invalid IDA signature string\n"); - return nullptr; + return false; } - std::vector bytes; if (!ParsePatternBytes(signature, bytes)) { Panic("Invalid IDA signature format \"%s\"\n", signature); - return nullptr; + return false; } + return true; +} + +byte* CGameConfig::IDASigToUint8Array(const char* signature, size_t& length) +{ + std::vector bytes; + + if (!IsValidIDASignature(signature, bytes)) + return nullptr; + length = bytes.size(); uint8_t* dest = new uint8_t[length]; @@ -310,3 +315,24 @@ byte* CGameConfig::IDASigToUint8Array(const char* signature, size_t& length) return (byte*)dest; } + +std::string CGameConfig::IDASigToDoubleWildcardIDASig(const char* signature) +{ + std::string result; + std::vector bytes; + + if (!IsValidIDASignature(signature, bytes)) + return result; + + while (*signature) + { + if (*signature == '?') + result += "??"; + else + result += *signature; + + signature++; + } + + return result; +} diff --git a/src/gameconfig.h b/src/gameconfig.h index 9a296902f..6c1828efc 100644 --- a/src/gameconfig.h +++ b/src/gameconfig.h @@ -27,7 +27,9 @@ class CGameConfig void* ResolveSignature(const char* name); int ParseHexNibble(char c); bool ParsePatternBytes(const char* pattern, std::vector& bytes); + bool IsValidIDASignature(const char* signature, std::vector& bytes); byte* IDASigToUint8Array(const char* signature, size_t& length); + std::string IDASigToDoubleWildcardIDASig(const char* signature); private: std::unordered_map m_umOffsets; diff --git a/src/utils/module.h b/src/utils/module.h index 0bd831bff..801144ff0 100644 --- a/src/utils/module.h +++ b/src/utils/module.h @@ -31,13 +31,6 @@ #include #endif -enum SigError -{ - SIG_OK, - SIG_NOT_FOUND, - SIG_FOUND_MULTIPLE, -}; - // equivalent to FindSignature, but allows for multiple signatures to be found and iterated over class SignatureIterator { @@ -108,40 +101,6 @@ class CModule Message("Initialized module %s base: 0x%p | size: %d\n", m_pszModule, m_base, m_size); } - void* FindSignature(const byte* pData, size_t iSigLength, int& error) - { - unsigned char* pMemory; - void* return_addr = nullptr; - error = 0; - - pMemory = (byte*)m_base; - - for (size_t i = 0; i < m_size; i++) - { - size_t Matches = 0; - while (i + Matches < m_size && (*(pMemory + i + Matches) == pData[Matches] || pData[Matches] == '\x2A')) - { - Matches++; - if (Matches == iSigLength) - { - if (return_addr) - { - error = SIG_FOUND_MULTIPLE; - return return_addr; - } - - return_addr = (void*)(pMemory + i); - break; - } - } - } - - if (!return_addr) - error = SIG_NOT_FOUND; - - return return_addr; - } - void* FindInterface(const char* name) { CreateInterfaceFn fn = (CreateInterfaceFn)dlsym(m_hModule, "CreateInterface"); From c4e2c9532bbd02f09b719e106846117f26d99a65 Mon Sep 17 00:00:00 2001 From: Vauff Date: Wed, 9 Sep 2026 00:43:51 -0400 Subject: [PATCH 22/24] switch back to metamod master branch --- .github/workflows/build.yml | 2 +- Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e756850bd..d02a62ff1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -51,7 +51,7 @@ jobs: uses: actions/checkout@v7 with: repository: alliedmodders/metamod-source - ref: k/sourcehook_alternative + ref: master path: mmsource-2.0 submodules: recursive diff --git a/Dockerfile b/Dockerfile index 4580657eb..e080113ac 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,7 @@ FROM ghcr.io/source2ze/build-containers:steamrt3 WORKDIR /app -RUN git clone --recurse-submodules -b k/sourcehook_alternative https://github.com/alliedmodders/metamod-source +RUN git clone --recurse-submodules https://github.com/alliedmodders/metamod-source RUN git config --global --add safe.directory /app COPY ./docker-entrypoint.sh ./ From cd02e273e22304c8a0d1509eb43878ca0657395c Mon Sep 17 00:00:00 2001 From: Vauff Date: Wed, 9 Sep 2026 01:14:27 -0400 Subject: [PATCH 23/24] Remove wildcard converter now that KHook supports singles --- src/gameconfig.cpp | 29 ++++------------------------- src/gameconfig.h | 1 - src/utils/module.h | 2 +- 3 files changed, 5 insertions(+), 27 deletions(-) diff --git a/src/gameconfig.cpp b/src/gameconfig.cpp index 1b6c821f4..b4295bac1 100644 --- a/src/gameconfig.cpp +++ b/src/gameconfig.cpp @@ -220,12 +220,12 @@ void* CGameConfig::ResolveSignature(const char* name) return nullptr; } - std::string fixedSignature = IDASigToDoubleWildcardIDASig(signature); + std::vector bytes; - if (fixedSignature.empty()) + if (!IsValidIDASignature(signature, bytes)) return nullptr; - address = KHook::LookupSignature((*module)->m_base, (*module)->m_size, fixedSignature.c_str()); + address = KHook::LookupSignature((*module)->m_base, (*module)->m_size, signature); } if (!address) @@ -264,7 +264,7 @@ bool CGameConfig::ParsePatternBytes(const char* pattern, std::vector& b if (*cursor == '?') { - bytes.push_back('\x2A'); + bytes.push_back('?'); cursor++; if (*cursor == '?') cursor++; @@ -315,24 +315,3 @@ byte* CGameConfig::IDASigToUint8Array(const char* signature, size_t& length) return (byte*)dest; } - -std::string CGameConfig::IDASigToDoubleWildcardIDASig(const char* signature) -{ - std::string result; - std::vector bytes; - - if (!IsValidIDASignature(signature, bytes)) - return result; - - while (*signature) - { - if (*signature == '?') - result += "??"; - else - result += *signature; - - signature++; - } - - return result; -} diff --git a/src/gameconfig.h b/src/gameconfig.h index 6c1828efc..bf5de6fac 100644 --- a/src/gameconfig.h +++ b/src/gameconfig.h @@ -29,7 +29,6 @@ class CGameConfig bool ParsePatternBytes(const char* pattern, std::vector& bytes); bool IsValidIDASignature(const char* signature, std::vector& bytes); byte* IDASigToUint8Array(const char* signature, size_t& length); - std::string IDASigToDoubleWildcardIDASig(const char* signature); private: std::unordered_map m_umOffsets; diff --git a/src/utils/module.h b/src/utils/module.h index 801144ff0..543af18dd 100644 --- a/src/utils/module.h +++ b/src/utils/module.h @@ -46,7 +46,7 @@ class SignatureIterator for (size_t i = 0; i < m_iSize; i++) { size_t Matches = 0; - while (*(m_pCurrent + i + Matches) == m_pSignature[Matches] || (allowWildcard && m_pSignature[Matches] == '\x2A')) + while (*(m_pCurrent + i + Matches) == m_pSignature[Matches] || (allowWildcard && m_pSignature[Matches] == '?')) { Matches++; if (Matches == m_iSigLength) From 75ed954e0054fdf372bdbc5f23f70eaca16b47df Mon Sep 17 00:00:00 2001 From: Vauff Date: Wed, 9 Sep 2026 17:52:45 -0400 Subject: [PATCH 24/24] Address automatic review findings --- src/cs2fixes.cpp | 2 +- src/detours.cpp | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/cs2fixes.cpp b/src/cs2fixes.cpp index 177fc2b52..57a11ba66 100644 --- a/src/cs2fixes.cpp +++ b/src/cs2fixes.cpp @@ -1309,7 +1309,7 @@ KHook::Return CS2Fixes::Hook_ProcessVoiceData(CServerSideClient* pClient, return {KHook::Action::Ignore}; if (pPlayer->IsMuted()) - return {KHook::Action::Supersede}; + return {KHook::Action::Supersede, true}; if (GetGlobals()) pPlayer->SetLastVoiceTime(GetGlobals()->curtime); diff --git a/src/detours.cpp b/src/detours.cpp index f209f75f1..8dfcb7eec 100644 --- a/src/detours.cpp +++ b/src/detours.cpp @@ -242,7 +242,7 @@ KHook::Return Detour_CBaseEntity_TakeDamageOld(CBaseEntity* pThis, CTakeD KHook::Return Detour_CBaseEntity_TakeDamageOld_Post(CBaseEntity* pThis, CTakeDamageInfo* pInfo, CTakeDamageResult* pResult) { - if (pResult->m_flDamageDealt > 0.0f && !pResult->m_bWasDamageSuppressed && g_cvarEnableZR.Get() && pThis->IsPawn()) + if (!KHook::WasOriginalFunctionSkipped() && pResult->m_flDamageDealt > 0.0f && !pResult->m_bWasDamageSuppressed && g_cvarEnableZR.Get() && pThis->IsPawn()) ZR_OnPlayerTakeDamage(reinterpret_cast(pThis), pInfo, pResult->m_flDamageDealt); return {KHook::Action::Ignore}; @@ -639,7 +639,12 @@ KHook::Return Detour_ProcessMovement(CCSPlayer_MovementServices* pThis, vo KHook::Return Detour_ProcessMovement_Post(CCSPlayer_MovementServices* pThis, void* pMove) { - GetGlobals()->frametime = g_flStoreFrametime; + if (g_flStoreFrametime != 0.0f) + { + GetGlobals()->frametime = g_flStoreFrametime; + g_flStoreFrametime = 0.0f; + } + return {KHook::Action::Ignore}; }