#pragma once // used: schema field #include "../../utilities/memory.h" #include "../entity_handle.h" #define MAX_ENTITIES_IN_LIST 512 #define MAX_ENTITY_LISTS 64 // 0x3F #define MAX_TOTAL_ENTITIES MAX_ENTITIES_IN_LIST* MAX_ENTITY_LISTS class C_BaseEntity; class CGameEntitySystem { public: /// GetClientEntity template T* Get(int nIndex) { return reinterpret_cast(this->GetEntityByIndex(nIndex)); } /// GetClientEntityFromHandle template T* Get(const CBaseHandle hHandle) { if (!hHandle.IsValid()) return nullptr; return reinterpret_cast(this->GetEntityByIndex(hHandle.GetEntryIndex())); } int GetHighestEntityIndex() { return *reinterpret_cast(reinterpret_cast(this) + 0x1510); } private: void* GetEntityByIndex(int nIndex) { //@ida: #STR: "(missing),", "(missing)", "Ent %3d: %s class %s name %s\n" | or find "cl_showents" cvar -> look for callback // do { pEntity = GetBaseEntityByIndex(g_pGameEntitySystem, nCurrentIndex); ... } using fnGetBaseEntity = void*(CS_THISCALL*)(void*, int); static auto GetBaseEntity = reinterpret_cast(MEM::FindPattern(CLIENT_DLL, CS_XOR("81 FA ? ? ? ? 77 ? 8B C2 C1 F8 ? 83 F8 ? 77 ? 48 98 48 8B 4C C1 ? 48 85 C9 74 ? 8B C2 25 ? ? ? ? 48 6B C0 ? 48 03 C8 74 ? 8B 41 ? 25 ? ? ? ? 3B C2 75 ? 48 8B 01"))); return GetBaseEntity(this, nIndex); } };