findSpawnPos: Add setting for max height above water level
authorparamat <mat.gregory@virginmedia.com>
Thu, 29 Oct 2015 00:17:48 +0000 (00:17 +0000)
committerparamat <mat.gregory@virginmedia.com>
Thu, 29 Oct 2015 20:03:15 +0000 (20:03 +0000)
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
minetest.conf.example
src/defaultsettings.cpp
src/server.cpp

index 2eee055c815cc1ec3b4797c41aca40c9f674eef9..6fbc8f2447037dde46b25a58de0b76df2ab75c1f 100644 (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.
 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
 
index d5c161866c2c49f9b799670e6cb8b4a11f744db7..d523b75e6e92d69d6bd43f51e89278a3f730cca4 100644 (file)
 #    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
index ac62b2060270834712ae0438d367d59b73ffd6e1..4a420445c70aedfa4b5a4818334f3284d2411970 100644 (file)
@@ -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");
index 1e039631cf60c2c09698b09cc2c21a71abe1cd45..09675dae3afa4807d5ef2027f5cd920fd02aea25 100644 (file)
@@ -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);