diff --git a/src/script/lua_api/l_mainmenu.cpp b/src/script/lua_api/l_mainmenu.cpp index e6fcdcf8..36b97b2d 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 235e802b..52183980 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -223,7 +223,7 @@ Server::Server( infostream<<"- game: "<second.group; m_settings.clear(); + clearDefaultsNoLock(); +} + +void Settings::clearDefaultsNoLock() +{ + std::map::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 1a7d9ab9..48708f6c 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 a3edcda2..86473287 100644 --- a/src/subgame.cpp +++ b/src/subgame.cpp @@ -267,25 +267,31 @@ std::vector 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 4b15faa8..f3633ce2 100644 --- a/src/subgame.h +++ b/src/subgame.h @@ -98,8 +98,9 @@ struct WorldSpec std::vector 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