From 406d9ba87b9f6e57b86c6282bf157e3341aa195c Mon Sep 17 00:00:00 2001 From: kwolekr Date: Fri, 17 Apr 2015 00:52:48 -0400 Subject: Schematics: Remove referenced schematics from Decorations on clear --- src/mg_biome.h | 4 ++-- src/mg_decoration.cpp | 22 ++++++++++++---------- src/mg_decoration.h | 45 +++++++++++++++++++++------------------------ src/mg_ore.h | 2 +- src/mg_schematic.cpp | 24 ++++++++++++++++++++++++ src/mg_schematic.h | 8 +++++++- 6 files changed, 67 insertions(+), 38 deletions(-) (limited to 'src') diff --git a/src/mg_biome.h b/src/mg_biome.h index 46ae21959..ce5ce2f0a 100644 --- a/src/mg_biome.h +++ b/src/mg_biome.h @@ -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); diff --git a/src/mg_decoration.cpp b/src/mg_decoration.cpp index 8f81b0d11..ec2d3e8b0 100644 --- a/src/mg_decoration.cpp +++ b/src/mg_decoration.cpp @@ -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) diff --git a/src/mg_decoration.h b/src/mg_decoration.h index 180c248be..8ece5d684 100644 --- a/src/mg_decoration.h +++ b/src/mg_decoration.h @@ -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 biomes; //std::list 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 c_decos; std::vector 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); }; diff --git a/src/mg_ore.h b/src/mg_ore.h index b6cf176e7..e4af435f7 100644 --- a/src/mg_ore.h +++ b/src/mg_ore.h @@ -115,7 +115,7 @@ public: class OreManager : public ObjDefManager { public: OreManager(IGameDef *gamedef); - ~OreManager() {} + virtual ~OreManager() {} const char *getObjectTitle() const { diff --git a/src/mg_schematic.cpp b/src/mg_schematic.cpp index cb31f640c..6215bce94 100644 --- a/src/mg_schematic.cpp +++ b/src/mg_schematic.cpp @@ -19,7 +19,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #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(deco); + if (dschem) + dschem->schematic = NULL; + } catch(std::bad_cast) { + } + } + + ObjDefManager::clear(); } diff --git a/src/mg_schematic.h b/src/mg_schematic.h index 63cea21f6..296e7b104 100644 --- a/src/mg_schematic.h +++ b/src/mg_schematic.h @@ -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, -- cgit v1.2.3