summaryrefslogtreecommitdiffstats
path: root/src/server.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/server.cpp49
1 files changed, 46 insertions, 3 deletions
diff --git a/src/server.cpp b/src/server.cpp
index 39bb162..40aa850 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -31,7 +31,9 @@ enum {
31 FIELD_CHARACTER = 8, 31 FIELD_CHARACTER = 8,
32 FIELD_EMBEDDED = 10, 32 FIELD_EMBEDDED = 10,
33 FIELD_CUSTOM = 11, 33 FIELD_CUSTOM = 11,
34 FIELD_EHANDLE = 13 34 FIELD_EHANDLE = 13,
35 FIELD_TIME = 16,
36 FIELD_FLOAT = 1
35}; 37};
36 38
37// SF_FLOOR_TURRET_CITIZEN (npc_turret_floor.h). Citizen-built turrets 39// SF_FLOOR_TURRET_CITIZEN (npc_turret_floor.h). Citizen-built turrets
@@ -53,6 +55,9 @@ static int g_srv_hacked = -1;
53static int g_srv_npcstate = -1; 55static int g_srv_npcstate = -1;
54static int g_srv_takedamage = -1; 56static int g_srv_takedamage = -1;
55static int g_srv_mapname = -1; 57static int g_srv_mapname = -1;
58static int g_srv_armor = -1;
59static int g_srv_detonate = -1;
60static int g_srv_grenade_radius = -1;
56static bool g_srv_ready = false; 61static bool g_srv_ready = false;
57static bool g_srv_checked = false; 62static bool g_srv_checked = false;
58 63
@@ -150,17 +155,22 @@ bool resolve_server_netvars() {
150 g_srv_takedamage = datamap_offset("m_takedamage", FIELD_INTEGER); 155 g_srv_takedamage = datamap_offset("m_takedamage", FIELD_INTEGER);
151 // CChangeLevel::m_szMapName is a char[cchMapNameMost] on trigger_changelevel. 156 // CChangeLevel::m_szMapName is a char[cchMapNameMost] on trigger_changelevel.
152 g_srv_mapname = datamap_offset("m_szMapName", FIELD_CHARACTER, 0x40, 0x4000); 157 g_srv_mapname = datamap_offset("m_szMapName", FIELD_CHARACTER, 0x40, 0x4000);
158 // CBasePlayer::m_ArmorValue (int).
159 g_srv_armor = datamap_offset("m_ArmorValue", FIELD_INTEGER);
160 // CBaseGrenade fuse / blast radius (m_flDetonateTime is not networked).
161 g_srv_detonate = datamap_offset("m_flDetonateTime", FIELD_TIME);
162 g_srv_grenade_radius = datamap_offset("m_DmgRadius", FIELD_FLOAT);
153 g_srv_ready = g_srv_health > 0; 163 g_srv_ready = g_srv_health > 0;
154 if (g_srv_ready) { 164 if (g_srv_ready) {
155 logf("server datamap (%s): health=%d maxhealth=%d lifeste=%d " 165 logf("server datamap (%s): health=%d maxhealth=%d lifeste=%d "
156 "modelindex=%d absvel=%d vel=%d activeweapon=%d relationship=%d " 166 "modelindex=%d absvel=%d vel=%d activeweapon=%d relationship=%d "
157 "followtarget=%d spawnflags=%d hacked=%d npcstate=%d " 167 "followtarget=%d spawnflags=%d hacked=%d npcstate=%d "
158 "takedamage=%d mapname=%d", 168 "takedamage=%d mapname=%d armor=%d detonate=%d dmgradius=%d",
159 g_server.path.c_str(), g_srv_health, g_srv_maxhealth, g_srv_lifestate, 169 g_server.path.c_str(), g_srv_health, g_srv_maxhealth, g_srv_lifestate,
160 g_srv_modelindex, g_srv_absvelocity, g_srv_velocity, 170 g_srv_modelindex, g_srv_absvelocity, g_srv_velocity,
161 g_srv_activeweapon, g_srv_relationship, g_srv_followtarget, 171 g_srv_activeweapon, g_srv_relationship, g_srv_followtarget,
162 g_srv_spawnflags, g_srv_hacked, g_srv_npcstate, g_srv_takedamage, 172 g_srv_spawnflags, g_srv_hacked, g_srv_npcstate, g_srv_takedamage,
163 g_srv_mapname); 173 g_srv_mapname, g_srv_armor, g_srv_detonate, g_srv_grenade_radius);
164 fail_logged = false; 174 fail_logged = false;
165 } else if (!fail_logged) { 175 } else if (!fail_logged) {
166 fail_logged = true; 176 fail_logged = true;
@@ -425,6 +435,39 @@ bool server_set_velocity_z(int idx, float vz) {
425 return true; 435 return true;
426} 436}
427 437
438// Local player's HEV suit armor from the authoritative server entity.
439int server_player_armor(int idx) {
440 if (!g_srv_ready || g_srv_armor < 0)
441 return -1;
442 void *base = nullptr;
443 server_entity_health(idx, nullptr, nullptr, &base);
444 if (!base)
445 return -1;
446 return *(int *)((uintptr_t)base + g_srv_armor);
447}
448
449// CBaseGrenade fuse time and blast radius from the server entity. Both are
450// non-networked (m_flDetonateTime is commented out of the send table).
451float server_grenade_detonate(int idx) {
452 if (!g_srv_ready || g_srv_detonate < 0)
453 return -1.0f;
454 void *base = nullptr;
455 server_entity_health(idx, nullptr, nullptr, &base);
456 if (!base)
457 return -1.0f;
458 return *(float *)((uintptr_t)base + g_srv_detonate);
459}
460
461float server_grenade_radius(int idx) {
462 if (!g_srv_ready || g_srv_grenade_radius < 0)
463 return -1.0f;
464 void *base = nullptr;
465 server_entity_health(idx, nullptr, nullptr, &base);
466 if (!base)
467 return -1.0f;
468 return *(float *)((uintptr_t)base + g_srv_grenade_radius);
469}
470
428// Entity index of the player's active weapon from the authoritative server 471// Entity index of the player's active weapon from the authoritative server
429// entity. Used as a fallback if the client m_hActiveWeapon netvar is missing. 472// entity. Used as a fallback if the client m_hActiveWeapon netvar is missing.
430int server_active_weapon(int idx) { 473int server_active_weapon(int idx) {