@@ -0,0 +1,258 @@
-- Expands or contracts the cuboid in all axes by amount (positive or negative)
worldedit .cuboid_volumetric_expand = function (name , amount )
local pos1 = worldedit .pos1 [name ]
local pos2 = worldedit .pos2 [name ]
if pos1 == nil or pos2 == nil then
return false , " Undefined cuboid"
end
local delta1 = vector .new ()
local delta2 = vector .new ()
local delta_dir1
local delta_dir2
delta1 = vector .add (delta1 , amount )
delta2 = vector .add (delta2 , amount )
delta_dir1 , delta_dir2 = worldedit .get_expansion_directions (pos1 , pos2 )
delta1 = vector .multiply (delta1 , delta_dir1 )
delta2 = vector .multiply (delta2 , delta_dir2 )
worldedit .pos1 [name ] = vector .add (pos1 , delta1 )
worldedit .pos2 [name ] = vector .add (pos2 , delta2 )
return true
end
-- Expands or contracts the cuboid in a single axis by amount (positive or negative)
worldedit .cuboid_linear_expand = function (name , axis , direction , amount )
local pos1 = worldedit .pos1 [name ]
local pos2 = worldedit .pos2 [name ]
if pos1 == nil or pos2 == nil then
return false , " undefined cuboid"
end
if direction ~= 1 and direction ~= - 1 then
return false , " invalid marker"
end
local marker = worldedit .marker_get_closest_to_axis (name , axis , direction )
local deltavect = vector .new ()
if axis == ' x' then
deltavect .x = amount * direction
elseif axis == ' y' then
deltavect .y = amount * direction
elseif axis == ' z' then
deltavect .z = amount * direction
else
return false , " invalid axis"
end
worldedit .marker_move (name , marker , deltavect )
return true
end
-- Shifts the cuboid by '+-amount' in axis 'axis'
worldedit .cuboid_shift = function (name , axis , amount )
local pos1 = worldedit .pos1 [name ]
local pos2 = worldedit .pos2 [name ]
if pos1 == nil or pos2 == nil then
return false , " undefined cuboid"
end
if axis == ' x' then
worldedit .pos1 [name ].x = pos1 .x + amount
worldedit .pos2 [name ].x = pos2 .x + amount
elseif axis == ' y' then
worldedit .pos1 [name ].y = pos1 .y + amount
worldedit .pos2 [name ].y = pos2 .y + amount
elseif axis == ' z' then
worldedit .pos1 [name ].z = pos1 .z + amount
worldedit .pos2 [name ].z = pos2 .z + amount
else
return false , " invalid axis"
end
return true
end
-- Moves the location of a single marker by adding deltavector
worldedit .marker_move = function (name , marker , deltavector )
if marker ~= 1 and marker ~= 2 then
return false
end
if marker == 1 then
local pos = worldedit .pos1 [name ]
worldedit .pos1 [name ] = vector .add (deltavector , pos )
else
local pos = worldedit .pos2 [name ]
worldedit .pos2 [name ] = vector .add (deltavector , pos )
end
return true
end
-- Updates the location ingame of the markers
worldedit .marker_update = function (name , marker )
if marker == nil then
worldedit .mark_pos1 (name )
worldedit .mark_pos2 (name )
elseif marker == 1 then
worldedit .mark_pos1 (name )
elseif marker == 2 then
worldedit .mark_pos2 (name )
else
minetest .debug (
" worldedit: Invalid execution of function update_markers" )
end
end
-- Returns two vectors with the directions for volumetric expansion
worldedit .get_expansion_directions = function (mark1 , mark2 )
if mark1 == nil or mark2 == nil then
return
end
local dir1 = vector .new ()
local dir2 = vector .new ()
if mark1 .x < mark2 .x then
dir1 .x = - 1
dir2 .x = 1
else
dir1 .x = 1
dir2 .x = - 1
end
if mark1 .y < mark2 .y then
dir1 .y = - 1
dir2 .y = 1
else
dir1 .y = 1
dir2 .y = - 1
end
if mark1 .z < mark2 .z then
dir1 .z = - 1
dir2 .z = 1
else
dir1 .z = 1
dir2 .z = - 1
end
return dir1 , dir2
end
-- Return the marker that is closest to the player
worldedit .marker_get_closest_to_player = function (name )
local playerpos = minetest .get_player_by_name (name ):getpos ()
local dist1 = vector .distance (playerpos , worldedit .pos1 [name ])
local dist2 = vector .distance (playerpos , worldedit .pos2 [name ])
if dist1 < dist2 then
return 1
else
return 2
end
end
-- Returns the closest marker to the specified axis and direction
worldedit .marker_get_closest_to_axis = function (name , axis , direction )
local pos1 = vector .new ()
local pos2 = vector .new ()
if direction ~= 1 and direction ~= - 1 then
return nil
end
if axis == ' x' then
pos1 .x = worldedit .pos1 [name ].x * direction
pos2 .x = worldedit .pos2 [name ].x * direction
if pos1 .x > pos2 .x then
return 1
else
return 2
end
elseif axis == ' y' then
pos1 .y = worldedit .pos1 [name ].y * direction
pos2 .y = worldedit .pos2 [name ].y * direction
if pos1 .y > pos2 .y then
return 1
else
return 2
end
elseif axis == ' z' then
pos1 .z = worldedit .pos1 [name ].z * direction
pos2 .z = worldedit .pos2 [name ].z * direction
if pos1 .z > pos2 .z then
return 1
else
return 2
end
else
return nil
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