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
10 groups = {not_in_creative_inventory=1},
\r
13 --- Hides all nodes in a region defined by positions `pos1` and `pos2` by
\r
14 -- non-destructively replacing them with invisible nodes.
\r
15 -- @return The number of nodes hidden.
\r
16 function worldedit.hide(pos1, pos2)
\r
17 pos1, pos2 = worldedit.sort_pos(pos1, pos2)
\r
19 worldedit.keep_loaded(pos1, pos2)
\r
21 local pos = {x=pos1.x, y=0, z=0}
\r
22 local get_node, get_meta, swap_node = minetest.get_node,
\r
23 minetest.get_meta, minetest.swap_node
\r
24 while pos.x <= pos2.x do
\r
26 while pos.y <= pos2.y do
\r
28 while pos.z <= pos2.z do
\r
29 local node = get_node(pos)
\r
30 if node.name ~= "air" and node.name ~= "worldedit:placeholder" then
\r
31 -- Save the node's original name
\r
32 get_meta(pos):set_string("worldedit_placeholder", node.name)
\r
33 -- Swap in placeholder node
\r
34 node.name = "worldedit:placeholder"
\r
35 swap_node(pos, node)
\r
43 return worldedit.volume(pos1, pos2)
\r
46 --- Suppresses all instances of `node_name` in a region defined by positions
\r
47 -- `pos1` and `pos2` by non-destructively replacing them with invisible nodes.
\r
48 -- @return The number of nodes suppressed.
\r
49 function worldedit.suppress(pos1, pos2, node_name)
\r
50 -- Ignore placeholder supression
\r
51 if node_name == "worldedit:placeholder" then
\r
55 pos1, pos2 = worldedit.sort_pos(pos1, pos2)
\r
57 worldedit.keep_loaded(pos1, pos2)
\r
59 local nodes = minetest.find_nodes_in_area(pos1, pos2, node_name)
\r
60 local get_node, get_meta, swap_node = minetest.get_node,
\r
61 minetest.get_meta, minetest.swap_node
\r
62 for _, pos in ipairs(nodes) do
\r
63 local node = get_node(pos)
\r
64 -- Save the node's original name
\r
65 get_meta(pos):set_string("worldedit_placeholder", node.name)
\r
66 -- Swap in placeholder node
\r
67 node.name = "worldedit:placeholder"
\r
68 swap_node(pos, node)
\r
73 --- Highlights all instances of `node_name` in a region defined by positions
\r
74 -- `pos1` and `pos2` by non-destructively hiding all other nodes.
\r
75 -- @return The number of nodes found.
\r
76 function worldedit.highlight(pos1, pos2, node_name)
\r
77 pos1, pos2 = worldedit.sort_pos(pos1, pos2)
\r
79 worldedit.keep_loaded(pos1, pos2)
\r
81 local pos = {x=pos1.x, y=0, z=0}
\r
82 local get_node, get_meta, swap_node = minetest.get_node,
\r
83 minetest.get_meta, minetest.swap_node
\r
85 while pos.x <= pos2.x do
\r
87 while pos.y <= pos2.y do
\r
89 while pos.z <= pos2.z do
\r
90 local node = get_node(pos)
\r
91 if node.name == node_name then -- Node found
\r
93 elseif node.name ~= "worldedit:placeholder" then -- Hide other nodes
\r
94 -- Save the node's original name
\r
95 get_meta(pos):set_string("worldedit_placeholder", node.name)
\r
96 -- Swap in placeholder node
\r
97 node.name = "worldedit:placeholder"
\r
98 swap_node(pos, node)
\r
109 -- Restores all nodes hidden with WorldEdit functions in a region defined
\r
110 -- by positions `pos1` and `pos2`.
\r
111 -- @return The number of nodes restored.
\r
112 function worldedit.restore(pos1, pos2)
\r
113 local pos1, pos2 = worldedit.sort_pos(pos1, pos2)
\r
115 worldedit.keep_loaded(pos1, pos2)
\r
117 local nodes = minetest.find_nodes_in_area(pos1, pos2, "worldedit:placeholder")
\r
118 local get_node, get_meta, swap_node = minetest.get_node,
\r
119 minetest.get_meta, minetest.swap_node
\r
120 for _, pos in ipairs(nodes) do
\r
121 local node = get_node(pos)
\r
122 local meta = get_meta(pos)
\r
123 local data = meta:to_table()
\r
124 node.name = data.fields.worldedit_placeholder
\r
125 data.fields.worldedit_placeholder = nil
\r
126 meta:from_table(data)
\r
127 swap_node(pos, node)
\r