static const char *OBJECT_TITLE;
BiomeManager(IGameDef *gamedef);
- ~BiomeManager();
+ virtual ~BiomeManager();
const char *getObjectTitle() const
{
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);
}
-void DecorationManager::clear()
-{
- for (size_t i = 0; i < m_objects.size(); i++) {
- Decoration *deco = (Decoration *)m_objects[i];
- delete deco;
- }
- m_objects.clear();
-}
-
-
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
+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)
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;
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;
};
class DecorationManager : public ObjDefManager {
public:
DecorationManager(IGameDef *gamedef);
- ~DecorationManager() {}
+ virtual ~DecorationManager() {}
const char *getObjectTitle() const
{
}
}
- void clear();
-
size_t placeAllDecos(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax);
};
class OreManager : public ObjDefManager {
public:
OreManager(IGameDef *gamedef);
- ~OreManager() {}
+ virtual ~OreManager() {}
const char *getObjectTitle() const
{
#include <fstream>
#include "mg_schematic.h"
+#include "gamedef.h"
#include "mapgen.h"
+#include "emerge.h"
#include "map.h"
#include "mapblock.h"
#include "log.h"
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();
}
class MMVManip;
class PseudoRandom;
class NodeResolver;
+class IGameDef;
/*
Minetest Schematic File Format
class SchematicManager : public ObjDefManager {
public:
SchematicManager(IGameDef *gamedef);
- ~SchematicManager() {}
+ virtual ~SchematicManager() {}
+
+ virtual void clear();
const char *getObjectTitle() const
{
{
return new Schematic;
}
+
+private:
+ IGameDef *m_gamedef;
};
void build_nnlist_and_update_ids(MapNode *nodes, u32 nodecount,