From f4616119c64ddcaa14cf10727e7aba4a3e64910f Mon Sep 17 00:00:00 2001 From: salmonik Date: Wed, 4 Nov 2026 17:41:53 +0100 Subject: Items: skip the CNetworkArray length header for m_iAmmo/m_hMyWeapons The datamap offset points at the array length header, so every ammo count was read one type early. That made the RPG slot read the buckshot count (30) and permanently exceed the 3-rocket cap, which is why RPG pickups never showed and grenades/AR2/weapon ammo never hid. Read the elements 4 bytes after the field offset. --- src/server.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/server.cpp b/src/server.cpp index af0a8ff..09d198a 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -482,7 +482,9 @@ float server_grenade_radius(int idx) { return *(float *)((uintptr_t)base + g_srv_grenade_radius); } -// Server-side CBaseCombatCharacter::m_iAmmo array (reserve ammo). +// Server-side CBaseCombatCharacter::m_iAmmo array (reserve ammo). The datamap +// offset points at the CNetworkArray length header; the elements start 4 bytes +// later (confirmed by the shifted current/max table). int server_player_ammo(int idx, int type) { if (!g_srv_ready || g_srv_ammo < 0 || type < 0 || type >= 32) return -1; @@ -490,10 +492,11 @@ int server_player_ammo(int idx, int type) { server_entity_health(idx, nullptr, nullptr, &base); if (!base) return -1; - return *(int *)((uintptr_t)base + g_srv_ammo + type * 4); + return *(int *)((uintptr_t)base + g_srv_ammo + 4 + type * 4); } // Server-side m_hMyWeapons[48] handle for one inventory slot (0 if empty). +// Same 4-byte CNetworkArray header as m_iAmmo. uint32_t server_player_weapon(int idx, int slot) { if (!g_srv_ready || g_srv_myweapons < 0 || slot < 0 || slot >= 48) return 0; @@ -501,7 +504,7 @@ uint32_t server_player_weapon(int idx, int slot) { server_entity_health(idx, nullptr, nullptr, &base); if (!base) return 0; - return *(uint32_t *)((uintptr_t)base + g_srv_myweapons + slot * 4); + return *(uint32_t *)((uintptr_t)base + g_srv_myweapons + 4 + slot * 4); } // Entity index of the player's active weapon from the authoritative server -- cgit v1.2.3