diff options
-rw-r--r-- | src/script/lua_api/l_mainmenu.cpp | 11 | ||||
-rw-r--r-- | src/server.cpp | 2 | ||||
-rw-r--r-- | src/settings.cpp | 12 | ||||
-rw-r--r-- | src/settings.h | 2 | ||||
-rw-r--r-- | src/subgame.cpp | 26 | ||||
-rw-r--r-- | src/subgame.h | 5 |
6 files changed, 38 insertions, 20 deletions
diff --git a/src/script/lua_api/l_mainmenu.cpp b/src/script/lua_api/l_mainmenu.cpp index e6fcdcf83..36b97b2d1 100644 --- a/src/script/lua_api/l_mainmenu.cpp +++ b/src/script/lua_api/l_mainmenu.cpp @@ -644,15 +644,12 @@ int ModApiMainMenu::l_create_world(lua_State *L) (gameidx < (int) games.size())) { // Create world if it doesn't exist - if(!initializeWorld(path, games[gameidx].id)){ + if (!loadGameConfAndInitWorld(path, games[gameidx])) { lua_pushstring(L, "Failed to initialize world"); - - } - else { - lua_pushnil(L); + } else { + lua_pushnil(L); } - } - else { + } else { lua_pushstring(L, "Invalid game index"); } return 1; diff --git a/src/server.cpp b/src/server.cpp index 235e802bb..52183980f 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -223,7 +223,7 @@ Server::Server( infostream<<"- game: "<<m_gamespec.path<<std::endl; // Create world if it doesn't exist - if(!initializeWorld(m_path_world, m_gamespec.id)) + if(!loadGameConfAndInitWorld(m_path_world, m_gamespec)) throw ServerError("Failed to initialize world"); // Create server thread diff --git a/src/settings.cpp b/src/settings.cpp index 594b8944d..c1d70714f 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -887,6 +887,11 @@ void Settings::clear() clearNoLock(); } +void Settings::clearDefaults() +{ + JMutexAutoLock lock(m_mutex); + clearDefaultsNoLock(); +} void Settings::updateValue(const Settings &other, const std::string &name) { @@ -958,11 +963,18 @@ void Settings::clearNoLock() delete it->second.group; m_settings.clear(); + clearDefaultsNoLock(); +} + +void Settings::clearDefaultsNoLock() +{ + std::map<std::string, SettingsEntry>::const_iterator it; for (it = m_defaults.begin(); it != m_defaults.end(); ++it) delete it->second.group; m_defaults.clear(); } + void Settings::registerChangedCallback(std::string name, setting_changed_callback cbf, void *userdata) { diff --git a/src/settings.h b/src/settings.h index 1a7d9ab96..48708f6cc 100644 --- a/src/settings.h +++ b/src/settings.h @@ -202,6 +202,7 @@ public: // remove a setting bool remove(const std::string &name); void clear(); + void clearDefaults(); void updateValue(const Settings &other, const std::string &name); void update(const Settings &other); void registerChangedCallback(std::string name, setting_changed_callback cbf, void *userdata = NULL); @@ -211,6 +212,7 @@ private: void updateNoLock(const Settings &other); void clearNoLock(); + void clearDefaultsNoLock(); void doCallbacks(std::string name); diff --git a/src/subgame.cpp b/src/subgame.cpp index a3edcda2e..864732876 100644 --- a/src/subgame.cpp +++ b/src/subgame.cpp @@ -267,25 +267,31 @@ std::vector<WorldSpec> getAvailableWorlds() return worlds; } -bool initializeWorld(const std::string &path, const std::string &gameid) +bool loadGameConfAndInitWorld(const std::string &path, const SubgameSpec &gamespec) { + // Override defaults with those provided by the game. + // We clear and reload the defaults because the defaults + // might have been overridden by other subgame config + // files that were loaded before. + g_settings->clearDefaults(); + set_default_settings(g_settings); + Settings game_defaults; + getGameMinetestConfig(gamespec.path, game_defaults); + override_default_settings(g_settings, &game_defaults); + infostream << "Initializing world at " << path << std::endl; fs::CreateAllDirs(path); - // Initialize default settings and override defaults with those - // provided by the game - Settings game_defaults; - getGameMinetestConfig(path, game_defaults); - override_default_settings(g_settings, &game_defaults); - // Create world.mt if does not already exist std::string worldmt_path = path + DIR_DELIM "world.mt"; if (!fs::PathExists(worldmt_path)) { std::ostringstream ss(std::ios_base::binary); - ss << "gameid = " << gameid << "\nbackend = sqlite3\n" - << "creative_mode = " << g_settings->get("creative_mode") - << "\nenable_damage = " << g_settings->get("enable_damage") << "\n"; + ss << "gameid = " << gamespec.id + << "\nbackend = sqlite3" + << "\ncreative_mode = " << g_settings->get("creative_mode") + << "\nenable_damage = " << g_settings->get("enable_damage") + << "\n"; if (!fs::safeWriteToFile(worldmt_path, ss.str())) return false; diff --git a/src/subgame.h b/src/subgame.h index 4b15faa8d..f3633ce2f 100644 --- a/src/subgame.h +++ b/src/subgame.h @@ -98,8 +98,9 @@ struct WorldSpec std::vector<WorldSpec> getAvailableWorlds(); -// Create world directory and world.mt if they don't exist -bool initializeWorld(const std::string &path, const std::string &gameid); +// loads the subgame's config and creates world directory +// and world.mt if they don't exist +bool loadGameConfAndInitWorld(const std::string &path, const SubgameSpec &gamespec); #endif |