Add option to also check the center to `find_node_near` (#5255)
authorred-001 <red-001@outlook.ie>
Thu, 4 May 2017 20:52:58 +0000 (21:52 +0100)
committerLoïc Blot <nerzhul@users.noreply.github.com>
Thu, 4 May 2017 20:52:58 +0000 (22:52 +0200)
* Add option to also check the center to `find_node_near`

doc/lua_api.txt
src/script/lua_api/l_env.cpp
src/script/lua_api/l_env.h

index 599e02fcb190ae1e511989ac0614fc59dce1ec90..1550a78bea1b78e8f5385adfe0ec114e3d2cab8a 100644 (file)
@@ -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"`
index 85791f90b0740366e4fc8bf81df0c686f05e5605..0ded1265841f23d4aa17e739631fbcfd50c9479c 100644 (file)
@@ -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<content_t> 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<v3s16> list = FacePositionCache::getFacePositions(d);
                for (std::vector<v3s16>::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;
                        }
index 3f688b398326cc08013e854e806ecd3e430002b7..629c6bc39e53591a0839d19c2e06d7b20e63ea62 100644 (file)
@@ -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);