From d0003da606fbf8a8ec0581caa04cccb28e81f701 Mon Sep 17 00:00:00 2001 From: Caball Date: Mon, 30 Dec 2024 23:05:06 +0100 Subject: [PATCH 01/11] Changed all game struct suffixes from _s to _t. --- src/client/component/auth.cpp | 4 +- src/client/component/bots.cpp | 6 +- src/client/component/command.cpp | 4 +- src/client/component/dedicated.cpp | 2 +- src/client/component/discord.cpp | 2 +- src/client/component/dvar_cheats.cpp | 2 +- src/client/component/game_console.cpp | 2 +- src/client/component/gameplay.cpp | 24 ++++---- src/client/component/network.cpp | 20 +++---- src/client/component/network.hpp | 22 +++---- src/client/component/party.cpp | 16 ++--- src/client/component/party.hpp | 4 +- src/client/component/patches.cpp | 4 +- src/client/component/rcon.cpp | 8 +-- src/client/component/server_list.cpp | 14 ++--- src/client/component/server_list.hpp | 4 +- src/client/game/structs.hpp | 84 +++++++++++++-------------- src/client/game/symbols.hpp | 48 +++++++-------- 18 files changed, 135 insertions(+), 135 deletions(-) diff --git a/src/client/component/auth.cpp b/src/client/component/auth.cpp index 74115b2..54f0ac1 100644 --- a/src/client/component/auth.cpp +++ b/src/client/component/auth.cpp @@ -82,7 +82,7 @@ namespace auth return key; } - int send_connect_data_stub(game::netsrc_t sock, game::netadr_s* adr, const char* format, const int len) + int send_connect_data_stub(game::netsrc_t sock, game::netadr_t* adr, const char* format, const int len) { std::string connect_string(format, len); game::SV_Cmd_TokenizeString(connect_string.data()); @@ -116,7 +116,7 @@ namespace auth return true; } - void direct_connect(game::netadr_s* from, game::msg_t* msg) + void direct_connect(game::netadr_t* from, game::msg_t* msg) { const auto offset = sizeof("connect") + 4; diff --git a/src/client/component/bots.cpp b/src/client/component/bots.cpp index 21ba876..dd4f2ec 100644 --- a/src/client/component/bots.cpp +++ b/src/client/component/bots.cpp @@ -144,7 +144,7 @@ namespace bots { bot_names_received = false; - game::netadr_s master{}; + game::netadr_t master{}; if (server_list::get_master_server(master)) { console::info("Getting bots...\n"); @@ -198,9 +198,9 @@ namespace bots parse_bot_names_from_file(); } - network::on("getbotsResponse", [](const game::netadr_s& target, const std::string& data) + network::on("getbotsResponse", [](const game::netadr_t& target, const std::string& data) { - game::netadr_s master{}; + game::netadr_t master{}; if (server_list::get_master_server(master) && !bot_names_received && target == master) { bot_names = utils::string::split(data, '\n'); diff --git a/src/client/component/command.cpp b/src/client/component/command.cpp index 32127b6..4ecd32f 100644 --- a/src/client/component/command.cpp +++ b/src/client/component/command.cpp @@ -194,7 +194,7 @@ namespace command void add_raw(const char* name, void (*callback)()) { - game::Cmd_AddCommandInternal(name, callback, utils::memory::get_allocator()->allocate()); + game::Cmd_AddCommandInternal(name, callback, utils::memory::get_allocator()->allocate()); } void add(const char* name, const std::function& callback) @@ -318,7 +318,7 @@ namespace command } console::info("================================ COMMAND DUMP =====================================\n"); - game::cmd_function_s* cmd = *game::cmd_functions; + game::cmd_function_t* cmd = *game::cmd_functions; auto i = 0; while (cmd) { diff --git a/src/client/component/dedicated.cpp b/src/client/component/dedicated.cpp index 03b951b..8734002 100644 --- a/src/client/component/dedicated.cpp +++ b/src/client/component/dedicated.cpp @@ -110,7 +110,7 @@ namespace dedicated return; } - game::netadr_s target{}; + game::netadr_t target{}; if (server_list::get_master_server(target)) { network::send(target, "heartbeat", "IW6"); diff --git a/src/client/component/discord.cpp b/src/client/component/discord.cpp index 97960c1..32bd91f 100644 --- a/src/client/component/discord.cpp +++ b/src/client/component/discord.cpp @@ -71,7 +71,7 @@ namespace discord discord_presence.state = host_name; discord_presence.partyMax = party::server_client_count(); - std::hash hash_fn; + std::hash hash_fn; static const auto nonce = utils::cryptography::random::get_integer(); const auto& address = party::get_target(); diff --git a/src/client/component/dvar_cheats.cpp b/src/client/component/dvar_cheats.cpp index 19450f2..bda4b71 100644 --- a/src/client/component/dvar_cheats.cpp +++ b/src/client/component/dvar_cheats.cpp @@ -110,7 +110,7 @@ namespace dvar_cheats a.jmp(0x1404F0D74); }); - void cg_set_client_dvar_from_server(const int local_client_num, game::mp::cg_s* cg, const char* dvar_id, const char* value) + void cg_set_client_dvar_from_server(const int local_client_num, game::mp::cg_t* cg, const char* dvar_id, const char* value) { if (dvar_id == "cg_fov"s || dvar_id == "com_maxfps"s) { diff --git a/src/client/component/game_console.cpp b/src/client/component/game_console.cpp index 5b8fe91..be9f95c 100644 --- a/src/client/component/game_console.cpp +++ b/src/client/component/game_console.cpp @@ -674,7 +674,7 @@ namespace game_console } } - game::cmd_function_s* cmd = (*game::cmd_functions); + game::cmd_function_t* cmd = (*game::cmd_functions); while (cmd) { if (cmd->name) diff --git a/src/client/component/gameplay.cpp b/src/client/component/gameplay.cpp index db4c8da..73422e3 100644 --- a/src/client/component/gameplay.cpp +++ b/src/client/component/gameplay.cpp @@ -133,7 +133,7 @@ namespace gameplay return jump_height; } - void jump_apply_slowdown_stub(game::mp::playerState_s* ps) + void jump_apply_slowdown_stub(game::mp::playerState_t* ps) { assert(ps->pm_flags & game::PMF_JUMPING); @@ -163,7 +163,7 @@ namespace gameplay } } - float jump_get_slowdown_friction(game::mp::playerState_s* ps) + float jump_get_slowdown_friction(game::mp::playerState_t* ps) { assert(ps->pm_flags & game::PMF_JUMPING); assert(ps->pm_time <= game::JUMP_LAND_SLOWDOWN_TIME); @@ -181,7 +181,7 @@ namespace gameplay return 2.5f; } - float jump_reduce_friction_stub(game::mp::playerState_s* ps) + float jump_reduce_friction_stub(game::mp::playerState_t* ps) { float control; @@ -199,7 +199,7 @@ namespace gameplay return control; } - float jump_get_land_factor(game::mp::playerState_s* ps) + float jump_get_land_factor(game::mp::playerState_t* ps) { assert(ps->pm_flags & game::PMF_JUMPING); assert(ps->pm_time <= game::JUMP_LAND_SLOWDOWN_TIME); @@ -219,9 +219,9 @@ namespace gameplay void jump_start_stub(game::pmove_t* pm, game::pml_t* pml, float height) { - static_assert(offsetof(game::mp::playerState_s, groundEntityNum) == 0x70); - static_assert(offsetof(game::mp::playerState_s, pm_time) == 0x8); - static_assert(offsetof(game::mp::playerState_s, sprintState.sprintButtonUpRequired) == 0x240); + static_assert(offsetof(game::mp::playerState_t, groundEntityNum) == 0x70); + static_assert(offsetof(game::mp::playerState_t, pm_time) == 0x8); + static_assert(offsetof(game::mp::playerState_t, sprintState.sprintButtonUpRequired) == 0x240); static_assert(offsetof(game::pml_t, frametime) == 0x24); static_assert(offsetof(game::pml_t, walking) == 0x2C); static_assert(offsetof(game::pml_t, groundPlane) == 0x30); @@ -229,9 +229,9 @@ namespace gameplay float factor; float velocity_sqrd; - game::mp::playerState_s* ps; + game::mp::playerState_t* ps; - ps = static_cast(pm->ps); + ps = static_cast(pm->ps); assert(ps); @@ -295,7 +295,7 @@ namespace gameplay } } - void pm_weapon_use_ammo_stub(game::playerState_s* ps, game::Weapon weapon, + void pm_weapon_use_ammo_stub(game::playerState_t* ps, game::Weapon weapon, bool is_alternate, int amount, game::PlayerHandIndex hand) { if (!dvars::player_sustainAmmo->current.enabled) @@ -304,10 +304,10 @@ namespace gameplay } } - game::mp::gentity_s* weapon_rocket_launcher_fire_stub(game::mp::gentity_s* ent, game::Weapon weapon, float spread, game::weaponParms* wp, + game::mp::gentity_t* weapon_rocket_launcher_fire_stub(game::mp::gentity_t* ent, game::Weapon weapon, float spread, game::weaponParms* wp, const float* gun_vel, game::mp::missileFireParms* fire_parms, bool magic_bullet) { - auto* result = utils::hook::invoke(0x1403DB8A0, ent, weapon, spread, wp, gun_vel, fire_parms, magic_bullet); + auto* result = utils::hook::invoke(0x1403DB8A0, ent, weapon, spread, wp, gun_vel, fire_parms, magic_bullet); if (ent->client != nullptr && wp->weapDef->inventoryType != game::WEAPINVENTORY_EXCLUSIVE) { diff --git a/src/client/component/network.cpp b/src/client/component/network.cpp index 0222a44..2ccf6a9 100644 --- a/src/client/component/network.cpp +++ b/src/client/component/network.cpp @@ -20,7 +20,7 @@ namespace network return callbacks; } - bool handle_command(game::netadr_s* address, const char* command, game::msg_t* message) + bool handle_command(game::netadr_t* address, const char* command, game::msg_t* message) { const auto cmd_string = utils::string::to_lower(command); auto& callbacks = get_callbacks(); @@ -61,7 +61,7 @@ namespace network a.jmp(0x1402C64EE); } - int net_compare_base_address(const game::netadr_s* a1, const game::netadr_s* a2) + int net_compare_base_address(const game::netadr_t* a1, const game::netadr_t* a2) { if (a1->type == a2->type) { @@ -83,12 +83,12 @@ namespace network return false; } - int net_compare_address(const game::netadr_s* a1, const game::netadr_s* a2) + int net_compare_address(const game::netadr_t* a1, const game::netadr_t* a2) { return net_compare_base_address(a1, a2) && a1->port == a2->port; } - void reconnect_migrated_client(game::mp::client_t*, game::netadr_s* from, const int, const int, const char*, const char*, bool) + void reconnect_migrated_client(game::mp::client_t*, game::netadr_t* from, const int, const int, const char*, const char*, bool) { // This happens when a client tries to rejoin after being recently disconnected, OR by a duplicated guid // We don't want this to do anything. It decides to crash seemingly randomly @@ -107,14 +107,14 @@ namespace network get_callbacks()[utils::string::to_lower(command)] = callback; } - int dw_send_to_stub(const int size, const char* src, game::netadr_s* addr) + int dw_send_to_stub(const int size, const char* src, game::netadr_t* addr) { sockaddr s = {}; game::NetadrToSockadr(addr, &s); return sendto(*game::query_socket, src, size, 0, &s, 16) >= 0; } - void send(const game::netadr_s& address, const std::string& command, const std::string& data, const char separator) + void send(const game::netadr_t& address, const std::string& command, const std::string& data, const char separator) { std::string packet = "\xFF\xFF\xFF\xFF"; packet.append(command); @@ -124,7 +124,7 @@ namespace network send_data(address, packet); } - void send_data(const game::netadr_s& address, const std::string& data) + void send_data(const game::netadr_t& address, const std::string& data) { if (address.type == game::NA_LOOPBACK) { @@ -136,12 +136,12 @@ namespace network } } - bool are_addresses_equal(const game::netadr_s& a, const game::netadr_s& b) + bool are_addresses_equal(const game::netadr_t& a, const game::netadr_t& b) { return net_compare_address(&a, &b); } - const char* net_adr_to_string(const game::netadr_s& a) + const char* net_adr_to_string(const game::netadr_t& a) { if (a.type == game::NA_LOOPBACK) { @@ -286,7 +286,7 @@ namespace network if (!game::environment::is_dedi()) { // we need this on the client for RCon - on("print", [](const game::netadr_s& address, const std::string& message) + on("print", [](const game::netadr_t& address, const std::string& message) { if (address != party::get_target()) { diff --git a/src/client/component/network.hpp b/src/client/component/network.hpp index 4e6ae49..03cc87f 100644 --- a/src/client/component/network.hpp +++ b/src/client/component/network.hpp @@ -2,23 +2,23 @@ namespace network { - using callback = std::function; + using callback = std::function; void on(const std::string& command, const callback& callback); - void send(const game::netadr_s& address, const std::string& command, const std::string& data = {}, char separator = ' '); - void send_data(const game::netadr_s& address, const std::string& data); + void send(const game::netadr_t& address, const std::string& command, const std::string& data = {}, char separator = ' '); + void send_data(const game::netadr_t& address, const std::string& data); - bool are_addresses_equal(const game::netadr_s& a, const game::netadr_s& b); + bool are_addresses_equal(const game::netadr_t& a, const game::netadr_t& b); - const char* net_adr_to_string(const game::netadr_s& a); + const char* net_adr_to_string(const game::netadr_t& a); } -inline bool operator==(const game::netadr_s& a, const game::netadr_s& b) +inline bool operator==(const game::netadr_t& a, const game::netadr_t& b) { return network::are_addresses_equal(a, b); // } -inline bool operator!=(const game::netadr_s& a, const game::netadr_s& b) +inline bool operator!=(const game::netadr_t& a, const game::netadr_t& b) { return !(a == b); // } @@ -26,20 +26,20 @@ inline bool operator!=(const game::netadr_s& a, const game::netadr_s& b) namespace std { template <> - struct equal_to + struct equal_to { using result_type = bool; - bool operator()(const game::netadr_s& lhs, const game::netadr_s& rhs) const + bool operator()(const game::netadr_t& lhs, const game::netadr_t& rhs) const { return network::are_addresses_equal(lhs, rhs); } }; template <> - struct hash + struct hash { - size_t operator()(const game::netadr_s& x) const noexcept + size_t operator()(const game::netadr_t& x) const noexcept { return hash()(*reinterpret_cast(&x.ip[0])) ^ hash()(x.port); } diff --git a/src/client/component/party.cpp b/src/client/component/party.cpp index bc073e6..5266941 100644 --- a/src/client/component/party.cpp +++ b/src/client/component/party.cpp @@ -26,7 +26,7 @@ namespace party { struct { - game::netadr_s host{}; + game::netadr_t host{}; std::string challenge{}; bool hostDefined{false}; } connect_state; @@ -37,7 +37,7 @@ namespace party int sv_maxclients; - void connect_to_party(const game::netadr_s& target, const std::string& mapname, const std::string& gametype) + void connect_to_party(const game::netadr_t& target, const std::string& mapname, const std::string& gametype) { if (game::environment::is_sp()) { @@ -58,7 +58,7 @@ namespace party // CL_ConnectFromParty char session_info[0x100] = {}; - reinterpret_cast(0x1402C5700)( + reinterpret_cast(0x1402C5700)( 0, session_info, &target, mapname.data(), gametype.data()); } @@ -146,7 +146,7 @@ namespace party return count; } - game::netadr_s& get_target() + game::netadr_t& get_target() { return connect_state.host; } @@ -175,7 +175,7 @@ namespace party return -1; } - void connect(const game::netadr_s& target) + void connect(const game::netadr_t& target) { if (game::environment::is_sp()) { @@ -252,7 +252,7 @@ namespace party return; } - game::netadr_s target{}; + game::netadr_t target{}; if (game::NET_StringToAdr(params[1], &target)) { connect(target); @@ -405,7 +405,7 @@ namespace party console::info("%s\n", message.data()); }); - network::on("getInfo", [](const game::netadr_s& target, const std::string& data) + network::on("getInfo", [](const game::netadr_t& target, const std::string& data) { utils::info_string info; info.set("challenge", data); @@ -430,7 +430,7 @@ namespace party return; } - network::on("infoResponse", [](const game::netadr_s& target, const std::string& data) + network::on("infoResponse", [](const game::netadr_t& target, const std::string& data) { const utils::info_string info(data); server_list::handle_info_response(target, info); diff --git a/src/client/component/party.hpp b/src/client/component/party.hpp index fd32ce5..85d1a82 100644 --- a/src/client/component/party.hpp +++ b/src/client/component/party.hpp @@ -7,7 +7,7 @@ namespace party void reset_connect_state(); - void connect(const game::netadr_s& target); + void connect(const game::netadr_t& target); void map_restart(); [[nodiscard]] int server_client_count(); @@ -15,5 +15,5 @@ namespace party [[nodiscard]] int get_client_count(); [[nodiscard]] int get_bot_count(); - [[nodiscard]] game::netadr_s& get_target(); + [[nodiscard]] game::netadr_t& get_target(); } diff --git a/src/client/component/patches.cpp b/src/client/component/patches.cpp index 59afda4..3afc21a 100644 --- a/src/client/component/patches.cpp +++ b/src/client/component/patches.cpp @@ -150,7 +150,7 @@ namespace patches return 0; } - game::Font_s* get_chat_font_handle() + game::Font_t* get_chat_font_handle() { return game::R_RegisterFont("fonts/bigFont"); } @@ -187,7 +187,7 @@ namespace patches } utils::hook::detour cmd_lui_notify_server_hook; - void cmd_lui_notify_server_stub(game::mp::gentity_s* ent) + void cmd_lui_notify_server_stub(game::mp::gentity_t* ent) { command::params_sv params{}; const auto menu_id = atoi(params.get(1)); diff --git a/src/client/component/rcon.cpp b/src/client/component/rcon.cpp index 52dff19..0371a68 100644 --- a/src/client/component/rcon.cpp +++ b/src/client/component/rcon.cpp @@ -14,11 +14,11 @@ namespace rcon namespace { bool is_redirecting_ = false; - game::netadr_s redirect_target_ = {}; + game::netadr_t redirect_target_ = {}; std::string redirect_buffer = {}; std::recursive_mutex redirect_lock; - void setup_redirect(const game::netadr_s& target) + void setup_redirect(const game::netadr_t& target) { std::lock_guard $(redirect_lock); @@ -92,7 +92,7 @@ namespace rcon if (*reinterpret_cast(0x1419E1AE0) >= 5) //clientUIActive.connectionState >= CA_CONNECTED { - const auto target = *reinterpret_cast(0x141CB535C); + const auto target = *reinterpret_cast(0x141CB535C); const auto buffer = password + " " + data; network::send(target, "rcon", buffer); } @@ -170,7 +170,7 @@ namespace rcon } else { - network::on("rcon", [](const game::netadr_s& addr, const std::string& data) + network::on("rcon", [](const game::netadr_t& addr, const std::string& data) { const auto pos = data.find_first_of(" "); if (pos == std::string::npos) diff --git a/src/client/component/server_list.cpp b/src/client/component/server_list.cpp index b8abc61..34ea29f 100644 --- a/src/client/component/server_list.cpp +++ b/src/client/component/server_list.cpp @@ -33,14 +33,14 @@ namespace server_list std::string map_name; std::string game_type; char in_game; - game::netadr_s address; + game::netadr_t address; }; struct { - game::netadr_s address{}; + game::netadr_t address{}; volatile bool requesting = false; - std::unordered_map queued_servers{}; + std::unordered_map queued_servers{}; } master_state; volatile bool update_server_list = false; @@ -307,12 +307,12 @@ namespace server_list } } - bool get_master_server(game::netadr_s& address) + bool get_master_server(game::netadr_t& address) { return game::NET_StringToAdr("server.alterware.dev:20810", &address); } - void handle_info_response(const game::netadr_s& address, const utils::info_string& info) + void handle_info_response(const game::netadr_t& address, const utils::info_string& info) { int start_time{}; const auto now = game::Sys_Milliseconds(); @@ -436,7 +436,7 @@ namespace server_list scheduler::loop(do_frame_work, scheduler::pipeline::main); - network::on("getServersResponse", [](const game::netadr_s& target, const std::string& data) + network::on("getServersResponse", [](const game::netadr_t& target, const std::string& data) { { std::lock_guard _(mutex); @@ -469,7 +469,7 @@ namespace server_list break; } - game::netadr_s address{}; + game::netadr_t address{}; address.type = game::NA_IP; address.localNetID = game::NS_CLIENT1; std::memcpy(&address.ip[0], data.data() + i + 0, 4); diff --git a/src/client/component/server_list.hpp b/src/client/component/server_list.hpp index 09f62b2..76e260a 100644 --- a/src/client/component/server_list.hpp +++ b/src/client/component/server_list.hpp @@ -3,8 +3,8 @@ namespace server_list { - bool get_master_server(game::netadr_s& address); - void handle_info_response(const game::netadr_s& address, const utils::info_string& info); + bool get_master_server(game::netadr_t& address); + void handle_info_response(const game::netadr_t& address, const utils::info_string& info); bool sl_key_event(int key, int down); } diff --git a/src/client/game/structs.hpp b/src/client/game/structs.hpp index 87e6847..d097247 100644 --- a/src/client/game/structs.hpp +++ b/src/client/game/structs.hpp @@ -181,7 +181,7 @@ namespace game static_assert(sizeof(db_internal_state) == 0x20); - struct db_z_stream_s + struct db_z_stream_t { unsigned char* next_in; unsigned int avail_in; @@ -216,7 +216,7 @@ namespace game unsigned char* start_in; _OVERLAPPED overlapped; unsigned int readError; - db_z_stream_s stream; + db_z_stream_t stream; int readingResident; }; @@ -1064,7 +1064,7 @@ namespace game float t1; }; - struct Font_s + struct Font_t { const char* fontName; int pixelHeight; @@ -1182,9 +1182,9 @@ namespace game const char** argv[8]; }; - struct cmd_function_s + struct cmd_function_t { - cmd_function_s* next; + cmd_function_t* next; const char* name; void (__cdecl* function)(); }; @@ -1235,7 +1235,7 @@ namespace game WEAPON_HAND_DEFAULT = 0x0, }; - struct usercmd_s + struct usercmd_t { int serverTime; unsigned int buttons; @@ -1311,7 +1311,7 @@ namespace game bool hybridScope; }; - struct compressedAnimData_s + struct compressedAnimData_t { int flags; int animRate; @@ -1330,7 +1330,7 @@ namespace game int flags; int startTime; float startPosition[3]; - compressedAnimData_s compressedAnimData; + compressedAnimData_t compressedAnimData; }; struct SlideState @@ -1339,7 +1339,7 @@ namespace game int noFricTime; }; - struct SprintState_s + struct SprintState_t { int sprintButtonUpRequired; int sprintDelay; @@ -1398,7 +1398,7 @@ namespace game NS_INVALID_NETSRC = 0x4, }; - struct netadr_s + struct netadr_t { netadrtype_t type; unsigned char ip[4]; @@ -1463,7 +1463,7 @@ namespace game unsigned int rgba; }; - struct hudelem_s + struct hudelem_t { he_type_t type; float x; @@ -1509,9 +1509,9 @@ namespace game int flags; }; - struct game_hudelem_s + struct game_hudelem_t { - hudelem_s elem; + hudelem_t elem; int clientNum; int team; int archived; @@ -1939,7 +1939,7 @@ namespace game FxWorld *fxWorld; GfxWorld *gfxWorld; GfxLightDef *lightDef;*/ - Font_s* font; + Font_t* font; /*MenuList *menuList; menuDef_t *menu; AnimationClass *animClass; @@ -2018,21 +2018,21 @@ namespace game namespace sp { // very shit structures for the moment cuz i cba mapping the whole thing out right now... - struct gclient_s + struct gclient_t { char __0x00[0xB6DC]; int flags; }; - struct gentity_s + struct gentity_t { char __0x00[0x110]; - gclient_s* client; + gclient_t* client; char __0x118[0x4C]; int flags; }; - struct playerState_s + struct playerState_t { }; @@ -2049,7 +2049,7 @@ namespace game namespace mp { #pragma pack(push, 4) - struct playerState_s + struct playerState_t { int commandTime; int pm_type; @@ -2101,7 +2101,7 @@ namespace game vec3_t viewangles; char _0x190[0xAC]; int locationSelectionInfo; - SprintState_s sprintState; + SprintState_t sprintState; float holdBreathScale; int holdBreathTimer; float moveSpeedScaleMultiplier; @@ -2179,7 +2179,7 @@ namespace game TEAM_NUM_TEAMS = 0x4, }; - struct clientState_s + struct clientState_t { int clientIndex; team_t team; @@ -2203,21 +2203,21 @@ namespace game int killCamEntity; int isInKillcam; char __0x332C[0x14]; - usercmd_s cmd; - usercmd_s oldcmd; + usercmd_t cmd; + usercmd_t oldcmd; int localClient; char __0x33C4[0x24]; float moveSpeedScaleMultiplier; int viewmodelIndex; int noSpectate; - clientState_s cs; + clientState_t cs; ScoreInfo scores; char __pad[0x1B0]; }; - struct gclient_s + struct gclient_t { - playerState_s ps; + playerState_t ps; clientSession_t sess; int flags; int spectatorClient; @@ -2266,11 +2266,11 @@ namespace game char _0x14C[0xC]; }; - struct gentity_s + struct gentity_t { EntityState s; EntityShared r; - gclient_s* client; + gclient_t* client; char _0x170[0x50]; int flags; char _0x1C4[0x18]; @@ -2279,7 +2279,7 @@ namespace game char _0x1E4[0x10C]; }; - struct snapshot_s + struct snapshot_t { char _0x0[0x3C78]; int ping; @@ -2288,12 +2288,12 @@ namespace game int numClients; }; - struct cg_s + struct cg_t { - playerState_s ps; + playerState_t ps; char _0x3324[0x64]; - snapshot_s* snap; - snapshot_s* nextSnap; // theres alot after this cba rn + snapshot_t* snap; + snapshot_t* nextSnap; // theres alot after this cba rn }; struct netProfilePacket_t @@ -2328,7 +2328,7 @@ namespace game netsrc_t sock; int dropped; int incomingSequence; - netadr_s remoteAddress; + netadr_t remoteAddress; int fragmentSequence; int fragmentLength; char* fragmentBuffer; @@ -2378,7 +2378,7 @@ namespace game int reliableSent; int messageAcknowledge; char _0xC30[0x41238]; - gentity_s* gentity; + gentity_t* gentity; char name[16]; int lastPacketTime; int lastConnectTime; @@ -2411,7 +2411,7 @@ namespace game struct missileFireParms { - gentity_s* target; + gentity_t* target; float targetPosOrOffset[3]; float autoDetonateTime; bool lockon; @@ -2423,10 +2423,10 @@ namespace game static_assert(sizeof(mp::client_t) == 0x83570); - union playerState_s + union playerState_t { - sp::playerState_s* sp; - mp::playerState_s* mp; + sp::playerState_t* sp; + mp::playerState_t* mp; }; enum GfxDrawSceneMethod @@ -2457,7 +2457,7 @@ namespace game TECHNIQUE_NONE = 0x137, }; - struct GfxDrawMethod_s + struct GfxDrawMethod_t { int drawScene; int baseTechType; @@ -2509,8 +2509,8 @@ namespace game struct pmove_t { void* ps; - usercmd_s cmd; - usercmd_s oldcmd; + usercmd_t cmd; + usercmd_t oldcmd; int tracemask; int numtouch; int touchents[32]; diff --git a/src/client/game/symbols.hpp b/src/client/game/symbols.hpp index 69b3007..770cb0b 100644 --- a/src/client/game/symbols.hpp +++ b/src/client/game/symbols.hpp @@ -39,9 +39,9 @@ namespace game WEAK symbol CL_IsCgameInitialized{0x140234DA0, 0x1402B9A70}; WEAK symbol CG_GameMessage{0x1401F2E20, 0x140271320}; - WEAK symbol CG_SetClientDvarFromServer{0x0, 0x14028A2C0}; + WEAK symbol CG_SetClientDvarFromServer{0x0, 0x14028A2C0}; - WEAK symbol Cmd_AddCommandInternal{0x1403B3570, 0x1403F7070}; + WEAK symbol Cmd_AddCommandInternal{0x1403B3570, 0x1403F7070}; WEAK symbol Cmd_ExecuteSingleCommand{0x1403B3B10, 0x1403F7680}; WEAK symbol DB_EnumXAssets_FastFile{0x140271F50, 0x14031EF90}; @@ -94,17 +94,17 @@ namespace game WEAK symbol FS_AddLocalizedGameDirectory{0x14041A2F0, 0x1404DC760}; WEAK symbol G_FindItem{0x140462490, 0x14021B7E0}; - WEAK symbol G_GivePlayerWeapon{0x140359E20, 0x1403DA5E0}; + WEAK symbol G_GivePlayerWeapon{0x140359E20, 0x1403DA5E0}; WEAK symbol G_GetWeaponForName{0x140359890, 0x1403DA060}; WEAK symbol G_Glass_Update{0x14030E680, 0x140397450}; - WEAK symbol G_InitializeAmmo{0x140311F00, 0x14039AEA0}; + WEAK symbol G_InitializeAmmo{0x140311F00, 0x14039AEA0}; WEAK symbol G_SelectWeapon{0x14035A200, 0x1403DA880}; - WEAK symbol G_TakePlayerWeapon{0x14035A350, 0x1403DA9C0}; + WEAK symbol G_TakePlayerWeapon{0x14035A350, 0x1403DA9C0}; WEAK symbol G_FindConfigstringIndex{0x0, 0x140161F90}; WEAK symbol G_RunFrame{0x0, 0x1403A05E0}; - WEAK symbol HudElem_Alloc{0x0, 0x1403997E0}; + WEAK symbol HudElem_Alloc{0x0, 0x1403997E0}; WEAK symbol I_CleanStr{0x140432460, 0x1404F63C0}; @@ -144,18 +144,18 @@ namespace game WEAK symbol Material_RegisterHandle{0x140523D90, 0x1405F0E20}; - WEAK symbol NET_OutOfBandPrint{0, 0x14041D5C0}; - WEAK symbol NET_SendLoopPacket{0, 0x14041D780}; - WEAK symbol NET_StringToAdr{0, 0x14041D870}; - WEAK symbol NetadrToSockadr{0, 0x1404E53D0}; + WEAK symbol NET_OutOfBandPrint{0, 0x14041D5C0}; + WEAK symbol NET_SendLoopPacket{0, 0x14041D780}; + WEAK symbol NET_StringToAdr{0, 0x14041D870}; + WEAK symbol NetadrToSockadr{0, 0x1404E53D0}; WEAK symbol R_AddCmdDrawStretchPic{0x140234460, 0x140600BE0}; - WEAK symbol R_AddCmdDrawText{0x140533E40, 0x140601070}; - WEAK symbol R_AddCmdDrawTextWithCursor{0x140534170, 0x1406013A0}; - WEAK symbol R_RegisterFont{0x1405130B0, 0x1405DFAC0}; + WEAK symbol R_AddCmdDrawText{0x140533E40, 0x140601070}; + WEAK symbol R_AddCmdDrawTextWithCursor{0x140534170, 0x1406013A0}; + WEAK symbol R_RegisterFont{0x1405130B0, 0x1405DFAC0}; WEAK symbol R_SyncRenderThread{0x140535AF0, 0x140602D30}; - WEAK symbol R_TextWidth{0x140513390, 0x1405DFDB0}; + WEAK symbol R_TextWidth{0x140513390, 0x1405DFDB0}; WEAK symbol ScrPlace_GetViewPlacement{0x14024D150, 0x1402F6D40}; @@ -203,20 +203,20 @@ namespace game WEAK symbol SV_Cmd_EndTokenizedString{0, 0x1403F8110}; WEAK symbol SV_MatchEnd{0x0, 0x14047A090}; - WEAK symbol SV_DirectConnect{0, 0x140471390}; + WEAK symbol SV_DirectConnect{0, 0x140471390}; WEAK symbol SV_GameSendServerCommand{0x140490F40, 0x1404758C0}; WEAK symbol SV_Loaded{0x140491820, 0x1404770C0}; WEAK symbol SV_StartMap{0, 0x140470170}; WEAK symbol SV_StartMapForParty{0, 0x1404702F0}; - WEAK symbol SV_AddBot{0, 0x140470920}; + WEAK symbol SV_AddBot{0, 0x140470920}; WEAK symbol SV_BotIsBot{0, 0x140461340}; WEAK symbol SV_BotGetRandomName{0, 0x140460B80}; - WEAK symbol SV_SpawnTestClient{0, 0x1404740A0}; + WEAK symbol SV_SpawnTestClient{0, 0x1404740A0}; WEAK symbol SV_ExecuteClientCommand{0, 0x140472430}; WEAK symbol SV_FastRestart{0x14048B890, 0x14046F440}; - WEAK symbol SV_GetPlayerstateForClientNum{0x140490F80, 0x140475A10}; + WEAK symbol SV_GetPlayerstateForClientNum{0x140490F80, 0x140475A10}; WEAK symbol SV_GetGuid{0, 0x140475990}; WEAK symbol SV_KickClientNum{0, 0x14046F730}; WEAK symbol SV_SetConfigstring{0, 0x140477450}; @@ -225,7 +225,7 @@ namespace game WEAK symbol Sys_IsDatabaseReady2{0x1403C2D40, 0x140423920}; WEAK symbol Sys_Milliseconds{0x14043D2A0, 0x140501CA0}; WEAK symbol Sys_ShowConsole{0x14043E650, 0x140503130}; - WEAK symbol Sys_SendPacket{0x14043D000, 0x140501A00}; + WEAK symbol Sys_SendPacket{0x14043D000, 0x140501A00}; WEAK symbol Sys_GetValue{0x1403C2C30, 0x1404237D0}; WEAK symbol Sys_IsMainThread{0x1478FC470, 0x140423950}; WEAK symbol Sys_CreateFile{0x140434B10, 0x1404F8FD0}; @@ -257,7 +257,7 @@ namespace game WEAK symbol cmd_args{0x144CE7F70, 0x144518480}; WEAK symbol sv_cmd_args{0x144CE8020, 0x144518530}; - WEAK symbol cmd_functions{0x144CE80C8, 0x1445185D8}; + WEAK symbol cmd_functions{0x144CE80C8, 0x1445185D8}; WEAK symbol dvarCount{0x1458CBA3C, 0x1478EADF4}; WEAK symbol sortedDvars{0x1458CBA60, 0x1478EAE10}; @@ -300,20 +300,20 @@ namespace game WEAK symbol threadIds{0x144DE6640, 0x1446B4960}; - WEAK symbol gfxDrawMethod{0x145F525A8, 0x1480350D8}; + WEAK symbol gfxDrawMethod{0x145F525A8, 0x1480350D8}; namespace sp { - WEAK symbol g_entities{0x143C91600, 0}; + WEAK symbol g_entities{0x143C91600, 0}; WEAK symbol g_zones_0{0x1434892D8, 0}; } namespace mp { - WEAK symbol cgArray{0, 0x14176EC00}; + WEAK symbol cgArray{0, 0x14176EC00}; - WEAK symbol g_entities{0, 0x14427A0E0}; + WEAK symbol g_entities{0, 0x14427A0E0}; WEAK symbol svs_clientCount{0, 0x14647B28C}; WEAK symbol svs_clients{0, 0x14647B290}; -- 2.34.1 From 27d1f617890f1a158b7b186754a2f8ffe8da337b Mon Sep 17 00:00:00 2001 From: Caball Date: Mon, 30 Dec 2024 23:13:16 +0100 Subject: [PATCH 02/11] Added hook and fn stub to clean color from agent overhead name. --- src/client/component/colors.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/client/component/colors.cpp b/src/client/component/colors.cpp index 7912ce5..d84818f 100644 --- a/src/client/component/colors.cpp +++ b/src/client/component/colors.cpp @@ -98,6 +98,16 @@ namespace colors return result; } + int clean_agent_name_stub(char* out, int max_size, const char* fmt, const char* in) + { + // format agent overhead name like [%s] + const auto length = sprintf_s(out, max_size, fmt, in); + + utils::string::strip(in, out, std::min(static_cast(length), static_cast(max_size))); + + return length; + } + void rb_lookup_color_stub(const char index, DWORD* color) { *color = RGB(255, 255, 255); @@ -143,6 +153,9 @@ namespace colors // don't apply colors to overhead names utils::hook::call(0x14025CE79, get_client_name_stub); + // don't apply colors to overhead names of agents (like dogs or juggernauts) + utils::hook::call(0x1402CF760, clean_agent_name_stub); + // patch I_CleanStr utils::hook::jump(0x1404F63C0, i_clean_str_stub); } -- 2.34.1 From adc33983a8d6a9d889bf8d1982d8580f66938f37 Mon Sep 17 00:00:00 2001 From: Caball Date: Mon, 30 Dec 2024 23:15:46 +0100 Subject: [PATCH 03/11] Improved naming for function 'get_client_name_stub'. --- src/client/component/colors.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/client/component/colors.cpp b/src/client/component/colors.cpp index d84818f..007d141 100644 --- a/src/client/component/colors.cpp +++ b/src/client/component/colors.cpp @@ -86,14 +86,14 @@ namespace colors return string; } - size_t get_client_name_stub(const int local_client_num, const int index, char* buf, const int size, - const size_t unk, const size_t unk2) + size_t get_client_name_stub(const int local_client_num, const int index, char* name_buf, + const int max_name_size, char* clan_buf, const int max_clan_size) { - // CL_GetClientName (CL_GetClientNameAndClantag?) - const auto result = reinterpret_cast(0x1402CF790)( - local_client_num, index, buf, size, unk, unk2); + // CL_GetClientNameAndClanTag (wrapper for CL_GetClientNameAndClanTagColorize) + const auto result = reinterpret_cast(0x1402CF790)( + local_client_num, index, name_buf, max_name_size, clan_buf, max_clan_size); - utils::string::strip(buf, buf, size); + utils::string::strip(name_buf, name_buf, static_cast(max_name_size)); return result; } -- 2.34.1 From e5a547650c5c2b5dba7976169eef6a3eb44f0ea9 Mon Sep 17 00:00:00 2001 From: Caball Date: Mon, 30 Dec 2024 23:21:50 +0100 Subject: [PATCH 04/11] Added helper function to strip colors from strings. --- src/common/utils/string.cpp | 26 ++++++++++++++++++++++++++ src/common/utils/string.hpp | 2 ++ 2 files changed, 28 insertions(+) diff --git a/src/common/utils/string.cpp b/src/common/utils/string.cpp index 6236584..2e0bbad 100644 --- a/src/common/utils/string.cpp +++ b/src/common/utils/string.cpp @@ -140,6 +140,32 @@ namespace utils::string *out = '\0'; } + std::string strip(std::string_view sv, bool strip_default_color) + { + std::string in(sv); + + for (std::size_t i = 0; i + 1 < in.size();) + { + if (in[i] == '^' && static_cast(in[i + 1] - '0') < 0xC) + { + if (in[i + 1] != '7' || strip_default_color) + { + in.erase(in.begin() + i, in.begin() + i + 2); + } + else + { + i += 2; + } + } + else + { + i += 1; + } + } + + return in; + } + std::string convert(const std::wstring& wstr) { std::string result; diff --git a/src/common/utils/string.hpp b/src/common/utils/string.hpp index 6a50c3e..285bc77 100644 --- a/src/common/utils/string.hpp +++ b/src/common/utils/string.hpp @@ -1,6 +1,7 @@ #pragma once #include "memory.hpp" #include +#include template constexpr auto ARRAY_COUNT(Type(&)[n]) { return n; } @@ -91,6 +92,7 @@ namespace utils::string std::string get_clipboard_data(); void strip(const char* in, char* out, size_t max); + std::string strip(std::string_view sv, bool strip_default_color = false); std::string convert(const std::wstring& wstr); std::wstring convert(const std::string& str); -- 2.34.1 From 50aa4097bb34c245241fdbee5b69b9f641c43945 Mon Sep 17 00:00:00 2001 From: Caball Date: Mon, 30 Dec 2024 23:22:34 +0100 Subject: [PATCH 05/11] Fixed two bugs in the old color strip function. --- src/common/utils/string.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/utils/string.cpp b/src/common/utils/string.cpp index 2e0bbad..496cad3 100644 --- a/src/common/utils/string.cpp +++ b/src/common/utils/string.cpp @@ -115,13 +115,13 @@ namespace utils::string void strip(const char* in, char* out, size_t max) { - if (!in || !out) return; + if (!in || !out || !max) return; max--; auto current = 0u; while (*in != 0 && current < max) { - const auto color_index = (*(in + 1) - 48) >= 0xC ? 7 : (*(in + 1) - 48); + const auto color_index = (static_cast(*(in + 1) - 48)) >= 0xC ? 7 : (*(in + 1) - 48); if (*in == '^' && (color_index != 7 || *(in + 1) == '7')) { -- 2.34.1 From 51e831cbfec54299ca80b6eb6b3bea8edd1e74be Mon Sep 17 00:00:00 2001 From: Caball Date: Mon, 30 Dec 2024 23:26:29 +0100 Subject: [PATCH 06/11] Added helper util functions for (de)compression. --- src/common/utils/compression.cpp | 80 ++++++++++++++++++++++++++++++++ src/common/utils/compression.hpp | 5 ++ 2 files changed, 85 insertions(+) diff --git a/src/common/utils/compression.cpp b/src/common/utils/compression.cpp index 1688cee..9c50a4a 100644 --- a/src/common/utils/compression.cpp +++ b/src/common/utils/compression.cpp @@ -109,6 +109,86 @@ namespace utils::compression result.resize(length); return result; } + + std::vector decompress(std::span input, std::size_t exp_output_size, double growth_rate) + { + auto decompress_internal = [](std::uint8_t* output, uLong* output_size, const std::uint8_t* input, uLong* input_size) + { + return uncompress2( + reinterpret_cast(output), output_size, + reinterpret_cast(input), input_size + ); + }; + + auto output_size = static_cast(std::max(exp_output_size, std::size_t(256))); + std::vector output(output_size); + + auto input_size = static_cast(input.size()); + auto status = decompress_internal(output.data(), &output_size, input.data(), &input_size); + + if (status == Z_BUF_ERROR) + { + const auto decompression_ratio = (input_size / static_cast(output.size())) - 0.04; + output_size = static_cast(std::max(input.size() / decompression_ratio, static_cast(output_size))); + output.resize(output_size); + + input_size = static_cast(input.size()); + status = decompress_internal(output.data(), &output_size, input.data(), &input_size); + } + + for (growth_rate = std::max(growth_rate, 1.0); status == Z_BUF_ERROR;) + { + output_size = 4 + static_cast(growth_rate * output.size()); + output.resize(output_size); + + input_size = static_cast(input.size()); + status = decompress_internal(output.data(), &output_size, input.data(), &input_size); + } + + if (status != Z_OK) + { + output.clear(); + return output; + } + + output.resize(output_size); + return output; + } + + std::vector compress(std::span input, std::size_t exp_output_size, double growth_rate) + { + auto compress_internal = [](std::uint8_t* output, uLong* output_size, const std::uint8_t* input, uLong input_size) + { + return compress2( + reinterpret_cast(output), output_size, + reinterpret_cast(input), input_size, + Z_BEST_COMPRESSION + ); + }; + + auto output_size = static_cast(std::max(exp_output_size, std::size_t(256))); + std::vector output(output_size); + + const auto input_size = static_cast(input.size()); + auto status = compress_internal(output.data(), &output_size, input.data(), input_size); + + for (growth_rate = std::max(growth_rate, 1.0); status == Z_BUF_ERROR;) + { + output_size = 4 + static_cast(growth_rate * output.size()); + output.resize(output_size); + + status = compress_internal(output.data(), &output_size, input.data(), input_size); + } + + if (status != Z_OK) + { + output.clear(); + return output; + } + + output.resize(output_size); + return output; + } } namespace zip diff --git a/src/common/utils/compression.hpp b/src/common/utils/compression.hpp index dfe36ad..d1a2a37 100644 --- a/src/common/utils/compression.hpp +++ b/src/common/utils/compression.hpp @@ -1,7 +1,9 @@ #pragma once +#include #include #include +#include #define CHUNK 16384u @@ -11,6 +13,9 @@ namespace utils::compression { std::string compress(const std::string& data); std::string decompress(const std::string& data); + + std::vector compress(std::span input, std::size_t exp_output_size, double growth_rate = 2.0); + std::vector decompress(std::span input, std::size_t exp_output_size, double growth_rate = 2.0); } namespace zip -- 2.34.1 From 1db89c64c666805d8332046c0b0d6961531b537a Mon Sep 17 00:00:00 2001 From: Caball Date: Mon, 30 Dec 2024 23:28:21 +0100 Subject: [PATCH 07/11] Added functions to parse the command line arguments. --- src/common/utils/command_line.cpp | 35 +++++++++++++++++++++++++++++++ src/common/utils/command_line.hpp | 9 ++++++++ 2 files changed, 44 insertions(+) create mode 100644 src/common/utils/command_line.cpp create mode 100644 src/common/utils/command_line.hpp diff --git a/src/common/utils/command_line.cpp b/src/common/utils/command_line.cpp new file mode 100644 index 0000000..c07d513 --- /dev/null +++ b/src/common/utils/command_line.cpp @@ -0,0 +1,35 @@ +#include "command_line.hpp" +#include "nt.hpp" + +#include +#include + +namespace utils::command_line +{ + template + constexpr std::unique_ptr make_unique_ptr(type* ptr, deleter&& del) + { + return std::unique_ptr(ptr, std::forward(del)); + } + + const std::vector& get_args() + { + static const auto args = []() + { + auto argc = 0; + const auto cmd_line = winrt::check_pointer(::GetCommandLineW()); + const auto up = make_unique_ptr(winrt::check_pointer(::CommandLineToArgvW(cmd_line, &argc)), ::LocalFree); + const auto argv = up.get(); + + std::vector vec(argc); + std::transform(argv, argv + argc, vec.begin(), [](const auto* path) + { + return std::filesystem::path(path); + }); + + return vec; + }(); + + return args; + } +} diff --git a/src/common/utils/command_line.hpp b/src/common/utils/command_line.hpp new file mode 100644 index 0000000..b1b13b0 --- /dev/null +++ b/src/common/utils/command_line.hpp @@ -0,0 +1,9 @@ +#pragma once + +#include +#include + +namespace utils::command_line +{ + [[nodiscard]] const std::vector& get_args(); +} \ No newline at end of file -- 2.34.1 From 2516a48fc18ba2c6e69a113e2f057b7bab192f7d Mon Sep 17 00:00:00 2001 From: Caball Date: Mon, 30 Dec 2024 23:35:17 +0100 Subject: [PATCH 08/11] Added fallback logic for current path / working directory. --- src/client/main.cpp | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/client/main.cpp b/src/client/main.cpp index e50f1cc..0581a00 100644 --- a/src/client/main.cpp +++ b/src/client/main.cpp @@ -4,6 +4,7 @@ #include "loader/component_loader.hpp" #include "game/game.hpp" +#include "utils/command_line.hpp" #include #include #include @@ -167,8 +168,23 @@ FARPROC load_binary(const launcher::mode mode) std::string data; if (!utils::io::read_file(binary, &data)) { - throw std::runtime_error( - "Failed to read game binary! Please select the correct path in the launcher settings."); + // Check the first argument to see if the current directory needs to changed + // Required when the game is used to open a file (like a demo file) + const auto& args = utils::command_line::get_args(); + if (!args.empty()) + { + const auto& binary_dir = args.front(); + if (binary_dir.filename().string().ends_with("iw6-mod.exe")) + { + std::filesystem::current_path(binary_dir.parent_path()); + } + } + + if (!utils::io::read_file(binary, &data)) + { + throw std::runtime_error( + "Failed to read game binary! Please select the correct path in the launcher settings."); + } } #ifdef INJECT_HOST_AS_LIB -- 2.34.1 From 3553cd49ff2c5bfd79fdc275e68e89b4bb804867 Mon Sep 17 00:00:00 2001 From: Caball Date: Tue, 31 Dec 2024 00:01:31 +0100 Subject: [PATCH 09/11] Updated game structs, variable symbols and references. --- src/client/component/bots.cpp | 8 +- src/client/component/dedicated_info.cpp | 2 +- src/client/component/discord.cpp | 6 +- src/client/component/game_console.cpp | 2 +- src/client/component/notifies.cpp | 2 +- src/client/component/party.cpp | 20 +- src/client/component/patches.cpp | 2 +- src/client/component/rcon.cpp | 2 +- src/client/component/slowmotion.cpp | 4 +- src/client/game/structs.hpp | 459 ++++++++++++++++++++++-- src/client/game/symbols.hpp | 19 +- 11 files changed, 468 insertions(+), 58 deletions(-) diff --git a/src/client/component/bots.cpp b/src/client/component/bots.cpp index dd4f2ec..7183809 100644 --- a/src/client/component/bots.cpp +++ b/src/client/component/bots.cpp @@ -21,7 +21,7 @@ namespace bots bool can_add() { - return party::get_client_count() < *game::mp::svs_clientCount; + return party::get_client_count() < game::mp::svs->clientCount; } void bot_team_join(const int entity_num) @@ -29,14 +29,14 @@ namespace bots // schedule the select team call scheduler::once([entity_num]() { - game::SV_ExecuteClientCommand(&game::mp::svs_clients[entity_num], + game::SV_ExecuteClientCommand(&game::mp::svs->clients[entity_num], utils::string::va("lui 68 2 %i", *game::mp::sv_serverId_value), false); // scheduler the select class call scheduler::once([entity_num]() { - game::SV_ExecuteClientCommand(&game::mp::svs_clients[entity_num], + game::SV_ExecuteClientCommand(&game::mp::svs->clients[entity_num], utils::string::va("lui 5 %i %i", (rand() % 5) + 10, *game::mp::sv_serverId_value), false); }, scheduler::pipeline::server, 1s); @@ -175,7 +175,7 @@ namespace bots num_bots = std::strtoul(params.get(1), nullptr, 10); } - num_bots = std::min(num_bots, static_cast(*game::mp::svs_clientCount)); + num_bots = std::min(num_bots, static_cast(game::mp::svs->clientCount)); console::info("Spawning %zu %s\n", num_bots, (num_bots == 1 ? "bot" : "bots")); diff --git a/src/client/component/dedicated_info.cpp b/src/client/component/dedicated_info.cpp index 9f0de69..de3f8aa 100644 --- a/src/client/component/dedicated_info.cpp +++ b/src/client/component/dedicated_info.cpp @@ -41,7 +41,7 @@ namespace dedicated_info for (auto i = 0; i < sv_maxclients->current.integer; i++) { - auto* client = &game::mp::svs_clients[i]; + auto* client = &game::mp::svs->clients[i]; auto* self = &game::mp::g_entities[i]; if (client->header.state > game::CS_FREE && self && self->client) diff --git a/src/client/component/discord.cpp b/src/client/component/discord.cpp index 32bd91f..1a9cfc4 100644 --- a/src/client/component/discord.cpp +++ b/src/client/component/discord.cpp @@ -54,8 +54,8 @@ namespace discord discord_presence.details = utils::string::va("%s on %s", gametype, map); - discord_presence.partySize = game::mp::cgArray->snap != nullptr - ? game::mp::cgArray->snap->numClients + discord_presence.partySize = game::mp::cg->snap != nullptr + ? game::mp::cg->snap->numClients : 1; if (game::Dvar_GetBool("xblive_privatematch")) @@ -65,7 +65,7 @@ namespace discord } else { - auto* host_name = reinterpret_cast(0x14187EBC4); + auto* host_name = game::mp::cgs->szHostName; utils::string::strip(host_name, host_name, std::strlen(host_name) + 1); discord_presence.state = host_name; diff --git a/src/client/component/game_console.cpp b/src/client/component/game_console.cpp index be9f95c..550ed9d 100644 --- a/src/client/component/game_console.cpp +++ b/src/client/component/game_console.cpp @@ -505,7 +505,7 @@ namespace game_console { if (key == game::keyNum_t::K_F10) { - if(game::mp::svs_clients[localClientNum].header.state > game::CS_FREE) + if(game::mp::svs->clients[localClientNum].header.state > game::CS_FREE) { return false; } diff --git a/src/client/component/notifies.cpp b/src/client/component/notifies.cpp index 72f35ff..5d018f7 100644 --- a/src/client/component/notifies.cpp +++ b/src/client/component/notifies.cpp @@ -61,7 +61,7 @@ namespace notifies scheduler::once([params, message, client_num] { const auto* guid = game::SV_GetGuid(client_num); - const auto* name = game::mp::svs_clients[client_num].name; + const auto* name = game::mp::svs->clients[client_num].name; game_log::g_log_printf("%s;%s;%i;%s;%s\n", params.get(0), diff --git a/src/client/component/party.cpp b/src/client/component/party.cpp index 5266941..5316622 100644 --- a/src/client/component/party.cpp +++ b/src/client/component/party.cpp @@ -120,9 +120,9 @@ namespace party int get_client_count() { auto count = 0; - for (auto i = 0; i < *game::mp::svs_clientCount; ++i) + for (auto i = 0; i < game::mp::svs->clientCount; ++i) { - if (game::mp::svs_clients[i].header.state >= game::CS_CONNECTED) + if (game::mp::svs->clients[i].header.state >= game::CS_CONNECTED) { ++count; } @@ -134,10 +134,10 @@ namespace party int get_bot_count() { auto count = 0; - for (auto i = 0; i < *game::mp::svs_clientCount; ++i) + for (auto i = 0; i < game::mp::svs->clientCount; ++i) { - if (game::mp::svs_clients[i].header.state >= game::CS_CONNECTED && - game::mp::svs_clients[i].testClient != game::TC_NONE) + if (game::mp::svs->clients[i].header.state >= game::CS_CONNECTED && + game::mp::svs->clients[i].testClient != game::TC_NONE) { ++count; } @@ -158,7 +158,7 @@ namespace party int get_client_num_from_name(const std::string& name) { - for (auto i = 0; !name.empty() && i < *game::mp::svs_clientCount; ++i) + for (auto i = 0; !name.empty() && i < game::mp::svs->clientCount; ++i) { if (game::mp::g_entities[i].client) { @@ -283,7 +283,7 @@ namespace party } const auto client_num = atoi(params.get(1)); - if (client_num < 0 || client_num >= *game::mp::svs_clientCount) + if (client_num < 0 || client_num >= game::mp::svs->clientCount) { return; } @@ -320,7 +320,7 @@ namespace party const std::string name = params.get(1); if (name == "all"s) { - for (auto i = 0; i < *game::mp::svs_clientCount; ++i) + for (auto i = 0; i < game::mp::svs->clientCount; ++i) { scheduler::once([i, reason] { @@ -331,7 +331,7 @@ namespace party } const auto client_num = get_client_num_from_name(name); - if (client_num < 0 || client_num >= *game::mp::svs_clientCount) + if (client_num < 0 || client_num >= game::mp::svs->clientCount) { return; } @@ -418,7 +418,7 @@ namespace party info.set("isPrivate", dvars::get_string("g_password").empty() ? "0" : "1"); info.set("clients", std::to_string(get_client_count())); info.set("bots", std::to_string(get_bot_count())); - info.set("sv_maxclients", std::to_string(*game::mp::svs_clientCount)); + info.set("sv_maxclients", std::to_string(game::mp::svs->clientCount)); info.set("protocol", std::to_string(PROTOCOL)); info.set("shortversion", SHORTVERSION); diff --git a/src/client/component/patches.cpp b/src/client/component/patches.cpp index 3afc21a..a1c7ced 100644 --- a/src/client/component/patches.cpp +++ b/src/client/component/patches.cpp @@ -191,7 +191,7 @@ namespace patches { command::params_sv params{}; const auto menu_id = atoi(params.get(1)); - const auto client = &game::mp::svs_clients[ent->s.clientNum]; + const auto client = &game::mp::svs->clients[ent->s.clientNum]; // 9 => "end_game" if (menu_id == 9 && client->header.netchan.remoteAddress.type != game::NA_LOOPBACK) diff --git a/src/client/component/rcon.cpp b/src/client/component/rcon.cpp index 0371a68..3221898 100644 --- a/src/client/component/rcon.cpp +++ b/src/client/component/rcon.cpp @@ -50,7 +50,7 @@ namespace rcon for (int i = 0; i < sv_maxclients->current.integer; i++) { - const auto client = &game::mp::svs_clients[i]; + const auto client = &game::mp::svs->clients[i]; auto self = &game::mp::g_entities[i]; char clean_name[32]{}; diff --git a/src/client/component/slowmotion.cpp b/src/client/component/slowmotion.cpp index d688083..dac5286 100644 --- a/src/client/component/slowmotion.cpp +++ b/src/client/component/slowmotion.cpp @@ -50,8 +50,8 @@ namespace slowmotion for (auto i = 0; i < game::Dvar_FindVar("sv_maxclients")->current.integer; i++) { - auto* client = &game::mp::svs_clients[i]; - client->nextSnapshotTime = *game::mp::serverTime - 1; + auto* client = &game::mp::svs->clients[i]; + client->nextSnapshotTime = game::mp::svs->time - 1; } } } diff --git a/src/client/game/structs.hpp b/src/client/game/structs.hpp index d097247..a05684c 100644 --- a/src/client/game/structs.hpp +++ b/src/client/game/structs.hpp @@ -792,6 +792,22 @@ namespace game enum ConfigString { + CS_TIMESCALE = 0xA, + + CS_VISIONSET_NORMAL = 0x49C, + CS_VISIONSET_NIGHT = 0x49D, + CS_VISIONSET_MISSILECAM = 0x49E, + CS_VISIONSET_THERMAL = 0x49F, + CS_VISIONSET_PAIN = 0x4A0, + CS_VISIONSET_POST_APPLY = 0x4A1, + + CS_VISIONSET_FIRST = CS_VISIONSET_NORMAL, + CS_VISIONSET_LAST = CS_VISIONSET_POST_APPLY, + CS_VISIONSET_COUNT = CS_VISIONSET_POST_APPLY - CS_VISIONSET_NORMAL + 1 + + // many of the indices below are incorrect + + /* CS_FIRST = 0x0, CS_SERVERINFO = 0x0, CS_SYSTEMINFO = 0x1, @@ -863,7 +879,8 @@ namespace game CS_MP_ANIMS_LAST = 0xD21, CS_ITEMS = 0xD22, CS_LEADERBOARDS = 0xD23, - MAX_CONFIGSTRINGS = 0xD24, + MAX_CONFIGSTRINGS = 0xD24 + */ }; enum LiveClientDropType @@ -1289,6 +1306,16 @@ namespace game vec2_t corridorSpeeds; }; + struct ClientArchiveData + { + int serverTime; + vec3_t origin; + vec3_t velocity; + int bobCycle; + int movementDir; + PlayerVehicleState playerVehStateClientArchive; + }; + struct PlayerActiveWeaponState { int weapAnim; @@ -1411,18 +1438,26 @@ namespace game { int overflowed; int readOnly; - char* data; - char* splitData; + const char* data; + const char* splitData; int maxsize; int cursize; int splitSize; int readcount; int bit; int lastEntityRef; - netsrc_t targetLocalNetID; int useZlib; }; + struct gameState_t + { + int stringOffsets[3524]; + char stringData[131'072]; + int dataCount; + }; + + static_assert(sizeof(game::gameState_t) == 145'172); + struct HsvColor { unsigned char h; @@ -2099,7 +2134,9 @@ namespace game int clientNum; int viewmodelIndex; vec3_t viewangles; - char _0x190[0xAC]; + char _0x190[0x58]; + int viewlocked_entNum; + char _0x1EC[0x50]; int locationSelectionInfo; SprintState_t sprintState; float holdBreathScale; @@ -2131,14 +2168,11 @@ namespace game vec3_t weapLockedPos; int weaponIdleTime; int lastStowedWeapon; - char __0x638[0x2CE8]; + char __0x638[0x2CEC]; }; -#pragma pack(pop) - struct ClientCustomizationInfo - { - unsigned int modelIndex[3]; - }; + static_assert(sizeof(playerState_t) == 0x3328); +#pragma pack(pop) struct ScoreInfo { @@ -2154,6 +2188,140 @@ namespace game unsigned short adrenaline; }; + struct ScoreboardInfo + { + int teamScores[2]; + ScoreInfo clientScores[18]; + }; + + struct clSnapshot_t + { + mp::playerState_t ps; + ScoreboardInfo scores; + int valid; + int snapFlags; + int serverTime; + int messageNum; + int deltaNum; + int ping; + int cmdNum; + int numEntities; + int numClients; + int parseEntitiesIndex; + int parseClientsIndex; + int parseOmnvarsIdx; + int numAgents; + int parseAgentsIndex; + int scriptablesParseCount; + int scriptablesParseIndex; + int serverCommandNum; + }; + + static_assert(sizeof(clSnapshot_t) == 0x34B8); + + struct clientActive_t + { + char usingAds; + char padding1[3]; + int timeoutcount; + clSnapshot_t snap; + int oldSnapServerTime; + int oldServerTime; + int extrapolatedSnapshot; + char alwaysFalse; + char padding2[3]; + int serverTime; + int oldFrameServerTime; + int serverTimeDelta; + int newSnapshots; + int serverId; + char mapname[64]; + int mapcrc; + int parseEntitiesIndex; + int parseClientsIndex; + int parseOmnvarsIdx; + int mouseDx[2]; + int mouseDy[2]; + int mouseIndex; + char stanceHeld; + char padding3[3]; + int stance; + int stancePosition; + int stanceTime; + char wasSprinting; + char padding4[3]; + int cgameUserCmdWeapon; + int cgameUserCmdOffHand; + int cgameUserCmdAlternate; + float cgameFOVSensitivityScale; + float cgameMaxPitchSpeed; + float cgameMaxYawSpeed; + vec3_t cgameKickAngles; + vec3_t cgameOrigin; + vec3_t cgameVelocity; + PlayerVehicleState cgamePlayerVehState; + int cgameBobCycle; + int cgameMovementDir; + int cgameExtraButtons; + int cgamePredictedDataServerTime; + vec3_t clViewangles; + char _361C[12]; + usercmd_t cmds[128]; + int cmdNumber; + ClientArchiveData clientArchive[256]; + int clientArchiveIndex; + int packetBackupCount; + int packetBackupMask; + int parseEntitiesCount; + int parseClientsCount; + int parseOmnvarsCount; + // missing fields + }; + + struct clientStatic_t + { + int quit; + int hunkUsersStarted; + char servername[256]; + int rendererStarted; + int soundStarted; + int inUpdateSound; + int uiStarted; + int frametime; + int frametime_base; + int realtime; + char _0x124[0x80DBC]; + gameState_t gameState; + // missing fields + }; + + struct clientConnection_t + { + int qport; + int clientNum; + netadr_t serverAddress; + int connectLastSendTime; + int connectPacketCount; + char serverMessage[256]; + int challenge; + int checksumFeed; + int reliableSequence; + int reliableAcknowledge; + char reliableCommands[128][1024]; + int serverMessageSequence; + int serverCommandSequence; + int lastExecutedServerCommand; + char serverCommands[128][1024]; + char isServerRestarting; + char padding[3]; + // missing fields + }; + + struct ClientCustomizationInfo + { + unsigned int modelIndex[3]; + }; + union OmnvarValue { bool enabled; @@ -2186,44 +2354,51 @@ namespace game int modelindex; int dualWielding; char _0x10[0x30]; - char name[0x10]; + char name[16]; int rank; int prestige; - char _0x00[0x10]; int nameplateFriendlyIndex; int nameplateEnemyIndex; unsigned int perks[2]; - char _0x78[0x80]; + char _0x68[0x40]; + char clanAbbrev[8]; + char _0xB0[0x28]; }; + static_assert(sizeof(clientState_t) == 0xD8); + struct clientSession_t { int sessionState; int forceSpectatorClient; int killCamEntity; int isInKillcam; - char __0x332C[0x14]; + char _0x10[0x10]; usercmd_t cmd; usercmd_t oldcmd; int localClient; - char __0x33C4[0x24]; + char _0x9C[0x34]; float moveSpeedScaleMultiplier; int viewmodelIndex; int noSpectate; clientState_t cs; ScoreInfo scores; - char __pad[0x1B0]; + char _0x1E6[0x1C0]; }; + static_assert(sizeof(clientSession_t) == 0x388); + struct gclient_t { playerState_t ps; clientSession_t sess; int flags; int spectatorClient; - char __0x36B4[0x3B0]; + char _0x36B8[0x3B0]; }; + static_assert(sizeof(gclient_t) == 0x3A68); + struct LerpEntityState { int entFlags; @@ -2258,6 +2433,8 @@ namespace game char _0xD8[0x30]; }; + static_assert(sizeof(EntityState) == 0x108); + struct EntityShared { char _0x108[0x38]; @@ -2266,6 +2443,13 @@ namespace game char _0x14C[0xC]; }; + struct centity_t + { + char _0x0[0x238]; + }; + + static_assert(sizeof(centity_t) == 0x238); + struct gentity_t { EntityState s; @@ -2281,19 +2465,230 @@ namespace game struct snapshot_t { - char _0x0[0x3C78]; + playerState_t ps; + ScoreboardInfo scores; + OmnvarData omnvars[256]; + int snapFlags; int ping; int serverTime; int numEntities; int numClients; + // missing fields }; + enum DemoType + { + DEMO_TYPE_NONE = 0x0, + DEMO_TYPE_CLIENT = 0x1, + DEMO_TYPE_SERVER = 0x2 + }; + + struct characterInfo_t + { + char _0x0[0x5D8]; + }; + + static_assert(sizeof(characterInfo_t) == 0x5D8); + + struct clientInfo_t + { + char _0x0[0x70]; + }; + + static_assert(sizeof(clientInfo_t) == 0x70); + + struct bgs_t + { + char _0x0[0x459F0]; + characterInfo_t characterinfo[42]; + clientInfo_t clientinfo[18]; + }; + + static_assert(sizeof(bgs_t) == 0x55740); + + struct visionSetVarsBase_t + { + int filmEnable; + float filmBrightness; + float filmContrast; + float filmDesaturation; + float filmDesaturationDark; + float filmInvert; + vec3_t filmLightTint; + vec3_t filmMediumTint; + vec3_t filmDarkTint; + int charPrimaryUseTweaks; + float charPrimaryDiffuseScale; + float charPrimarySpecularScale; + vec3_t charLightAmbient; + int viewModelPrimaryUseTweaks; + float viewModelPrimaryDiffuseScale; + float viewModelPrimarySpecularScale; + vec3_t viewModelLightAmbient; + float primaryLightOverride; + int materialBloomHQEnable; + float materialBloomHQHaziness; + float materialBloomHQGamma; + float materialBloomHQDesaturation; + float materialBloomIntensity; + float materialBloomRadius; + float materialBloomPinch; + float materialBloomLuminanceCutoff; + float materialBloomDesaturation; + int volumeLightScatter; + float volumeLightScatterLinearAtten; + float volumeLightScatterQuadraticAtten; + float volumeLightScatterAngularAtten; + float volumeLightScatterDepthAttenNear; + float volumeLightScatterDepthAttenFar; + float volumeLightScatterBackgroundDistance; + vec3_t volumeLightScatterColor; + float ssaoStrength; + float ssaoPower; + float ssaoBlurRadius; + int glareEnable; + float glareNormalStart; + float glareNormalEnd; + float glareNormalPower; + float glareNormalAmount; + float glareMirrorStart; + float glareMirrorEnd; + float glareMirrorPower; + float glareMirrorAmount; + float rimLightPitch; + float rimLightHeading; + float rimLightDiffuseIntensity; + float rimLightSpecIntensity; + float rimLightBias; + float rimLightPower; + vec3_t rimLightColor; + int overrideExistingMask; + float unlitSurfaceHDRScalar; + float litSurfaceHDRScalar; + float hdrSkyIntensity; + vec3_t hdrSkyColorTint; + }; + + static_assert(sizeof(visionSetVarsBase_t) == 0x12C); + + struct visionSetVars_t + { + visionSetVarsBase_t baseclass_0; + void* _0x12C[3]; + }; + + static_assert(sizeof(visionSetVars_t) == 0x148); + + struct interpolationVisionSetVars_t + { + visionSetVarsBase_t baseclass_0; + void* _0x12C[0x2F]; + }; + + static_assert(sizeof(interpolationVisionSetVars_t) == 0x2A8); + + struct visionSetLerpData_t + { + int timeStart; + int timeDuration; + int style; + }; + + struct GfxFog + { + char _0x0[0x38]; + int startTime; + int finishTime; + int color; + float density; + int sunColor; + }; + + struct ClientVisionSetData + { + visionSetVars_t visionSetPreLoaded[4]; + char visionSetPreLoadedName[4][64]; + int visionSetPreLoadedUsedTime[4]; + interpolationVisionSetVars_t visionSetFrom[6]; + interpolationVisionSetVars_t visionSetTo[6]; + interpolationVisionSetVars_t visionSetCurrent[6]; + interpolationVisionSetVars_t visionSetPrevious; + visionSetLerpData_t visionSetLerpData[6]; + char visionName[6][64]; + char visionBlendActive[6]; + char thermalVisionActive; + char remoteMissileCam; + char painVisionActive; + float painVisionLerp; + int postApplyLerpTimeStart; + int postApplyLerpTimeDuration; + float postApplyLerpStart; + float postApplyLerpDest; + float postApplyLerpCurrent; + GfxFog lastClientFog; + int scriptFogActive; + int scriptFogLerpStartTime; + int scriptFogLerpEndTime; + }; + + static_assert(sizeof(ClientVisionSetData) == 0x3AF0); + + struct cpose_t + { + char _0x0[0x90]; + }; + + static_assert(sizeof(cpose_t) == 0x90); + struct cg_t { playerState_t ps; - char _0x3324[0x64]; + char _0x3324[0x38]; + int clientNum; + int localClientNum; + DemoType demoType; + char _0x336C[0x1C]; snapshot_t* snap; - snapshot_t* nextSnap; // theres alot after this cba rn + snapshot_t* nextSnap; + char _0x3398[0xA66F8]; + vec3_t refdefViewAngles; + char _0xA9A9C[0x8CC4]; + int clientSideVisionSetsEnabled; + int voiceTime; + Weapon weaponSelect; + char _0xB276C[0x2C10]; + int inKillCam; + char _0xB5380[0x148]; + bgs_t bgs; + cpose_t viewModelPose; + cpose_t viewModelPoseLeftHand; + ClientVisionSetData cvsData; + int stagedVisionStateTo; + int stagedVisionStateFrom; + int stagedVisionStateEndTime; + int stagedVisionStateStartTime; + // missing fields + }; + + struct cgs_t + { + int viewX; + int viewY; + int viewWidth; + int viewHeight; + float viewAspect; + float _0x14; + int serverCommandSequence; + int processedSnapshotNum; + int localServer; + char gametype[32]; + char szHostName[256]; + int hardcore; + int maxclients; + int privateClients; + char mapname[64]; + int gameEndTime; + // missing fields }; struct netProfilePacket_t @@ -2343,7 +2738,7 @@ namespace game struct __declspec(align(8)) clientHeader_t { - int state; + clientstate_t state; int sendAsActive; int deltaMessage; int rateDelayed; @@ -2377,7 +2772,10 @@ namespace game int reliableAcknowledge; int reliableSent; int messageAcknowledge; - char _0xC30[0x41238]; + int largeCommandSequence; + int gamestateMessageNum; + int challenge; + char _0xC3C[0x4122C]; gentity_t* gentity; char name[16]; int lastPacketTime; @@ -2400,6 +2798,8 @@ namespace game char _0x41E94[0x416A0]; }; + static_assert(sizeof(client_t) == 0x83570); + struct XZone { char name[64]; @@ -2419,9 +2819,18 @@ namespace game }; static_assert(sizeof(missileFireParms) == 0x20); - } - static_assert(sizeof(mp::client_t) == 0x83570); + struct serverStatic_t + { + char _0x0[0x1681D00]; + int time; + int loopbackProcessStopTime; + int snapFlagServerBit; + int clientCount; + client_t clients[18]; + // missing fields + }; + } union playerState_t { diff --git a/src/client/game/symbols.hpp b/src/client/game/symbols.hpp index 770cb0b..d517a3a 100644 --- a/src/client/game/symbols.hpp +++ b/src/client/game/symbols.hpp @@ -311,19 +311,20 @@ namespace game namespace mp { - WEAK symbol cgArray{0, 0x14176EC00}; + WEAK symbol cg{0, 0x14176EC00}; + WEAK symbol cgs{0, 0x14187EB80}; + WEAK symbol cl{0, 0x1419E1C70}; + WEAK symbol clc{0, 0x141CB5350}; + WEAK symbol cls{0, 0x141D1AB60}; + WEAK symbol svs{0, 0x144DF9580}; WEAK symbol g_entities{0, 0x14427A0E0}; - - WEAK symbol svs_clientCount{0, 0x14647B28C}; - WEAK symbol svs_clients{0, 0x14647B290}; - - WEAK symbol sv_serverId_value{0, 0x144DF9478}; - - WEAK symbol gameTime{0, 0x1443F4B6C}; - WEAK symbol serverTime{0, 0x14647B280}; + WEAK symbol centities{0, 0x141887350}; WEAK symbol g_zones_0{0, 0x143A46498}; + WEAK symbol connstate{0, 0x1419E1AE0}; + WEAK symbol gameTime{0, 0x1443F4B6C}; + WEAK symbol sv_serverId_value{0, 0x144DF9478}; } namespace hks -- 2.34.1 From 7954966c6013c8eaf6152e0518533ee4ee1e3949 Mon Sep 17 00:00:00 2001 From: Caball Date: Tue, 31 Dec 2024 00:12:38 +0100 Subject: [PATCH 10/11] Updated function symbols and references. Replaced all occurrences of 0x0 with 0 for consistency. --- src/client/component/branding.cpp | 3 +- src/client/component/input.cpp | 4 +- src/client/component/slowmotion.cpp | 2 +- src/client/game/symbols.hpp | 81 ++++++++++++++++++++--------- 4 files changed, 59 insertions(+), 31 deletions(-) diff --git a/src/client/component/branding.cpp b/src/client/component/branding.cpp index 3602fb4..d963862 100644 --- a/src/client/component/branding.cpp +++ b/src/client/component/branding.cpp @@ -41,8 +41,7 @@ namespace branding localized_strings::override("LUA_MENU_LEGAL_COPYRIGHT", "iw6-mod: " VERSION " by AlterWare.\n"); utils::hook::call(SELECT_VALUE(0x1403BDABA, 0x140414424), dvar_set_string_stub); - ui_get_formatted_build_number_hook.create( - SELECT_VALUE(0x140415FD0, 0x1404D7C00), ui_get_formatted_build_number_stub); + ui_get_formatted_build_number_hook.create(game::LiveStorage_FetchFFotD, ui_get_formatted_build_number_stub); scheduler::loop([]() { diff --git a/src/client/component/input.cpp b/src/client/component/input.cpp index 6c3ecb9..beffee2 100644 --- a/src/client/component/input.cpp +++ b/src/client/component/input.cpp @@ -50,8 +50,8 @@ namespace input return; } - cl_char_event_hook.create(SELECT_VALUE(0x14023CE50, 0x1402C2AE0), cl_char_event_stub); - cl_key_event_hook.create(SELECT_VALUE(0x14023D070, 0x1402C2CE0), cl_key_event_stub); + cl_char_event_hook.create(game::CL_CharEvent, cl_char_event_stub); + cl_key_event_hook.create(game::CL_KeyEvent, cl_key_event_stub); } }; } diff --git a/src/client/component/slowmotion.cpp b/src/client/component/slowmotion.cpp index dac5286..42302e3 100644 --- a/src/client/component/slowmotion.cpp +++ b/src/client/component/slowmotion.cpp @@ -66,7 +66,7 @@ namespace slowmotion utils::hook::jump(0x1403B4A10, scr_cmd_set_slow_motion); // Detour used here instead of call hook because Com_TimeScaleMsec is called from arxan encrypted function - com_timescale_msec_hook.create(0x140415D50, com_timescale_msec); + com_timescale_msec_hook.create(game::Com_TimeScaleMsec, com_timescale_msec); } }; } diff --git a/src/client/game/symbols.hpp b/src/client/game/symbols.hpp index d517a3a..6e4b74d 100644 --- a/src/client/game/symbols.hpp +++ b/src/client/game/symbols.hpp @@ -36,15 +36,31 @@ namespace game WEAK symbol Cbuf_AddText{0x1403B3050, 0x1403F6B50}; WEAK symbol Cbuf_ExecuteBufferInternal{0x1403B3160, 0x1403F6C60}; - WEAK symbol CL_IsCgameInitialized{0x140234DA0, 0x1402B9A70}; - + WEAK symbol CG_ExecuteNewServerCommands{0, 0x140288500}; WEAK symbol CG_GameMessage{0x1401F2E20, 0x140271320}; - WEAK symbol CG_SetClientDvarFromServer{0x0, 0x14028A2C0}; + WEAK symbol CG_GetVehicleDef{0, 0x140229760}; + WEAK symbol CG_HandleTurretFire{0, 0x140269DF0}; + WEAK symbol CG_SetClientDvarFromServer{0, 0x14028A2C0}; + WEAK symbol CG_UpdateOmnvars{0, 0x14028E770}; + + WEAK symbol CL_CharEvent{0x14023CE50, 0x1402C2AE0}; + WEAK symbol CL_GetClientNameColorize{0, 0x1402CFA60}; + WEAK symbol CL_GetPredictedPlayerInformationForServerTime{0, 0x1402CC710}; + WEAK symbol CL_GetPredictedVehicleForServerTime{0, 0x1402CC7F0}; + WEAK symbol CL_IsCgameInitialized{0x140234DA0, 0x1402B9A70}; + WEAK symbol CL_KeyEvent{0x14023D070, 0x1402C2CE0}; + WEAK symbol CL_ParseServerMessage{0, 0x1402CDFC0}; + WEAK symbol CG_SelectWeapon{0, 0x1402AB310}; + WEAK symbol CL_SetCGameTime{0, 0x1402B9D80}; + WEAK symbol CL_WritePacket{0, 0x1402C1E70}; WEAK symbol Cmd_AddCommandInternal{0x1403B3570, 0x1403F7070}; WEAK symbol Cmd_ExecuteSingleCommand{0x1403B3B10, 0x1403F7680}; + WEAK symbol Com_TimeScaleMsec{0, 0x140415D50}; - WEAK symbol DB_EnumXAssets_FastFile{0x140271F50, 0x14031EF90}; + WEAK symbol DB_EnumXAssets_FastFile{0x140271F50, 0x14031EF90}; WEAK symbol DB_EnumXAssets_Internal{0x140271FC0, 0x14031F000}; WEAK symbol DB_FindXAssetEntry{0x140272230, 0x14031F2D0}; WEAK symbol DB_GetXAssetName{0x14024FB10, 0x1402FB160}; @@ -54,11 +70,11 @@ namespace game WEAK symbol DB_FindXAssetHeader{0x140272300, 0x14031F3A0}; WEAK symbol DB_XAssetExists{0x140276200, 0x1403245E0}; WEAK symbol DB_IsXAssetDefault{0x140273480 , 0x1403204D0}; - WEAK symbol DB_GetRawFileLen{0x0140272E80, 0x14031FF80}; + WEAK symbol DB_GetRawFileLen{0x140272E80, 0x14031FF80}; WEAK symbol DB_GetRawBuffer{0x140272D50, 0x14031FE50}; WEAK symbol DB_IsLocalized{0x140273210, 0x140320360}; - WEAK symbol PMem_AllocFromSource_NoDebug{0x0140430B80, 0x001404F46C0}; + WEAK symbol PMem_AllocFromSource_NoDebug{0x140430B80, 0x001404F46C0}; WEAK symbol PMem_Free{0x140430EC0 , 0x1404F4A30}; WEAK symbol Hunk_AllocateTempMemoryHighInternal{0x140423C70, 0x1404E4E20}; @@ -93,6 +109,8 @@ namespace game WEAK symbol FS_AddGameDirectory{0x14041A120, 0x1404DC570}; WEAK symbol FS_AddLocalizedGameDirectory{0x14041A2F0, 0x1404DC760}; + WEAK symbol GetRemoteEyeValues{0, 0x1402A0190}; + WEAK symbol G_FindItem{0x140462490, 0x14021B7E0}; WEAK symbol G_GivePlayerWeapon{0x140359E20, 0x1403DA5E0}; WEAK symbol G_GetWeaponForName{0x140359890, 0x1403DA060}; @@ -101,10 +119,10 @@ namespace game WEAK symbol G_SelectWeapon{0x14035A200, 0x1403DA880}; WEAK symbol G_TakePlayerWeapon{0x14035A350, 0x1403DA9C0}; WEAK symbol G_FindConfigstringIndex{0x0, 0x140161F90}; - WEAK symbol G_RunFrame{0x0, 0x1403A05E0}; + const char* errormsg)> G_FindConfigstringIndex{0, 0x140161F90}; + WEAK symbol G_RunFrame{0, 0x1403A05E0}; - WEAK symbol HudElem_Alloc{0x0, 0x1403997E0}; + WEAK symbol HudElem_Alloc{0, 0x1403997E0}; WEAK symbol I_CleanStr{0x140432460, 0x1404F63C0}; @@ -116,6 +134,7 @@ namespace game WEAK symbol Live_SyncOnlineDataFlags{0, 0x1405ABF70}; + WEAK symbol LiveStorage_FetchFFotD{0x140415FD0, 0x1404D7C00}; WEAK symbol LiveStorage_PlayerDataSetIntByName{0x1403B8C20, 0x140404730}; WEAK symbol LiveStorage_PlayerDataSetReservedInt{0x1403B8D00, 0x140404820}; WEAK symbol LiveStorage_PlayerDataGetReservedInt{0x1403B84F0, 0x140403CF0}; @@ -135,24 +154,30 @@ namespace game WEAK symbol StringTable_GetColumnValueForRow{0, 0x1404E61A0}; WEAK symbol StringTable_LookupRowNumForValue{0, 0x1404E6260}; + WEAK symbol LUI_IntermissionBegan{0, 0x1401CEB40}; WEAK symbol LUI_OpenMenu{0x1403FD460, 0x1404B3610}; // Made up name, replaced by ScopedCriticalSection on Black Ops 3 WEAK symbol LUI_EnterCriticalSection{0x1401AE940, 0x1401CD040}; WEAK symbol LUI_LeaveCriticalSection{0x1401B0AA0, 0x1401CF1A0}; - WEAK symbol Menu_IsMenuOpenAndVisible{0x0, 0x1404B38A0}; + WEAK symbol Menu_IsMenuOpenAndVisible{0, 0x1404B38A0}; WEAK symbol Material_RegisterHandle{0x140523D90, 0x1405F0E20}; + WEAK symbol MSG_ReadLong{0, 0x1404181C0}; + WEAK symbol MSG_WriteBits{0, 0x140418740}; + WEAK symbol NET_OutOfBandPrint{0, 0x14041D5C0}; WEAK symbol NET_SendLoopPacket{0, 0x14041D780}; WEAK symbol NET_StringToAdr{0, 0x14041D870}; WEAK symbol NetadrToSockadr{0, 0x1404E53D0}; + WEAK symbol Omnvar_GetDef{0, 0x1404F3E80}; + WEAK symbol R_AddCmdDrawStretchPic{0x140234460, 0x140600BE0}; - WEAK symbol R_AddCmdDrawText{0x140533E40, 0x140601070}; - WEAK symbol R_AddCmdDrawTextWithCursor{0x140534170, 0x1406013A0}; + WEAK symbol R_AddCmdDrawText{0x140533E40, 0x140601070}; + WEAK symbol R_AddCmdDrawTextWithCursor{0x140534170, 0x1406013A0}; WEAK symbol R_RegisterFont{0x1405130B0, 0x1405DFAC0}; WEAK symbol R_SyncRenderThread{0x140535AF0, 0x140602D30}; WEAK symbol R_TextWidth{0x140513390, 0x1405DFDB0}; @@ -166,27 +191,27 @@ namespace game WEAK symbol GetEntityFieldValue{0x1403DC810, 0x140437860}; WEAK symbol Scr_AllocVector{0x1403D9AF0, 0x140434A10}; WEAK symbol Scr_GetString{0, 0x140439160}; - WEAK symbol Scr_AddInt{0x0, 0x140437E70}; - WEAK symbol Scr_AddString{0x0, 0x1404381D0}; - WEAK symbol Scr_GetInt{0x0, 0x140438E10}; + WEAK symbol Scr_AddInt{0, 0x140437E70}; + WEAK symbol Scr_AddString{0, 0x1404381D0}; + WEAK symbol Scr_GetInt{0, 0x140438E10}; WEAK symbol Scr_GetFloat{0, 0x140438D60}; WEAK symbol Scr_GetNumParam{0x1403DDF60, 0x140438EC0}; WEAK symbol Scr_ClearOutParams{0x1403DD500, 0x140438600}; WEAK symbol Scr_GetEntityIdRef{0x1403DBDC0, 0x140436E10}; - WEAK symbol Scr_AddEntityNum{0x0, 0x140437F60}; + WEAK symbol Scr_AddEntityNum{0, 0x140437F60}; WEAK symbol Scr_SetObjectField{0x140350E70, 0x1403D3FE0}; WEAK symbol Scr_NotifyId{0x1403DE730, 0x140439700}; - WEAK symbol Scr_NotifyLevel{0x0, 0x1404397D0}; - WEAK symbol Scr_GetEntityId{0x0, 0x140436D60}; - WEAK symbol Scr_CastString{0x0, 0x140434AC0}; + WEAK symbol Scr_NotifyLevel{0, 0x1404397D0}; + WEAK symbol Scr_GetEntityId{0, 0x140436D60}; + WEAK symbol Scr_CastString{0, 0x140434AC0}; WEAK symbol Scr_ExecThread{0x1403DD600, 0x1404386E0}; WEAK symbol Scr_LoadScript{0x1403D3C50, 0x14042EAA0}; WEAK symbol Scr_GetFunctionHandle{0x1403D3AD0 , 0x14042E920}; WEAK symbol Scr_RegisterFunction{0x1403D3530, 0x14042E330}; - WEAK symbol Scr_ErrorInternal{0x0, 0x140438660}; + WEAK symbol Scr_ErrorInternal{0, 0x140438660}; - WEAK symbol GetObjectType{0x0, 0x140433CF0}; + WEAK symbol GetObjectType{0, 0x140433CF0}; WEAK symbol VM_Execute{0, 0x14043A280}; @@ -201,7 +226,7 @@ namespace game WEAK symbol SV_Cmd_ArgvBuffer{0x1403B4560, 0x1403F80D0}; WEAK symbol SV_Cmd_TokenizeString{0, 0x1403F8150}; WEAK symbol SV_Cmd_EndTokenizedString{0, 0x1403F8110}; - WEAK symbol SV_MatchEnd{0x0, 0x14047A090}; + WEAK symbol SV_MatchEnd{0, 0x14047A090}; WEAK symbol SV_DirectConnect{0, 0x140471390}; WEAK symbol SV_GameSendServerCommand{0x140490F40, 0x1404758C0}; @@ -219,6 +244,7 @@ namespace game WEAK symbol SV_GetPlayerstateForClientNum{0x140490F80, 0x140475A10}; WEAK symbol SV_GetGuid{0, 0x140475990}; WEAK symbol SV_KickClientNum{0, 0x14046F730}; + WEAK symbol SV_Netchan_Transmit{0, 0x14047CC60}; WEAK symbol SV_SetConfigstring{0, 0x140477450}; WEAK symbol Sys_Error{0x14043AC20, 0x1404FF510}; @@ -237,6 +263,9 @@ namespace game WEAK symbol UI_LocalizeMapname{0, 0x1404B96D0}; WEAK symbol UI_LocalizeGametype{0, 0x1404B90F0}; + WEAK symbol VehicleCam_UpdatePlayerControlCam{0, 0x140568CA0}; + WEAK symbol dwGetLogOnStatus{0, 0x140589490}; WEAK symbol PM_trace{0, 0x140225DB0}; - WEAK symbol Jump_ClearState{0x0, 0x140213120}; + WEAK symbol Jump_ClearState{0, 0x140213120}; WEAK symbol longjmp{0x14062E030, 0x140738060}; WEAK symbol _setjmp{0x14062F030, 0x140739060}; @@ -294,9 +323,9 @@ namespace game WEAK symbol scr_function_stack{0x1455BE708, 0x144D57808}; WEAK symbol scr_levelEntityId{0x1452A9F30, 0x144A43020}; - WEAK symbol level_time{0x0, 0x1443F4B6C}; - WEAK symbol level_finished{0x0, 0x1443F6FAC}; - WEAK symbol level_savepersist{0x0, 0x1443F5710}; + WEAK symbol level_time{0, 0x1443F4B6C}; + WEAK symbol level_finished{0, 0x1443F6FAC}; + WEAK symbol level_savepersist{0, 0x1443F5710}; WEAK symbol threadIds{0x144DE6640, 0x1446B4960}; -- 2.34.1 From d26a5fe43f37de71e958db591d656eb0ee3e237b Mon Sep 17 00:00:00 2001 From: Caball Date: Tue, 31 Dec 2024 00:17:24 +0100 Subject: [PATCH 11/11] Added a few changes. Added missing includes to the list of standard headers. Added an assertion to the asmjit assemble function to get an early warning if asmjit fails silently. --- src/client/component/dedicated_info.cpp | 2 +- src/client/std_include.hpp | 4 ++++ src/common/utils/hook.cpp | 2 ++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/client/component/dedicated_info.cpp b/src/client/component/dedicated_info.cpp index de3f8aa..a505924 100644 --- a/src/client/component/dedicated_info.cpp +++ b/src/client/component/dedicated_info.cpp @@ -59,7 +59,7 @@ namespace dedicated_info utils::string::strip(sv_hostname->current.string, cleaned_hostname.data(), cleaned_hostname.size() + 1); - console::set_title(utils::string::va("%s on %s [%d/%d] (%d)", cleaned_hostname.data(), + console::set_title(utils::string::va("%s on %s [%d/%d] (%d)", cleaned_hostname.c_str(), mapname->current.string, client_count, sv_maxclients->current.integer, bot_count)); }, scheduler::pipeline::main, 1s); diff --git a/src/client/std_include.hpp b/src/client/std_include.hpp index 3f7c182..b2c2d33 100644 --- a/src/client/std_include.hpp +++ b/src/client/std_include.hpp @@ -46,7 +46,10 @@ #undef min #endif +#include +#include #include +#include #include #include #include @@ -54,6 +57,7 @@ #include #include #include +#include #include #include #include diff --git a/src/common/utils/hook.cpp b/src/common/utils/hook.cpp index be05cb9..f25821e 100644 --- a/src/common/utils/hook.cpp +++ b/src/common/utils/hook.cpp @@ -2,6 +2,7 @@ #include "string.hpp" #include +#include namespace utils::hook { @@ -279,6 +280,7 @@ namespace utils::hook void* result = nullptr; runtime.add(&result, &code); + assert(result); return result; } -- 2.34.1