From d6cf5450a897b00e5ed0d053f14108c94dfb3701 Mon Sep 17 00:00:00 2001 From: red-001 Date: Thu, 4 May 2017 21:52:58 +0100 Subject: [PATCH] Add option to also check the center to `find_node_near` (#5255) * Add option to also check the center to `find_node_near` --- doc/lua_api.txt | 4 +++- src/script/lua_api/l_env.cpp | 16 ++++++++-------- src/script/lua_api/l_env.h | 2 +- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 599e02fc..1550a78b 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -2280,9 +2280,11 @@ and `minetest.auth_reload` call the authetification handler. * `minetest.get_gametime()`: returns the time, in seconds, since the world was created * `minetest.get_day_count()`: returns number days elapsed since world was created, * accounting for time changes. -* `minetest.find_node_near(pos, radius, nodenames)`: returns pos or `nil` +* `minetest.find_node_near(pos, radius, nodenames, [search_center])`: returns pos or `nil` * `radius`: using a maximum metric * `nodenames`: e.g. `{"ignore", "group:tree"}` or `"default:dirt"` + * `search_center` is an optional boolean (default: `false`) + If true `pos` is also checked for the nodes * `minetest.find_nodes_in_area(minp, maxp, nodenames)`: returns a list of positions * returns as second value a table with the count of the individual nodes found * `nodenames`: e.g. `{"ignore", "group:tree"}` or `"default:dirt"` diff --git a/src/script/lua_api/l_env.cpp b/src/script/lua_api/l_env.cpp index 85791f90..0ded1265 100644 --- a/src/script/lua_api/l_env.cpp +++ b/src/script/lua_api/l_env.cpp @@ -599,7 +599,7 @@ int ModApiEnvMod::l_get_gametime(lua_State *L) } -// find_node_near(pos, radius, nodenames) -> pos or nil +// find_node_near(pos, radius, nodenames, search_center) -> pos or nil // nodenames: eg. {"ignore", "group:tree"} or "default:dirt" int ModApiEnvMod::l_find_node_near(lua_State *L) { @@ -612,27 +612,27 @@ int ModApiEnvMod::l_find_node_near(lua_State *L) v3s16 pos = read_v3s16(L, 1); int radius = luaL_checkinteger(L, 2); std::set filter; - if(lua_istable(L, 3)){ - int table = 3; + if (lua_istable(L, 3)) { lua_pushnil(L); - while(lua_next(L, table) != 0){ + while (lua_next(L, 3) != 0) { // key at index -2 and value at index -1 luaL_checktype(L, -1, LUA_TSTRING); ndef->getIds(lua_tostring(L, -1), filter); // 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); } - for (int d=1; d<=radius; d++){ + int start_radius = (lua_toboolean(L, 4)) ? 0 : 1; + for (int d = start_radius; d <= radius; d++) { std::vector list = FacePositionCache::getFacePositions(d); for (std::vector::iterator i = list.begin(); - i != list.end(); ++i){ + i != list.end(); ++i) { v3s16 p = pos + (*i); content_t c = env->getMap().getNodeNoEx(p).getContent(); - if (filter.count(c) != 0){ + if (filter.count(c) != 0) { push_v3s16(L, p); return 1; } diff --git a/src/script/lua_api/l_env.h b/src/script/lua_api/l_env.h index 3f688b39..629c6bc3 100644 --- a/src/script/lua_api/l_env.h +++ b/src/script/lua_api/l_env.h @@ -116,7 +116,7 @@ private: // get_day_count() -> int static int l_get_day_count(lua_State *L); - // find_node_near(pos, radius, nodenames) -> pos or nil + // find_node_near(pos, radius, nodenames, search_center) -> pos or nil // nodenames: eg. {"ignore", "group:tree"} or "default:dirt" static int l_find_node_near(lua_State *L);