Put commands into categories for //help

This commit is contained in:
sfan5 2024-04-21 22:43:36 +02:00
parent 75d101116d
commit 4b470bdae6
4 changed files with 108 additions and 10 deletions

@ -3,6 +3,7 @@ local S = minetest.get_translator("worldedit_commands")
worldedit.register_command("outset", { worldedit.register_command("outset", {
params = "[h/v] <amount>", params = "[h/v] <amount>",
description = S("Outset the selected region."), description = S("Outset the selected region."),
category = S("Region operations"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 2, require_pos = 2,
parse = function(param) parse = function(param)
@ -42,6 +43,7 @@ worldedit.register_command("outset", {
worldedit.register_command("inset", { worldedit.register_command("inset", {
params = "[h/v] <amount>", params = "[h/v] <amount>",
description = S("Inset the selected region."), description = S("Inset the selected region."),
category = S("Region operations"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 2, require_pos = 2,
parse = function(param) parse = function(param)
@ -79,6 +81,7 @@ worldedit.register_command("inset", {
worldedit.register_command("shift", { worldedit.register_command("shift", {
params = "x/y/z/?/up/down/left/right/front/back [+/-]<amount>", params = "x/y/z/?/up/down/left/right/front/back [+/-]<amount>",
description = S("Shifts the selection area without moving its contents"), description = S("Shifts the selection area without moving its contents"),
category = S("Region operations"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 2, require_pos = 2,
parse = function(param) parse = function(param)
@ -114,6 +117,7 @@ worldedit.register_command("shift", {
worldedit.register_command("expand", { worldedit.register_command("expand", {
params = "[+/-]x/y/z/?/up/down/left/right/front/back <amount> [reverse amount]", params = "[+/-]x/y/z/?/up/down/left/right/front/back <amount> [reverse amount]",
description = S("Expands the selection in the selected absolute or relative axis"), description = S("Expands the selection in the selected absolute or relative axis"),
category = S("Region operations"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 2, require_pos = 2,
parse = function(param) parse = function(param)
@ -163,6 +167,7 @@ worldedit.register_command("expand", {
worldedit.register_command("contract", { worldedit.register_command("contract", {
params = "[+/-]x/y/z/?/up/down/left/right/front/back <amount> [reverse amount]", params = "[+/-]x/y/z/?/up/down/left/right/front/back <amount> [reverse amount]",
description = S("Contracts the selection in the selected absolute or relative axis"), description = S("Contracts the selection in the selected absolute or relative axis"),
category = S("Region operations"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 2, require_pos = 2,
parse = function(param) parse = function(param)

@ -96,6 +96,7 @@ end
-- params = "", -- Human readable parameter list (optional) -- params = "", -- Human readable parameter list (optional)
-- -- if params = "" then a parse() implementation will automatically be provided -- -- if params = "" then a parse() implementation will automatically be provided
-- description = "", -- Description -- description = "", -- Description
-- category = "", -- Category of the command (optional)
-- require_pos = 0, -- Number of positions required to be set (optional) -- require_pos = 0, -- Number of positions required to be set (optional)
-- parse = function(param) -- parse = function(param)
-- return true, foo, bar, ... -- return true, foo, bar, ...
@ -116,6 +117,7 @@ function worldedit.register_command(name, def)
assert(name and #name > 0) assert(name and #name > 0)
def.name = name def.name = name
assert(def.privs) assert(def.privs)
def.category = def.category or ""
def.require_pos = def.require_pos or 0 def.require_pos = def.require_pos or 0
assert(def.require_pos >= 0 and def.require_pos < 3) assert(def.require_pos >= 0 and def.require_pos < 3)
if def.params == "" and not def.parse then if def.params == "" and not def.parse then
@ -317,11 +319,14 @@ worldedit.register_command("help", {
return true, param return true, param
end, end,
func = function(name, param) func = function(name, param)
local function format_help_line(cmd, def) local function format_help_line(cmd, def, follow_alias)
local msg = minetest.colorize("#00ffff", "//"..cmd) local msg = minetest.colorize("#00ffff", "//"..cmd)
if def.name ~= cmd then if def.name ~= cmd then
msg = msg .. ": " .. S("alias to @1", msg = msg .. ": " .. S("alias to @1",
minetest.colorize("#00ffff", "//"..def.name)) minetest.colorize("#00ffff", "//"..def.name))
if follow_alias then
msg = msg .. "\n" .. format_help_line(def.name, def)
end
else else
if def.params and def.params ~= "" then if def.params and def.params ~= "" then
msg = msg .. " " .. def.params msg = msg .. " " .. def.params
@ -332,38 +337,64 @@ worldedit.register_command("help", {
end end
return msg return msg
end end
-- @param cmds list of {cmd, def}
local function sort_cmds(cmds)
table.sort(cmds, function(c1, c2)
local cmd1, cmd2 = c1[1], c2[1]
local def1, def2 = c1[2], c2[2]
-- by category (this puts the empty category first)
if def1.category ~= def2.category then
return def1.category < def2.category
end
-- put aliases last
if (cmd1 ~= def1.name) ~= (cmd2 ~= def2.name) then
return cmd2 ~= def2.name
end
-- then by name
return c1[1] < c2[1]
end)
end
if not minetest.check_player_privs(name, "worldedit") then if not minetest.check_player_privs(name, "worldedit") then
return false, S("You are not allowed to use any WorldEdit commands.") return false, S("You are not allowed to use any WorldEdit commands.")
end end
if param == "" then if param == "" then
local cmds = {} local list = {}
for cmd, def in pairs(worldedit.registered_commands) do for cmd, def in pairs(worldedit.registered_commands) do
if minetest.check_player_privs(name, def.privs) then if minetest.check_player_privs(name, def.privs) then
cmds[#cmds + 1] = cmd list[#list + 1] = cmd
end end
end end
table.sort(cmds) table.sort(list)
local help = minetest.colorize("#00ffff", "//help") local help = minetest.colorize("#00ffff", "//help")
return true, S("Available commands: @1@n" return true, S("Available commands: @1@n"
.. "Use '@2' to get more information," .. "Use '@2' to get more information,"
.. " or '@3' to list everything.", .. " or '@3' to list everything.",
table.concat(cmds, " "), help .. " <cmd>", help .. " all") table.concat(list, " "), help .. " <cmd>", help .. " all")
elseif param == "all" then elseif param == "all" then
local cmds = {} local cmds = {}
for cmd, def in pairs(worldedit.registered_commands) do for cmd, def in pairs(worldedit.registered_commands) do
if minetest.check_player_privs(name, def.privs) then if minetest.check_player_privs(name, def.privs) then
cmds[#cmds + 1] = format_help_line(cmd, def) cmds[#cmds + 1] = {cmd, def}
end end
end end
table.sort(cmds) sort_cmds(cmds)
return true, S("Available commands:@n") .. table.concat(cmds, "\n") local list = {}
local last_cat = ""
for _, e in ipairs(cmds) do
if e[2].category ~= last_cat then
last_cat = e[2].category
list[#list + 1] = "---- " .. last_cat
end
list[#list + 1] = format_help_line(e[1], e[2])
end
return true, S("Available commands:@n") .. table.concat(list, "\n")
else else
local def = worldedit.registered_commands[param] local def = worldedit.registered_commands[param]
if not def then if not def then
return false, S("Command not available: ") .. param return false, S("Command not available: ") .. param
else else
return true, format_help_line(param, def) return true, format_help_line(param, def, true)
end end
end end
end, end,
@ -433,6 +464,7 @@ end)
worldedit.register_command("reset", { worldedit.register_command("reset", {
params = "", params = "",
description = S("Reset the region so that it is empty"), description = S("Reset the region so that it is empty"),
category = S("Region operations"),
privs = {worldedit=true}, privs = {worldedit=true},
func = function(name) func = function(name)
worldedit.pos1[name] = nil worldedit.pos1[name] = nil
@ -448,6 +480,7 @@ worldedit.register_command("reset", {
worldedit.register_command("mark", { worldedit.register_command("mark", {
params = "", params = "",
description = S("Show markers at the region positions"), description = S("Show markers at the region positions"),
category = S("Region operations"),
privs = {worldedit=true}, privs = {worldedit=true},
func = function(name) func = function(name)
worldedit.marker_update(name) worldedit.marker_update(name)
@ -458,6 +491,7 @@ worldedit.register_command("mark", {
worldedit.register_command("unmark", { worldedit.register_command("unmark", {
params = "", params = "",
description = S("Hide markers if currently shown"), description = S("Hide markers if currently shown"),
category = S("Region operations"),
privs = {worldedit=true}, privs = {worldedit=true},
func = function(name) func = function(name)
local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]
@ -473,6 +507,7 @@ worldedit.register_command("unmark", {
worldedit.register_command("pos1", { worldedit.register_command("pos1", {
params = "", params = "",
description = S("Set WorldEdit region position @1 to the player's location", 1), description = S("Set WorldEdit region position @1 to the player's location", 1),
category = S("Region operations"),
privs = {worldedit=true}, privs = {worldedit=true},
func = function(name) func = function(name)
local pos = minetest.get_player_by_name(name):get_pos() local pos = minetest.get_player_by_name(name):get_pos()
@ -486,6 +521,7 @@ worldedit.register_command("pos1", {
worldedit.register_command("pos2", { worldedit.register_command("pos2", {
params = "", params = "",
description = S("Set WorldEdit region position @1 to the player's location", 2), description = S("Set WorldEdit region position @1 to the player's location", 2),
category = S("Region operations"),
privs = {worldedit=true}, privs = {worldedit=true},
func = function(name) func = function(name)
local pos = minetest.get_player_by_name(name):get_pos() local pos = minetest.get_player_by_name(name):get_pos()
@ -499,6 +535,7 @@ worldedit.register_command("pos2", {
worldedit.register_command("p", { worldedit.register_command("p", {
params = "set/set1/set2/get", params = "set/set1/set2/get",
description = S("Set WorldEdit region, WorldEdit position 1, or WorldEdit position 2 by punching nodes, or display the current WorldEdit region"), description = S("Set WorldEdit region, WorldEdit position 1, or WorldEdit position 2 by punching nodes, or display the current WorldEdit region"),
category = S("Region operations"),
privs = {worldedit=true}, privs = {worldedit=true},
parse = function(param) parse = function(param)
if param == "set" or param == "set1" or param == "set2" or param == "get" then if param == "set" or param == "set1" or param == "set2" or param == "get" then
@ -534,6 +571,7 @@ worldedit.register_command("p", {
worldedit.register_command("fixedpos", { worldedit.register_command("fixedpos", {
params = "set1/set2 <x> <y> <z>", params = "set1/set2 <x> <y> <z>",
description = S("Set a WorldEdit region position to the position at (<x>, <y>, <z>)"), description = S("Set a WorldEdit region position to the position at (<x>, <y>, <z>)"),
category = S("Region operations"),
privs = {worldedit=true}, privs = {worldedit=true},
parse = function(param) parse = function(param)
local found, _, flag, x, y, z = param:find("^(set[12])%s+([+-]?%d+)%s+([+-]?%d+)%s+([+-]?%d+)$") local found, _, flag, x, y, z = param:find("^(set[12])%s+([+-]?%d+)%s+([+-]?%d+)%s+([+-]?%d+)$")
@ -583,6 +621,7 @@ end)
worldedit.register_command("volume", { worldedit.register_command("volume", {
params = "", params = "",
description = S("Display the volume of the current WorldEdit region"), description = S("Display the volume of the current WorldEdit region"),
category = S("Region operations"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 2, require_pos = 2,
func = function(name) func = function(name)
@ -603,6 +642,7 @@ worldedit.register_command("volume", {
worldedit.register_command("deleteblocks", { worldedit.register_command("deleteblocks", {
params = "", params = "",
description = S("Remove all MapBlocks (16x16x16) containing the selected area from the map"), description = S("Remove all MapBlocks (16x16x16) containing the selected area from the map"),
category = S("Node manipulation"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 2, require_pos = 2,
nodes_needed = check_region, nodes_needed = check_region,
@ -620,6 +660,7 @@ worldedit.register_command("deleteblocks", {
worldedit.register_command("set", { worldedit.register_command("set", {
params = "<node>", params = "<node>",
description = S("Set the current WorldEdit region to <node>"), description = S("Set the current WorldEdit region to <node>"),
category = S("Node manipulation"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 2, require_pos = 2,
parse = function(param) parse = function(param)
@ -639,6 +680,7 @@ worldedit.register_command("set", {
worldedit.register_command("param2", { worldedit.register_command("param2", {
params = "<param2>", params = "<param2>",
description = S("Set param2 of all nodes in the current WorldEdit region to <param2>"), description = S("Set param2 of all nodes in the current WorldEdit region to <param2>"),
category = S("Node manipulation"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 2, require_pos = 2,
parse = function(param) parse = function(param)
@ -660,6 +702,7 @@ worldedit.register_command("param2", {
worldedit.register_command("mix", { worldedit.register_command("mix", {
params = "<node1> [count1] <node2> [count2] ...", params = "<node1> [count1] <node2> [count2] ...",
description = S("Fill the current WorldEdit region with a random mix of <node1>, ..."), description = S("Fill the current WorldEdit region with a random mix of <node1>, ..."),
category = S("Node manipulation"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 2, require_pos = 2,
parse = function(param) parse = function(param)
@ -710,6 +753,7 @@ end
worldedit.register_command("replace", { worldedit.register_command("replace", {
params = "<search node> <replace node>", params = "<search node> <replace node>",
description = S("Replace all instances of <search node> with <replace node> in the current WorldEdit region"), description = S("Replace all instances of <search node> with <replace node> in the current WorldEdit region"),
category = S("Node manipulation"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 2, require_pos = 2,
parse = check_replace, parse = check_replace,
@ -724,6 +768,7 @@ worldedit.register_command("replace", {
worldedit.register_command("replaceinverse", { worldedit.register_command("replaceinverse", {
params = "<search node> <replace node>", params = "<search node> <replace node>",
description = S("Replace all nodes other than <search node> with <replace node> in the current WorldEdit region"), description = S("Replace all nodes other than <search node> with <replace node> in the current WorldEdit region"),
category = S("Node manipulation"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 2, require_pos = 2,
parse = check_replace, parse = check_replace,
@ -750,6 +795,7 @@ end
worldedit.register_command("hollowcube", { worldedit.register_command("hollowcube", {
params = "<width> <height> <length> <node>", params = "<width> <height> <length> <node>",
description = S("Add a hollow cube with its ground level centered at WorldEdit position 1 with dimensions <width> x <height> x <length>, composed of <node>."), description = S("Add a hollow cube with its ground level centered at WorldEdit position 1 with dimensions <width> x <height> x <length>, composed of <node>."),
category = S("Shapes"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 1, require_pos = 1,
parse = check_cube, parse = check_cube,
@ -765,6 +811,7 @@ worldedit.register_command("hollowcube", {
worldedit.register_command("cube", { worldedit.register_command("cube", {
params = "<width> <height> <length> <node>", params = "<width> <height> <length> <node>",
description = S("Add a cube with its ground level centered at WorldEdit position 1 with dimensions <width> x <height> x <length>, composed of <node>."), description = S("Add a cube with its ground level centered at WorldEdit position 1 with dimensions <width> x <height> x <length>, composed of <node>."),
category = S("Shapes"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 1, require_pos = 1,
parse = check_cube, parse = check_cube,
@ -792,6 +839,7 @@ end
worldedit.register_command("hollowsphere", { worldedit.register_command("hollowsphere", {
params = "<radius> <node>", params = "<radius> <node>",
description = S("Add hollow sphere centered at WorldEdit position 1 with radius <radius>, composed of <node>"), description = S("Add hollow sphere centered at WorldEdit position 1 with radius <radius>, composed of <node>"),
category = S("Shapes"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 1, require_pos = 1,
parse = check_sphere, parse = check_sphere,
@ -807,6 +855,7 @@ worldedit.register_command("hollowsphere", {
worldedit.register_command("sphere", { worldedit.register_command("sphere", {
params = "<radius> <node>", params = "<radius> <node>",
description = S("Add sphere centered at WorldEdit position 1 with radius <radius>, composed of <node>"), description = S("Add sphere centered at WorldEdit position 1 with radius <radius>, composed of <node>"),
category = S("Shapes"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 1, require_pos = 1,
parse = check_sphere, parse = check_sphere,
@ -834,6 +883,7 @@ end
worldedit.register_command("hollowdome", { worldedit.register_command("hollowdome", {
params = "<radius> <node>", params = "<radius> <node>",
description = S("Add hollow dome centered at WorldEdit position 1 with radius <radius>, composed of <node>"), description = S("Add hollow dome centered at WorldEdit position 1 with radius <radius>, composed of <node>"),
category = S("Shapes"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 1, require_pos = 1,
parse = check_dome, parse = check_dome,
@ -849,6 +899,7 @@ worldedit.register_command("hollowdome", {
worldedit.register_command("dome", { worldedit.register_command("dome", {
params = "<radius> <node>", params = "<radius> <node>",
description = S("Add dome centered at WorldEdit position 1 with radius <radius>, composed of <node>"), description = S("Add dome centered at WorldEdit position 1 with radius <radius>, composed of <node>"),
category = S("Shapes"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 1, require_pos = 1,
parse = check_dome, parse = check_dome,
@ -882,6 +933,7 @@ end
worldedit.register_command("hollowcylinder", { worldedit.register_command("hollowcylinder", {
params = "x/y/z/? <length> <radius1> [radius2] <node>", params = "x/y/z/? <length> <radius1> [radius2] <node>",
description = S("Add hollow cylinder at WorldEdit position 1 along the given axis with length <length>, base radius <radius1> (and top radius [radius2]), composed of <node>"), description = S("Add hollow cylinder at WorldEdit position 1 along the given axis with length <length>, base radius <radius1> (and top radius [radius2]), composed of <node>"),
category = S("Shapes"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 1, require_pos = 1,
parse = check_cylinder, parse = check_cylinder,
@ -903,6 +955,7 @@ worldedit.register_command("hollowcylinder", {
worldedit.register_command("cylinder", { worldedit.register_command("cylinder", {
params = "x/y/z/? <length> <radius1> [radius2] <node>", params = "x/y/z/? <length> <radius1> [radius2] <node>",
description = S("Add cylinder at WorldEdit position 1 along the given axis with length <length>, base radius <radius1> (and top radius [radius2]), composed of <node>"), description = S("Add cylinder at WorldEdit position 1 along the given axis with length <length>, base radius <radius1> (and top radius [radius2]), composed of <node>"),
category = S("Shapes"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 1, require_pos = 1,
parse = check_cylinder, parse = check_cylinder,
@ -936,6 +989,7 @@ end
worldedit.register_command("hollowpyramid", { worldedit.register_command("hollowpyramid", {
params = "x/y/z/? <height> <node>", params = "x/y/z/? <height> <node>",
description = S("Add hollow pyramid centered at WorldEdit position 1 along the given axis with height <height>, composed of <node>"), description = S("Add hollow pyramid centered at WorldEdit position 1 along the given axis with height <height>, composed of <node>"),
category = S("Shapes"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 1, require_pos = 1,
parse = check_pyramid, parse = check_pyramid,
@ -956,6 +1010,7 @@ worldedit.register_command("hollowpyramid", {
worldedit.register_command("pyramid", { worldedit.register_command("pyramid", {
params = "x/y/z/? <height> <node>", params = "x/y/z/? <height> <node>",
description = S("Add pyramid centered at WorldEdit position 1 along the given axis with height <height>, composed of <node>"), description = S("Add pyramid centered at WorldEdit position 1 along the given axis with height <height>, composed of <node>"),
category = S("Shapes"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 1, require_pos = 1,
parse = check_pyramid, parse = check_pyramid,
@ -976,6 +1031,7 @@ worldedit.register_command("pyramid", {
worldedit.register_command("spiral", { worldedit.register_command("spiral", {
params = "<length> <height> <space> <node>", params = "<length> <height> <space> <node>",
description = S("Add spiral centered at WorldEdit position 1 with side length <length>, height <height>, space between walls <space>, composed of <node>"), description = S("Add spiral centered at WorldEdit position 1 with side length <length>, height <height>, space between walls <space>, composed of <node>"),
category = S("Shapes"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 1, require_pos = 1,
parse = function(param) parse = function(param)
@ -1001,6 +1057,7 @@ worldedit.register_command("spiral", {
worldedit.register_command("copy", { worldedit.register_command("copy", {
params = "x/y/z/? <amount>", params = "x/y/z/? <amount>",
description = S("Copy the current WorldEdit region along the given axis by <amount> nodes"), description = S("Copy the current WorldEdit region along the given axis by <amount> nodes"),
category = S("Transformations"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 2, require_pos = 2,
parse = function(param) parse = function(param)
@ -1028,6 +1085,7 @@ worldedit.register_command("copy", {
worldedit.register_command("move", { worldedit.register_command("move", {
params = "x/y/z/? <amount>", params = "x/y/z/? <amount>",
description = S("Move the current WorldEdit region along the given axis by <amount> nodes"), description = S("Move the current WorldEdit region along the given axis by <amount> nodes"),
category = S("Transformations"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 2, require_pos = 2,
parse = function(param) parse = function(param)
@ -1060,6 +1118,7 @@ worldedit.register_command("move", {
worldedit.register_command("stack", { worldedit.register_command("stack", {
params = "x/y/z/? <count>", params = "x/y/z/? <count>",
description = S("Stack the current WorldEdit region along the given axis <count> times"), description = S("Stack the current WorldEdit region along the given axis <count> times"),
category = S("Transformations"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 2, require_pos = 2,
parse = function(param) parse = function(param)
@ -1090,6 +1149,7 @@ worldedit.register_command("stack", {
worldedit.register_command("stack2", { worldedit.register_command("stack2", {
params = "<count> <x> <y> <z>", params = "<count> <x> <y> <z>",
description = S("Stack the current WorldEdit region <count> times by offset <x>, <y>, <z>"), description = S("Stack the current WorldEdit region <count> times by offset <x>, <y>, <z>"),
category = S("Transformations"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 2, require_pos = 2,
parse = function(param) parse = function(param)
@ -1120,6 +1180,7 @@ worldedit.register_command("stack2", {
worldedit.register_command("stretch", { worldedit.register_command("stretch", {
params = "<stretchx> <stretchy> <stretchz>", params = "<stretchx> <stretchy> <stretchz>",
description = S("Scale the current WorldEdit positions and region by a factor of <stretchx>, <stretchy>, <stretchz> along the X, Y, and Z axes, repectively, with position 1 as the origin"), description = S("Scale the current WorldEdit positions and region by a factor of <stretchx>, <stretchy>, <stretchz> along the X, Y, and Z axes, repectively, with position 1 as the origin"),
category = S("Transformations"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 2, require_pos = 2,
parse = function(param) parse = function(param)
@ -1152,6 +1213,7 @@ worldedit.register_command("stretch", {
worldedit.register_command("transpose", { worldedit.register_command("transpose", {
params = "x/y/z/? x/y/z/?", params = "x/y/z/? x/y/z/?",
description = S("Transpose the current WorldEdit region along the given axes"), description = S("Transpose the current WorldEdit region along the given axes"),
category = S("Transformations"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 2, require_pos = 2,
parse = function(param) parse = function(param)
@ -1182,6 +1244,7 @@ worldedit.register_command("transpose", {
worldedit.register_command("flip", { worldedit.register_command("flip", {
params = "x/y/z/?", params = "x/y/z/?",
description = S("Flip the current WorldEdit region along the given axis"), description = S("Flip the current WorldEdit region along the given axis"),
category = S("Transformations"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 2, require_pos = 2,
parse = function(param) parse = function(param)
@ -1201,6 +1264,7 @@ worldedit.register_command("flip", {
worldedit.register_command("rotate", { worldedit.register_command("rotate", {
params = "x/y/z/? <angle>", params = "x/y/z/? <angle>",
description = S("Rotate the current WorldEdit region around the given axis by angle <angle> (90 degree increment)"), description = S("Rotate the current WorldEdit region around the given axis by angle <angle> (90 degree increment)"),
category = S("Transformations"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 2, require_pos = 2,
parse = function(param) parse = function(param)
@ -1232,6 +1296,7 @@ worldedit.register_command("rotate", {
worldedit.register_command("orient", { worldedit.register_command("orient", {
params = "<angle>", params = "<angle>",
description = S("Rotate oriented nodes in the current WorldEdit region around the Y axis by angle <angle> (90 degree increment)"), description = S("Rotate oriented nodes in the current WorldEdit region around the Y axis by angle <angle> (90 degree increment)"),
category = S("Transformations"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 2, require_pos = 2,
parse = function(param) parse = function(param)
@ -1255,6 +1320,7 @@ worldedit.register_command("orient", {
worldedit.register_command("fixlight", { worldedit.register_command("fixlight", {
params = "", params = "",
description = S("Fix the lighting in the current WorldEdit region"), description = S("Fix the lighting in the current WorldEdit region"),
category = S("Node manipulation"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 2, require_pos = 2,
nodes_needed = check_region, nodes_needed = check_region,
@ -1267,6 +1333,7 @@ worldedit.register_command("fixlight", {
worldedit.register_command("drain", { worldedit.register_command("drain", {
params = "", params = "",
description = S("Remove any fluid node within the current WorldEdit region"), description = S("Remove any fluid node within the current WorldEdit region"),
category = S("Node manipulation"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 2, require_pos = 2,
nodes_needed = check_region, nodes_needed = check_region,
@ -1365,6 +1432,7 @@ end
worldedit.register_command("clearcut", { worldedit.register_command("clearcut", {
params = "", params = "",
description = S("Remove any plant, tree or foliage-like nodes in the selected region"), description = S("Remove any plant, tree or foliage-like nodes in the selected region"),
category = S("Node manipulation"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 2, require_pos = 2,
nodes_needed = check_region, nodes_needed = check_region,
@ -1378,6 +1446,7 @@ worldedit.register_command("clearcut", {
worldedit.register_command("hide", { worldedit.register_command("hide", {
params = "", params = "",
description = S("Hide all nodes in the current WorldEdit region non-destructively"), description = S("Hide all nodes in the current WorldEdit region non-destructively"),
category = S("Node manipulation"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 2, require_pos = 2,
nodes_needed = check_region, nodes_needed = check_region,
@ -1390,6 +1459,7 @@ worldedit.register_command("hide", {
worldedit.register_command("suppress", { worldedit.register_command("suppress", {
params = "<node>", params = "<node>",
description = S("Suppress all <node> in the current WorldEdit region non-destructively"), description = S("Suppress all <node> in the current WorldEdit region non-destructively"),
category = S("Node manipulation"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 2, require_pos = 2,
parse = function(param) parse = function(param)
@ -1409,6 +1479,7 @@ worldedit.register_command("suppress", {
worldedit.register_command("highlight", { worldedit.register_command("highlight", {
params = "<node>", params = "<node>",
description = S("Highlight <node> in the current WorldEdit region by hiding everything else non-destructively"), description = S("Highlight <node> in the current WorldEdit region by hiding everything else non-destructively"),
category = S("Node manipulation"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 2, require_pos = 2,
parse = function(param) parse = function(param)
@ -1428,6 +1499,7 @@ worldedit.register_command("highlight", {
worldedit.register_command("restore", { worldedit.register_command("restore", {
params = "", params = "",
description = S("Restores nodes hidden with WorldEdit in the current WorldEdit region"), description = S("Restores nodes hidden with WorldEdit in the current WorldEdit region"),
category = S("Node manipulation"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 2, require_pos = 2,
nodes_needed = check_region, nodes_needed = check_region,
@ -1441,7 +1513,7 @@ local function detect_misaligned_schematic(name, pos1, pos2)
pos1 = worldedit.sort_pos(pos1, pos2) pos1 = worldedit.sort_pos(pos1, pos2)
-- Check that allocate/save can position the schematic correctly -- Check that allocate/save can position the schematic correctly
-- The expected behaviour is that the (0,0,0) corner of the schematic stays -- The expected behaviour is that the (0,0,0) corner of the schematic stays
-- sat pos1, this only works when the minimum position is actually present -- at pos1, this only works when the minimum position is actually present
-- in the schematic. -- in the schematic.
local node = minetest.get_node(pos1) local node = minetest.get_node(pos1)
local have_node_at_origin = node.name ~= "air" and node.name ~= "ignore" local have_node_at_origin = node.name ~= "air" and node.name ~= "ignore"
@ -1457,6 +1529,7 @@ end
worldedit.register_command("save", { worldedit.register_command("save", {
params = "<file>", params = "<file>",
description = S("Save the current WorldEdit region to \"(world folder)/schems/<file>.we\""), description = S("Save the current WorldEdit region to \"(world folder)/schems/<file>.we\""),
category = S("Schematics"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 2, require_pos = 2,
parse = function(param) parse = function(param)
@ -1495,6 +1568,7 @@ worldedit.register_command("save", {
worldedit.register_command("allocate", { worldedit.register_command("allocate", {
params = "<file>", params = "<file>",
description = S("Set the region defined by nodes from \"(world folder)/schems/<file>.we\" as the current WorldEdit region"), description = S("Set the region defined by nodes from \"(world folder)/schems/<file>.we\" as the current WorldEdit region"),
category = S("Schematics"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 1, require_pos = 1,
parse = function(param) parse = function(param)
@ -1531,6 +1605,7 @@ worldedit.register_command("allocate", {
worldedit.register_command("load", { worldedit.register_command("load", {
params = "<file>", params = "<file>",
description = S("Load nodes from \"(world folder)/schems/<file>[.we[m]]\" with position 1 of the current WorldEdit region as the origin"), description = S("Load nodes from \"(world folder)/schems/<file>[.we[m]]\" with position 1 of the current WorldEdit region as the origin"),
category = S("Schematics"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 1, require_pos = 1,
parse = function(param) parse = function(param)
@ -1562,6 +1637,7 @@ worldedit.register_command("load", {
worldedit.register_command("lua", { worldedit.register_command("lua", {
params = "<code>", params = "<code>",
description = S("Executes <code> as a Lua chunk in the global namespace"), description = S("Executes <code> as a Lua chunk in the global namespace"),
category = S("Code"),
privs = {worldedit=true, server=true}, privs = {worldedit=true, server=true},
parse = function(param) parse = function(param)
if param == "" then if param == "" then
@ -1592,6 +1668,7 @@ worldedit.register_command("lua", {
worldedit.register_command("luatransform", { worldedit.register_command("luatransform", {
params = "<code>", params = "<code>",
description = S("Executes <code> as a Lua chunk in the global namespace with the variable pos available, for each node in the current WorldEdit region"), description = S("Executes <code> as a Lua chunk in the global namespace with the variable pos available, for each node in the current WorldEdit region"),
category = S("Code"),
privs = {worldedit=true, server=true}, privs = {worldedit=true, server=true},
require_pos = 2, require_pos = 2,
parse = function(param) parse = function(param)
@ -1614,6 +1691,7 @@ worldedit.register_command("mtschemcreate", {
params = "<file>", params = "<file>",
description = S("Save the current WorldEdit region using the Minetest ".. description = S("Save the current WorldEdit region using the Minetest "..
"Schematic format to \"(world folder)/schems/<filename>.mts\""), "Schematic format to \"(world folder)/schems/<filename>.mts\""),
category = S("Schematics"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 2, require_pos = 2,
parse = function(param) parse = function(param)
@ -1647,6 +1725,7 @@ worldedit.register_command("mtschemcreate", {
worldedit.register_command("mtschemplace", { worldedit.register_command("mtschemplace", {
params = "<file>", params = "<file>",
description = S("Load nodes from \"(world folder)/schems/<file>.mts\" with position 1 of the current WorldEdit region as the origin"), description = S("Load nodes from \"(world folder)/schems/<file>.mts\" with position 1 of the current WorldEdit region as the origin"),
category = S("Schematics"),
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 1, require_pos = 1,
parse = function(param) parse = function(param)
@ -1673,6 +1752,7 @@ worldedit.register_command("mtschemplace", {
worldedit.register_command("mtschemprob", { worldedit.register_command("mtschemprob", {
params = "start/finish/get", params = "start/finish/get",
description = S("Begins node probability entry for Minetest schematics, gets the nodes that have probabilities set, or ends node probability entry"), description = S("Begins node probability entry for Minetest schematics, gets the nodes that have probabilities set, or ends node probability entry"),
category = S("Schematics"),
privs = {worldedit=true}, privs = {worldedit=true},
parse = function(param) parse = function(param)
if param ~= "start" and param ~= "finish" and param ~= "get" then if param ~= "start" and param ~= "finish" and param ~= "get" then
@ -1723,6 +1803,7 @@ end)
worldedit.register_command("clearobjects", { worldedit.register_command("clearobjects", {
params = "", params = "",
description = S("Clears all objects within the WorldEdit region"), description = S("Clears all objects within the WorldEdit region"),
category = S("Node manipulation"), -- not really, but it doesn't fit anywhere else
privs = {worldedit=true}, privs = {worldedit=true},
require_pos = 2, require_pos = 2,
nodes_needed = check_region, nodes_needed = check_region,

@ -15,6 +15,7 @@ Region contracted by @1 nodes=
Select a cube with side length <size> around position 1 and run <command> on region= Select a cube with side length <size> around position 1 and run <command> on region=
invalid usage: @1 cannot be used with cubeapply= invalid usage: @1 cannot be used with cubeapply=
Missing privileges: @1= Missing privileges: @1=
Region operations=
Can use WorldEdit commands= Can use WorldEdit commands=
no region selected= no region selected=
no position 1 selected= no position 1 selected=
@ -53,6 +54,7 @@ Set a WorldEdit region position to the position at (<x>, <y>, <z>)=
Display the volume of the current WorldEdit region= Display the volume of the current WorldEdit region=
current region has a volume of @1 nodes (@2*@3*@4)= current region has a volume of @1 nodes (@2*@3*@4)=
Remove all MapBlocks (16x16x16) containing the selected area from the map= Remove all MapBlocks (16x16x16) containing the selected area from the map=
Node manipulation=
Area deleted.= Area deleted.=
There was an error during deletion of the area.= There was an error during deletion of the area.=
Set the current WorldEdit region to <node>= Set the current WorldEdit region to <node>=
@ -68,6 +70,7 @@ Replace all instances of <search node> with <replace node> in the current WorldE
@1 nodes replaced= @1 nodes replaced=
Replace all nodes other than <search node> with <replace node> in the current WorldEdit region= Replace all nodes other than <search node> with <replace node> in the current WorldEdit region=
Add a hollow cube with its ground level centered at WorldEdit position 1 with dimensions <width> x <height> x <length>, composed of <node>.= Add a hollow cube with its ground level centered at WorldEdit position 1 with dimensions <width> x <height> x <length>, composed of <node>.=
Shapes=
@1 nodes added= @1 nodes added=
Add a cube with its ground level centered at WorldEdit position 1 with dimensions <width> x <height> x <length>, composed of <node>.= Add a cube with its ground level centered at WorldEdit position 1 with dimensions <width> x <height> x <length>, composed of <node>.=
Add hollow sphere centered at WorldEdit position 1 with radius <radius>, composed of <node>= Add hollow sphere centered at WorldEdit position 1 with radius <radius>, composed of <node>=
@ -80,6 +83,7 @@ Add hollow pyramid centered at WorldEdit position 1 along the given axis with he
Add pyramid centered at WorldEdit position 1 along the given axis with height <height>, composed of <node>= Add pyramid centered at WorldEdit position 1 along the given axis with height <height>, composed of <node>=
Add spiral centered at WorldEdit position 1 with side length <length>, height <height>, space between walls <space>, composed of <node>= Add spiral centered at WorldEdit position 1 with side length <length>, height <height>, space between walls <space>, composed of <node>=
Copy the current WorldEdit region along the given axis by <amount> nodes= Copy the current WorldEdit region along the given axis by <amount> nodes=
Transformations=
@1 nodes copied= @1 nodes copied=
Move the current WorldEdit region along the given axis by <amount> nodes= Move the current WorldEdit region along the given axis by <amount> nodes=
@1 nodes moved= @1 nodes moved=
@ -116,6 +120,7 @@ Restores nodes hidden with WorldEdit in the current WorldEdit region=
@1 nodes restored= @1 nodes restored=
Warning: The schematic contains excessive free space and WILL be misaligned when allocated or loaded. To avoid this, shrink your area to cover exactly the nodes to be saved.= Warning: The schematic contains excessive free space and WILL be misaligned when allocated or loaded. To avoid this, shrink your area to cover exactly the nodes to be saved.=
Save the current WorldEdit region to "(world folder)/schems/<file>.we"= Save the current WorldEdit region to "(world folder)/schems/<file>.we"=
Schematics=
Disallowed file name: @1= Disallowed file name: @1=
Could not save file to "@1"= Could not save file to "@1"=
@1 nodes saved= @1 nodes saved=
@ -126,6 +131,7 @@ Load nodes from "(world folder)/schems/<file>[.we[m]]" with position 1 of the cu
Loading failed!= Loading failed!=
@1 nodes loaded= @1 nodes loaded=
Executes <code> as a Lua chunk in the global namespace= Executes <code> as a Lua chunk in the global namespace=
Code=
Executes <code> as a Lua chunk in the global namespace with the variable pos available, for each node in the current WorldEdit region= Executes <code> as a Lua chunk in the global namespace with the variable pos available, for each node in the current WorldEdit region=
Save the current WorldEdit region using the Minetest Schematic format to "(world folder)/schems/<filename>.mts"= Save the current WorldEdit region using the Minetest Schematic format to "(world folder)/schems/<filename>.mts"=
Failed to create Minetest schematic= Failed to create Minetest schematic=

@ -26,6 +26,7 @@ Region contracted by @1 nodes=Gebiet um @1 Blöcke geschrumpft
Select a cube with side length <size> around position 1 and run <command> on region=Wähle einen Würfel mit Seitenlänge <size> um Position 1 und führe <command> auf diesem Gebiet aus Select a cube with side length <size> around position 1 and run <command> on region=Wähle einen Würfel mit Seitenlänge <size> um Position 1 und führe <command> auf diesem Gebiet aus
invalid usage: @1 cannot be used with cubeapply=Ungültige Verwendung: @1 kann nicht mit cubeapply verwendet werden invalid usage: @1 cannot be used with cubeapply=Ungültige Verwendung: @1 kann nicht mit cubeapply verwendet werden
Missing privileges: @1=Fehlende Privilegien: @1 Missing privileges: @1=Fehlende Privilegien: @1
Region operations=Gebietsoperationen
Can use WorldEdit commands=Kann WorldEdit-Befehle benutzen Can use WorldEdit commands=Kann WorldEdit-Befehle benutzen
no region selected=Kein Gebiet ausgewählt no region selected=Kein Gebiet ausgewählt
no position 1 selected=Keine Position 1 ausgewählt no position 1 selected=Keine Position 1 ausgewählt
@ -64,6 +65,7 @@ Set a WorldEdit region position to the position at (<x>, <y>, <z>)=Position des
Display the volume of the current WorldEdit region=Volumen des aktuellen WorldEdit-Gebiets anzeigen Display the volume of the current WorldEdit region=Volumen des aktuellen WorldEdit-Gebiets anzeigen
current region has a volume of @1 nodes (@2*@3*@4)=Das aktuelle Gebiet hat ein Volumen von @1 Blöcken (@2*@3*@4) current region has a volume of @1 nodes (@2*@3*@4)=Das aktuelle Gebiet hat ein Volumen von @1 Blöcken (@2*@3*@4)
Remove all MapBlocks (16x16x16) containing the selected area from the map=Alle Kartenblöcke (16x16x16) entfernen, die das Gebiet enthalten. Remove all MapBlocks (16x16x16) containing the selected area from the map=Alle Kartenblöcke (16x16x16) entfernen, die das Gebiet enthalten.
Node manipulation=Block-Manipulation
Area deleted.=Gebiet gelöscht. Area deleted.=Gebiet gelöscht.
There was an error during deletion of the area.=Während des Löschens des Gebiets trat ein Fehler aus. There was an error during deletion of the area.=Während des Löschens des Gebiets trat ein Fehler aus.
Set the current WorldEdit region to <node>=Das aktuelle WorldEdit-Gebiet mit <node> füllen Set the current WorldEdit region to <node>=Das aktuelle WorldEdit-Gebiet mit <node> füllen
@ -79,6 +81,7 @@ Replace all instances of <search node> with <replace node> in the current WorldE
@1 nodes replaced=@1 Blöcke ersetzt @1 nodes replaced=@1 Blöcke ersetzt
Replace all nodes other than <search node> with <replace node> in the current WorldEdit region=Alle Blöcke außer <search node> im aktuellen WorldEdit-Gebiet mit <replace node> ersetzen. Replace all nodes other than <search node> with <replace node> in the current WorldEdit region=Alle Blöcke außer <search node> im aktuellen WorldEdit-Gebiet mit <replace node> ersetzen.
Add a hollow cube with its ground level centered at WorldEdit position 1 with dimensions <width> x <height> x <length>, composed of <node>.= Add a hollow cube with its ground level centered at WorldEdit position 1 with dimensions <width> x <height> x <length>, composed of <node>.=
Shapes=Formen
@1 nodes added=@1 Blöcke hinzugefügt @1 nodes added=@1 Blöcke hinzugefügt
Add a cube with its ground level centered at WorldEdit position 1 with dimensions <width> x <height> x <length>, composed of <node>.= Add a cube with its ground level centered at WorldEdit position 1 with dimensions <width> x <height> x <length>, composed of <node>.=
Add hollow sphere centered at WorldEdit position 1 with radius <radius>, composed of <node>= Add hollow sphere centered at WorldEdit position 1 with radius <radius>, composed of <node>=
@ -91,6 +94,7 @@ Add hollow pyramid centered at WorldEdit position 1 along the given axis with he
Add pyramid centered at WorldEdit position 1 along the given axis with height <height>, composed of <node>= Add pyramid centered at WorldEdit position 1 along the given axis with height <height>, composed of <node>=
Add spiral centered at WorldEdit position 1 with side length <length>, height <height>, space between walls <space>, composed of <node>= Add spiral centered at WorldEdit position 1 with side length <length>, height <height>, space between walls <space>, composed of <node>=
Copy the current WorldEdit region along the given axis by <amount> nodes=Das aktuelle WorldEdit-Gebiet entlang der gegebenen Achse um <amount> Blöcke kopieren Copy the current WorldEdit region along the given axis by <amount> nodes=Das aktuelle WorldEdit-Gebiet entlang der gegebenen Achse um <amount> Blöcke kopieren
Transformations=Transformationen
@1 nodes copied=@1 Blöcke kopiert @1 nodes copied=@1 Blöcke kopiert
Move the current WorldEdit region along the given axis by <amount> nodes=Das aktuelle WorldEdit-Gebiet entlang der gegebenen Achse um <amount> Blöcke verschieben Move the current WorldEdit region along the given axis by <amount> nodes=Das aktuelle WorldEdit-Gebiet entlang der gegebenen Achse um <amount> Blöcke verschieben
@1 nodes moved=@1 Blöcke verschoben @1 nodes moved=@1 Blöcke verschoben
@ -127,6 +131,7 @@ Restores nodes hidden with WorldEdit in the current WorldEdit region=Versteckte
@1 nodes restored=@1 Blöcke wiederhergestellt @1 nodes restored=@1 Blöcke wiederhergestellt
Warning: The schematic contains excessive free space and WILL be misaligned when allocated or loaded. To avoid this, shrink your area to cover exactly the nodes to be saved.=Warnung: Das Schematic hat überschüssigen freien Platz und WIRD nach dem Laden falsch ausgerichtet sein. Um dies zu vermeiden, verkleinern Sie das Gebiet sodass es die zu speichernden Blöcke exakt umfasst. Warning: The schematic contains excessive free space and WILL be misaligned when allocated or loaded. To avoid this, shrink your area to cover exactly the nodes to be saved.=Warnung: Das Schematic hat überschüssigen freien Platz und WIRD nach dem Laden falsch ausgerichtet sein. Um dies zu vermeiden, verkleinern Sie das Gebiet sodass es die zu speichernden Blöcke exakt umfasst.
Save the current WorldEdit region to "(world folder)/schems/<file>.we"=Das aktuelle WorldEdit-Gebiet in "(Weltordner)/schems/<file>.we" speichern Save the current WorldEdit region to "(world folder)/schems/<file>.we"=Das aktuelle WorldEdit-Gebiet in "(Weltordner)/schems/<file>.we" speichern
Schematics=Schematic
Disallowed file name: @1=Nicht erlaubter Dateiname: @1 Disallowed file name: @1=Nicht erlaubter Dateiname: @1
Could not save file to "@1"=Konnte die Datei nicht unter "@1" speichern Could not save file to "@1"=Konnte die Datei nicht unter "@1" speichern
@1 nodes saved=@1 Blöcke gespeichert @1 nodes saved=@1 Blöcke gespeichert
@ -137,6 +142,7 @@ Load nodes from "(world folder)/schems/<file>[.we[m]]" with position 1 of the cu
Loading failed!=Laden fehlgeschlagen! Loading failed!=Laden fehlgeschlagen!
@1 nodes loaded=@1 Blöcke geladen @1 nodes loaded=@1 Blöcke geladen
Executes <code> as a Lua chunk in the global namespace= Executes <code> as a Lua chunk in the global namespace=
Code=Code
Executes <code> as a Lua chunk in the global namespace with the variable pos available, for each node in the current WorldEdit region= Executes <code> as a Lua chunk in the global namespace with the variable pos available, for each node in the current WorldEdit region=
Save the current WorldEdit region using the Minetest Schematic format to "(world folder)/schems/<filename>.mts"=Das aktuelle WorldEdit-Gebiet als Minetest-Schematic in "(Weltordner)/schems/<filename>.mts" speichern Save the current WorldEdit region using the Minetest Schematic format to "(world folder)/schems/<filename>.mts"=Das aktuelle WorldEdit-Gebiet als Minetest-Schematic in "(Weltordner)/schems/<filename>.mts" speichern
Failed to create Minetest schematic=Konnte Minetest-Schematic nicht erstellen Failed to create Minetest schematic=Konnte Minetest-Schematic nicht erstellen