Schematics: Remove referenced schematics from Decorations on clear
authorkwolekr <kwolekr@minetest.net>
Fri, 17 Apr 2015 04:52:48 +0000 (00:52 -0400)
committerkwolekr <kwolekr@minetest.net>
Fri, 17 Apr 2015 04:53:05 +0000 (00:53 -0400)
src/mg_biome.h
src/mg_decoration.cpp
src/mg_decoration.h
src/mg_ore.h
src/mg_schematic.cpp
src/mg_schematic.h

index 46ae21959138a1fc3c2fd533b2fb24222a6a276b..ce5ce2f0a9edd2073e644d69f5991aef2fe7f665 100644 (file)
@@ -61,7 +61,7 @@ public:
        static const char *OBJECT_TITLE;
 
        BiomeManager(IGameDef *gamedef);
-       ~BiomeManager();
+       virtual ~BiomeManager();
 
        const char *getObjectTitle() const
        {
@@ -73,7 +73,7 @@ public:
                return new Biome;
        }
 
-       void clear();
+       virtual void clear();
 
        void calcBiomes(s16 sx, s16 sy, float *heat_map, float *humidity_map,
                s16 *height_map, u8 *biomeid_map);
index 8f81b0d11eb90ec6165a6a5bd8739a6cfbf82af2..ec2d3e8b0f6cbe0f40ec8882dcfbc8fec3b38771 100644 (file)
@@ -61,16 +61,6 @@ size_t DecorationManager::placeAllDecos(Mapgen *mg, u32 blockseed,
 }
 
 
-void DecorationManager::clear()
-{
-       for (size_t i = 0; i < m_objects.size(); i++) {
-               Decoration *deco = (Decoration *)m_objects[i];
-               delete deco;
-       }
-       m_objects.clear();
-}
-
-
 ///////////////////////////////////////////////////////////////////////////////
 
 
@@ -320,8 +310,20 @@ int DecoSimple::getHeight()
 ///////////////////////////////////////////////////////////////////////////////
 
 
+DecoSchematic::DecoSchematic() :
+       Decoration::Decoration()
+{
+       schematic = NULL;
+}
+
+
 size_t DecoSchematic::generate(MMVManip *vm, PseudoRandom *pr, v3s16 p)
 {
+       // Schematic could have been unloaded but not the decoration
+       // In this case generate() does nothing (but doesn't *fail*)
+       if (schematic == NULL)
+               return 0;
+
        if (flags & DECO_PLACE_CENTER_X)
                p.X -= (schematic->size.X + 1) / 2;
        if (flags & DECO_PLACE_CENTER_Y)
index 180c248be603ce2c39425d9e864d3b91fdfebae9..8ece5d684e3174a608ed4fe7684abed1a6b07f4c 100644 (file)
@@ -61,7 +61,16 @@ struct CutoffData {
 
 class Decoration : public ObjDef, public NodeResolver {
 public:
-       INodeDefManager *ndef;
+       Decoration();
+       virtual ~Decoration();
+
+       virtual void resolveNodeNames();
+
+       size_t placeDeco(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax);
+       //size_t placeCutoffs(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax);
+
+       virtual size_t generate(MMVManip *vm, PseudoRandom *pr, v3s16 p) = 0;
+       virtual int getHeight() = 0;
 
        u32 flags;
        int mapseed;
@@ -75,42 +84,32 @@ public:
        std::set<u8> biomes;
        //std::list<CutoffData> cutoffs;
        //JMutex cutoff_mutex;
-
-       Decoration();
-       virtual ~Decoration();
-
-       virtual void resolveNodeNames();
-
-       size_t placeDeco(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax);
-       //size_t placeCutoffs(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax);
-
-       virtual size_t generate(MMVManip *vm, PseudoRandom *pr, v3s16 p) = 0;
-       virtual int getHeight() = 0;
 };
 
 class DecoSimple : public Decoration {
 public:
+       virtual size_t generate(MMVManip *vm, PseudoRandom *pr, v3s16 p);
+       bool canPlaceDecoration(MMVManip *vm, v3s16 p);
+       virtual int getHeight();
+
+       virtual void resolveNodeNames();
+
        std::vector<content_t> c_decos;
        std::vector<content_t> c_spawnby;
        s16 deco_height;
        s16 deco_height_max;
        s16 nspawnby;
-
-       virtual void resolveNodeNames();
-
-       bool canPlaceDecoration(MMVManip *vm, v3s16 p);
-       virtual size_t generate(MMVManip *vm, PseudoRandom *pr, v3s16 p);
-       virtual int getHeight();
 };
 
 class DecoSchematic : public Decoration {
 public:
-       Rotation rotation;
-       Schematic *schematic;
-       std::string filename;
+       DecoSchematic();
 
        virtual size_t generate(MMVManip *vm, PseudoRandom *pr, v3s16 p);
        virtual int getHeight();
+
+       Rotation rotation;
+       Schematic *schematic;
 };
 
 
@@ -124,7 +123,7 @@ public:
 class DecorationManager : public ObjDefManager {
 public:
        DecorationManager(IGameDef *gamedef);
-       ~DecorationManager() {}
+       virtual ~DecorationManager() {}
 
        const char *getObjectTitle() const
        {
@@ -145,8 +144,6 @@ public:
                }
        }
 
-       void clear();
-
        size_t placeAllDecos(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax);
 };
 
index b6cf176e77acc5076ae12b326521700ce2480fbc..e4af435f7c2f9852a7d5f3584cb04157ed823033 100644 (file)
@@ -115,7 +115,7 @@ public:
 class OreManager : public ObjDefManager {
 public:
        OreManager(IGameDef *gamedef);
-       ~OreManager() {}
+       virtual ~OreManager() {}
 
        const char *getObjectTitle() const
        {
index cb31f640c4a090eb3cf494ef8e5775277aee8dd4..6215bce945fb0484c640963af0011c5a6f9ad579 100644 (file)
@@ -19,7 +19,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #include <fstream>
 #include "mg_schematic.h"
+#include "gamedef.h"
 #include "mapgen.h"
+#include "emerge.h"
 #include "map.h"
 #include "mapblock.h"
 #include "log.h"
@@ -34,6 +36,28 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 SchematicManager::SchematicManager(IGameDef *gamedef) :
        ObjDefManager(gamedef, OBJDEF_SCHEMATIC)
 {
+       m_gamedef = gamedef;
+}
+
+
+void SchematicManager::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);
+
+               try {
+                       DecoSchematic *dschem = dynamic_cast<DecoSchematic *>(deco);
+                       if (dschem)
+                               dschem->schematic = NULL;
+               } catch(std::bad_cast) {
+               }
+       }
+
+       ObjDefManager::clear();
 }
 
 
index 63cea21f697a012c004137258687c4fbc8feabfd..296e7b104a9b6d9af7c8bec899f28715453ca929 100644 (file)
@@ -29,6 +29,7 @@ class Mapgen;
 class MMVManip;
 class PseudoRandom;
 class NodeResolver;
+class IGameDef;
 
 /*
        Minetest Schematic File Format
@@ -121,7 +122,9 @@ public:
 class SchematicManager : public ObjDefManager {
 public:
        SchematicManager(IGameDef *gamedef);
-       ~SchematicManager() {}
+       virtual ~SchematicManager() {}
+
+       virtual void clear();
 
        const char *getObjectTitle() const
        {
@@ -132,6 +135,9 @@ public:
        {
                return new Schematic;
        }
+
+private:
+       IGameDef *m_gamedef;
 };
 
 void build_nnlist_and_update_ids(MapNode *nodes, u32 nodecount,