1 --- Functions for visibly hiding nodes
\r
2 -- @module worldedit.visualization
\r
4 minetest.register_node("worldedit:placeholder", {
\r
5 drawtype = "airlike",
\r
7 sunlight_propagates = true,
\r
11 groups = {not_in_creative_inventory=1},
\r
14 --- Hides all nodes in a region defined by positions `pos1` and `pos2` by
\r
15 -- non-destructively replacing them with invisible nodes.
\r
16 -- @return The number of nodes hidden.
\r
17 function worldedit.hide(pos1, pos2)
\r
18 pos1, pos2 = worldedit.sort_pos(pos1, pos2)
\r
20 worldedit.keep_loaded(pos1, pos2)
\r
22 local pos = {x=pos1.x, y=0, z=0}
\r
23 local get_node, get_meta, swap_node = minetest.get_node,
\r
24 minetest.get_meta, minetest.swap_node
\r
25 while pos.x <= pos2.x do
\r
27 while pos.y <= pos2.y do
\r
29 while pos.z <= pos2.z do
\r
30 local node = get_node(pos)
\r
31 if node.name ~= "air" and node.name ~= "worldedit:placeholder" then
\r
32 -- Save the node's original name
\r
33 get_meta(pos):set_string("worldedit_placeholder", node.name)
\r
34 -- Swap in placeholder node
\r
35 node.name = "worldedit:placeholder"
\r
36 swap_node(pos, node)
\r
44 return worldedit.volume(pos1, pos2)
\r
47 --- Suppresses all instances of `node_name` in a region defined by positions
\r
48 -- `pos1` and `pos2` by non-destructively replacing them with invisible nodes.
\r
49 -- @return The number of nodes suppressed.
\r
50 function worldedit.suppress(pos1, pos2, node_name)
\r
51 -- Ignore placeholder supression
\r
52 if node_name == "worldedit:placeholder" then
\r
56 pos1, pos2 = worldedit.sort_pos(pos1, pos2)
\r
58 worldedit.keep_loaded(pos1, pos2)
\r
60 local nodes = minetest.find_nodes_in_area(pos1, pos2, node_name)
\r
61 local get_node, get_meta, swap_node = minetest.get_node,
\r
62 minetest.get_meta, minetest.swap_node
\r
63 for _, pos in ipairs(nodes) do
\r
64 local node = get_node(pos)
\r
65 -- Save the node's original name
\r
66 get_meta(pos):set_string("worldedit_placeholder", node.name)
\r
67 -- Swap in placeholder node
\r
68 node.name = "worldedit:placeholder"
\r
69 swap_node(pos, node)
\r
74 --- Highlights all instances of `node_name` in a region defined by positions
\r
75 -- `pos1` and `pos2` by non-destructively hiding all other nodes.
\r
76 -- @return The number of nodes found.
\r
77 function worldedit.highlight(pos1, pos2, node_name)
\r
78 pos1, pos2 = worldedit.sort_pos(pos1, pos2)
\r
80 worldedit.keep_loaded(pos1, pos2)
\r
82 local pos = {x=pos1.x, y=0, z=0}
\r
83 local get_node, get_meta, swap_node = minetest.get_node,
\r
84 minetest.get_meta, minetest.swap_node
\r
86 while pos.x <= pos2.x do
\r
88 while pos.y <= pos2.y do
\r
90 while pos.z <= pos2.z do
\r
91 local node = get_node(pos)
\r
92 if node.name == node_name then -- Node found
\r
94 elseif node.name ~= "worldedit:placeholder" then -- Hide other nodes
\r
95 -- Save the node's original name
\r
96 get_meta(pos):set_string("worldedit_placeholder", node.name)
\r
97 -- Swap in placeholder node
\r
98 node.name = "worldedit:placeholder"
\r
99 swap_node(pos, node)
\r
110 -- Restores all nodes hidden with WorldEdit functions in a region defined
\r
111 -- by positions `pos1` and `pos2`.
\r
112 -- @return The number of nodes restored.
\r
113 function worldedit.restore(pos1, pos2)
\r
114 local pos1, pos2 = worldedit.sort_pos(pos1, pos2)
\r
116 worldedit.keep_loaded(pos1, pos2)
\r
118 local nodes = minetest.find_nodes_in_area(pos1, pos2, "worldedit:placeholder")
\r
119 local get_node, get_meta, swap_node = minetest.get_node,
\r
120 minetest.get_meta, minetest.swap_node
\r
121 for _, pos in ipairs(nodes) do
\r
122 local node = get_node(pos)
\r
123 local meta = get_meta(pos)
\r
124 local data = meta:to_table()
\r
125 node.name = data.fields.worldedit_placeholder
\r
126 data.fields.worldedit_placeholder = nil
\r
127 meta:from_table(data)
\r
128 swap_node(pos, node)
\r