aboutsummaryrefslogtreecommitdiff
path: root/src/mapgen
diff options
context:
space:
mode:
authorParamat <paramat@users.noreply.github.com>2018-05-24 22:20:06 +0100
committerGitHub <noreply@github.com>2018-05-24 22:20:06 +0100
commit5c1edc58ab2abe8bc1f1bbcbb2f30a5899586968 (patch)
treeec509bb0da77bc5d3f769950e3ce40e4d6f37969 /src/mapgen
parentd6a6d3176e8ea9be4224c9f1f059654e3d36ea37 (diff)
downloadminetest-5c1edc58ab2abe8bc1f1bbcbb2f30a5899586968.tar.gz
minetest-5c1edc58ab2abe8bc1f1bbcbb2f30a5899586968.tar.bz2
minetest-5c1edc58ab2abe8bc1f1bbcbb2f30a5899586968.zip
Vein ore: Fix bug caused by changing perlinmap Y size (#7371)
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.
Diffstat (limited to 'src/mapgen')
-rw-r--r--src/mapgen/mg_ore.cpp24
-rw-r--r--src/mapgen/mg_ore.h1
2 files changed, 16 insertions, 9 deletions
diff --git a/src/mapgen/mg_ore.cpp b/src/mapgen/mg_ore.cpp
index f83933ed1..6f27b91ac 100644
--- a/src/mapgen/mg_ore.cpp
+++ b/src/mapgen/mg_ore.cpp
@@ -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++)
diff --git a/src/mapgen/mg_ore.h b/src/mapgen/mg_ore.h
index 30104ee50..d89360c3c 100644
--- a/src/mapgen/mg_ore.h
+++ b/src/mapgen/mg_ore.h
@@ -126,6 +126,7 @@ public:
float random_factor;
Noise *noise2 = nullptr;
+ int sizey_prev = 0;
OreVein() = default;
virtual ~OreVein();