Modernize client code (#6250)
[oweals/minetest.git] / src / cavegen.cpp
index 6275c516e1c6a1565544523c687298c7436216b7..fc9526b4faa226dc47f3907931ddeb3517af9ebe 100644 (file)
@@ -73,7 +73,7 @@ void CavesNoiseIntersection::generateCaves(MMVManip *vm,
        noise_cave1->perlinMap3D(nmin.X, nmin.Y - 1, nmin.Z);
        noise_cave2->perlinMap3D(nmin.X, nmin.Y - 1, nmin.Z);
 
-       v3s16 em = vm->m_area.getExtent();
+       const v3s16 &em = vm->m_area.getExtent();
        u32 index2d = 0;  // Biomemap index
 
        for (s16 z = nmin.Z; z <= nmax.Z; z++)
@@ -160,9 +160,9 @@ CavernsNoise::CavernsNoise(
 {
        assert(nodedef);
 
-       m_ndef = nodedef;
+       m_ndef  = nodedef;
 
-       m_csize = chunksize;
+       m_csize            = chunksize;
        m_cavern_limit     = cavern_limit;
        m_cavern_taper     = cavern_taper;
        m_cavern_threshold = cavern_threshold;
@@ -199,7 +199,7 @@ bool CavernsNoise::generateCaverns(MMVManip *vm, v3s16 nmin, v3s16 nmax)
        noise_cavern->perlinMap3D(nmin.X, nmin.Y - 1, nmin.Z);
 
        // Cache cavern_amp values
-       float cavern_amp[m_csize.Y + 1];
+       float *cavern_amp = new float[m_csize.Y + 1];
        u8 cavern_amp_index = 0;  // Index zero at column top
        for (s16 y = nmax.Y; y >= nmin.Y - 1; y--, cavern_amp_index++) {
                cavern_amp[cavern_amp_index] =
@@ -207,8 +207,8 @@ bool CavernsNoise::generateCaverns(MMVManip *vm, v3s16 nmin, v3s16 nmax)
        }
 
        //// Place nodes
-       bool has_cavern = false;
-       v3s16 em = vm->m_area.getExtent();
+       bool near_cavern = false;
+       const v3s16 &em = vm->m_area.getExtent();
        u32 index2d = 0;
 
        for (s16 z = nmin.Z; z <= nmax.Z; z++)
@@ -229,19 +229,22 @@ bool CavernsNoise::generateCaverns(MMVManip *vm, v3s16 nmin, v3s16 nmax)
                                vm->m_area.add_y(em, vi, -1),
                                cavern_amp_index++) {
                        content_t c = vm->m_data[vi].getContent();
-                       float nabs_cavern = fabs(noise_cavern->result[index3d]);
-                       // Caverns generate first but still remove lava and water in case
-                       // of overgenerated classic caves.
-                       if (nabs_cavern * cavern_amp[cavern_amp_index] > m_cavern_threshold &&
-                                       (m_ndef->get(c).is_ground_content ||
-                                       c == c_lava_source || c == c_water_source)) {
-                               vm->m_data[vi] = MapNode(CONTENT_AIR);
-                               has_cavern = true;
+                       float n_absamp_cavern = fabs(noise_cavern->result[index3d]) *
+                               cavern_amp[cavern_amp_index];
+                       // Disable CavesRandomWalk at a safe distance from caverns
+                       // to avoid excessively spreading liquids in caverns.
+                       if (n_absamp_cavern > m_cavern_threshold - 0.1f) {
+                               near_cavern = true;
+                               if (n_absamp_cavern > m_cavern_threshold &&
+                                               m_ndef->get(c).is_ground_content)
+                                       vm->m_data[vi] = MapNode(CONTENT_AIR);
                        }
                }
        }
 
-       return has_cavern;
+       delete[] cavern_amp;
+
+       return near_cavern;
 }
 
 
@@ -255,7 +258,8 @@ CavesRandomWalk::CavesRandomWalk(
        s32 seed,
        int water_level,
        content_t water_source,
-       content_t lava_source)
+       content_t lava_source,
+       int lava_depth)
 {
        assert(ndef);
 
@@ -264,7 +268,7 @@ CavesRandomWalk::CavesRandomWalk(
        this->seed           = seed;
        this->water_level    = water_level;
        this->np_caveliquids = &nparams_caveliquids;
-       this->lava_depth     = DEFAULT_LAVA_DEPTH;
+       this->lava_depth     = lava_depth;
 
        c_water_source = water_source;
        if (c_water_source == CONTENT_IGNORE)