]> git.lizzy.rs Git - worldedit.git/blob - worldedit_gui/functionality.lua
2d6c6c64623df24671d57d7a0cc94642c96b0ef7
[worldedit.git] / worldedit_gui / functionality.lua
1 --saved state for each player\r
2 local gui_nodename1 = {} --mapping of player names to node names\r
3 local gui_nodename2 = {} --mapping of player names to node names\r
4 local gui_axis1 = {} --mapping of player names to axes (one of 1, 2, 3, or 4, representing the axes in the `axis_indices` table below)\r
5 local gui_axis2 = {} --mapping of player names to axes (one of 1, 2, 3, or 4, representing the axes in the `axis_indices` table below)\r
6 local gui_distance1 = {} --mapping of player names to a distance (arbitrary strings may also appear as values)\r
7 local gui_distance2 = {} --mapping of player names to a distance (arbitrary strings may also appear as values)\r
8 local gui_distance3 = {} --mapping of player names to a distance (arbitrary strings may also appear as values)\r
9 local gui_count1 = {} --mapping of player names to a quantity (arbitrary strings may also appear as values)\r
10 local gui_count2 = {} --mapping of player names to a quantity (arbitrary strings may also appear as values)\r
11 local gui_count3 = {} --mapping of player names to a quantity (arbitrary strings may also appear as values)\r
12 local gui_angle = {} --mapping of player names to an angle (one of 90, 180, 270, representing the angle in degrees clockwise)\r
13 local gui_filename = {} --mapping of player names to file names\r
14 \r
15 --set default values\r
16 setmetatable(gui_nodename1, {__index = function() return "Cobblestone" end})\r
17 setmetatable(gui_nodename2, {__index = function() return "Stone" end})\r
18 setmetatable(gui_axis1,     {__index = function() return 4 end})\r
19 setmetatable(gui_axis2,     {__index = function() return 1 end})\r
20 setmetatable(gui_distance1, {__index = function() return "10" end})\r
21 setmetatable(gui_distance2, {__index = function() return "5" end})\r
22 setmetatable(gui_distance3, {__index = function() return "2" end})\r
23 setmetatable(gui_count1,     {__index = function() return "3" end})\r
24 setmetatable(gui_count2,     {__index = function() return "6" end})\r
25 setmetatable(gui_count3,     {__index = function() return "4" end})\r
26 setmetatable(gui_angle,     {__index = function() return 90 end})\r
27 setmetatable(gui_filename,  {__index = function() return "building" end})\r
28 \r
29 local axis_indices = {["X axis"]=1, ["Y axis"]=2, ["Z axis"]=3, ["Look direction"]=4}\r
30 local axis_values = {"x", "y", "z", "?"}\r
31 setmetatable(axis_indices, {__index = function () return 4 end})\r
32 setmetatable(axis_values, {__index = function () return "?" end})\r
33 \r
34 local angle_indices = {["90 degrees"]=1, ["180 degrees"]=2, ["270 degrees"]=3}\r
35 local angle_values = {90, 180, 270}\r
36 setmetatable(angle_indices, {__index = function () return 1 end})\r
37 setmetatable(angle_values, {__index = function () return 90 end})\r
38 \r
39 -- given multiple sets of privileges, produces a single set of privs that would have the same effect as requiring all of them at the same time\r
40 local combine_privs = function(...)\r
41         local result = {}\r
42         for i, privs in ipairs({...}) do\r
43                 for name, value in pairs(privs) do\r
44                         if result[name] ~= nil and result[name] ~= value then --the priv must be both true and false, which can never happen\r
45                                 return {__fake_priv_that_nobody_has__=true} --privilege table that can never be satisfied\r
46                         end\r
47                         result[name] = value\r
48                 end\r
49         end\r
50         return result\r
51 end\r
52 \r
53 -- display node (or unknown_node image otherwise) at specified pos in formspec\r
54 local formspec_node = function(pos, nodename)\r
55         return nodename and string.format("item_image[%s;1,1;%s]", pos, nodename)\r
56                 or string.format("image[%s;1,1;worldedit_gui_unknown.png]", pos)\r
57 end\r
58 \r
59 -- two further priv helpers\r
60 local function we_privs(command)\r
61         return minetest.chatcommands["/" .. command].privs\r
62 end\r
63 \r
64 local function combine_we_privs(list)\r
65         local args = {}\r
66         for _, t in ipairs(list) do\r
67                 table.insert(args, we_privs(t))\r
68         end\r
69         return combine_privs(unpack(args))\r
70 end\r
71 \r
72 worldedit.register_gui_function("worldedit_gui_about", {\r
73         name = "About",\r
74         privs = {interact=true},\r
75         on_select = function(name)\r
76                 minetest.chatcommands["/about"].func(name, "")\r
77         end,\r
78 })\r
79 \r
80 worldedit.register_gui_function("worldedit_gui_inspect", {\r
81         name = "Toggle Inspect",\r
82         privs = we_privs("inspect"),\r
83         on_select = function(name)\r
84                 minetest.chatcommands["/inspect"].func(name, worldedit.inspect[name] and "disable" or "enable")\r
85         end,\r
86 })\r
87 \r
88 worldedit.register_gui_function("worldedit_gui_region", {\r
89         name = "Get/Set Region",\r
90         privs = combine_we_privs({"p", "pos1", "pos2", "reset", "mark", "unmark", "volume", "fixedpos"}),\r
91         get_formspec = function(name)\r
92                 local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]\r
93                 return "size[9,7]" .. worldedit.get_formspec_header("worldedit_gui_region") ..\r
94                         "button_exit[0,1;3,0.8;worldedit_gui_p_get;Get Positions]" ..\r
95                         "button_exit[3,1;3,0.8;worldedit_gui_p_set1;Choose Position 1]" ..\r
96                         "button_exit[6,1;3,0.8;worldedit_gui_p_set2;Choose Position 2]" ..\r
97                         "button_exit[0,2;3,0.8;worldedit_gui_pos1;Position 1 Here]" ..\r
98                         "button_exit[3,2;3,0.8;worldedit_gui_pos2;Position 2 Here]" ..\r
99                         "button_exit[6,2;3,0.8;worldedit_gui_reset;Reset Region]" ..\r
100                         "button_exit[0,3;3,0.8;worldedit_gui_mark;Mark Region]" ..\r
101                         "button_exit[3,3;3,0.8;worldedit_gui_unmark;Unmark Region]" ..\r
102                         "button_exit[6,3;3,0.8;worldedit_gui_volume;Region Volume]" ..\r
103                         "label[0,4.7;Position 1]" ..\r
104                         string.format("field[2,5;1.5,0.8;worldedit_gui_fixedpos_pos1x;X ;%s]", pos1 and pos1.x or "") ..\r
105                         string.format("field[3.5,5;1.5,0.8;worldedit_gui_fixedpos_pos1y;Y ;%s]", pos1 and pos1.y or "") ..\r
106                         string.format("field[5,5;1.5,0.8;worldedit_gui_fixedpos_pos1z;Z ;%s]", pos1 and pos1.z or "") ..\r
107                         "button_exit[6.5,4.68;2.5,0.8;worldedit_gui_fixedpos_pos1_submit;Set Position 1]" ..\r
108                         "label[0,6.2;Position 2]" ..\r
109                         string.format("field[2,6.5;1.5,0.8;worldedit_gui_fixedpos_pos2x;X ;%s]", pos2 and pos2.x or "") ..\r
110                         string.format("field[3.5,6.5;1.5,0.8;worldedit_gui_fixedpos_pos2y;Y ;%s]", pos2 and pos2.y or "") ..\r
111                         string.format("field[5,6.5;1.5,0.8;worldedit_gui_fixedpos_pos2z;Z ;%s]", pos2 and pos2.z or "") ..\r
112                         "button_exit[6.5,6.18;2.5,0.8;worldedit_gui_fixedpos_pos2_submit;Set Position 2]"\r
113         end,\r
114 })\r
115 \r
116 worldedit.register_gui_handler("worldedit_gui_region", function(name, fields)\r
117         if fields.worldedit_gui_p_get then\r
118                 minetest.chatcommands["/p"].func(name, "get")\r
119                 return true\r
120         elseif fields.worldedit_gui_p_set1 then\r
121                 minetest.chatcommands["/p"].func(name, "set1")\r
122                 return true\r
123         elseif fields.worldedit_gui_p_set2 then\r
124                 minetest.chatcommands["/p"].func(name, "set2")\r
125                 return true\r
126         elseif fields.worldedit_gui_pos1 then\r
127                 minetest.chatcommands["/pos1"].func(name, "")\r
128                 worldedit.show_page(name, "worldedit_gui_region")\r
129                 return true\r
130         elseif fields.worldedit_gui_pos2 then\r
131                 minetest.chatcommands["/pos2"].func(name, "")\r
132                 worldedit.show_page(name, "worldedit_gui_region")\r
133                 return true\r
134         elseif fields.worldedit_gui_reset then\r
135                 minetest.chatcommands["/reset"].func(name, "")\r
136                 worldedit.show_page(name, "worldedit_gui_region")\r
137                 return true\r
138         elseif fields.worldedit_gui_mark then\r
139                 minetest.chatcommands["/mark"].func(name, "")\r
140                 worldedit.show_page(name, "worldedit_gui_region")\r
141                 return true\r
142         elseif fields.worldedit_gui_unmark then\r
143                 minetest.chatcommands["/unmark"].func(name, "")\r
144                 worldedit.show_page(name, "worldedit_gui_region")\r
145                 return true\r
146         elseif fields.worldedit_gui_volume then\r
147                 minetest.chatcommands["/volume"].func(name, "")\r
148                 worldedit.show_page(name, "worldedit_gui_region")\r
149                 return true\r
150         elseif fields.worldedit_gui_fixedpos_pos1_submit then\r
151                 minetest.chatcommands["/fixedpos"].func(name, string.format("set1 %s %s %s",\r
152                         tostring(fields.worldedit_gui_fixedpos_pos1x),\r
153                         tostring(fields.worldedit_gui_fixedpos_pos1y),\r
154                         tostring(fields.worldedit_gui_fixedpos_pos1z)))\r
155                 worldedit.show_page(name, "worldedit_gui_region")\r
156                 return true\r
157         elseif fields.worldedit_gui_fixedpos_pos2_submit then\r
158                 minetest.chatcommands["/fixedpos"].func(name, string.format("set2 %s %s %s",\r
159                         tostring(fields.worldedit_gui_fixedpos_pos2x),\r
160                         tostring(fields.worldedit_gui_fixedpos_pos2y),\r
161                         tostring(fields.worldedit_gui_fixedpos_pos2z)))\r
162                 worldedit.show_page(name, "worldedit_gui_region")\r
163                 return true\r
164         end\r
165         return false\r
166 end)\r
167 \r
168 worldedit.register_gui_function("worldedit_gui_set", {\r
169         name = "Set Nodes",\r
170         privs = we_privs("set"),\r
171         get_formspec = function(name)\r
172                 local node = gui_nodename1[name]\r
173                 local nodename = worldedit.normalize_nodename(node)\r
174                 return "size[6.5,3]" .. worldedit.get_formspec_header("worldedit_gui_set") ..\r
175                         string.format("field[0.5,1.5;4,0.8;worldedit_gui_set_node;Name;%s]", minetest.formspec_escape(node)) ..\r
176                         "button[4,1.18;1.5,0.8;worldedit_gui_set_search;Search]" ..\r
177                         formspec_node("5.5,1.1", nodename) ..\r
178                         "button_exit[0,2.5;3,0.8;worldedit_gui_set_submit;Set Nodes]"\r
179         end,\r
180 })\r
181 \r
182 worldedit.register_gui_handler("worldedit_gui_set", function(name, fields)\r
183         if fields.worldedit_gui_set_search or fields.worldedit_gui_set_submit then\r
184                 gui_nodename1[name] = tostring(fields.worldedit_gui_set_node)\r
185                 worldedit.show_page(name, "worldedit_gui_set")\r
186                 if fields.worldedit_gui_set_submit then\r
187                         local n = worldedit.normalize_nodename(gui_nodename1[name])\r
188                         if n then\r
189                                 minetest.chatcommands["/set"].func(name, n)\r
190                         end\r
191                 end\r
192                 return true\r
193         end\r
194         return false\r
195 end)\r
196 \r
197 worldedit.register_gui_function("worldedit_gui_replace", {\r
198         name = "Replace Nodes",\r
199         privs = combine_we_privs({"replace", "replaceinverse"}),\r
200         get_formspec = function(name)\r
201                 local search, replace = gui_nodename1[name], gui_nodename2[name]\r
202                 local search_nodename, replace_nodename = worldedit.normalize_nodename(search), worldedit.normalize_nodename(replace)\r
203                 return "size[6.5,4]" .. worldedit.get_formspec_header("worldedit_gui_replace") ..\r
204                         string.format("field[0.5,1.5;4,0.8;worldedit_gui_replace_search;Name;%s]", minetest.formspec_escape(search)) ..\r
205                         "button[4,1.18;1.5,0.8;worldedit_gui_replace_search_search;Search]" ..\r
206                         formspec_node("5.5,1.1", search_nodename) ..\r
207                         string.format("field[0.5,2.5;4,0.8;worldedit_gui_replace_replace;Name;%s]", minetest.formspec_escape(replace)) ..\r
208                         "button[4,2.18;1.5,0.8;worldedit_gui_replace_replace_search;Search]" ..\r
209                         formspec_node("5.5,2.1", replace_nodename) ..\r
210                         "button_exit[0,3.5;3,0.8;worldedit_gui_replace_submit;Replace Nodes]" ..\r
211                         "button_exit[3.5,3.5;3,0.8;worldedit_gui_replace_submit_inverse;Replace Inverse]"\r
212         end,\r
213 })\r
214 \r
215 worldedit.register_gui_handler("worldedit_gui_replace", function(name, fields)\r
216         if fields.worldedit_gui_replace_search_search or fields.worldedit_gui_replace_replace_search\r
217         or fields.worldedit_gui_replace_submit or fields.worldedit_gui_replace_submit_inverse then\r
218                 gui_nodename1[name] = tostring(fields.worldedit_gui_replace_search)\r
219                 gui_nodename2[name] = tostring(fields.worldedit_gui_replace_replace)\r
220                 worldedit.show_page(name, "worldedit_gui_replace")\r
221 \r
222                 local submit = nil\r
223                 if fields.worldedit_gui_replace_submit then\r
224                         submit = "replace"\r
225                 elseif fields.worldedit_gui_replace_submit_inverse then\r
226                         submit = "replaceinverse"\r
227                 end\r
228                 if submit then\r
229                         local n1 = worldedit.normalize_nodename(gui_nodename1[name])\r
230                         local n2 = worldedit.normalize_nodename(gui_nodename2[name])\r
231                         if n1 and n2 then\r
232                                 minetest.chatcommands["/"..submit].func(name, string.format("%s %s", n1, n2))\r
233                         end\r
234                 end\r
235                 return true\r
236         end\r
237         return false\r
238 end)\r
239 \r
240 worldedit.register_gui_function("worldedit_gui_sphere_dome", {\r
241         name = "Sphere/Dome",\r
242         privs = combine_we_privs({"hollowsphere", "sphere", "hollowdome", "dome"}),\r
243         get_formspec = function(name)\r
244                 local node, radius = gui_nodename1[name], gui_distance2[name]\r
245                 local nodename = worldedit.normalize_nodename(node)\r
246                 return "size[6.5,5]" .. worldedit.get_formspec_header("worldedit_gui_sphere_dome") ..\r
247                         string.format("field[0.5,1.5;4,0.8;worldedit_gui_sphere_dome_node;Name;%s]", minetest.formspec_escape(node)) ..\r
248                         "button[4,1.18;1.5,0.8;worldedit_gui_sphere_dome_search;Search]" ..\r
249                         formspec_node("5.5,1.1", nodename) ..\r
250                         string.format("field[0.5,2.5;4,0.8;worldedit_gui_sphere_dome_radius;Radius;%s]", minetest.formspec_escape(radius)) ..\r
251                         "button_exit[0,3.5;3,0.8;worldedit_gui_sphere_dome_submit_hollow;Hollow Sphere]" ..\r
252                         "button_exit[3.5,3.5;3,0.8;worldedit_gui_sphere_dome_submit_solid;Solid Sphere]" ..\r
253                         "button_exit[0,4.5;3,0.8;worldedit_gui_sphere_dome_submit_hollow_dome;Hollow Dome]" ..\r
254                         "button_exit[3.5,4.5;3,0.8;worldedit_gui_sphere_dome_submit_solid_dome;Solid Dome]"\r
255         end,\r
256 })\r
257 \r
258 worldedit.register_gui_handler("worldedit_gui_sphere_dome", function(name, fields)\r
259         if fields.worldedit_gui_sphere_dome_search\r
260         or fields.worldedit_gui_sphere_dome_submit_hollow or fields.worldedit_gui_sphere_dome_submit_solid\r
261         or fields.worldedit_gui_sphere_dome_submit_hollow_dome or fields.worldedit_gui_sphere_dome_submit_solid_dome then\r
262                 gui_nodename1[name] = tostring(fields.worldedit_gui_sphere_dome_node)\r
263                 gui_distance2[name] = tostring(fields.worldedit_gui_sphere_dome_radius)\r
264                 worldedit.show_page(name, "worldedit_gui_sphere_dome")\r
265 \r
266                 local submit = nil\r
267                 if fields.worldedit_gui_sphere_dome_submit_hollow then\r
268                         submit = "hollowsphere"\r
269                 elseif fields.worldedit_gui_sphere_dome_submit_solid then\r
270                         submit = "sphere"\r
271                 elseif fields.worldedit_gui_sphere_dome_submit_hollow_dome then\r
272                         submit = "hollowdome"\r
273                 elseif fields.worldedit_gui_sphere_dome_submit_solid_dome then\r
274                         submit = "dome"\r
275                 end\r
276                 if submit then\r
277                         local n = worldedit.normalize_nodename(gui_nodename1[name])\r
278                         if n then\r
279                                 minetest.chatcommands["/"..submit].func(name, string.format("%s %s", gui_distance2[name], n))\r
280                         end\r
281                 end\r
282                 return true\r
283         end\r
284         return false\r
285 end)\r
286 \r
287 worldedit.register_gui_function("worldedit_gui_cylinder", {\r
288         name = "Cylinder",\r
289         privs = combine_we_privs({"hollowcylinder", "cylinder"}),\r
290         get_formspec = function(name)\r
291                 local node, axis, length = gui_nodename1[name], gui_axis1[name], gui_distance1[name]\r
292                 local radius1, radius2 = gui_distance2[name], gui_distance3[name]\r
293                 local nodename = worldedit.normalize_nodename(node)\r
294                 return "size[6.5,6]" .. worldedit.get_formspec_header("worldedit_gui_cylinder") ..\r
295                         string.format("field[0.5,1.5;4,0.8;worldedit_gui_cylinder_node;Name;%s]", minetest.formspec_escape(node)) ..\r
296                         "button[4,1.18;1.5,0.8;worldedit_gui_cylinder_search;Search]" ..\r
297                         formspec_node("5.5,1.1", nodename) ..\r
298                         string.format("field[0.5,2.5;4,0.8;worldedit_gui_cylinder_length;Length;%s]", minetest.formspec_escape(length)) ..\r
299                         string.format("dropdown[4,2.18;2.5;worldedit_gui_cylinder_axis;X axis,Y axis,Z axis,Look direction;%d]", axis) ..\r
300                         string.format("field[0.5,3.5;2,0.8;worldedit_gui_cylinder_radius1;Base Radius;%s]", minetest.formspec_escape(radius1)) ..\r
301                         string.format("field[2.5,3.5;2,0.8;worldedit_gui_cylinder_radius2;Top Radius;%s]", minetest.formspec_escape(radius2)) ..\r
302                         "label[0.25,4;Equal base and top radius creates a cylinder,\n"..\r
303                                 "zero top radius creates a cone.\nConsult documentation for more information.]"..\r
304                         "button_exit[0,5.5;3,0.8;worldedit_gui_cylinder_submit_hollow;Hollow Cylinder]" ..\r
305                         "button_exit[3.5,5.5;3,0.8;worldedit_gui_cylinder_submit_solid;Solid Cylinder]"\r
306         end,\r
307 })\r
308 \r
309 worldedit.register_gui_handler("worldedit_gui_cylinder", function(name, fields)\r
310         if fields.worldedit_gui_cylinder_search\r
311         or fields.worldedit_gui_cylinder_submit_hollow or fields.worldedit_gui_cylinder_submit_solid then\r
312                 gui_nodename1[name] = tostring(fields.worldedit_gui_cylinder_node)\r
313                 gui_axis1[name] = axis_indices[fields.worldedit_gui_cylinder_axis]\r
314                 gui_distance1[name] = tostring(fields.worldedit_gui_cylinder_length)\r
315                 gui_distance2[name] = tostring(fields.worldedit_gui_cylinder_radius1)\r
316                 gui_distance3[name] = tostring(fields.worldedit_gui_cylinder_radius2)\r
317                 worldedit.show_page(name, "worldedit_gui_cylinder")\r
318 \r
319                 local submit = nil\r
320                 if fields.worldedit_gui_cylinder_submit_hollow then\r
321                         submit = "hollowcylinder"\r
322                 elseif fields.worldedit_gui_cylinder_submit_solid then\r
323                         submit = "cylinder"\r
324                 end\r
325                 if submit then\r
326                         local n = worldedit.normalize_nodename(gui_nodename1[name])\r
327                         if n then\r
328                                 local args = string.format("%s %s %s %s %s", axis_values[gui_axis1[name]], gui_distance1[name], gui_distance2[name], gui_distance3[name], n)\r
329                                 minetest.chatcommands["/"..submit].func(name, args)\r
330                         end\r
331                 end\r
332                 return true\r
333         end\r
334         if fields.worldedit_gui_cylinder_axis then\r
335                 gui_axis1[name] = axis_indices[fields.worldedit_gui_cylinder_axis]\r
336                 worldedit.show_page(name, "worldedit_gui_cylinder")\r
337                 return true\r
338         end\r
339         return false\r
340 end)\r
341 \r
342 worldedit.register_gui_function("worldedit_gui_pyramid", {\r
343         name = "Pyramid",\r
344         privs = we_privs("pyramid"),\r
345         get_formspec = function(name)\r
346                 local node, axis, length = gui_nodename1[name], gui_axis1[name], gui_distance1[name]\r
347                 local nodename = worldedit.normalize_nodename(node)\r
348                 return "size[6.5,4]" .. worldedit.get_formspec_header("worldedit_gui_pyramid") ..\r
349                         string.format("field[0.5,1.5;4,0.8;worldedit_gui_pyramid_node;Name;%s]", minetest.formspec_escape(node)) ..\r
350                         "button[4,1.18;1.5,0.8;worldedit_gui_pyramid_search;Search]" ..\r
351                         formspec_node("5.5,1.1", nodename) ..\r
352                         string.format("field[0.5,2.5;4,0.8;worldedit_gui_pyramid_length;Length;%s]", minetest.formspec_escape(length)) ..\r
353                         string.format("dropdown[4,2.18;2.5;worldedit_gui_pyramid_axis;X axis,Y axis,Z axis,Look direction;%d]", axis) ..\r
354                         "button_exit[0,3.5;3,0.8;worldedit_gui_pyramid_submit_hollow;Hollow Pyramid]" ..\r
355                         "button_exit[3.5,3.5;3,0.8;worldedit_gui_pyramid_submit_solid;Solid Pyramid]"\r
356         end,\r
357 })\r
358 \r
359 worldedit.register_gui_handler("worldedit_gui_pyramid", function(name, fields)\r
360         if fields.worldedit_gui_pyramid_search or fields.worldedit_gui_pyramid_submit_solid or fields.worldedit_gui_pyramid_submit_hollow or fields.worldedit_gui_pyramid_axis then\r
361                 gui_nodename1[name] = tostring(fields.worldedit_gui_pyramid_node)\r
362                 gui_axis1[name] = axis_indices[fields.worldedit_gui_pyramid_axis]\r
363                 gui_distance1[name] = tostring(fields.worldedit_gui_pyramid_length)\r
364                 worldedit.show_page(name, "worldedit_gui_pyramid")\r
365 \r
366                 local submit = nil\r
367                 if fields.worldedit_gui_pyramid_submit_solid then\r
368                         submit = "pyramid"\r
369                 elseif fields.worldedit_gui_pyramid_submit_hollow then\r
370                         submit = "hollowpyramid"\r
371                 end\r
372                 if submit then\r
373                         local n = worldedit.normalize_nodename(gui_nodename1[name])\r
374                         if n then\r
375                                 minetest.chatcommands["/"..submit].func(name, string.format("%s %s %s", axis_values[gui_axis1[name]], gui_distance1[name], n))\r
376                         end\r
377                 end\r
378                 return true\r
379         end\r
380         if fields.worldedit_gui_pyramid_axis then\r
381                 gui_axis1[name] = axis_indices[fields.worldedit_gui_pyramid_axis]\r
382                 worldedit.show_page(name, "worldedit_gui_pyramid")\r
383                 return true\r
384         end\r
385         return false\r
386 end)\r
387 \r
388 worldedit.register_gui_function("worldedit_gui_spiral", {\r
389         name = "Spiral",\r
390         privs = we_privs("spiral"),\r
391         get_formspec = function(name)\r
392                 local node, length, height, space = gui_nodename1[name], gui_distance1[name], gui_distance2[name], gui_distance3[name]\r
393                 local nodename = worldedit.normalize_nodename(node)\r
394                 return "size[6.5,6]" .. worldedit.get_formspec_header("worldedit_gui_spiral") ..\r
395                         string.format("field[0.5,1.5;4,0.8;worldedit_gui_spiral_node;Name;%s]", minetest.formspec_escape(node)) ..\r
396                         "button[4,1.18;1.5,0.8;worldedit_gui_spiral_search;Search]" ..\r
397                         formspec_node("5.5,1.1", nodename) ..\r
398                         string.format("field[0.5,2.5;4,0.8;worldedit_gui_spiral_length;Side Length;%s]", minetest.formspec_escape(length)) ..\r
399                         string.format("field[0.5,3.5;4,0.8;worldedit_gui_spiral_height;Height;%s]", minetest.formspec_escape(height)) ..\r
400                         string.format("field[0.5,4.5;4,0.8;worldedit_gui_spiral_space;Wall Spacing;%s]", minetest.formspec_escape(space)) ..\r
401                         "button_exit[0,5.5;3,0.8;worldedit_gui_spiral_submit;Spiral]"\r
402         end,\r
403 })\r
404 \r
405 worldedit.register_gui_handler("worldedit_gui_spiral", function(name, fields)\r
406         if fields.worldedit_gui_spiral_search or fields.worldedit_gui_spiral_submit then\r
407                 gui_nodename1[name] = fields.worldedit_gui_spiral_node\r
408                 gui_distance1[name] = tostring(fields.worldedit_gui_spiral_length)\r
409                 gui_distance2[name] = tostring(fields.worldedit_gui_spiral_height)\r
410                 gui_distance3[name] = tostring(fields.worldedit_gui_spiral_space)\r
411                 worldedit.show_page(name, "worldedit_gui_spiral")\r
412                 if fields.worldedit_gui_spiral_submit then\r
413                         local n = worldedit.normalize_nodename(gui_nodename1[name])\r
414                         if n then\r
415                                 minetest.chatcommands["/spiral"].func(name, string.format("%s %s %s %s", gui_distance1[name], gui_distance2[name], gui_distance3[name], n))\r
416                         end\r
417                 end\r
418                 return true\r
419         end\r
420         return false\r
421 end)\r
422 \r
423 worldedit.register_gui_function("worldedit_gui_copy_move", {\r
424         name = "Copy/Move",\r
425         privs = combine_we_privs({"copy", "move"}),\r
426         get_formspec = function(name)\r
427                 local axis = gui_axis1[name] or 4\r
428                 local amount = gui_distance1[name] or "10"\r
429                 return "size[6.5,3]" .. worldedit.get_formspec_header("worldedit_gui_copy_move") ..\r
430                         string.format("field[0.5,1.5;4,0.8;worldedit_gui_copy_move_amount;Amount;%s]", minetest.formspec_escape(amount)) ..\r
431                         string.format("dropdown[4,1.18;2.5;worldedit_gui_copy_move_axis;X axis,Y axis,Z axis,Look direction;%d]", axis) ..\r
432                         "button_exit[0,2.5;3,0.8;worldedit_gui_copy_move_copy;Copy Region]" ..\r
433                         "button_exit[3.5,2.5;3,0.8;worldedit_gui_copy_move_move;Move Region]"\r
434         end,\r
435 })\r
436 \r
437 worldedit.register_gui_handler("worldedit_gui_copy_move", function(name, fields)\r
438         if fields.worldedit_gui_copy_move_copy or fields.worldedit_gui_copy_move_move then\r
439                 gui_axis1[name] = axis_indices[fields.worldedit_gui_copy_move_axis] or 4\r
440                 gui_distance1[name] = tostring(fields.worldedit_gui_copy_move_amount)\r
441                 worldedit.show_page(name, "worldedit_gui_copy_move")\r
442                 if fields.worldedit_gui_copy_move_copy then\r
443                         minetest.chatcommands["/copy"].func(name, string.format("%s %s", axis_values[gui_axis1[name]], gui_distance1[name]))\r
444                 else --fields.worldedit_gui_copy_move_move\r
445                         minetest.chatcommands["/move"].func(name, string.format("%s %s", axis_values[gui_axis1[name]], gui_distance1[name]))\r
446                 end\r
447                 return true\r
448         end\r
449         if fields.worldedit_gui_copy_move_axis then\r
450                 gui_axis1[name] = axis_indices[fields.worldedit_gui_copy_move_axis] or 4\r
451                 worldedit.show_page(name, "worldedit_gui_copy_move")\r
452                 return true\r
453         end\r
454         return false\r
455 end)\r
456 \r
457 worldedit.register_gui_function("worldedit_gui_stack", {\r
458         name = "Stack",\r
459         privs = we_privs("stack"),\r
460         get_formspec = function(name)\r
461                 local axis, count = gui_axis1[name], gui_count1[name]\r
462                 return "size[6.5,3]" .. worldedit.get_formspec_header("worldedit_gui_stack") ..\r
463                         string.format("field[0.5,1.5;4,0.8;worldedit_gui_stack_count;Count;%s]", minetest.formspec_escape(count)) ..\r
464                         string.format("dropdown[4,1.18;2.5;worldedit_gui_stack_axis;X axis,Y axis,Z axis,Look direction;%d]", axis) ..\r
465                         "button_exit[0,2.5;3,0.8;worldedit_gui_stack_submit;Stack]"\r
466         end,\r
467 })\r
468 \r
469 worldedit.register_gui_handler("worldedit_gui_stack", function(name, fields)\r
470         if fields.worldedit_gui_stack_submit then\r
471                 gui_axis1[name] = axis_indices[fields.worldedit_gui_stack_axis]\r
472                 gui_count1[name] = tostring(fields.worldedit_gui_stack_count)\r
473                 worldedit.show_page(name, "worldedit_gui_stack")\r
474                 minetest.chatcommands["/stack"].func(name, string.format("%s %s", axis_values[gui_axis1[name]], gui_count1[name]))\r
475                 return true\r
476         end\r
477         if fields.worldedit_gui_stack_axis then\r
478                 gui_axis1[name] = axis_indices[fields.worldedit_gui_stack_axis]\r
479                 worldedit.show_page(name, "worldedit_gui_stack")\r
480                 return true\r
481         end\r
482         return false\r
483 end)\r
484 \r
485 worldedit.register_gui_function("worldedit_gui_stretch", {\r
486         name = "Stretch",\r
487         privs = we_privs("stretch"),\r
488         get_formspec = function(name)\r
489                 local stretchx, stretchy, stretchz = gui_count1[name], gui_count2[name], gui_count3[name]\r
490                 return "size[5,5]" .. worldedit.get_formspec_header("worldedit_gui_stretch") ..\r
491                         string.format("field[0.5,1.5;4,0.8;worldedit_gui_stretch_x;Stretch X;%s]", minetest.formspec_escape(stretchx)) ..\r
492                         string.format("field[0.5,2.5;4,0.8;worldedit_gui_stretch_y;Stretch Y;%s]", minetest.formspec_escape(stretchy)) ..\r
493                         string.format("field[0.5,3.5;4,0.8;worldedit_gui_stretch_z;Stretch Z;%s]", minetest.formspec_escape(stretchz)) ..\r
494                         "button_exit[0,4.5;3,0.8;worldedit_gui_stretch_submit;Stretch]"\r
495         end,\r
496 })\r
497 \r
498 worldedit.register_gui_handler("worldedit_gui_stretch", function(name, fields)\r
499         if fields.worldedit_gui_stretch_submit then\r
500                 gui_count1[name] = tostring(fields.worldedit_gui_stretch_x)\r
501                 gui_count2[name] = tostring(fields.worldedit_gui_stretch_y)\r
502                 gui_count3[name] = tostring(fields.worldedit_gui_stretch_z)\r
503                 worldedit.show_page(name, "worldedit_gui_stretch")\r
504                 minetest.chatcommands["/stretch"].func(name, string.format("%s %s %s", gui_count1[name], gui_count2[name], gui_count3[name]))\r
505                 return true\r
506         end\r
507         return false\r
508 end)\r
509 \r
510 worldedit.register_gui_function("worldedit_gui_transpose", {\r
511         name = "Transpose",\r
512         privs = we_privs("transpose"),\r
513         get_formspec = function(name)\r
514                 local axis1, axis2 = gui_axis1[name], gui_axis2[name]\r
515                 return "size[5.5,3]" .. worldedit.get_formspec_header("worldedit_gui_transpose") ..\r
516                         string.format("dropdown[0,1;2.5;worldedit_gui_transpose_axis1;X axis,Y axis,Z axis,Look direction;%d]", axis1) ..\r
517                         string.format("dropdown[3,1;2.5;worldedit_gui_transpose_axis2;X axis,Y axis,Z axis,Look direction;%d]", axis2) ..\r
518                         "button_exit[0,2.5;3,0.8;worldedit_gui_transpose_submit;Transpose]"\r
519         end,\r
520 })\r
521 \r
522 worldedit.register_gui_handler("worldedit_gui_transpose", function(name, fields)\r
523         if fields.worldedit_gui_transpose_submit then\r
524                 gui_axis1[name] = axis_indices[fields.worldedit_gui_transpose_axis1]\r
525                 worldedit.show_page(name, "worldedit_gui_transpose")\r
526                 minetest.chatcommands["/transpose"].func(name, string.format("%s %s", axis_values[gui_axis1[name]], axis_values[gui_axis2[name]]))\r
527                 return true\r
528         end\r
529         if fields.worldedit_gui_transpose_axis1 then\r
530                 gui_axis1[name] = axis_indices[fields.worldedit_gui_transpose_axis1]\r
531                 worldedit.show_page(name, "worldedit_gui_transpose")\r
532                 return true\r
533         end\r
534         if fields.worldedit_gui_transpose_axis2 then\r
535                 gui_axis2[name] = axis_indices[fields.worldedit_gui_transpose_axis2]\r
536                 worldedit.show_page(name, "worldedit_gui_transpose")\r
537                 return true\r
538         end\r
539         return false\r
540 end)\r
541 \r
542 worldedit.register_gui_function("worldedit_gui_flip", {\r
543         name = "Flip",\r
544         privs = we_privs("flip"),\r
545         get_formspec = function(name)\r
546                 local axis = gui_axis1[name]\r
547                 return "size[5,3]" .. worldedit.get_formspec_header("worldedit_gui_flip") ..\r
548                         string.format("dropdown[0,1;2.5;worldedit_gui_flip_axis;X axis,Y axis,Z axis,Look direction;%d]", axis) ..\r
549                         "button_exit[0,2.5;3,0.8;worldedit_gui_flip_submit;Flip]"\r
550         end,\r
551 })\r
552 \r
553 worldedit.register_gui_handler("worldedit_gui_flip", function(name, fields)\r
554         if fields.worldedit_gui_flip_submit then\r
555                 gui_axis1[name] = axis_indices[fields.worldedit_gui_flip_axis]\r
556                 worldedit.show_page(name, "worldedit_gui_flip")\r
557                 minetest.chatcommands["/flip"].func(name, axis_values[gui_axis1[name]])\r
558                 return true\r
559         end\r
560         if fields.worldedit_gui_flip_axis then\r
561                 gui_axis1[name] = axis_indices[fields.worldedit_gui_flip_axis]\r
562                 worldedit.show_page(name, "worldedit_gui_flip")\r
563                 return true\r
564         end\r
565         return false\r
566 end)\r
567 \r
568 worldedit.register_gui_function("worldedit_gui_rotate", {\r
569         name = "Rotate",\r
570         privs = we_privs("rotate"),\r
571         get_formspec = function(name)\r
572                 local axis, angle = gui_axis1[name], gui_angle[name]\r
573                 return "size[5.5,3]" .. worldedit.get_formspec_header("worldedit_gui_rotate") ..\r
574                         string.format("dropdown[0,1;2.5;worldedit_gui_rotate_angle;90 degrees,180 degrees,270 degrees;%s]", angle) ..\r
575                         string.format("dropdown[3,1;2.5;worldedit_gui_rotate_axis;X axis,Y axis,Z axis,Look direction;%d]", axis) ..\r
576                         "button_exit[0,2.5;3,0.8;worldedit_gui_rotate_submit;Rotate]"\r
577         end,\r
578 })\r
579 \r
580 worldedit.register_gui_handler("worldedit_gui_rotate", function(name, fields)\r
581         if fields.worldedit_gui_rotate_submit then\r
582                 gui_axis1[name] = axis_indices[fields.worldedit_gui_rotate_axis]\r
583                 gui_angle[name] = angle_indices[fields.worldedit_gui_rotate_angle]\r
584                 worldedit.show_page(name, "worldedit_gui_rotate")\r
585                 minetest.chatcommands["/rotate"].func(name, string.format("%s %s", axis_values[gui_axis1[name]], angle_values[gui_angle[name]]))\r
586                 return true\r
587         end\r
588         if fields.worldedit_gui_rotate_axis then\r
589                 gui_axis1[name] = axis_indices[fields.worldedit_gui_rotate_axis]\r
590                 worldedit.show_page(name, "worldedit_gui_rotate")\r
591                 return true\r
592         end\r
593         if fields.worldedit_gui_rotate_angle then\r
594                 gui_angle[name] = angle_indices[fields.worldedit_gui_rotate_angle]\r
595                 worldedit.show_page(name, "worldedit_gui_rotate")\r
596                 return true\r
597         end\r
598         return false\r
599 end)\r
600 \r
601 worldedit.register_gui_function("worldedit_gui_orient", {\r
602         name = "Orient",\r
603         privs = we_privs("orient"),\r
604         get_formspec = function(name)\r
605                 local angle = gui_angle[name]\r
606                 return "size[5,3]" .. worldedit.get_formspec_header("worldedit_gui_orient") ..\r
607                         string.format("dropdown[0,1;2.5;worldedit_gui_orient_angle;90 degrees,180 degrees,270 degrees;%s]", angle) ..\r
608                         "button_exit[0,2.5;3,0.8;worldedit_gui_orient_submit;Orient]"\r
609         end,\r
610 })\r
611 \r
612 worldedit.register_gui_handler("worldedit_gui_orient", function(name, fields)\r
613         if fields.worldedit_gui_orient_submit then\r
614                 gui_angle[name] = angle_indices[fields.worldedit_gui_orient_angle]\r
615                 worldedit.show_page(name, "worldedit_gui_orient")\r
616                 minetest.chatcommands["/orient"].func(name, tostring(angle_values[gui_angle[name]]))\r
617                 return true\r
618         end\r
619         if fields.worldedit_gui_orient_angle then\r
620                 gui_angle[name] = angle_indices[fields.worldedit_gui_orient_angle]\r
621                 worldedit.show_page(name, "worldedit_gui_orient")\r
622                 return true\r
623         end\r
624         return false\r
625 end)\r
626 \r
627 worldedit.register_gui_function("worldedit_gui_fixlight", {\r
628         name = "Fix Lighting",\r
629         privs = we_privs("fixlight"),\r
630         on_select = function(name)\r
631                 minetest.chatcommands["/fixlight"].func(name, "")\r
632         end,\r
633 })\r
634 \r
635 worldedit.register_gui_function("worldedit_gui_hide", {\r
636         name = "Hide Region",\r
637         privs = we_privs("hide"),\r
638         on_select = function(name)\r
639                 minetest.chatcommands["/hide"].func(name, "")\r
640         end,\r
641 })\r
642 \r
643 worldedit.register_gui_function("worldedit_gui_suppress", {\r
644         name = "Suppress Nodes",\r
645         privs = we_privs("suppress"),\r
646         get_formspec = function(name)\r
647                 local node = gui_nodename1[name]\r
648                 local nodename = worldedit.normalize_nodename(node)\r
649                 return "size[6.5,3]" .. worldedit.get_formspec_header("worldedit_gui_suppress") ..\r
650                         string.format("field[0.5,1.5;4,0.8;worldedit_gui_suppress_node;Name;%s]", minetest.formspec_escape(node)) ..\r
651                         "button[4,1.18;1.5,0.8;worldedit_gui_suppress_search;Search]" ..\r
652                         formspec_node("5.5,1.1", nodename) ..\r
653                         "button_exit[0,2.5;3,0.8;worldedit_gui_suppress_submit;Suppress Nodes]"\r
654         end,\r
655 })\r
656 \r
657 worldedit.register_gui_handler("worldedit_gui_suppress", function(name, fields)\r
658         if fields.worldedit_gui_suppress_search or fields.worldedit_gui_suppress_submit then\r
659                 gui_nodename1[name] = tostring(fields.worldedit_gui_suppress_node)\r
660                 worldedit.show_page(name, "worldedit_gui_suppress")\r
661                 if fields.worldedit_gui_suppress_submit then\r
662                         local n = worldedit.normalize_nodename(gui_nodename1[name])\r
663                         if n then\r
664                                 minetest.chatcommands["/suppress"].func(name, n)\r
665                         end\r
666                 end\r
667                 return true\r
668         end\r
669         return false\r
670 end)\r
671 \r
672 worldedit.register_gui_function("worldedit_gui_highlight", {\r
673         name = "Highlight Nodes",\r
674         privs = we_privs("highlight"),\r
675         get_formspec = function(name)\r
676                 local node = gui_nodename1[name]\r
677                 local nodename = worldedit.normalize_nodename(node)\r
678                 return "size[6.5,3]" .. worldedit.get_formspec_header("worldedit_gui_highlight") ..\r
679                         string.format("field[0.5,1.5;4,0.8;worldedit_gui_highlight_node;Name;%s]", minetest.formspec_escape(node)) ..\r
680                         "button[4,1.18;1.5,0.8;worldedit_gui_highlight_search;Search]" ..\r
681                         formspec_node("5.5,1.1", nodename) ..\r
682                         "button_exit[0,2.5;3,0.8;worldedit_gui_highlight_submit;Highlight Nodes]"\r
683         end,\r
684 })\r
685 \r
686 worldedit.register_gui_handler("worldedit_gui_highlight", function(name, fields)\r
687         if fields.worldedit_gui_highlight_search or fields.worldedit_gui_highlight_submit then\r
688                 gui_nodename1[name] = tostring(fields.worldedit_gui_highlight_node)\r
689                 worldedit.show_page(name, "worldedit_gui_highlight")\r
690                 if fields.worldedit_gui_highlight_submit then\r
691                         local n = worldedit.normalize_nodename(gui_nodename1[name])\r
692                         if n then\r
693                                 minetest.chatcommands["/highlight"].func(name, n)\r
694                         end\r
695                 end\r
696                 return true\r
697         end\r
698         return false\r
699 end)\r
700 \r
701 worldedit.register_gui_function("worldedit_gui_restore", {\r
702         name = "Restore Region",\r
703         privs = we_privs("restore"),\r
704         on_select = function(name)\r
705                 minetest.chatcommands["/restore"].func(name, "")\r
706         end,\r
707 })\r
708 \r
709 worldedit.register_gui_function("worldedit_gui_save_load", {\r
710         name = "Save/Load",\r
711         privs = combine_we_privs({"save", "allocate", "load"}),\r
712         get_formspec = function(name)\r
713                 local filename = gui_filename[name]\r
714                 return "size[6,4]" .. worldedit.get_formspec_header("worldedit_gui_save_load") ..\r
715                         string.format("field[0.5,1.5;4,0.8;worldedit_gui_save_filename;Filename;%s]", minetest.formspec_escape(filename)) ..\r
716                         "button_exit[0,2.5;3,0.8;worldedit_gui_save_load_submit_save;Save]" ..\r
717                         "button_exit[3,2.5;3,0.8;worldedit_gui_save_load_submit_allocate;Allocate]" ..\r
718                         "button_exit[0,3.5;3,0.8;worldedit_gui_save_load_submit_load;Load]"\r
719         end,\r
720 })\r
721 \r
722 worldedit.register_gui_handler("worldedit_gui_save_load", function(name, fields)\r
723         if fields.worldedit_gui_save_load_submit_save or fields.worldedit_gui_save_load_submit_allocate or fields.worldedit_gui_save_load_submit_load then\r
724                 gui_filename[name] = tostring(fields.worldedit_gui_save_filename)\r
725                 worldedit.show_page(name, "worldedit_gui_save_load")\r
726                 if fields.worldedit_gui_save_load_submit_save then\r
727                         minetest.chatcommands["/save"].func(name, gui_filename[name])\r
728                 elseif fields.worldedit_gui_save_load_submit_allocate then\r
729                         minetest.chatcommands["/allocate"].func(name, gui_filename[name])\r
730                 else --fields.worldedit_gui_save_load_submit_load\r
731                         minetest.chatcommands["/load"].func(name, gui_filename[name])\r
732                 end\r
733                 return true\r
734         end\r
735         return false\r
736 end)\r
737 \r
738 worldedit.register_gui_function("worldedit_gui_clearobjects", {\r
739         name = "Clear Objects",\r
740         privs = we_privs("clearobjects"),\r
741         on_select = function(name)\r
742                 minetest.chatcommands["/clearobjects"].func(name, "")\r
743         end,\r
744 })\r