LuaVoxelManip: Add option to allocate blank data
[oweals/minetest.git] / src / mg_decoration.cpp
index 3604b06c0cecb0ef84f1c404158803187c9680f3..50e8fb05a65f31eec9a71f203445e84d55d33040 100644 (file)
@@ -27,7 +27,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 const char *DecorationManager::ELEMENT_TITLE = "decoration";
 
-FlagDesc flagdesc_deco_schematic[] = {
+FlagDesc flagdesc_deco[] = {
        {"place_center_x", DECO_PLACE_CENTER_X},
        {"place_center_y", DECO_PLACE_CENTER_Y},
        {"place_center_z", DECO_PLACE_CENTER_Z},
@@ -38,6 +38,12 @@ FlagDesc flagdesc_deco_schematic[] = {
 ///////////////////////////////////////////////////////////////////////////////
 
 
+DecorationManager::DecorationManager(IGameDef *gamedef) :
+       GenElementManager(gamedef)
+{
+}
+
+
 size_t DecorationManager::placeAllDecos(Mapgen *mg, u32 seed, v3s16 nmin, v3s16 nmax)
 {
        size_t nplaced = 0;
@@ -55,21 +61,36 @@ 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];
+               delete deco;
+       }
+       m_elements.clear();
+}
+
+
 ///////////////////////////////////////////////////////////////////////////////
 
 
 Decoration::Decoration()
 {
        mapseed    = 0;
-       np         = NULL;
        fill_ratio = 0;
        sidelen    = 1;
+       flags      = 0;
 }
 
 
 Decoration::~Decoration()
 {
-       delete np;
+}
+
+
+void Decoration::resolveNodeNames(NodeResolveInfo *nri)
+{
+       m_ndef->getIdsFromResolveInfo(nri, c_place_on);
 }
 
 
@@ -104,8 +125,8 @@ size_t Decoration::placeDeco(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax)
                );
 
                // Amount of decorations
-               float nval = np ?
-                       NoisePerlin2D(np, p2d_center.X, p2d_center.Y, mapseed) :
+               float nval = (flags & DECO_USE_NOISE) ?
+                       NoisePerlin2D(&np, p2d_center.X, p2d_center.Y, mapseed) :
                        fill_ratio;
                u32 deco_count = area * MYMAX(nval, 0.f);
 
@@ -137,14 +158,16 @@ size_t Decoration::placeDeco(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax)
                        if (mg->biomemap) {
                                std::set<u8>::iterator iter;
 
-                               if (biomes.size()) {
+                               if (!biomes.empty()) {
                                        iter = biomes.find(mg->biomemap[mapindex]);
                                        if (iter == biomes.end())
                                                continue;
                                }
                        }
 
-                       generate(mg, &ps, max_y, v3s16(x, y, z));
+                       v3s16 pos(x, y, z);
+                       if (generate(mg, &ps, max_y, pos))
+                               mg->gennotify.addEvent(GENNOTIFY_DECORATION, pos, id);
                }
        }
 
@@ -209,6 +232,14 @@ void Decoration::placeCutoffs(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax)
 ///////////////////////////////////////////////////////////////////////////////
 
 
+void DecoSimple::resolveNodeNames(NodeResolveInfo *nri)
+{
+       Decoration::resolveNodeNames(nri);
+       m_ndef->getIdsFromResolveInfo(nri, c_decos);
+       m_ndef->getIdsFromResolveInfo(nri, c_spawnby);
+}
+
+
 bool DecoSimple::canPlaceDecoration(ManualMapVoxelManipulator *vm, v3s16 p)
 {
        // Don't bother if there aren't any decorations to place
@@ -254,12 +285,12 @@ bool DecoSimple::canPlaceDecoration(ManualMapVoxelManipulator *vm, v3s16 p)
 }
 
 
-void DecoSimple::generate(Mapgen *mg, PseudoRandom *pr, s16 max_y, v3s16 p)
+size_t DecoSimple::generate(Mapgen *mg, PseudoRandom *pr, s16 max_y, v3s16 p)
 {
        ManualMapVoxelManipulator *vm = mg->vm;
 
        if (!canPlaceDecoration(vm, p))
-               return;
+               return 0;
 
        content_t c_place = c_decos[pr->range(0, c_decos.size() - 1)];
 
@@ -279,6 +310,8 @@ void DecoSimple::generate(Mapgen *mg, PseudoRandom *pr, s16 max_y, v3s16 p)
 
                vm->m_data[vi] = MapNode(c_place);
        }
+
+       return 1;
 }
 
 
@@ -291,7 +324,7 @@ int DecoSimple::getHeight()
 ///////////////////////////////////////////////////////////////////////////////
 
 
-void DecoSchematic::generate(Mapgen *mg, PseudoRandom *pr, s16 max_y, v3s16 p)
+size_t DecoSchematic::generate(Mapgen *mg, PseudoRandom *pr, s16 max_y, v3s16 p)
 {
        ManualMapVoxelManipulator *vm = mg->vm;
 
@@ -305,12 +338,14 @@ void DecoSchematic::generate(Mapgen *mg, PseudoRandom *pr, s16 max_y, v3s16 p)
        u32 vi = vm->m_area.index(p);
        content_t c = vm->m_data[vi].getContent();
        if (!CONTAINS(c_place_on, c))
-               return;
+               return 0;
 
        Rotation rot = (rotation == ROTATE_RAND) ?
                (Rotation)pr->range(ROTATE_0, ROTATE_270) : rotation;
 
        schematic->blitToVManip(p, vm, rot, false, mg->ndef);
+
+       return 1;
 }