summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorparamat <paramat@users.noreply.github.com>2018-03-07 03:40:35 +0000
committerparamat <mat.gregory@virginmedia.com>2018-03-10 03:38:27 +0000
commit644d0ab2bb44df8a3aefb387736930150b7d0aed (patch)
tree8201d4809b043615c26aaabb91b79d482ee7aac1
parent473d81f2e2ad4b8077c9cfe241032c67d6a795c3 (diff)
downloadminetest-644d0ab2bb44df8a3aefb387736930150b7d0aed.tar.gz
minetest-644d0ab2bb44df8a3aefb387736930150b7d0aed.tar.bz2
minetest-644d0ab2bb44df8a3aefb387736930150b7d0aed.zip
Spawn level: Add 'get_spawn_level(x, z)' API
Returns a suitable player spawn y co-ordinate for unmodified terrain.
-rw-r--r--doc/lua_api.txt9
-rw-r--r--src/script/lua_api/l_mapgen.cpp22
-rw-r--r--src/script/lua_api/l_mapgen.h3
3 files changed, 34 insertions, 0 deletions
diff --git a/doc/lua_api.txt b/doc/lua_api.txt
index 6fe14472f..0bbf9c79b 100644
--- a/doc/lua_api.txt
+++ b/doc/lua_api.txt
@@ -3035,6 +3035,15 @@ and `minetest.auth_reload` call the authentication handler.
unattached `group:attached_node` node to fall.
* spread these updates to neighbours and can cause a cascade
of nodes to fall.
+* `minetest.get_spawn_level(x, z)`
+ * Returns a player spawn y co-ordinate for the provided (x, z) co-ordinates,
+ or `nil` for an unsuitable spawn point.
+ * For most mapgens a 'suitable spawn point' is one with y between
+ `water_level` and `water_level + 16`, and in mgv7 well away from rivers,
+ so `nil` will be returned for many (x, z) co-ordinates.
+ * The spawn level returned is for a player spawn in unmodified terrain.
+ * The spawn level is intentionally above terrain level to cope with full-node
+ biome 'dust' nodes.
### Mod channels
You can find mod channels communication scheme in `docs/mod_channels.png`.
diff --git a/src/script/lua_api/l_mapgen.cpp b/src/script/lua_api/l_mapgen.cpp
index 11d963b4d..f5c76ec6e 100644
--- a/src/script/lua_api/l_mapgen.cpp
+++ b/src/script/lua_api/l_mapgen.cpp
@@ -757,6 +757,27 @@ int ModApiMapgen::l_get_mapgen_object(lua_State *L)
}
+// get_spawn_level(x = num, z = num)
+int ModApiMapgen::l_get_spawn_level(lua_State *L)
+{
+ NO_MAP_LOCK_REQUIRED;
+
+ s16 x = luaL_checkinteger(L, 1);
+ s16 z = luaL_checkinteger(L, 2);
+
+ EmergeManager *emerge = getServer(L)->getEmergeManager();
+ int spawn_level = emerge->getSpawnLevelAtPoint(v2s16(x, z));
+ // Unsuitable spawn point
+ if (spawn_level == MAX_MAP_GENERATION_LIMIT)
+ return 0;
+
+ // 'findSpawnPos()' in server.cpp adds at least 1
+ lua_pushinteger(L, spawn_level + 1);
+
+ return 1;
+}
+
+
int ModApiMapgen::l_get_mapgen_params(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
@@ -1714,6 +1735,7 @@ void ModApiMapgen::Initialize(lua_State *L, int top)
API_FCT(get_humidity);
API_FCT(get_biome_data);
API_FCT(get_mapgen_object);
+ API_FCT(get_spawn_level);
API_FCT(get_mapgen_params);
API_FCT(set_mapgen_params);
diff --git a/src/script/lua_api/l_mapgen.h b/src/script/lua_api/l_mapgen.h
index 713069633..aebbcbac6 100644
--- a/src/script/lua_api/l_mapgen.h
+++ b/src/script/lua_api/l_mapgen.h
@@ -44,6 +44,9 @@ private:
// returns the requested object used during map generation
static int l_get_mapgen_object(lua_State *L);
+ // get_spawn_level(x = num, z = num)
+ static int l_get_spawn_level(lua_State *L);
+
// get_mapgen_params()
// returns the currently active map generation parameter set
static int l_get_mapgen_params(lua_State *L);