]> git.lizzy.rs Git - minetest.git/blobdiff - src/map.cpp
Fix EmergeThread hang on exit
[minetest.git] / src / map.cpp
index 3f18ef2e05260295b0e394c1b5156873519cbd05..7eb45463f7a2ab1e035c21906d1aadfbac7d415f 100644 (file)
@@ -1,6 +1,6 @@
 /*
-Minetest-c55
-Copyright (C) 2010-2011 celeron55, Perttu Ahola <celeron55@gmail.com>
+Minetest
+Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU Lesser General Public License as published by
@@ -33,6 +33,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "gamedef.h"
 #include "util/directiontables.h"
 #include "rollback_interface.h"
+#include "emerge.h"
+#include "mapgen_v6.h"
 
 #define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")"
 
@@ -1993,7 +1995,6 @@ void Map::removeNodeTimer(v3s16 p)
 /*
        ServerMap
 */
-
 ServerMap::ServerMap(std::string savedir, IGameDef *gamedef, EmergeManager *emerge):
        Map(dout_server, gamedef),
        m_seed(0),
@@ -2005,25 +2006,20 @@ 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 = m_emerge->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));
-       }
-       else
-       {
-               m_seed = g_settings->getU64("fixed_map_seed");
+               m_seed = (((u64)(myrand() & 0xffff) << 0)
+                               | ((u64)(myrand() & 0xffff) << 16)
+                               | ((u64)(myrand() & 0xffff) << 32)
+                               | ((u64)(myrand() & 0xffff) << 48));
+               m_mgparams->seed = m_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,9 +3078,8 @@ void ServerMap::saveMapMeta()
        }
 
        Settings params;
-       params.setU64("seed", m_seed);
-       params.setS16("water_level", m_emerge->water_level);
 
+       m_emerge->setParamsToSettings(&params);
        params.writeLines(os);
 
        os<<"[end_of_params]\n";
@@ -3119,10 +3118,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 = m_emerge->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;
 }