]> git.lizzy.rs Git - worldedit.git/blob - worldedit_commands/init.lua
1fb59d3b65a0772415204cd485613e599eb55546
[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                 minetest.chat_send_player(name, "WorldEdit region reset")\r
40         end,\r
41 })\r
42 \r
43 minetest.register_chatcommand("/mark", {\r
44         params = "",\r
45         description = "Show markers at the region positions",\r
46         privs = {worldedit=true},\r
47         func = function(name, param)\r
48                 worldedit.mark_pos1(name)\r
49                 worldedit.mark_pos2(name)\r
50                 minetest.chat_send_player(name, "WorldEdit region marked")\r
51         end,\r
52 })\r
53 \r
54 minetest.register_chatcommand("/pos1", {\r
55         params = "",\r
56         description = "Set WorldEdit region position 1 to the player's location",\r
57         privs = {worldedit=true},\r
58         func = function(name, param)\r
59                 local pos = minetest.env:get_player_by_name(name):getpos()\r
60                 pos.x, pos.y, pos.z = math.floor(pos.x), math.floor(pos.y), math.floor(pos.z)\r
61                 worldedit.pos1[name] = pos\r
62                 worldedit.mark_pos1(name)\r
63                 minetest.chat_send_player(name, "WorldEdit position 1 set to " .. minetest.pos_to_string(pos))\r
64         end,\r
65 })\r
66 \r
67 minetest.register_chatcommand("/pos2", {\r
68         params = "",\r
69         description = "Set WorldEdit region position 2 to the player's location",\r
70         privs = {worldedit=true},\r
71         func = function(name, param)\r
72                 local pos = minetest.env:get_player_by_name(name):getpos()\r
73                 pos.x, pos.y, pos.z = math.floor(pos.x), math.floor(pos.y), math.floor(pos.z)\r
74                 worldedit.pos2[name] = pos\r
75                 worldedit.mark_pos2(name)\r
76                 minetest.chat_send_player(name, "WorldEdit position 2 set to " .. minetest.pos_to_string(pos))\r
77         end,\r
78 })\r
79 \r
80 minetest.register_chatcommand("/p", {\r
81         params = "set/set1/set2/get",\r
82         description = "Set WorldEdit region, WorldEdit position 1, or WorldEdit position 2 by punching nodes, or display the current WorldEdit region",\r
83         privs = {worldedit=true},\r
84         func = function(name, param)\r
85                 if param == "set" then --set both WorldEdit positions\r
86                         worldedit.set_pos[name] = "pos1"\r
87                         minetest.chat_send_player(name, "Select positions by punching two nodes")\r
88                 elseif param == "set1" then --set WorldEdit position 1\r
89                         worldedit.set_pos[name] = "pos1only"\r
90                         minetest.chat_send_player(name, "Select position 1 by punching a node")\r
91                 elseif param == "set2" then --set WorldEdit position 2\r
92                         worldedit.set_pos[name] = "pos2"\r
93                         minetest.chat_send_player(name, "Select position 2 by punching a node")\r
94                 elseif param == "get" then --display current WorldEdit positions\r
95                         if worldedit.pos1[name] ~= nil then\r
96                                 minetest.chat_send_player(name, "WorldEdit position 1: " .. minetest.pos_to_string(worldedit.pos1[name]))\r
97                         else\r
98                                 minetest.chat_send_player(name, "WorldEdit position 1 not set")\r
99                         end\r
100                         if worldedit.pos2[name] ~= nil then\r
101                                 minetest.chat_send_player(name, "WorldEdit position 2: " .. minetest.pos_to_string(worldedit.pos2[name]))\r
102                         else\r
103                                 minetest.chat_send_player(name, "WorldEdit position 2 not set")\r
104                         end\r
105                 else\r
106                         minetest.chat_send_player(name, "Unknown subcommand: " .. param)\r
107                 end\r
108         end,\r
109 })\r
110 \r
111 minetest.register_on_punchnode(function(pos, node, puncher)\r
112         local name = puncher:get_player_name()\r
113         if name ~= "" and worldedit.set_pos[name] ~= nil then --currently setting position\r
114                 if worldedit.set_pos[name] == "pos1" then --setting position 1\r
115                         worldedit.pos1[name] = pos\r
116                         worldedit.mark_pos1(name)\r
117                         worldedit.set_pos[name] = "pos2" --set position 2 on the next invocation\r
118                         minetest.chat_send_player(name, "WorldEdit region position 1 set to " .. minetest.pos_to_string(pos))\r
119                 elseif worldedit.set_pos[name] == "pos1only" then --setting position 1 only\r
120                         worldedit.pos1[name] = pos\r
121                         worldedit.mark_pos1(name)\r
122                         worldedit.set_pos[name] = nil --finished setting positions\r
123                         minetest.chat_send_player(name, "WorldEdit region position 1 set to " .. minetest.pos_to_string(pos))\r
124                 elseif worldedit.set_pos[name] == "pos2" then --setting position 2\r
125                         worldedit.pos2[name] = pos\r
126                         worldedit.mark_pos2(name)\r
127                         worldedit.set_pos[name] = nil --finished setting positions\r
128                         minetest.chat_send_player(name, "WorldEdit region position 2 set to " .. minetest.pos_to_string(pos))\r
129                 end\r
130         end\r
131 end)\r
132 \r
133 minetest.register_chatcommand("/volume", {\r
134         params = "",\r
135         description = "Display the volume of the current WorldEdit region",\r
136         privs = {worldedit=true},\r
137         func = function(name, param)\r
138                 local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]\r
139                 if pos1 == nil or pos2 == nil then\r
140                         minetest.chat_send_player(name, "No WorldEdit region selected")\r
141                         return\r
142                 end\r
143 \r
144                 local volume = worldedit.volume(pos1, pos2)\r
145                 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 .. ")")\r
146         end,\r
147 })\r
148 \r
149 minetest.register_chatcommand("/set", {\r
150         params = "<node>",\r
151         description = "Set the current WorldEdit region to <node>",\r
152         privs = {worldedit=true},\r
153         func = function(name, param)\r
154                 local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]\r
155                 if pos1 == nil or pos2 == nil then\r
156                         minetest.chat_send_player(name, "No WorldEdit region selected")\r
157                         return\r
158                 end\r
159 \r
160                 if param == "" or not worldedit.node_is_valid(param) then\r
161                         minetest.chat_send_player(name, "Invalid node name: " .. param)\r
162                         return\r
163                 end\r
164 \r
165                 local count = worldedit.set(pos1, pos2, param)\r
166                 minetest.chat_send_player(name, count .. " nodes set")\r
167         end,\r
168 })\r
169 \r
170 minetest.register_chatcommand("/replace", {\r
171         params = "<search node> <replace node>",\r
172         description = "Replace all instances of <search node> with <place node> in the current WorldEdit region",\r
173         privs = {worldedit=true},\r
174         func = function(name, param)\r
175                 local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]\r
176                 if pos1 == nil or pos2 == nil then\r
177                         minetest.chat_send_player(name, "No WorldEdit region selected")\r
178                         return\r
179                 end\r
180 \r
181                 local found, _, searchnode, replacenode = param:find("^([^%s]+)%s+([^%s]+)$")\r
182                 if found == nil then\r
183                         minetest.chat_send_player(name, "Invalid usage: " .. param)\r
184                         return\r
185                 end\r
186                 if not worldedit.node_is_valid(searchnode) then\r
187                         minetest.chat_send_player(name, "Invalid search node name: " .. searchnode)\r
188                         return\r
189                 end\r
190                 if not worldedit.node_is_valid(replacenode) then\r
191                         minetest.chat_send_player(name, "Invalid replace node name: " .. replacenode)\r
192                         return\r
193                 end\r
194 \r
195                 local count = worldedit.replace(pos1, pos2, searchnode, replacenode)\r
196                 minetest.chat_send_player(name, count .. " nodes replaced")\r
197         end,\r
198 })\r
199 \r
200 minetest.register_chatcommand("/hollowsphere", {\r
201         params = "<radius> <node>",\r
202         description = "Add hollow sphere at WorldEdit position 1 with radius <radius>, composed of <node>",\r
203         privs = {worldedit=true},\r
204         func = function(name, param)\r
205                 local pos = worldedit.pos1[name]\r
206                 if pos == nil then\r
207                         minetest.chat_send_player(name, "No WorldEdit region selected")\r
208                         return\r
209                 end\r
210 \r
211                 local found, _, radius, nodename = param:find("^(%d+)%s+([^%s]+)$")\r
212                 if found == nil then\r
213                         minetest.chat_send_player(name, "Invalid usage: " .. param)\r
214                         return\r
215                 end\r
216                 if not worldedit.node_is_valid(nodename) then\r
217                         minetest.chat_send_player(name, "Invalid node name: " .. param)\r
218                         return\r
219                 end\r
220 \r
221                 local count = worldedit.hollow_sphere(pos, tonumber(radius), nodename)\r
222                 minetest.chat_send_player(name, count .. " nodes added")\r
223         end,\r
224 })\r
225 \r
226 minetest.register_chatcommand("/sphere", {\r
227         params = "<radius> <node>",\r
228         description = "Add sphere at WorldEdit position 1 with radius <radius>, composed of <node>",\r
229         privs = {worldedit=true},\r
230         func = function(name, param)\r
231                 local pos = worldedit.pos1[name]\r
232                 if pos == nil then\r
233                         minetest.chat_send_player(name, "No WorldEdit region selected")\r
234                         return\r
235                 end\r
236 \r
237                 local found, _, radius, nodename = param:find("^(%d+)%s+([^%s]+)$")\r
238                 if found == nil then\r
239                         minetest.chat_send_player(name, "Invalid usage: " .. param)\r
240                         return\r
241                 end\r
242                 if not worldedit.node_is_valid(nodename) then\r
243                         minetest.chat_send_player(name, "Invalid node name: " .. param)\r
244                         return\r
245                 end\r
246 \r
247                 local count = worldedit.sphere(pos, tonumber(radius), nodename)\r
248                 minetest.chat_send_player(name, count .. " nodes added")\r
249         end,\r
250 })\r
251 \r
252 minetest.register_chatcommand("/hollowcylinder", {\r
253         params = "x/y/z/? <length> <radius> <node>",\r
254         description = "Add hollow cylinder at WorldEdit position 1 along the x/y/z/? axis with length <length> and radius <radius>, composed of <node>",\r
255         privs = {worldedit=true},\r
256         func = function(name, param)\r
257                 local pos = worldedit.pos1[name]\r
258                 if pos == nil then\r
259                         minetest.chat_send_player(name, "No WorldEdit region selected")\r
260                         return\r
261                 end\r
262 \r
263                 local found, _, axis, length, radius, nodename = param:find("^([xyz%?])%s+([+-]?%d+)%s+(%d+)%s+([^%s]+)$")\r
264                 if found == nil then\r
265                         minetest.chat_send_player(name, "Invalid usage: " .. param)\r
266                         return\r
267                 end\r
268                 if axis == "?" then\r
269                         axis, sign = worldedit.player_axis(name)\r
270                         length = length * sign\r
271                 end\r
272                 if not worldedit.node_is_valid(nodename) then\r
273                         minetest.chat_send_player(name, "Invalid node name: " .. param)\r
274                         return\r
275                 end\r
276 \r
277                 local count = worldedit.hollow_cylinder(pos, axis, tonumber(length), tonumber(radius), nodename)\r
278                 minetest.chat_send_player(name, count .. " nodes added")\r
279         end,\r
280 })\r
281 \r
282 minetest.register_chatcommand("/cylinder", {\r
283         params = "x/y/z/? <length> <radius> <node>",\r
284         description = "Add cylinder at WorldEdit position 1 along the x/y/z/? axis with length <length> and radius <radius>, composed of <node>",\r
285         privs = {worldedit=true},\r
286         func = function(name, param)\r
287                 local pos = worldedit.pos1[name]\r
288                 if pos == nil then\r
289                         minetest.chat_send_player(name, "No WorldEdit region selected")\r
290                         return\r
291                 end\r
292 \r
293                 local found, _, axis, length, radius, nodename = param:find("^([xyz%?])%s+([+-]?%d+)%s+(%d+)%s+([^%s]+)$")\r
294                 if found == nil then\r
295                         minetest.chat_send_player(name, "Invalid usage: " .. param)\r
296                         return\r
297                 end\r
298                 if axis == "?" then\r
299                         axis, sign = worldedit.player_axis(name)\r
300                         length = length * sign\r
301                 end\r
302                 if not worldedit.node_is_valid(nodename) then\r
303                         minetest.chat_send_player(name, "Invalid node name: " .. param)\r
304                         return\r
305                 end\r
306 \r
307                 local count = worldedit.cylinder(pos, axis, tonumber(length), tonumber(radius), nodename)\r
308                 minetest.chat_send_player(name, count .. " nodes added")\r
309         end,\r
310 })\r
311 \r
312 minetest.register_chatcommand("/pyramid", {\r
313         params = "<height> <node>",\r
314         description = "Add pyramid at WorldEdit position 1 with height <height>, composed of <node>",\r
315         privs = {worldedit=true},\r
316         func = function(name, param)\r
317                 local pos = worldedit.pos1[name]\r
318                 if pos == nil then\r
319                         minetest.chat_send_player(name, "No WorldEdit region selected")\r
320                         return\r
321                 end\r
322 \r
323                 local found, _, size, nodename = param:find("(%d+)%s+([^%s]+)$")\r
324                 if found == nil then\r
325                         minetest.chat_send_player(name, "Invalid usage: " .. param)\r
326                         return\r
327                 end\r
328                 if not worldedit.node_is_valid(nodename) then\r
329                         minetest.chat_send_player(name, "Invalid node name: " .. param)\r
330                         return\r
331                 end\r
332 \r
333                 local count = worldedit.pyramid(pos, tonumber(size), nodename)\r
334                 minetest.chat_send_player(name, count .. " nodes added")\r
335         end,\r
336 })\r
337 \r
338 minetest.register_chatcommand("/spiral", {\r
339         params = "<width> <height> <space> <node>",\r
340         description = "Add spiral at WorldEdit position 1 with width <width>, height <height>, space between walls <space>, composed of <node>",\r
341         privs = {worldedit=true},\r
342         func = function(name, param)\r
343                 local pos = worldedit.pos1[name]\r
344                 if pos == nil then\r
345                         minetest.chat_send_player(name, "No WorldEdit region selected")\r
346                         return\r
347                 end\r
348 \r
349                 local found, _, width, height, space, nodename = param:find("(%d+)%s+(%d+)%s+(%d+)%s+([^%s]+)$")\r
350                 if found == nil then\r
351                         minetest.chat_send_player(name, "Invalid usage: " .. param)\r
352                         return\r
353                 end\r
354                 if not worldedit.node_is_valid(nodename) then\r
355                         minetest.chat_send_player(name, "Invalid node name: " .. param)\r
356                         return\r
357                 end\r
358 \r
359                 local count = worldedit.spiral(pos, tonumber(width), tonumber(height), tonumber(space), nodename)\r
360                 minetest.chat_send_player(name, count .. " nodes changed")\r
361         end,\r
362 })\r
363 \r
364 minetest.register_chatcommand("/copy", {\r
365         params = "x/y/z/? <amount>",\r
366         description = "Copy the current WorldEdit region along the x/y/z/? axis by <amount> nodes",\r
367         privs = {worldedit=true},\r
368         func = function(name, param)\r
369                 local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]\r
370                 if pos1 == nil or pos2 == nil then\r
371                         minetest.chat_send_player(name, "No WorldEdit region selected")\r
372                         return\r
373                 end\r
374 \r
375                 local found, _, axis, amount = param:find("^([xyz%?])%s+([+-]?%d+)$")\r
376                 if found == nil then\r
377                         minetest.chat_send_player(name, "Invalid usage: " .. param)\r
378                         return\r
379                 end\r
380                 if axis == "?" then\r
381                         axis, sign = worldedit.player_axis(name)\r
382                         amount = amount * sign\r
383                 end\r
384 \r
385                 local count = worldedit.copy(pos1, pos2, axis, tonumber(amount))\r
386                 minetest.chat_send_player(name, count .. " nodes copied")\r
387         end,\r
388 })\r
389 \r
390 minetest.register_chatcommand("/move", {\r
391         params = "x/y/z/? <amount>",\r
392         description = "Move the current WorldEdit region along the x/y/z/? axis by <amount> nodes",\r
393         privs = {worldedit=true},\r
394         func = function(name, param)\r
395                 local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]\r
396                 if pos1 == nil or pos2 == nil then\r
397                         minetest.chat_send_player(name, "No WorldEdit region selected")\r
398                         return\r
399                 end\r
400 \r
401                 local found, _, axis, amount = param:find("^([xyz%?])%s+([+-]?%d+)$")\r
402                 if found == nil then\r
403                         minetest.chat_send_player(name, "Invalid usage: " .. param)\r
404                         return\r
405                 end\r
406                 if axis == "?" then\r
407                         axis, sign = worldedit.player_axis(name)\r
408                         amount = amount * sign\r
409                 end\r
410 \r
411                 local count = worldedit.move(pos1, pos2, axis, tonumber(amount))\r
412 \r
413                 pos1[axis] = pos1[axis] + amount\r
414                 pos2[axis] = pos2[axis] + amount\r
415                 worldedit.mark_pos1(name)\r
416                 worldedit.mark_pos2(name)\r
417 \r
418                 minetest.chat_send_player(name, count .. " nodes moved")\r
419         end,\r
420 })\r
421 \r
422 minetest.register_chatcommand("/stack", {\r
423         params = "x/y/z/? <count>",\r
424         description = "Stack the current WorldEdit region along the x/y/z/? axis <count> times",\r
425         privs = {worldedit=true},\r
426         func = function(name, param)\r
427                 local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]\r
428                 if pos1 == nil or pos2 == nil then\r
429                         minetest.chat_send_player(name, "No WorldEdit region selected")\r
430                         return\r
431                 end\r
432 \r
433                 local found, _, axis, count = param:find("^([xyz%?])%s+([+-]?%d+)$")\r
434                 if found == nil then\r
435                         minetest.chat_send_player(name, "Invalid usage: " .. param)\r
436                         return\r
437                 end\r
438                 if axis == "?" then\r
439                         axis, sign = worldedit.player_axis(name)\r
440                         count = count * sign\r
441                 end\r
442 \r
443                 local count = worldedit.stack(pos1, pos2, axis, tonumber(count))\r
444                 minetest.chat_send_player(name, count .. " nodes stacked")\r
445         end,\r
446 })\r
447 \r
448 minetest.register_chatcommand("/transpose", {\r
449         params = "x/y/z/? x/y/z/?",\r
450         description = "Transpose the current WorldEdit region along the x/y/z/? and x/y/z/? axes",\r
451         privs = {worldedit=true},\r
452         func = function(name, param)\r
453                 local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]\r
454                 if pos1 == nil or pos2 == nil then\r
455                         minetest.chat_send_player(name, "No WorldEdit region selected")\r
456                         return\r
457                 end\r
458 \r
459                 local found, _, axis1, axis2 = param:find("^([xyz%?])%s+([xyz%?])$")\r
460                 if found == nil then\r
461                         minetest.chat_send_player(name, "Invalid usage: " .. param)\r
462                         return\r
463                 end\r
464                 if axis1 == "?" then\r
465                         axis1 = worldedit.player_axis(name)\r
466                 end\r
467                 if axis2 == "?" then\r
468                         axis2 = worldedit.player_axis(name)\r
469                 end\r
470                 if axis1 == axis2 then\r
471                         minetest.chat_send_player(name, "Invalid usage: axes are the same")\r
472                         return\r
473                 end\r
474 \r
475                 local count = worldedit.transpose(pos1, pos2, axis1, axis2)\r
476                 minetest.chat_send_player(name, count .. " nodes transposed")\r
477         end,\r
478 })\r
479 \r
480 minetest.register_chatcommand("/flip", {\r
481         params = "x/y/z/?",\r
482         description = "Flip the current WorldEdit region along the x/y/z/? axis",\r
483         privs = {worldedit=true},\r
484         func = function(name, param)\r
485                 local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]\r
486                 if pos1 == nil or pos2 == nil then\r
487                         minetest.chat_send_player(name, "No WorldEdit region selected")\r
488                         return\r
489                 end\r
490 \r
491                 if param == "?" then\r
492                         param = worldedit.player_axis(name)\r
493                 end\r
494                 if param ~= "x" and param ~= "y" and param ~= "z" then\r
495                         minetest.chat_send_player(name, "Invalid usage: " .. param)\r
496                         return\r
497                 end\r
498 \r
499                 local count = worldedit.flip(pos1, pos2, param)\r
500                 minetest.chat_send_player(name, count .. " nodes flipped")\r
501         end,\r
502 })\r
503 \r
504 minetest.register_chatcommand("/rotate", {\r
505         params = "<axis> <angle>",\r
506         description = "Rotate the current WorldEdit region around the axis <axis> by angle <angle> (90 degree increment)",\r
507         privs = {worldedit=true},\r
508         func = function(name, param)\r
509                 local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]\r
510                 if pos1 == nil or pos2 == nil then\r
511                         minetest.chat_send_player(name, "No WorldEdit region selected")\r
512                         return\r
513                 end\r
514 \r
515                 local found, _, axis, angle = param:find("^([xyz%?])%s+([+-]?%d+)$")\r
516                 if found == nil then\r
517                         minetest.chat_send_player(name, "Invalid usage: " .. param)\r
518                         return\r
519                 end\r
520                 if axis == "?" then\r
521                         axis = worldedit.player_axis(name)\r
522                 end\r
523                 if angle % 90 ~= 0 then\r
524                         minetest.chat_send_player(name, "Invalid usage: angle must be multiple of 90")\r
525                         return\r
526                 end\r
527 \r
528                 local count = worldedit.rotate(pos1, pos2, axis, angle)\r
529                 minetest.chat_send_player(name, count .. " nodes rotated")\r
530         end,\r
531 })\r
532 \r
533 minetest.register_chatcommand("/dig", {\r
534         params = "",\r
535         description = "Dig the current WorldEdit region",\r
536         privs = {worldedit=true},\r
537         func = function(name, param)\r
538                 local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]\r
539                 if pos1 == nil or pos2 == nil then\r
540                         minetest.chat_send_player(name, "No WorldEdit region selected")\r
541                         return\r
542                 end\r
543 \r
544                 local count = worldedit.dig(pos1, pos2)\r
545                 minetest.chat_send_player(name, count .. " nodes dug")\r
546         end,\r
547 })\r
548 \r
549 minetest.register_chatcommand("/hide", {\r
550         params = "<node>",\r
551         description = "Hide all <node> in the current WorldEdit region non-destructively",\r
552         privs = {worldedit=true},\r
553         func = function(name, param)\r
554                 local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]\r
555                 if pos1 == nil or pos2 == nil then\r
556                         minetest.chat_send_player(name, "No WorldEdit region selected")\r
557                         return\r
558                 end\r
559 \r
560                 if param == "" or not worldedit.node_is_valid(param) then\r
561                         minetest.chat_send_player(name, "Invalid node name: " .. param)\r
562                         return\r
563                 end\r
564 \r
565                 local count = worldedit.hide(pos1, pos2, param)\r
566                 minetest.chat_send_player(name, count .. " nodes hidden")\r
567         end,\r
568 })\r
569 \r
570 minetest.register_chatcommand("/find", {\r
571         params = "<node>",\r
572         description = "Find <node> in the current WorldEdit region by hiding everything else non-destructively",\r
573         privs = {worldedit=true},\r
574         func = function(name, param)\r
575                 local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]\r
576                 if pos1 == nil or pos2 == nil then\r
577                         minetest.chat_send_player(name, "No WorldEdit region selected")\r
578                         return\r
579                 end\r
580 \r
581                 if param == "" or not worldedit.node_is_valid(param) then\r
582                         minetest.chat_send_player(name, "Invalid node name: " .. param)\r
583                         return\r
584                 end\r
585 \r
586                 local count = worldedit.find(pos1, pos2, param)\r
587                 minetest.chat_send_player(name, count .. " nodes found")\r
588         end,\r
589 })\r
590 \r
591 minetest.register_chatcommand("/restore", {\r
592         params = "",\r
593         description = "Restores nodes hidden with WorldEdit in the current WorldEdit region",\r
594         privs = {worldedit=true},\r
595         func = function(name, param)\r
596                 local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]\r
597                 if pos1 == nil or pos2 == nil then\r
598                         minetest.chat_send_player(name, "No WorldEdit region selected")\r
599                         return\r
600                 end\r
601 \r
602                 local count = worldedit.restore(pos1, pos2)\r
603                 minetest.chat_send_player(name, count .. " nodes restored")\r
604         end,\r
605 })\r
606 \r
607 minetest.register_chatcommand("/save", {\r
608         params = "<file>",\r
609         description = "Save the current WorldEdit region to \"(world folder)/schems/<file>.we\"",\r
610         privs = {worldedit=true},\r
611         func = function(name, param)\r
612                 local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]\r
613                 if pos1 == nil or pos2 == nil then\r
614                         minetest.chat_send_player(name, "No WorldEdit region selected")\r
615                         return\r
616                 end\r
617 \r
618                 if param == "" then\r
619                         minetest.chat_send_player(name, "Invalid usage: " .. param)\r
620                         return\r
621                 end\r
622 \r
623                 local result, count = worldedit.serialize(pos1, pos2)\r
624 \r
625                 local path = minetest.get_worldpath() .. "/schems"\r
626                 local filename = path .. "/" .. param .. ".we"\r
627                 os.execute("mkdir \"" .. path .. "\"") --create directory if it does not already exist\r
628                 local file, err = io.open(filename, "wb")\r
629                 if err ~= nil then\r
630                         minetest.chat_send_player(name, "Could not save file to \"" .. filename .. "\"")\r
631                         return\r
632                 end\r
633                 file:write(result)\r
634                 file:flush()\r
635                 file:close()\r
636 \r
637                 minetest.chat_send_player(name, count .. " nodes saved")\r
638         end,\r
639 })\r
640 \r
641 minetest.register_chatcommand("/load", {\r
642         params = "<file>",\r
643         description = "Load nodes from \"(world folder)/schems/<file>.we\" with position 1 of the current WorldEdit region as the origin",\r
644         privs = {worldedit=true},\r
645         func = function(name, param)\r
646                 local pos1 = worldedit.pos1[name]\r
647                 if pos1 == nil then\r
648                         minetest.chat_send_player(name, "No WorldEdit region selected")\r
649                         return\r
650                 end\r
651 \r
652                 if param == "" then\r
653                         minetest.chat_send_player(name, "Invalid usage: " .. param)\r
654                         return\r
655                 end\r
656 \r
657                 local filename = minetest.get_worldpath() .. "/schems/" .. param .. ".we"\r
658                 local file, err = io.open(filename, "rb")\r
659                 if err ~= nil then\r
660                         minetest.chat_send_player(name, "Could not open file \"" .. filename .. "\"")\r
661                         return\r
662                 end\r
663                 local value = file:read("*a")\r
664                 file:close()\r
665 \r
666                 local count\r
667                 if value:find("{") then --old WorldEdit format\r
668                         count = worldedit.deserialize_old(pos1, value)\r
669                 else --new WorldEdit format\r
670                         count = worldedit.deserialize(pos1, value)\r
671                 end\r
672 \r
673                 minetest.chat_send_player(name, count .. " nodes loaded")\r
674         end,\r
675 })\r
676 \r
677 minetest.register_chatcommand("/metasave", {\r
678         params = "<file>",\r
679         description = "Save the current WorldEdit region to \"(world folder)/schems/<file>.wem\"",\r
680         privs = {worldedit=true},\r
681         func = function(name, param)\r
682                 local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]\r
683                 if pos1 == nil or pos2 == nil then\r
684                         minetest.chat_send_player(name, "No WorldEdit region selected")\r
685                         return\r
686                 end\r
687                 if param == "" then\r
688                         minetest.chat_send_player(name, "Invalid usage: " .. param)\r
689                         return\r
690                 end\r
691                 local count, err = worldedit.metasave(pos1, pos2, param)\r
692                 if err then\r
693                         minetest.chat_send_player(name, "error loading file: " .. err)\r
694                 else\r
695                         minetest.chat_send_player(name, count .. " nodes saved")\r
696                 end\r
697         end,\r
698 })\r
699 \r
700 minetest.register_chatcommand("/metaload", {\r
701         params = "<file>",\r
702         description = "Load nodes from \"(world folder)/schems/<file>.wem\" with position 1 of the current WorldEdit region as the origin",\r
703         privs = {worldedit=true},\r
704         func = function(name, param)\r
705                 local pos1 = worldedit.pos1[name]\r
706                 if pos1 == nil then\r
707                         minetest.chat_send_player(name, "No WorldEdit region selected")\r
708                         return\r
709                 end\r
710                 if param == "" then\r
711                         minetest.chat_send_player(name, "Invalid usage: " .. param)\r
712                         return\r
713                 end\r
714                 local count, err = worldedit.metaload(pos1, param)\r
715                 if err then\r
716                         minetest.chat_send_player(name, "error loading file: " .. err)\r
717                 else\r
718                         minetest.chat_send_player(name, count .. " nodes loaded")\r
719                 end\r
720         end,\r
721 })\r