2022-05-15 14:27:43 +00:00
local wea = worldeditadditions
local Vector3 = wea.Vector3
local function parse_stage2 ( name , parts )
local result = Vector3.new ( )
for i , axis_name in ipairs ( parts ) do
local success , result_this = wea.parse . axis_name ( axis_name , wea.player_dir ( name ) )
if not success then return success , result_this end
result = result + result_this
end
result = result : clamp ( Vector3.new ( - 1 , - 1 , - 1 ) , Vector3.new ( 1 , 1 , 1 ) )
if result.length == 0 then
return false , " Refusing to create a dome with no distinct pointing direction. "
end
return true , result
end
-- ██████ ██████ ███ ███ ███████
-- ██ ██ ██ ██ ████ ████ ██
-- ██ ██ ██ ██ ██ ████ ██ █████
-- ██ ██ ██ ██ ██ ██ ██ ██
-- ██████ ██████ ██ ██ ███████
worldedit.register_command ( " dome+ " , { -- TODO: Make this an override
2022-05-15 14:38:50 +00:00
params = " <radius> <replace_node> [<pointing_dir:x|y|z|-x|-y|-z|?|front|back|left|right|up|down> ...] [h[ollow]] " ,
2022-05-15 14:27:43 +00:00
description = " Creates a dome shape with a specified radius of the defined node, optionally specifying the direction it should be pointing in (defaults to the positive y direction). " ,
privs = { worldedit = true } ,
require_pos = 1 ,
parse = function ( params_text )
if not params_text then params_text = " " end
local parts = wea.split_shell ( params_text )
if # parts < 2 then
return false , " Error: Not enough arguments (see /help /dome for usage information). "
end
local radius = tonumber ( parts [ 1 ] )
local replace_node = worldedit.normalize_nodename ( parts [ 2 ] )
2022-05-15 14:38:50 +00:00
local hollow = false
2022-05-15 14:27:43 +00:00
if not radius then
return false , " Error: Invalid radius ' " .. parts [ 1 ] .. " '. The radius must be a positive integer. "
end
if radius < 1 then
2022-05-15 23:29:50 +00:00
return false , " Error: The minimum radius size is 1, but you entered " .. tostring ( radius ) .. " . "
2022-05-15 14:27:43 +00:00
end
if not replace_node then
return false , " Error: Invalid replace_node ' " .. parts [ 1 ] .. " '. "
end
2022-05-15 14:38:50 +00:00
if # parts > 2 and ( parts [ # parts ] == " h " or parts [ # parts ] == " hollow " ) then
hollow = true
table.remove ( parts , # parts )
end
2022-05-15 14:27:43 +00:00
local axes = wea.table . shallowcopy ( parts )
table.remove ( axes , 1 )
table.remove ( axes , 1 )
if # axes == 0 then
table.insert ( axes , " +y " )
end
2022-05-15 14:38:50 +00:00
return true , radius , replace_node , axes , hollow
2022-05-15 14:27:43 +00:00
end ,
nodes_needed = function ( name , radius )
return 4 / 3 * math.pi * radius * radius * radius
end ,
2022-05-15 14:38:50 +00:00
func = function ( name , radius , replace_node , axes , hollow )
2022-05-15 14:27:43 +00:00
local start_time = wea.get_ms_time ( )
local success_a , pointing_dir = parse_stage2 ( name , axes )
if not success_a then return success_a , pointing_dir end
local pos = Vector3.clone ( worldedit.pos1 [ name ] )
local success_b , nodes_replaced = wea.dome (
pos ,
radius ,
replace_node ,
2022-05-15 14:38:50 +00:00
pointing_dir ,
hollow
2022-05-15 14:27:43 +00:00
)
if not success_b then return success_b , nodes_replaced end
local time_taken = wea.get_ms_time ( ) - start_time
minetest.log ( " action " , name .. " used //dome+ at " .. pos .. " with a radius of " .. tostring ( radius ) .. " , modifying " .. nodes_replaced .. " nodes in " .. wea.format . human_time ( time_taken ) )
return true , nodes_replaced .. " nodes replaced " .. wea.format . human_time ( time_taken )
end
} )