diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..601b48d
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,92 @@
+{
+ "files.associations": {
+ "*.es": "javascript",
+ "*.py": "python",
+ "*.scar": "lua",
+ "*.ai": "lua",
+ "algorithm": "cpp",
+ "array": "cpp",
+ "atomic": "cpp",
+ "bit": "cpp",
+ "cctype": "cpp",
+ "charconv": "cpp",
+ "chrono": "cpp",
+ "clocale": "cpp",
+ "cmath": "cpp",
+ "compare": "cpp",
+ "concepts": "cpp",
+ "cstdarg": "cpp",
+ "cstddef": "cpp",
+ "cstdint": "cpp",
+ "cstdio": "cpp",
+ "cstdlib": "cpp",
+ "cstring": "cpp",
+ "ctime": "cpp",
+ "cwchar": "cpp",
+ "exception": "cpp",
+ "format": "cpp",
+ "forward_list": "cpp",
+ "initializer_list": "cpp",
+ "iomanip": "cpp",
+ "ios": "cpp",
+ "iosfwd": "cpp",
+ "istream": "cpp",
+ "iterator": "cpp",
+ "limits": "cpp",
+ "list": "cpp",
+ "locale": "cpp",
+ "map": "cpp",
+ "memory": "cpp",
+ "mutex": "cpp",
+ "new": "cpp",
+ "optional": "cpp",
+ "ostream": "cpp",
+ "ratio": "cpp",
+ "sstream": "cpp",
+ "stdexcept": "cpp",
+ "stop_token": "cpp",
+ "streambuf": "cpp",
+ "string": "cpp",
+ "system_error": "cpp",
+ "thread": "cpp",
+ "tuple": "cpp",
+ "type_traits": "cpp",
+ "typeinfo": "cpp",
+ "unordered_map": "cpp",
+ "utility": "cpp",
+ "vector": "cpp",
+ "xfacet": "cpp",
+ "xhash": "cpp",
+ "xiosbase": "cpp",
+ "xlocale": "cpp",
+ "xlocbuf": "cpp",
+ "xlocinfo": "cpp",
+ "xlocmes": "cpp",
+ "xlocmon": "cpp",
+ "xlocnum": "cpp",
+ "xloctime": "cpp",
+ "xmemory": "cpp",
+ "xstddef": "cpp",
+ "xstring": "cpp",
+ "xtr1common": "cpp",
+ "xtree": "cpp",
+ "xutility": "cpp",
+ "condition_variable": "cpp",
+ "fstream": "cpp",
+ "shared_mutex": "cpp",
+ "deque": "cpp",
+ "functional": "cpp",
+ "iostream": "cpp",
+ "set": "cpp",
+ "stack": "cpp",
+ "*.rmd": "markdown",
+ "nvdef.h": "c",
+ "*.cpp": "cpp",
+ "*.dec": "lua",
+ "nvsys.h": "c",
+ "*.rh": "cpp",
+ "random": "cpp",
+ "hash_map": "cpp",
+ "hash_set": "cpp"
+ }
+}
diff --git a/csgo2/csgo2.vcxproj b/csgo2/csgo2.vcxproj
index c3a7bc7..49df0ad 100644
--- a/csgo2/csgo2.vcxproj
+++ b/csgo2/csgo2.vcxproj
@@ -78,9 +78,11 @@
true
+ F:\source2\csgo2\csgo2\sdk\protobuf-2.6.1\src;$(IncludePath)
false
+ F:\source2\csgo2\csgo2\sdk\protobuf-2.6.1\src;$(IncludePath)
@@ -179,6 +181,7 @@
+
@@ -220,6 +223,7 @@
Create
+
diff --git a/csgo2/csgo2.vcxproj.filters b/csgo2/csgo2.vcxproj.filters
index 5d181cf..b360a79 100644
--- a/csgo2/csgo2.vcxproj.filters
+++ b/csgo2/csgo2.vcxproj.filters
@@ -79,6 +79,12 @@
{c359acb2-cc33-4be0-b5dd-3dfef50ba594}
+
+ {1a10744b-6cb8-44aa-882b-97c0fb47e0e4}
+
+
+ {120a3b6b-23e6-42e1-af96-c129732e797c}
+
@@ -210,6 +216,9 @@
头文件\sdk\tier1
+
+ 头文件\players
+
@@ -275,6 +284,9 @@
头文件\sdk\tier1
+
+ 源文件\players
+
diff --git a/csgo2/events.cpp b/csgo2/events.cpp
index 2ce21b4..bf9f76c 100644
--- a/csgo2/events.cpp
+++ b/csgo2/events.cpp
@@ -1,6 +1,8 @@
#include "events.h"
#include "native_sdk/entity/cbaseplayercontroller.h"
#include "player.h"
+#include "player_manager.h"
+
namespace events {
auto OnPlayerDeathEvent(IGameEvent* event) -> void {
UnkGameEventStruct_t userIdNameParams{ "userid" };
@@ -8,12 +10,11 @@ namespace events {
const auto victim = reinterpret_cast(event->GetPlayerPawn(&userIdNameParams));
const auto attacker = reinterpret_cast(event->GetPlayerPawn(&attackerNameParams));
- auto victimName = &victim->m_iszPlayerName();
- auto attackerName = &attacker->m_iszPlayerName();
- //victimBasePlayer->ForceRespawn();
- printf("victim %s\n", victimName);
- printf("attacker %s\n", attackerName);
+ auto victimName = std::string(PlayerManager::GetPlayerNameByPlayerSlot(victim->GetRefEHandle().GetPlayerSlot()));
+ auto attackerName = std::string(PlayerManager::GetPlayerNameByPlayerSlot(attacker->GetRefEHandle().GetPlayerSlot()));
+
+ printf("player %s killed %s\n", victimName.c_str(), attackerName.c_str());
}
auto OnPlayerChat(IGameEvent* event) -> void
@@ -25,6 +26,5 @@ namespace events {
LOG("player: %s say: %s \n", chaterName, text);
-
}
}
\ No newline at end of file
diff --git a/csgo2/hooks.cpp b/csgo2/hooks.cpp
index 1f6a72d..08665d3 100644
--- a/csgo2/hooks.cpp
+++ b/csgo2/hooks.cpp
@@ -1,126 +1,144 @@
#include "hooks.h"
#include "native_sdk/entity/cbaseentity.h"
#include "sdk/convar/convar.hpp"
+#include "player_manager.h"
+#include "native_sdk/entity/cbaseplayercontroller.h"
FireEventServerSide_t original_FireEventServerSide = NULL;
OnClientConnect_t original_OnClientConnected = NULL;
+OnClientDisconnect_t original_OnClientDisconnect = NULL;
Host_Say_t original_Host_Say = NULL;
namespace hooks {
- // "player_connect"
- VMTHook* VMT_IServerGameClient;
- void __fastcall hook_OnClientConnected(void* rcx, CPlayerSlot slot, const char* pszName, uint64_t xuid, const char* pszNetworkID, const char* pszAddress, bool bFakePlayer)
- {
- LOG("OnClientConnected(%d, \"%s\", %d, \"%s\", \"%s\" \"%d\")\n", slot.Get(), pszName, xuid, pszNetworkID, pszAddress, bFakePlayer);
- return original_OnClientConnected(rcx, slot, pszName, xuid, pszNetworkID, pszAddress, bFakePlayer);
+// "player_connect"
+VMTHook* VMT_IServerGameClient;
+void __fastcall hook_ClientDisconnect(void* rcx, CPlayerSlot slot, int reason,
+ const char* pszName, uint64_t xuid,
+ const char* pszNetworkID) {
+ PlayerManager::RemovePlayerNameFromPlayerNameList(slot, pszName);
+ return original_OnClientDisconnect(rcx, slot, reason, pszName, xuid,
+ pszNetworkID);
+}
+void __fastcall hook_OnClientConnected(void* rcx, CPlayerSlot slot,
+ const char* pszName, uint64_t xuid,
+ const char* pszNetworkID,
+ const char* pszAddress,
+ bool bFakePlayer) {
+ if (bFakePlayer == false) {
+ LOG("%s %d %s %s %s %d", __FUNCTION__, slot.Get(), pszName, pszNetworkID,
+ pszAddress, bFakePlayer);
}
- void __fastcall hook_Host_Say(void* pEntity, void* args, bool teamonly, int unk1, const char* unk2)
- {
- const auto theArgs = reinterpret_cast(args);
- const auto theEntity = reinterpret_cast(pEntity);
- char* pos = nullptr;
- do
- {
- if (theArgs == nullptr || theEntity == nullptr) {
- break;
- }
- auto message = std::string(theArgs->GetCommandString());
- printf("messageNoZero: %s \n", message.c_str());
- } while (false);
- /*
- if (*pMessage == '!' || *pMessage == '/')
- ParseChatCommand(pMessage, pEntity);
+ PlayerManager::AddPlayerNameToPlayerNameList(slot, pszName);
- if (*pMessage == '/')
- return;
- */
- return original_Host_Say(pEntity, args, teamonly, unk1, unk2);
- }
+ return original_OnClientConnected(rcx, slot, pszName, xuid, pszNetworkID,
+ pszAddress, bFakePlayer);
+}
+void __fastcall hook_Host_Say(void* pEntity, void* args, bool teamonly,
+ int unk1, const char* unk2) {
+ const auto theArgs = reinterpret_cast(args);
+ const auto theEntity = reinterpret_cast(pEntity);
- bool __fastcall hook_FireEventServerSide(CGameEventManager* rcx, IGameEvent* event,
- bool serverSide) {
- do {
- if (!event) {
- break;
- }
+ char* pos = nullptr;
+ do {
+ if (theArgs == nullptr || theEntity == nullptr) {
+ break;
+ }
+ auto message = std::string(theArgs->GetCommandString());
+ auto playerName = PlayerManager::GetPlayerNameByPlayerSlot(
+ theEntity->GetRefEHandle().GetPlayerSlot());
+ printf("player %s : %s \n", playerName.c_str(), message.c_str());
+ } while (false);
+ /*
+ if (*pMessage == '!' || *pMessage == '/')
+ ParseChatCommand(pMessage, pEntity);
- const char* eventName = event->GetName();
- if (!eventName) {
- break;
- }
- static constexpr auto player_death =
- hash_32_fnv1a_const("player_death");
- static constexpr auto player_chat =
- hash_32_fnv1a_const("player_chat");
- switch (hash_32_fnv1a_const(eventName))
- {
+ if (*pMessage == '/')
+ return;
+ */
+ return original_Host_Say(pEntity, args, teamonly, unk1, unk2);
+}
+
+bool __fastcall hook_FireEventServerSide(CGameEventManager* rcx,
+ IGameEvent* event, bool serverSide) {
+ do {
+ if (!event) {
+ break;
+ }
+
+ const char* eventName = event->GetName();
+ if (!eventName) {
+ break;
+ }
+ static constexpr auto player_death =
+ hash_32_fnv1a_const("player_death");
+ static constexpr auto player_chat = hash_32_fnv1a_const("player_chat");
+ switch (hash_32_fnv1a_const(eventName)) {
case player_death:
events::OnPlayerDeathEvent(event);
break;
- //Vbug,ⲻ
+ // Vbug,ⲻ
/*
case player_chat:
events::OnPlayerChat(event);
break;
}
*/
- }
+ }
- } while (false);
- return original_FireEventServerSide(rcx, event, serverSide);
- }
- auto initMinHook() -> bool {
- bool isSuccess = false;
- // ʼMiniHook
- do {
- if (MH_Initialize() != MH_OK) {
- LOG("MH_Initialize() != MH_OK\n");
- break;
- }
- //
- if (MH_CreateHook((LPVOID)Offset::FireEventServerSidePtr,
- &hook_FireEventServerSide,
- reinterpret_cast(
- &original_FireEventServerSide)) != MH_OK) {
- LOG("MH_CreateHook original_FireEventServerSide\n");
- break;
- }
- if (MH_CreateHook((LPVOID)Offset::Host_SayPtr,
- &hook_Host_Say,
- reinterpret_cast(
- &original_Host_Say)) != MH_OK) {
- LOG("MH_CreateHook original_Host_Say\n");
- break;
- }
- // ù
- if (MH_EnableHook(MH_ALL_HOOKS) != MH_OK) {
- LOG("MH_EnableHook \n");
- break;
- }
- isSuccess = true;
- } while (false);
- return isSuccess;
+ } while (false);
+ return original_FireEventServerSide(rcx, event, serverSide);
+}
+auto initMinHook() -> bool {
+ bool isSuccess = false;
+ // ʼMiniHook
+ do {
+ if (MH_Initialize() != MH_OK) {
+ LOG("MH_Initialize() != MH_OK\n");
+ break;
+ }
+ //
+ if (MH_CreateHook((LPVOID)Offset::FireEventServerSidePtr,
+ &hook_FireEventServerSide,
+ reinterpret_cast(
+ &original_FireEventServerSide)) != MH_OK) {
+ LOG("MH_CreateHook original_FireEventServerSide\n");
+ break;
+ }
+ if (MH_CreateHook((LPVOID)Offset::Host_SayPtr, &hook_Host_Say,
+ reinterpret_cast(&original_Host_Say)) !=
+ MH_OK) {
+ LOG("MH_CreateHook original_Host_Say\n");
+ break;
+ }
+ // ù
+ if (MH_EnableHook(MH_ALL_HOOKS) != MH_OK) {
+ LOG("MH_EnableHook \n");
+ break;
+ }
+ isSuccess = true;
+ } while (false);
+ return isSuccess;
+}
+auto initVmtHook() -> bool {
+ VMT_IServerGameClient = new VMTHook(Memory::read(
+ reinterpret_cast(Offset::InterFaces::IServerGameClient)));
+ original_OnClientConnected = reinterpret_cast(
+ VMT_IServerGameClient->Hook(11, hook_OnClientConnected));
+ original_OnClientDisconnect = reinterpret_cast(
+ VMT_IServerGameClient->Hook(16, hook_ClientDisconnect));
+ return original_OnClientConnected && original_OnClientDisconnect;
+}
+auto init() -> bool {
+ bool isSuccess = initMinHook() && initVmtHook();
+ // bool isSuccess = initVmtHook();
+ return isSuccess;
+}
+auto unload() -> void {
+ VMT_IServerGameClient->ClearHooks();
- }
- auto initVmtHook() -> bool {
- VMT_IServerGameClient = new VMTHook(Memory::read(reinterpret_cast(Offset::InterFaces::IServerGameClient)));
- original_OnClientConnected = reinterpret_cast(VMT_IServerGameClient->Hook(11, hook_OnClientConnected));
+ delete VMT_IServerGameClient;
- LOG("%s original_OnClientConnected: %p \n", __FUNCTION__, original_OnClientConnected);
- return original_OnClientConnected != nullptr;
- }
- auto init() -> bool {
- bool isSuccess = initMinHook() && initVmtHook();
- //bool isSuccess = initVmtHook();
- return isSuccess;
- }
- auto unload() -> void
- {
- VMT_IServerGameClient->ClearHooks();
-
- delete VMT_IServerGameClient;
-
- MH_DisableHook(MH_ALL_HOOKS);
- MH_RemoveHook(MH_ALL_HOOKS);
- MH_Uninitialize();
- }
-}
\ No newline at end of file
+ MH_DisableHook(MH_ALL_HOOKS);
+ MH_RemoveHook(MH_ALL_HOOKS);
+ MH_Uninitialize();
+}
+} // namespace hooks
diff --git a/csgo2/hooks.h b/csgo2/hooks.h
index ebfec43..cef3b38 100644
--- a/csgo2/hooks.h
+++ b/csgo2/hooks.h
@@ -6,6 +6,7 @@
typedef bool(__fastcall* FireEventServerSide_t)(CGameEventManager*, IGameEvent*, bool);
typedef void(__fastcall* Host_Say_t)(void*, void*, bool, int, const char*);
typedef void(__fastcall* OnClientConnect_t)(void*, CPlayerSlot, const char*, uint64_t, const char*, const char*, bool);
+typedef void(__fastcall* OnClientDisconnect_t)(void*, CPlayerSlot, int, const char*, uint64_t, const char*);
extern FireEventServerSide_t original_FireEventServerSide;
extern Host_Say_t original_Host_Say;
diff --git a/csgo2/native_sdk/cgameentitysystem.h b/csgo2/native_sdk/cgameentitysystem.h
index 412ed4f..8edc4e0 100644
--- a/csgo2/native_sdk/cgameentitysystem.h
+++ b/csgo2/native_sdk/cgameentitysystem.h
@@ -8,10 +8,10 @@
class CEntityIdentity
{
public:
- CBaseEntity *entity;
- void *dunno;
- int64_t unk0;
- int64_t unk1;
+ CBaseEntity *entity; //0
+ void *dunno; //8
+ int64_t unk0; //12
+ int64_t unk1; //16
const char *internalName;
const char *entityName;
void *unk2;
diff --git a/csgo2/native_sdk/entity/cbaseentity.h b/csgo2/native_sdk/entity/cbaseentity.h
index e9f39b4..3526a1b 100644
--- a/csgo2/native_sdk/entity/cbaseentity.h
+++ b/csgo2/native_sdk/entity/cbaseentity.h
@@ -11,14 +11,20 @@ public:
auto Schema_DynamicBinding() {
SchemaClassInfoData_t* rv = nullptr;
- CALL_VIRTUAL(void, 0, this, &rv);
+ CALL_VIRTUAL(void, 34, this, &rv);
return rv;
}
auto GetRefEHandle() {
- CHandle handle;
- CALL_VIRTUAL(void*, 2, this, &handle);
- return handle;
+ char* pIdentity = (char*)m_pEntity();
+ auto v3 = *(uint32_t*)(pIdentity + 16);
+ auto v4 = ENT_ENTRY_MASK;
+ auto v5 = ((v3 >> 15) - (*(uint32_t*)(pIdentity + 48) & 1)) << 15;
+ if (v3 != -1) {
+ v4 = *(uint32_t*)(pIdentity + 16) & ENT_ENTRY_MASK;
+ }
+
+ return CHandle(v4 | v5);
}
SCHEMA_FIELD(CEntityIdentity*, m_pEntity);
@@ -26,7 +32,7 @@ public:
};
-class CBaseEntity : CEntityInstance
+class CBaseEntity : public CEntityInstance
{
public:
DECLARE_CLASS(CBaseEntity);
diff --git a/csgo2/native_sdk/handle/handle.h b/csgo2/native_sdk/handle/handle.h
index bafa6bc..55ced4e 100644
--- a/csgo2/native_sdk/handle/handle.h
+++ b/csgo2/native_sdk/handle/handle.h
@@ -2,7 +2,8 @@
#include
#define INVALID_EHANDLE_INDEX 0xFFFFFFFF
#define ENT_ENTRY_MASK 0x7FFF
-
+inline int PlayerSlot_to_EntityIndex(int PlayerSlot) { return PlayerSlot + 1; }
+inline int EntityIndex_to_PlayerSlot(int EntityIndex) { return EntityIndex - 1; }
class CBaseEntity;
class CHandle
@@ -21,6 +22,8 @@ public:
{
return reinterpret_cast(GetBaseEntity());
}
-
+ auto GetPlayerSlot() {
+ return m_Index - 1;
+ }
uint32_t m_Index;
};
\ No newline at end of file
diff --git a/csgo2/offset.cpp b/csgo2/offset.cpp
index 3334d8e..d110b80 100644
--- a/csgo2/offset.cpp
+++ b/csgo2/offset.cpp
@@ -8,12 +8,13 @@ uint64_t CGameEventManagerPtr;
uint64_t Host_SayPtr;
uint64_t Module_tier0;
namespace InterFaces {
- CSchemaSystem* SchemaSystem;
- IGameEventManager2* GameEventManager;
- CGameEventManager* CGameEventManger;
- CGameResourceService* GameResourceServiceServer;
- IServerGameClients* IServerGameClient;
-};
+CSchemaSystem* SchemaSystem;
+IGameEventManager2* GameEventManager;
+CGameEventManager* CGameEventManger;
+CGameResourceService* GameResourceServiceServer;
+IServerGameClients* IServerGameClient;
+IVEngineServer2* IVEngineServer;
+}; // namespace InterFaces
auto Init() -> bool {
CModule server("server.dll");
CModule schemasystem("schemasystem.dll");
@@ -22,35 +23,55 @@ auto Init() -> bool {
// server.dll
server.FindPattern(pattern_FireEventServerSide).Get(FireEventServerSidePtr);
server.FindPattern(pattern_NetworkStateChanged).Get(NetworkStateChangedPtr);
- //48 8D 05 4A 30 82 00 lea rax, ??_7CGameEventManager@@6B@
- server.FindPattern(pattern_CGameEventManager).ToAbsolute(3, 0).Get(CGameEventManagerPtr);
+ // 48 8D 05 4A 30 82 00 lea rax, ??_7CGameEventManager@@6B@
+ server.FindPattern(pattern_CGameEventManager)
+ .ToAbsolute(3, 0)
+ .Get(CGameEventManagerPtr);
server.FindPattern(pattern_fnHost_SayPtr).Get(Host_SayPtr);
- //schemasystem
- InterFaces::SchemaSystem = reinterpret_cast(schemasystem.FindInterface("SchemaSystem_001").Get());
+ // schemasystem
+ InterFaces::SchemaSystem = reinterpret_cast(
+ schemasystem.FindInterface("SchemaSystem_001").Get());
// engine.dll
- InterFaces::GameEventManager = reinterpret_cast(engine.FindInterface("GameEventSystemServerV001").Get());
- InterFaces::GameResourceServiceServer = reinterpret_cast(engine.FindInterface("GameResourceServiceServerV001").Get());
+ InterFaces::GameEventManager = reinterpret_cast(
+ engine.FindInterface("GameEventSystemServerV001").Get());
+ InterFaces::GameResourceServiceServer =
+ reinterpret_cast(
+ engine.FindInterface("GameResourceServiceServerV001").Get());
+ InterFaces::IVEngineServer = reinterpret_cast(
+ engine.FindInterface("Source2EngineToServer001").Get());
// server.dll
- InterFaces::IServerGameClient = reinterpret_cast(server.FindInterface("Source2GameClients001").Get());
+ InterFaces::IServerGameClient = reinterpret_cast(
+ server.FindInterface("Source2GameClients001").Get());
+
// only init in console server
- InterFaces::CGameEventManger = reinterpret_cast(CGameEventManagerPtr);
+ InterFaces::CGameEventManger =
+ reinterpret_cast(CGameEventManagerPtr);
-
- //client.FindPattern(pattern_FireEventServerSide).Get(FireEventServerSidePtr);
+ // client.FindPattern(pattern_FireEventServerSide).Get(FireEventServerSidePtr);
LOG("[huoji]FireEventServerSidePtr : %llx \n", FireEventServerSidePtr);
LOG("[huoji]NetworkStateChangedPtr : %llx \n", NetworkStateChangedPtr);
LOG("[huoji]Host_SayPtr : %llx \n", Host_SayPtr);
LOG("[huoji]InterFaces::SchemaSystem : %llx \n", InterFaces::SchemaSystem);
- LOG("[huoji]InterFaces::GameEventManager : %llx \n", InterFaces::GameEventManager);
- LOG("[huoji]InterFaces::CGameEventManger : %llx \n", InterFaces::CGameEventManger);
- LOG("[huoji]InterFaces::GameResourceServiceServer : %llx \n", InterFaces::GameResourceServiceServer);
- LOG("[huoji]InterFaces::IServerGameClient : %llx \n", InterFaces::IServerGameClient);
+ LOG("[huoji]InterFaces::GameEventManager : %llx \n",
+ InterFaces::GameEventManager);
+ LOG("[huoji]InterFaces::CGameEventManger : %llx \n",
+ InterFaces::CGameEventManger);
+ LOG("[huoji]InterFaces::GameResourceServiceServer : %llx \n",
+ InterFaces::GameResourceServiceServer);
+ LOG("[huoji]InterFaces::IServerGameClient : %llx \n",
+ InterFaces::IServerGameClient);
+ LOG("[huoji]InterFaces::IVEngineServer : %llx \n",
+ InterFaces::IVEngineServer);
- //GetOffsets();
+ // GetOffsets();
LOG("init offset success !\n");
- return Host_SayPtr && InterFaces::GameResourceServiceServer && InterFaces::IServerGameClient && InterFaces::GameEventManager && InterFaces::SchemaSystem && FireEventServerSidePtr && NetworkStateChangedPtr;
+ return Host_SayPtr && InterFaces::IVEngineServer &&
+ InterFaces::GameResourceServiceServer &&
+ InterFaces::IServerGameClient && InterFaces::GameEventManager &&
+ InterFaces::SchemaSystem && FireEventServerSidePtr &&
+ NetworkStateChangedPtr;
}
} // namespace Offset
diff --git a/csgo2/offset.h b/csgo2/offset.h
index f314daa..65b1c43 100644
--- a/csgo2/offset.h
+++ b/csgo2/offset.h
@@ -12,6 +12,7 @@ namespace InterFaces {
extern CGameEventManager* CGameEventManger;
extern CGameResourceService* GameResourceServiceServer;
extern IServerGameClients* IServerGameClient;
+ extern IVEngineServer2* IVEngineServer;
};
static const auto pattern_CGameEventManager = THE_GAME_SIG("48 ?? ?? ?? ?? ?? ?? 48 89 ?? ?? ?? 48 89 01 48 8B D9 48 ?? ?? ?? ?? ?? ?? 48 89 ?? ?? E8 ?? ?? ?? ?? 48 ?? ?? ?? ?? ?? ??");
static const auto pattern_NetworkStateChanged = THE_GAME_SIG("4C 8B C9 48 8B 09 48 85 C9 74 ? 48 8B 41 10");
diff --git a/csgo2/pch.h b/csgo2/pch.h
index 03933b3..b37640d 100644
--- a/csgo2/pch.h
+++ b/csgo2/pch.h
@@ -10,13 +10,14 @@
#include
#include
#include