]> git.lizzy.rs Git - dragonfireclient.git/commitdiff
idk 20-08-2020
authorElias Fleckenstein <eliasfleckenstein@web.de>
Tue, 18 Aug 2020 17:15:19 +0000 (19:15 +0200)
committerElias Fleckenstein <eliasfleckenstein@web.de>
Tue, 18 Aug 2020 17:15:19 +0000 (19:15 +0200)
clientmods/world/init.lua
src/script/lua_api/l_env.cpp
src/script/lua_api/l_env.h

index 8ce5849c8205b339d7974df14177887a1d346796..187f498c3bc1d7f4aed98a75f000a3ca897fbf50 100644 (file)
@@ -71,24 +71,17 @@ minetest.register_globalstep(function(dtime)
                        for _, p in pairs(positions) do
                                minetest.place_node(p)
                        end
-               elseif minetest.settings:get_bool("placeoncobble") then
-                       local positions = minetest.find_nodes_near_under_air(pos, 5, "mcl_core:cobble", true)
+               elseif minetest.settings:get_bool("autotnt") then
+                       local positions = minetest.find_nodes_near_under_air_except(pos, 5, item:get_name(), true)
                        for i, p in pairs(positions) do
                                if i > 8 then break end
                                minetest.place_node(vector.add(p, {x = 0, y = 1, z = 0}))
                        end
                end
        end
-       if minetest.settings:get_bool("fucker") then
-               local p = minetest.find_node_near(pos, 5, "group:bed", true)
-               if p then
-                       minetest.dig_node(p)
-               end
-       end
 end) 
 
 minetest.register_cheat("Scaffold", "World", "scaffold")
 minetest.register_cheat("HighwayZ", "World", "highway_z")
-minetest.register_cheat("Fucker", "World", "fucker")
 minetest.register_cheat("BlockWater", "World", "destroy_liquids")
-minetest.register_cheat("PlaceOnCobble", "World", "placeoncobble")
+minetest.register_cheat("AutoTNT", "World", "autotnt")
index d80f1e025e45eb69a413dd3aadbd5a4ffd7176b0..bd5865bf670edc23e3066a5ffab40d090792e7cb 100644 (file)
@@ -782,7 +782,6 @@ int ModApiEnvMod::l_find_node_near(lua_State *L)
        int radius = luaL_checkinteger(L, 2);
        std::vector<content_t> filter;
        collectNodeIds(L, 3, ndef, filter);
-
        int start_radius = (lua_isboolean(L, 4) && readParam<bool>(L, 4)) ? 0 : 1;
 
 #ifndef SERVER
@@ -797,6 +796,7 @@ int ModApiEnvMod::l_find_node_near(lua_State *L)
                        v3s16 p = pos + i;
                        content_t c = map.getNode(p).getContent();
                        if (CONTAINS(filter, c)) {
+                               std::cout << p.X << " " << p.Y << " " << p.Z << std::endl;
                                push_v3s16(L, p);
                                return 1;
                        }
@@ -869,7 +869,6 @@ int ModApiEnvMod::l_find_nodes_near_under_air(lua_State *L)
        int radius = luaL_checkinteger(L, 2);
        std::vector<content_t> filter;
        collectNodeIds(L, 3, ndef, filter);
-
        int start_radius = (lua_isboolean(L, 4) && readParam<bool>(L, 4)) ? 0 : 1;
 
 #ifndef SERVER
@@ -911,6 +910,60 @@ int ModApiEnvMod::l_find_nodes_near_under_air(lua_State *L)
        return 2;
 }
 
+// find_nodes_near_under_air_except(pos, radius, nodenames, [search_center])
+// nodenames: eg. {"ignore", "group:tree"} or "default:dirt"
+int ModApiEnvMod::l_find_nodes_near_under_air_except(lua_State *L)
+{
+       GET_PLAIN_ENV_PTR;
+
+       const NodeDefManager *ndef = env->getGameDef()->ndef();
+       Map &map = env->getMap();
+
+       v3s16 pos = read_v3s16(L, 1);
+       int radius = luaL_checkinteger(L, 2);
+       std::vector<content_t> filter;
+       collectNodeIds(L, 3, ndef, filter);
+       int start_radius = (lua_isboolean(L, 4) && readParam<bool>(L, 4)) ? 0 : 1;
+
+#ifndef SERVER
+       // Client API limitations
+       if (Client *client = getClient(L))
+               radius = client->CSMClampRadius(pos, radius);
+#endif
+       
+       std::vector<u32> individual_count;
+       individual_count.resize(filter.size());
+       
+       lua_newtable(L);
+       u32 i = 0;
+       
+       for (int d = start_radius; d <= radius; d++) {
+               const std::vector<v3s16> &list = FacePositionCache::getFacePositions(d);
+               for (const v3s16 &posi : list) {
+                       v3s16 p = pos + posi;
+                       content_t c = map.getNode(p).getContent();
+                       v3s16 psurf(p.X, p.Y + 1, p.Z);
+                       content_t csurf = map.getNode(psurf).getContent();
+                       if (c == CONTENT_AIR || csurf != CONTENT_AIR)
+                               continue;
+                       auto it = std::find(filter.begin(), filter.end(), c);
+                       if (it == filter.end()) {
+                               push_v3s16(L, p);
+                               lua_rawseti(L, -2, ++i);
+
+                               u32 filt_index = it - filter.begin();
+                               individual_count[filt_index]++;
+                       }
+               }
+       }
+       lua_createtable(L, 0, filter.size());
+       for (u32 i = 0; i < filter.size(); i++) {
+               lua_pushinteger(L, individual_count[i]);
+               lua_setfield(L, -2, ndef->get(filter[i]).name.c_str());
+       }
+       return 2;
+}
+
 // find_nodes_in_area(minp, maxp, nodenames, [grouped])
 int ModApiEnvMod::l_find_nodes_in_area(lua_State *L)
 {
@@ -1515,6 +1568,7 @@ void ModApiEnvMod::InitializeClient(lua_State *L, int top)
        API_FCT(find_node_near);
        API_FCT(find_nodes_near);
        API_FCT(find_nodes_near_under_air);
+       API_FCT(find_nodes_near_under_air_except);
        API_FCT(find_nodes_in_area);
        API_FCT(find_nodes_in_area_under_air);
        API_FCT(line_of_sight);
index e31fba8be968832965e112082fd2ef3fe8785700..e1b89494b32a29d6b63ca8658165ea1de2d43584 100644 (file)
@@ -134,6 +134,10 @@ class ModApiEnvMod : public ModApiBase {
        // find_nodes_near_under_air(pos, radius, nodenames, search_center) -> list of positions
        // nodenames: eg. {"ignore", "group:tree"} or "default:dirt"
        static int l_find_nodes_near_under_air(lua_State *L);
+       
+       // find_nodes_near_under_air(pos, radius, nodenames, search_center) -> list of positions
+       // nodenames: eg. {"ignore", "group:tree"} or "default:dirt"
+       static int l_find_nodes_near_under_air_except(lua_State *L);
 
        // find_nodes_in_area(minp, maxp, nodenames) -> list of positions
        // nodenames: eg. {"ignore", "group:tree"} or "default:dirt"