From 57b53d579f32f094c1cdefad62a6224baf270e0d Mon Sep 17 00:00:00 2001 From: salmonik Date: Thu, 5 Nov 2026 20:32:59 +0100 Subject: Items: server ammo counts and frag-grenade type - local_ammo now prefers the authoritative server m_iAmmo array (header skip) and only falls back to the client netvar array. The client offset can be off by an element, which made "full" checks flicker as other ammo was spent. - Frag grenade pickups were falling through to a generic "Ammo" label with ammo_type=-1, so the usable filter never ran. w_grenade/w_frag/ items/grenade/frag_grenade are now "Frag grenade" and map to m_iAmmo[11] (sk_max_grenade, stock 5); AR2/SMG1 grenade variants map to m_iAmmo[8]. --- CONTEXT.md | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'CONTEXT.md') diff --git a/CONTEXT.md b/CONTEXT.md index 8ff833c..4508fe6 100644 --- a/CONTEXT.md +++ b/CONTEXT.md @@ -692,11 +692,18 @@ vocabulary / decisions. `CBaseCombatCharacter::m_hMyWeapons[48]` array (client `m_hMyWeapons` and the remembered active weapon are fallbacks). NPC-held weapons are ignored. Weapons the player does not own stay under the Weapons category. -- Ammo pickups also honour "Only if usable": the reserve count from - `m_iAmmo[type]` (client array when resolved, otherwise the server - `CBaseCombatCharacter::m_iAmmo` array) is compared with the `sk_max_*` cvar - (stock caps as fallback, e.g. RPG rockets = 3). Full ammo hides the pickup; - if either value cannot be read the item stays visible. +- Ammo pickups also honour "Only if usable": the reserve count from the + authoritative server `CBaseCombatCharacter::m_iAmmo` array is compared with + the `sk_max_*` cvar (stock caps as fallback, e.g. RPG rockets = 3); the + client array is only a fallback. Full ammo hides the pickup; if either value + cannot be read the item stays visible. Preferring the server array fixed + "full" counts flickering as other ammo was spent — the client `m_iAmmo` + netvar offset can be off by an element. +- Frag grenade pickups were falling through to a generic "Ammo" label with + `ammo_type = -1`, so the usable filter never applied and they always showed. + `models/weapons/w_grenade`, `w_frag`, `items/grenade` and `frag_grenade` are + now labelled "Frag grenade" and mapped to `m_iAmmo[11]` (`sk_max_grenade`, + stock 5). AR2/SMG1 grenade variants map to `m_iAmmo[8]` (stock 3). - The datamap offset for `m_iAmmo`/`m_hMyWeapons` points at the `CNetworkArray` length header; the actual elements start **4 bytes later**. Reading at the raw offset shifted every count by one type (e.g. RPG read the -- cgit v1.2.3