Add minetest.clear_registered_decorations() and clear_registered_ores()
authorkwolekr <kwolekr@minetest.net>
Fri, 12 Dec 2014 19:07:49 +0000 (14:07 -0500)
committerkwolekr <kwolekr@minetest.net>
Fri, 12 Dec 2014 19:08:04 +0000 (14:08 -0500)
12 files changed:
src/mapgen.cpp
src/mapgen.h
src/mg_biome.cpp
src/mg_biome.h
src/mg_decoration.cpp
src/mg_decoration.h
src/mg_ore.cpp
src/mg_ore.h
src/mg_schematic.cpp
src/mg_schematic.h
src/script/lua_api/l_mapgen.cpp
src/script/lua_api/l_mapgen.h

index 880ea1eea911e0edc0b4955d7852b6e0dd77b313..ceaabbb1ab9da4638b9cb1ffae37a6677c8bef53 100644 (file)
@@ -20,6 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "mapgen.h"
 #include "voxel.h"
 #include "noise.h"
+#include "gamedef.h"
 #include "mg_biome.h"
 #include "mapblock.h"
 #include "mapnode.h"
@@ -381,6 +382,12 @@ void GenerateNotifier::getEvents(
 ///////////////////////////////////////////////////////////////////////////////
 
 
+GenElementManager::GenElementManager(IGameDef *gamedef)
+{
+       m_resolver = gamedef->getNodeDefManager()->getResolver();
+}
+
+
 GenElementManager::~GenElementManager()
 {
        for (size_t i = 0; i != m_elements.size(); i++)
index b4cfd67ba0d7f8927098e1ebf6b884b10e3ff288..03850cd199a59978a08440cb681d21881565e7f1 100644 (file)
@@ -178,7 +178,7 @@ public:
        static const char *ELEMENT_TITLE;
        static const size_t ELEMENT_LIMIT = -1;
 
-       GenElementManager() {}
+       GenElementManager(IGameDef *gamedef);
        virtual ~GenElementManager();
 
        virtual GenElement *create(int type) = 0;
@@ -192,6 +192,7 @@ public:
        virtual GenElement *getByName(const std::string &name);
 
 protected:
+       NodeResolver *m_resolver;
        std::vector<GenElement *> m_elements;
 };
 
index 13dc67e74bd0898f172acb06742cad99af379d3b..96fe443abf9a540bca41b7b7fdd3cbc2e132fd5d 100644 (file)
@@ -32,10 +32,9 @@ const char *BiomeManager::ELEMENT_TITLE = "biome";
 
 ///////////////////////////////////////////////////////////////////////////////
 
-BiomeManager::BiomeManager(IGameDef *gamedef)
+BiomeManager::BiomeManager(IGameDef *gamedef) :
+       GenElementManager(gamedef)
 {
-       m_resolver  = gamedef->getNodeDefManager()->getResolver();
-
        // Create default biome to be used in case none exist
        Biome *b = new Biome;
 
index 04567267f81e3a97aa924d7cf47ab8279b6f4f3e..f1539dacb9e0b44c93353437701aba39d9f6afd1 100644 (file)
@@ -71,9 +71,6 @@ 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:
-       NodeResolver *m_resolver;
 };
 
 #endif
index 20b9fbda68510dbe03ff055c82466b0fc4871049..14368c091dcacdf273e17b10845e3101dac1afcc 100644 (file)
@@ -38,6 +38,12 @@ FlagDesc flagdesc_deco[] = {
 ///////////////////////////////////////////////////////////////////////////////
 
 
+DecorationManager::DecorationManager(IGameDef *gamedef) :
+       GenElementManager(gamedef)
+{
+}
+
+
 size_t DecorationManager::placeAllDecos(Mapgen *mg, u32 seed, v3s16 nmin, v3s16 nmax)
 {
        size_t nplaced = 0;
@@ -55,6 +61,19 @@ size_t DecorationManager::placeAllDecos(Mapgen *mg, u32 seed, v3s16 nmin, v3s16
 }
 
 
+void DecorationManager::clear()
+{
+       for (size_t i = 0; i < m_elements.size(); i++) {
+               Decoration *deco = (Decoration *)m_elements[i];
+               if (!deco)
+                       continue;
+
+               deco->dropResolverEntries(m_resolver);
+       }
+       m_elements.clear();
+}
+
+
 ///////////////////////////////////////////////////////////////////////////////
 
 
@@ -291,6 +310,13 @@ int DecoSimple::getHeight()
 }
 
 
+void DecoSimple::dropResolverEntries(NodeResolver *resolver)
+{
+       resolver->cancelNodeList(&c_decos);
+       resolver->cancelNodeList(&c_spawnby);
+}
+
+
 ///////////////////////////////////////////////////////////////////////////////
 
 
index f360e3b76945cf84d69280296897f7d84d906d7f..dffb524f39f95ea43b7caff7e96d5f256083f428 100644 (file)
@@ -81,6 +81,7 @@ public:
 
        virtual size_t generate(Mapgen *mg, PseudoRandom *pr, s16 max_y, v3s16 p) = 0;
        virtual int getHeight() = 0;
+       virtual void dropResolverEntries(NodeResolver *resolver) {}
 };
 
 class DecoSimple : public Decoration {
@@ -96,6 +97,7 @@ public:
        bool canPlaceDecoration(ManualMapVoxelManipulator *vm, v3s16 p);
        virtual size_t generate(Mapgen *mg, PseudoRandom *pr, s16 max_y, v3s16 p);
        virtual int getHeight();
+       virtual void dropResolverEntries(NodeResolver *resolver);
 };
 
 class DecoSchematic : public Decoration {
@@ -123,7 +125,7 @@ public:
        static const char *ELEMENT_TITLE;
        static const size_t ELEMENT_LIMIT = 0x10000;
 
-       DecorationManager(IGameDef *gamedef) {}
+       DecorationManager(IGameDef *gamedef);
        ~DecorationManager() {}
 
        Decoration *create(int type)
@@ -140,6 +142,8 @@ public:
                }
        }
 
+       void clear();
+
        size_t placeAllDecos(Mapgen *mg, u32 seed, v3s16 nmin, v3s16 nmax);
 };
 
index d94b861c22779ecbe03e1dea5e3bfd37704a9dcb..de3f6b0e5dcb1a3bc601a782f908199e5706fbf0 100644 (file)
@@ -37,6 +37,12 @@ FlagDesc flagdesc_ore[] = {
 ///////////////////////////////////////////////////////////////////////////////
 
 
+OreManager::OreManager(IGameDef *gamedef) :
+       GenElementManager(gamedef)
+{
+}
+
+
 size_t OreManager::placeAllOres(Mapgen *mg, u32 seed, v3s16 nmin, v3s16 nmax)
 {
        size_t nplaced = 0;
@@ -54,6 +60,20 @@ size_t OreManager::placeAllOres(Mapgen *mg, u32 seed, v3s16 nmin, v3s16 nmax)
 }
 
 
+void OreManager::clear()
+{
+       for (size_t i = 0; i < m_elements.size(); i++) {
+               Ore *ore = (Ore *)m_elements[i];
+               if (!ore)
+                       continue;
+
+               m_resolver->cancelNodeList(&ore->c_wherein);
+               m_resolver->cancelNode(&ore->c_ore);
+       }
+       m_elements.clear();
+}
+
+
 ///////////////////////////////////////////////////////////////////////////////
 
 
@@ -169,4 +189,3 @@ void OreSheet::generate(ManualMapVoxelManipulator *vm, int seed,
                }
        }
 }
-
index b6db860b9fa4537fba4c45d24e3d926a6d07e17f..585d58f37a304be6acb9d364a95fedcf15e990a8 100644 (file)
@@ -99,7 +99,7 @@ public:
        static const char *ELEMENT_TITLE;
        static const size_t ELEMENT_LIMIT = 0x10000;
 
-       OreManager(IGameDef *gamedef) {}
+       OreManager(IGameDef *gamedef);
        ~OreManager() {}
 
        Ore *create(int type)
@@ -116,6 +116,8 @@ public:
                }
        }
 
+       void clear();
+
        size_t placeAllOres(Mapgen *mg, u32 seed, v3s16 nmin, v3s16 nmax);
 };
 
index bb60cf5fd2f7a713d316c71cb5cbd576b9c8e1de..a7882464723d589a9b82711b2ab052b47796b231 100644 (file)
@@ -30,6 +30,14 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 const char *SchematicManager::ELEMENT_TITLE = "schematic";
 
+///////////////////////////////////////////////////////////////////////////////
+
+
+SchematicManager::SchematicManager(IGameDef *gamedef) :
+       GenElementManager(gamedef)
+{
+}
+
 
 ///////////////////////////////////////////////////////////////////////////////
 
index 9d4d4a71681e262ba2d4bd3320b119e1f29ad0e6..df54d79bae0e008686f6c37c01a9c5bbf522130a 100644 (file)
@@ -76,7 +76,7 @@ public:
        static const char *ELEMENT_TITLE;
        static const size_t ELEMENT_LIMIT = 0x10000;
 
-       SchematicManager(IGameDef *gamedef) {}
+       SchematicManager(IGameDef *gamedef);
        ~SchematicManager() {}
 
        Schematic *create(int type)
index 3fe6fb99124919e52449051e95a46859a5585b56..177e0d85bd9a8ab00ba2085911462040dc90bba8 100644 (file)
@@ -464,6 +464,20 @@ int ModApiMapgen::l_clear_registered_biomes(lua_State *L)
        return 0;
 }
 
+int ModApiMapgen::l_clear_registered_decorations(lua_State *L)
+{
+       DecorationManager *dmgr = getServer(L)->getEmergeManager()->decomgr;
+       dmgr->clear();
+       return 0;
+}
+
+int ModApiMapgen::l_clear_registered_ores(lua_State *L)
+{
+       OreManager *omgr = getServer(L)->getEmergeManager()->oremgr;
+       omgr->clear();
+       return 0;
+}
+
 // register_decoration({lots of stuff})
 int ModApiMapgen::l_register_decoration(lua_State *L)
 {
@@ -789,7 +803,10 @@ void ModApiMapgen::Initialize(lua_State *L, int top)
        API_FCT(register_biome);
        API_FCT(register_decoration);
        API_FCT(register_ore);
+
        API_FCT(clear_registered_biomes);
+       API_FCT(clear_registered_decorations);
+       API_FCT(clear_registered_ores);
 
        API_FCT(create_schematic);
        API_FCT(place_schematic);
index 76f60a2d7b20b8ac82667d50277c39c1c54fdbea..87ae9fd817aad909ee6881e1885f6f4480975a41 100644 (file)
@@ -55,6 +55,12 @@ private:
        // clear_registered_biomes()
        static int l_clear_registered_biomes(lua_State *L);
 
+       // clear_registered_decorations()
+       static int l_clear_registered_decorations(lua_State *L);
+
+       // clear_registered_ores
+       static int l_clear_registered_ores(lua_State *L);
+
        // create_schematic(p1, p2, probability_list, filename)
        static int l_create_schematic(lua_State *L);