]> git.lizzy.rs Git - worldedit.git/blobdiff - worldedit/visualization.lua
Make object right-click work with wand
[worldedit.git] / worldedit / visualization.lua
index f3d4a353d85e94f4fac47ec3d252b3bbc2f2927b..326a6c1d17e114e266bbf38e7d49e003b0553f7e 100644 (file)
@@ -1,54 +1,40 @@
-worldedit = worldedit or {}\r
-\r
---modifies positions `pos1` and `pos2` so that each component of `pos1` is less than or equal to its corresponding conent of `pos2`, returning two new positions\r
-worldedit.sort_pos = function(pos1, pos2)\r
-       pos1 = {x=pos1.x, y=pos1.y, z=pos1.z}\r
-       pos2 = {x=pos2.x, y=pos2.y, z=pos2.z}\r
-       if pos1.x > pos2.x then\r
-               pos2.x, pos1.x = pos1.x, pos2.x\r
-       end\r
-       if pos1.y > pos2.y then\r
-               pos2.y, pos1.y = pos1.y, pos2.y\r
-       end\r
-       if pos1.z > pos2.z then\r
-               pos2.z, pos1.z = pos1.z, pos2.z\r
-       end\r
-       return pos1, pos2\r
-end\r
-\r
---determines the volume of the region defined by positions `pos1` and `pos2`, returning the volume\r
-worldedit.volume = function(pos1, pos2)\r
-       local pos1, pos2 = worldedit.sort_pos(pos1, pos2)\r
-       return (pos2.x - pos1.x + 1) * (pos2.y - pos1.y + 1) * (pos2.z - pos1.z + 1)\r
-end\r
+--- Functions for visibly hiding nodes\r
+-- @module worldedit.visualization\r
 \r
 minetest.register_node("worldedit:placeholder", {\r
        drawtype = "airlike",\r
        paramtype = "light",\r
        sunlight_propagates = true,\r
        diggable = false,\r
+       pointable = false,\r
+       walkable = false,\r
        groups = {not_in_creative_inventory=1},\r
 })\r
 \r
---hides all nodes in a region defined by positions `pos1` and `pos2` by non-destructively replacing them with invisible nodes, returning the number of nodes hidden\r
-worldedit.hide = function(pos1, pos2)\r
-       local pos1, pos2 = worldedit.sort_pos(pos1, pos2)\r
-       local env = minetest.env\r
+--- Hides all nodes in a region defined by positions `pos1` and `pos2` by\r
+-- non-destructively replacing them with invisible nodes.\r
+-- @return The number of nodes hidden.\r
+function worldedit.hide(pos1, pos2)\r
+       pos1, pos2 = worldedit.sort_pos(pos1, pos2)\r
+\r
+       worldedit.keep_loaded(pos1, pos2)\r
 \r
        local pos = {x=pos1.x, y=0, z=0}\r
-       local placeholder = {name="worldedit:placeholder", param1=0, param2=0}\r
+       local get_node, get_meta, swap_node = minetest.get_node,\r
+                       minetest.get_meta, minetest.swap_node\r
        while pos.x <= pos2.x do\r
                pos.y = pos1.y\r
                while pos.y <= pos2.y do\r
                        pos.z = pos1.z\r
                        while pos.z <= pos2.z do\r
-                               local node = env:get_node(pos)\r
-                               placeholder.param1, placeholder.param2 = node.param1, node.param2 --copy node's param1 and param2\r
-                               local data = env:get_meta(pos):to_table() --obtain metadata of original node\r
-                               env:add_node(pos, placeholder) --add placeholder node\r
-                               local meta = env:get_meta(pos) --obtain placeholder meta\r
-                               meta:from_table(data) --set placeholder metadata to the original node's metadata\r
-                               meta:set_string("worldedit_placeholder", node.name)  --add the node's name\r
+                               local node = get_node(pos)\r
+                               if node.name ~= "air" and node.name ~= "worldedit:placeholder" then\r
+                                       -- Save the node's original name\r
+                                       get_meta(pos):set_string("worldedit_placeholder", node.name)\r
+                                       -- Swap in placeholder node\r
+                                       node.name = "worldedit:placeholder"\r
+                                       swap_node(pos, node)\r
+                               end\r
                                pos.z = pos.z + 1\r
                        end\r
                        pos.y = pos.y + 1\r
@@ -58,69 +44,59 @@ worldedit.hide = function(pos1, pos2)
        return worldedit.volume(pos1, pos2)\r
 end\r
 \r
---suppresses all instances of `nodename` in a region defined by positions `pos1` and `pos2` by non-destructively replacing them with invisible nodes, returning the number of nodes suppressed\r
-worldedit.suppress = function(pos1, pos2, nodename)\r
-       local pos1, pos2 = worldedit.sort_pos(pos1, pos2)\r
-       local env = minetest.env\r
-\r
-       if minetest.registered_nodes[nodename] == nil then\r
-               nodename = "default:" .. nodename\r
+--- Suppresses all instances of `node_name` in a region defined by positions\r
+-- `pos1` and `pos2` by non-destructively replacing them with invisible nodes.\r
+-- @return The number of nodes suppressed.\r
+function worldedit.suppress(pos1, pos2, node_name)\r
+       -- Ignore placeholder supression\r
+       if node_name == "worldedit:placeholder" then\r
+               return 0\r
        end\r
 \r
-       local pos = {x=pos1.x, y=0, z=0}\r
-       local placeholder = {name="worldedit:placeholder", param1=0, param2=0}\r
-       local count = 0\r
-       while pos.x <= pos2.x do\r
-               pos.y = pos1.y\r
-               while pos.y <= pos2.y do\r
-                       pos.z = pos1.z\r
-                       while pos.z <= pos2.z do\r
-                               local node = env:get_node(pos)\r
-                               if node.name == nodename then\r
-                                       placeholder.param1, placeholder.param2 = node.param1, node.param2 --copy node's param1 and param2\r
-                                       local data = env:get_meta(pos):to_table() --obtain metadata of original node\r
-                                       env:add_node(pos, placeholder) --add placeholder node\r
-                                       local meta = env:get_meta(pos) --obtain placeholder meta\r
-                                       meta:from_table(data) --set placeholder metadata to the original node's metadata\r
-                                       meta:set_string("worldedit_placeholder", nodename)  --add the node's name\r
-                                       count = count + 1\r
-                               end\r
-                               pos.z = pos.z + 1\r
-                       end\r
-                       pos.y = pos.y + 1\r
-               end\r
-               pos.x = pos.x + 1\r
+       pos1, pos2 = worldedit.sort_pos(pos1, pos2)\r
+\r
+       worldedit.keep_loaded(pos1, pos2)\r
+\r
+       local nodes = minetest.find_nodes_in_area(pos1, pos2, node_name)\r
+       local get_node, get_meta, swap_node = minetest.get_node,\r
+                       minetest.get_meta, minetest.swap_node\r
+       for _, pos in ipairs(nodes) do\r
+               local node = get_node(pos)\r
+               -- Save the node's original name\r
+               get_meta(pos):set_string("worldedit_placeholder", node.name)\r
+               -- Swap in placeholder node\r
+               node.name = "worldedit:placeholder"\r
+               swap_node(pos, node)\r
        end\r
-       return count\r
+       return #nodes\r
 end\r
 \r
---finds all instances of `nodename` in a region defined by positions `pos1` and `pos2` by non-destructively hiding all other nodes, returning the number of nodes found\r
-worldedit.find = function(pos1, pos2, nodename)\r
-       local pos1, pos2 = worldedit.sort_pos(pos1, pos2)\r
-       local env = minetest.env\r
+--- Highlights all instances of `node_name` in a region defined by positions\r
+-- `pos1` and `pos2` by non-destructively hiding all other nodes.\r
+-- @return The number of nodes found.\r
+function worldedit.highlight(pos1, pos2, node_name)\r
+       pos1, pos2 = worldedit.sort_pos(pos1, pos2)\r
 \r
-       if minetest.registered_nodes[nodename] == nil then\r
-               nodename = "default:" .. nodename\r
-       end\r
+       worldedit.keep_loaded(pos1, pos2)\r
 \r
        local pos = {x=pos1.x, y=0, z=0}\r
-       local placeholder = {name="worldedit:placeholder", param1=0, param2=0}\r
+       local get_node, get_meta, swap_node = minetest.get_node,\r
+                       minetest.get_meta, minetest.swap_node\r
        local count = 0\r
        while pos.x <= pos2.x do\r
                pos.y = pos1.y\r
                while pos.y <= pos2.y do\r
                        pos.z = pos1.z\r
                        while pos.z <= pos2.z do\r
-                               local node = env:get_node(pos)\r
-                               if node.name == nodename then --node found\r
+                               local node = get_node(pos)\r
+                               if node.name == node_name then -- Node found\r
                                        count = count + 1\r
-                               else --hide other nodes\r
-                                       placeholder.param1, placeholder.param2 = node.param1, node.param2 --copy node's param1 and param2\r
-                                       local data = env:get_meta(pos):to_table() --obtain metadata of original node\r
-                                       env:add_node(pos, placeholder) --add placeholder node\r
-                                       local meta = env:get_meta(pos) --obtain placeholder meta\r
-                                       meta:from_table(data) --set placeholder metadata to the original node's metadata\r
-                                       meta:set_string("worldedit_placeholder", node.name)  --add the node's name\r
+                               elseif node.name ~= "worldedit:placeholder" then -- Hide other nodes\r
+                                       -- Save the node's original name\r
+                                       get_meta(pos):set_string("worldedit_placeholder", node.name)\r
+                                       -- Swap in placeholder node\r
+                                       node.name = "worldedit:placeholder"\r
+                                       swap_node(pos, node)\r
                                end\r
                                pos.z = pos.z + 1\r
                        end\r
@@ -131,34 +107,26 @@ worldedit.find = function(pos1, pos2, nodename)
        return count\r
 end\r
 \r
---restores all nodes hidden with WorldEdit functions in a region defined by positions `pos1` and `pos2`, returning the number of nodes restored\r
-worldedit.restore = function(pos1, pos2)\r
+-- Restores all nodes hidden with WorldEdit functions in a region defined\r
+-- by positions `pos1` and `pos2`.\r
+-- @return The number of nodes restored.\r
+function worldedit.restore(pos1, pos2)\r
        local pos1, pos2 = worldedit.sort_pos(pos1, pos2)\r
-       local env = minetest.env\r
 \r
-       local pos = {x=pos1.x, y=0, z=0}\r
-       local node = {name="", param1=0, param2=0}\r
-       local count = 0\r
-       while pos.x <= pos2.x do\r
-               pos.y = pos1.y\r
-               while pos.y <= pos2.y do\r
-                       pos.z = pos1.z\r
-                       while pos.z <= pos2.z do\r
-                               local currentnode = env:get_node(pos)\r
-                               if currentnode.name == "worldedit:placeholder" then\r
-                                       node.param1, node.param2 = currentnode.param1, currentnode.param2 --copy node's param1 and param2\r
-                                       local data = env:get_meta(pos):to_table() --obtain node metadata\r
-                                       node.name = data.fields.worldedit_placeholder --set node name\r
-                                       data.fields.worldedit_placeholder = nil --delete old nodename\r
-                                       env:add_node(pos, node) --add original node\r
-                                       env:get_meta(pos):from_table(data) --set original node metadata\r
-                                       count = count + 1\r
-                               end\r
-                               pos.z = pos.z + 1\r
-                       end\r
-                       pos.y = pos.y + 1\r
-               end\r
-               pos.x = pos.x + 1\r
+       worldedit.keep_loaded(pos1, pos2)\r
+\r
+       local nodes = minetest.find_nodes_in_area(pos1, pos2, "worldedit:placeholder")\r
+       local get_node, get_meta, swap_node = minetest.get_node,\r
+                       minetest.get_meta, minetest.swap_node\r
+       for _, pos in ipairs(nodes) do\r
+               local node = get_node(pos)\r
+               local meta = get_meta(pos)\r
+               local data = meta:to_table()\r
+               node.name = data.fields.worldedit_placeholder\r
+               data.fields.worldedit_placeholder = nil\r
+               meta:from_table(data)\r
+               swap_node(pos, node)\r
        end\r
-       return count\r
-end
\ No newline at end of file
+       return #nodes\r
+end\r
+\r