@@ -113,15 +113,15 @@ KHook::Virtual postEventAbstractHook(&IGameEventSystem::PostEventAbstract, &g_CS
113113KHook::Virtual startupServerHook (&INetworkServerService::StartupServer, &g_CS2Fixes, nullptr , &CS2Fixes::Hook_StartupServer_Post);
114114KHook::Virtual checkTransmitHook (&ISource2GameEntities::CheckTransmit, &g_CS2Fixes, nullptr , &CS2Fixes::Hook_CheckTransmit_Post);
115115KHook::Virtual dispatchConCommandHook (&ICvar::DispatchConCommand, &g_CS2Fixes, &CS2Fixes::Hook_DispatchConCommand, nullptr );
116- KHook::Virtual loadEventsFromFileHook (&IGameEventManager2::LoadEventsFromFile, &g_CS2Fixes, &CS2Fixes::Hook_LoadEventsFromFile, nullptr );
117- KHook::Virtual playerEquipUseHook (&g_CS2Fixes, &CS2Fixes::Hook_PlayerEquipUse, nullptr );
118- KHook::Virtual playerEquipPrecacheHook (&g_CS2Fixes, nullptr , &CS2Fixes::Hook_PlayerEquipPrecache_Post);
119116KHook::Virtual createWorkshopMapGroupHook (&g_CS2Fixes, &CS2Fixes::Hook_CreateWorkshopMapGroup, nullptr );
120- KHook::Virtual onTakeDamageAliveHook (&g_CS2Fixes, &CS2Fixes::Hook_OnTakeDamage_Alive, nullptr );
121- KHook::Virtual checkMovingGroundHook (&g_CS2Fixes, &CS2Fixes::Hook_CheckMovingGround, nullptr );
122- KHook::Virtual goToIntermissionHook (&g_CS2Fixes, &CS2Fixes::Hook_GoToIntermission, nullptr );
123- KHook::Virtual physicsTouchShuffleHook (&g_CS2Fixes, nullptr , &CS2Fixes::Hook_PhysicsTouchShuffle_Post);
124- KHook::Virtual dropWeaponHook (&g_CS2Fixes, nullptr , &CS2Fixes::Hook_DropWeapon_Post);
117+ KHook::Member loadEventsFromFileHook (&g_CS2Fixes, &CS2Fixes::Hook_LoadEventsFromFile, nullptr );
118+ KHook::Member playerEquipUseHook (&g_CS2Fixes, &CS2Fixes::Hook_PlayerEquipUse, nullptr );
119+ KHook::Member playerEquipPrecacheHook (&g_CS2Fixes, nullptr , &CS2Fixes::Hook_PlayerEquipPrecache_Post);
120+ KHook::Member onTakeDamageAliveHook (&g_CS2Fixes, &CS2Fixes::Hook_OnTakeDamage_Alive, nullptr );
121+ KHook::Member checkMovingGroundHook (&g_CS2Fixes, &CS2Fixes::Hook_CheckMovingGround, nullptr );
122+ KHook::Member goToIntermissionHook (&g_CS2Fixes, &CS2Fixes::Hook_GoToIntermission, nullptr );
123+ KHook::Member physicsTouchShuffleHook (&g_CS2Fixes, nullptr , &CS2Fixes::Hook_PhysicsTouchShuffle_Post);
124+ KHook::Member dropWeaponHook (&g_CS2Fixes, nullptr , &CS2Fixes::Hook_DropWeapon_Post);
125125
126126CS2Fixes g_CS2Fixes;
127127
@@ -135,13 +135,6 @@ CGameConfig* g_GameConfig = nullptr;
135135ISteamHTTP* g_http = nullptr ;
136136CSteamGameServerAPIContext g_steamAPI;
137137CCSGameRules* g_pGameRules = nullptr ; // Will be null between map end & new map startup, null check if necessary!
138- IGameEventManager2* g_pCGameEventManagerVTable = nullptr ;
139- CGamePlayerEquip* g_pCGamePlayerEquipVTable = nullptr ;
140- CCSPlayerPawn* g_pCCSPlayerPawnVTable = nullptr ;
141- CCSPlayer_MovementServices* g_pCCSPlayer_MovementServicesVTable = nullptr ;
142- CCSGameRules* g_pCCSGameRulesVTable = nullptr ;
143- CVPhys2World* g_pCVPhys2WorldVTable = nullptr ;
144- CCSPlayer_WeaponServices* g_pCCSPlayer_WeaponServicesVTable = nullptr ;
145138
146139CGameEntitySystem* GameEntitySystem ()
147140{
@@ -233,58 +226,64 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool
233226 if (!InitGameSystems ())
234227 bRequiredInitLoaded = false ;
235228
236- g_pCGameEventManagerVTable = (IGameEventManager2*)modules::server-> FindVirtualTable ( " CGameEventManager " );
229+ int offset = g_GameConfig-> GetOffset ( " IGameTypes_CreateWorkshopMapGroup " );
237230
238- if (!g_pCGameEventManagerVTable )
231+ if (offset == - 1 )
239232 {
240- Panic (" Failed to find CGameEventManager vtable \n " );
233+ Panic (" Failed to find IGameTypes_CreateWorkshopMapGroup \n " );
241234 bRequiredInitLoaded = false ;
242235 }
243236
244- loadEventsFromFileHook.Add (g_pCGameEventManagerVTable);
237+ createWorkshopMapGroupHook.SetIndex (offset);
238+ createWorkshopMapGroupHook.Add (g_pGameTypes);
239+
240+ void ** pCGameEventManagerVTable = modules::server->FindVirtualTable (" CGameEventManager" );
245241
246- g_pCGamePlayerEquipVTable = (CGamePlayerEquip*)modules::server->FindVirtualTable (" CGamePlayerEquip" );
247- if (!g_pCGamePlayerEquipVTable)
242+ if (!pCGameEventManagerVTable)
248243 {
249- Panic (" Failed to find CGamePlayerEquip vtable\n " );
244+ Panic (" Failed to find CGameEventManager vtable\n " );
250245 bRequiredInitLoaded = false ;
251246 }
252247
253- int offset = g_GameConfig-> GetOffset ( " CBaseEntity::Use " );
248+ offset = KHook::GetVtableIndex (&IGameEventManager2::LoadEventsFromFile );
254249
255250 if (offset == -1 )
256251 {
257- Panic (" Failed to find CBaseEntity::Use \n " );
252+ Panic (" Failed to find offset for IGameEventManager2::LoadEventsFromFile \n " );
258253 bRequiredInitLoaded = false ;
259254 }
260255
261- playerEquipUseHook.SetIndex (offset);
262- playerEquipUseHook.Add (g_pCGamePlayerEquipVTable);
256+ loadEventsFromFileHook.Configure (pCGameEventManagerVTable[offset]);
263257
264- offset = g_GameConfig-> GetOffset ( " CBaseEntity::Precache " );
265- if (offset == - 1 )
258+ void ** pCGamePlayerEquipVTable = modules::server-> FindVirtualTable ( " CGamePlayerEquip " );
259+ if (!pCGamePlayerEquipVTable )
266260 {
267- Panic (" Failed to find CBaseEntity::Precache \n " );
261+ Panic (" Failed to find CGamePlayerEquip vtable \n " );
268262 bRequiredInitLoaded = false ;
269263 }
270264
271- playerEquipPrecacheHook.SetIndex (offset);
272- playerEquipPrecacheHook.Add (g_pCGamePlayerEquipVTable);
265+ offset = g_GameConfig->GetOffset (" CBaseEntity::Use" );
266+
267+ if (offset == -1 )
268+ {
269+ Panic (" Failed to find CBaseEntity::Use\n " );
270+ bRequiredInitLoaded = false ;
271+ }
273272
274- offset = g_GameConfig-> GetOffset ( " IGameTypes_CreateWorkshopMapGroup " );
273+ playerEquipUseHook. Configure (pCGamePlayerEquipVTable[offset] );
275274
275+ offset = g_GameConfig->GetOffset (" CBaseEntity::Precache" );
276276 if (offset == -1 )
277277 {
278- Panic (" Failed to find IGameTypes_CreateWorkshopMapGroup \n " );
278+ Panic (" Failed to find CBaseEntity::Precache \n " );
279279 bRequiredInitLoaded = false ;
280280 }
281281
282- createWorkshopMapGroupHook.SetIndex (offset);
283- createWorkshopMapGroupHook.Add (g_pGameTypes);
282+ playerEquipPrecacheHook.Configure (pCGamePlayerEquipVTable[offset]);
284283
285- g_pCCSPlayerPawnVTable = (CCSPlayerPawn*) modules::server->FindVirtualTable (" CCSPlayerPawn" );
284+ void ** pCCSPlayerPawnVTable = modules::server->FindVirtualTable (" CCSPlayerPawn" );
286285
287- if (!g_pCCSPlayerPawnVTable )
286+ if (!pCCSPlayerPawnVTable )
288287 {
289288 Panic (" Failed to find CCSPlayerPawn vtable\n " );
290289 bRequiredInitLoaded = false ;
@@ -297,12 +296,11 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool
297296 bRequiredInitLoaded = false ;
298297 }
299298
300- onTakeDamageAliveHook.SetIndex (offset);
301- onTakeDamageAliveHook.Add (g_pCCSPlayerPawnVTable);
299+ onTakeDamageAliveHook.Configure (pCCSPlayerPawnVTable[offset]);
302300
303- g_pCCSPlayer_MovementServicesVTable = (CCSPlayer_MovementServices*) modules::server->FindVirtualTable (" CCSPlayer_MovementServices" );
301+ void ** pCCSPlayer_MovementServicesVTable = modules::server->FindVirtualTable (" CCSPlayer_MovementServices" );
304302
305- if (!g_pCCSPlayer_MovementServicesVTable )
303+ if (!pCCSPlayer_MovementServicesVTable )
306304 {
307305 Panic (" Failed to find CCSPlayer_MovementServices vtable\n " );
308306 bRequiredInitLoaded = false ;
@@ -315,12 +313,11 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool
315313 bRequiredInitLoaded = false ;
316314 }
317315
318- checkMovingGroundHook.SetIndex (offset);
319- checkMovingGroundHook.Add (g_pCCSPlayer_MovementServicesVTable);
316+ checkMovingGroundHook.Configure (pCCSPlayer_MovementServicesVTable[offset]);
320317
321- g_pCCSGameRulesVTable = (CCSGameRules*) modules::server->FindVirtualTable (" CCSGameRules" );
318+ void ** pCCSGameRulesVTable = modules::server->FindVirtualTable (" CCSGameRules" );
322319
323- if (!g_pCCSGameRulesVTable )
320+ if (!pCCSGameRulesVTable )
324321 {
325322 Panic (" Failed to find CCSGameRules vtable\n " );
326323 bRequiredInitLoaded = false ;
@@ -333,12 +330,11 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool
333330 bRequiredInitLoaded = false ;
334331 }
335332
336- goToIntermissionHook.SetIndex (offset);
337- goToIntermissionHook.Add (g_pCCSGameRulesVTable);
333+ goToIntermissionHook.Configure (pCCSGameRulesVTable[offset]);
338334
339- g_pCVPhys2WorldVTable = (CVPhys2World*) modules::vphysics2->FindVirtualTable (" CVPhys2World" );
335+ void ** pCVPhys2WorldVTable = modules::vphysics2->FindVirtualTable (" CVPhys2World" );
340336
341- if (!g_pCVPhys2WorldVTable )
337+ if (!pCVPhys2WorldVTable )
342338 {
343339 Panic (" Failed to find CVPhys2World vtable\n " );
344340 bRequiredInitLoaded = false ;
@@ -351,12 +347,11 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool
351347 bRequiredInitLoaded = false ;
352348 }
353349
354- physicsTouchShuffleHook.SetIndex (offset);
355- physicsTouchShuffleHook.Add (g_pCVPhys2WorldVTable);
350+ physicsTouchShuffleHook.Configure (pCVPhys2WorldVTable[offset]);
356351
357- g_pCCSPlayer_WeaponServicesVTable = (CCSPlayer_WeaponServices*) modules::server->FindVirtualTable (" CCSPlayer_WeaponServices" );
352+ void ** pCCSPlayer_WeaponServicesVTable = modules::server->FindVirtualTable (" CCSPlayer_WeaponServices" );
358353
359- if (!g_pCCSPlayer_WeaponServicesVTable )
354+ if (!pCCSPlayer_WeaponServicesVTable )
360355 {
361356 Panic (" Failed to find CCSPlayer_WeaponServices vtable\n " );
362357 bRequiredInitLoaded = false ;
@@ -369,8 +364,7 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool
369364 bRequiredInitLoaded = false ;
370365 }
371366
372- dropWeaponHook.SetIndex (offset);
373- dropWeaponHook.Add (g_pCCSPlayer_WeaponServicesVTable);
367+ dropWeaponHook.Configure (pCCSPlayer_WeaponServicesVTable[offset]);
374368
375369 if (!bRequiredInitLoaded)
376370 {
@@ -470,15 +464,15 @@ bool CS2Fixes::Unload(char* error, size_t maxlen)
470464 startupServerHook.Remove (g_pNetworkServerService);
471465 checkTransmitHook.Remove (g_pSource2GameEntities);
472466 dispatchConCommandHook.Remove (g_pCVar);
473- loadEventsFromFileHook.Remove (g_pCGameEventManagerVTable);
474- playerEquipUseHook.Remove (g_pCGamePlayerEquipVTable);
475- playerEquipPrecacheHook.Remove (g_pCGamePlayerEquipVTable);
476467 createWorkshopMapGroupHook.Remove (g_pGameTypes);
477- onTakeDamageAliveHook.Remove (g_pCCSPlayerPawnVTable);
478- checkMovingGroundHook.Remove (g_pCCSPlayer_MovementServicesVTable);
479- goToIntermissionHook.Remove (g_pCCSGameRulesVTable);
480- physicsTouchShuffleHook.Remove (g_pCVPhys2WorldVTable);
481- dropWeaponHook.Remove (g_pCCSPlayer_WeaponServicesVTable);
468+ loadEventsFromFileHook.~Member ();
469+ playerEquipUseHook.~Member ();
470+ playerEquipPrecacheHook.~Member ();
471+ onTakeDamageAliveHook.~Member ();
472+ checkMovingGroundHook.~Member ();
473+ goToIntermissionHook.~Member ();
474+ physicsTouchShuffleHook.~Member ();
475+ dropWeaponHook.~Member ();
482476
483477 ConVar_Unregister ();
484478
0 commit comments