Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Spawn level: Add 'get_spawn_level(x, z)' API
Returns a suitable player spawn y co-ordinate for unmodified terrain.
  • Loading branch information
paramat committed Mar 10, 2018
1 parent 473d81f commit 644d0ab
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 0 deletions.
9 changes: 9 additions & 0 deletions doc/lua_api.txt
Expand Up @@ -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`.
Expand Down
22 changes: 22 additions & 0 deletions src/script/lua_api/l_mapgen.cpp
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down
3 changes: 3 additions & 0 deletions src/script/lua_api/l_mapgen.h
Expand Up @@ -44,6 +44,9 @@ class ModApiMapgen : public ModApiBase
// 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);
Expand Down

0 comments on commit 644d0ab

Please sign in to comment.