diff options
Diffstat (limited to '')
| -rw-r--r-- | src/server.cpp | 49 |
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; | |||
| 53 | static int g_srv_npcstate = -1; | 55 | static int g_srv_npcstate = -1; |
| 54 | static int g_srv_takedamage = -1; | 56 | static int g_srv_takedamage = -1; |
| 55 | static int g_srv_mapname = -1; | 57 | static int g_srv_mapname = -1; |
| 58 | static int g_srv_armor = -1; | ||
| 59 | static int g_srv_detonate = -1; | ||
| 60 | static int g_srv_grenade_radius = -1; | ||
| 56 | static bool g_srv_ready = false; | 61 | static bool g_srv_ready = false; |
| 57 | static bool g_srv_checked = false; | 62 | static 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. | ||
| 439 | int 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). | ||
| 451 | float 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 | |||
| 461 | float 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. |
| 430 | int server_active_weapon(int idx) { | 473 | int server_active_weapon(int idx) { |
