end,\r
})\r
\r
+local clearcut_cache\r
+\r
+local function clearcut(pos1, pos2)\r
+ -- decide which nodes we consider plants\r
+ if clearcut_cache == nil then\r
+ clearcut_cache = {}\r
+ for name, def in pairs(minetest.registered_nodes) do\r
+ local groups = def.groups or {}\r
+ if (\r
+ -- the groups say so\r
+ groups.flower or groups.grass or groups.flora or groups.plant or\r
+ groups.leaves or groups.tree or groups.leafdecay or groups.sapling or\r
+ -- drawtype heuristic\r
+ (def.is_ground_content and def.buildable_to and\r
+ (def.sunlight_propagates or not def.walkable)\r
+ and def.drawtype == "plantlike") or\r
+ -- if it's flammable, it probably needs to go too\r
+ (def.is_ground_content and not def.walkable and groups.flammable)\r
+ ) then\r
+ clearcut_cache[name] = true\r
+ end\r
+ end\r
+ end\r
+ local plants = clearcut_cache\r
+\r
+ local count = 0\r
+ local prev, any\r
+\r
+ for x = pos1.x, pos2.x do\r
+ for z = pos1.z, pos2.z do\r
+ prev = false\r
+ any = false\r
+ -- first pass: remove floating nodes that would be left over\r
+ for y = pos1.y, pos2.y do\r
+ local n = minetest.get_node({x=x, y=y, z=z}).name\r
+ if plants[n] then\r
+ prev = true\r
+ any = true\r
+ elseif prev then\r
+ local def = minetest.registered_nodes[n] or {}\r
+ local groups = def.groups or {}\r
+ if groups.attached_node or (def.buildable_to and groups.falling_node) then\r
+ minetest.remove_node({x=x, y=y, z=z})\r
+ count = count + 1\r
+ else\r
+ prev = false\r
+ end\r
+ end\r
+ end\r
+\r
+ -- second pass: remove plants, top-to-bottom to avoid item drops\r
+ if any then\r
+ for y = pos2.y, pos1.y, -1 do\r
+ local n = minetest.get_node({x=x, y=y, z=z}).name\r
+ if plants[n] then\r
+ minetest.remove_node({x=x, y=y, z=z})\r
+ count = count + 1\r
+ end\r
+ end\r
+ end\r
+ end\r
+ end\r
+\r
+ return count\r
+end\r
+\r
+worldedit.register_command("clearcut", {\r
+ params = "",\r
+ description = "Remove any plant, tree or foilage-like nodes in the selected region",\r
+ privs = {worldedit=true},\r
+ require_pos = 2,\r
+ nodes_needed = check_region,\r
+ func = function(name)\r
+ local pos1, pos2 = worldedit.sort_pos(worldedit.pos1[name], worldedit.pos2[name])\r
+ local count = clearcut(pos1, pos2)\r
+ worldedit.player_notify(name, count .. " nodes removed")\r
+ end,\r
+})\r
+\r
worldedit.register_command("hide", {\r
params = "",\r
description = "Hide all nodes in the current WorldEdit region non-destructively",\r