From d7edcc9d9e3d90e1c53885870461e046389dee96 Mon Sep 17 00:00:00 2001 From: salmonik Date: Mon, 26 Oct 2026 15:33:02 +0100 Subject: ESP working: NPC detection + authoritative server-side health - entitylist slot 6 (GetHighestEntityIndex); class name via GetClientNetworkable -> GetClientClass (replaces the unsafe slot-2 call) - HL2 SP NPCs: class CAI_BaseNPC + m_lifeState, since NPC m_iHealth is not networked; model names from VModelInfoClient006 for labels/friend-foe - real HP/HP-max from the listen-server entity (IVEngineServer021 -> PEntityOfEntIndex -> edict->m_pUnk -> GetBaseEntity) using offsets scanned from server.so's datamap; validated against the client model index - world_to_screen via IVDebugOverlay003::ScreenPosition (fixes box drift) - maxs sanity clamp, NPC-only debug logging, neutral colour for wildlife - build.sh: restore -o libhl2hake.so and add server.cpp --- src/modules.cpp | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/modules.cpp') diff --git a/src/modules.cpp b/src/modules.cpp index d20fe04..70e2dff 100644 --- a/src/modules.cpp +++ b/src/modules.cpp @@ -11,6 +11,7 @@ static bool basename_is(const char *path, const char *base) { void find_modules() { g_client = Module(); g_engine = Module(); + g_server = Module(); FILE *f = fopen("/proc/self/maps", "r"); if (!f) return; @@ -41,6 +42,8 @@ void find_modules() { m = &g_client; else if (basename_is(clean, "engine.so")) m = &g_engine; + else if (basename_is(clean, "server.so")) + m = &g_server; } else { // anon: absorb only as .bss tail after a file-backed range if (g_client.valid() && g_client.ranges.back().file && -- cgit v1.2.3