]> git.lizzy.rs Git - minetest.git/blobdiff - src/map.cpp
Fix crash when no world is selected and configure button is pressed.
[minetest.git] / src / map.cpp
index 3f18ef2e05260295b0e394c1b5156873519cbd05..6a058bb51f0237d7886f2c2e0de6e6727e4ed096 100644 (file)
@@ -1993,10 +1993,10 @@ void Map::removeNodeTimer(v3s16 p)
 /*
        ServerMap
 */
-
-ServerMap::ServerMap(std::string savedir, IGameDef *gamedef, EmergeManager *emerge):
+ServerMap::ServerMap(std::string savedir, IGameDef *gamedef):
        Map(dout_server, gamedef),
        m_seed(0),
+       m_emerge(NULL),
        m_map_metadata_changed(true),
        m_database(NULL),
        m_database_read(NULL),
@@ -2004,26 +2004,22 @@ ServerMap::ServerMap(std::string savedir, IGameDef *gamedef, EmergeManager *emer
 {
        verbosestream<<__FUNCTION_NAME<<std::endl;
 
-       m_emerge = emerge;
-
        //m_chunksize = 8; // Takes a few seconds
 
+       m_mgparams = MapgenParams::getParamsFromSettings(g_settings);
+       if (!m_mgparams)
+               m_mgparams = new MapgenV6Params();
+               
+       m_seed = m_mgparams->seed;
+
        if (g_settings->get("fixed_map_seed").empty())
        {
                m_seed = (((u64)(myrand()%0xffff)<<0)
                                + ((u64)(myrand()%0xffff)<<16)
                                + ((u64)(myrand()%0xffff)<<32)
                                + ((u64)(myrand()&0xffff)<<48));
+               m_mgparams->seed = m_seed;
        }
-       else
-       {
-               m_seed = g_settings->getU64("fixed_map_seed");
-       }
-       emerge->seed = m_seed;
-       emerge->water_level = g_settings->getS16("default_water_level");
-       //mapgen version
-       //chunksize
-       //noiseparams
 
        /*
                Experimental and debug stuff
@@ -2057,6 +2053,10 @@ ServerMap::ServerMap(std::string savedir, IGameDef *gamedef, EmergeManager *emer
                                        // Load map metadata (seed, chunksize)
                                        loadMapMeta();
                                }
+                               catch(SettingNotFoundException &e){
+                                       infostream<<"ServerMap:  Some metadata not found."
+                                                         <<" Using default settings."<<std::endl;
+                               }
                                catch(FileNotGoodException &e){
                                        infostream<<"WARNING: Could not load map metadata"
                                                        //<<" Disabling chunk-based generator."
@@ -3078,8 +3078,34 @@ void ServerMap::saveMapMeta()
        }
 
        Settings params;
-       params.setU64("seed", m_seed);
-       params.setS16("water_level", m_emerge->water_level);
+
+       params.set("mg_name", m_emerge->params->mg_name);
+
+       params.setU64("seed", m_emerge->params->seed);
+       params.setS16("water_level", m_emerge->params->water_level);
+       params.setS16("chunksize", m_emerge->params->chunksize);
+       params.setS32("mg_flags", m_emerge->params->flags);
+/*     switch (m_emerge->params->mg_version) {
+               case 6:
+               {*/
+                       MapgenV6Params *v6params = (MapgenV6Params *)m_emerge->params;
+
+                       params.setFloat("mgv6_freq_desert", v6params->freq_desert);
+                       params.setFloat("mgv6_freq_beach", v6params->freq_beach);
+                       params.setNoiseParams("mgv6_np_terrain_base",   v6params->np_terrain_base);
+                       params.setNoiseParams("mgv6_np_terrain_higher", v6params->np_terrain_higher);
+                       params.setNoiseParams("mgv6_np_steepness",      v6params->np_steepness);
+                       params.setNoiseParams("mgv6_np_height_select",  v6params->np_height_select);
+                       params.setNoiseParams("mgv6_np_trees",          v6params->np_trees);
+                       params.setNoiseParams("mgv6_np_mud",            v6params->np_mud);
+                       params.setNoiseParams("mgv6_np_beach",          v6params->np_beach);
+                       params.setNoiseParams("mgv6_np_biome",          v6params->np_biome);
+                       params.setNoiseParams("mgv6_np_cave",           v6params->np_cave);
+               /*      break;
+               }
+               default:
+                       ; //complain here
+       }*/
 
        params.writeLines(os);
 
@@ -3119,10 +3145,18 @@ void ServerMap::loadMapMeta()
                params.parseConfigLine(line);
        }
 
-       m_seed = params.getU64("seed");
-       m_emerge->seed        = m_seed;
-       m_emerge->water_level = params.getS16("water_level");
-       //m_emerge->np = ;
+       MapgenParams *mgparams = MapgenParams::getParamsFromSettings(&params);
+       if (mgparams) {
+               if (m_mgparams)
+                       delete m_mgparams;
+               m_mgparams = mgparams;
+               m_seed = mgparams->seed;
+       } else {
+               if (params.exists("seed")) {
+                       m_seed = params.getU64("seed");
+                       m_mgparams->seed = m_seed;
+               }
+       }
 
        verbosestream<<"ServerMap::loadMapMeta(): "<<"seed="<<m_seed<<std::endl;
 }