2022-09-25 00:18:40 +00:00
local wea_c = worldeditadditions_core
local Vector3 = wea_c.Vector3
-- ███████ ██████ ██ ██ ███ ██ ███████
-- ██ ██ ██ ██ ██ ████ ██ ██
-- ███████ ██████ ██ ██ ██ ██ ██ █████
-- ██ ██ ██ ██ ██ ██ ██ ██
-- ███████ ██ ███████ ██ ██ ████ ███████
worldeditadditions_core.register_command ( " spline " , {
2022-09-25 21:55:50 +00:00
params = " <replace_node> <width_start> [<width_end=width_start> [<steps=3>]] " ,
2022-09-25 00:18:40 +00:00
description = " Draws a spline through the defined points. NOTE: Uses the NEW worldeditadditions position system, not the existing WorldEdit one! " ,
privs = { worldedit = true } ,
require_pos = 3 ,
parse = function ( params_text )
local parts = wea_c.split_shell ( params_text )
local replace_node
local width_start
local width_end
2022-09-25 14:30:16 +00:00
local steps = 3
2022-09-25 00:18:40 +00:00
if # parts < 1 then
return false , " Error: The replace_node (e.g. dirt) was not specified. "
end
if # parts < 2 then
return false , " Error: The starting width wasn't specified. "
end
replace_node = worldedit.normalize_nodename ( parts [ 1 ] )
if not replace_node then
return false , " Error: Unknown node name ' " .. parts [ 1 ] .. " . "
end
width_start = tonumber ( parts [ 2 ] )
if not width_start then
2022-09-25 16:07:37 +00:00
return false , " Error: width_start must be an integer greater than or equal to 0. "
2022-09-25 00:18:40 +00:00
end
2022-09-25 16:07:37 +00:00
if width_start < 0 then
2022-09-25 00:18:40 +00:00
return false , " Error: width_start must be an integer greater than 0, but you passed ' " .. parts [ 2 ] .. " '. "
end
if # parts >= 3 then
width_end = tonumber ( parts [ 3 ] )
if not width_end then
2022-09-25 16:07:37 +00:00
return false , " Error: width_end must be an integer greater than or equal to 0. "
2022-09-25 00:18:40 +00:00
end
2022-09-25 16:07:37 +00:00
if width_end < 0 then
2022-09-25 00:18:40 +00:00
return false , " Error: width_end must be an integer greater than 0, but you passed ' " .. parts [ 3 ] .. " '. "
end
else
width_end = width_start
end
if # parts >= 4 then
steps = tonumber ( parts [ 4 ] )
if not steps then
return false , " Error: steps must be an integer greater than or equal to 0. "
end
if steps < 0 then
return false , " Error: steps must be an integer greater than or equal to 0, but you passed ' " .. parts [ 3 ] .. " '. "
end
end
return true , replace_node , width_start , width_end , steps
end ,
nodes_needed = function ( player_name , _replace_node , _width_start , _width_end , steps )
if steps > 10 then return " may result in a large number of interpolated points " end
-- //overlay only modifies up to 1 node per column in the selected region
local pos1 , pos2 = wea_c.pos . get_bounds ( player_name )
return Vector3.volume ( pos1 , pos2 )
end ,
func = function ( player_name , replace_node , width_start , width_end , steps )
local start_time = wea_c.get_ms_time ( )
local pos_list = wea_c.pos . get_all ( player_name )
local success , nodes_replaced = worldeditadditions.spline (
pos_list ,
width_start ,
width_end ,
2022-09-25 14:30:16 +00:00
steps ,
2022-09-25 00:18:40 +00:00
replace_node
)
if not success then return success , nodes_replaced end
local time_taken = wea_c.format . human_time ( wea_c.get_ms_time ( ) - start_time )
minetest.log ( " action " , player_name .. " used //spline with " .. # pos_list .. " initial points and " .. steps .. " steps, replacing " .. nodes_replaced .. " nodes in " .. time_taken )
return true , nodes_replaced .. " nodes replaced in " .. time_taken
end
} )