mirror of
https://github.com/Uberi/Minetest-WorldEdit.git
synced 2025-10-16 07:35:27 +02:00
Genericize relative direction handling
This commit is contained in:
@@ -1,3 +1,6 @@
|
|||||||
|
-- FIXME: worldedit.pos1/2 is a concept of worldedit_commands only, so these functions here
|
||||||
|
-- are actually misplaced.
|
||||||
|
|
||||||
-- Expands or contracts the cuboid in all axes by amount (positive or negative)
|
-- Expands or contracts the cuboid in all axes by amount (positive or negative)
|
||||||
worldedit.cuboid_volumetric_expand = function(name, amount)
|
worldedit.cuboid_volumetric_expand = function(name, amount)
|
||||||
local pos1 = worldedit.pos1[name]
|
local pos1 = worldedit.pos1[name]
|
||||||
@@ -186,61 +189,3 @@ worldedit.marker_get_closest_to_axis = function(name, axis, direction)
|
|||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
-- Translates up, down, left, right, front, back to their corresponding axes and
|
|
||||||
-- directions according to faced direction
|
|
||||||
worldedit.translate_direction = function(name, direction)
|
|
||||||
local axis, dir = worldedit.player_axis(name)
|
|
||||||
local resaxis, resdir
|
|
||||||
|
|
||||||
if direction == "up" then
|
|
||||||
return 'y', 1
|
|
||||||
end
|
|
||||||
|
|
||||||
if direction == "down" then
|
|
||||||
return 'y', -1
|
|
||||||
end
|
|
||||||
|
|
||||||
if direction == "front" then
|
|
||||||
if axis == "y" then
|
|
||||||
resaxis = nil
|
|
||||||
resdir = nil
|
|
||||||
else
|
|
||||||
resaxis = axis
|
|
||||||
resdir = dir
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if direction == "back" then
|
|
||||||
if axis == "y" then
|
|
||||||
resaxis = nil
|
|
||||||
resdir = nil
|
|
||||||
else
|
|
||||||
resaxis = axis
|
|
||||||
resdir = -dir
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if direction == "left" then
|
|
||||||
if axis == 'x' then
|
|
||||||
resaxis = 'z'
|
|
||||||
resdir = dir
|
|
||||||
elseif axis == 'z' then
|
|
||||||
resaxis = 'x'
|
|
||||||
resdir = -dir
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if direction == "right" then
|
|
||||||
if axis == 'x' then
|
|
||||||
resaxis = 'z'
|
|
||||||
resdir = -dir
|
|
||||||
elseif axis == 'z' then
|
|
||||||
resaxis = 'x'
|
|
||||||
resdir = dir
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return resaxis, resdir
|
|
||||||
end
|
|
||||||
|
@@ -1,5 +1,7 @@
|
|||||||
local S = minetest.get_translator("worldedit_commands")
|
local S = minetest.get_translator("worldedit_commands")
|
||||||
|
|
||||||
|
local VALID_DIR = worldedit.valid_directions
|
||||||
|
|
||||||
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."),
|
||||||
@@ -7,7 +9,7 @@ worldedit.register_command("outset", {
|
|||||||
privs = {worldedit=true},
|
privs = {worldedit=true},
|
||||||
require_pos = 2,
|
require_pos = 2,
|
||||||
parse = function(param)
|
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
|
return false
|
||||||
end
|
end
|
||||||
@@ -47,7 +49,7 @@ worldedit.register_command("inset", {
|
|||||||
privs = {worldedit=true},
|
privs = {worldedit=true},
|
||||||
require_pos = 2,
|
require_pos = 2,
|
||||||
parse = function(param)
|
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
|
return false
|
||||||
end
|
end
|
||||||
@@ -79,29 +81,21 @@ worldedit.register_command("inset", {
|
|||||||
|
|
||||||
|
|
||||||
worldedit.register_command("shift", {
|
worldedit.register_command("shift", {
|
||||||
params = "x/y/z/?/up/down/left/right/front/back [+/-]<amount>",
|
params = tostring(VALID_DIR) .. " [+/-]<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"),
|
category = S("Region operations"),
|
||||||
privs = {worldedit=true},
|
privs = {worldedit=true},
|
||||||
require_pos = 2,
|
require_pos = 2,
|
||||||
parse = function(param)
|
parse = function(param)
|
||||||
local find, _, direction, amount = param:find("([%?%l]+)%s*([+-]?%d+)")
|
local find, _, direction, amount = param:find("^([^%s]+)%s+([+-]?%d+)$")
|
||||||
if find == nil then
|
if find == nil or not VALID_DIR[direction] then
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
return true, direction, tonumber(amount)
|
return true, direction, tonumber(amount)
|
||||||
end,
|
end,
|
||||||
func = function(name, direction, amount)
|
func = function(name, direction, amount)
|
||||||
local axis, dir
|
local axis, dir = worldedit.player_direction(name, direction)
|
||||||
if direction == "x" or direction == "y" or direction == "z" then
|
|
||||||
axis, dir = direction, 1
|
|
||||||
elseif direction == "?" then
|
|
||||||
axis, dir = worldedit.player_axis(name)
|
|
||||||
else
|
|
||||||
axis, dir = worldedit.translate_direction(name, direction)
|
|
||||||
end
|
|
||||||
|
|
||||||
if axis == nil or dir == nil then
|
if axis == nil or dir == nil then
|
||||||
return false, S("Invalid if looking straight up or down")
|
return false, S("Invalid if looking straight up or down")
|
||||||
end
|
end
|
||||||
@@ -115,15 +109,15 @@ 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 = "[+/-]" .. tostring(VALID_DIR) .. " <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"),
|
category = S("Region operations"),
|
||||||
privs = {worldedit=true},
|
privs = {worldedit=true},
|
||||||
require_pos = 2,
|
require_pos = 2,
|
||||||
parse = function(param)
|
parse = function(param)
|
||||||
local find, _, sign, direction, amount,
|
local find, _, sign, direction, amount,
|
||||||
rev_amount = param:find("([+-]?)([%?%l]+)%s*(%d+)%s*(%d*)")
|
rev_amount = param:find("^([+-]?)([^%s]+)%s+(%d+)%s*(%d*)$")
|
||||||
if find == nil then
|
if find == nil or not VALID_DIR[direction] then
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -134,24 +128,10 @@ worldedit.register_command("expand", {
|
|||||||
return true, sign, direction, tonumber(amount), tonumber(rev_amount)
|
return true, sign, direction, tonumber(amount), tonumber(rev_amount)
|
||||||
end,
|
end,
|
||||||
func = function(name, sign, direction, amount, rev_amount)
|
func = function(name, sign, direction, amount, rev_amount)
|
||||||
local absolute = direction:find("[xyz?]")
|
local axis, dir = worldedit.player_direction(name, direction)
|
||||||
local dir, axis
|
if axis == nil or dir == nil then
|
||||||
|
return false, S("Invalid if looking straight up or down")
|
||||||
if absolute == nil then
|
|
||||||
axis, dir = worldedit.translate_direction(name, direction)
|
|
||||||
|
|
||||||
if axis == nil or dir == nil then
|
|
||||||
return false, S("Invalid if looking straight up or down")
|
|
||||||
end
|
|
||||||
else
|
|
||||||
if direction == "?" then
|
|
||||||
axis, dir = worldedit.player_axis(name)
|
|
||||||
else
|
|
||||||
axis = direction
|
|
||||||
dir = 1
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
if sign == "-" then
|
if sign == "-" then
|
||||||
dir = -dir
|
dir = -dir
|
||||||
end
|
end
|
||||||
@@ -165,15 +145,15 @@ 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 = "[+/-]" .. tostring(VALID_DIR) .. " [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"),
|
category = S("Region operations"),
|
||||||
privs = {worldedit=true},
|
privs = {worldedit=true},
|
||||||
require_pos = 2,
|
require_pos = 2,
|
||||||
parse = function(param)
|
parse = function(param)
|
||||||
local find, _, sign, direction, amount,
|
local find, _, sign, direction, amount,
|
||||||
rev_amount = param:find("([+-]?)([%?%l]+)%s*(%d+)%s*(%d*)")
|
rev_amount = param:find("^([+-]?)([^%s]+)%s+(%d+)%s*(%d*)$")
|
||||||
if find == nil then
|
if find == nil or not VALID_DIR[direction] then
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -184,24 +164,10 @@ worldedit.register_command("contract", {
|
|||||||
return true, sign, direction, tonumber(amount), tonumber(rev_amount)
|
return true, sign, direction, tonumber(amount), tonumber(rev_amount)
|
||||||
end,
|
end,
|
||||||
func = function(name, sign, direction, amount, rev_amount)
|
func = function(name, sign, direction, amount, rev_amount)
|
||||||
local absolute = direction:find("[xyz?]")
|
local axis, dir = worldedit.player_direction(name, direction)
|
||||||
local dir, axis
|
if axis == nil or dir == nil then
|
||||||
|
return false, S("Invalid if looking straight up or down")
|
||||||
if absolute == nil then
|
|
||||||
axis, dir = worldedit.translate_direction(name, direction)
|
|
||||||
|
|
||||||
if axis == nil or dir == nil then
|
|
||||||
return false, S("Invalid if looking straight up or down")
|
|
||||||
end
|
|
||||||
else
|
|
||||||
if direction == "?" then
|
|
||||||
axis, dir = worldedit.player_axis(name)
|
|
||||||
else
|
|
||||||
axis = direction
|
|
||||||
dir = 1
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
if sign == "-" then
|
if sign == "-" then
|
||||||
dir = -dir
|
dir = -dir
|
||||||
end
|
end
|
||||||
|
@@ -143,22 +143,6 @@ function worldedit.register_command(name, def)
|
|||||||
worldedit.registered_commands[name] = def
|
worldedit.registered_commands[name] = def
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
do
|
|
||||||
local modpath = minetest.get_modpath("worldedit_commands")
|
|
||||||
for _, name in ipairs({
|
|
||||||
"code", "cuboid", "manipulations", "marker", "nodename", "primitives",
|
|
||||||
"region", "schematics", "transform", "wand"
|
|
||||||
}) do
|
|
||||||
dofile(modpath .. "/" .. name .. ".lua")
|
|
||||||
end
|
|
||||||
|
|
||||||
if worldedit.register_test then
|
|
||||||
dofile(modpath .. "/test/init.lua")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
-- Notifies a player of something related to WorldEdit.
|
-- Notifies a player of something related to WorldEdit.
|
||||||
-- Message types:
|
-- Message types:
|
||||||
-- "error" = An operation did not work as expected.
|
-- "error" = An operation did not work as expected.
|
||||||
@@ -203,7 +187,63 @@ function worldedit.player_axis(name)
|
|||||||
return "z", dir.z > 0 and 1 or -1
|
return "z", dir.z > 0 and 1 or -1
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Wrapper for the engine's parse_coordinates
|
-- Look-up table of valid directions (for worldedit.player_direction)
|
||||||
|
-- Can be stringified for usage in help texts
|
||||||
|
-- @note Not part of API
|
||||||
|
worldedit.valid_directions = setmetatable({
|
||||||
|
x = true, y = true, z = true,
|
||||||
|
["?"] = true,
|
||||||
|
up = true, down = true,
|
||||||
|
front = true, back = true,
|
||||||
|
left = true, right = true,
|
||||||
|
}, {
|
||||||
|
__tostring = function()
|
||||||
|
return "x/y/z/?/up/down/left/right/front/back"
|
||||||
|
end
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Accepts a valid directions as above
|
||||||
|
-- @return axis ("x", "y", or "z") and the sign (1 or -1) *or* nil for invalid combinations
|
||||||
|
-- @note Not part of API
|
||||||
|
worldedit.player_direction = function(name, str)
|
||||||
|
if str == "x" or str == "y" or str == "z" then
|
||||||
|
return str, 1
|
||||||
|
elseif str == "up" then
|
||||||
|
return "y", 1
|
||||||
|
elseif str == "down" then
|
||||||
|
return "y", -1
|
||||||
|
end
|
||||||
|
|
||||||
|
local axis, dir = worldedit.player_axis(name)
|
||||||
|
|
||||||
|
if str == "?" then
|
||||||
|
return axis, dir
|
||||||
|
elseif str == "front" then
|
||||||
|
if axis ~= "y" then
|
||||||
|
return axis, dir
|
||||||
|
end
|
||||||
|
elseif str == "back" then
|
||||||
|
if axis ~= "y" then
|
||||||
|
return axis, -dir
|
||||||
|
end
|
||||||
|
elseif str == "left" then
|
||||||
|
if axis == "x" then
|
||||||
|
return "z", dir
|
||||||
|
elseif axis == "z" then
|
||||||
|
return "x", -dir
|
||||||
|
end
|
||||||
|
elseif str == "right" then
|
||||||
|
if axis == "x" then
|
||||||
|
return "z", -dir
|
||||||
|
elseif axis == "z" then
|
||||||
|
return "x", dir
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return nil, nil
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Wrapper for the engine"s parse_coordinates
|
||||||
-- @return vector or nil
|
-- @return vector or nil
|
||||||
-- @note Not part of API
|
-- @note Not part of API
|
||||||
function worldedit.parse_coordinates(x, y, z, player_name)
|
function worldedit.parse_coordinates(x, y, z, player_name)
|
||||||
@@ -348,3 +388,18 @@ worldedit.register_command("reset", {
|
|||||||
return true, S("region reset")
|
return true, S("region reset")
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
-- Load the other parts
|
||||||
|
do
|
||||||
|
local modpath = minetest.get_modpath("worldedit_commands")
|
||||||
|
for _, name in ipairs({
|
||||||
|
"code", "cuboid", "manipulations", "marker", "nodename", "primitives",
|
||||||
|
"region", "schematics", "transform", "wand"
|
||||||
|
}) do
|
||||||
|
dofile(modpath .. "/" .. name .. ".lua")
|
||||||
|
end
|
||||||
|
|
||||||
|
if worldedit.register_test then
|
||||||
|
dofile(modpath .. "/test/init.lua")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
@@ -63,6 +63,31 @@ register_test("//inset", make_parsing_test("inset", {
|
|||||||
"v foo",
|
"v foo",
|
||||||
}))
|
}))
|
||||||
|
|
||||||
|
register_test("//shift", make_parsing_test("shift", {
|
||||||
|
"x 1",
|
||||||
|
"x -4",
|
||||||
|
"back 1",
|
||||||
|
"? 1",
|
||||||
|
}, {
|
||||||
|
"+z 1212",
|
||||||
|
"-z 9",
|
||||||
|
"xx -5",
|
||||||
|
"?? 123",
|
||||||
|
}))
|
||||||
|
|
||||||
|
register_test("//expand", make_parsing_test("expand", {
|
||||||
|
"x 1",
|
||||||
|
"z 1 2",
|
||||||
|
"? 1",
|
||||||
|
"+? 1",
|
||||||
|
"+left 1",
|
||||||
|
"-right 1",
|
||||||
|
}, {
|
||||||
|
"x -4",
|
||||||
|
"? 4 -333",
|
||||||
|
"stupid 5 5",
|
||||||
|
}))
|
||||||
|
|
||||||
register_test("//cubeapply", make_parsing_test("cubeapply", {
|
register_test("//cubeapply", make_parsing_test("cubeapply", {
|
||||||
"2 orient 90",
|
"2 orient 90",
|
||||||
"2 3 4 orient 90",
|
"2 3 4 orient 90",
|
||||||
|
Reference in New Issue
Block a user