Biomes: Remove referenced biomes from Decorations on clear
authorkwolekr <kwolekr@minetest.net>
Fri, 17 Apr 2015 03:37:50 +0000 (23:37 -0400)
committerkwolekr <kwolekr@minetest.net>
Fri, 17 Apr 2015 03:38:05 +0000 (23:38 -0400)
src/gamedef.h
src/mapgen.h
src/mg_biome.cpp
src/mg_biome.h
src/script/lua_api/l_mapgen.cpp
src/server.h

index 793d85b39df07eb0c57d807d319f295ab00bb0ee..a5f6b596822842397e53b5e77c5e49d3cd7a0a6d 100644 (file)
@@ -31,6 +31,7 @@ class ISoundManager;
 class IShaderSource;
 class MtEventManager;
 class IRollbackManager;
+class EmergeManager;
 namespace irr { namespace scene {
        class IAnimatedMesh;
        class ISceneManager;
@@ -55,10 +56,10 @@ public:
        virtual ITextureSource* getTextureSource()=0;
 
        virtual IShaderSource* getShaderSource()=0;
-       
+
        // Used for keeping track of names/ids of unknown nodes
        virtual u16 allocateUnknownNodeId(const std::string &name)=0;
-       
+
        // Only usable on the client
        virtual ISoundManager* getSoundManager()=0;
        virtual MtEventManager* getEventManager()=0;
@@ -69,20 +70,24 @@ public:
        // Only usable on the server, and NOT thread-safe. It is usable from the
        // environment thread.
        virtual IRollbackManager* getRollbackManager(){return NULL;}
-       
+
+       // Only usable on the server. Thread safe if not written while running threads.
+       virtual EmergeManager *getEmergeManager() { return NULL; }
+
        // Used on the client
        virtual bool checkLocalPrivilege(const std::string &priv)
        { return false; }
-       
+
        // Shorthands
-       IItemDefManager* idef(){return getItemDefManager();}
-       INodeDefManager* ndef(){return getNodeDefManager();}
-       ICraftDefManager* cdef(){return getCraftDefManager();}
-       ITextureSource* tsrc(){return getTextureSource();}
-       ISoundManager* sound(){return getSoundManager();}
-       IShaderSource* shsrc(){return getShaderSource();}
-       MtEventManager* event(){return getEventManager();}
-       IRollbackManager* rollback(){return getRollbackManager();}
+       IItemDefManager  *idef()     { return getItemDefManager(); }
+       INodeDefManager  *ndef()     { return getNodeDefManager(); }
+       ICraftDefManager *cdef()     { return getCraftDefManager(); }
+       ITextureSource   *tsrc()     { return getTextureSource(); }
+       ISoundManager    *sound()    { return getSoundManager(); }
+       IShaderSource    *shsrc()    { return getShaderSource(); }
+       MtEventManager   *event()    { return getEventManager(); }
+       IRollbackManager *rollback() { return getRollbackManager();}
+       EmergeManager    *emerge()   { return getEmergeManager(); }
 };
 
 #endif
index 5ae99c3cdd2f66c6ce36a824c20f588d38942b47..ee7e8227e98162727cb3d80e025d37e99dea9626 100644 (file)
@@ -229,6 +229,8 @@ public:
        virtual ObjDef *getRaw(u32 index) const;
        virtual ObjDef *setRaw(u32 index, ObjDef *obj);
 
+       size_t getNumObjects() const { return m_objects.size(); }
+       ObjDefType getType() const { return m_objtype; }
        INodeDefManager *getNodeDef() const { return m_ndef; }
 
        u32 validateHandle(ObjDefHandle handle) const;
index c2040f542c8bcea9cd564b0cbd0a57df38dba3e1..854876545beec7d783ea793bb42b463ca0c5ee16 100644 (file)
@@ -18,6 +18,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 */
 
 #include "mg_biome.h"
+#include "mg_decoration.h"
+#include "emerge.h"
 #include "gamedef.h"
 #include "nodedef.h"
 #include "map.h" //for MMVManip
@@ -33,6 +35,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 BiomeManager::BiomeManager(IGameDef *gamedef) :
        ObjDefManager(gamedef, OBJDEF_BIOME)
 {
+       m_gamedef = gamedef;
+
        // Create default biome to be used in case none exist
        Biome *b = new Biome;
 
@@ -103,7 +107,16 @@ Biome *BiomeManager::getBiome(float heat, float humidity, s16 y)
 
 void BiomeManager::clear()
 {
+       EmergeManager *emerge = m_gamedef->getEmergeManager();
+
+       // Remove all dangling references in Decorations
+       DecorationManager *decomgr = emerge->decomgr;
+       for (size_t i = 0; i != decomgr->getNumObjects(); i++) {
+               Decoration *deco = (Decoration *)decomgr->getRaw(i);
+               deco->biomes.clear();
+       }
 
+       // Don't delete the first biome
        for (size_t i = 1; i < m_objects.size(); i++) {
                Biome *b = (Biome *)m_objects[i];
                delete b;
index a0ed30d6e401d6aa8c074739d102be033c74c6d6..46ae21959138a1fc3c2fd533b2fb24222a6a276b 100644 (file)
@@ -78,6 +78,9 @@ public:
        void calcBiomes(s16 sx, s16 sy, float *heat_map, float *humidity_map,
                s16 *height_map, u8 *biomeid_map);
        Biome *getBiome(float heat, float humidity, s16 y);
+
+private:
+       IGameDef *m_gamedef;
 };
 
 #endif
index 953d80538bf2db982fe989207b8e8b2bb50ae866..c2b461b438ae17b6fe39da973f8abcf1df3b7519 100644 (file)
@@ -1039,7 +1039,6 @@ int ModApiMapgen::l_create_schematic(lua_State *L)
        Schematic schem;
 
        Map *map = &(getEnv(L)->getMap());
-       INodeDefManager *ndef = getServer(L)->getNodeDefManager();
 
        v3s16 p1 = read_v3s16(L, 1);
        v3s16 p2 = read_v3s16(L, 2);
index da506acf132952e1dad897c78441b59955522553..ba993523b8f95ff7c9e88a979adf949e70017479 100644 (file)
@@ -297,9 +297,6 @@ public:
        // Envlock and conlock should be locked when using scriptapi
        GameScripting *getScriptIface(){ return m_script; }
 
-       //TODO: determine what (if anything) should be locked to access EmergeManager
-       EmergeManager *getEmergeManager(){ return m_emerge; }
-
        // actions: time-reversed list
        // Return value: success/failure
        bool rollbackRevertActions(const std::list<RollbackAction> &actions,
@@ -317,7 +314,7 @@ public:
        virtual MtEventManager* getEventManager();
        virtual scene::ISceneManager* getSceneManager();
        virtual IRollbackManager *getRollbackManager() { return m_rollback; }
-
+       virtual EmergeManager *getEmergeManager() { return m_emerge; }
 
        IWritableItemDefManager* getWritableItemDefManager();
        IWritableNodeDefManager* getWritableNodeDefManager();