From 56ea77ea96b62059c03ba53c15da56c72ea7e140 Mon Sep 17 00:00:00 2001
From: paramat <mat.gregory@virginmedia.com>
Date: Mon, 26 Sep 2016 23:21:33 +0100
Subject: [PATCH] Mgv7: Avoid mid-air spawn on disabled mountain terrain,
 optimise function

'getSpawnLevelAtPoint()' did not account for disabled mountains, it
was possible to be spawned in mid-air where a mountain surface would
have been.

Avoid check for river area if rivers are disabled.
---
 src/mapgen_v7.cpp | 26 ++++++++++++++++++--------
 1 file changed, 18 insertions(+), 8 deletions(-)

diff --git a/src/mapgen_v7.cpp b/src/mapgen_v7.cpp
index d14fdb97a..86f559af3 100644
--- a/src/mapgen_v7.cpp
+++ b/src/mapgen_v7.cpp
@@ -154,17 +154,27 @@ int MapgenV7::getSpawnLevelAtPoint(v2s16 p)
 	// Base terrain calculation
 	s16 y = baseTerrainLevelAtPoint(p.X, p.Y);
 
-	// Ridge/river terrain calculation
-	float width = 0.2;
-	float uwatern = NoisePerlin2D(&noise_ridge_uwater->np, p.X, p.Y, seed) * 2;
-	// if inside a river this is an unsuitable spawn point
-	if (fabs(uwatern) <= width)
-		return MAX_MAP_GENERATION_LIMIT;
+	// If enabled, check if inside a river
+	if (spflags & MGV7_RIDGES) {
+		float width = 0.2;
+		float uwatern = NoisePerlin2D(&noise_ridge_uwater->np, p.X, p.Y, seed) * 2;
+		if (fabs(uwatern) <= width)
+			return MAX_MAP_GENERATION_LIMIT;  // Unsuitable spawn point
+	}
+
+	// If mountains are disabled, terrain level is base terrain level
+	// Avoids spawn on non-existant mountain terrain
+	if (!(spflags & MGV7_MOUNTAINS)) {
+		if (y <= water_level || y > water_level + 16)
+			return MAX_MAP_GENERATION_LIMIT;  // Unsuitable spawn point
+		else
+			return y;
+	}
 
 	// Mountain terrain calculation
 	int iters = 128;
 	while (iters--) {
-		if (!getMountainTerrainAtPoint(p.X, y + 1, p.Y)) {  // Air, y is ground level
+		if (!getMountainTerrainAtPoint(p.X, y + 1, p.Y)) {  // If air above
 			if (y <= water_level || y > water_level + 16)
 				return MAX_MAP_GENERATION_LIMIT;  // Unsuitable spawn point
 			else
@@ -173,7 +183,7 @@ int MapgenV7::getSpawnLevelAtPoint(v2s16 p)
 		y++;
 	}
 
-	// Unsuitable spawn point, no ground surface found
+	// Unsuitable spawn point, no mountain surface found
 	return MAX_MAP_GENERATION_LIMIT;
 }
 
-- 
GitLab