From a83671b105749f882e1c99499c04cb10f9f13b96 Mon Sep 17 00:00:00 2001 From: m Date: Mon, 25 Dec 2023 09:24:46 -0600 Subject: [PATCH 1/6] small team balance fix --- data/cdata/scripts/mp/team_balance.gsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/data/cdata/scripts/mp/team_balance.gsc b/data/cdata/scripts/mp/team_balance.gsc index 759aceb2..bf9685da 100644 --- a/data/cdata/scripts/mp/team_balance.gsc +++ b/data/cdata/scripts/mp/team_balance.gsc @@ -22,6 +22,8 @@ set_team(team) self suicide(); } - maps\mp\gametypes\_menus::addtoteam(team); - maps\mp\gametypes\_menus::endrespawnnotify(); + self maps\mp\gametypes\_menus::addtoteam(team); + self maps\mp\gametypes\_menus::endrespawnnotify(); + + self maps\mp\gametypes\_teams::updateteamtime(); // defines pers["teamTime"] for balancing } From 2554846b3048e71a6262aeebb4ae132c55a22d87 Mon Sep 17 00:00:00 2001 From: m Date: Mon, 25 Dec 2023 10:36:38 -0600 Subject: [PATCH 2/6] use score to balance according to a server owner, the "teamTime" persistent variable isn't defined when a player joins a new team. not sure why because GSC dumps reveal it should be just fine, but just in case, just sort by score instead. --- data/cdata/scripts/mp/team_balance.gsc | 72 +++++++++++++++++++++++--- 1 file changed, 65 insertions(+), 7 deletions(-) diff --git a/data/cdata/scripts/mp/team_balance.gsc b/data/cdata/scripts/mp/team_balance.gsc index bf9685da..37e9b798 100644 --- a/data/cdata/scripts/mp/team_balance.gsc +++ b/data/cdata/scripts/mp/team_balance.gsc @@ -1,11 +1,71 @@ -init() +main() { - // define the auto balance string in the game array (referenced in gsc dump, but not defined past IW6?) precachestring(&"MP_AUTOBALANCE_NOW"); - game["strings"]["autobalance"] = &"MP_AUTOBALANCE_NOW"; - // define onteamselection callback function used in balanceteams() - level.onteamselection = ::set_team; + // use player's score to balance instead player's time on team + replacefunc(maps\mp\gametypes\_teams::balanceteams, ::balance_teams_stub); +} + +balance_teams_stub() +{ + iprintlnbold(&"MP_AUTOBALANCE_NOW"); + + allied_players = get_valid_team_array("allies"); + axis_players = get_valid_team_array("axis"); + while (is_team_bigger_than(allied_players, axis_players) || is_team_bigger_than(axis_players, allied_players)) + { + if (is_team_bigger_than(allied_players, axis_players)) + { + handle_lowest_score_player(allied_players, "axis"); + } + else if (is_team_bigger_than(axis_players, team)) + { + handle_lowest_score_player(axis_players, "allies"); + } + + // refresh array for loop + allied_players = get_valid_team_array("allies"); + axis_players = get_valid_team_array("axis"); + } +} + +get_valid_team_array(team) +{ + team_array = []; + players = level.players; + for (i = 0; i < players.size; i++) + { + if (!isdefined(players[i].pers["score"])) // was teamTime + continue; + + if (isdefined(players[i].pers["team"]) && players[i].pers["team"] == team) + team_array[team_array.size] = players[i]; + } + return team_arary; +} + +is_team_bigger_than(team_one, team_two) +{ + return (team_one.size > (team_two.size + 1)); +} + +handle_lowest_score_player(team, new_team) +{ + lowest_score_player = undefined; + + // move the player that has the lowest score (highest teamTime value) + for (i = 0; i < team.size; i++) + { + if (isdefined(team[j].dont_auto_balance)) + continue; + + if (!isdefined(lowest_score_player)) + lowest_score_player = team[j]; + else if (team[j].pers["score"] < lowest_score_player.pers["score"]) + lowest_score_player = team[j]; + } + + lowest_score_player set_team(new_team); } set_team(team) @@ -24,6 +84,4 @@ set_team(team) self maps\mp\gametypes\_menus::addtoteam(team); self maps\mp\gametypes\_menus::endrespawnnotify(); - - self maps\mp\gametypes\_teams::updateteamtime(); // defines pers["teamTime"] for balancing } From 8def7b71d9791840f75258ffeba25a41c3348250 Mon Sep 17 00:00:00 2001 From: quaK Date: Tue, 26 Dec 2023 01:59:19 +0200 Subject: [PATCH 3/6] Fixes --- src/client/component/branding.cpp | 7 ++--- src/client/component/fastfiles.cpp | 46 +++++++++++++++++------------ src/client/component/imagefiles.cpp | 4 ++- src/client/component/lui.cpp | 5 ++++ src/client/game/structs.hpp | 6 ++++ src/client/main.cpp | 1 - 6 files changed, 43 insertions(+), 26 deletions(-) diff --git a/src/client/component/branding.cpp b/src/client/component/branding.cpp index 8e6b6512..9bd096d4 100644 --- a/src/client/component/branding.cpp +++ b/src/client/component/branding.cpp @@ -61,11 +61,6 @@ namespace branding class component final : public component_interface { public: - void post_start() override - { - scheduler::loop(draw_branding, scheduler::pipeline::renderer); - } - void post_unpack() override { if (game::environment::is_dedi()) @@ -73,6 +68,8 @@ namespace branding return; } + scheduler::loop(draw_branding, scheduler::pipeline::renderer); + ui_get_formatted_build_number_hook.create( SELECT_VALUE(0x406EC0_b, 0x1DF300_b), ui_get_formatted_build_number_stub); } diff --git a/src/client/component/fastfiles.cpp b/src/client/component/fastfiles.cpp index 36e04289..885a056e 100644 --- a/src/client/component/fastfiles.cpp +++ b/src/client/component/fastfiles.cpp @@ -22,6 +22,7 @@ namespace fastfiles namespace { + utils::hook::detour db_init_load_x_file_hook; utils::hook::detour db_try_load_x_file_internal_hook; utils::hook::detour db_find_xasset_header_hook; @@ -31,9 +32,14 @@ namespace fastfiles utils::concurrency::container> fastfile_handles; bool is_mod_pre_gfx = false; + void db_init_load_x_file_stub(game::DBFile* file, std::uint64_t offset) + { + console::info("Loading fastfile %s\n", file->name); + return db_init_load_x_file_hook.invoke(file, offset); + } + void db_try_load_x_file_internal(const char* zone_name, const int flags) { - console::info("Loading fastfile %s\n", zone_name); is_mod_pre_gfx = zone_name == "mod_pre_gfx"s; current_fastfile.access([&](std::string& fastfile) { @@ -74,30 +80,32 @@ namespace fastfiles dump_gsc_script(name, result); } - const std::string override_asset_name = "override/"s + name; - - if (type == game::XAssetType::ASSET_TYPE_RAWFILE) { - if (result.rawfile) + const std::string override_asset_name = "override/"s + name; + + if (type == game::XAssetType::ASSET_TYPE_RAWFILE) { - const auto override_rawfile = db_find_xasset_header_hook.invoke(type, override_asset_name.data(), 0); - if (override_rawfile.rawfile) + if (result.rawfile) { - result.rawfile = override_rawfile.rawfile; - console::debug("using override asset for rawfile: \"%s\"\n", name); + const auto override_rawfile = db_find_xasset_header_hook.invoke(type, override_asset_name.data(), 0); + if (override_rawfile.rawfile) + { + result.rawfile = override_rawfile.rawfile; + console::debug("using override asset for rawfile: \"%s\"\n", name); + } } } - } - if (type == game::XAssetType::ASSET_TYPE_STRINGTABLE) - { - if (result.stringTable) + if (type == game::XAssetType::ASSET_TYPE_STRINGTABLE) { - const auto override_stringtable = db_find_xasset_header_hook.invoke(type, override_asset_name.data(), 0); - if (override_stringtable.stringTable) + if (result.stringTable) { - result.stringTable = override_stringtable.stringTable; - console::debug("using override asset for stringtable: \"%s\"\n", name); + const auto override_stringtable = db_find_xasset_header_hook.invoke(type, override_asset_name.data(), 0); + if (override_stringtable.stringTable) + { + result.stringTable = override_stringtable.stringTable; + console::debug("using override asset for stringtable: \"%s\"\n", name); + } } } } @@ -1193,8 +1201,8 @@ namespace fastfiles public: void post_unpack() override { - db_try_load_x_file_internal_hook.create( - SELECT_VALUE(0x1F5700_b, 0x39A620_b), &db_try_load_x_file_internal); + db_try_load_x_file_internal_hook.create(SELECT_VALUE(0x1F5700_b, 0x39A620_b), db_try_load_x_file_internal); + db_init_load_x_file_hook.create(SELECT_VALUE(0x1C46E0_b, 0x3681E0_b), db_init_load_x_file_stub); db_find_xasset_header_hook.create(game::DB_FindXAssetHeader, db_find_xasset_header_stub); db_unload_x_zones_hook.create(SELECT_VALUE(0x1F6040_b, diff --git a/src/client/component/imagefiles.cpp b/src/client/component/imagefiles.cpp index bd1cdf72..27544e97 100644 --- a/src/client/component/imagefiles.cpp +++ b/src/client/component/imagefiles.cpp @@ -136,8 +136,10 @@ namespace imagefiles } void* pakfile_open_stub(void* /*handles*/, unsigned int count, int is_imagefile, - unsigned int index, int is_localized) + unsigned int index, short is_localized) { + console::debug("Opening %s%d.pak (localized:%d)\n", is_imagefile ? "imagefile" : "soundfile", index, is_localized); + if (index != CUSTOM_IMAGE_FILE_INDEX) { return utils::hook::invoke( diff --git a/src/client/component/lui.cpp b/src/client/component/lui.cpp index 4fd77f6d..a310afb5 100644 --- a/src/client/component/lui.cpp +++ b/src/client/component/lui.cpp @@ -46,6 +46,11 @@ namespace lui public: void post_unpack() override { + if (game::environment::is_dedi()) + { + return; + } + if (game::environment::is_mp()) { // Patch game message overflow diff --git a/src/client/game/structs.hpp b/src/client/game/structs.hpp index f2f57509..b4fe687b 100644 --- a/src/client/game/structs.hpp +++ b/src/client/game/structs.hpp @@ -2418,6 +2418,12 @@ namespace game DB_AuthSignature signature; }; + struct DBFile + { + char __pad0[32]; + char name[64]; + }; + namespace hks { struct lua_State; diff --git a/src/client/main.cpp b/src/client/main.cpp index 97e4d7e1..bd65eadf 100644 --- a/src/client/main.cpp +++ b/src/client/main.cpp @@ -158,7 +158,6 @@ FARPROC load_binary(const launcher::mode mode, uint64_t* base_address) void remove_crash_file() { utils::io::remove_file("__h1Exe"); - utils::io::remove_file("h1-mod\\h1_mp64_ship.exe"); // remove this at some point } void enable_dpi_awareness() From ac3893d0922582da0068118ab6e1d3d5f103988c Mon Sep 17 00:00:00 2001 From: m Date: Tue, 26 Dec 2023 01:51:05 -0600 Subject: [PATCH 4/6] fix blank popup --- src/client/component/party.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/client/component/party.cpp b/src/client/component/party.cpp index 0ccf100b..b1dda51f 100644 --- a/src/client/component/party.cpp +++ b/src/client/component/party.cpp @@ -1144,6 +1144,8 @@ namespace party return; } + server_connection_state.base_url = info.get("sv_wwwBaseUrl"); + if (download_files(target, info, false)) { return; @@ -1151,7 +1153,6 @@ namespace party server_connection_state.motd = info.get("sv_motd"); server_connection_state.max_clients = std::stoi(info.get("sv_maxclients")); - server_connection_state.base_url = info.get("sv_wwwBaseUrl"); discord_information discord_info{}; discord_info.image = info.get("sv_discordImageUrl"); From d0110ee58c3129e15443efebd95a04386785ef6c Mon Sep 17 00:00:00 2001 From: quaK Date: Sat, 30 Dec 2023 08:24:26 +0200 Subject: [PATCH 5/6] Fix --- src/client/component/gsc/script_loading.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/component/gsc/script_loading.cpp b/src/client/component/gsc/script_loading.cpp index ab24a55b..5a8946e7 100644 --- a/src/client/component/gsc/script_loading.cpp +++ b/src/client/component/gsc/script_loading.cpp @@ -35,7 +35,7 @@ namespace gsc std::unordered_map init_handles; utils::memory::allocator scriptfile_allocator; - std::unordered_map loaded_scripts; + std::unordered_map loaded_scripts; struct { From 6e88c564203de3b7ec6d5693d11b225dcf133d11 Mon Sep 17 00:00:00 2001 From: m Date: Sat, 6 Jan 2024 15:01:45 -0600 Subject: [PATCH 6/6] fix team balance gsc --- data/cdata/scripts/mp/team_balance.gsc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/data/cdata/scripts/mp/team_balance.gsc b/data/cdata/scripts/mp/team_balance.gsc index 37e9b798..481b3ba0 100644 --- a/data/cdata/scripts/mp/team_balance.gsc +++ b/data/cdata/scripts/mp/team_balance.gsc @@ -18,7 +18,7 @@ balance_teams_stub() { handle_lowest_score_player(allied_players, "axis"); } - else if (is_team_bigger_than(axis_players, team)) + else if (is_team_bigger_than(axis_players, allied_players)) { handle_lowest_score_player(axis_players, "allies"); } @@ -41,7 +41,7 @@ get_valid_team_array(team) if (isdefined(players[i].pers["team"]) && players[i].pers["team"] == team) team_array[team_array.size] = players[i]; } - return team_arary; + return team_array; } is_team_bigger_than(team_one, team_two) @@ -56,13 +56,13 @@ handle_lowest_score_player(team, new_team) // move the player that has the lowest score (highest teamTime value) for (i = 0; i < team.size; i++) { - if (isdefined(team[j].dont_auto_balance)) + if (isdefined(team[i].dont_auto_balance)) continue; if (!isdefined(lowest_score_player)) - lowest_score_player = team[j]; - else if (team[j].pers["score"] < lowest_score_player.pers["score"]) - lowest_score_player = team[j]; + lowest_score_player = team[i]; + else if (team[i].pers["score"] < lowest_score_player.pers["score"]) + lowest_score_player = team[i]; } lowest_score_player set_team(new_team);