Skip to content

Commit 1b0bc06

Browse files
committed
Add khooks to source 2 provider
1 parent 5986614 commit 1b0bc06

File tree

5 files changed

+78
-53
lines changed

5 files changed

+78
-53
lines changed

core/khook

core/provider/source/provider_source.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -122,23 +122,23 @@ void SourceProvider::Notify_DLLInit_Pre(CreateInterfaceFn engineFactory,
122122

123123
if (gameclients)
124124
{
125-
m_ClientCommand.Add(gameclients, false);
125+
m_ClientCommand.Add(gameclients);
126126
}
127127

128-
m_GameInit.Add(server, false);
129-
m_LevelInit.Add(server, true);
130-
m_LevelShutdown.Add(server, true);
128+
m_GameInit.Add(server);
129+
m_LevelInit.Add(server);
130+
m_LevelShutdown.Add(server);
131131
}
132132

133133
void SourceProvider::Notify_DLLShutdown_Pre()
134134
{
135-
m_GameInit.Remove(server, false);
136-
m_LevelInit.Remove(server, true);
137-
m_LevelShutdown.Remove(server, true);
135+
m_GameInit.Remove(server);
136+
m_LevelInit.Remove(server);
137+
m_LevelShutdown.Remove(server);
138138

139139
if (gameclients)
140140
{
141-
m_ClientCommand.Remove(gameclients, false);
141+
m_ClientCommand.Remove(gameclients);
142142
}
143143

144144
m_ConVarAccessor.RemoveMetamodCommands();

core/provider/source2/provider_source2.cpp

Lines changed: 44 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -45,18 +45,21 @@ static ISource2ServerConfig* serverconfig = NULL;
4545
INetworkServerService* netservice = NULL;
4646
IEngineServiceMgr* enginesvcmgr = NULL;
4747

48-
SH_DECL_HOOK2_void(IServerGameClients, ClientCommand, SH_NOATTRIB, 0, CPlayerSlot, const CCommand&);
49-
SH_DECL_HOOK3_void(IEngineServiceMgr, RegisterLoopMode, SH_NOATTRIB, 0, const char *, ILoopModeFactory *, void **);
50-
SH_DECL_HOOK3_void(IEngineServiceMgr, UnregisterLoopMode, SH_NOATTRIB, 0, const char*, ILoopModeFactory*, void**);
51-
SH_DECL_HOOK0(ILoopModeFactory, CreateLoopMode, SH_NOATTRIB, 0, ILoopMode *);
52-
SH_DECL_HOOK1_void(ILoopModeFactory, DestroyLoopMode, SH_NOATTRIB, 0, ILoopMode *);
53-
SH_DECL_HOOK2(ILoopMode, LoopInit, SH_NOATTRIB, 0, bool, KeyValues*, ILoopModePrerequisiteRegistry *);
54-
SH_DECL_HOOK0_void(ILoopMode, LoopShutdown, SH_NOATTRIB, 0);
55-
5648
#ifdef SHOULD_OVERRIDE_ALLOWDEDICATED_SERVER
5749
SH_DECL_HOOK1(ISource2ServerConfig, AllowDedicatedServers, const, 0, bool, EUniverse);
5850
#endif
5951

52+
Source2Provider::Source2Provider() :
53+
m_RegisterLoopMode(&IEngineServiceMgr::RegisterLoopMode, this, &Source2Provider::Hook_RegisterLoopMode, nullptr),
54+
m_UnregisterLoopMode(&IEngineServiceMgr::UnregisterLoopMode, this, &Source2Provider::Hook_UnregisterLoopMode, nullptr),
55+
m_CreateLoopMode(&ILoopModeFactory::CreateLoopMode, this, nullptr, &Source2Provider::Hook_CreateLoopModePost),
56+
m_DestroyLoopMode(&ILoopModeFactory::DestroyLoopMode, this, nullptr, &Source2Provider::Hook_DestroyLoopMode),
57+
m_LoopInit(&ILoopMode::LoopInit, this, nullptr, &Source2Provider::Hook_LoopInitPost),
58+
m_LoopShutdown(&ILoopMode::LoopShutdown, this, nullptr, &Source2Provider::Hook_LoopShutdownPost),
59+
m_ClientCommand(&IServerGameClients::ClientCommand, this, &Source2Provider::Hook_ClientCommand, nullptr)
60+
{
61+
}
62+
6063
void Source2Provider::Notify_DLLInit_Pre(CreateInterfaceFn engineFactory,
6164
CreateInterfaceFn serverFactory)
6265
{
@@ -138,15 +141,15 @@ void Source2Provider::Notify_DLLInit_Pre(CreateInterfaceFn engineFactory,
138141

139142
if (gameclients)
140143
{
141-
SH_ADD_HOOK(IServerGameClients, ClientCommand, gameclients, SH_MEMBER(this, &Source2Provider::Hook_ClientCommand), false);
144+
m_ClientCommand.Add(gameclients);
142145
}
143146

144147
#ifdef SHOULD_OVERRIDE_ALLOWDEDICATED_SERVER
145148
SH_ADD_VPHOOK(ISource2ServerConfig, AllowDedicatedServers, serverconfig, SH_MEMBER(this, &Source2Provider::Hook_AllowDedicatedServers), false);
146149
#endif
147150

148-
SH_ADD_HOOK(IEngineServiceMgr, RegisterLoopMode, enginesvcmgr, SH_MEMBER(this, &Source2Provider::Hook_RegisterLoopMode), false);
149-
SH_ADD_HOOK(IEngineServiceMgr, UnregisterLoopMode, enginesvcmgr, SH_MEMBER(this, &Source2Provider::Hook_UnregisterLoopMode), false);
151+
m_RegisterLoopMode.Add(enginesvcmgr);
152+
m_UnregisterLoopMode.Add(enginesvcmgr);
150153
}
151154

152155
void Source2Provider::Notify_DLLShutdown_Pre()
@@ -156,12 +159,12 @@ void Source2Provider::Notify_DLLShutdown_Pre()
156159

157160
ConVar_Unregister();
158161

159-
SH_REMOVE_HOOK(IEngineServiceMgr, RegisterLoopMode, enginesvcmgr, SH_MEMBER(this, &Source2Provider::Hook_RegisterLoopMode), false);
160-
SH_REMOVE_HOOK(IEngineServiceMgr, UnregisterLoopMode, enginesvcmgr, SH_MEMBER(this, &Source2Provider::Hook_UnregisterLoopMode), false);
162+
m_RegisterLoopMode.Remove(enginesvcmgr);
163+
m_UnregisterLoopMode.Remove(enginesvcmgr);
161164

162165
if (gameclients)
163166
{
164-
SH_REMOVE_HOOK(IServerGameClients, ClientCommand, gameclients, SH_MEMBER(this, &Source2Provider::Hook_ClientCommand), false);
167+
m_ClientCommand.Remove(gameclients);
165168
}
166169
}
167170

@@ -387,48 +390,52 @@ void LocalCommand_Meta(const CCommandContext &, const CCommand& args)
387390
}
388391
}
389392

390-
void Source2Provider::Hook_RegisterLoopMode(const char *pszLoopModeName, ILoopModeFactory *pLoopModeFactory, void **ppGlobalPointer)
393+
KHook::Return<void> Source2Provider::Hook_RegisterLoopMode(IEngineServiceMgr*, const char *pszLoopModeName, ILoopModeFactory *pLoopModeFactory, void **ppGlobalPointer)
391394
{
392395
if (!strcmp(pszLoopModeName, "game"))
393396
{
394-
SH_ADD_HOOK(ILoopModeFactory, CreateLoopMode, pLoopModeFactory, SH_MEMBER(this, &Source2Provider::Hook_CreateLoopModePost), true);
395-
SH_ADD_HOOK(ILoopModeFactory, DestroyLoopMode, pLoopModeFactory, SH_MEMBER(this, &Source2Provider::Hook_DestroyLoopMode), false);
397+
m_CreateLoopMode.Add(pLoopModeFactory);
398+
m_DestroyLoopMode.Add(pLoopModeFactory);
396399

397400
if (nullptr != m_pCallbacks)
398401
{
399402
m_pCallbacks->OnGameInit();
400403
}
401404
}
405+
406+
return { KHook::Action::Ignore };
402407
}
403408

404-
void Source2Provider::Hook_UnregisterLoopMode(const char* pszLoopModeName, ILoopModeFactory* pLoopModeFactory, void** ppGlobalPointer)
409+
KHook::Return<void> Source2Provider::Hook_UnregisterLoopMode(IEngineServiceMgr*, const char* pszLoopModeName, ILoopModeFactory* pLoopModeFactory, void** ppGlobalPointer)
405410
{
406411
if (!strcmp(pszLoopModeName, "game"))
407412
{
408-
SH_REMOVE_HOOK(ILoopModeFactory, CreateLoopMode, pLoopModeFactory, SH_MEMBER(this, &Source2Provider::Hook_CreateLoopModePost), true);
409-
SH_REMOVE_HOOK(ILoopModeFactory, DestroyLoopMode, pLoopModeFactory, SH_MEMBER(this, &Source2Provider::Hook_DestroyLoopMode), false);
413+
m_CreateLoopMode.Remove(pLoopModeFactory);
414+
m_DestroyLoopMode.Remove(pLoopModeFactory);
410415
}
411416

412-
RETURN_META(MRES_IGNORED);
417+
return { KHook::Action::Ignore };
413418
}
414419

415-
ILoopMode *Source2Provider::Hook_CreateLoopModePost()
420+
KHook::Return<ILoopMode*> Source2Provider::Hook_CreateLoopModePost(ILoopModeFactory*)
416421
{
417-
ILoopMode *pLoopMode = META_RESULT_ORIG_RET(ILoopMode *);
418-
SH_ADD_HOOK(ILoopMode, LoopInit, pLoopMode, SH_MEMBER(this, &Source2Provider::Hook_LoopInitPost), true);
419-
SH_ADD_HOOK(ILoopMode, LoopShutdown, pLoopMode, SH_MEMBER(this, &Source2Provider::Hook_LoopShutdownPost), true);
422+
auto pLoopMode = (ILoopMode*)KHook::GetOriginalValuePtr();
423+
m_LoopInit.Add(pLoopMode);
424+
m_LoopShutdown.Add(pLoopMode);
420425

421426
// Post-hook. Ignored
422-
return nullptr;
427+
return { KHook::Action::Ignore, nullptr };
423428
}
424429

425-
void Source2Provider::Hook_DestroyLoopMode(ILoopMode* pLoopMode)
430+
KHook::Return<void> Source2Provider::Hook_DestroyLoopMode(ILoopModeFactory*, ILoopMode* pLoopMode)
426431
{
427-
SH_REMOVE_HOOK(ILoopMode, LoopInit, pLoopMode, SH_MEMBER(this, &Source2Provider::Hook_LoopInitPost), true);
428-
SH_REMOVE_HOOK(ILoopMode, LoopShutdown, pLoopMode, SH_MEMBER(this, &Source2Provider::Hook_LoopShutdownPost), true);
432+
m_LoopInit.Remove(pLoopMode);
433+
m_LoopShutdown.Remove(pLoopMode);
434+
435+
return { KHook::Action::Ignore };
429436
}
430437

431-
bool Source2Provider::Hook_LoopInitPost(KeyValues* pKeyValues, ILoopModePrerequisiteRegistry *pRegistry)
438+
KHook::Return<bool> Source2Provider::Hook_LoopInitPost(ILoopMode*, KeyValues* pKeyValues, ILoopModePrerequisiteRegistry *pRegistry)
432439
{
433440
if (nullptr != m_pCallbacks)
434441
{
@@ -443,18 +450,20 @@ bool Source2Provider::Hook_LoopInitPost(KeyValues* pKeyValues, ILoopModePrerequi
443450
}
444451

445452
// Post-hook. Ignored
446-
return true;
453+
return { KHook::Action::Ignore };
447454
}
448455

449-
void Source2Provider::Hook_LoopShutdownPost()
456+
KHook::Return<void> Source2Provider::Hook_LoopShutdownPost(ILoopMode*)
450457
{
451458
if (nullptr != m_pCallbacks)
452459
{
453460
m_pCallbacks->OnLevelShutdown();
454461
}
462+
463+
return { KHook::Action::Ignore };
455464
}
456465

457-
void Source2Provider::Hook_ClientCommand(CPlayerSlot nSlot, const CCommand& _cmd)
466+
KHook::Return<void> Source2Provider::Hook_ClientCommand(IServerGameClients*, CPlayerSlot nSlot, const CCommand& _cmd)
458467
{
459468
GlobCommand cmd(&_cmd);
460469

@@ -465,8 +474,8 @@ void Source2Provider::Hook_ClientCommand(CPlayerSlot nSlot, const CCommand& _cmd
465474
m_pCallbacks->OnCommand_ClientMeta(nSlot, &cmd);
466475
}
467476

468-
RETURN_META(MRES_SUPERCEDE);
477+
return { KHook::Action::Supercede };
469478
}
470479

471-
RETURN_META(MRES_IGNORED);
480+
return { KHook::Action::Ignore };
472481
}

core/provider/source2/provider_source2.h

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#define _INCLUDE_METAMOD_SOURCE_SOURCE2_PROVIDER_H_
3030

3131
#include "../provider_base.h"
32+
#include "khook.hpp"
3233
#include <tier1/utlvector.h>
3334
#include <IEngineService.h>
3435
#include <string>
@@ -45,6 +46,8 @@ class ISource2WorldSession;
4546
class Source2Provider : public BaseProvider
4647
{
4748
public:
49+
Source2Provider();
50+
4851
virtual void Notify_DLLInit_Pre(CreateInterfaceFn engineFactory, CreateInterfaceFn serverFactory) override;
4952
virtual void Notify_DLLShutdown_Pre() override;
5053
virtual bool ProcessVDF(const char* file, char path[], size_t path_len, char alias[], size_t alias_len) override;
@@ -71,13 +74,26 @@ class Source2Provider : public BaseProvider
7174
#ifdef SHOULD_OVERRIDE_ALLOWDEDICATED_SERVER
7275
bool Hook_AllowDedicatedServers(EUniverse universe) const;
7376
#endif
74-
void Hook_RegisterLoopMode(const char* pszLoopModeName, ILoopModeFactory *pLoopModeFactory, void **ppGlobalPointer);
75-
void Hook_UnregisterLoopMode(const char* pszLoopModeName, ILoopModeFactory* pLoopModeFactory, void** ppGlobalPointer);
76-
ILoopMode *Hook_CreateLoopModePost();
77-
void Hook_DestroyLoopMode(ILoopMode*);
78-
bool Hook_LoopInitPost(KeyValues* pKeyValues, ILoopModePrerequisiteRegistry *pRegistry);
79-
void Hook_LoopShutdownPost();
80-
void Hook_ClientCommand(CPlayerSlot nSlot, const CCommand& args);
77+
KHook::Virtual<IEngineServiceMgr, void, const char*, ILoopModeFactory*, void **> m_RegisterLoopMode;
78+
KHook::Return<void> Hook_RegisterLoopMode(IEngineServiceMgr*, const char* pszLoopModeName, ILoopModeFactory *pLoopModeFactory, void **ppGlobalPointer);
79+
80+
KHook::Virtual<IEngineServiceMgr, void, const char*, ILoopModeFactory*, void**> m_UnregisterLoopMode;
81+
KHook::Return<void> Hook_UnregisterLoopMode(IEngineServiceMgr*, const char* pszLoopModeName, ILoopModeFactory* pLoopModeFactory, void** ppGlobalPointer);
82+
83+
KHook::Virtual<ILoopModeFactory, ILoopMode*> m_CreateLoopMode;
84+
KHook::Return<ILoopMode*> Hook_CreateLoopModePost(ILoopModeFactory*);
85+
86+
KHook::Virtual<ILoopModeFactory, void, ILoopMode*> m_DestroyLoopMode;
87+
KHook::Return<void> Hook_DestroyLoopMode(ILoopModeFactory*, ILoopMode*);
88+
89+
KHook::Virtual<ILoopMode, bool, KeyValues*, ILoopModePrerequisiteRegistry*> m_LoopInit;
90+
KHook::Return<bool> Hook_LoopInitPost(ILoopMode*, KeyValues* pKeyValues, ILoopModePrerequisiteRegistry *pRegistry);
91+
92+
KHook::Virtual<ILoopMode, void> m_LoopShutdown;
93+
KHook::Return<void> Hook_LoopShutdownPost(ILoopMode*);
94+
95+
KHook::Virtual<IServerGameClients, void, CPlayerSlot, const CCommand&> m_ClientCommand;
96+
KHook::Return<void> Hook_ClientCommand(IServerGameClients*, CPlayerSlot nSlot, const CCommand& args);
8197
private:
8298
IFileSystem* baseFs = nullptr;
8399
std::vector<CConVar<CUtlString> *> m_RegisteredConVars;

core/vsp_bridge.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ class VspBridge : public IVspBridge
150150

151151
if (g_plugin_unload != NULL)
152152
{
153-
CmdDispatch.Add(g_plugin_unload, false);
153+
CmdDispatch.Add(g_plugin_unload);
154154
}
155155

156156
return true;
@@ -167,7 +167,7 @@ class VspBridge : public IVspBridge
167167

168168
if (g_plugin_unload != NULL)
169169
{
170-
CmdDispatch.Remove(g_plugin_unload, false);
170+
CmdDispatch.Remove(g_plugin_unload);
171171
g_plugin_unload = NULL;
172172
}
173173
if (!g_Metamod.IsLoadedAsGameDLL())

0 commit comments

Comments
 (0)