summaryrefslogtreecommitdiffstats
path: root/src/server.cpp
diff options
context:
space:
mode:
authorsalmonik <salmonik@tuta.io>2026-11-04 23:26:53 +0100
committersalmonik <salmonik@tuta.io>2026-11-04 23:26:53 +0100
commit074e315c8550712dce0c7b530a90eee6aca29e63 (patch)
treefc5d6ecf6dce582971f0c3878b68f4714b8e6fba /src/server.cpp
parentChams: working alpha via RenderView blend and a custom VMT (diff)
downloadhl2h-074e315c8550712dce0c7b530a90eee6aca29e63.tar.gz
hl2h-074e315c8550712dce0c7b530a90eee6aca29e63.zip
Add grenade trajectory, RPG armour priority, empty chargers, mega gravity gun
- Projectiles gets a "Grenade trajectory" toggle. While a frag grenade is held, simulate the weapon_frag throw (1200 u/s forward + 120 z, player velocity, gravity 600) and trace each step with a new trace_solid_segment(); reflect on impact, stop on a slow upward-normal hit, and draw the path, landing cross and a 300-unit blast ring. Verified on :99 (arcs, bounces off the tunnel wall, lands). - With the RPG equipped, armoured NPCs (striders, gunships, dropships, hunter-choppers) sort before normal enemies during target acquisition. Added helicopter/chopper to the ARMORED model list. - Empty health/suit chargers are hidden: read m_iJuice from the server datamap (0 = depleted, -1 = unreadable/fail open). - The citadel supercharged gravity gun (d3_citadel_03, d3_citadel_04, d3_breen_01 via IVEngineClient::GetLevelName) is treated as a normal weapon, so the melee aimbot no longer restricts it to VULNERABLE NPCs.
Diffstat (limited to 'src/server.cpp')
-rw-r--r--src/server.cpp18
1 files changed, 16 insertions, 2 deletions
diff --git a/src/server.cpp b/src/server.cpp
index bae355e..6479b25 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -58,6 +58,7 @@ static int g_srv_mapname = -1;
58static int g_srv_armor = -1; 58static int g_srv_armor = -1;
59static int g_srv_detonate = -1; 59static int g_srv_detonate = -1;
60static int g_srv_grenade_radius = -1; 60static int g_srv_grenade_radius = -1;
61static int g_srv_juice = -1;
61static int g_srv_ammo = -1; 62static int g_srv_ammo = -1;
62static int g_srv_myweapons = -1; 63static int g_srv_myweapons = -1;
63static bool g_srv_ready = false; 64static bool g_srv_ready = false;
@@ -162,6 +163,7 @@ bool resolve_server_netvars() {
162 // CBaseGrenade fuse / blast radius (m_flDetonateTime is not networked). 163 // CBaseGrenade fuse / blast radius (m_flDetonateTime is not networked).
163 g_srv_detonate = datamap_offset("m_flDetonateTime", FIELD_TIME); 164 g_srv_detonate = datamap_offset("m_flDetonateTime", FIELD_TIME);
164 g_srv_grenade_radius = datamap_offset("m_DmgRadius", FIELD_FLOAT); 165 g_srv_grenade_radius = datamap_offset("m_DmgRadius", FIELD_FLOAT);
166 g_srv_juice = datamap_offset("m_iJuice", FIELD_INTEGER);
165 // CBaseCombatCharacter arrays: ammo counts and the weapon handle list. 167 // CBaseCombatCharacter arrays: ammo counts and the weapon handle list.
166 g_srv_ammo = datamap_offset("m_iAmmo", FIELD_INTEGER, 0x40, 0x4000); 168 g_srv_ammo = datamap_offset("m_iAmmo", FIELD_INTEGER, 0x40, 0x4000);
167 g_srv_myweapons = datamap_offset("m_hMyWeapons", FIELD_EHANDLE); 169 g_srv_myweapons = datamap_offset("m_hMyWeapons", FIELD_EHANDLE);
@@ -171,13 +173,13 @@ bool resolve_server_netvars() {
171 "modelindex=%d absvel=%d vel=%d activeweapon=%d relationship=%d " 173 "modelindex=%d absvel=%d vel=%d activeweapon=%d relationship=%d "
172 "followtarget=%d spawnflags=%d hacked=%d npcstate=%d " 174 "followtarget=%d spawnflags=%d hacked=%d npcstate=%d "
173 "takedamage=%d mapname=%d armor=%d detonate=%d dmgradius=%d " 175 "takedamage=%d mapname=%d armor=%d detonate=%d dmgradius=%d "
174 "ammo=%d myweapons=%d", 176 "ammo=%d myweapons=%d juice=%d",
175 g_server.path.c_str(), g_srv_health, g_srv_maxhealth, g_srv_lifestate, 177 g_server.path.c_str(), g_srv_health, g_srv_maxhealth, g_srv_lifestate,
176 g_srv_modelindex, g_srv_absvelocity, g_srv_velocity, 178 g_srv_modelindex, g_srv_absvelocity, g_srv_velocity,
177 g_srv_activeweapon, g_srv_relationship, g_srv_followtarget, 179 g_srv_activeweapon, g_srv_relationship, g_srv_followtarget,
178 g_srv_spawnflags, g_srv_hacked, g_srv_npcstate, g_srv_takedamage, 180 g_srv_spawnflags, g_srv_hacked, g_srv_npcstate, g_srv_takedamage,
179 g_srv_mapname, g_srv_armor, g_srv_detonate, g_srv_grenade_radius, 181 g_srv_mapname, g_srv_armor, g_srv_detonate, g_srv_grenade_radius,
180 g_srv_ammo, g_srv_myweapons); 182 g_srv_ammo, g_srv_myweapons, g_srv_juice);
181 fail_logged = false; 183 fail_logged = false;
182 } else if (!fail_logged) { 184 } else if (!fail_logged) {
183 fail_logged = true; 185 fail_logged = true;
@@ -475,6 +477,18 @@ float server_grenade_radius(int idx) {
475 return *(float *)((uintptr_t)base + g_srv_grenade_radius); 477 return *(float *)((uintptr_t)base + g_srv_grenade_radius);
476} 478}
477 479
480// CWallHealth / CNewRecharge share the same m_iJuice layout (the fields before
481// it match), so one datamap offset works for both health and suit chargers.
482int server_item_juice(int idx) {
483 if (!g_srv_ready || g_srv_juice < 0)
484 return -1;
485 void *base = nullptr;
486 server_entity_health(idx, nullptr, nullptr, &base);
487 if (!base)
488 return -1;
489 return *(int *)((uintptr_t)base + g_srv_juice);
490}
491
478// Server-side CBaseCombatCharacter::m_iAmmo array (reserve ammo). The datamap 492// Server-side CBaseCombatCharacter::m_iAmmo array (reserve ammo). The datamap
479// offset points at the CNetworkArray length header; the elements start 4 bytes 493// offset points at the CNetworkArray length header; the elements start 4 bytes
480// later (confirmed by the shifted current/max table). 494// later (confirmed by the shifted current/max table).