]> git.lizzy.rs Git - worldedit.git/blob - worldedit/visualization.lua
Fix assignment to undeclared global "sign" @ worldedit_commands/init.lua:791
[worldedit.git] / worldedit / visualization.lua
1 --- Functions for visibly hiding nodes\r
2 -- @module worldedit.visualization\r
3 \r
4 minetest.register_node("worldedit:placeholder", {\r
5         drawtype = "airlike",\r
6         paramtype = "light",\r
7         sunlight_propagates = true,\r
8         diggable = false,\r
9         walkable = false,\r
10         groups = {not_in_creative_inventory=1},\r
11 })\r
12 \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
18 \r
19         worldedit.keep_loaded(pos1, pos2)\r
20 \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
25                 pos.y = pos1.y\r
26                 while pos.y <= pos2.y do\r
27                         pos.z = pos1.z\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
36                                 end\r
37                                 pos.z = pos.z + 1\r
38                         end\r
39                         pos.y = pos.y + 1\r
40                 end\r
41                 pos.x = pos.x + 1\r
42         end\r
43         return worldedit.volume(pos1, pos2)\r
44 end\r
45 \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
52                 return 0\r
53         end\r
54 \r
55         pos1, pos2 = worldedit.sort_pos(pos1, pos2)\r
56 \r
57         worldedit.keep_loaded(pos1, pos2)\r
58 \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
69         end\r
70         return #nodes\r
71 end\r
72 \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
78 \r
79         worldedit.keep_loaded(pos1, pos2)\r
80 \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
84         local count = 0\r
85         while pos.x <= pos2.x do\r
86                 pos.y = pos1.y\r
87                 while pos.y <= pos2.y do\r
88                         pos.z = pos1.z\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
92                                         count = count + 1\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
99                                 end\r
100                                 pos.z = pos.z + 1\r
101                         end\r
102                         pos.y = pos.y + 1\r
103                 end\r
104                 pos.x = pos.x + 1\r
105         end\r
106         return count\r
107 end\r
108 \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
114 \r
115         worldedit.keep_loaded(pos1, pos2)\r
116 \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
128         end\r
129         return #nodes\r
130 end\r
131 \r