diff --git a/extension.cpp b/extension.cpp index 03d0992..c99c5b8 100644 --- a/extension.cpp +++ b/extension.cpp @@ -60,8 +60,10 @@ CGameEntitySystem *GameEntitySystem() } class GameSessionConfiguration_t { }; -SH_DECL_HOOK3_void(IServerGameDLL, GameFrame, SH_NOATTRIB, 0, bool, bool, bool); -SH_DECL_HOOK3_void(INetworkServerService, StartupServer, SH_NOATTRIB, 0, const GameSessionConfiguration_t&, ISource2WorldSession*, const char*); +#if defined _LINUX +KHook::Virtual gameFrameHook(&IServerGameDLL::GameFrame, &g_AcceleratorCS2, nullptr, &AcceleratorCS2::GameFrame); +#endif +KHook::Virtual startupServerHook(&INetworkServerService::StartupServer, &g_AcceleratorCS2, nullptr, &AcceleratorCS2::StartupServer); google_breakpad::ExceptionHandler* exceptionHandler = nullptr; @@ -459,7 +461,7 @@ bool AcceleratorCS2::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen sigaction(SIGSEGV, NULL, &oact); SignalHandler = oact.sa_sigaction; - SH_ADD_HOOK(IServerGameDLL, GameFrame, g_pSource2Server, SH_MEMBER(this, &AcceleratorCS2::GameFrame), true); + gameFrameHook.Add(g_pSource2Server); #else wchar_t* buf = new wchar_t[sizeof(dumpStoragePath)]; size_t num_chars = mbstowcs(buf, dumpStoragePath, sizeof(dumpStoragePath)); @@ -473,12 +475,12 @@ bool AcceleratorCS2::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen delete buf; #endif - SH_ADD_HOOK(INetworkServerService, StartupServer, g_pNetworkServerService, SH_MEMBER(this, &AcceleratorCS2::StartupServer), true); + startupServerHook.Add(g_pNetworkServerService); strncpy(crashCommandLine, CommandLine()->GetCmdLine(), sizeof(crashCommandLine) - 1); if (late) - StartupServer({}, nullptr, nullptr); + StartupServer(nullptr, {}, nullptr, nullptr); LoadServerId(); LoadConfig(); @@ -492,9 +494,9 @@ bool AcceleratorCS2::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen bool AcceleratorCS2::Unload(char* error, size_t maxlen) { #if defined _LINUX - SH_REMOVE_HOOK(IServerGameDLL, GameFrame, g_pSource2Server, SH_MEMBER(this, &AcceleratorCS2::GameFrame), true); + gameFrameHook.Remove(g_pSource2Server); #endif - SH_REMOVE_HOOK(INetworkServerService, StartupServer, g_pNetworkServerService, SH_MEMBER(this, &AcceleratorCS2::StartupServer), true); + startupServerHook.Remove(g_pNetworkServerService); delete exceptionHandler; @@ -503,7 +505,7 @@ bool AcceleratorCS2::Unload(char* error, size_t maxlen) #if defined _LINUX -void AcceleratorCS2::GameFrame(bool simulating, bool bFirstTick, bool bLastTick) +KHook::Return AcceleratorCS2::GameFrame(IServerGameDLL* pThis, bool simulating, bool bFirstTick, bool bLastTick) { bool weHaveBeenFuckedOver = false; struct sigaction oact; @@ -520,7 +522,7 @@ void AcceleratorCS2::GameFrame(bool simulating, bool bFirstTick, bool bLastTick) } if (!weHaveBeenFuckedOver) - return; + return {KHook::Action::Ignore}; struct sigaction act; memset(&act, 0, sizeof(act)); @@ -534,13 +536,17 @@ void AcceleratorCS2::GameFrame(bool simulating, bool bFirstTick, bool bLastTick) for (int i = 0; i < kNumHandledSignals; ++i) sigaction(kExceptionSignals[i], &act, NULL); + + return {KHook::Action::Ignore}; } #endif -void AcceleratorCS2::StartupServer(const GameSessionConfiguration_t& config, ISource2WorldSession*, const char*) +KHook::Return AcceleratorCS2::StartupServer(INetworkServerService* pThis, const GameSessionConfiguration_t& config, ISource2WorldSession*, const char*) { strncpy(crashMap, g_pNetworkServerService->GetIGameServer()->GetMapName(), sizeof(crashMap) - 1); + + return {KHook::Action::Ignore}; } const char* AcceleratorCS2::GetLicense() @@ -550,7 +556,7 @@ const char* AcceleratorCS2::GetLicense() const char* AcceleratorCS2::GetVersion() { - return "2.0.6"; + return "3.0"; } const char* AcceleratorCS2::GetDate() diff --git a/extension.h b/extension.h index be81d00..8d6bbe3 100644 --- a/extension.h +++ b/extension.h @@ -1,7 +1,7 @@ #pragma once +#include "khook.hpp" #include #include -#include #include class AcceleratorCS2 : public ISmmPlugin, public IMetamodListener @@ -18,7 +18,7 @@ class AcceleratorCS2 : public ISmmPlugin, public IMetamodListener const char* GetVersion(); const char* GetDate(); const char* GetLogTag(); -private: // Hooks - void GameFrame(bool simulating, bool bFirstTick, bool bLastTick); - void StartupServer(const GameSessionConfiguration_t& config, ISource2WorldSession*, const char*); +public: // Hooks + KHook::Return GameFrame(IServerGameDLL* pThis, bool simulating, bool bFirstTick, bool bLastTick); + KHook::Return StartupServer(INetworkServerService* pThis, const GameSessionConfiguration_t& config, ISource2WorldSession*, const char*); }; \ No newline at end of file diff --git a/premake/mm-linux.lua b/premake/mm-linux.lua index 44db9fc..6c9968b 100644 --- a/premake/mm-linux.lua +++ b/premake/mm-linux.lua @@ -3,11 +3,6 @@ files { path.join(SDK_PATH, "tier1", "convar.cpp"), path.join(SDK_PATH, "entity2", "entityidentity.cpp"), path.join(SDK_PATH, "entity2", "entitysystem.cpp"), - path.join(MM_PATH, "core", "sourcehook", "sourcehook.cpp"), - path.join(MM_PATH, "core", "sourcehook", "sourcehook_impl_chookidman.cpp"), - path.join(MM_PATH, "core", "sourcehook", "sourcehook_impl_chookmaninfo.cpp"), - path.join(MM_PATH, "core", "sourcehook", "sourcehook_impl_cvfnptr.cpp"), - path.join(MM_PATH, "core", "sourcehook", "sourcehook_impl_cproto.cpp"), } libdirs { @@ -37,7 +32,7 @@ includedirs { path.join(SDK_PATH, "public", "public", "entity2"), -- metamod path.join(MM_PATH, "core"), - path.join(MM_PATH, "core", "sourcehook"), + path.join(MM_PATH, "third_party", "khook", "include"), } defines { diff --git a/premake/mm-windows.lua b/premake/mm-windows.lua index 28db989..911b33b 100644 --- a/premake/mm-windows.lua +++ b/premake/mm-windows.lua @@ -2,11 +2,6 @@ files { path.join(SDK_PATH, "tier1", "convar.cpp"), path.join(SDK_PATH, "entity2", "entityidentity.cpp"), path.join(SDK_PATH, "entity2", "entitysystem.cpp"), - path.join(MM_PATH, "core", "sourcehook", "sourcehook.cpp"), - path.join(MM_PATH, "core", "sourcehook", "sourcehook_impl_chookidman.cpp"), - path.join(MM_PATH, "core", "sourcehook", "sourcehook_impl_chookmaninfo.cpp"), - path.join(MM_PATH, "core", "sourcehook", "sourcehook_impl_cvfnptr.cpp"), - path.join(MM_PATH, "core", "sourcehook", "sourcehook_impl_cproto.cpp"), } links { @@ -32,7 +27,7 @@ includedirs { path.join(SDK_PATH, "public", "public", "entity2"), -- metamod path.join(MM_PATH, "core"), - path.join(MM_PATH, "core", "sourcehook"), + path.join(MM_PATH, "third_party", "khook", "include"), } defines {