mirror of
https://github.com/sbrl/Minetest-WorldEditAdditions.git
synced 2024-09-28 08:05:58 +00:00
91 lines
3 KiB
Lua
91 lines
3 KiB
Lua
|
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
|
||
|
params = "<radius> <replace_node> [<pointing_dir:x|y|z|-x|-y|-z|?|front|back|left|right|up|down> ...]",
|
||
|
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])
|
||
|
|
||
|
if not radius then
|
||
|
return false, "Error: Invalid radius '"..parts[1].."'. The radius must be a positive integer."
|
||
|
end
|
||
|
if radius < 1 then
|
||
|
return false, "Error: The minimum radius size is 1, but you entered"..tostring(radius).."."
|
||
|
end
|
||
|
|
||
|
if not replace_node then
|
||
|
return false, "Error: Invalid replace_node '"..parts[1].."'."
|
||
|
end
|
||
|
|
||
|
local axes = wea.table.shallowcopy(parts)
|
||
|
table.remove(axes, 1)
|
||
|
table.remove(axes, 1)
|
||
|
|
||
|
if #axes == 0 then
|
||
|
table.insert(axes, "+y")
|
||
|
end
|
||
|
|
||
|
return true, radius, replace_node, axes
|
||
|
end,
|
||
|
nodes_needed = function(name, radius)
|
||
|
return 4/3 * math.pi * radius * radius * radius
|
||
|
end,
|
||
|
func = function(name, radius, replace_node, axes)
|
||
|
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,
|
||
|
pointing_dir
|
||
|
)
|
||
|
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
|
||
|
})
|