Skip to content

Commit

Permalink
Schematics: Remove referenced schematics from Decorations on clear
Browse files Browse the repository at this point in the history
  • Loading branch information
kwolekr committed Apr 17, 2015
1 parent f0a1379 commit 406d9ba
Show file tree
Hide file tree
Showing 6 changed files with 67 additions and 38 deletions.
4 changes: 2 additions & 2 deletions src/mg_biome.h
Expand Up @@ -61,7 +61,7 @@ class BiomeManager : public ObjDefManager {
static const char *OBJECT_TITLE;

BiomeManager(IGameDef *gamedef);
~BiomeManager();
virtual ~BiomeManager();

const char *getObjectTitle() const
{
Expand All @@ -73,7 +73,7 @@ class BiomeManager : public ObjDefManager {
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);
Expand Down
22 changes: 12 additions & 10 deletions src/mg_decoration.cpp
Expand Up @@ -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();
}


///////////////////////////////////////////////////////////////////////////////


Expand Down Expand Up @@ -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)
Expand Down
45 changes: 21 additions & 24 deletions src/mg_decoration.h
Expand Up @@ -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;
Expand All @@ -75,42 +84,32 @@ class Decoration : public ObjDef, public NodeResolver {
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;
};


Expand All @@ -124,7 +123,7 @@ class DecoLSystem : public Decoration {
class DecorationManager : public ObjDefManager {
public:
DecorationManager(IGameDef *gamedef);
~DecorationManager() {}
virtual ~DecorationManager() {}

const char *getObjectTitle() const
{
Expand All @@ -145,8 +144,6 @@ class DecorationManager : public ObjDefManager {
}
}

void clear();

size_t placeAllDecos(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax);
};

Expand Down
2 changes: 1 addition & 1 deletion src/mg_ore.h
Expand Up @@ -115,7 +115,7 @@ class OreVein : public Ore {
class OreManager : public ObjDefManager {
public:
OreManager(IGameDef *gamedef);
~OreManager() {}
virtual ~OreManager() {}

const char *getObjectTitle() const
{
Expand Down
24 changes: 24 additions & 0 deletions src/mg_schematic.cpp
Expand Up @@ -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"
Expand All @@ -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();
}


Expand Down
8 changes: 7 additions & 1 deletion src/mg_schematic.h
Expand Up @@ -29,6 +29,7 @@ class Mapgen;
class MMVManip;
class PseudoRandom;
class NodeResolver;
class IGameDef;

/*
Minetest Schematic File Format
Expand Down Expand Up @@ -121,7 +122,9 @@ class Schematic : public ObjDef, public NodeResolver {
class SchematicManager : public ObjDefManager {
public:
SchematicManager(IGameDef *gamedef);
~SchematicManager() {}
virtual ~SchematicManager() {}

virtual void clear();

const char *getObjectTitle() const
{
Expand All @@ -132,6 +135,9 @@ class SchematicManager : public ObjDefManager {
{
return new Schematic;
}

private:
IGameDef *m_gamedef;
};

void build_nnlist_and_update_ids(MapNode *nodes, u32 nodecount,
Expand Down

0 comments on commit 406d9ba

Please sign in to comment.