mirror of
https://github.com/sbrl/Minetest-WorldEditAdditions.git
synced 2024-11-27 17:43:53 +01:00
97 lines
3.2 KiB
Lua
97 lines
3.2 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
|
|
|
|
-- ██████ ██████ ███ ███ ███████
|
|
-- ██ ██ ██ ██ ████ ████ ██
|
|
-- ██ ██ ██ ██ ██ ████ ██ █████
|
|
-- ██ ██ ██ ██ ██ ██ ██ ██
|
|
-- ██████ ██████ ██ ██ ███████
|
|
worldeditadditions_core.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> ...] [h[ollow]]",
|
|
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])
|
|
local hollow = false
|
|
|
|
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
|
|
|
|
if #parts > 2 and (parts[#parts] == "h" or parts[#parts] == "hollow") then
|
|
hollow = true
|
|
table.remove(parts, #parts)
|
|
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, hollow
|
|
end,
|
|
nodes_needed = function(name, radius)
|
|
return 4/3 * math.pi * radius * radius * radius
|
|
end,
|
|
func = function(name, radius, replace_node, axes, hollow)
|
|
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,
|
|
hollow
|
|
)
|
|
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
|
|
})
|