Skip to content

Commit 2e79ae1

Browse files
committed
Fix EntWatch crashes
1 parent 597273f commit 2e79ae1

3 files changed

Lines changed: 91 additions & 78 deletions

File tree

src/cs2fixes.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,6 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool
395395
g_pEWHandler = new CEWHandler();
396396
g_pMapMigrations = new CMapMigrations();
397397

398-
g_pEWHandler->CreateHooks();
399398
RegisterWeaponCommands();
400399

401400
// Check hide distance
@@ -531,10 +530,7 @@ bool CS2Fixes::Unload(char* error, size_t maxlen)
531530
delete g_pPanoramaVoteHandler;
532531

533532
if (g_pEWHandler)
534-
{
535-
g_pEWHandler->RemoveHooks();
536533
delete g_pEWHandler;
537-
}
538534

539535
if (g_pMapMigrations)
540536
delete g_pMapMigrations;

src/entwatch.cpp

Lines changed: 52 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -53,21 +53,6 @@
5353

5454
CEWHandler* g_pEWHandler = nullptr;
5555

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);
70-
7156
CBaseEntity* g_pCBaseButtonVTable = nullptr;
7257
CBaseEntity* g_pCPhysBoxVTable = nullptr;
7358
CBaseEntity* g_pCRotButtonVTable = nullptr;
@@ -1061,7 +1046,7 @@ bool EWItemInstance::IsEmpty()
10611046

10621047
void CEWHandler::UnLoadConfig()
10631048
{
1064-
if (!bConfigLoaded)
1049+
if (!m_bConfigLoaded)
10651050
return;
10661051

10671052
if (EW_IsFireOutputHooked())
@@ -1080,7 +1065,7 @@ void CEWHandler::UnLoadConfig()
10801065
vecUseHookedEntities.clear();
10811066
vecHookedTriggers.clear();
10821067

1083-
bConfigLoaded = false;
1068+
m_bConfigLoaded = false;
10841069
}
10851070

10861071
/*
@@ -1144,13 +1129,13 @@ void CEWHandler::LoadConfig(const char* sFilePath)
11441129
mapIOFunctions["entwatch"] = EW_FireOutput;
11451130
}
11461131

1147-
bConfigLoaded = true;
1132+
m_bConfigLoaded = true;
11481133
}
11491134

11501135
void CEWHandler::PrintLoadedConfig(CPlayerSlot slot)
11511136
{
11521137
CCSPlayerController* player = CCSPlayerController::FromSlot(slot);
1153-
if (!bConfigLoaded)
1138+
if (!m_bConfigLoaded)
11541139
{
11551140
ClientPrint(player, HUD_PRINTTALK, EW_PREFIX "No config loaded.");
11561141
return;
@@ -1356,23 +1341,20 @@ void CEWHandler::CreateHooks()
13561341
return;
13571342
}
13581343

1359-
//TODO: these hooks crash with khook for some reason
1360-
return;
1361-
1362-
baseButtonUseHook.Configure(offset);
1363-
baseButtonUseHook.AddGlobal((CBaseEntity*)&g_pCBaseButtonVTable);
1344+
m_hBaseButtonUse.Configure(offset);
1345+
m_hBaseButtonUse.AddGlobal((CBaseEntity*)&g_pCBaseButtonVTable);
13641346

1365-
physBoxUseHook.Configure(offset);
1366-
physBoxUseHook.AddGlobal((CBaseEntity*)&g_pCPhysBoxVTable);
1347+
m_hPhysBoxUse.Configure(offset);
1348+
m_hPhysBoxUse.AddGlobal((CBaseEntity*)&g_pCPhysBoxVTable);
13671349

1368-
rotButtonUseHook.Configure(offset);
1369-
rotButtonUseHook.AddGlobal((CBaseEntity*)&g_pCRotButtonVTable);
1350+
m_hRotButtonUse.Configure(offset);
1351+
m_hRotButtonUse.AddGlobal((CBaseEntity*)&g_pCRotButtonVTable);
13701352

1371-
momentaryRotButtonUseHook.Configure(offset);
1372-
momentaryRotButtonUseHook.AddGlobal((CBaseEntity*)&g_pCMomentaryRotButtonVTable);
1353+
m_hMomentaryRotButtonUse.Configure(offset);
1354+
m_hMomentaryRotButtonUse.AddGlobal((CBaseEntity*)&g_pCMomentaryRotButtonVTable);
13731355

1374-
physicalButtonUseHook.Configure(offset);
1375-
physicalButtonUseHook.AddGlobal((CBaseEntity*)&g_pCPhysicalButtonVTable);
1356+
m_hPhysicalButtonUse.Configure(offset);
1357+
m_hPhysicalButtonUse.AddGlobal((CBaseEntity*)&g_pCPhysicalButtonVTable);
13761358

13771359
offset = g_GameConfig->GetOffset("CBaseEntity::StartTouch");
13781360

@@ -1382,14 +1364,14 @@ void CEWHandler::CreateHooks()
13821364
return;
13831365
}
13841366

1385-
triggerTeleportStartTouchHook.Configure(offset);
1386-
triggerTeleportStartTouchHook.AddGlobal((CBaseEntity*)&g_pCTriggerTeleportVTable);
1367+
m_hTriggerTeleportStartTouch.Configure(offset);
1368+
m_hTriggerTeleportStartTouch.AddGlobal((CBaseEntity*)&g_pCTriggerTeleportVTable);
13871369

1388-
triggerOnceStartTouchHook.Configure(offset);
1389-
triggerOnceStartTouchHook.AddGlobal((CBaseEntity*)&g_pCTriggerOnceVTable);
1370+
m_hTriggerOnceStartTouch.Configure(offset);
1371+
m_hTriggerOnceStartTouch.AddGlobal((CBaseEntity*)&g_pCTriggerOnceVTable);
13901372

1391-
triggerMultipleStartTouchHook.Configure(offset);
1392-
triggerMultipleStartTouchHook.AddGlobal((CBaseEntity*)&g_pCTriggerMultipleVTable);
1373+
m_hTriggerMultipleStartTouch.Configure(offset);
1374+
m_hTriggerMultipleStartTouch.AddGlobal((CBaseEntity*)&g_pCTriggerMultipleVTable);
13931375

13941376
offset = g_GameConfig->GetOffset("CBaseEntity::Touch");
13951377

@@ -1399,14 +1381,14 @@ void CEWHandler::CreateHooks()
13991381
return;
14001382
}
14011383

1402-
triggerTeleportTouchHook.Configure(offset);
1403-
triggerTeleportTouchHook.AddGlobal((CBaseEntity*)&g_pCTriggerTeleportVTable);
1384+
m_hTriggerTeleportTouch.Configure(offset);
1385+
m_hTriggerTeleportTouch.AddGlobal((CBaseEntity*)&g_pCTriggerTeleportVTable);
14041386

1405-
triggerOnceTouchHook.Configure(offset);
1406-
triggerOnceTouchHook.AddGlobal((CBaseEntity*)&g_pCTriggerOnceVTable);
1387+
m_hTriggerOnceTouch.Configure(offset);
1388+
m_hTriggerOnceTouch.AddGlobal((CBaseEntity*)&g_pCTriggerOnceVTable);
14071389

1408-
triggerMultipleTouchHook.Configure(offset);
1409-
triggerMultipleTouchHook.AddGlobal((CBaseEntity*)&g_pCTriggerMultipleVTable);
1390+
m_hTriggerMultipleTouch.Configure(offset);
1391+
m_hTriggerMultipleTouch.AddGlobal((CBaseEntity*)&g_pCTriggerMultipleVTable);
14101392

14111393
offset = g_GameConfig->GetOffset("CBaseEntity::EndTouch");
14121394

@@ -1416,32 +1398,32 @@ void CEWHandler::CreateHooks()
14161398
return;
14171399
}
14181400

1419-
triggerTeleportEndTouchHook.Configure(offset);
1420-
triggerTeleportEndTouchHook.AddGlobal((CBaseEntity*)&g_pCTriggerTeleportVTable);
1401+
m_hTriggerTeleportEndTouch.Configure(offset);
1402+
m_hTriggerTeleportEndTouch.AddGlobal((CBaseEntity*)&g_pCTriggerTeleportVTable);
14211403

1422-
triggerOnceEndTouchHook.Configure(offset);
1423-
triggerOnceEndTouchHook.AddGlobal((CBaseEntity*)&g_pCTriggerOnceVTable);
1404+
m_hTriggerOnceEndTouch.Configure(offset);
1405+
m_hTriggerOnceEndTouch.AddGlobal((CBaseEntity*)&g_pCTriggerOnceVTable);
14241406

1425-
triggerMultipleEndTouchHook.Configure(offset);
1426-
triggerMultipleEndTouchHook.AddGlobal((CBaseEntity*)&g_pCTriggerMultipleVTable);
1407+
m_hTriggerMultipleEndTouch.Configure(offset);
1408+
m_hTriggerMultipleEndTouch.AddGlobal((CBaseEntity*)&g_pCTriggerMultipleVTable);
14271409
}
14281410

14291411
void CEWHandler::RemoveHooks()
14301412
{
1431-
baseButtonUseHook.RemoveGlobal((CBaseEntity*)&g_pCBaseButtonVTable);
1432-
physBoxUseHook.RemoveGlobal((CBaseEntity*)&g_pCPhysBoxVTable);
1433-
rotButtonUseHook.RemoveGlobal((CBaseEntity*)&g_pCRotButtonVTable);
1434-
momentaryRotButtonUseHook.RemoveGlobal((CBaseEntity*)&g_pCMomentaryRotButtonVTable);
1435-
physicalButtonUseHook.RemoveGlobal((CBaseEntity*)&g_pCPhysicalButtonVTable);
1436-
triggerTeleportStartTouchHook.RemoveGlobal((CBaseEntity*)&g_pCTriggerTeleportVTable);
1437-
triggerOnceStartTouchHook.RemoveGlobal((CBaseEntity*)&g_pCTriggerOnceVTable);
1438-
triggerMultipleStartTouchHook.RemoveGlobal((CBaseEntity*)&g_pCTriggerMultipleVTable);
1439-
triggerTeleportTouchHook.RemoveGlobal((CBaseEntity*)&g_pCTriggerTeleportVTable);
1440-
triggerOnceTouchHook.RemoveGlobal((CBaseEntity*)&g_pCTriggerOnceVTable);
1441-
triggerMultipleTouchHook.RemoveGlobal((CBaseEntity*)&g_pCTriggerMultipleVTable);
1442-
triggerTeleportEndTouchHook.RemoveGlobal((CBaseEntity*)&g_pCTriggerTeleportVTable);
1443-
triggerOnceEndTouchHook.RemoveGlobal((CBaseEntity*)&g_pCTriggerOnceVTable);
1444-
triggerMultipleEndTouchHook.RemoveGlobal((CBaseEntity*)&g_pCTriggerMultipleVTable);
1413+
m_hBaseButtonUse.RemoveGlobal((CBaseEntity*)&g_pCBaseButtonVTable);
1414+
m_hPhysBoxUse.RemoveGlobal((CBaseEntity*)&g_pCPhysBoxVTable);
1415+
m_hRotButtonUse.RemoveGlobal((CBaseEntity*)&g_pCRotButtonVTable);
1416+
m_hMomentaryRotButtonUse.RemoveGlobal((CBaseEntity*)&g_pCMomentaryRotButtonVTable);
1417+
m_hPhysicalButtonUse.RemoveGlobal((CBaseEntity*)&g_pCPhysicalButtonVTable);
1418+
m_hTriggerTeleportStartTouch.RemoveGlobal((CBaseEntity*)&g_pCTriggerTeleportVTable);
1419+
m_hTriggerOnceStartTouch.RemoveGlobal((CBaseEntity*)&g_pCTriggerOnceVTable);
1420+
m_hTriggerMultipleStartTouch.RemoveGlobal((CBaseEntity*)&g_pCTriggerMultipleVTable);
1421+
m_hTriggerTeleportTouch.RemoveGlobal((CBaseEntity*)&g_pCTriggerTeleportVTable);
1422+
m_hTriggerOnceTouch.RemoveGlobal((CBaseEntity*)&g_pCTriggerOnceVTable);
1423+
m_hTriggerMultipleTouch.RemoveGlobal((CBaseEntity*)&g_pCTriggerMultipleVTable);
1424+
m_hTriggerTeleportEndTouch.RemoveGlobal((CBaseEntity*)&g_pCTriggerTeleportVTable);
1425+
m_hTriggerOnceEndTouch.RemoveGlobal((CBaseEntity*)&g_pCTriggerOnceVTable);
1426+
m_hTriggerMultipleEndTouch.RemoveGlobal((CBaseEntity*)&g_pCTriggerMultipleVTable);
14451427
}
14461428

14471429
KHook::Return<void> CEWHandler::Hook_Touch(CBaseEntity* pThis, CBaseEntity* pOther)
@@ -2029,7 +2011,7 @@ void EW_RoundPreStart()
20292011

20302012
void EW_OnEntitySpawned(CEntityInstance* pEntity)
20312013
{
2032-
if (!g_pEWHandler || !g_pEWHandler->bConfigLoaded)
2014+
if (!g_pEWHandler || !g_pEWHandler->m_bConfigLoaded)
20332015
return;
20342016

20352017
CBaseEntity* pEnt = (CBaseEntity*)pEntity;
@@ -2075,7 +2057,7 @@ void EW_OnEntitySpawned(CEntityInstance* pEntity)
20752057

20762058
void EW_OnEntityDeleted(CEntityInstance* pEntity)
20772059
{
2078-
if (!g_pEWHandler || !g_pEWHandler->bConfigLoaded)
2060+
if (!g_pEWHandler || !g_pEWHandler->m_bConfigLoaded)
20792061
return;
20802062

20812063
CBaseEntity* pEnt = (CBaseEntity*)pEntity;
@@ -2110,7 +2092,7 @@ void EW_OnWeaponDeleted(CBaseEntity* pEntity)
21102092
bool EW_Detour_CCSPlayer_WeaponServices_CanUse(CCSPlayer_WeaponServices* pWeaponServices, CBasePlayerWeapon* pPlayerWeapon)
21112093
{
21122094
// false=block it, true=dont block it
2113-
if (!g_pEWHandler || !g_pEWHandler->bConfigLoaded)
2095+
if (!g_pEWHandler || !g_pEWHandler->m_bConfigLoaded)
21142096
return true;
21152097

21162098
CCSPlayerPawn* pPawn = pWeaponServices->GetPawn();
@@ -2154,7 +2136,7 @@ bool EW_Detour_CCSPlayer_WeaponServices_CanUse(CCSPlayer_WeaponServices* pWeapon
21542136

21552137
void EW_Detour_CCSPlayer_WeaponServices_EquipWeapon(CCSPlayer_WeaponServices* pWeaponServices, CBasePlayerWeapon* pWeapon)
21562138
{
2157-
if (!g_pEWHandler || !g_pEWHandler->bConfigLoaded)
2139+
if (!g_pEWHandler || !g_pEWHandler->m_bConfigLoaded)
21582140
return;
21592141

21602142
CCSPlayerPawn* pPawn = pWeaponServices->GetPawn();
@@ -2174,7 +2156,7 @@ void EW_Detour_CCSPlayer_WeaponServices_EquipWeapon(CCSPlayer_WeaponServices* pW
21742156

21752157
void EW_DropWeapon(CCSPlayer_WeaponServices* pWeaponServices, CBasePlayerWeapon* pWeapon)
21762158
{
2177-
if (!g_pEWHandler || !g_pEWHandler->bConfigLoaded)
2159+
if (!g_pEWHandler || !g_pEWHandler->m_bConfigLoaded)
21782160
return;
21792161

21802162
CCSPlayerPawn* pPawn = pWeaponServices->GetPawn();
@@ -2343,7 +2325,7 @@ CON_COMMAND_CHAT_FLAGS(ew_reload, "- Reloads the current map's entwatch config",
23432325
// LoadConfig unloads the current config already
23442326
g_pEWHandler->LoadMapConfig(GetGlobals()->mapname.ToCStr());
23452327

2346-
if (!g_pEWHandler->bConfigLoaded)
2328+
if (!g_pEWHandler->m_bConfigLoaded)
23472329
{
23482330
ClientPrint(player, HUD_PRINTTALK, EW_PREFIX "Error reloading config, check console log for details.");
23492331
return;

src/entwatch.h

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -216,16 +216,35 @@ struct EActiveTransfer
216216
class CEWHandler
217217
{
218218
public:
219-
CEWHandler()
219+
CEWHandler() :
220+
m_bConfigLoaded(false),
221+
m_hBaseButtonUse(this, &CEWHandler::Hook_Use, nullptr),
222+
m_hPhysBoxUse(this, &CEWHandler::Hook_Use, nullptr),
223+
m_hRotButtonUse(this, &CEWHandler::Hook_Use, nullptr),
224+
m_hMomentaryRotButtonUse(this, &CEWHandler::Hook_Use, nullptr),
225+
m_hPhysicalButtonUse(this, &CEWHandler::Hook_Use, nullptr),
226+
m_hTriggerTeleportStartTouch(this, &CEWHandler::Hook_Touch, nullptr),
227+
m_hTriggerOnceStartTouch(this, &CEWHandler::Hook_Touch, nullptr),
228+
m_hTriggerMultipleStartTouch(this, &CEWHandler::Hook_Touch, nullptr),
229+
m_hTriggerTeleportTouch(this, &CEWHandler::Hook_Touch, nullptr),
230+
m_hTriggerOnceTouch(this, &CEWHandler::Hook_Touch, nullptr),
231+
m_hTriggerMultipleTouch(this, &CEWHandler::Hook_Touch, nullptr),
232+
m_hTriggerTeleportEndTouch(this, &CEWHandler::Hook_Touch, nullptr),
233+
m_hTriggerOnceEndTouch(this, &CEWHandler::Hook_Touch, nullptr),
234+
m_hTriggerMultipleEndTouch(this, &CEWHandler::Hook_Touch, nullptr)
220235
{
221-
bConfigLoaded = false;
236+
CreateHooks();
237+
}
238+
239+
~CEWHandler()
240+
{
241+
RemoveHooks();
222242
}
223243

224244
void CreateHooks();
225245
void RemoveHooks();
226246

227-
bool bConfigLoaded;
228-
bool IsConfigLoaded() { return bConfigLoaded; }
247+
bool IsConfigLoaded() { return m_bConfigLoaded; }
229248

230249
void UnLoadConfig();
231250
void LoadMapConfig(const char* sMapName);
@@ -263,9 +282,25 @@ class CEWHandler
263282
std::vector<CHandle<CBaseEntity>> vecUseHookedEntities;
264283

265284
std::weak_ptr<CTimer> m_pHudTimer;
285+
bool m_bConfigLoaded;
266286

267287
std::map<int, std::shared_ptr<ETransferInfo>> mapTransfers; // Any etransfers that target multiple items
268288
std::vector<std::shared_ptr<EActiveTransfer>> vecActiveTransfers; // Active transfers where only the receiver can pickup the weapon
289+
290+
KHook::Virtual<CBaseEntity, void, InputData_t*> m_hBaseButtonUse;
291+
KHook::Virtual<CBaseEntity, void, InputData_t*> m_hPhysBoxUse;
292+
KHook::Virtual<CBaseEntity, void, InputData_t*> m_hRotButtonUse;
293+
KHook::Virtual<CBaseEntity, void, InputData_t*> m_hMomentaryRotButtonUse;
294+
KHook::Virtual<CBaseEntity, void, InputData_t*> m_hPhysicalButtonUse;
295+
KHook::Virtual<CBaseEntity, void, CBaseEntity*> m_hTriggerTeleportStartTouch;
296+
KHook::Virtual<CBaseEntity, void, CBaseEntity*> m_hTriggerOnceStartTouch;
297+
KHook::Virtual<CBaseEntity, void, CBaseEntity*> m_hTriggerMultipleStartTouch;
298+
KHook::Virtual<CBaseEntity, void, CBaseEntity*> m_hTriggerTeleportTouch;
299+
KHook::Virtual<CBaseEntity, void, CBaseEntity*> m_hTriggerOnceTouch;
300+
KHook::Virtual<CBaseEntity, void, CBaseEntity*> m_hTriggerMultipleTouch;
301+
KHook::Virtual<CBaseEntity, void, CBaseEntity*> m_hTriggerTeleportEndTouch;
302+
KHook::Virtual<CBaseEntity, void, CBaseEntity*> m_hTriggerOnceEndTouch;
303+
KHook::Virtual<CBaseEntity, void, CBaseEntity*> m_hTriggerMultipleEndTouch;
269304
};
270305

271306
extern CEWHandler* g_pEWHandler;

0 commit comments

Comments
 (0)