Cavegen: Fix errors when getting biome outside mapchunk (#7480)
authorParamat <paramat@users.noreply.github.com>
Tue, 26 Jun 2018 18:35:23 +0000 (19:35 +0100)
committerGitHub <noreply@github.com>
Tue, 26 Jun 2018 18:35:23 +0000 (19:35 +0100)
Some cave segments are outside the mapchunk.

Previously, biome was being calculated by a function that uses the noise
maps. Points outside the mapchunk resulted in incorrect noise map indexes
that were sometimes outside the noise map size, causing a crash.

Use either noise maps or point noise calculations depending on point
location.

src/mapgen/cavegen.cpp

index 363219f6d6af5b5540a622ac3acebcbcdab46583..e54d76e08e1d74879651b18089d6496051256321 100644 (file)
@@ -507,7 +507,16 @@ void CavesRandomWalk::carveRoute(v3f vec, float f, bool randomize_xz)
        MapNode liquidnode = CONTENT_IGNORE;
 
        if (bmgn) {
-               Biome *biome = (Biome *)bmgn->getBiomeAtPoint(cpabs);
+               Biome *biome = nullptr;
+               if (cpabs.X < node_min.X || cpabs.X > node_max.X ||
+                               cpabs.Z < node_min.Z || cpabs.Z > node_max.Z)
+                       // Point is outside heat and humidity noise maps so use point noise
+                       // calculations.
+                       biome = (Biome *)bmgn->calcBiomeAtPoint(cpabs);
+               else
+                       // Point is inside heat and humidity noise maps so use them
+                       biome = (Biome *)bmgn->getBiomeAtPoint(cpabs);
+
                if (biome->c_cave_liquid != CONTENT_IGNORE)
                        liquidnode = biome->c_cave_liquid;
        }