Skip to content

Commit 43ce5c8

Browse files
committed
Fix EntWatch crashes
1 parent 597273f commit 43ce5c8

2 files changed

Lines changed: 35 additions & 29 deletions

File tree

src/entwatch.cpp

Lines changed: 25 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -52,21 +52,22 @@
5252
#include "tier0/memdbgon.h"
5353

5454
CEWHandler* g_pEWHandler = nullptr;
55-
56-
KHook::Virtual baseButtonUseHook(g_pEWHandler, &CEWHandler::Hook_Use, nullptr);
57-
KHook::Virtual physBoxUseHook(g_pEWHandler, &CEWHandler::Hook_Use, nullptr);
58-
KHook::Virtual rotButtonUseHook(g_pEWHandler, &CEWHandler::Hook_Use, nullptr);
59-
KHook::Virtual momentaryRotButtonUseHook(g_pEWHandler, &CEWHandler::Hook_Use, nullptr);
60-
KHook::Virtual physicalButtonUseHook(g_pEWHandler, &CEWHandler::Hook_Use, nullptr);
61-
KHook::Virtual triggerTeleportStartTouchHook(g_pEWHandler, &CEWHandler::Hook_Touch, nullptr);
62-
KHook::Virtual triggerOnceStartTouchHook(g_pEWHandler, &CEWHandler::Hook_Touch, nullptr);
63-
KHook::Virtual triggerMultipleStartTouchHook(g_pEWHandler, &CEWHandler::Hook_Touch, nullptr);
64-
KHook::Virtual triggerTeleportTouchHook(g_pEWHandler, &CEWHandler::Hook_Touch, nullptr);
65-
KHook::Virtual triggerOnceTouchHook(g_pEWHandler, &CEWHandler::Hook_Touch, nullptr);
66-
KHook::Virtual triggerMultipleTouchHook(g_pEWHandler, &CEWHandler::Hook_Touch, nullptr);
67-
KHook::Virtual triggerTeleportEndTouchHook(g_pEWHandler, &CEWHandler::Hook_Touch, nullptr);
68-
KHook::Virtual triggerOnceEndTouchHook(g_pEWHandler, &CEWHandler::Hook_Touch, nullptr);
69-
KHook::Virtual triggerMultipleEndTouchHook(g_pEWHandler, &CEWHandler::Hook_Touch, nullptr);
55+
CEWHooks g_pEWHooks;
56+
57+
KHook::Virtual baseButtonUseHook(&g_pEWHooks, &CEWHooks::Hook_Use, nullptr);
58+
KHook::Virtual physBoxUseHook(&g_pEWHooks, &CEWHooks::Hook_Use, nullptr);
59+
KHook::Virtual rotButtonUseHook(&g_pEWHooks, &CEWHooks::Hook_Use, nullptr);
60+
KHook::Virtual momentaryRotButtonUseHook(&g_pEWHooks, &CEWHooks::Hook_Use, nullptr);
61+
KHook::Virtual physicalButtonUseHook(&g_pEWHooks, &CEWHooks::Hook_Use, nullptr);
62+
KHook::Virtual triggerTeleportStartTouchHook(&g_pEWHooks, &CEWHooks::Hook_Touch, nullptr);
63+
KHook::Virtual triggerOnceStartTouchHook(&g_pEWHooks, &CEWHooks::Hook_Touch, nullptr);
64+
KHook::Virtual triggerMultipleStartTouchHook(&g_pEWHooks, &CEWHooks::Hook_Touch, nullptr);
65+
KHook::Virtual triggerTeleportTouchHook(&g_pEWHooks, &CEWHooks::Hook_Touch, nullptr);
66+
KHook::Virtual triggerOnceTouchHook(&g_pEWHooks, &CEWHooks::Hook_Touch, nullptr);
67+
KHook::Virtual triggerMultipleTouchHook(&g_pEWHooks, &CEWHooks::Hook_Touch, nullptr);
68+
KHook::Virtual triggerTeleportEndTouchHook(&g_pEWHooks, &CEWHooks::Hook_Touch, nullptr);
69+
KHook::Virtual triggerOnceEndTouchHook(&g_pEWHooks, &CEWHooks::Hook_Touch, nullptr);
70+
KHook::Virtual triggerMultipleEndTouchHook(&g_pEWHooks, &CEWHooks::Hook_Touch, nullptr);
7071

7172
CBaseEntity* g_pCBaseButtonVTable = nullptr;
7273
CBaseEntity* g_pCPhysBoxVTable = nullptr;
@@ -1356,9 +1357,6 @@ void CEWHandler::CreateHooks()
13561357
return;
13571358
}
13581359

1359-
//TODO: these hooks crash with khook for some reason
1360-
return;
1361-
13621360
baseButtonUseHook.Configure(offset);
13631361
baseButtonUseHook.AddGlobal((CBaseEntity*)&g_pCBaseButtonVTable);
13641362

@@ -1444,12 +1442,12 @@ void CEWHandler::RemoveHooks()
14441442
triggerMultipleEndTouchHook.RemoveGlobal((CBaseEntity*)&g_pCTriggerMultipleVTable);
14451443
}
14461444

1447-
KHook::Return<void> CEWHandler::Hook_Touch(CBaseEntity* pThis, CBaseEntity* pOther)
1445+
KHook::Return<void> CEWHooks::Hook_Touch(CBaseEntity* pThis, CBaseEntity* pOther)
14481446
{
14491447
bool bFound = false;
1450-
for (int i = 0; i < (vecHookedTriggers).size(); i++)
1448+
for (int i = 0; i < (g_pEWHandler->vecHookedTriggers).size(); i++)
14511449
{
1452-
if (vecHookedTriggers[i] == pThis->GetHandle())
1450+
if (g_pEWHandler->vecHookedTriggers[i] == pThis->GetHandle())
14531451
{
14541452
bFound = true;
14551453
break;
@@ -1852,13 +1850,13 @@ void CEWHandler::RemoveUseEntity(CBaseEntity* pEnt)
18521850
}
18531851
}
18541852

1855-
KHook::Return<void> CEWHandler::Hook_Use(CBaseEntity* pThis, InputData_t* pInput)
1853+
KHook::Return<void> CEWHooks::Hook_Use(CBaseEntity* pThis, InputData_t* pInput)
18561854
{
18571855
// Message("##### USE HOOK #####\n");
18581856
bool bFound = false;
1859-
for (int i = 0; i < (vecUseHookedEntities).size(); i++)
1857+
for (int i = 0; i < (g_pEWHandler->vecUseHookedEntities).size(); i++)
18601858
{
1861-
if (vecUseHookedEntities[i] == pThis->GetHandle())
1859+
if (g_pEWHandler->vecUseHookedEntities[i] == pThis->GetHandle())
18621860
{
18631861
bFound = true;
18641862
break;
@@ -1871,9 +1869,9 @@ KHook::Return<void> CEWHandler::Hook_Use(CBaseEntity* pThis, InputData_t* pInput
18711869
int index = pThis->entindex();
18721870
int itemIndex = -1;
18731871
int handlerIndex = -1;
1874-
for (int i = 0; i < (vecItems).size(); i++)
1872+
for (int i = 0; i < (g_pEWHandler->vecItems).size(); i++)
18751873
{
1876-
int j = vecItems[i]->FindHandlerByEntIndex(index);
1874+
int j = g_pEWHandler->vecItems[i]->FindHandlerByEntIndex(index);
18771875
if (j != -1)
18781876
{
18791877
itemIndex = i;
@@ -1895,7 +1893,7 @@ KHook::Return<void> CEWHandler::Hook_Use(CBaseEntity* pThis, InputData_t* pInput
18951893
if (!pActivator || !pActivator->IsPawn())
18961894
return returnVal;
18971895

1898-
std::shared_ptr<EWItemInstance> pItem = vecItems[itemIndex];
1896+
std::shared_ptr<EWItemInstance> pItem = g_pEWHandler->vecItems[itemIndex];
18991897
CCSPlayerPawn* pPawn = (CCSPlayerPawn*)pActivator;
19001898
CCSPlayerController* pController = pPawn->GetOriginalController();
19011899

src/entwatch.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,6 @@ class CEWHandler
242242

243243
void RegisterHandler(CBaseEntity* pEnt);
244244
bool RegisterTrigger(CBaseEntity* pEnt);
245-
KHook::Return<void> Hook_Touch(CBaseEntity* pThis, CBaseEntity* pOther);
246245
bool RemoveTrigger(CBaseEntity* pEnt);
247246
void RemoveHandler(CBaseEntity* pEnt);
248247
void ResetAllClantags();
@@ -254,7 +253,6 @@ class CEWHandler
254253
void Transfer(CCSPlayerController* pCaller, int iItemInstance, CHandle<CCSPlayerController> hReceiver);
255254

256255
void RemoveUseEntity(CBaseEntity* pEnt);
257-
KHook::Return<void> Hook_Use(CBaseEntity* pThis, InputData_t* pInput);
258256

259257
std::map<uint32, std::shared_ptr<EWItem>> mapItemConfig; /* items defined in the config */
260258
std::vector<std::shared_ptr<EWItemInstance>> vecItems; /* all items found spawned */
@@ -270,6 +268,16 @@ class CEWHandler
270268

271269
extern CEWHandler* g_pEWHandler;
272270

271+
// KHook can't resolve a class instantiated at runtime? So we're using this
272+
class CEWHooks
273+
{
274+
public:
275+
KHook::Return<void> Hook_Touch(CBaseEntity* pThis, CBaseEntity* pOther);
276+
KHook::Return<void> Hook_Use(CBaseEntity* pThis, InputData_t* pInput);
277+
};
278+
279+
extern CEWHooks g_pEWHooks;
280+
273281
void EW_OnLevelInit(const char* sMapName);
274282
void EW_RoundPreStart();
275283
void EW_OnEntitySpawned(CEntityInstance* pEntity);

0 commit comments

Comments
 (0)