From 8da35c22d1c8933090330b2f3c44b4cf2c6e6760 Mon Sep 17 00:00:00 2001
From: Paramat <paramat@users.noreply.github.com>
Date: Tue, 6 Aug 2019 02:30:28 +0100
Subject: [PATCH] Mapgen Flat: Fix and improve getSpawnLevelAtPoint() (#8756)

Previously, this wrongly returned ground level (a position containing
a solid node) as spawn level.
Return ground level + 2 (+ 2 to spawn above biome 'dust' nodes).
Improve codestyle and make more consistent with generateTerrain().
---
 src/mapgen/mapgen_flat.cpp | 31 ++++++++++++++++++-------------
 1 file changed, 18 insertions(+), 13 deletions(-)

diff --git a/src/mapgen/mapgen_flat.cpp b/src/mapgen/mapgen_flat.cpp
index d859fa973..773b7b10f 100644
--- a/src/mapgen/mapgen_flat.cpp
+++ b/src/mapgen/mapgen_flat.cpp
@@ -143,26 +143,31 @@ void MapgenFlatParams::writeParams(Settings *settings) const
 
 int MapgenFlat::getSpawnLevelAtPoint(v2s16 p)
 {
-	s16 level_at_point = ground_level;
-	float n_terrain = 0.0f;
-	if ((spflags & MGFLAT_LAKES) || (spflags & MGFLAT_HILLS))
-		n_terrain = NoisePerlin2D(&noise_terrain->np, p.X, p.Y, seed);
+	s16 stone_level = ground_level;
+	float n_terrain = 
+		((spflags & MGFLAT_LAKES) || (spflags & MGFLAT_HILLS)) ?
+		NoisePerlin2D(&noise_terrain->np, p.X, p.Y, seed) :
+		0.0f;
 
 	if ((spflags & MGFLAT_LAKES) && n_terrain < lake_threshold) {
-		level_at_point = ground_level -
-			(lake_threshold - n_terrain) * lake_steepness;
+		s16 depress = (lake_threshold - n_terrain) * lake_steepness;
+		stone_level = ground_level - depress;
 	} else if ((spflags & MGFLAT_HILLS) && n_terrain > hill_threshold) {
-		level_at_point = ground_level +
-			(n_terrain - hill_threshold) * hill_steepness;
+		s16 rise = (n_terrain - hill_threshold) * hill_steepness;
+	 	stone_level = ground_level + rise;
 	}
 
-	if (ground_level < water_level)  // Ocean world, allow spawn in water
-		return MYMAX(level_at_point, water_level);
+	if (ground_level < water_level)
+		// Ocean world, may not have islands so allow spawn in water
+		return MYMAX(stone_level + 2, water_level);
 
-	if (level_at_point > water_level)
-		return level_at_point;  // Spawn on land
+	if (stone_level >= water_level)
+		// Spawn on land
+		// + 2 not + 1, to spawn above biome 'dust' nodes
+		return stone_level + 2;
 
-	return MAX_MAP_GENERATION_LIMIT;  // Unsuitable spawn point
+	// Unsuitable spawn point
+	return MAX_MAP_GENERATION_LIMIT;
 }