From e4c5748fc1f4610666357979580ffdf063c12b13 Mon Sep 17 00:00:00 2001 From: FutureRave Date: Mon, 30 Jan 2023 19:31:14 +0000 Subject: [PATCH] fix status on mp --- src/client/component/gameplay.cpp | 93 -------------------- src/client/component/patches.cpp | 139 ++++++++++++++++++++++++++++++ src/client/game/game.cpp | 4 + src/client/game/game.hpp | 1 + src/client/game/structs.hpp | 5 +- 5 files changed, 148 insertions(+), 94 deletions(-) delete mode 100644 src/client/component/gameplay.cpp create mode 100644 src/client/component/patches.cpp diff --git a/src/client/component/gameplay.cpp b/src/client/component/gameplay.cpp deleted file mode 100644 index 59505d8..0000000 --- a/src/client/component/gameplay.cpp +++ /dev/null @@ -1,93 +0,0 @@ -#include -#include "loader/component_loader.hpp" - -#include - -namespace gameplay { -namespace { -game::dvar_s** player_sustainAmmo = nullptr; -game::dvar_s** player_sprintStrafeSpeedScale = nullptr; - -game::dvar_s** jump_height = nullptr; - -utils::hook::detour pm_weapon_use_ammo_hook; - -void pm_weapon_use_ammo_stub(void* ps, int wp, int amount) { - if (!(*player_sustainAmmo)->current.enabled) { - pm_weapon_use_ammo_hook.invoke(ps, wp, amount); - } -} - -void __declspec(naked) bg_get_sprint_strafe_speed_scale_stub() { - __asm { - push eax - - mov eax, player_sprintStrafeSpeedScale - mov eax, [eax] // Access pointer - fld dword ptr [eax + 0x18] // dvar_s.current.value - - pop eax - ret - } -} - -void __declspec(naked) jump_start_mp_stub() { - static DWORD func = 0x7AEF10; - - __asm { - mov esi, jump_height - mov esi, [esi] // Access pointer - movss xmm0, dword ptr [esi + 0x18] // dvar_s.current.value - - // Game's code - mov ecx, ebp - mov esi, ebx - - push 0x5CE940 // return address - jmp func - } -} - -void __declspec(naked) jump_start_sp_stub() { - static DWORD func = 0x75BDD0; - - __asm { - mov esi, jump_height - mov esi, [esi] // Access pointer - movss xmm0, dword ptr [esi + 0x18] // dvar_s.current.value - - // Game's code - mov edx, ebp - mov esi, ebx - - push 0x5D0440 // return address - jmp func - } -} -} // namespace - -class component final : public component_interface { -public: - void post_unpack() override { - if (game::environment::is_mp()) { - jump_height = reinterpret_cast(0xC4F7D8); - utils::hook::jump(0x5CE92F, jump_start_mp_stub); - } - - if (game::environment::is_sp()) { - player_sustainAmmo = reinterpret_cast(0xBCD250); - pm_weapon_use_ammo_hook.create(0x6979B0, &pm_weapon_use_ammo_stub); - - jump_height = reinterpret_cast(0xBCAE58); - utils::hook::jump(0x5D042F, jump_start_sp_stub); - } - - player_sprintStrafeSpeedScale = - reinterpret_cast(SELECT_VALUE(0xC51AE8, 0xBCD18C)); - utils::hook::jump(SELECT_VALUE(0x6344B0, 0x611BC0), - bg_get_sprint_strafe_speed_scale_stub); - } -}; -} // namespace gameplay - -REGISTER_COMPONENT(gameplay::component) diff --git a/src/client/component/patches.cpp b/src/client/component/patches.cpp new file mode 100644 index 0000000..3b00d1e --- /dev/null +++ b/src/client/component/patches.cpp @@ -0,0 +1,139 @@ +#include +#include "loader/component_loader.hpp" + +#include "game/structs.hpp" +#include "game/game.hpp" + +#include +#include + +namespace patches { +namespace { +int client_num_; +std::string status_; + +void server_status_basic_print([[maybe_unused]] const int channel, + const char* fmt) { + status_.append(fmt); +} + +void server_status_map_print([[maybe_unused]] const int channel, + const char* fmt, const char* map) { + status_.append(utils::string::va(fmt, map)); +} + +void server_status_header_print([[maybe_unused]] const int channel, + [[maybe_unused]] const char* fmt) { + status_.append("num score bot ping guid name " + "lastmsg address qport rate\n"); +} +void server_status_body_print([[maybe_unused]] const int channel, + [[maybe_unused]] const char* fmt) { + status_.append("--- ----- --- ---- ---------- --------------- ------- " + "--------------------- ------ -----\n"); +} + +void server_status_client_number_print([[maybe_unused]] const int channel, + const char* fmt, const int client_num) { + client_num_ = client_num; + status_.append(utils::string::va(fmt, client_num)); +} + +void server_status_score_print([[maybe_unused]] const int channel, + const char* fmt, const int score) { + status_.append(utils::string::va(fmt, score)); + status_.append(utils::string::va("%3i ", game::SV_IsTestClient(client_num_))); +} + +void server_status_ping_print([[maybe_unused]] const int channel, + const char* fmt, const int ping) { + status_.append(utils::string::va(fmt, ping)); +} + +void server_status_guid_print([[maybe_unused]] const int channel, + const char* fmt, const int guid) { + status_.append(utils::string::va(fmt, guid)); +} + +void server_status_name_print([[maybe_unused]] const int channel, + const char* fmt, const char* name) { + status_.append(utils::string::va(fmt, name)); +} + +void server_status_last_msg_print([[maybe_unused]] const int channel, + const char* fmt, const int last_msg) { + status_.append(utils::string::va(fmt, last_msg)); +} + +void server_status_address_print([[maybe_unused]] const int channel, + const char* fmt, const char* address) { + status_.append(utils::string::va(fmt, address)); +} + +void server_status_qport_print([[maybe_unused]] const int channel, + const char* fmt, const int qport) { + status_.append(utils::string::va(fmt, qport)); +} + +void server_status_rate_print([[maybe_unused]] const int channel, + const char* fmt, const int rate) { + status_.append(utils::string::va(fmt, rate)); +} + +void server_status_terminating_print([[maybe_unused]] const int channel, + const char* fmt) { + status_.append(fmt); // final new line + game::Com_Printf(game::CON_CHANNEL_DONT_FILTER, "%s", status_.data()); + + // clear the buffer + status_.clear(); +} +} // namespace + +class component final : public component_interface { +public: + void post_unpack() override { + if (game::environment::is_sp()) { + return; + } + + utils::hook::call(0x8760E2, server_status_map_print); + + utils::hook::call(0x8760EE, server_status_header_print); + + utils::hook::call(0x8760FA, server_status_body_print); + + utils::hook::call(0x876131, server_status_client_number_print); + + utils::hook::call(0x876165, server_status_score_print); + + utils::hook::call(0x87617B, server_status_basic_print); // connecting print + + utils::hook::call(0x876191, server_status_basic_print); // zombie print + + utils::hook::call(0x8761B5, server_status_ping_print); + + utils::hook::call(0x8761CB, server_status_guid_print); + + utils::hook::call(0x8761DE, server_status_name_print); + + utils::hook::call(0x876207, server_status_basic_print); // space print + + utils::hook::call(0x876227, server_status_last_msg_print); + + utils::hook::call(0x876251, server_status_address_print); + + utils::hook::call(0x876287, server_status_basic_print); // space print + + utils::hook::call(0x87629F, server_status_qport_print); + + utils::hook::call(0x8762B2, server_status_rate_print); + + utils::hook::call(0x8762BE, server_status_basic_print); // new line print + + utils::hook::call(0x8762E2, server_status_terminating_print); + } +}; +} // namespace patches + +REGISTER_COMPONENT(patches::component) diff --git a/src/client/game/game.cpp b/src/client/game/game.cpp index 39a7bfc..10e5fb4 100644 --- a/src/client/game/game.cpp +++ b/src/client/game/game.cpp @@ -10,4 +10,8 @@ bool is_mp() { return current == gamemode::multiplayer; } bool is_sp() { return current == gamemode::zombies; } } // namespace environment + +bool SV_IsTestClient(int clientNum) { + return svs_clients[clientNum].bIsTestClient == 1; +} } // namespace game diff --git a/src/client/game/game.hpp b/src/client/game/game.hpp index 04c3ead..3f2fb18 100644 --- a/src/client/game/game.hpp +++ b/src/client/game/game.hpp @@ -34,6 +34,7 @@ private: T* t5zm_; }; +extern bool SV_IsTestClient(int clientNum); } // namespace game #include "symbols.hpp" diff --git a/src/client/game/structs.hpp b/src/client/game/structs.hpp index a0ec50b..5f9bc20 100644 --- a/src/client/game/structs.hpp +++ b/src/client/game/structs.hpp @@ -491,8 +491,11 @@ struct client_s { char name[32]; // 21872 char clanAbbrev[5]; // 21904 unsigned __int64 xuid; // 21912 - unsigned char __pad0[0x76D48]; + char __pad0[0x54FB0]; + int bIsTestClient; + unsigned char __pad1[0x21D90]; }; +static_assert(offsetof(client_s, bIsTestClient) == 0x5A550); static_assert(sizeof(client_s) == 0x7C2E8); } // namespace game