2024-04-21 23:33:55 +02:00
local S = minetest.get_translator ( " worldedit_commands " )
local function check_region ( name )
return worldedit.volume ( worldedit.pos1 [ name ] , worldedit.pos2 [ name ] )
end
worldedit.register_command ( " copy " , {
params = " x/y/z/? <amount> " ,
description = S ( " Copy the current WorldEdit region along the given axis by <amount> nodes " ) ,
category = S ( " Transformations " ) ,
privs = { worldedit = true } ,
require_pos = 2 ,
parse = function ( param )
local found , _ , axis , amount = param : find ( " ^([xyz%?])%s+([+-]?%d+)$ " )
if found == nil then
return false
end
return true , axis , tonumber ( amount )
end ,
nodes_needed = function ( name , axis , amount )
return check_region ( name ) * 2
end ,
func = function ( name , axis , amount )
if axis == " ? " then
local sign
axis , sign = worldedit.player_axis ( name )
amount = amount * sign
end
local count = worldedit.copy ( worldedit.pos1 [ name ] , worldedit.pos2 [ name ] , axis , amount )
2024-04-22 17:33:16 +02:00
return true , S ( " @1 nodes copied " , count )
2024-04-21 23:33:55 +02:00
end ,
} )
worldedit.register_command ( " move " , {
params = " x/y/z/? <amount> " ,
description = S ( " Move the current WorldEdit region along the given axis by <amount> nodes " ) ,
category = S ( " Transformations " ) ,
privs = { worldedit = true } ,
require_pos = 2 ,
parse = function ( param )
local found , _ , axis , amount = param : find ( " ^([xyz%?])%s+([+-]?%d+)$ " )
if found == nil then
return false
end
return true , axis , tonumber ( amount )
end ,
nodes_needed = function ( name , axis , amount )
return check_region ( name ) * 2
end ,
func = function ( name , axis , amount )
if axis == " ? " then
local sign
axis , sign = worldedit.player_axis ( name )
amount = amount * sign
end
local pos1 , pos2 = worldedit.pos1 [ name ] , worldedit.pos2 [ name ]
local count = worldedit.move ( pos1 , pos2 , axis , amount )
pos1 [ axis ] = pos1 [ axis ] + amount
pos2 [ axis ] = pos2 [ axis ] + amount
worldedit.marker_update ( name )
2024-04-22 17:33:16 +02:00
return true , S ( " @1 nodes moved " , count )
2024-04-21 23:33:55 +02:00
end ,
} )
worldedit.register_command ( " stack " , {
params = " x/y/z/? <count> " ,
description = S ( " Stack the current WorldEdit region along the given axis <count> times " ) ,
category = S ( " Transformations " ) ,
privs = { worldedit = true } ,
require_pos = 2 ,
parse = function ( param )
local found , _ , axis , repetitions = param : find ( " ^([xyz%?])%s+([+-]?%d+)$ " )
if found == nil then
return false
end
return true , axis , tonumber ( repetitions )
end ,
nodes_needed = function ( name , axis , repetitions )
return check_region ( name ) * math.abs ( repetitions )
end ,
func = function ( name , axis , repetitions )
if axis == " ? " then
local sign
axis , sign = worldedit.player_axis ( name )
repetitions = repetitions * sign
end
local pos1 , pos2 = worldedit.pos1 [ name ] , worldedit.pos2 [ name ]
local count = worldedit.volume ( pos1 , pos2 ) * math.abs ( repetitions )
worldedit.stack ( pos1 , pos2 , axis , repetitions , function ( )
2024-04-22 17:33:16 +02:00
worldedit.player_notify ( name , S ( " @1 nodes stacked " , count ) , " ok " )
2024-04-21 23:33:55 +02:00
end )
end ,
} )
worldedit.register_command ( " stack2 " , {
params = " <count> <x> <y> <z> " ,
description = S ( " Stack the current WorldEdit region <count> times by offset <x>, <y>, <z> " ) ,
category = S ( " Transformations " ) ,
privs = { worldedit = true } ,
require_pos = 2 ,
parse = function ( param )
local repetitions , incs = param : match ( " (%d+)%s*(.+) " )
if repetitions == nil then
return false , S ( " invalid count: @1 " , param )
end
local x , y , z = incs : match ( " ([+-]?%d+) ([+-]?%d+) ([+-]?%d+) " )
if x == nil then
return false , S ( " invalid increments: @1 " , param )
end
return true , tonumber ( repetitions ) , vector.new ( tonumber ( x ) , tonumber ( y ) , tonumber ( z ) )
end ,
nodes_needed = function ( name , repetitions , offset )
return check_region ( name ) * repetitions
end ,
func = function ( name , repetitions , offset )
local pos1 , pos2 = worldedit.pos1 [ name ] , worldedit.pos2 [ name ]
local count = worldedit.volume ( pos1 , pos2 ) * repetitions
worldedit.stack2 ( pos1 , pos2 , offset , repetitions , function ( )
2024-04-22 17:33:16 +02:00
worldedit.player_notify ( name , S ( " @1 nodes stacked " , count ) , " ok " )
2024-04-21 23:33:55 +02:00
end )
end ,
} )
worldedit.register_command ( " stretch " , {
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 " ) ,
category = S ( " Transformations " ) ,
privs = { worldedit = true } ,
require_pos = 2 ,
parse = function ( param )
local found , _ , stretchx , stretchy , stretchz = param : find ( " ^(%d+)%s+(%d+)%s+(%d+)$ " )
if found == nil then
return false
end
stretchx , stretchy , stretchz = tonumber ( stretchx ) , tonumber ( stretchy ) , tonumber ( stretchz )
if stretchx == 0 or stretchy == 0 or stretchz == 0 then
return false , S ( " invalid scaling factors: @1 " , param )
end
return true , stretchx , stretchy , stretchz
end ,
nodes_needed = function ( name , stretchx , stretchy , stretchz )
return check_region ( name ) * stretchx * stretchy * stretchz
end ,
func = function ( name , stretchx , stretchy , stretchz )
local pos1 , pos2 = worldedit.pos1 [ name ] , worldedit.pos2 [ name ]
local count , pos1 , pos2 = worldedit.stretch ( pos1 , pos2 , stretchx , stretchy , stretchz )
--reset markers to scaled positions
worldedit.pos1 [ name ] = pos1
worldedit.pos2 [ name ] = pos2
worldedit.marker_update ( name )
2024-04-22 17:33:16 +02:00
return true , S ( " @1 nodes stretched " , count )
2024-04-21 23:33:55 +02:00
end ,
} )
worldedit.register_command ( " transpose " , {
params = " x/y/z/? x/y/z/? " ,
description = S ( " Transpose the current WorldEdit region along the given axes " ) ,
category = S ( " Transformations " ) ,
privs = { worldedit = true } ,
require_pos = 2 ,
parse = function ( param )
local found , _ , axis1 , axis2 = param : find ( " ^([xyz%?])%s+([xyz%?])$ " )
if found == nil then
return false
elseif axis1 == axis2 then
return false , S ( " invalid usage: axes must be different " )
end
return true , axis1 , axis2
end ,
nodes_needed = check_region ,
func = function ( name , axis1 , axis2 )
local pos1 , pos2 = worldedit.pos1 [ name ] , worldedit.pos2 [ name ]
if axis1 == " ? " then axis1 = worldedit.player_axis ( name ) end
if axis2 == " ? " then axis2 = worldedit.player_axis ( name ) end
local count , pos1 , pos2 = worldedit.transpose ( pos1 , pos2 , axis1 , axis2 )
--reset markers to transposed positions
worldedit.pos1 [ name ] = pos1
worldedit.pos2 [ name ] = pos2
worldedit.marker_update ( name )
2024-04-22 17:33:16 +02:00
return true , S ( " @1 nodes transposed " , count )
2024-04-21 23:33:55 +02:00
end ,
} )
worldedit.register_command ( " flip " , {
params = " x/y/z/? " ,
description = S ( " Flip the current WorldEdit region along the given axis " ) ,
category = S ( " Transformations " ) ,
privs = { worldedit = true } ,
require_pos = 2 ,
parse = function ( param )
if param ~= " x " and param ~= " y " and param ~= " z " and param ~= " ? " then
return false
end
return true , param
end ,
nodes_needed = check_region ,
func = function ( name , param )
if param == " ? " then param = worldedit.player_axis ( name ) end
local count = worldedit.flip ( worldedit.pos1 [ name ] , worldedit.pos2 [ name ] , param )
2024-04-22 17:33:16 +02:00
return true , S ( " @1 nodes flipped " , count )
2024-04-21 23:33:55 +02:00
end ,
} )
worldedit.register_command ( " rotate " , {
params = " x/y/z/? <angle> " ,
description = S ( " Rotate the current WorldEdit region around the given axis by angle <angle> (90 degree increment) " ) ,
category = S ( " Transformations " ) ,
privs = { worldedit = true } ,
require_pos = 2 ,
parse = function ( param )
local found , _ , axis , angle = param : find ( " ^([xyz%?])%s+([+-]?%d+)$ " )
if found == nil then
return false
end
angle = tonumber ( angle )
if angle % 90 ~= 0 or angle % 360 == 0 then
return false , S ( " invalid usage: angle must be multiple of 90 " )
end
return true , axis , angle
end ,
nodes_needed = check_region ,
func = function ( name , axis , angle )
local pos1 , pos2 = worldedit.pos1 [ name ] , worldedit.pos2 [ name ]
if axis == " ? " then axis = worldedit.player_axis ( name ) end
local count , pos1 , pos2 = worldedit.rotate ( pos1 , pos2 , axis , angle )
--reset markers to rotated positions
worldedit.pos1 [ name ] = pos1
worldedit.pos2 [ name ] = pos2
worldedit.marker_update ( name )
2024-04-22 17:33:16 +02:00
return true , S ( " @1 nodes rotated " , count )
2024-04-21 23:33:55 +02:00
end ,
} )
worldedit.register_command ( " orient " , {
params = " <angle> " ,
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 } ,
require_pos = 2 ,
parse = function ( param )
local found , _ , angle = param : find ( " ^([+-]?%d+)$ " )
if found == nil then
return false
end
angle = tonumber ( angle )
if angle % 90 ~= 0 then
return false , S ( " invalid usage: angle must be multiple of 90 " )
end
return true , angle
end ,
nodes_needed = check_region ,
func = function ( name , angle )
local count = worldedit.orient ( worldedit.pos1 [ name ] , worldedit.pos2 [ name ] , angle )
2024-04-22 17:33:16 +02:00
return true , S ( " @1 nodes oriented " , count )
2024-04-21 23:33:55 +02:00
end ,
} )