From 796a8931a074566f0496d8344b2b29221c523948 Mon Sep 17 00:00:00 2001 From: quaK <38787176+Joelrau@users.noreply.github.com> Date: Wed, 3 Mar 2021 14:31:10 +0200 Subject: [PATCH 1/2] Unlock variants and enable virtuallobby --- src/client/component/bots.cpp | 2 +- src/client/component/dedicated.cpp | 3 ++ src/client/component/fastfiles.cpp | 7 ++-- src/client/component/gameplay.cpp | 3 ++ src/client/component/map_rotation.cpp | 6 ++++ src/client/component/party.cpp | 18 ++++++++--- src/client/component/patches.cpp | 32 +++---------------- .../game/demonware/services/bdMarketing.cpp | 8 +++++ .../game/demonware/services/bdMarketing.hpp | 1 + src/client/game/game.cpp | 5 +++ src/client/game/game.hpp | 2 ++ src/client/game/structs.hpp | 12 +++++++ src/client/game/symbols.hpp | 6 +++- 13 files changed, 69 insertions(+), 36 deletions(-) diff --git a/src/client/component/bots.cpp b/src/client/component/bots.cpp index 56c7c76..5c1b914 100644 --- a/src/client/component/bots.cpp +++ b/src/client/component/bots.cpp @@ -81,7 +81,7 @@ namespace bots command::add("spawnBot", [](const command::params& params) { - if (!game::SV_Loaded()) return; + if (!game::SV_Loaded() || game::VirtualLobby_Loaded()) return; auto num_bots = 1; if (params.size() == 2) diff --git a/src/client/component/dedicated.cpp b/src/client/component/dedicated.cpp index c97f2cd..082d423 100644 --- a/src/client/component/dedicated.cpp +++ b/src/client/component/dedicated.cpp @@ -150,6 +150,9 @@ namespace dedicated return; } + // Disable VirtualLobby + dvars::override::Dvar_RegisterBool("virtualLobbyEnabled", false, game::DVAR_FLAG_NONE | game::DVAR_FLAG_READ); + // Disable r_preloadShaders dvars::override::Dvar_RegisterBool("r_preloadShaders", false, game::DVAR_FLAG_NONE | game::DVAR_FLAG_READ); diff --git a/src/client/component/fastfiles.cpp b/src/client/component/fastfiles.cpp index b81cc0b..3c8cc30 100644 --- a/src/client/component/fastfiles.cpp +++ b/src/client/component/fastfiles.cpp @@ -56,8 +56,11 @@ namespace fastfiles return; } - const char* name = params.get(1); - game::DB_LoadXAssets(&name, 1u, game::DBSyncMode::DB_LOAD_SYNC); + game::XZoneInfo info; + info.name = params.get(1); + info.allocFlags = 1; + info.freeFlags = 0; + game::DB_LoadXAssets(&info, 1u, game::DBSyncMode::DB_LOAD_SYNC); }); command::add("materiallist", [](const command::params& params) diff --git a/src/client/component/gameplay.cpp b/src/client/component/gameplay.cpp index 1bfdd04..85c6dc8 100644 --- a/src/client/component/gameplay.cpp +++ b/src/client/component/gameplay.cpp @@ -78,6 +78,9 @@ namespace gameplay utils::hook::jump(0x14014DF91, pm_bouncing_stub_mp, true); dvars::pm_bouncing = game::Dvar_RegisterBool("pm_bouncing", false, game::DVAR_FLAG_REPLICATED, "Enable bouncing"); + + // Change jump_slowdownEnable dvar flags to just "replicated" + utils::hook::set(0x140135992, game::DVAR_FLAG_REPLICATED); } }; } diff --git a/src/client/component/map_rotation.cpp b/src/client/component/map_rotation.cpp index b17777c..b949465 100644 --- a/src/client/component/map_rotation.cpp +++ b/src/client/component/map_rotation.cpp @@ -103,6 +103,12 @@ namespace map_rotation else if (key == "map") { store_new_rotation(rotation, i + 2); + if (!game::SV_MapExists(value.data())) + { + printf("map_rotation: '%s' map doesn't exist!\n", value.data()); + launch_default_map(); + return; + } launch_map(value); return; } diff --git a/src/client/component/party.cpp b/src/client/component/party.cpp index 9905a40..0e34f1d 100644 --- a/src/client/component/party.cpp +++ b/src/client/component/party.cpp @@ -68,6 +68,9 @@ namespace party perform_game_initialization(); + // exit from virtuallobby + reinterpret_cast(0x14020EB90)(); + // CL_ConnectFromParty char session_info[0x100] = {}; reinterpret_cast(0x140209360)( @@ -212,7 +215,7 @@ namespace party auto* current_mapname = game::Dvar_FindVar("mapname"); if (current_mapname && utils::string::to_lower(current_mapname->current.string) == - utils::string::to_lower(mapname) && game::SV_Loaded()) + utils::string::to_lower(mapname) && (game::SV_Loaded() && !game::VirtualLobby_Loaded())) { printf("Restarting map: %s\n", mapname.data()); command::execute("map_restart", false); @@ -228,6 +231,13 @@ namespace party } command::execute(utils::string::va("ui_mapname %s", mapname.data()), true); + /*auto* maxclients = game::Dvar_FindVar("sv_maxclients"); + if (maxclients) + { + command::execute(utils::string::va("ui_maxclients %i", maxclients->current.integer), true); + command::execute(utils::string::va("party_maxplayers %i", maxclients->current.integer), true); + }*/ + // StartServer reinterpret_cast(0x140492260)(0); @@ -238,7 +248,7 @@ namespace party void send_disconnect() { - if (game::CL_IsCgameInitialized()) + if (game::CL_IsCgameInitialized() && !game::VirtualLobby_Loaded()) { // CL_ForwardCommandToServer reinterpret_cast(0x14020B310)(0, "disconnect"); @@ -284,7 +294,7 @@ namespace party command::add("map_restart", []() { - if (!game::SV_Loaded()) + if (!game::SV_Loaded() || game::VirtualLobby_Loaded()) { return; } @@ -296,7 +306,7 @@ namespace party command::add("fast_restart", []() { - if (game::SV_Loaded()) + if (game::SV_Loaded() && !game::VirtualLobby_Loaded()) { game::SV_FastRestart(0); } diff --git a/src/client/component/patches.cpp b/src/client/component/patches.cpp index aa9e5ca..ef6cc9b 100644 --- a/src/client/component/patches.cpp +++ b/src/client/component/patches.cpp @@ -18,25 +18,6 @@ namespace patches { namespace { - game::dvar_t* register_virtual_lobby_enabled_stub(const char* name, bool /*value*/, - unsigned int /*flags*/, - const char* description) - { - return game::Dvar_RegisterBool(name, false, game::DVAR_FLAG_READ, description); - } - - game::dvar_t* register_virtual_lobby_stubs(const char* name, bool value, - unsigned int /*flags*/, - const char* description) - { - if (game::Com_GetCurrentCoDPlayMode() == game::CODPLAYMODE_CORE) - { - value = true; - } - - return game::Dvar_RegisterBool(name, value, game::DVAR_FLAG_READ, description); - } - utils::hook::detour live_get_local_client_name_hook; const char* live_get_local_client_name() @@ -80,7 +61,7 @@ namespace patches } game::dvar_t* register_cg_fov_stub(const char* name, float value, float min, float /*max*/, - const unsigned int flags, + const unsigned int /*flags*/, const char* description) { return game::Dvar_RegisterFloat(name, value, min, 160, game::DVAR_FLAG_SAVED, description); @@ -90,8 +71,7 @@ namespace patches unsigned int /*flags*/, const char* desc) { - // changed max value from 2.0f -> 5.0f and min value from 0.5f -> 0.1f - return game::Dvar_RegisterFloat(name, 1.0f, 0.1f, 5.0f, game::DVAR_FLAG_SAVED, desc); + return game::Dvar_RegisterFloat(name, 1.0f, 0.2f, 5.0f, game::DVAR_FLAG_SAVED, desc); } int dvar_command_patch() // game makes this return an int and compares with eax instead of al -_- @@ -193,7 +173,7 @@ namespace patches // Unlock fps in main menu utils::hook::set(SELECT_VALUE(0x140144F5B, 0x140213C3B), 0xEB); - // Unlock fps + // Unlock com_maxfps utils::hook::call(SELECT_VALUE(0x1402F8726, 0x1403CF8CA), register_com_maxfps_stub); // Unlock cg_fov @@ -230,11 +210,6 @@ namespace patches static void patch_mp() { - // Disable virtualLobby - utils::hook::call(0x1403CFDCC, register_virtual_lobby_enabled_stub); // virtualLobbyEnabled - //utils::hook::call(0x14013E0C0, register_virtual_lobby_stubs); // virtualLobbyReady - utils::hook::call(0x1403CFE6A, register_virtual_lobby_stubs); // virtualLobbyAllocated - // Use name dvar live_get_local_client_name_hook.create(0x1404D47F0, &live_get_local_client_name); @@ -256,6 +231,7 @@ namespace patches // unlock all items utils::hook::jump(0x1403BD790, is_item_unlocked); // LiveStorage_IsItemUnlockedFromTable_LocalClient utils::hook::jump(0x1403BD290, is_item_unlocked); // LiveStorage_IsItemUnlockedFromTable + utils::hook::jump(0x1403BAF60, is_item_unlocked); // idk ( unlocks loot etc ) // disable emblems dvars::override::Dvar_RegisterInt("emblems_active", 0, 0, 0, game::DVAR_FLAG_NONE); diff --git a/src/client/game/demonware/services/bdMarketing.cpp b/src/client/game/demonware/services/bdMarketing.cpp index 7ac7ae5..f6fae62 100644 --- a/src/client/game/demonware/services/bdMarketing.cpp +++ b/src/client/game/demonware/services/bdMarketing.cpp @@ -5,9 +5,17 @@ namespace demonware { bdMarketing::bdMarketing() : service(139, "bdMarketing") { + this->register_task(2, &bdMarketing::unk2); this->register_task(3, &bdMarketing::unk3); } + void bdMarketing::unk2(service_server* server, byte_buffer* buffer) const + { + // TODO: + auto reply = server->create_reply(this->task_id()); + reply->send(); + } + void bdMarketing::unk3(service_server* server, byte_buffer* buffer) const { // TODO: diff --git a/src/client/game/demonware/services/bdMarketing.hpp b/src/client/game/demonware/services/bdMarketing.hpp index 9875ebb..455e152 100644 --- a/src/client/game/demonware/services/bdMarketing.hpp +++ b/src/client/game/demonware/services/bdMarketing.hpp @@ -8,6 +8,7 @@ namespace demonware bdMarketing(); private: + void unk2(service_server* server, byte_buffer* buffer) const; void unk3(service_server* server, byte_buffer* buffer) const; }; } diff --git a/src/client/game/game.cpp b/src/client/game/game.cpp index cb4e969..d11e52e 100644 --- a/src/client/game/game.cpp +++ b/src/client/game/game.cpp @@ -23,6 +23,11 @@ namespace game return sv_cmd_args->argv[sv_cmd_args->nesting][index]; } + bool VirtualLobby_Loaded() + { + return *mp::virtualLobby_loaded == 1; + } + namespace environment { launcher::mode mode = launcher::mode::none; diff --git a/src/client/game/game.hpp b/src/client/game/game.hpp index 1129fcf..47041ca 100644 --- a/src/client/game/game.hpp +++ b/src/client/game/game.hpp @@ -63,6 +63,8 @@ namespace game int SV_Cmd_Argc(); const char* SV_Cmd_Argv(int index); + + bool VirtualLobby_Loaded(); } #include "symbols.hpp" diff --git a/src/client/game/structs.hpp b/src/client/game/structs.hpp index 9c8ab04..0ceb630 100644 --- a/src/client/game/structs.hpp +++ b/src/client/game/structs.hpp @@ -9,6 +9,11 @@ namespace game typedef vec_t vec3_t[3]; typedef vec_t vec4_t[4]; + enum scr_string_t + { + scr_string_t_dummy = 0x0, + }; + enum Sys_Folder { SF_ZONE = 0x0, @@ -812,6 +817,13 @@ namespace game DB_LOAD_SYNC_SKIP_ALWAYS_LOADED = 0x5, }; + struct XZoneInfo + { + const char* name; + int allocFlags; + int freeFlags; + }; + enum XAssetType { ASSET_TYPE_PHYSPRESET, diff --git a/src/client/game/symbols.hpp b/src/client/game/symbols.hpp index caf955b..006d57b 100644 --- a/src/client/game/symbols.hpp +++ b/src/client/game/symbols.hpp @@ -36,7 +36,7 @@ namespace game WEAK symbol DB_EnumXAssets_FastFile{ 0x14017D7C0, 0x14026EC10 }; WEAK symbol DB_GetXAssetTypeSize{ 0x140151C20, 0x140240DF0 }; - WEAK symbol DB_LoadXAssets{ 0x1402F8B50, 0x140270F30 }; + WEAK symbol DB_LoadXAssets{ 0x1402F8B50, 0x140270F30 }; WEAK symbol Dvar_FindVar{ 0x140370860, 0x1404BF8B0 }; WEAK symbol Dvar_ClearModified{ 0x140370700, 0x1404BF690 }; @@ -113,6 +113,8 @@ namespace game WEAK symbol Scr_GetNumParam{ 0x14031C2A0, 0x1403F8980 }; WEAK symbol Scr_ClearOutParams{ 0x14031B7C0, 0x1403F8040 }; + WEAK symbol SL_FindString{ 0x140314AF0, 0x1403F11C0 }; + WEAK symbol SV_Cmd_TokenizeString{ 0, 0x1403B0640 }; WEAK symbol SV_Cmd_EndTokenizedString{ 0, 0x1403B0600 }; @@ -185,6 +187,8 @@ namespace game WEAK symbol svs_numclients{ 0, 0x1496C4B0C }; WEAK symbol sv_serverId_value{ 0, 0x1488A9A60 }; + + WEAK symbol virtualLobby_loaded{ 0, 0x1417E161D }; } namespace sp From 058c485dacdf5e8ac500f2947fd04b35607138e7 Mon Sep 17 00:00:00 2001 From: quaK <38787176+Joelrau@users.noreply.github.com> Date: Wed, 3 Mar 2021 14:31:19 +0200 Subject: [PATCH 2/2] Add stats component --- src/client/component/stats.cpp | 64 ++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 src/client/component/stats.cpp diff --git a/src/client/component/stats.cpp b/src/client/component/stats.cpp new file mode 100644 index 0000000..76bdf53 --- /dev/null +++ b/src/client/component/stats.cpp @@ -0,0 +1,64 @@ +#include +#include "loader/component_loader.hpp" + +#include "game/game.hpp" + +#include "command.hpp" +#include "game_console.hpp" + +#include + +namespace stats +{ + class component final : public component_interface + { + public: + void post_unpack() override + { + if (!game::environment::is_mp()) + { + return; + } + + command::add("setPlayerDataInt", [](const command::params& params) + { + if (params.size() < 2) + { + printf("usage: setPlayerDataInt , "); + return; + } + + // SL_FindString + auto lookupString = game::SL_FindString(params.get(1)); + auto value = atoi(params.get(2)); + + // SetPlayerDataInt + reinterpret_cast(0x1403BF550)(0, lookupString, value, 0); + }); + + command::add("getPlayerDataInt", [](const command::params& params) + { + if (params.size() < 2) + { + printf("usage: getPlayerDataInt \n"); + return; + } + + // SL_FindString + auto lookupString = game::SL_FindString(params.get(1)); + + // GetPlayerDataInt + auto result = reinterpret_cast(0x1403BE860)(0, lookupString, 0); + game_console::print(game_console::con_type_info, "%d\n", result); + }); + + command::add("unlockstats", []() + { + command::execute("setPlayerDataInt prestige 30"); + command::execute("setPlayerDataInt experience 1002100"); + }); + } + }; +} + +REGISTER_COMPONENT(stats::component)