]> git.lizzy.rs Git - worldedit.git/commitdiff
Use minetest.get_objects_in_area when possible
authorsfan5 <sfan5@live.de>
Fri, 30 Apr 2021 17:33:27 +0000 (19:33 +0200)
committersfan5 <sfan5@live.de>
Fri, 30 Apr 2021 17:33:27 +0000 (19:33 +0200)
worldedit/manipulations.lua

index 3bad0ddc5c254b0e4e607fd5bbc48f8fa4c9b792..54dc8885031f26a246e8dcc47a83804bfae93800 100644 (file)
@@ -640,10 +640,34 @@ function worldedit.clear_objects(pos1, pos2)
 \r
        worldedit.keep_loaded(pos1, pos2)\r
 \r
+       local function should_delete(obj)\r
+               -- Avoid players and WorldEdit entities\r
+               if obj:is_player() then\r
+                       return false\r
+               end\r
+               local entity = obj:get_luaentity()\r
+               return not entity or not entity.name:find("^worldedit:")\r
+       end\r
+\r
        -- Offset positions to include full nodes (positions are in the center of nodes)\r
        local pos1x, pos1y, pos1z = pos1.x - 0.5, pos1.y - 0.5, pos1.z - 0.5\r
        local pos2x, pos2y, pos2z = pos2.x + 0.5, pos2.y + 0.5, pos2.z + 0.5\r
 \r
+       local count = 0\r
+       if minetest.get_objects_in_area then\r
+               local objects = minetest.get_objects_in_area({x=pos1x, y=pos1y, z=pos1z},\r
+                       {x=pos2x, y=pos2y, z=pos2z})\r
+\r
+               for _, obj in pairs(objects) do\r
+                       if should_delete(obj) then\r
+                               obj:remove()\r
+                               count = count + 1\r
+                       end\r
+               end\r
+               return count\r
+       end\r
+\r
+       -- Fallback implementation via get_objects_inside_radius\r
        -- Center of region\r
        local center = {\r
                x = pos1x + ((pos2x - pos1x) / 2),\r
@@ -655,12 +679,8 @@ function worldedit.clear_objects(pos1, pos2)
                        (center.x - pos1x) ^ 2 +\r
                        (center.y - pos1y) ^ 2 +\r
                        (center.z - pos1z) ^ 2)\r
-       local count = 0\r
        for _, obj in pairs(minetest.get_objects_inside_radius(center, radius)) do\r
-               local entity = obj:get_luaentity()\r
-               -- Avoid players and WorldEdit entities\r
-               if not obj:is_player() and (not entity or\r
-                               not entity.name:find("^worldedit:")) then\r
+               if should_delete(obj) then\r
                        local pos = obj:get_pos()\r
                        if pos.x >= pos1x and pos.x <= pos2x and\r
                                        pos.y >= pos1y and pos.y <= pos2y and\r