Skip to content

Commit c91260f

Browse files
committed
update(hooks): CGameEventManager
1 parent 650de59 commit c91260f

File tree

4 files changed

+37
-46
lines changed

4 files changed

+37
-46
lines changed

plugin_files/gamedata/signatures.json

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,6 @@
5959
"windows": "48 8B 15 2A 2A 2A 2A 48 85 D2 74 2A 85 C9 74",
6060
"linux": "48 8B 05 ? ? ? ? 48 85 C0 74 ? 85 FF"
6161
},
62-
"CGameEventManager_Init": {
63-
"lib": "server",
64-
"windows": "40 53 48 83 EC 20 48 8B 01 48 8B D9 FF 50 10",
65-
"linux": "55 48 89 E5 41 54 49 89 FC 48 83 EC 08 48 8B 07 FF 50 18"
66-
},
6762
"CAttributeList_SetOrAddAttributeValueByName": {
6863
"lib": "server",
6964
"windows": "40 53 41 56 41 57 48 81 EC 90 00 00 00 0F 29 74 24 70",

src/entrypoint.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ MenuManager* g_MenuManager = nullptr;
106106
ResourceMonitor* g_ResourceMonitor = nullptr;
107107
Patches* g_Patches = nullptr;
108108
CallStack* g_callStack = nullptr;
109+
EventManager* eventManager = nullptr;
109110
VoiceManager g_voiceManager;
110111

111112
//////////////////////////////////////////////////////////////
@@ -162,6 +163,7 @@ bool Swiftly::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool
162163
g_MenuManager = new MenuManager();
163164
g_ResourceMonitor = new ResourceMonitor();
164165
g_callStack = new CallStack();
166+
eventManager = new EventManager();
165167

166168
if (g_Config->LoadConfiguration())
167169
PRINT("The configurations has been succesfully loaded.\n");
@@ -180,6 +182,7 @@ bool Swiftly::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool
180182

181183
g_addons.LoadAddons();
182184
g_addons.Initialize();
185+
eventManager->Initialize();
183186

184187
if (!InitializeHooks())
185188
PRINTRET("Hooks failed to initialize.\n", false)
@@ -245,9 +248,9 @@ bool Swiftly::Unload(char* error, size_t maxlen)
245248
g_pluginManager->UnloadPlugins();
246249

247250
UnloadHooks();
248-
UnregisterEventListeners();
249251
g_voiceManager.OnShutdown();
250252
g_addons.Destroy();
253+
eventManager->Shutdown();
251254

252255
SH_REMOVE_HOOK_MEMFUNC(IServerGameDLL, GameFrame, server, this, &Swiftly::Hook_GameFrame, true);
253256
SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, gameclients, this, &Swiftly::Hook_ClientDisconnect, true);

src/gameevents/gameevents.cpp

Lines changed: 24 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,62 +4,54 @@
44
#include "../plugins/core/scripting.h"
55
#include "../plugins/PluginManager.h"
66
#include "../player/PlayerManager.h"
7+
#include "../../vendor/dynlib/module.h"
78

89
#include <vector>
910
#include <map>
1011
#include <stack>
1112

1213
SH_DECL_HOOK2(IGameEventManager2, FireEvent, SH_NOATTRIB, 0, bool, IGameEvent*, bool);
13-
FuncHook<decltype(Hook_CGameEventManager_Init)> TCGameEventManager_Init(Hook_CGameEventManager_Init, "CGameEventManager_Init");
14+
SH_DECL_HOOK2(IGameEventManager2, LoadEventsFromFile, SH_NOATTRIB, 0, int, const char*, bool);
15+
int loadEventFromFileHookID = -1;
1416

15-
EventManager* eventManager = nullptr;
1617
std::stack<IGameEvent*> dupEvents;
1718

18-
void Hook_CGameEventManager_Init(IGameEventManager2* pGameEventManager)
19-
{
20-
g_gameEventManager = pGameEventManager;
21-
TCGameEventManager_Init(pGameEventManager);
22-
23-
PLUGIN_PRINT("Game Events", "Loading game events...\n");
24-
RegisterEventListeners();
25-
PLUGIN_PRINTF("Game Events", "%d game events have been succesfully loaded.\n", gameEventsRegister.size());
26-
}
27-
28-
void RegisterEventListeners()
29-
{
30-
if (!g_gameEventManager)
31-
return;
32-
33-
if (!eventManager)
34-
eventManager = new EventManager();
35-
36-
eventManager->Initialize();
37-
}
38-
39-
void UnregisterEventListeners()
19+
void EventManager::Initialize()
4020
{
41-
if (!g_gameEventManager)
42-
return;
43-
44-
eventManager->Shutdown();
21+
DynLibUtils::CModule servermodule("server");
22+
auto CGameEventManagerVTable = servermodule.GetVirtualTableByName("CGameEventManager");
23+
loadEventFromFileHookID = SH_ADD_DVPHOOK(IGameEventManager2, LoadEventsFromFile, (IGameEventManager2*)((void*)CGameEventManagerVTable), SH_MEMBER(this, &EventManager::LoadEventsFromFile), false);
4524
}
4625

47-
void EventManager::Initialize()
26+
void EventManager::RegisterGameEvents()
4827
{
49-
SH_ADD_HOOK(IGameEventManager2, FireEvent, g_gameEventManager, SH_MEMBER(this, &EventManager::OnFireEvent), false);
50-
SH_ADD_HOOK(IGameEventManager2, FireEvent, g_gameEventManager, SH_MEMBER(this, &EventManager::OnPostFireEvent), true);
51-
5228
for (auto it = gameEventsRegister.begin(); it != gameEventsRegister.end(); ++it)
5329
{
5430
if (!g_gameEventManager->FindListener(this, it->first.c_str()))
5531
g_gameEventManager->AddListener(this, it->first.c_str(), true);
5632
}
5733
}
5834

35+
int EventManager::LoadEventsFromFile(const char* filePath, bool searchAll)
36+
{
37+
if (!g_gameEventManager) {
38+
g_gameEventManager = META_IFACEPTR(IGameEventManager2);
39+
PLUGIN_PRINT("Game Events", "Loading game events...\n");
40+
this->RegisterGameEvents();
41+
PLUGIN_PRINTF("Game Events", "%d game events have been succesfully loaded.\n", gameEventsRegister.size());
42+
43+
SH_ADD_HOOK(IGameEventManager2, FireEvent, g_gameEventManager, SH_MEMBER(this, &EventManager::OnFireEvent), false);
44+
SH_ADD_HOOK(IGameEventManager2, FireEvent, g_gameEventManager, SH_MEMBER(this, &EventManager::OnPostFireEvent), true);
45+
}
46+
47+
RETURN_META_VALUE(MRES_IGNORED, 0);
48+
}
49+
5950
void EventManager::Shutdown()
6051
{
6152
SH_REMOVE_HOOK(IGameEventManager2, FireEvent, g_gameEventManager, SH_MEMBER(this, &EventManager::OnFireEvent), false);
6253
SH_REMOVE_HOOK(IGameEventManager2, FireEvent, g_gameEventManager, SH_MEMBER(this, &EventManager::OnPostFireEvent), true);
54+
SH_REMOVE_HOOK_ID(loadEventFromFileHookID);
6355

6456
g_gameEventManager->RemoveListener(this);
6557
}

src/gameevents/gameevents.h

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,7 @@
55
#include "../entrypoint.h"
66
#include <utlvector.h>
77

8-
typedef void (*FnEventListenerCallback)(IGameEvent *event);
9-
void Hook_CGameEventManager_Init(IGameEventManager2 *);
10-
11-
void RegisterEventListeners();
12-
void UnregisterEventListeners();
8+
typedef void (*FnEventListenerCallback)(IGameEvent* event);
139

1410
class EventManager : public IGameEventListener2
1511
{
@@ -19,10 +15,15 @@ class EventManager : public IGameEventListener2
1915

2016
void Initialize();
2117
void Shutdown();
18+
void RegisterGameEvents();
19+
20+
void FireGameEvent(IGameEvent* pEvent) override;
21+
bool OnFireEvent(IGameEvent* pEvent, bool bDontBroadcast);
22+
bool OnPostFireEvent(IGameEvent* pEvent, bool bDontBroadcast);
2223

23-
void FireGameEvent(IGameEvent *pEvent) override;
24-
bool OnFireEvent(IGameEvent *pEvent, bool bDontBroadcast);
25-
bool OnPostFireEvent(IGameEvent *pEvent, bool bDontBroadcast);
24+
int LoadEventsFromFile(const char* filePath, bool searchAll);
2625
};
2726

27+
extern EventManager* eventManager;
28+
2829
#endif

0 commit comments

Comments
 (0)