diff --git a/src/client/component/dedicated.cpp b/src/client/component/dedicated.cpp index 49886ad9..c5247d89 100644 --- a/src/client/component/dedicated.cpp +++ b/src/client/component/dedicated.cpp @@ -51,8 +51,11 @@ namespace dedicated return true; } - void sync_gpu_stub() + void sync_gpu_stub(void* a1) { + // R_SyncGpu + utils::hook::invoke(0xE08AE0_b, a1); + std::this_thread::sleep_for(1ms); } @@ -125,7 +128,7 @@ namespace dedicated utils::hook::jump(0xB53950_b, gscr_is_using_match_rules_data_stub); // Hook R_SyncGpu - utils::hook::jump(0xE08AE0_b, sync_gpu_stub, true); + utils::hook::call(0x3428B1_b, sync_gpu_stub); utils::hook::jump(0x341B60_b, init_dedicated_server, true); diff --git a/src/client/component/party.cpp b/src/client/component/party.cpp index a478574c..2acb8aff 100644 --- a/src/client/component/party.cpp +++ b/src/client/component/party.cpp @@ -67,26 +67,29 @@ namespace party game::CL_MainMP_ConnectAndPreloadMap(0, reinterpret_cast(session_info), &target, mapname.data(), gametype.data()); } - void start_map_for_party() + void start_map_for_party(std::string map_name) { - auto* mapname = game::Dvar_FindVar("ui_mapname"); + [[maybe_unused]]auto* mapname = game::Dvar_FindVar("ui_mapname"); auto* gametype = game::Dvar_FindVar("ui_gametype"); auto* clients = game::Dvar_FindVar("ui_maxclients"); auto* private_clients = game::Dvar_FindVar("ui_privateClients"); auto* hardcore = game::Dvar_FindVar("ui_hardcore"); - //utils::hook::invoke(0x9D8900_b, game::Party_GetActiveParty(), true); + // Com_FrontEndScene_ShutdownAndDisable + utils::hook::invoke(0x5AEFB0_b); - utils::hook::invoke(0xE4DDC0_b); // Sys_WaitWorkerCmds - utils::hook::invoke(0xBAFFD0_b, ""); // Com_ShutdownInternal + utils::hook::set(0x5EBED0_b, 0xC3); // ret + utils::hook::set(0xC69890_b, 0xC3); // ret game::SV_CmdsMP_StartMapForParty( - mapname->current.string, + map_name.data(), gametype->current.string, clients->current.integer, private_clients->current.integer, hardcore->current.enabled, false, false); + utils::hook::set(0xC69890_b, 0x48); // restore + utils::hook::set(0x5EBED0_b, 0x40); // restore } std::string get_dvar_string(const std::string& dvar) @@ -176,13 +179,12 @@ namespace party { command::execute(utils::string::va("ui_gametype %s", gametype->current.string), true); } - command::execute(utils::string::va("ui_mapname %s", mapname.data()), true); perform_game_initialization(); console::info("Starting map: %s\n", mapname.data()); - start_map_for_party(); + start_map_for_party(mapname); return; } @@ -248,6 +250,9 @@ namespace party utils::hook::set(0x1BBA700_b + 24, a3); utils::hook::set(0x1BBA700_b + 56, a3); + utils::hook::set(0xC562FD_b, 0xEB); // allow mapname to be changed while server is running + utils::hook::set(0x9B37B0_b, 0xC3); // CL_MainMp_PreloadMap ( map restart issue ) + // need to fix this, currently it will disconnect everyone from the server when a new map is rotated command::add("map", [](const command::params& args) { @@ -356,6 +361,11 @@ namespace party network::send(target, "infoResponse", info.build(), '\n'); }); + if (game::environment::is_dedi()) + { + return; + } + network::on("infoResponse", [](const game::netadr_s& target, const std::string_view& data) { const utils::info_string info{ data };