]> git.lizzy.rs Git - worldedit.git/blob - worldedit_gui/functionality.lua
worldedit_gui: Improve behaviour of some input fields
[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                         "field_close_on_enter[worldedit_gui_set_node;false]" ..\r
177                         "button[4,1.18;1.5,0.8;worldedit_gui_set_search;Search]" ..\r
178                         formspec_node("5.5,1.1", nodename) ..\r
179                         "button_exit[0,2.5;3,0.8;worldedit_gui_set_submit;Set Nodes]"\r
180         end,\r
181 })\r
182 \r
183 worldedit.register_gui_handler("worldedit_gui_set", function(name, fields)\r
184         local ret = false\r
185         if fields.worldedit_gui_set_search or fields.key_enter_field == "worldedit_gui_set_node" then\r
186                 gui_nodename1[name] = tostring(fields.worldedit_gui_set_node)\r
187                 worldedit.show_page(name, "worldedit_gui_set")\r
188                 ret = true -- fallthrough\r
189         end\r
190         if fields.worldedit_gui_set_submit then\r
191                 local n = worldedit.normalize_nodename(gui_nodename1[name])\r
192                 if n then\r
193                         minetest.chatcommands["/set"].func(name, n)\r
194                 end\r
195                 return true\r
196         end\r
197         return ret\r
198 end)\r
199 \r
200 worldedit.register_gui_function("worldedit_gui_replace", {\r
201         name = "Replace Nodes",\r
202         privs = combine_we_privs({"replace", "replaceinverse"}),\r
203         get_formspec = function(name)\r
204                 local search, replace = gui_nodename1[name], gui_nodename2[name]\r
205                 local search_nodename, replace_nodename = worldedit.normalize_nodename(search), worldedit.normalize_nodename(replace)\r
206                 return "size[6.5,4]" .. worldedit.get_formspec_header("worldedit_gui_replace") ..\r
207                         string.format("field[0.5,1.5;4,0.8;worldedit_gui_replace_search;Name;%s]", minetest.formspec_escape(search)) ..\r
208                         "field_close_on_enter[worldedit_gui_replace_search;false]" ..\r
209                         "button[4,1.18;1.5,0.8;worldedit_gui_replace_search_search;Search]" ..\r
210                         formspec_node("5.5,1.1", search_nodename) ..\r
211                         string.format("field[0.5,2.5;4,0.8;worldedit_gui_replace_replace;Name;%s]", minetest.formspec_escape(replace)) ..\r
212                         "field_close_on_enter[worldedit_gui_replace_replace;false]" ..\r
213                         "button[4,2.18;1.5,0.8;worldedit_gui_replace_replace_search;Search]" ..\r
214                         formspec_node("5.5,2.1", replace_nodename) ..\r
215                         "button_exit[0,3.5;3,0.8;worldedit_gui_replace_submit;Replace Nodes]" ..\r
216                         "button_exit[3.5,3.5;3,0.8;worldedit_gui_replace_submit_inverse;Replace Inverse]"\r
217         end,\r
218 })\r
219 \r
220 worldedit.register_gui_handler("worldedit_gui_replace", function(name, fields)\r
221         local ret = false\r
222         if fields.worldedit_gui_replace_search_search or fields.worldedit_gui_replace_replace_search\r
223                 or table.indexof({"worldedit_gui_replace_search", "worldedit_gui_replace_replace"}, fields.key_enter_field) ~= -1 then\r
224                 gui_nodename1[name] = tostring(fields.worldedit_gui_replace_search)\r
225                 gui_nodename2[name] = tostring(fields.worldedit_gui_replace_replace)\r
226                 worldedit.show_page(name, "worldedit_gui_replace")\r
227 \r
228                 ret = true -- fallthrough\r
229         end\r
230         if fields.worldedit_gui_replace_submit or fields.worldedit_gui_replace_submit_inverse then\r
231                 local submit = "replace"\r
232                 if fields.worldedit_gui_replace_submit_inverse then\r
233                         submit = "replaceinverse"\r
234                 end\r
235                 local n1 = worldedit.normalize_nodename(gui_nodename1[name])\r
236                 local n2 = worldedit.normalize_nodename(gui_nodename2[name])\r
237                 if n1 and n2 then\r
238                         minetest.chatcommands["/"..submit].func(name, string.format("%s %s", n1, n2))\r
239                 end\r
240                 return true\r
241         end\r
242         return ret\r
243 end)\r
244 \r
245 worldedit.register_gui_function("worldedit_gui_sphere_dome", {\r
246         name = "Sphere/Dome",\r
247         privs = combine_we_privs({"hollowsphere", "sphere", "hollowdome", "dome"}),\r
248         get_formspec = function(name)\r
249                 local node, radius = gui_nodename1[name], gui_distance2[name]\r
250                 local nodename = worldedit.normalize_nodename(node)\r
251                 return "size[6.5,5]" .. worldedit.get_formspec_header("worldedit_gui_sphere_dome") ..\r
252                         string.format("field[0.5,1.5;4,0.8;worldedit_gui_sphere_dome_node;Name;%s]", minetest.formspec_escape(node)) ..\r
253                         "button[4,1.18;1.5,0.8;worldedit_gui_sphere_dome_search;Search]" ..\r
254                         formspec_node("5.5,1.1", nodename) ..\r
255                         string.format("field[0.5,2.5;4,0.8;worldedit_gui_sphere_dome_radius;Radius;%s]", minetest.formspec_escape(radius)) ..\r
256                         "button_exit[0,3.5;3,0.8;worldedit_gui_sphere_dome_submit_hollow;Hollow Sphere]" ..\r
257                         "button_exit[3.5,3.5;3,0.8;worldedit_gui_sphere_dome_submit_solid;Solid Sphere]" ..\r
258                         "button_exit[0,4.5;3,0.8;worldedit_gui_sphere_dome_submit_hollow_dome;Hollow Dome]" ..\r
259                         "button_exit[3.5,4.5;3,0.8;worldedit_gui_sphere_dome_submit_solid_dome;Solid Dome]"\r
260         end,\r
261 })\r
262 \r
263 worldedit.register_gui_handler("worldedit_gui_sphere_dome", function(name, fields)\r
264         if fields.worldedit_gui_sphere_dome_search\r
265         or fields.worldedit_gui_sphere_dome_submit_hollow or fields.worldedit_gui_sphere_dome_submit_solid\r
266         or fields.worldedit_gui_sphere_dome_submit_hollow_dome or fields.worldedit_gui_sphere_dome_submit_solid_dome then\r
267                 gui_nodename1[name] = tostring(fields.worldedit_gui_sphere_dome_node)\r
268                 gui_distance2[name] = tostring(fields.worldedit_gui_sphere_dome_radius)\r
269                 worldedit.show_page(name, "worldedit_gui_sphere_dome")\r
270 \r
271                 local submit = nil\r
272                 if fields.worldedit_gui_sphere_dome_submit_hollow then\r
273                         submit = "hollowsphere"\r
274                 elseif fields.worldedit_gui_sphere_dome_submit_solid then\r
275                         submit = "sphere"\r
276                 elseif fields.worldedit_gui_sphere_dome_submit_hollow_dome then\r
277                         submit = "hollowdome"\r
278                 elseif fields.worldedit_gui_sphere_dome_submit_solid_dome then\r
279                         submit = "dome"\r
280                 end\r
281                 if submit then\r
282                         local n = worldedit.normalize_nodename(gui_nodename1[name])\r
283                         if n then\r
284                                 minetest.chatcommands["/"..submit].func(name, string.format("%s %s", gui_distance2[name], n))\r
285                         end\r
286                 end\r
287                 return true\r
288         end\r
289         return false\r
290 end)\r
291 \r
292 worldedit.register_gui_function("worldedit_gui_cylinder", {\r
293         name = "Cylinder",\r
294         privs = combine_we_privs({"hollowcylinder", "cylinder"}),\r
295         get_formspec = function(name)\r
296                 local node, axis, length = gui_nodename1[name], gui_axis1[name], gui_distance1[name]\r
297                 local radius1, radius2 = gui_distance2[name], gui_distance3[name]\r
298                 local nodename = worldedit.normalize_nodename(node)\r
299                 return "size[6.5,6]" .. worldedit.get_formspec_header("worldedit_gui_cylinder") ..\r
300                         string.format("field[0.5,1.5;4,0.8;worldedit_gui_cylinder_node;Name;%s]", minetest.formspec_escape(node)) ..\r
301                         "button[4,1.18;1.5,0.8;worldedit_gui_cylinder_search;Search]" ..\r
302                         formspec_node("5.5,1.1", nodename) ..\r
303                         string.format("field[0.5,2.5;4,0.8;worldedit_gui_cylinder_length;Length;%s]", minetest.formspec_escape(length)) ..\r
304                         string.format("dropdown[4,2.18;2.5;worldedit_gui_cylinder_axis;X axis,Y axis,Z axis,Look direction;%d]", axis) ..\r
305                         string.format("field[0.5,3.5;2,0.8;worldedit_gui_cylinder_radius1;Base Radius;%s]", minetest.formspec_escape(radius1)) ..\r
306                         string.format("field[2.5,3.5;2,0.8;worldedit_gui_cylinder_radius2;Top Radius;%s]", minetest.formspec_escape(radius2)) ..\r
307                         "label[0.25,4;Equal base and top radius creates a cylinder,\n"..\r
308                                 "zero top radius creates a cone.\nConsult documentation for more information.]"..\r
309                         "button_exit[0,5.5;3,0.8;worldedit_gui_cylinder_submit_hollow;Hollow Cylinder]" ..\r
310                         "button_exit[3.5,5.5;3,0.8;worldedit_gui_cylinder_submit_solid;Solid Cylinder]"\r
311         end,\r
312 })\r
313 \r
314 worldedit.register_gui_handler("worldedit_gui_cylinder", function(name, fields)\r
315         if fields.worldedit_gui_cylinder_search\r
316         or fields.worldedit_gui_cylinder_submit_hollow or fields.worldedit_gui_cylinder_submit_solid then\r
317                 gui_nodename1[name] = tostring(fields.worldedit_gui_cylinder_node)\r
318                 gui_axis1[name] = axis_indices[fields.worldedit_gui_cylinder_axis]\r
319                 gui_distance1[name] = tostring(fields.worldedit_gui_cylinder_length)\r
320                 gui_distance2[name] = tostring(fields.worldedit_gui_cylinder_radius1)\r
321                 gui_distance3[name] = tostring(fields.worldedit_gui_cylinder_radius2)\r
322                 worldedit.show_page(name, "worldedit_gui_cylinder")\r
323 \r
324                 local submit = nil\r
325                 if fields.worldedit_gui_cylinder_submit_hollow then\r
326                         submit = "hollowcylinder"\r
327                 elseif fields.worldedit_gui_cylinder_submit_solid then\r
328                         submit = "cylinder"\r
329                 end\r
330                 if submit then\r
331                         local n = worldedit.normalize_nodename(gui_nodename1[name])\r
332                         if n then\r
333                                 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
334                                 minetest.chatcommands["/"..submit].func(name, args)\r
335                         end\r
336                 end\r
337                 return true\r
338         end\r
339         if fields.worldedit_gui_cylinder_axis then\r
340                 gui_axis1[name] = axis_indices[fields.worldedit_gui_cylinder_axis]\r
341                 worldedit.show_page(name, "worldedit_gui_cylinder")\r
342                 return true\r
343         end\r
344         return false\r
345 end)\r
346 \r
347 worldedit.register_gui_function("worldedit_gui_pyramid", {\r
348         name = "Pyramid",\r
349         privs = we_privs("pyramid"),\r
350         get_formspec = function(name)\r
351                 local node, axis, length = gui_nodename1[name], gui_axis1[name], gui_distance1[name]\r
352                 local nodename = worldedit.normalize_nodename(node)\r
353                 return "size[6.5,4]" .. worldedit.get_formspec_header("worldedit_gui_pyramid") ..\r
354                         string.format("field[0.5,1.5;4,0.8;worldedit_gui_pyramid_node;Name;%s]", minetest.formspec_escape(node)) ..\r
355                         "button[4,1.18;1.5,0.8;worldedit_gui_pyramid_search;Search]" ..\r
356                         formspec_node("5.5,1.1", nodename) ..\r
357                         string.format("field[0.5,2.5;4,0.8;worldedit_gui_pyramid_length;Length;%s]", minetest.formspec_escape(length)) ..\r
358                         string.format("dropdown[4,2.18;2.5;worldedit_gui_pyramid_axis;X axis,Y axis,Z axis,Look direction;%d]", axis) ..\r
359                         "button_exit[0,3.5;3,0.8;worldedit_gui_pyramid_submit_hollow;Hollow Pyramid]" ..\r
360                         "button_exit[3.5,3.5;3,0.8;worldedit_gui_pyramid_submit_solid;Solid Pyramid]"\r
361         end,\r
362 })\r
363 \r
364 worldedit.register_gui_handler("worldedit_gui_pyramid", function(name, fields)\r
365         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
366                 gui_nodename1[name] = tostring(fields.worldedit_gui_pyramid_node)\r
367                 gui_axis1[name] = axis_indices[fields.worldedit_gui_pyramid_axis]\r
368                 gui_distance1[name] = tostring(fields.worldedit_gui_pyramid_length)\r
369                 worldedit.show_page(name, "worldedit_gui_pyramid")\r
370 \r
371                 local submit = nil\r
372                 if fields.worldedit_gui_pyramid_submit_solid then\r
373                         submit = "pyramid"\r
374                 elseif fields.worldedit_gui_pyramid_submit_hollow then\r
375                         submit = "hollowpyramid"\r
376                 end\r
377                 if submit then\r
378                         local n = worldedit.normalize_nodename(gui_nodename1[name])\r
379                         if n then\r
380                                 minetest.chatcommands["/"..submit].func(name, string.format("%s %s %s", axis_values[gui_axis1[name]], gui_distance1[name], n))\r
381                         end\r
382                 end\r
383                 return true\r
384         end\r
385         if fields.worldedit_gui_pyramid_axis then\r
386                 gui_axis1[name] = axis_indices[fields.worldedit_gui_pyramid_axis]\r
387                 worldedit.show_page(name, "worldedit_gui_pyramid")\r
388                 return true\r
389         end\r
390         return false\r
391 end)\r
392 \r
393 worldedit.register_gui_function("worldedit_gui_spiral", {\r
394         name = "Spiral",\r
395         privs = we_privs("spiral"),\r
396         get_formspec = function(name)\r
397                 local node, length, height, space = gui_nodename1[name], gui_distance1[name], gui_distance2[name], gui_distance3[name]\r
398                 local nodename = worldedit.normalize_nodename(node)\r
399                 return "size[6.5,6]" .. worldedit.get_formspec_header("worldedit_gui_spiral") ..\r
400                         string.format("field[0.5,1.5;4,0.8;worldedit_gui_spiral_node;Name;%s]", minetest.formspec_escape(node)) ..\r
401                         "button[4,1.18;1.5,0.8;worldedit_gui_spiral_search;Search]" ..\r
402                         formspec_node("5.5,1.1", nodename) ..\r
403                         string.format("field[0.5,2.5;4,0.8;worldedit_gui_spiral_length;Side Length;%s]", minetest.formspec_escape(length)) ..\r
404                         string.format("field[0.5,3.5;4,0.8;worldedit_gui_spiral_height;Height;%s]", minetest.formspec_escape(height)) ..\r
405                         string.format("field[0.5,4.5;4,0.8;worldedit_gui_spiral_space;Wall Spacing;%s]", minetest.formspec_escape(space)) ..\r
406                         "button_exit[0,5.5;3,0.8;worldedit_gui_spiral_submit;Spiral]"\r
407         end,\r
408 })\r
409 \r
410 worldedit.register_gui_handler("worldedit_gui_spiral", function(name, fields)\r
411         if fields.worldedit_gui_spiral_search or fields.worldedit_gui_spiral_submit then\r
412                 gui_nodename1[name] = fields.worldedit_gui_spiral_node\r
413                 gui_distance1[name] = tostring(fields.worldedit_gui_spiral_length)\r
414                 gui_distance2[name] = tostring(fields.worldedit_gui_spiral_height)\r
415                 gui_distance3[name] = tostring(fields.worldedit_gui_spiral_space)\r
416                 worldedit.show_page(name, "worldedit_gui_spiral")\r
417                 if fields.worldedit_gui_spiral_submit then\r
418                         local n = worldedit.normalize_nodename(gui_nodename1[name])\r
419                         if n then\r
420                                 minetest.chatcommands["/spiral"].func(name, string.format("%s %s %s %s", gui_distance1[name], gui_distance2[name], gui_distance3[name], n))\r
421                         end\r
422                 end\r
423                 return true\r
424         end\r
425         return false\r
426 end)\r
427 \r
428 worldedit.register_gui_function("worldedit_gui_copy_move", {\r
429         name = "Copy/Move",\r
430         privs = combine_we_privs({"copy", "move"}),\r
431         get_formspec = function(name)\r
432                 local axis = gui_axis1[name] or 4\r
433                 local amount = gui_distance1[name] or "10"\r
434                 return "size[6.5,3]" .. worldedit.get_formspec_header("worldedit_gui_copy_move") ..\r
435                         string.format("field[0.5,1.5;4,0.8;worldedit_gui_copy_move_amount;Amount;%s]", minetest.formspec_escape(amount)) ..\r
436                         string.format("dropdown[4,1.18;2.5;worldedit_gui_copy_move_axis;X axis,Y axis,Z axis,Look direction;%d]", axis) ..\r
437                         "button_exit[0,2.5;3,0.8;worldedit_gui_copy_move_copy;Copy Region]" ..\r
438                         "button_exit[3.5,2.5;3,0.8;worldedit_gui_copy_move_move;Move Region]"\r
439         end,\r
440 })\r
441 \r
442 worldedit.register_gui_handler("worldedit_gui_copy_move", function(name, fields)\r
443         if fields.worldedit_gui_copy_move_copy or fields.worldedit_gui_copy_move_move then\r
444                 gui_axis1[name] = axis_indices[fields.worldedit_gui_copy_move_axis] or 4\r
445                 gui_distance1[name] = tostring(fields.worldedit_gui_copy_move_amount)\r
446                 worldedit.show_page(name, "worldedit_gui_copy_move")\r
447                 if fields.worldedit_gui_copy_move_copy then\r
448                         minetest.chatcommands["/copy"].func(name, string.format("%s %s", axis_values[gui_axis1[name]], gui_distance1[name]))\r
449                 else --fields.worldedit_gui_copy_move_move\r
450                         minetest.chatcommands["/move"].func(name, string.format("%s %s", axis_values[gui_axis1[name]], gui_distance1[name]))\r
451                 end\r
452                 return true\r
453         end\r
454         if fields.worldedit_gui_copy_move_axis then\r
455                 gui_axis1[name] = axis_indices[fields.worldedit_gui_copy_move_axis] or 4\r
456                 worldedit.show_page(name, "worldedit_gui_copy_move")\r
457                 return true\r
458         end\r
459         return false\r
460 end)\r
461 \r
462 worldedit.register_gui_function("worldedit_gui_stack", {\r
463         name = "Stack",\r
464         privs = we_privs("stack"),\r
465         get_formspec = function(name)\r
466                 local axis, count = gui_axis1[name], gui_count1[name]\r
467                 return "size[6.5,3]" .. worldedit.get_formspec_header("worldedit_gui_stack") ..\r
468                         string.format("field[0.5,1.5;4,0.8;worldedit_gui_stack_count;Count;%s]", minetest.formspec_escape(count)) ..\r
469                         string.format("dropdown[4,1.18;2.5;worldedit_gui_stack_axis;X axis,Y axis,Z axis,Look direction;%d]", axis) ..\r
470                         "button_exit[0,2.5;3,0.8;worldedit_gui_stack_submit;Stack]"\r
471         end,\r
472 })\r
473 \r
474 worldedit.register_gui_handler("worldedit_gui_stack", function(name, fields)\r
475         if fields.worldedit_gui_stack_submit then\r
476                 gui_axis1[name] = axis_indices[fields.worldedit_gui_stack_axis]\r
477                 gui_count1[name] = tostring(fields.worldedit_gui_stack_count)\r
478                 worldedit.show_page(name, "worldedit_gui_stack")\r
479                 minetest.chatcommands["/stack"].func(name, string.format("%s %s", axis_values[gui_axis1[name]], gui_count1[name]))\r
480                 return true\r
481         end\r
482         if fields.worldedit_gui_stack_axis then\r
483                 gui_axis1[name] = axis_indices[fields.worldedit_gui_stack_axis]\r
484                 worldedit.show_page(name, "worldedit_gui_stack")\r
485                 return true\r
486         end\r
487         return false\r
488 end)\r
489 \r
490 worldedit.register_gui_function("worldedit_gui_stretch", {\r
491         name = "Stretch",\r
492         privs = we_privs("stretch"),\r
493         get_formspec = function(name)\r
494                 local stretchx, stretchy, stretchz = gui_count1[name], gui_count2[name], gui_count3[name]\r
495                 return "size[5,5]" .. worldedit.get_formspec_header("worldedit_gui_stretch") ..\r
496                         string.format("field[0.5,1.5;4,0.8;worldedit_gui_stretch_x;Stretch X;%s]", minetest.formspec_escape(stretchx)) ..\r
497                         string.format("field[0.5,2.5;4,0.8;worldedit_gui_stretch_y;Stretch Y;%s]", minetest.formspec_escape(stretchy)) ..\r
498                         string.format("field[0.5,3.5;4,0.8;worldedit_gui_stretch_z;Stretch Z;%s]", minetest.formspec_escape(stretchz)) ..\r
499                         "button_exit[0,4.5;3,0.8;worldedit_gui_stretch_submit;Stretch]"\r
500         end,\r
501 })\r
502 \r
503 worldedit.register_gui_handler("worldedit_gui_stretch", function(name, fields)\r
504         if fields.worldedit_gui_stretch_submit then\r
505                 gui_count1[name] = tostring(fields.worldedit_gui_stretch_x)\r
506                 gui_count2[name] = tostring(fields.worldedit_gui_stretch_y)\r
507                 gui_count3[name] = tostring(fields.worldedit_gui_stretch_z)\r
508                 worldedit.show_page(name, "worldedit_gui_stretch")\r
509                 minetest.chatcommands["/stretch"].func(name, string.format("%s %s %s", gui_count1[name], gui_count2[name], gui_count3[name]))\r
510                 return true\r
511         end\r
512         return false\r
513 end)\r
514 \r
515 worldedit.register_gui_function("worldedit_gui_transpose", {\r
516         name = "Transpose",\r
517         privs = we_privs("transpose"),\r
518         get_formspec = function(name)\r
519                 local axis1, axis2 = gui_axis1[name], gui_axis2[name]\r
520                 return "size[5.5,3]" .. worldedit.get_formspec_header("worldedit_gui_transpose") ..\r
521                         string.format("dropdown[0,1;2.5;worldedit_gui_transpose_axis1;X axis,Y axis,Z axis,Look direction;%d]", axis1) ..\r
522                         string.format("dropdown[3,1;2.5;worldedit_gui_transpose_axis2;X axis,Y axis,Z axis,Look direction;%d]", axis2) ..\r
523                         "button_exit[0,2.5;3,0.8;worldedit_gui_transpose_submit;Transpose]"\r
524         end,\r
525 })\r
526 \r
527 worldedit.register_gui_handler("worldedit_gui_transpose", function(name, fields)\r
528         if fields.worldedit_gui_transpose_submit then\r
529                 gui_axis1[name] = axis_indices[fields.worldedit_gui_transpose_axis1]\r
530                 worldedit.show_page(name, "worldedit_gui_transpose")\r
531                 minetest.chatcommands["/transpose"].func(name, string.format("%s %s", axis_values[gui_axis1[name]], axis_values[gui_axis2[name]]))\r
532                 return true\r
533         end\r
534         if fields.worldedit_gui_transpose_axis1 then\r
535                 gui_axis1[name] = axis_indices[fields.worldedit_gui_transpose_axis1]\r
536                 worldedit.show_page(name, "worldedit_gui_transpose")\r
537                 return true\r
538         end\r
539         if fields.worldedit_gui_transpose_axis2 then\r
540                 gui_axis2[name] = axis_indices[fields.worldedit_gui_transpose_axis2]\r
541                 worldedit.show_page(name, "worldedit_gui_transpose")\r
542                 return true\r
543         end\r
544         return false\r
545 end)\r
546 \r
547 worldedit.register_gui_function("worldedit_gui_flip", {\r
548         name = "Flip",\r
549         privs = we_privs("flip"),\r
550         get_formspec = function(name)\r
551                 local axis = gui_axis1[name]\r
552                 return "size[5,3]" .. worldedit.get_formspec_header("worldedit_gui_flip") ..\r
553                         string.format("dropdown[0,1;2.5;worldedit_gui_flip_axis;X axis,Y axis,Z axis,Look direction;%d]", axis) ..\r
554                         "button_exit[0,2.5;3,0.8;worldedit_gui_flip_submit;Flip]"\r
555         end,\r
556 })\r
557 \r
558 worldedit.register_gui_handler("worldedit_gui_flip", function(name, fields)\r
559         if fields.worldedit_gui_flip_submit then\r
560                 gui_axis1[name] = axis_indices[fields.worldedit_gui_flip_axis]\r
561                 worldedit.show_page(name, "worldedit_gui_flip")\r
562                 minetest.chatcommands["/flip"].func(name, axis_values[gui_axis1[name]])\r
563                 return true\r
564         end\r
565         if fields.worldedit_gui_flip_axis then\r
566                 gui_axis1[name] = axis_indices[fields.worldedit_gui_flip_axis]\r
567                 worldedit.show_page(name, "worldedit_gui_flip")\r
568                 return true\r
569         end\r
570         return false\r
571 end)\r
572 \r
573 worldedit.register_gui_function("worldedit_gui_rotate", {\r
574         name = "Rotate",\r
575         privs = we_privs("rotate"),\r
576         get_formspec = function(name)\r
577                 local axis, angle = gui_axis1[name], gui_angle[name]\r
578                 return "size[5.5,3]" .. worldedit.get_formspec_header("worldedit_gui_rotate") ..\r
579                         string.format("dropdown[0,1;2.5;worldedit_gui_rotate_angle;90 degrees,180 degrees,270 degrees;%s]", angle) ..\r
580                         string.format("dropdown[3,1;2.5;worldedit_gui_rotate_axis;X axis,Y axis,Z axis,Look direction;%d]", axis) ..\r
581                         "button_exit[0,2.5;3,0.8;worldedit_gui_rotate_submit;Rotate]"\r
582         end,\r
583 })\r
584 \r
585 worldedit.register_gui_handler("worldedit_gui_rotate", function(name, fields)\r
586         if fields.worldedit_gui_rotate_submit then\r
587                 gui_axis1[name] = axis_indices[fields.worldedit_gui_rotate_axis]\r
588                 gui_angle[name] = angle_indices[fields.worldedit_gui_rotate_angle]\r
589                 worldedit.show_page(name, "worldedit_gui_rotate")\r
590                 minetest.chatcommands["/rotate"].func(name, string.format("%s %s", axis_values[gui_axis1[name]], angle_values[gui_angle[name]]))\r
591                 return true\r
592         end\r
593         if fields.worldedit_gui_rotate_axis then\r
594                 gui_axis1[name] = axis_indices[fields.worldedit_gui_rotate_axis]\r
595                 worldedit.show_page(name, "worldedit_gui_rotate")\r
596                 return true\r
597         end\r
598         if fields.worldedit_gui_rotate_angle then\r
599                 gui_angle[name] = angle_indices[fields.worldedit_gui_rotate_angle]\r
600                 worldedit.show_page(name, "worldedit_gui_rotate")\r
601                 return true\r
602         end\r
603         return false\r
604 end)\r
605 \r
606 worldedit.register_gui_function("worldedit_gui_orient", {\r
607         name = "Orient",\r
608         privs = we_privs("orient"),\r
609         get_formspec = function(name)\r
610                 local angle = gui_angle[name]\r
611                 return "size[5,3]" .. worldedit.get_formspec_header("worldedit_gui_orient") ..\r
612                         string.format("dropdown[0,1;2.5;worldedit_gui_orient_angle;90 degrees,180 degrees,270 degrees;%s]", angle) ..\r
613                         "button_exit[0,2.5;3,0.8;worldedit_gui_orient_submit;Orient]"\r
614         end,\r
615 })\r
616 \r
617 worldedit.register_gui_handler("worldedit_gui_orient", function(name, fields)\r
618         if fields.worldedit_gui_orient_submit then\r
619                 gui_angle[name] = angle_indices[fields.worldedit_gui_orient_angle]\r
620                 worldedit.show_page(name, "worldedit_gui_orient")\r
621                 minetest.chatcommands["/orient"].func(name, tostring(angle_values[gui_angle[name]]))\r
622                 return true\r
623         end\r
624         if fields.worldedit_gui_orient_angle then\r
625                 gui_angle[name] = angle_indices[fields.worldedit_gui_orient_angle]\r
626                 worldedit.show_page(name, "worldedit_gui_orient")\r
627                 return true\r
628         end\r
629         return false\r
630 end)\r
631 \r
632 worldedit.register_gui_function("worldedit_gui_fixlight", {\r
633         name = "Fix Lighting",\r
634         privs = we_privs("fixlight"),\r
635         on_select = function(name)\r
636                 minetest.chatcommands["/fixlight"].func(name, "")\r
637         end,\r
638 })\r
639 \r
640 worldedit.register_gui_function("worldedit_gui_hide", {\r
641         name = "Hide Region",\r
642         privs = we_privs("hide"),\r
643         on_select = function(name)\r
644                 minetest.chatcommands["/hide"].func(name, "")\r
645         end,\r
646 })\r
647 \r
648 worldedit.register_gui_function("worldedit_gui_suppress", {\r
649         name = "Suppress Nodes",\r
650         privs = we_privs("suppress"),\r
651         get_formspec = function(name)\r
652                 local node = gui_nodename1[name]\r
653                 local nodename = worldedit.normalize_nodename(node)\r
654                 return "size[6.5,3]" .. worldedit.get_formspec_header("worldedit_gui_suppress") ..\r
655                         string.format("field[0.5,1.5;4,0.8;worldedit_gui_suppress_node;Name;%s]", minetest.formspec_escape(node)) ..\r
656                         "button[4,1.18;1.5,0.8;worldedit_gui_suppress_search;Search]" ..\r
657                         formspec_node("5.5,1.1", nodename) ..\r
658                         "button_exit[0,2.5;3,0.8;worldedit_gui_suppress_submit;Suppress Nodes]"\r
659         end,\r
660 })\r
661 \r
662 worldedit.register_gui_handler("worldedit_gui_suppress", function(name, fields)\r
663         if fields.worldedit_gui_suppress_search or fields.worldedit_gui_suppress_submit then\r
664                 gui_nodename1[name] = tostring(fields.worldedit_gui_suppress_node)\r
665                 worldedit.show_page(name, "worldedit_gui_suppress")\r
666                 if fields.worldedit_gui_suppress_submit then\r
667                         local n = worldedit.normalize_nodename(gui_nodename1[name])\r
668                         if n then\r
669                                 minetest.chatcommands["/suppress"].func(name, n)\r
670                         end\r
671                 end\r
672                 return true\r
673         end\r
674         return false\r
675 end)\r
676 \r
677 worldedit.register_gui_function("worldedit_gui_highlight", {\r
678         name = "Highlight Nodes",\r
679         privs = we_privs("highlight"),\r
680         get_formspec = function(name)\r
681                 local node = gui_nodename1[name]\r
682                 local nodename = worldedit.normalize_nodename(node)\r
683                 return "size[6.5,3]" .. worldedit.get_formspec_header("worldedit_gui_highlight") ..\r
684                         string.format("field[0.5,1.5;4,0.8;worldedit_gui_highlight_node;Name;%s]", minetest.formspec_escape(node)) ..\r
685                         "button[4,1.18;1.5,0.8;worldedit_gui_highlight_search;Search]" ..\r
686                         formspec_node("5.5,1.1", nodename) ..\r
687                         "button_exit[0,2.5;3,0.8;worldedit_gui_highlight_submit;Highlight Nodes]"\r
688         end,\r
689 })\r
690 \r
691 worldedit.register_gui_handler("worldedit_gui_highlight", function(name, fields)\r
692         if fields.worldedit_gui_highlight_search or fields.worldedit_gui_highlight_submit then\r
693                 gui_nodename1[name] = tostring(fields.worldedit_gui_highlight_node)\r
694                 worldedit.show_page(name, "worldedit_gui_highlight")\r
695                 if fields.worldedit_gui_highlight_submit then\r
696                         local n = worldedit.normalize_nodename(gui_nodename1[name])\r
697                         if n then\r
698                                 minetest.chatcommands["/highlight"].func(name, n)\r
699                         end\r
700                 end\r
701                 return true\r
702         end\r
703         return false\r
704 end)\r
705 \r
706 worldedit.register_gui_function("worldedit_gui_restore", {\r
707         name = "Restore Region",\r
708         privs = we_privs("restore"),\r
709         on_select = function(name)\r
710                 minetest.chatcommands["/restore"].func(name, "")\r
711         end,\r
712 })\r
713 \r
714 worldedit.register_gui_function("worldedit_gui_save_load", {\r
715         name = "Save/Load",\r
716         privs = combine_we_privs({"save", "allocate", "load"}),\r
717         get_formspec = function(name)\r
718                 local filename = gui_filename[name]\r
719                 return "size[6,4]" .. worldedit.get_formspec_header("worldedit_gui_save_load") ..\r
720                         string.format("field[0.5,1.5;4,0.8;worldedit_gui_save_filename;Filename;%s]", minetest.formspec_escape(filename)) ..\r
721                         "button_exit[0,2.5;3,0.8;worldedit_gui_save_load_submit_save;Save]" ..\r
722                         "button_exit[3,2.5;3,0.8;worldedit_gui_save_load_submit_allocate;Allocate]" ..\r
723                         "button_exit[0,3.5;3,0.8;worldedit_gui_save_load_submit_load;Load]"\r
724         end,\r
725 })\r
726 \r
727 worldedit.register_gui_handler("worldedit_gui_save_load", function(name, fields)\r
728         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
729                 gui_filename[name] = tostring(fields.worldedit_gui_save_filename)\r
730                 worldedit.show_page(name, "worldedit_gui_save_load")\r
731                 if fields.worldedit_gui_save_load_submit_save then\r
732                         minetest.chatcommands["/save"].func(name, gui_filename[name])\r
733                 elseif fields.worldedit_gui_save_load_submit_allocate then\r
734                         minetest.chatcommands["/allocate"].func(name, gui_filename[name])\r
735                 else --fields.worldedit_gui_save_load_submit_load\r
736                         minetest.chatcommands["/load"].func(name, gui_filename[name])\r
737                 end\r
738                 return true\r
739         end\r
740         return false\r
741 end)\r
742 \r
743 worldedit.register_gui_function("worldedit_gui_cube", {\r
744         name = "Cuboid", -- technically the command is misnamed, I know...\r
745         privs = combine_we_privs({"hollowcube", "cube"}),\r
746         get_formspec = function(name)\r
747                 local width, height, length = gui_distance1[name], gui_distance2[name], gui_distance3[name]\r
748                 local node = gui_nodename1[name]\r
749                 local nodename = worldedit.normalize_nodename(node)\r
750                 return "size[6.5,4]" .. worldedit.get_formspec_header("worldedit_gui_cube") ..\r
751                         string.format("field[0.5,1.5;4,0.8;worldedit_gui_cube_node;Name;%s]", minetest.formspec_escape(node)) ..\r
752                         "button[4,1.18;1.5,0.8;worldedit_gui_cube_search;Search]" ..\r
753                         formspec_node("5.5,1.1", nodename) ..\r
754                         string.format("field[0.5,2.5;1,0.8;worldedit_gui_cube_width;Width;%s]", minetest.formspec_escape(width)) ..\r
755                         string.format("field[1.5,2.5;1,0.8;worldedit_gui_cube_height;Height;%s]", minetest.formspec_escape(height)) ..\r
756                         string.format("field[2.5,2.5;1,0.8;worldedit_gui_cube_length;Length;%s]", minetest.formspec_escape(length)) ..\r
757                         "button_exit[0,3.5;3,0.8;worldedit_gui_cube_submit_hollow;Hollow Cuboid]" ..\r
758                         "button_exit[3.5,3.5;3,0.8;worldedit_gui_cube_submit_solid;Solid Cuboid]"\r
759         end,\r
760 })\r
761 \r
762 worldedit.register_gui_handler("worldedit_gui_cube", function(name, fields)\r
763         if fields.worldedit_gui_cube_search\r
764         or fields.worldedit_gui_cube_submit_hollow or fields.worldedit_gui_cube_submit_solid then\r
765                 gui_nodename1[name] = tostring(fields.worldedit_gui_cube_node)\r
766                 gui_distance1[name] = tostring(fields.worldedit_gui_cube_width)\r
767                 gui_distance2[name] = tostring(fields.worldedit_gui_cube_height)\r
768                 gui_distance3[name] = tostring(fields.worldedit_gui_cube_length)\r
769                 worldedit.show_page(name, "worldedit_gui_cube")\r
770 \r
771                 local submit = nil\r
772                 if fields.worldedit_gui_cube_submit_hollow then\r
773                         submit = "hollowcube"\r
774                 elseif fields.worldedit_gui_cube_submit_solid then\r
775                         submit = "cube"\r
776                 end\r
777                 if submit then\r
778                         local n = worldedit.normalize_nodename(gui_nodename1[name])\r
779                         if n then\r
780                                 local args = string.format("%s %s %s %s", gui_distance1[name], gui_distance2[name], gui_distance3[name], n)\r
781                                 minetest.chatcommands["/"..submit].func(name, args)\r
782                         end\r
783                 end\r
784                 return true\r
785         end\r
786         return false\r
787 end)\r
788 \r
789 worldedit.register_gui_function("worldedit_gui_clearobjects", {\r
790         name = "Clear Objects",\r
791         privs = we_privs("clearobjects"),\r
792         on_select = function(name)\r
793                 minetest.chatcommands["/clearobjects"].func(name, "")\r
794         end,\r
795 })\r