LuaVoxelManip: Add option to allocate blank data
[oweals/minetest.git] / src / mg_ore.cpp
index 9e2d456eef470792a10b93ae3ee5b3d0b62a7322..8681b5782cca4359cc05a5d93661aa1608604cb6 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,25 +60,36 @@ 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];
+               delete ore;
+       }
+       m_elements.clear();
+}
+
+
 ///////////////////////////////////////////////////////////////////////////////
 
+
 Ore::Ore()
 {
-       c_ore   = CONTENT_IGNORE;
-       np      = NULL;
-       noise   = NULL;
+       flags = 0;
+       noise = NULL;
 }
 
+
 Ore::~Ore()
 {
-       delete np;
        delete noise;
 }
 
 
-std::string Ore::getName()
+void Ore::resolveNodeNames(NodeResolveInfo *nri)
 {
-       return name;
+       m_ndef->getIdFromResolveInfo(nri, "", CONTENT_AIR, c_ore);
+       m_ndef->getIdsFromResolveInfo(nri, c_wherein);
 }
 
 
@@ -101,10 +118,13 @@ size_t Ore::placeOre(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax)
        nmax.Y = ymax;
        generate(mg->vm, mg->seed, blockseed, nmin, nmax);
 
-       return 0;
+       return 1;
 }
 
 
+///////////////////////////////////////////////////////////////////////////////
+
+
 void OreScatter::generate(ManualMapVoxelManipulator *vm, int seed,
        u32 blockseed, v3s16 nmin, v3s16 nmax)
 {
@@ -123,7 +143,8 @@ void OreScatter::generate(ManualMapVoxelManipulator *vm, int seed,
                int y0 = pr.range(nmin.Y, nmax.Y - csize + 1);
                int z0 = pr.range(nmin.Z, nmax.Z - csize + 1);
 
-               if (np && (NoisePerlin3D(np, x0, y0, z0, seed) < nthresh))
+               if ((flags & OREFLAG_USE_NOISE) &&
+                       (NoisePerlin3D(&np, x0, y0, z0, seed) < nthresh))
                        continue;
 
                for (int z1 = 0; z1 != csize; z1++)
@@ -142,6 +163,9 @@ void OreScatter::generate(ManualMapVoxelManipulator *vm, int seed,
 }
 
 
+///////////////////////////////////////////////////////////////////////////////
+
+
 void OreSheet::generate(ManualMapVoxelManipulator *vm, int seed,
        u32 blockseed, v3s16 nmin, v3s16 nmax)
 {
@@ -154,7 +178,7 @@ void OreSheet::generate(ManualMapVoxelManipulator *vm, int seed,
        if (!noise) {
                int sx = nmax.X - nmin.X + 1;
                int sz = nmax.Z - nmin.Z + 1;
-               noise = new Noise(np, 0, sx, sz);
+               noise = new Noise(&np, seed, sx, sz);
        }
        noise->seed = seed + y_start;
        noise->perlinMap2D(nmin.X, nmin.Z);
@@ -167,7 +191,7 @@ void OreSheet::generate(ManualMapVoxelManipulator *vm, int seed,
                        continue;
 
                int height = max_height * (1. / pr.range(1, 3));
-               int y0 = y_start + np->scale * noiseval; //pr.range(1, 3) - 1;
+               int y0 = y_start + np.scale * noiseval; //pr.range(1, 3) - 1;
                int y1 = y0 + height;
                for (int y = y0; y != y1; y++) {
                        u32 i = vm->m_area.index(x, y, z);
@@ -180,4 +204,3 @@ void OreSheet::generate(ManualMapVoxelManipulator *vm, int seed,
                }
        }
 }
-