Settings: Fix game minetest.conf flags overriding defaults (#9404)
authorSmallJoker <SmallJoker@users.noreply.github.com>
Mon, 17 Feb 2020 18:26:32 +0000 (19:26 +0100)
committerGitHub <noreply@github.com>
Mon, 17 Feb 2020 18:26:32 +0000 (19:26 +0100)
The game minetest.conf flags directly overwrote the global minetest.conf default values, resulting in unwanted erased mapgen flags.

* Fix set_mapgen_setting

src/content/subgames.cpp
src/defaultsettings.cpp
src/map_settings_manager.cpp
src/settings.cpp
src/settings.h

index 39cdc056f88ee11c4e75ff4c62ab193f01319393..bf947cf85396d677a977b5f6dfbdb8f4ec2b4da7 100644 (file)
@@ -23,7 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "settings.h"
 #include "log.h"
 #include "util/strfnd.h"
-#include "defaultsettings.h" // for override_default_settings
+#include "defaultsettings.h" // for set_default_settings
 #include "mapgen/mapgen.h"   // for MapgenParams
 #include "util/string.h"
 
@@ -298,7 +298,7 @@ bool loadGameConfAndInitWorld(const std::string &path, const SubgameSpec &gamesp
        set_default_settings(g_settings);
        Settings game_defaults;
        getGameMinetestConfig(gamespec.path, game_defaults);
-       override_default_settings(g_settings, &game_defaults);
+       g_settings->overrideDefaults(&game_defaults);
 
        infostream << "Initializing world at " << path << std::endl;
 
index 754ce3547e2c97586040b3fb226e0fbac3667921..b6e385a90cecfed673afba324dc88bc6e5cc9059 100644 (file)
@@ -498,10 +498,3 @@ void set_default_settings(Settings *settings)
 #endif
 }
 
-void override_default_settings(Settings *settings, Settings *from)
-{
-       std::vector<std::string> names = from->getNames();
-       for (const auto &name : names) {
-               settings->setDefault(name, from->get(name));
-       }
-}
index a0ff1c754f7d9c85414b7fbb4b8f8eac6c1468bc..7ef4bf12e30e160caf69bff7b42e64918d816db7 100644 (file)
@@ -32,6 +32,7 @@ MapSettingsManager::MapSettingsManager(Settings *user_settings,
        m_user_settings(user_settings)
 {
        assert(m_user_settings != NULL);
+       Mapgen::setDefaultSettings(m_map_settings);
 }
 
 
index 3728fabf23007287bf225046124f1c9f81499e2e..55404319e8f9615a6f57b2ec5bdb42c9d41f38d6 100644 (file)
@@ -1048,6 +1048,30 @@ void Settings::setDefault(const std::string &name, const FlagDesc *flagdesc,
        setDefault(name, writeFlagString(flags, flagdesc, U32_MAX));
 }
 
+void Settings::overrideDefaults(Settings *other)
+{
+       for (const auto &setting : other->m_settings) {
+               if (setting.second.is_group) {
+                       setGroupDefault(setting.first, setting.second.group);
+                       continue;
+               }
+               const FlagDesc *flagdesc = getFlagDescFallback(setting.first);
+               if (flagdesc) {
+                       // Flags cannot be copied directly.
+                       // 1) Get the current set flags
+                       u32 flags = getFlagStr(setting.first, flagdesc, nullptr);
+                       // 2) Set the flags as defaults
+                       other->setDefault(setting.first, flagdesc, flags);
+                       // 3) Get the newly set flags and override the default setting value
+                       setDefault(setting.first, flagdesc,
+                               other->getFlagStr(setting.first, flagdesc, nullptr));
+                       continue;
+               }
+               // Also covers FlagDesc settings
+               setDefault(setting.first, setting.second.value);
+       }
+}
+
 const FlagDesc *Settings::getFlagDescFallback(const std::string &name) const
 {
        auto it = m_flags.find(name);
index b42e36d109bbe5026a208f563d974385bf853074..0c9a155db4f0ac258259166a13f8a3311490db65 100644 (file)
@@ -222,6 +222,8 @@ public:
         **************/
 
        void setDefault(const std::string &name, const FlagDesc *flagdesc, u32 flags);
+       // Takes the provided setting values and uses them as new defaults
+       void overrideDefaults(Settings *other);
        const FlagDesc *getFlagDescFallback(const std::string &name) const;
 
        void registerChangedCallback(const std::string &name,