]> git.lizzy.rs Git - worldedit.git/blob - worldedit_commands/init.lua
Add //unmark chat command, fix position setting not being reset by //reset.
[worldedit.git] / worldedit_commands / init.lua
1 minetest.register_privilege("worldedit", "Can use WorldEdit commands")\r
2 \r
3 worldedit.set_pos = {}\r
4 \r
5 worldedit.pos1 = {}\r
6 worldedit.pos2 = {}\r
7 \r
8 dofile(minetest.get_modpath("worldedit_commands") .. "/mark.lua")\r
9 \r
10 --determines whether `nodename` is a valid node name, returning a boolean\r
11 worldedit.node_is_valid = function(nodename)\r
12         return minetest.registered_nodes[nodename] ~= nil\r
13         or minetest.registered_nodes["default:" .. nodename] ~= nil\r
14 end\r
15 \r
16 --determines the axis in which a player is facing, returning an axis ("x", "y", or "z") and the sign (1 or -1)\r
17 worldedit.player_axis = function(name)\r
18         local dir = minetest.env:get_player_by_name(name):get_look_dir()\r
19         local x, y, z = math.abs(dir.x), math.abs(dir.y), math.abs(dir.z)\r
20         if x > y then\r
21                 if x > z then\r
22                         return "x", dir.x > 0 and 1 or -1\r
23                 end\r
24         elseif y > z then\r
25                 return "y", dir.y > 0 and 1 or -1\r
26         end\r
27         return "z", dir.z > 0 and 1 or -1\r
28 end\r
29 \r
30 minetest.register_chatcommand("/reset", {\r
31         params = "",\r
32         description = "Reset the region so that it is empty",\r
33         privs = {worldedit=true},\r
34         func = function(name, param)\r
35                 worldedit.pos1[name] = nil\r
36                 worldedit.pos2[name] = nil\r
37                 worldedit.mark_pos1(name)\r
38                 worldedit.mark_pos2(name)\r
39                 worldedit.set_pos[name] = nil\r
40                 minetest.chat_send_player(name, "WorldEdit region reset", false)\r
41         end,\r
42 })\r
43 \r
44 minetest.register_chatcommand("/mark", {\r
45         params = "",\r
46         description = "Show markers at the region positions",\r
47         privs = {worldedit=true},\r
48         func = function(name, param)\r
49                 worldedit.mark_pos1(name)\r
50                 worldedit.mark_pos2(name)\r
51                 minetest.chat_send_player(name, "WorldEdit region marked", false)\r
52         end,\r
53 })\r
54 \r
55 minetest.register_chatcommand("/unmark", {\r
56         params = "",\r
57         description = "Hide markers if currently shown",\r
58         privs = {worldedit=true},\r
59         func = function(name, param)\r
60                 local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]\r
61                 worldedit.pos1[name] = nil\r
62                 worldedit.pos2[name] = nil\r
63                 worldedit.mark_pos1(name)\r
64                 worldedit.mark_pos2(name)\r
65                 worldedit.pos1[name] = pos1\r
66                 worldedit.pos2[name] = pos2\r
67                 minetest.chat_send_player(name, "WorldEdit region unmarked", false)\r
68         end,\r
69 })\r
70 \r
71 minetest.register_chatcommand("/pos1", {\r
72         params = "",\r
73         description = "Set WorldEdit region position 1 to the player's location",\r
74         privs = {worldedit=true},\r
75         func = function(name, param)\r
76                 local pos = minetest.env:get_player_by_name(name):getpos()\r
77                 pos.x, pos.y, pos.z = math.floor(pos.x + 0.5), math.floor(pos.y + 0.5), math.floor(pos.z + 0.5)\r
78                 worldedit.pos1[name] = pos\r
79                 worldedit.mark_pos1(name)\r
80                 minetest.chat_send_player(name, "WorldEdit position 1 set to " .. minetest.pos_to_string(pos), false)\r
81         end,\r
82 })\r
83 \r
84 minetest.register_chatcommand("/pos2", {\r
85         params = "",\r
86         description = "Set WorldEdit region position 2 to the player's location",\r
87         privs = {worldedit=true},\r
88         func = function(name, param)\r
89                 local pos = minetest.env:get_player_by_name(name):getpos()\r
90                 pos.x, pos.y, pos.z = math.floor(pos.x + 0.5), math.floor(pos.y + 0.5), math.floor(pos.z + 0.5)\r
91                 worldedit.pos2[name] = pos\r
92                 worldedit.mark_pos2(name)\r
93                 minetest.chat_send_player(name, "WorldEdit position 2 set to " .. minetest.pos_to_string(pos), false)\r
94         end,\r
95 })\r
96 \r
97 minetest.register_chatcommand("/p", {\r
98         params = "set/set1/set2/get",\r
99         description = "Set WorldEdit region, WorldEdit position 1, or WorldEdit position 2 by punching nodes, or display the current WorldEdit region",\r
100         privs = {worldedit=true},\r
101         func = function(name, param)\r
102                 if param == "set" then --set both WorldEdit positions\r
103                         worldedit.set_pos[name] = "pos1"\r
104                         minetest.chat_send_player(name, "Select positions by punching two nodes", false)\r
105                 elseif param == "set1" then --set WorldEdit position 1\r
106                         worldedit.set_pos[name] = "pos1only"\r
107                         minetest.chat_send_player(name, "Select position 1 by punching a node", false)\r
108                 elseif param == "set2" then --set WorldEdit position 2\r
109                         worldedit.set_pos[name] = "pos2"\r
110                         minetest.chat_send_player(name, "Select position 2 by punching a node", false)\r
111                 elseif param == "get" then --display current WorldEdit positions\r
112                         if worldedit.pos1[name] ~= nil then\r
113                                 minetest.chat_send_player(name, "WorldEdit position 1: " .. minetest.pos_to_string(worldedit.pos1[name]), false)\r
114                         else\r
115                                 minetest.chat_send_player(name, "WorldEdit position 1 not set", false)\r
116                         end\r
117                         if worldedit.pos2[name] ~= nil then\r
118                                 minetest.chat_send_player(name, "WorldEdit position 2: " .. minetest.pos_to_string(worldedit.pos2[name]), false)\r
119                         else\r
120                                 minetest.chat_send_player(name, "WorldEdit position 2 not set", false)\r
121                         end\r
122                 else\r
123                         minetest.chat_send_player(name, "Unknown subcommand: " .. param, false)\r
124                 end\r
125         end,\r
126 })\r
127 \r
128 minetest.register_on_punchnode(function(pos, node, puncher)\r
129         local name = puncher:get_player_name()\r
130         if name ~= "" and worldedit.set_pos[name] ~= nil then --currently setting position\r
131                 if worldedit.set_pos[name] == "pos1" then --setting position 1\r
132                         worldedit.pos1[name] = pos\r
133                         worldedit.mark_pos1(name)\r
134                         worldedit.set_pos[name] = "pos2" --set position 2 on the next invocation\r
135                         minetest.chat_send_player(name, "WorldEdit position 1 set to " .. minetest.pos_to_string(pos), false)\r
136                 elseif worldedit.set_pos[name] == "pos1only" then --setting position 1 only\r
137                         worldedit.pos1[name] = pos\r
138                         worldedit.mark_pos1(name)\r
139                         worldedit.set_pos[name] = nil --finished setting positions\r
140                         minetest.chat_send_player(name, "WorldEdit position 1 set to " .. minetest.pos_to_string(pos), false)\r
141                 elseif worldedit.set_pos[name] == "pos2" then --setting position 2\r
142                         worldedit.pos2[name] = pos\r
143                         worldedit.mark_pos2(name)\r
144                         worldedit.set_pos[name] = nil --finished setting positions\r
145                         minetest.chat_send_player(name, "WorldEdit position 2 set to " .. minetest.pos_to_string(pos), false)\r
146                 end\r
147         end\r
148 end)\r
149 \r
150 minetest.register_chatcommand("/volume", {\r
151         params = "",\r
152         description = "Display the volume of the current WorldEdit region",\r
153         privs = {worldedit=true},\r
154         func = function(name, param)\r
155                 local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]\r
156                 if pos1 == nil or pos2 == nil then\r
157                         minetest.chat_send_player(name, "No WorldEdit region selected", false)\r
158                         return\r
159                 end\r
160 \r
161                 local volume = worldedit.volume(pos1, pos2)\r
162                 minetest.chat_send_player(name, "Current WorldEdit region has a volume of " .. volume .. " nodes (" .. pos2.x - pos1.x .. "*" .. pos2.y - pos1.y .. "*" .. pos2.z - pos1.z .. ")", false)\r
163         end,\r
164 })\r
165 \r
166 minetest.register_chatcommand("/set", {\r
167         params = "<node>",\r
168         description = "Set the current WorldEdit region to <node>",\r
169         privs = {worldedit=true},\r
170         func = function(name, param)\r
171                 local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]\r
172                 if pos1 == nil or pos2 == nil then\r
173                         minetest.chat_send_player(name, "No WorldEdit region selected", false)\r
174                         return\r
175                 end\r
176 \r
177                 if param == "" or not worldedit.node_is_valid(param) then\r
178                         minetest.chat_send_player(name, "Invalid node name: " .. param, false)\r
179                         return\r
180                 end\r
181 \r
182                 local tenv = minetest.env\r
183                 if worldedit.ENABLE_QUEUE then\r
184                         tenv = worldedit.quene_aliasenv\r
185                 end\r
186         local count = worldedit.set(pos1, pos2, param, tenv)\r
187                 minetest.chat_send_player(name, count .. " nodes set", false)\r
188         end,\r
189 })\r
190 \r
191 minetest.register_chatcommand("/replace", {\r
192         params = "<search node> <replace node>",\r
193         description = "Replace all instances of <search node> with <replace node> in the current WorldEdit region",\r
194         privs = {worldedit=true},\r
195         func = function(name, param)\r
196                 local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]\r
197                 if pos1 == nil or pos2 == nil then\r
198                         minetest.chat_send_player(name, "No WorldEdit region selected", false)\r
199                         return\r
200                 end\r
201 \r
202                 local found, _, searchnode, replacenode = param:find("^([^%s]+)%s+([^%s]+)$")\r
203                 if found == nil then\r
204                         minetest.chat_send_player(name, "Invalid usage: " .. param, false)\r
205                         return\r
206                 end\r
207                 if not worldedit.node_is_valid(searchnode) then\r
208                         minetest.chat_send_player(name, "Invalid search node name: " .. searchnode, false)\r
209                         return\r
210                 end\r
211                 if not worldedit.node_is_valid(replacenode) then\r
212                         minetest.chat_send_player(name, "Invalid replace node name: " .. replacenode, false)\r
213                         return\r
214                 end\r
215 \r
216                 local tenv = minetest.env\r
217                 if worldedit.ENABLE_QUEUE then\r
218                         tenv = worldedit.quene_aliasenv\r
219                 end\r
220                 local count = worldedit.replace(pos1, pos2, searchnode, replacenode, tenv)\r
221                 minetest.chat_send_player(name, count .. " nodes replaced", false)\r
222         end,\r
223 })\r
224 \r
225 minetest.register_chatcommand("/replaceinverse", {\r
226         params = "<search node> <replace node>",\r
227         description = "Replace all nodes other than <search node> with <replace node> in the current WorldEdit region",\r
228         privs = {worldedit=true},\r
229         func = function(name, param)\r
230                 local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]\r
231                 if pos1 == nil or pos2 == nil then\r
232                         minetest.chat_send_player(name, "No WorldEdit region selected", false)\r
233                         return\r
234                 end\r
235 \r
236                 local found, _, searchnode, replacenode = param:find("^([^%s]+)%s+([^%s]+)$")\r
237                 if found == nil then\r
238                         minetest.chat_send_player(name, "Invalid usage: " .. param, false)\r
239                         return\r
240                 end\r
241                 if not worldedit.node_is_valid(searchnode) then\r
242                         minetest.chat_send_player(name, "Invalid search node name: " .. searchnode, false)\r
243                         return\r
244                 end\r
245                 if not worldedit.node_is_valid(replacenode) then\r
246                         minetest.chat_send_player(name, "Invalid replace node name: " .. replacenode, false)\r
247                         return\r
248                 end\r
249 \r
250                 local tenv = minetest.env\r
251                 if worldedit.ENABLE_QUEUE then\r
252                         tenv = worldedit.quene_aliasenv\r
253                 end\r
254                 local count = worldedit.replaceinverse(pos1, pos2, searchnode, replacenode, tenv)\r
255                 minetest.chat_send_player(name, count .. " nodes replaced", false)\r
256         end,\r
257 })\r
258 \r
259 minetest.register_chatcommand("/hollowsphere", {\r
260         params = "<radius> <node>",\r
261         description = "Add hollow sphere at WorldEdit position 1 with radius <radius>, composed of <node>",\r
262         privs = {worldedit=true},\r
263         func = function(name, param)\r
264                 local pos = worldedit.pos1[name]\r
265                 if pos == nil then\r
266                         minetest.chat_send_player(name, "No WorldEdit region selected", false)\r
267                         return\r
268                 end\r
269 \r
270                 local found, _, radius, nodename = param:find("^(%d+)%s+([^%s]+)$")\r
271                 if found == nil then\r
272                         minetest.chat_send_player(name, "Invalid usage: " .. param, false)\r
273                         return\r
274                 end\r
275                 if not worldedit.node_is_valid(nodename) then\r
276                         minetest.chat_send_player(name, "Invalid node name: " .. param, false)\r
277                         return\r
278                 end\r
279 \r
280                 local tenv = minetest.env\r
281                 if worldedit.ENABLE_QUEUE then\r
282                         tenv = worldedit.quene_aliasenv\r
283                 end\r
284                 local count = worldedit.hollow_sphere(pos, tonumber(radius), nodename, tenv)\r
285                 minetest.chat_send_player(name, count .. " nodes added", false)\r
286         end,\r
287 })\r
288 \r
289 minetest.register_chatcommand("/sphere", {\r
290         params = "<radius> <node>",\r
291         description = "Add sphere at WorldEdit position 1 with radius <radius>, composed of <node>",\r
292         privs = {worldedit=true},\r
293         func = function(name, param)\r
294                 local pos = worldedit.pos1[name]\r
295                 if pos == nil then\r
296                         minetest.chat_send_player(name, "No WorldEdit region selected", false)\r
297                         return\r
298                 end\r
299 \r
300                 local found, _, radius, nodename = param:find("^(%d+)%s+([^%s]+)$")\r
301                 if found == nil then\r
302                         minetest.chat_send_player(name, "Invalid usage: " .. param, false)\r
303                         return\r
304                 end\r
305                 if not worldedit.node_is_valid(nodename) then\r
306                         minetest.chat_send_player(name, "Invalid node name: " .. param, false)\r
307                         return\r
308                 end\r
309 \r
310                 local tenv = minetest.env\r
311                 if worldedit.ENABLE_QUEUE then\r
312                         tenv = worldedit.quene_aliasenv\r
313                 end\r
314                 local count = worldedit.sphere(pos, tonumber(radius), nodename, tenv)\r
315                 minetest.chat_send_player(name, count .. " nodes added", false)\r
316         end,\r
317 })\r
318 \r
319 minetest.register_chatcommand("/hollowdome", {\r
320         params = "<radius> <node>",\r
321         description = "Add hollow dome at WorldEdit position 1 with radius <radius>, composed of <node>",\r
322         privs = {worldedit=true},\r
323         func = function(name, param)\r
324                 local pos = worldedit.pos1[name]\r
325                 if pos == nil then\r
326                         minetest.chat_send_player(name, "No WorldEdit region selected", false)\r
327                         return\r
328                 end\r
329 \r
330                 local found, _, radius, nodename = param:find("^(%d+)%s+([^%s]+)$")\r
331                 if found == nil then\r
332                         minetest.chat_send_player(name, "Invalid usage: " .. param, false)\r
333                         return\r
334                 end\r
335                 if not worldedit.node_is_valid(nodename) then\r
336                         minetest.chat_send_player(name, "Invalid node name: " .. param, false)\r
337                         return\r
338                 end\r
339 \r
340                 local tenv = minetest.env\r
341                 if worldedit.ENABLE_QUEUE then\r
342                         tenv = worldedit.quene_aliasenv\r
343                 end\r
344                 local count = worldedit.hollow_dome(pos, tonumber(radius), nodename, tenv)\r
345                 minetest.chat_send_player(name, count .. " nodes added", false)\r
346         end,\r
347 })\r
348 \r
349 minetest.register_chatcommand("/dome", {\r
350         params = "<radius> <node>",\r
351         description = "Add dome at WorldEdit position 1 with radius <radius>, composed of <node>",\r
352         privs = {worldedit=true},\r
353         func = function(name, param)\r
354                 local pos = worldedit.pos1[name]\r
355                 if pos == nil then\r
356                         minetest.chat_send_player(name, "No WorldEdit region selected", false)\r
357                         return\r
358                 end\r
359 \r
360                 local found, _, radius, nodename = param:find("^(%d+)%s+([^%s]+)$")\r
361                 if found == nil then\r
362                         minetest.chat_send_player(name, "Invalid usage: " .. param, false)\r
363                         return\r
364                 end\r
365                 if not worldedit.node_is_valid(nodename) then\r
366                         minetest.chat_send_player(name, "Invalid node name: " .. param, false)\r
367                         return\r
368                 end\r
369 \r
370                 local tenv = minetest.env\r
371                 if worldedit.ENABLE_QUEUE then\r
372                         tenv = worldedit.quene_aliasenv\r
373                 end\r
374                 local count = worldedit.dome(pos, tonumber(radius), nodename, tenv)\r
375                 minetest.chat_send_player(name, count .. " nodes added", false)\r
376         end,\r
377 })\r
378 \r
379 minetest.register_chatcommand("/hollowcylinder", {\r
380         params = "x/y/z/? <length> <radius> <node>",\r
381         description = "Add hollow cylinder at WorldEdit position 1 along the x/y/z/? axis with length <length> and radius <radius>, composed of <node>",\r
382         privs = {worldedit=true},\r
383         func = function(name, param)\r
384                 local pos = worldedit.pos1[name]\r
385                 if pos == nil then\r
386                         minetest.chat_send_player(name, "No WorldEdit region selected", false)\r
387                         return\r
388                 end\r
389 \r
390                 local found, _, axis, length, radius, nodename = param:find("^([xyz%?])%s+([+-]?%d+)%s+(%d+)%s+([^%s]+)$")\r
391                 if found == nil then\r
392                         minetest.chat_send_player(name, "Invalid usage: " .. param, false)\r
393                         return\r
394                 end\r
395                 if axis == "?" then\r
396                         axis, sign = worldedit.player_axis(name)\r
397                         length = length * sign\r
398                 end\r
399                 if not worldedit.node_is_valid(nodename) then\r
400                         minetest.chat_send_player(name, "Invalid node name: " .. param, false)\r
401                         return\r
402                 end\r
403 \r
404                 local tenv = minetest.env\r
405                 if worldedit.ENABLE_QUEUE then\r
406                         tenv = worldedit.quene_aliasenv\r
407                 end\r
408                 local count = worldedit.hollow_cylinder(pos, axis, tonumber(length), tonumber(radius), nodename, tenv)\r
409                 minetest.chat_send_player(name, count .. " nodes added", false)\r
410         end,\r
411 })\r
412 \r
413 minetest.register_chatcommand("/cylinder", {\r
414         params = "x/y/z/? <length> <radius> <node>",\r
415         description = "Add cylinder at WorldEdit position 1 along the x/y/z/? axis with length <length> and radius <radius>, composed of <node>",\r
416         privs = {worldedit=true},\r
417         func = function(name, param)\r
418                 local pos = worldedit.pos1[name]\r
419                 if pos == nil then\r
420                         minetest.chat_send_player(name, "No WorldEdit region selected", false)\r
421                         return\r
422                 end\r
423 \r
424                 local found, _, axis, length, radius, nodename = param:find("^([xyz%?])%s+([+-]?%d+)%s+(%d+)%s+([^%s]+)$")\r
425                 if found == nil then\r
426                         minetest.chat_send_player(name, "Invalid usage: " .. param, false)\r
427                         return\r
428                 end\r
429                 if axis == "?" then\r
430                         axis, sign = worldedit.player_axis(name)\r
431                         length = length * sign\r
432                 end\r
433                 if not worldedit.node_is_valid(nodename) then\r
434                         minetest.chat_send_player(name, "Invalid node name: " .. param, false)\r
435                         return\r
436                 end\r
437 \r
438                 local tenv = minetest.env\r
439                 if worldedit.ENABLE_QUEUE then\r
440                         tenv = worldedit.quene_aliasenv\r
441                 end\r
442                 local count = worldedit.cylinder(pos, axis, tonumber(length), tonumber(radius), nodename, tenv)\r
443                 minetest.chat_send_player(name, count .. " nodes added", false)\r
444         end,\r
445 })\r
446 \r
447 minetest.register_chatcommand("/pyramid", {\r
448         params = "<height> <node>",\r
449         description = "Add pyramid at WorldEdit position 1 with height <height>, composed of <node>",\r
450         privs = {worldedit=true},\r
451         func = function(name, param)\r
452                 local pos = worldedit.pos1[name]\r
453                 if pos == nil then\r
454                         minetest.chat_send_player(name, "No WorldEdit region selected", false)\r
455                         return\r
456                 end\r
457 \r
458                 local found, _, size, nodename = param:find("(%d+)%s+([^%s]+)$")\r
459                 if found == nil then\r
460                         minetest.chat_send_player(name, "Invalid usage: " .. param, false)\r
461                         return\r
462                 end\r
463                 if not worldedit.node_is_valid(nodename) then\r
464                         minetest.chat_send_player(name, "Invalid node name: " .. param, false)\r
465                         return\r
466                 end\r
467 \r
468                 local tenv = minetest.env\r
469                 if worldedit.ENABLE_QUEUE then\r
470                         tenv = worldedit.quene_aliasenv\r
471                 end\r
472                 local count = worldedit.pyramid(pos, tonumber(size), nodename, tenv)\r
473                 minetest.chat_send_player(name, count .. " nodes added", false)\r
474         end,\r
475 })\r
476 \r
477 minetest.register_chatcommand("/spiral", {\r
478         params = "<width> <height> <space> <node>",\r
479         description = "Add spiral at WorldEdit position 1 with width <width>, height <height>, space between walls <space>, composed of <node>",\r
480         privs = {worldedit=true},\r
481         func = function(name, param)\r
482                 local pos = worldedit.pos1[name]\r
483                 if pos == nil then\r
484                         minetest.chat_send_player(name, "No WorldEdit region selected", false)\r
485                         return\r
486                 end\r
487 \r
488                 local found, _, width, height, space, nodename = param:find("(%d+)%s+(%d+)%s+(%d+)%s+([^%s]+)$")\r
489                 if found == nil then\r
490                         minetest.chat_send_player(name, "Invalid usage: " .. param, false)\r
491                         return\r
492                 end\r
493                 if not worldedit.node_is_valid(nodename) then\r
494                         minetest.chat_send_player(name, "Invalid node name: " .. param, false)\r
495                         return\r
496                 end\r
497 \r
498                 local tenv = minetest.env\r
499                 if worldedit.ENABLE_QUEUE then\r
500                         tenv = worldedit.quene_aliasenv\r
501                 end\r
502                 local count = worldedit.spiral(pos, tonumber(width), tonumber(height), tonumber(space), nodename, tenv)\r
503                 minetest.chat_send_player(name, count .. " nodes changed", false)\r
504         end,\r
505 })\r
506 \r
507 minetest.register_chatcommand("/copy", {\r
508         params = "x/y/z/? <amount>",\r
509         description = "Copy the current WorldEdit region along the x/y/z/? axis by <amount> nodes",\r
510         privs = {worldedit=true},\r
511         func = function(name, param)\r
512                 local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]\r
513                 if pos1 == nil or pos2 == nil then\r
514                         minetest.chat_send_player(name, "No WorldEdit region selected", false)\r
515                         return\r
516                 end\r
517 \r
518                 local found, _, axis, amount = param:find("^([xyz%?])%s+([+-]?%d+)$")\r
519                 if found == nil then\r
520                         minetest.chat_send_player(name, "Invalid usage: " .. param, false)\r
521                         return\r
522                 end\r
523                 if axis == "?" then\r
524                         axis, sign = worldedit.player_axis(name)\r
525                         amount = amount * sign\r
526                 end\r
527 \r
528                 local tenv = minetest.env\r
529                 if worldedit.ENABLE_QUEUE then\r
530                         tenv = worldedit.quene_aliasenv\r
531                 end\r
532                 local count = worldedit.copy(pos1, pos2, axis, tonumber(amount), tenv)\r
533                 minetest.chat_send_player(name, count .. " nodes copied", false)\r
534         end,\r
535 })\r
536 \r
537 minetest.register_chatcommand("/move", {\r
538         params = "x/y/z/? <amount>",\r
539         description = "Move the current WorldEdit region along the x/y/z/? axis by <amount> nodes",\r
540         privs = {worldedit=true},\r
541         func = function(name, param)\r
542                 local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]\r
543                 if pos1 == nil or pos2 == nil then\r
544                         minetest.chat_send_player(name, "No WorldEdit region selected", false)\r
545                         return\r
546                 end\r
547 \r
548                 local found, _, axis, amount = param:find("^([xyz%?])%s+([+-]?%d+)$")\r
549                 if found == nil then\r
550                         minetest.chat_send_player(name, "Invalid usage: " .. param, false)\r
551                         return\r
552                 end\r
553                 if axis == "?" then\r
554                         axis, sign = worldedit.player_axis(name)\r
555                         amount = amount * sign\r
556                 end\r
557 \r
558                 local count = worldedit.move(pos1, pos2, axis, tonumber(amount))\r
559 \r
560                 pos1[axis] = pos1[axis] + amount\r
561                 pos2[axis] = pos2[axis] + amount\r
562                 worldedit.mark_pos1(name)\r
563                 worldedit.mark_pos2(name)\r
564 \r
565                 local tenv = minetest.env\r
566                 if worldedit.ENABLE_QUEUE then\r
567                         tenv = worldedit.quene_aliasenv\r
568                 end\r
569                 local count = worldedit.copy(pos1, pos2, axis, tonumber(amount), tenv)\r
570                 minetest.chat_send_player(name, count .. " nodes moved", false)\r
571         end,\r
572 })\r
573 \r
574 minetest.register_chatcommand("/stack", {\r
575         params = "x/y/z/? <count>",\r
576         description = "Stack the current WorldEdit region along the x/y/z/? axis <count> times",\r
577         privs = {worldedit=true},\r
578         func = function(name, param)\r
579                 local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]\r
580                 if pos1 == nil or pos2 == nil then\r
581                         minetest.chat_send_player(name, "No WorldEdit region selected", false)\r
582                         return\r
583                 end\r
584 \r
585                 local found, _, axis, count = param:find("^([xyz%?])%s+([+-]?%d+)$")\r
586                 if found == nil then\r
587                         minetest.chat_send_player(name, "Invalid usage: " .. param, false)\r
588                         return\r
589                 end\r
590                 if axis == "?" then\r
591                         axis, sign = worldedit.player_axis(name)\r
592                         count = count * sign\r
593                 end\r
594 \r
595                 local tenv = minetest.env\r
596                 if worldedit.ENABLE_QUEUE then\r
597                         tenv = worldedit.quene_aliasenv\r
598                 end\r
599                 local count = worldedit.stack(pos1, pos2, axis, tonumber(count), tenv)\r
600                 minetest.chat_send_player(name, count .. " nodes stacked", false)\r
601         end,\r
602 })\r
603 \r
604 minetest.register_chatcommand("/transpose", {\r
605         params = "x/y/z/? x/y/z/?",\r
606         description = "Transpose the current WorldEdit region along the x/y/z/? and x/y/z/? axes",\r
607         privs = {worldedit=true},\r
608         func = function(name, param)\r
609                 local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]\r
610                 if pos1 == nil or pos2 == nil then\r
611                         minetest.chat_send_player(name, "No WorldEdit region selected", false)\r
612                         return\r
613                 end\r
614 \r
615                 local found, _, axis1, axis2 = param:find("^([xyz%?])%s+([xyz%?])$")\r
616                 if found == nil then\r
617                         minetest.chat_send_player(name, "Invalid usage: " .. param, false)\r
618                         return\r
619                 end\r
620                 if axis1 == "?" then\r
621                         axis1 = worldedit.player_axis(name)\r
622                 end\r
623                 if axis2 == "?" then\r
624                         axis2 = worldedit.player_axis(name)\r
625                 end\r
626                 if axis1 == axis2 then\r
627                         minetest.chat_send_player(name, "Invalid usage: axes are the same", false)\r
628                         return\r
629                 end\r
630 \r
631                 local tenv = minetest.env\r
632                 if worldedit.ENABLE_QUEUE then\r
633                         tenv = worldedit.quene_aliasenv\r
634                 end\r
635                 local count, pos1, pos2 = worldedit.transpose(pos1, pos2, axis1, axis2, tenv)\r
636 \r
637                 --reset markers to transposed positions\r
638                 worldedit.pos1[name] = pos1\r
639                 worldedit.pos2[name] = pos2\r
640                 worldedit.mark_pos1(name)\r
641                 worldedit.mark_pos2(name)\r
642 \r
643                 minetest.chat_send_player(name, count .. " nodes transposed", false)\r
644         end,\r
645 })\r
646 \r
647 minetest.register_chatcommand("/flip", {\r
648         params = "x/y/z/?",\r
649         description = "Flip the current WorldEdit region along the x/y/z/? axis",\r
650         privs = {worldedit=true},\r
651         func = function(name, param)\r
652                 local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]\r
653                 if pos1 == nil or pos2 == nil then\r
654                         minetest.chat_send_player(name, "No WorldEdit region selected", false)\r
655                         return\r
656                 end\r
657 \r
658                 if param == "?" then\r
659                         param = worldedit.player_axis(name)\r
660                 end\r
661                 if param ~= "x" and param ~= "y" and param ~= "z" then\r
662                         minetest.chat_send_player(name, "Invalid usage: " .. param, false)\r
663                         return\r
664                 end\r
665 \r
666                 local tenv = minetest.env\r
667                 if worldedit.ENABLE_QUEUE then\r
668                         tenv = worldedit.quene_aliasenv\r
669                 end\r
670                 local count = worldedit.flip(pos1, pos2, param, tenv)\r
671                 minetest.chat_send_player(name, count .. " nodes flipped", false)\r
672         end,\r
673 })\r
674 \r
675 minetest.register_chatcommand("/rotate", {\r
676         params = "<axis> <angle>",\r
677         description = "Rotate the current WorldEdit region around the axis <axis> by angle <angle> (90 degree increment)",\r
678         privs = {worldedit=true},\r
679         func = function(name, param)\r
680                 local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]\r
681                 if pos1 == nil or pos2 == nil then\r
682                         minetest.chat_send_player(name, "No WorldEdit region selected", false)\r
683                         return\r
684                 end\r
685 \r
686                 local found, _, axis, angle = param:find("^([xyz%?])%s+([+-]?%d+)$")\r
687                 if found == nil then\r
688                         minetest.chat_send_player(name, "Invalid usage: " .. param, false)\r
689                         return\r
690                 end\r
691                 if axis == "?" then\r
692                         axis = worldedit.player_axis(name)\r
693                 end\r
694                 if angle % 90 ~= 0 then\r
695                         minetest.chat_send_player(name, "Invalid usage: angle must be multiple of 90", false)\r
696                         return\r
697                 end\r
698 \r
699                 local tenv = minetest.env\r
700                 if worldedit.ENABLE_QUEUE then\r
701                         tenv = worldedit.quene_aliasenv\r
702                 end\r
703                 local count, pos1, pos2 = worldedit.rotate(pos1, pos2, axis, angle, tenv)\r
704 \r
705                 --reset markers to rotated positions\r
706                 worldedit.pos1[name] = pos1\r
707                 worldedit.pos2[name] = pos2\r
708                 worldedit.mark_pos1(name)\r
709                 worldedit.mark_pos2(name)\r
710 \r
711                 minetest.chat_send_player(name, count .. " nodes rotated", false)\r
712         end,\r
713 })\r
714 \r
715 minetest.register_chatcommand("/orient", {\r
716         params = "<angle>",\r
717         description = "Rotate oriented nodes in the current WorldEdit region around the Y axis by angle <angle> (90 degree increment)",\r
718         privs = {worldedit=true},\r
719         func = function(name, param)\r
720                 local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]\r
721                 if pos1 == nil or pos2 == nil then\r
722                         minetest.chat_send_player(name, "No WorldEdit region selected", false)\r
723                         return\r
724                 end\r
725 \r
726                 local found, _, angle = param:find("^([+-]?%d+)$")\r
727                 if found == nil then\r
728                         minetest.chat_send_player(name, "Invalid usage: " .. param, false)\r
729                         return\r
730                 end\r
731                 if angle % 90 ~= 0 then\r
732                         minetest.chat_send_player(name, "Invalid usage: angle must be multiple of 90", false)\r
733                         return\r
734                 end\r
735 \r
736                 local tenv = minetest.env\r
737                 if worldedit.ENABLE_QUEUE then\r
738                         tenv = worldedit.quene_aliasenv\r
739                 end\r
740                 local count = worldedit.orient(pos1, pos2, angle, tenv)\r
741 \r
742                 minetest.chat_send_player(name, count .. " nodes oriented", false)\r
743         end,\r
744 })\r
745 \r
746 minetest.register_chatcommand("/fixlight", {\r
747         params = "",\r
748         description = "Fix the lighting in the current WorldEdit region",\r
749         privs = {worldedit=true},\r
750         func = function(name, param)\r
751                 local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]\r
752                 if pos1 == nil or pos2 == nil then\r
753                         minetest.chat_send_player(name, "No WorldEdit region selected", false)\r
754                         return\r
755                 end\r
756 \r
757                 local tenv = minetest.env\r
758                 if worldedit.ENABLE_QUEUE then\r
759                         tenv = worldedit.quene_aliasenv\r
760                 end\r
761                 local count = worldedit.fixlight(pos1, pos2, tenv)\r
762                 minetest.chat_send_player(name, count .. " nodes updated", false)\r
763         end,\r
764 })\r
765 \r
766 minetest.register_chatcommand("/hide", {\r
767         params = "",\r
768         description = "Hide all nodes in the current WorldEdit region non-destructively",\r
769         privs = {worldedit=true},\r
770         func = function(name, param)\r
771                 local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]\r
772                 if pos1 == nil or pos2 == nil then\r
773                         minetest.chat_send_player(name, "No WorldEdit region selected", false)\r
774                         return\r
775                 end\r
776 \r
777                 local tenv = minetest.env\r
778                 if worldedit.ENABLE_QUEUE then\r
779                         tenv = worldedit.quene_aliasenv\r
780                 end\r
781                 local count = worldedit.hide(pos1, pos2, tenv)\r
782                 minetest.chat_send_player(name, count .. " nodes hidden", false)\r
783         end,\r
784 })\r
785 \r
786 minetest.register_chatcommand("/suppress", {\r
787         params = "<node>",\r
788         description = "Suppress all <node> in the current WorldEdit region non-destructively",\r
789         privs = {worldedit=true},\r
790         func = function(name, param)\r
791                 local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]\r
792                 if pos1 == nil or pos2 == nil then\r
793                         minetest.chat_send_player(name, "No WorldEdit region selected", false)\r
794                         return\r
795                 end\r
796 \r
797                 if param == "" or not worldedit.node_is_valid(param) then\r
798                         minetest.chat_send_player(name, "Invalid node name: " .. param, false)\r
799                         return\r
800                 end\r
801 \r
802                 local tenv = minetest.env\r
803                 if worldedit.ENABLE_QUEUE then\r
804                         tenv = worldedit.quene_aliasenv\r
805                 end\r
806                 local count = worldedit.suppress(pos1, pos2, param, tenv)\r
807                 minetest.chat_send_player(name, count .. " nodes suppressed", false)\r
808         end,\r
809 })\r
810 \r
811 minetest.register_chatcommand("/highlight", {\r
812         params = "<node>",\r
813         description = "Highlight <node> in the current WorldEdit region by hiding everything else non-destructively",\r
814         privs = {worldedit=true},\r
815         func = function(name, param)\r
816                 local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]\r
817                 if pos1 == nil or pos2 == nil then\r
818                         minetest.chat_send_player(name, "No WorldEdit region selected", false)\r
819                         return\r
820                 end\r
821 \r
822                 if param == "" or not worldedit.node_is_valid(param) then\r
823                         minetest.chat_send_player(name, "Invalid node name: " .. param, false)\r
824                         return\r
825                 end\r
826 \r
827                 local tenv = minetest.env\r
828                 if worldedit.ENABLE_QUEUE then\r
829                         tenv = worldedit.quene_aliasenv\r
830                 end\r
831                 local count = worldedit.highlight(pos1, pos2, param, tenv)\r
832                 minetest.chat_send_player(name, count .. " nodes highlighted", false)\r
833         end,\r
834 })\r
835 \r
836 minetest.register_chatcommand("/restore", {\r
837         params = "",\r
838         description = "Restores nodes hidden with WorldEdit in the current WorldEdit region",\r
839         privs = {worldedit=true},\r
840         func = function(name, param)\r
841                 local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]\r
842                 if pos1 == nil or pos2 == nil then\r
843                         minetest.chat_send_player(name, "No WorldEdit region selected", false)\r
844                         return\r
845                 end\r
846 \r
847                 local tenv = minetest.env\r
848                 if worldedit.ENABLE_QUEUE then\r
849                         tenv = worldedit.quene_aliasenv\r
850                 end\r
851                 local count = worldedit.restore(pos1, pos2, tenv)\r
852                 minetest.chat_send_player(name, count .. " nodes restored", false)\r
853         end,\r
854 })\r
855 \r
856 minetest.register_chatcommand("/save", {\r
857         params = "<file>",\r
858         description = "Save the current WorldEdit region to \"(world folder)/schems/<file>.we\"",\r
859         privs = {worldedit=true},\r
860         func = function(name, param)\r
861                 local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]\r
862                 if pos1 == nil or pos2 == nil then\r
863                         minetest.chat_send_player(name, "No WorldEdit region selected", false)\r
864                         return\r
865                 end\r
866 \r
867                 if param == "" then\r
868                         minetest.chat_send_player(name, "Invalid usage: " .. param, false)\r
869                         return\r
870                 end\r
871 \r
872                 local result, count = worldedit.serialize(pos1, pos2)\r
873 \r
874                 local path = minetest.get_worldpath() .. "/schems"\r
875                 local filename = path .. "/" .. param .. ".we"\r
876                 os.execute("mkdir \"" .. path .. "\"") --create directory if it does not already exist\r
877                 local file, err = io.open(filename, "wb")\r
878                 if err ~= nil then\r
879                         minetest.chat_send_player(name, "Could not save file to \"" .. filename .. "\"", false)\r
880                         return\r
881                 end\r
882                 file:write(result)\r
883                 file:flush()\r
884                 file:close()\r
885 \r
886                 minetest.chat_send_player(name, count .. " nodes saved", false)\r
887         end,\r
888 })\r
889 \r
890 minetest.register_chatcommand("/allocate", {\r
891         params = "<file>",\r
892         description = "Set the region defined by nodes from \"(world folder)/schems/<file>.we\" as the current WorldEdit region",\r
893         privs = {worldedit=true},\r
894         func = function(name, param)\r
895                 local pos1 = worldedit.pos1[name]\r
896                 if pos1 == nil then\r
897                         minetest.chat_send_player(name, "No WorldEdit region selected", false)\r
898                         return\r
899                 end\r
900 \r
901                 if param == "" then\r
902                         minetest.chat_send_player(name, "Invalid usage: " .. param, false)\r
903                         return\r
904                 end\r
905 \r
906                 local filename = minetest.get_worldpath() .. "/schems/" .. param .. ".we"\r
907                 local file, err = io.open(filename, "rb")\r
908                 if err ~= nil then\r
909                         minetest.chat_send_player(name, "Could not open file \"" .. filename .. "\"", false)\r
910                         return\r
911                 end\r
912                 local value = file:read("*a")\r
913                 file:close()\r
914 \r
915                 if worldedit.valueversion(value) == 0 then --unknown version\r
916                         minetest.chat_send_player(name, "Invalid file: file is invalid or created with newer version of WorldEdit", false)\r
917                         return\r
918                 end\r
919                 local nodepos1, nodepos2, count = worldedit.allocate(pos1, value)\r
920 \r
921                 worldedit.pos1[name] = nodepos1\r
922                 worldedit.mark_pos1(name)\r
923                 worldedit.pos2[name] = nodepos2\r
924                 worldedit.mark_pos2(name)\r
925 \r
926                 minetest.chat_send_player(name, count .. " nodes allocated", false)\r
927         end,\r
928 })\r
929 \r
930 minetest.register_chatcommand("/load", {\r
931         params = "<file>",\r
932         description = "Load nodes from \"(world folder)/schems/<file>[.we[m]]\" with position 1 of the current WorldEdit region as the origin",\r
933         privs = {worldedit=true},\r
934         func = function(name, param)\r
935                 local pos1 = worldedit.pos1[name]\r
936                 if pos1 == nil then\r
937                         minetest.chat_send_player(name, "No WorldEdit region selected", false)\r
938                         return\r
939                 end\r
940 \r
941                 if param == "" then\r
942                         minetest.chat_send_player(name, "Invalid usage: " .. param, false)\r
943                         return\r
944                 end\r
945 \r
946                 --find the file in the world path\r
947                 local testpaths = {\r
948                         minetest.get_worldpath() .. "/schems/" .. param,\r
949                         minetest.get_worldpath() .. "/schems/" .. param .. ".we",\r
950                         minetest.get_worldpath() .. "/schems/" .. param .. ".wem",\r
951                 }\r
952                 local file, err\r
953                 for index, path in ipairs(testpaths) do\r
954                         file, err = io.open(path, "rb")\r
955                         if not err then\r
956                                 break\r
957                         end\r
958                 end\r
959                 if err then\r
960                         minetest.chat_send_player(name, "Could not open file \"" .. param .. "\"", false)\r
961                         return\r
962                 end\r
963                 local value = file:read("*a")\r
964                 file:close()\r
965 \r
966                 if worldedit.valueversion(value) == 0 then --unknown version\r
967                         minetest.chat_send_player(name, "Invalid file: file is invalid or created with newer version of WorldEdit", false)\r
968                         return\r
969                 end\r
970 \r
971                 local tenv = minetest.env\r
972                 if worldedit.ENABLE_QUEUE then\r
973                         tenv = worldedit.quene_aliasenv\r
974                 end\r
975                 local count = worldedit.deserialize(pos1, value, tenv)\r
976 \r
977                 minetest.chat_send_player(name, count .. " nodes loaded", false)\r
978         end,\r
979 })\r
980 \r
981 minetest.register_chatcommand("/lua", {\r
982         params = "<code>",\r
983         description = "Executes <code> as a Lua chunk in the global namespace",\r
984         privs = {worldedit=true, server=true},\r
985         func = function(name, param)\r
986                 local err = worldedit.lua(param)\r
987                 if err then\r
988                         minetest.chat_send_player(name, "Code error: " .. err, false)\r
989                 else\r
990                         minetest.chat_send_player(name, "Code successfully executed", false)\r
991                 end\r
992         end,\r
993 })\r
994 \r
995 minetest.register_chatcommand("/luatransform", {\r
996         params = "<code>",\r
997         description = "Executes <code> as a Lua chunk in the global namespace with the variable pos available, for each node in the current WorldEdit region",\r
998         privs = {worldedit=true, server=true},\r
999         func = function(name, param)\r
1000                 local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]\r
1001                 if pos1 == nil or pos2 == nil then\r
1002                         minetest.chat_send_player(name, "No WorldEdit region selected", false)\r
1003                         return\r
1004                 end\r
1005 \r
1006                 local err = worldedit.luatransform(pos1, pos2, param)\r
1007                 if err then\r
1008                         minetest.chat_send_player(name, "Code error: " .. err, false)\r
1009                 else\r
1010                         minetest.chat_send_player(name, "Code successfully executed", false)\r
1011                 end\r
1012         end,\r
1013 })\r