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
stable-0.4
paramat 2015-10-29 00:17:48 +00:00
parent 182b3fd283
commit c0a7c670a4
4 changed files with 18 additions and 4 deletions

View File

@ -693,6 +693,12 @@ enable_pvp (Player versus Player) bool true
# If this is set, players will always (re)spawn at the given position. # If this is set, players will always (re)spawn at the given position.
static_spawnpoint (Static spawnpoint) string 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. # If enabled, new players cannot join with an empty password.
disallow_empty_password (Disallow empty passwords) bool false disallow_empty_password (Disallow empty passwords) bool false

View File

@ -829,6 +829,13 @@
# type: string # type: string
# static_spawnpoint = # 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. # If enabled, new players cannot join with an empty password.
# type: bool # type: bool
# disallow_empty_password = false # disallow_empty_password = false

View File

@ -245,6 +245,7 @@ void set_default_settings(Settings *settings)
settings->setDefault("default_privs", "interact, shout"); settings->setDefault("default_privs", "interact, shout");
settings->setDefault("player_transfer_distance", "0"); settings->setDefault("player_transfer_distance", "0");
settings->setDefault("enable_pvp", "true"); settings->setDefault("enable_pvp", "true");
settings->setDefault("vertical_spawn_range", "16");
settings->setDefault("disallow_empty_password", "false"); settings->setDefault("disallow_empty_password", "false");
settings->setDefault("disable_anticheat", "false"); settings->setDefault("disable_anticheat", "false");
settings->setDefault("enable_rollback_recording", "false"); settings->setDefault("enable_rollback_recording", "false");

View File

@ -3269,7 +3269,7 @@ v3f Server::findSpawnPos()
} }
s16 water_level = map.getWaterLevel(); s16 water_level = map.getWaterLevel();
s16 vertical_spawn_range = g_settings->getS16("vertical_spawn_range");
bool is_good = false; bool is_good = false;
// Try to find a good place a few times // Try to find a good place a few times
@ -3282,9 +3282,9 @@ v3f Server::findSpawnPos()
// Get ground height at point // Get ground height at point
s16 groundheight = map.findGroundLevel(nodepos2d); s16 groundheight = map.findGroundLevel(nodepos2d);
if (groundheight <= water_level) // Don't go underwater // Don't go underwater or to high places
continue; if (groundheight <= water_level ||
if (groundheight > water_level + 6) // Don't go to high places groundheight > water_level + vertical_spawn_range)
continue; continue;
v3s16 nodepos(nodepos2d.X, groundheight, nodepos2d.Y); v3s16 nodepos(nodepos2d.X, groundheight, nodepos2d.Y);