mirror of
https://github.com/sbrl/Minetest-WorldEditAdditions.git
synced 2024-12-23 20:15:02 +00:00
101 lines
3.9 KiB
Lua
101 lines
3.9 KiB
Lua
local wea_c = worldeditadditions_core
|
|
local Vector3 = wea_c.Vector3
|
|
|
|
--- Functions for handling selections of the defined pos1/pos2 region.
|
|
--
|
|
-- These functions primarily back the [cloud wand](https://worldeditadditions.mooncarrot.space/Reference/#cloud). To manipulate positions directly, see the [`worldeditadditions_core.pos`]() namespace.
|
|
-- @namespace worldeditadditions.selection
|
|
|
|
-- ███████ ███████ ██ ███████ ██████ ████████ ██ ██████ ███ ██
|
|
-- ██ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██
|
|
-- ███████ █████ ██ █████ ██ ██ ██ ██ ██ ██ ██ ██
|
|
-- ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
|
|
-- ███████ ███████ ███████ ███████ ██████ ██ ██ ██████ ██ ████
|
|
|
|
---Selection helpers and modifiers
|
|
local selection = {}
|
|
|
|
--- Additively adds a point to the current selection defined by pos1..pos2 or
|
|
-- makes a selection from the provided point.
|
|
-- @param name string Player name.
|
|
-- @param pos vector The position to include.
|
|
-- @returns void
|
|
function selection.add_point(name, newpos)
|
|
if newpos ~= nil then
|
|
-- print("DEBUG:selection.add_point newpos", newpos)
|
|
local has_pos1 = not not wea_c.pos.get1(name)
|
|
local has_pos2 = not not wea_c.pos.get2(name)
|
|
local created_new = not has_pos1 or not has_pos2
|
|
if not has_pos1 then wea_c.pos.set1(name, Vector3.clone(newpos)) end
|
|
if not has_pos2 then wea_c.pos.set2(name, Vector3.clone(newpos)) end
|
|
|
|
|
|
-- Now no longer needed, given that the new sysstem uses an event listener to push updates to the selected region automatically
|
|
-- worldedit.marker_update(name)
|
|
|
|
local pos1, pos2 = wea_c.pos.get1(name), wea_c.pos.get2(name)
|
|
|
|
local volume_before = worldedit.volume(pos1, pos2)
|
|
|
|
|
|
local new_pos1, new_pos2 = Vector3.expand_region(
|
|
Vector3.clone(pos1),
|
|
Vector3.clone(pos2),
|
|
newpos
|
|
)
|
|
|
|
wea_c.pos.set1(name, new_pos1)
|
|
wea_c.pos.set2(name, new_pos2)
|
|
|
|
|
|
local volume_after = worldedit.volume(new_pos1, new_pos2)
|
|
|
|
local volume_difference = volume_after - volume_before
|
|
if volume_difference == 0 and created_new then
|
|
volume_difference = 1
|
|
end
|
|
|
|
local msg = "Expanded region by "
|
|
if created_new then msg = "Created new region with " end
|
|
msg = msg..volume_difference.." node"
|
|
if volume_difference ~= 1 then msg = msg.."s" end
|
|
|
|
-- Done automatically
|
|
-- worldedit.marker_update(name)
|
|
worldedit.player_notify(name, msg)
|
|
else
|
|
worldedit.player_notify(name, "Error. Too far away (try raising your maxdist with //farwand maxdist <number>)")
|
|
-- print("[set_pos1]", name, "nil")
|
|
end
|
|
end
|
|
|
|
--- Clears current selection, *but only pos1 and pos2!
|
|
-- @param name string Player name.
|
|
-- @returns void
|
|
function selection.clear_points(name)
|
|
wea_c.pos.clear(name)
|
|
-- worldedit.marker_update(name)
|
|
|
|
worldedit.player_notify(name, "Region cleared")
|
|
end
|
|
|
|
--- Checks if a string is a valid axis.
|
|
-- @param str string String to check (be sure to remove any + or -).
|
|
-- @param hv bool Include "h" (general horizontal) and "v" (general vertical).
|
|
-- @return bool If string is a valid axis then true.
|
|
function selection.check_axis(str,hv)
|
|
if hv then
|
|
return (str == "x" or str == "y" or str == "z" or str == "h" or str == "v")
|
|
else
|
|
return (str == "x" or str == "y" or str == "z")
|
|
end
|
|
end
|
|
|
|
--- Checks if a string is a valid dir.
|
|
-- @param str string String to check (be sure to remove any + or -).
|
|
-- @return bool If string is a valid dir then true.
|
|
function selection.check_dir(str)
|
|
return (str == "facing" or str == "front" or str == "back" or str == "left" or str == "right" or str == "up" or str == "down")
|
|
end
|
|
|
|
return selection
|