diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/defaultsettings.cpp | 2 | ||||
-rw-r--r-- | src/main.cpp | 152 | ||||
-rw-r--r-- | src/subgame.cpp | 15 | ||||
-rw-r--r-- | src/subgame.h | 1 |
4 files changed, 140 insertions, 30 deletions
diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index a777ed736..5d4c969e3 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -101,7 +101,7 @@ void set_default_settings(Settings *settings) // Server stuff // "map-dir" doesn't exist by default. - settings->setDefault("default_game", "mesetint"); + settings->setDefault("default_game", "minetest"); settings->setDefault("motd", ""); settings->setDefault("max_users", "100"); settings->setDefault("strict_protocol_version_checking", "true"); diff --git a/src/main.cpp b/src/main.cpp index fe1bcd450..41b62b1dd 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -739,6 +739,20 @@ void SpeedTests() } } +static void print_worldspecs(const std::vector<WorldSpec> &worldspecs, + std::ostream &os) +{ + for(u32 i=0; i<worldspecs.size(); i++){ + std::string name = worldspecs[i].name; + std::string path = worldspecs[i].path; + if(name.find(" ") != std::string::npos) + name = std::string("'") + name + "'"; + path = std::string("'") + path + "'"; + name = padStringRight(name, 14); + os<<" "<<name<<" "<<path<<std::endl; + } +} + int main(int argc, char *argv[]) { int retval = 0; @@ -777,6 +791,8 @@ int main(int argc, char *argv[]) "Same as --world (deprecated)")); allowed_options.insert("world", ValueSpec(VALUETYPE_STRING, "Set world path (implies local game)")); + allowed_options.insert("worldname", ValueSpec(VALUETYPE_STRING, + "Set world by name (implies local game)")); allowed_options.insert("info", ValueSpec(VALUETYPE_FLAG, "Print more information to console")); allowed_options.insert("verbose", ValueSpec(VALUETYPE_FLAG, @@ -894,7 +910,7 @@ int main(int argc, char *argv[]) } // Print startup message - actionstream<<PROJECT_NAME<< + infostream<<PROJECT_NAME<< " with SER_FMT_VER_HIGHEST="<<(int)SER_FMT_VER_HIGHEST <<", "<<BUILD_INFO <<std::endl; @@ -991,11 +1007,16 @@ int main(int argc, char *argv[]) commanded_world = cmd_args.get("world"); else if(cmd_args.exists("map-dir")) commanded_world = cmd_args.get("map-dir"); - else if(cmd_args.exists("nonopt0")) + else if(cmd_args.exists("nonopt0")) // First nameless argument commanded_world = cmd_args.get("nonopt0"); else if(g_settings->exists("map-dir")) commanded_world = g_settings->get("map-dir"); + // World name + std::string commanded_worldname = ""; + if(cmd_args.exists("worldname")) + commanded_worldname = cmd_args.get("worldname"); + // Strip world.mt from commanded_world { std::string worldmt = "world.mt"; @@ -1037,21 +1058,74 @@ int main(int argc, char *argv[]) // World directory std::string world_path; + verbosestream<<"Determining world path"<<std::endl; bool is_legacy_world = false; + // If a world was commanded, use it if(commanded_world != ""){ world_path = commanded_world; + infostream<<"Using commanded world path ["<<world_path<<"]" + <<std::endl; + } + // If a world name was specified, select it + else if(commanded_worldname != ""){ + // Get information about available worlds + std::vector<WorldSpec> worldspecs = getAvailableWorlds(); + world_path = ""; + for(u32 i=0; i<worldspecs.size(); i++){ + std::string name = worldspecs[i].name; + if(name == commanded_worldname){ + world_path = worldspecs[i].path; + break; + } + } + if(world_path == ""){ + dstream<<"World '"<<commanded_worldname<<"' not " + <<"available. Available worlds:"<<std::endl; + print_worldspecs(worldspecs, dstream); + return 1; + } } - else{ - // No specific world was commanded - // Check if the world is found from the default directory, and if - // not, see if the legacy world directory exists. - world_path = porting::path_user + DIR_DELIM + "worlds" + DIR_DELIM + "world"; - std::string legacy_world_path = porting::path_user + DIR_DELIM + "world"; - if(!fs::PathExists(world_path) && fs::PathExists(legacy_world_path)){ - errorstream<<"Warning: Using legacy world directory \"" - <<legacy_world_path<<"\""<<std::endl; - world_path = legacy_world_path; - is_legacy_world = true; + // No world was specified; try to select it automatically + else + { + // Get information about available worlds + std::vector<WorldSpec> worldspecs = getAvailableWorlds(); + // If a world name was specified, select it + if(commanded_worldname != ""){ + world_path = ""; + for(u32 i=0; i<worldspecs.size(); i++){ + std::string name = worldspecs[i].name; + if(name == commanded_worldname){ + world_path = worldspecs[i].path; + break; + } + } + if(world_path == ""){ + dstream<<"World '"<<commanded_worldname<<"' not " + <<"available. Available worlds:"<<std::endl; + print_worldspecs(worldspecs, dstream); + return 1; + } + } + // If there is only a single world, use it + if(worldspecs.size() == 1){ + world_path = worldspecs[0].path; + dstream<<"Automatically selecting world at [" + <<world_path<<"]"<<std::endl; + // If there are multiple worlds, list them + } else if(worldspecs.size() > 1){ + dstream<<"Multiple worlds are available."<<std::endl; + dstream<<"Please select one using --worldname <name>" + <<" or --world <path>"<<std::endl; + print_worldspecs(worldspecs, dstream); + return 1; + // If there are no worlds, automatically create a new one + } else { + // This is the ultimate default world path + world_path = porting::path_user + DIR_DELIM + "worlds" + + DIR_DELIM + "world"; + infostream<<"Creating default world at [" + <<world_path<<"]"<<std::endl; } } @@ -1059,25 +1133,49 @@ int main(int argc, char *argv[]) errorstream<<"No world path specified or found."<<std::endl; return 1; } + verbosestream<<"Using world path ["<<world_path<<"]"<<std::endl; - // Gamespec - std::string world_gameid = getWorldGameId(world_path, is_legacy_world); - SubgameSpec gamespec = findSubgame(world_gameid); - if(commanded_gamespec.isValid() && - commanded_gamespec.id != world_gameid){ - errorstream<<"WARNING: Overriding gameid from \"" - <<world_gameid<<"\" to \"" - <<commanded_gamespec.id<<"\""<<std::endl; - gamespec = commanded_gamespec; + // We need a gameid. + std::string gameid; + verbosestream<<"Determining gameid"<<std::endl; + // If world doesn't exist + if(!getWorldExists(world_path)) + { + // Try to take gamespec from command line + if(commanded_gamespec.isValid()){ + gameid = commanded_gamespec.id; + infostream<<"Using commanded gameid ["<<gameid<<"]"<<std::endl; + } + // Otherwise we will be using "minetest" + else{ + gameid = g_settings->get("default_game"); + infostream<<"Using default gameid ["<<gameid<<"]"<<std::endl; + } } - + // If world exists + else + { + // Otherwise read from the world + std::string world_gameid = getWorldGameId(world_path, is_legacy_world); + gameid = world_gameid; + if(commanded_gamespec.isValid() && + commanded_gamespec.id != world_gameid){ + gameid = commanded_gamespec.id; + errorstream<<"WARNING: Using commanded gameid ["<<gameid<<"]" + <<" instead of world gameid ["<<world_gameid + <<"]"<<std::endl; + } else{ + infostream<<"Using world gameid ["<<gameid<<"]"<<std::endl; + } + } + verbosestream<<"Finding subgame ["<<gameid<<"]"<<std::endl; + SubgameSpec gamespec = findSubgame(gameid); if(!gamespec.isValid()){ - errorstream<<"Invalid gamespec. (world_gameid=" - <<world_gameid<<")"<<std::endl; + errorstream<<"Subgame ["<<gameid<<"] could not be found." + <<std::endl; return 1; } - - infostream<<"Using gamespec \""<<gamespec.id<<"\""<<std::endl; + verbosestream<<"Using gameid ["<<gamespec.id<<"]"<<std::endl; // Create server Server server(world_path, configpath, gamespec, false); diff --git a/src/subgame.cpp b/src/subgame.cpp index 3d4480ebf..d7668b0e5 100644 --- a/src/subgame.cpp +++ b/src/subgame.cpp @@ -78,7 +78,13 @@ std::vector<SubgameSpec> getAvailableGames() return specs; } -#define LEGACY_GAMEID "mesetint" +#define LEGACY_GAMEID "minetest" + +bool getWorldExists(const std::string &world_path) +{ + return (fs::PathExists(world_path + DIR_DELIM + "map_meta.txt") || + fs::PathExists(world_path + DIR_DELIM + "world.mt")); +} std::string getWorldGameId(const std::string &world_path, bool can_be_legacy) { @@ -95,6 +101,9 @@ std::string getWorldGameId(const std::string &world_path, bool can_be_legacy) } if(!conf.exists("gameid")) return ""; + // The "mesetint" gameid has been discarded + if(conf.get("gameid") == "mesetint") + return "minetest"; return conf.get("gameid"); } @@ -113,7 +122,9 @@ std::vector<WorldSpec> getAvailableWorlds() continue; std::string fullpath = *i + DIR_DELIM + dirvector[j].name; std::string name = dirvector[j].name; - std::string gameid = getWorldGameId(fullpath); + // Just allow filling in the gameid always for now + bool can_be_legacy = true; + std::string gameid = getWorldGameId(fullpath, can_be_legacy); WorldSpec spec(fullpath, name, gameid); if(!spec.isValid()){ infostream<<"(invalid: "<<name<<") "; diff --git a/src/subgame.h b/src/subgame.h index 061bb4180..49e526d76 100644 --- a/src/subgame.h +++ b/src/subgame.h @@ -52,6 +52,7 @@ SubgameSpec findSubgame(const std::string &id); std::set<std::string> getAvailableGameIds(); std::vector<SubgameSpec> getAvailableGames(); +bool getWorldExists(const std::string &world_path); std::string getWorldGameId(const std::string &world_path, bool can_be_legacy=false); |