2022-09-18 20:30:28 +00:00
local wea_c = worldeditadditions_core
2021-10-11 01:41:45 +00:00
local wea = worldeditadditions
2022-09-18 20:30:28 +00:00
local Vector3 = wea_c.Vector3
2021-11-11 02:20:37 +00:00
local function parse_stage2 ( name , parts )
2022-09-18 20:30:28 +00:00
local success , vpos1 , vpos2 = wea_c.parse . axes (
2021-11-11 02:20:37 +00:00
parts ,
2022-09-18 20:30:28 +00:00
wea_c.player_dir ( name )
2021-11-11 02:20:37 +00:00
)
if not success then return success , vpos1 end
-- In this case, we aren't interested in keeping the multidirectional shape changing information insomuch as an offset to which we should shift the region's contents to.
local offset = vpos1 + vpos2
if offset == Vector3.new ( ) then
return false , " Refusing to copy region a distance of 0 nodes "
end
return true , offset : floor ( )
end
2021-10-11 01:41:45 +00:00
-- ██████ ██████ ██████ ██ ██
-- ██ ██ ██ ██ ██ ██ ██
-- ██ ██ ██ ██████ ████
-- ██ ██ ██ ██ ██
-- ██████ ██████ ██ ██
2022-05-19 21:10:09 +00:00
worldeditadditions_core.register_command ( " copy+ " , { -- TODO: Make this an override
2021-11-11 02:36:37 +00:00
params = " <axis:x|y|z|-x|-y|-z|?|front|back|left|right|up|down> <count> [<axis> <count> [...]] " ,
2021-11-11 02:20:37 +00:00
description = " Copies the defined region to another location - potentially across multiple axes at once. " ,
2021-10-11 01:41:45 +00:00
privs = { worldedit = true } ,
require_pos = 2 ,
parse = function ( params_text )
if not params_text then params_text = " " end
2022-09-18 20:30:28 +00:00
local parts = wea_c.split_shell ( params_text )
2021-10-11 01:41:45 +00:00
2021-11-11 02:20:37 +00:00
return true , parts
2021-10-11 01:41:45 +00:00
end ,
nodes_needed = function ( name )
return worldedit.volume ( worldedit.pos1 [ name ] , worldedit.pos2 [ name ] )
end ,
2021-11-11 02:20:37 +00:00
func = function ( name , parts )
2022-09-18 20:30:28 +00:00
local start_time = wea_c.get_ms_time ( )
2021-10-11 01:41:45 +00:00
2021-11-11 02:20:37 +00:00
local success_a , copy_offset = parse_stage2 ( name , parts )
if not success_a then return success_a , copy_offset end
local source_pos1 = Vector3.clone ( worldedit.pos1 [ name ] )
local source_pos2 = Vector3.clone ( worldedit.pos2 [ name ] )
2021-10-11 01:41:45 +00:00
2021-11-11 02:20:37 +00:00
local target_pos1 = source_pos1 + copy_offset
local target_pos2 = source_pos2 + copy_offset
2021-10-11 01:41:45 +00:00
2021-11-11 02:20:37 +00:00
local success_b , nodes_modified = wea.copy (
2021-10-11 01:41:45 +00:00
source_pos1 , source_pos2 ,
target_pos1 , target_pos2
)
2021-11-11 02:20:37 +00:00
if not success_b then return success_b , nodes_modified end
2021-10-11 01:41:45 +00:00
2022-09-18 20:30:28 +00:00
local time_taken = wea_c.get_ms_time ( ) - start_time
2021-10-11 01:41:45 +00:00
2022-09-18 20:30:28 +00:00
minetest.log ( " action " , name .. " used //copy from " .. source_pos1 .. " - " .. source_pos2 .. " to " .. target_pos1 .. " - " .. target_pos2 .. " , modifying " .. nodes_modified .. " nodes in " .. wea_c.format . human_time ( time_taken ) )
return true , nodes_modified .. " nodes copied using offset " .. copy_offset .. " in " .. wea_c.format . human_time ( time_taken )
2021-10-11 01:41:45 +00:00
end
} )