Rewrite command registration

This commit is contained in:
sfan5 2019-12-19 14:12:45 +01:00
parent 8feaf8a21d
commit 91d02f6f5b
4 changed files with 736 additions and 634 deletions

@ -1,28 +1,22 @@
minetest.register_chatcommand("/outset", { worldedit.register_command("outset", {
params = "[h|v] <amount>", params = "[h|v] <amount>",
description = "outset the selection", description = "Outset the selected region.",
privs = {worldedit=true}, privs = {worldedit=true},
func = function(name, param) require_pos = 2,
parse = function(param)
local find, _, dir, amount = param:find("(%a*)%s*([+-]?%d+)") local find, _, dir, amount = param:find("(%a*)%s*([+-]?%d+)")
if find == nil then if find == nil then
return false, "invalid usage: " .. param return false
end end
local pos1 = worldedit.pos1[name]
local pos2 = worldedit.pos2[name]
if pos1 == nil or pos2 == nil then
return false,
"Undefined region. Region must be defined beforehand."
end
local hv_test = dir:find("[^hv]+") local hv_test = dir:find("[^hv]+")
if hv_test ~= nil then if hv_test ~= nil then
return false, "Invalid direction." return false, "Invalid direction."
end end
return true, dir, tonumber(amount)
end,
func = function(name, dir, amount)
if dir == "" or dir == "hv" or dir == "vh" then if dir == "" or dir == "hv" or dir == "vh" then
assert(worldedit.cuboid_volumetric_expand(name, amount)) assert(worldedit.cuboid_volumetric_expand(name, amount))
elseif dir == "h" then elseif dir == "h" then
@ -36,39 +30,32 @@ minetest.register_chatcommand("/outset", {
else else
return false, "Invalid number of arguments" return false, "Invalid number of arguments"
end end
worldedit.marker_update(name) worldedit.marker_update(name)
return true, "Region outset by " .. amount .. " blocks" return true, "Region outset by " .. amount .. " blocks"
end, end,
} })
)
minetest.register_chatcommand("/inset", { worldedit.register_command("inset", {
params = "[h|v] <amount>", params = "[h|v] <amount>",
description = "inset the selection", description = "Inset the selected region.",
privs = {worldedit=true}, privs = {worldedit=true},
func = function(name, param) require_pos = 2,
parse = function(param)
local find, _, dir, amount = param:find("(%a*)%s*([+-]?%d+)") local find, _, dir, amount = param:find("(%a*)%s*([+-]?%d+)")
if find == nil then if find == nil then
return false, "invalid usage: " .. param return false
end end
local pos1 = worldedit.pos1[name]
local pos2 = worldedit.pos2[name]
if pos1 == nil or pos2 == nil then
return false,
"Undefined region. Region must be defined beforehand."
end
local hv_test = dir:find("[^hv]+") local hv_test = dir:find("[^hv]+")
if hv_test ~= nil then if hv_test ~= nil then
return false, "Invalid direction." return false, "Invalid direction."
end end
return true, dir, tonumber(amount)
end,
func = function(name, dir, amount)
if dir == "" or dir == "vh" or dir == "hv" then if dir == "" or dir == "vh" or dir == "hv" then
assert(worldedit.cuboid_volumetric_expand(name, -amount)) assert(worldedit.cuboid_volumetric_expand(name, -amount))
elseif dir == "h" then elseif dir == "h" then
@ -82,34 +69,27 @@ minetest.register_chatcommand("/inset", {
else else
return false, "Invalid number of arguments" return false, "Invalid number of arguments"
end end
worldedit.marker_update(name) worldedit.marker_update(name)
return true, "Region inset by " .. amount .. " blocks" return true, "Region inset by " .. amount .. " blocks"
end, end,
} })
)
minetest.register_chatcommand("/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 = "Moves the selection region. Does not move contents.", description = "Moves the selection region. Does not move contents.",
privs = {worldedit=true}, privs = {worldedit=true},
func = function(name, param) require_pos = 2,
local pos1 = worldedit.pos1[name] parse = function(param)
local pos2 = worldedit.pos2[name]
local find, _, direction, amount = param:find("([%?%l]+)%s*([+-]?%d+)") local find, _, direction, amount = param:find("([%?%l]+)%s*([+-]?%d+)")
if find == nil then if find == nil then
worldedit.player_notify(name, "invalid usage: " .. param) return false
return
end end
if pos1 == nil or pos2 == nil then return true, direction, tonumber(amount)
worldedit.player_notify(name, end,
"Undefined region. Region must be defined beforehand.") func = function(name, direction, amount)
return
end
local axis, dir local axis, dir
if direction == "x" or direction == "y" or direction == "z" then if direction == "x" or direction == "y" or direction == "z" then
axis, dir = direction, 1 axis, dir = direction, 1
@ -118,123 +98,112 @@ minetest.register_chatcommand("/shift", {
else else
axis, dir = worldedit.translate_direction(name, direction) axis, dir = worldedit.translate_direction(name, direction)
end end
if axis == nil or dir == nil then if axis == nil or dir == nil then
return false, "Invalid if looking straight up or down" return false, "Invalid if looking straight up or down"
end end
assert(worldedit.cuboid_shift(name, axis, amount * dir)) assert(worldedit.cuboid_shift(name, axis, amount * dir))
worldedit.marker_update(name) worldedit.marker_update(name)
return true, "Region shifted by " .. amount .. " nodes" return true, "Region shifted by " .. amount .. " nodes"
end, end,
} })
)
minetest.register_chatcommand("/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 = "expand the selection in one or two directions at once", description = "expand the selection in one or two directions at once",
privs = {worldedit=true}, privs = {worldedit=true},
func = function(name, param) require_pos = 2,
local find, _, sign, direction, amount, parse = function(param)
rev_amount = param:find("([+-]?)([%?%l]+)%s*(%d+)%s*(%d*)") local find, _, sign, direction, amount,
rev_amount = param:find("([+-]?)([%?%l]+)%s*(%d+)%s*(%d*)")
if find == nil then if find == nil then
worldedit.player_notify(name, "invalid use: " .. param) return false
return
end
if worldedit.pos1[name] == nil or worldedit.pos2[name] == nil then
worldedit.player_notify(name,
"Undefined region. Region must be defined beforehand.")
return
end
local absolute = direction:find("[xyz?]")
local dir, axis
if rev_amount == "" then
rev_amount = 0
end
if absolute == nil then
axis, dir = worldedit.translate_direction(name, direction)
if axis == nil or dir == nil then
return false, "Invalid if looking straight up or down"
end end
else
if direction == "?" then if rev_amount == "" then
axis, dir = worldedit.player_axis(name) rev_amount = "0"
end
return true, sign, direction, tonumber(amount), tonumber(rev_amount)
end,
func = function(name, sign, direction, amount, rev_amount)
local absolute = direction:find("[xyz?]")
local dir, axis
if absolute == nil then
axis, dir = worldedit.translate_direction(name, direction)
if axis == nil or dir == nil then
return false, "Invalid if looking straight up or down"
end
else else
axis = direction if direction == "?" then
dir = 1 axis, dir = worldedit.player_axis(name)
else
axis = direction
dir = 1
end
end end
end
if sign == "-" then
if sign == "-" then dir = -dir
dir = -dir end
end
worldedit.cuboid_linear_expand(name, axis, dir, amount)
worldedit.cuboid_linear_expand(name, axis, dir, amount) worldedit.cuboid_linear_expand(name, axis, -dir, rev_amount)
worldedit.cuboid_linear_expand(name, axis, -dir, rev_amount) worldedit.marker_update(name)
worldedit.marker_update(name) return true, "Region expanded by " .. (amount + rev_amount) .. " nodes"
return true, "Region expanded by " .. (amount + rev_amount) .. " nodes" end,
end, })
}
)
minetest.register_chatcommand("/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 = "contract the selection in one or two directions at once", description = "contract the selection in one or two directions at once",
privs = {worldedit=true}, privs = {worldedit=true},
func = function(name, param) require_pos = 2,
local find, _, sign, direction, amount, parse = function(param)
rev_amount = param:find("([+-]?)([%?%l]+)%s*(%d+)%s*(%d*)") local find, _, sign, direction, amount,
rev_amount = param:find("([+-]?)([%?%l]+)%s*(%d+)%s*(%d*)")
if find == nil then if find == nil then
worldedit.player_notify(name, "invalid use: " .. param) return false
return
end
if worldedit.pos1[name] == nil or worldedit.pos2[name] == nil then
worldedit.player_notify(name,
"Undefined region. Region must be defined beforehand.")
return
end
local absolute = direction:find("[xyz?]")
local dir, axis
if rev_amount == "" then
rev_amount = 0
end
if absolute == nil then
axis, dir = worldedit.translate_direction(name, direction)
if axis == nil or dir == nil then
return false, "Invalid if looking straight up or down"
end end
else
if direction == "?" then if rev_amount == "" then
axis, dir = worldedit.player_axis(name) rev_amount = "0"
end
return true, sign, direction, tonumber(amount), tonumber(rev_amount)
end,
func = function(name, sign, direction, amount, rev_amount)
local absolute = direction:find("[xyz?]")
local dir, axis
if absolute == nil then
axis, dir = worldedit.translate_direction(name, direction)
if axis == nil or dir == nil then
return false, "Invalid if looking straight up or down"
end
else else
axis = direction if direction == "?" then
dir = 1 axis, dir = worldedit.player_axis(name)
else
axis = direction
dir = 1
end
end end
end
if sign == "-" then
if sign == "-" then dir = -dir
dir = -dir end
end
worldedit.cuboid_linear_expand(name, axis, dir, -amount)
worldedit.cuboid_linear_expand(name, axis, dir, -amount) worldedit.cuboid_linear_expand(name, axis, -dir, -rev_amount)
worldedit.cuboid_linear_expand(name, axis, -dir, -rev_amount) worldedit.marker_update(name)
worldedit.marker_update(name) return true, "Region contracted by " .. (amount + rev_amount) .. " nodes"
return true, "Region contracted by " .. (amount + rev_amount) .. " nodes" end,
end, })
}
)

File diff suppressed because it is too large Load Diff

@ -1,53 +1,35 @@
local safe_region_callback = {} local safe_region_callback = {}
local safe_region_param = {}
worldedit._override_safe_regions = false -- internal use ONLY! worldedit._override_safe_regions = false -- internal use ONLY!
local function check_region(name, param) --`count` is the number of nodes that would possibly be modified
local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] --obtain positions
if pos1 == nil or pos2 == nil then
worldedit.player_notify(name, "no region selected")
return nil
end
return worldedit.volume(pos1, pos2)
end
--`callback` is a callback to run when the user confirms --`callback` is a callback to run when the user confirms
--`nodes_needed` is a function accepting `param`, `pos1`, and `pos2` to calculate the number of nodes needed local function safe_region(name, count, callback)
local function safe_region(callback, nodes_needed) if worldedit._override_safe_regions or count < 10000 then
--default node volume calculation return callback()
nodes_needed = nodes_needed or check_region
return function(name, param)
--check if the operation applies to a safe number of nodes
local count = nodes_needed(name, param)
if count == nil then return end --invalid command
if worldedit._override_safe_regions or count < 10000 then
return callback(name, param)
end
--save callback to call later
safe_region_callback[name], safe_region_param[name] = callback, param
worldedit.player_notify(name, "WARNING: this operation could affect up to " .. count .. " nodes; type //y to continue or //n to cancel")
end end
--save callback to call later
safe_region_callback[name] = callback
worldedit.player_notify(name, "WARNING: this operation could affect up to " .. count .. " nodes; type //y to continue or //n to cancel")
end end
local function reset_pending(name) local function reset_pending(name)
safe_region_callback[name], safe_region_param[name] = nil, nil safe_region_callback[name] = nil
end end
minetest.register_chatcommand("/y", { minetest.register_chatcommand("/y", {
params = "", params = "",
description = "Confirm a pending operation", description = "Confirm a pending operation",
func = function(name) func = function(name)
local callback, param = safe_region_callback[name], safe_region_param[name] local callback = safe_region_callback[name]
if not callback then if not callback then
worldedit.player_notify(name, "no operation pending") worldedit.player_notify(name, "no operation pending")
return return
end end
reset_pending(name) reset_pending(name)
callback(name, param) callback(name)
end, end,
}) })
@ -65,4 +47,4 @@ minetest.register_chatcommand("/n", {
}) })
return safe_region, check_region, reset_pending return safe_region, reset_pending

@ -25,7 +25,7 @@ minetest.register_tool(":worldedit:wand", {
local now = minetest.get_us_time() local now = minetest.get_us_time()
if now - (punched_air_time[name] or 0) < 1000 * 1000 then if now - (punched_air_time[name] or 0) < 1000 * 1000 then
-- reset markers -- reset markers
minetest.registered_chatcommands["/reset"].func(name, "") worldedit.registered_commands["reset"].func(name)
end end
punched_air_time[name] = now punched_air_time[name] = now
elseif pointed_thing.type == "object" then elseif pointed_thing.type == "object" then