]> git.lizzy.rs Git - worldedit.git/blob - worldedit/visualization.lua
Fix deserialization of schematics with node names table
[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         pointable = false,\r
10         walkable = false,\r
11         groups = {not_in_creative_inventory=1},\r
12 })\r
13 \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
19 \r
20         worldedit.keep_loaded(pos1, pos2)\r
21 \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
26                 pos.y = pos1.y\r
27                 while pos.y <= pos2.y do\r
28                         pos.z = pos1.z\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
37                                 end\r
38                                 pos.z = pos.z + 1\r
39                         end\r
40                         pos.y = pos.y + 1\r
41                 end\r
42                 pos.x = pos.x + 1\r
43         end\r
44         return worldedit.volume(pos1, pos2)\r
45 end\r
46 \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
53                 return 0\r
54         end\r
55 \r
56         pos1, pos2 = worldedit.sort_pos(pos1, pos2)\r
57 \r
58         worldedit.keep_loaded(pos1, pos2)\r
59 \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
70         end\r
71         return #nodes\r
72 end\r
73 \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
79 \r
80         worldedit.keep_loaded(pos1, pos2)\r
81 \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
85         local count = 0\r
86         while pos.x <= pos2.x do\r
87                 pos.y = pos1.y\r
88                 while pos.y <= pos2.y do\r
89                         pos.z = pos1.z\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
93                                         count = count + 1\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
100                                 end\r
101                                 pos.z = pos.z + 1\r
102                         end\r
103                         pos.y = pos.y + 1\r
104                 end\r
105                 pos.x = pos.x + 1\r
106         end\r
107         return count\r
108 end\r
109 \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
115 \r
116         worldedit.keep_loaded(pos1, pos2)\r
117 \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
129         end\r
130         return #nodes\r
131 end\r
132 \r