|
4 | 4 | #include "../plugins/core/scripting.h" |
5 | 5 | #include "../plugins/PluginManager.h" |
6 | 6 | #include "../player/PlayerManager.h" |
| 7 | +#include "../../vendor/dynlib/module.h" |
7 | 8 |
|
8 | 9 | #include <vector> |
9 | 10 | #include <map> |
10 | 11 | #include <stack> |
11 | 12 |
|
12 | 13 | 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; |
14 | 16 |
|
15 | | -EventManager* eventManager = nullptr; |
16 | 17 | std::stack<IGameEvent*> dupEvents; |
17 | 18 |
|
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() |
40 | 20 | { |
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); |
45 | 24 | } |
46 | 25 |
|
47 | | -void EventManager::Initialize() |
| 26 | +void EventManager::RegisterGameEvents() |
48 | 27 | { |
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 | | - |
52 | 28 | for (auto it = gameEventsRegister.begin(); it != gameEventsRegister.end(); ++it) |
53 | 29 | { |
54 | 30 | if (!g_gameEventManager->FindListener(this, it->first.c_str())) |
55 | 31 | g_gameEventManager->AddListener(this, it->first.c_str(), true); |
56 | 32 | } |
57 | 33 | } |
58 | 34 |
|
| 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 | + |
59 | 50 | void EventManager::Shutdown() |
60 | 51 | { |
61 | 52 | SH_REMOVE_HOOK(IGameEventManager2, FireEvent, g_gameEventManager, SH_MEMBER(this, &EventManager::OnFireEvent), false); |
62 | 53 | SH_REMOVE_HOOK(IGameEventManager2, FireEvent, g_gameEventManager, SH_MEMBER(this, &EventManager::OnPostFireEvent), true); |
| 54 | + SH_REMOVE_HOOK_ID(loadEventFromFileHookID); |
63 | 55 |
|
64 | 56 | g_gameEventManager->RemoveListener(this); |
65 | 57 | } |
|
0 commit comments