Vein ore: Fix bug caused by changing perlinmap Y size (#7371)
authorParamat <paramat@users.noreply.github.com>
Thu, 24 May 2018 21:20:06 +0000 (22:20 +0100)
committerGitHub <noreply@github.com>
Thu, 24 May 2018 21:20:06 +0000 (22:20 +0100)
Because vein ore uses 3D noise (all the other ores use 2D noise) the
perlinmap Y size can be different in different mapchunks when close
to the ore Y limits.
Previously this caused bugs in the vein structure because changes in
perlinmap Y size did not recreate the noise objects.

Delete and recreate the noise objects with the new Y size if Y size
has changed.

src/mapgen/mg_ore.cpp
src/mapgen/mg_ore.h

index f83933ed1dbf13dbdf35617035bb1803e154815a..6f27b91ac444866666ea08afad3a6a16cbe759b6 100644 (file)
@@ -371,17 +371,23 @@ void OreVein::generate(MMVManip *vm, int mapseed, u32 blockseed,
        PcgRandom pr(blockseed + 520);
        MapNode n_ore(c_ore, 0, ore_param2);
 
-       u32 sizex = (nmax.X - nmin.X + 1);
-
-       if (!noise) {
-               int sx = nmax.X - nmin.X + 1;
-               int sy = nmax.Y - nmin.Y + 1;
-               int sz = nmax.Z - nmin.Z + 1;
-               noise  = new Noise(&np, mapseed, sx, sy, sz);
-               noise2 = new Noise(&np, mapseed + 436, sx, sy, sz);
+       int sizex = nmax.X - nmin.X + 1;
+       int sizey = nmax.Y - nmin.Y + 1;
+       // Because this ore uses 3D noise the perlinmap Y size can be different in
+       // different mapchunks due to ore Y limits. So recreate the noise objects
+       // if Y size has changed.
+       // Because these noise objects are created multiple times for this ore type
+       // it is necessary to 'delete' them here.
+       if (!noise || sizey != sizey_prev) {
+               delete noise;
+               delete noise2;
+               int sizez = nmax.Z - nmin.Z + 1;
+               noise  = new Noise(&np, mapseed, sizex, sizey, sizez);
+               noise2 = new Noise(&np, mapseed + 436, sizex, sizey, sizez);
+               sizey_prev = sizey;
        }
-       bool noise_generated = false;
 
+       bool noise_generated = false;
        size_t index = 0;
        for (int z = nmin.Z; z <= nmax.Z; z++)
        for (int y = nmin.Y; y <= nmax.Y; y++)
index 30104ee50e1783460990ed31ef6b956c7148ac7f..d89360c3c1ca307a8c81af66a7872276153cb1b9 100644 (file)
@@ -126,6 +126,7 @@ public:
 
        float random_factor;
        Noise *noise2 = nullptr;
+       int sizey_prev = 0;
 
        OreVein() = default;
        virtual ~OreVein();