From c0a7c670a465b4c05d90a8a4e8001797ec4e628a Mon Sep 17 00:00:00 2001 From: paramat Date: Thu, 29 Oct 2015 00:17:48 +0000 Subject: [PATCH] findSpawnPos: Add setting for max height above water level Increase default from 6 to 16 to help with mgv7 and mgfractal Large-scale or alternative mapgens can result in a lowland spawn point not being found, causing a spawn at (0, 0, 0) possibly buried underground The max height is now settable to allow correct player spawn in any mapgen or when using custom noise parameters --- builtin/settingtypes.txt | 6 ++++++ minetest.conf.example | 7 +++++++ src/defaultsettings.cpp | 1 + src/server.cpp | 8 ++++---- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index 2eee055c8..6fbc8f244 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -693,6 +693,12 @@ enable_pvp (Player versus Player) bool true # If this is set, players will always (re)spawn at the given position. static_spawnpoint (Static spawnpoint) string +# Maximum distance above water level for player spawn. +# Larger values result in spawn points closer to (x = 0, z = 0). +# Smaller values may result in a suitable spawn point not being found, +# resulting in a spawn at (0, 0, 0) possibly buried underground. +vertical_spawn_range (Vertical spawn range) int 16 + # If enabled, new players cannot join with an empty password. disallow_empty_password (Disallow empty passwords) bool false diff --git a/minetest.conf.example b/minetest.conf.example index d5c161866..d523b75e6 100644 --- a/minetest.conf.example +++ b/minetest.conf.example @@ -829,6 +829,13 @@ # type: string # static_spawnpoint = +# Maximum distance above water level for player spawn. +# Larger values result in spawn points closer to (x = 0, z = 0). +# Smaller values may result in a suitable spawn point not being found, +# resulting in a spawn at (0, 0, 0) possibly buried underground. +# type: int +# vertical_spawn_range = 16 + # If enabled, new players cannot join with an empty password. # type: bool # disallow_empty_password = false diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index ac62b2060..4a420445c 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -245,6 +245,7 @@ void set_default_settings(Settings *settings) settings->setDefault("default_privs", "interact, shout"); settings->setDefault("player_transfer_distance", "0"); settings->setDefault("enable_pvp", "true"); + settings->setDefault("vertical_spawn_range", "16"); settings->setDefault("disallow_empty_password", "false"); settings->setDefault("disable_anticheat", "false"); settings->setDefault("enable_rollback_recording", "false"); diff --git a/src/server.cpp b/src/server.cpp index 1e039631c..09675dae3 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -3269,7 +3269,7 @@ v3f Server::findSpawnPos() } s16 water_level = map.getWaterLevel(); - + s16 vertical_spawn_range = g_settings->getS16("vertical_spawn_range"); bool is_good = false; // Try to find a good place a few times @@ -3282,9 +3282,9 @@ v3f Server::findSpawnPos() // Get ground height at point s16 groundheight = map.findGroundLevel(nodepos2d); - if (groundheight <= water_level) // Don't go underwater - continue; - if (groundheight > water_level + 6) // Don't go to high places + // Don't go underwater or to high places + if (groundheight <= water_level || + groundheight > water_level + vertical_spawn_range) continue; v3s16 nodepos(nodepos2d.X, groundheight, nodepos2d.Y);