From fdb9140825716be49c99e6a27bb123432b9cb285 Mon Sep 17 00:00:00 2001 From: Craig Robbins Date: Fri, 27 Feb 2015 21:42:00 +1000 Subject: [PATCH] Change find_surface_nodes_in_area to find_nodes_in_area_under_air --- doc/lua_api.txt | 2 +- src/script/lua_api/l_env.cpp | 26 +++++++++++++++++--------- src/script/lua_api/l_env.h | 2 +- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 739fcef83..d73fb7721 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -1869,7 +1869,7 @@ and `minetest.auth_reload` call the authetification handler. * `nodenames`: e.g. `{"ignore", "group:tree"}` or `"default:dirt"` * `minetest.find_nodes_in_area(minp, maxp, nodenames)`: returns a list of positions * `nodenames`: e.g. `{"ignore", "group:tree"}` or `"default:dirt"` -* `minetest.find_surface_nodes_in_area(minp, maxp, nodenames)`: returns a list of positions +* `minetest.find_nodes_in_area_under_air(minp, maxp, nodenames)`: returns a list of positions * returned positions are nodes with a node air above * `nodenames`: e.g. `{"ignore", "group:tree"}` or `"default:dirt"` * `minetest.get_perlin(noiseparams)` diff --git a/src/script/lua_api/l_env.cpp b/src/script/lua_api/l_env.cpp index ca1586e39..1f1d8bffa 100644 --- a/src/script/lua_api/l_env.cpp +++ b/src/script/lua_api/l_env.cpp @@ -570,17 +570,25 @@ int ModApiEnvMod::l_find_nodes_in_area(lua_State *L) return 1; } -// find_surface_nodes_in_area(minp, maxp, nodenames) -> list of positions -// nodenames: eg. {"ignore", "group:tree"} or "default:dirt" -int ModApiEnvMod::l_find_surface_nodes_in_area(lua_State *L) +// find_nodes_in_area_under_air(minp, maxp, nodenames) -> list of positions +// nodenames: e.g. {"ignore", "group:tree"} or "default:dirt" +int ModApiEnvMod::l_find_nodes_in_area_under_air(lua_State *L) { + /* Note: A similar but generalized (and therefore slower) version of this + * function could be created -- e.g. find_nodes_in_area_under -- which + * would accept a node name (or ID?) or list of names that the "above node" + * should be. + * TODO + */ + GET_ENV_PTR; INodeDefManager *ndef = getServer(L)->ndef(); v3s16 minp = read_v3s16(L, 1); v3s16 maxp = read_v3s16(L, 2); std::set filter; - if(lua_istable(L, 3)) { + + if (lua_istable(L, 3)) { int table = 3; lua_pushnil(L); while(lua_next(L, table) != 0) { @@ -590,18 +598,18 @@ int ModApiEnvMod::l_find_surface_nodes_in_area(lua_State *L) // removes value, keeps key for next iteration lua_pop(L, 1); } - } else if(lua_isstring(L, 3)) { + } else if (lua_isstring(L, 3)) { ndef->getIds(lua_tostring(L, 3), filter); } lua_newtable(L); u64 i = 0; - for(s16 x = minp.X; x <= maxp.X; x++) - for(s16 z = minp.Z; z <= maxp.Z; z++) { + for (s16 x = minp.X; x <= maxp.X; x++) + for (s16 z = minp.Z; z <= maxp.Z; z++) { s16 y = minp.Y; v3s16 p(x, y, z); content_t c = env->getMap().getNodeNoEx(p).getContent(); - for(; y <= maxp.Y; y++) { + for (; y <= maxp.Y; y++) { v3s16 psurf(x, y + 1, z); content_t csurf = env->getMap().getNodeNoEx(psurf).getContent(); if(c != CONTENT_AIR && csurf == CONTENT_AIR && @@ -912,7 +920,7 @@ void ModApiEnvMod::Initialize(lua_State *L, int top) API_FCT(get_gametime); API_FCT(find_node_near); API_FCT(find_nodes_in_area); - API_FCT(find_surface_nodes_in_area); + API_FCT(find_nodes_in_area_under_air); API_FCT(delete_area); API_FCT(get_perlin); API_FCT(get_perlin_map); diff --git a/src/script/lua_api/l_env.h b/src/script/lua_api/l_env.h index 807afe459..5c9afd2f1 100644 --- a/src/script/lua_api/l_env.h +++ b/src/script/lua_api/l_env.h @@ -121,7 +121,7 @@ private: // find_surface_nodes_in_area(minp, maxp, nodenames) -> list of positions // nodenames: eg. {"ignore", "group:tree"} or "default:dirt" - static int l_find_surface_nodes_in_area(lua_State *L); + static int l_find_nodes_in_area_under_air(lua_State *L); // delete_area(p1, p2) -> true/false static int l_delete_area(lua_State *L);