diff options
author | Paramat <paramat@users.noreply.github.com> | 2018-05-24 22:20:06 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-05-24 22:20:06 +0100 |
commit | 5c1edc58ab2abe8bc1f1bbcbb2f30a5899586968 (patch) | |
tree | ec509bb0da77bc5d3f769950e3ce40e4d6f37969 /src | |
parent | d6a6d3176e8ea9be4224c9f1f059654e3d36ea37 (diff) | |
download | minetest-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')
-rw-r--r-- | src/mapgen/mg_ore.cpp | 24 | ||||
-rw-r--r-- | src/mapgen/mg_ore.h | 1 |
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(); |