From c8fc47b1c7525eb41ce26726d80d05eef0850011 Mon Sep 17 00:00:00 2001 From: Dario Date: Fri, 24 Jan 2025 23:11:04 -0300 Subject: [PATCH] Enable new mods by default. --- librecomp/src/mods.cpp | 46 ++++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/librecomp/src/mods.cpp b/librecomp/src/mods.cpp index 070b0c7..b0febf8 100644 --- a/librecomp/src/mods.cpp +++ b/librecomp/src/mods.cpp @@ -828,31 +828,33 @@ std::vector recomp::mods::ModContext::scan_mo void recomp::mods::ModContext::load_mods_config() { std::unordered_set config_enabled_mods; std::vector config_mod_order; - bool parsed = parse_mods_config(mods_config_path, config_enabled_mods, config_mod_order); - if (parsed) { - for (const std::string &mod_id : config_enabled_mods) { - enable_mod(mod_id, true, false); + std::vector opened_mod_is_known; + parse_mods_config(mods_config_path, config_enabled_mods, config_mod_order); + + // Fill a vector with the relative order of the mods. Existing mods will get ordered below new mods. + std::vector sort_order; + sort_order.resize(opened_mods.size()); + opened_mod_is_known.resize(opened_mods.size(), false); + std::iota(sort_order.begin(), sort_order.end(), 0); + for (size_t i = 0; i < config_mod_order.size(); i++) { + auto it = opened_mods_by_id.find(config_mod_order[i]); + if (it != opened_mods_by_id.end()) { + sort_order[it->second] = opened_mods.size() + i; + opened_mod_is_known[it->second] = true; } + } - { - std::unique_lock lock(opened_mods_mutex); + // Run the sort using the relative order computed before. + std::iota(opened_mods_order.begin(), opened_mods_order.end(), 0); + std::sort(opened_mods_order.begin(), opened_mods_order.end(), [&](size_t i, size_t j) { + return sort_order[i] < sort_order[j]; + }); - // Fill a vector with the relative order of the mods. Existing mods will get ordered below new mods. - std::vector sort_order; - sort_order.resize(opened_mods.size()); - std::iota(sort_order.begin(), sort_order.end(), 0); - for (size_t i = 0; i < config_mod_order.size(); i++) { - auto it = opened_mods_by_id.find(config_mod_order[i]); - if (it != opened_mods_by_id.end()) { - sort_order[it->second] = opened_mods.size() + i; - } - } - - // Run the sort using the relative order computed before. - std::iota(opened_mods_order.begin(), opened_mods_order.end(), 0); - std::sort(opened_mods_order.begin(), opened_mods_order.end(), [&](size_t i, size_t j) { - return sort_order[i] < sort_order[j]; - }); + // Enable mods that are specified in the configuration or mods that are considered new. + for (size_t i = 0; i < opened_mods.size(); i++) { + const std::string &mod_id = opened_mods[i].manifest.mod_id; + if (!opened_mod_is_known[i] || (config_enabled_mods.find(mod_id) != config_enabled_mods.end())) { + enable_mod(mod_id, true, false); } } }