From 0889048cb5241856189f54bc20015065857129f9 Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Sun, 12 May 2024 14:20:18 +0200 Subject: [PATCH] Add option for random mod load order (#14637) --- builtin/settingtypes.txt | 3 +++ src/content/mod_configuration.cpp | 10 ++++++++++ src/defaultsettings.cpp | 5 +++++ 3 files changed, 18 insertions(+) diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index 11dfbf128..9c2199676 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -1761,6 +1761,9 @@ deprecated_lua_api_handling (Deprecated Lua API handling) enum log none,log,erro # Enable random user input (only used for testing). random_input (Random input) bool false +# Enable random mod loading (mainly used for testing). +random_mod_load_order (Random mod load order) bool false + # Enable mod channels support. enable_mod_channels (Mod channels) bool false diff --git a/src/content/mod_configuration.cpp b/src/content/mod_configuration.cpp index 9e0461f56..47ad3e0dc 100644 --- a/src/content/mod_configuration.cpp +++ b/src/content/mod_configuration.cpp @@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "filesys.h" #include "gettext.h" #include "exceptions.h" +#include "util/numeric.h" std::string ModConfiguration::getUnsatisfiedModsError() const @@ -226,6 +227,15 @@ void ModConfiguration::resolveDependencies() modnames.insert(mod.name); } + // Step 1.5 (optional): shuffle unsatisfied mods so non declared depends get found by their devs + if (g_settings->getBool("random_mod_load_order")) { + MyRandGenerator rg; + std::shuffle(m_unsatisfied_mods.begin(), + m_unsatisfied_mods.end(), + rg + ); + } + // Step 2: get dependencies (including optional dependencies) // of each mod, split mods into satisfied and unsatisfied std::vector satisfied; diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 3e62a79e5..0ea4051b4 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -419,6 +419,11 @@ void set_default_settings() // Server settings->setDefault("disable_escape_sequences", "false"); settings->setDefault("strip_color_codes", "false"); +#ifndef NDEBUG + settings->setDefault("random_mod_load_order", "true"); +#else + settings->setDefault("random_mod_load_order", "false"); +#endif #if USE_PROMETHEUS settings->setDefault("prometheus_listener_address", "127.0.0.1:30000"); #endif