mirror of
https://github.com/sbrl/Minetest-WorldEditAdditions.git
synced 2024-11-16 13:03:00 +00:00
88 lines
2.8 KiB
Lua
88 lines
2.8 KiB
Lua
|
|
local wea = worldeditadditions
|
|
local Vector3 = wea.Vector3
|
|
|
|
worldeditadditions_core.register_command("spiral2", {
|
|
params = "[<circle|square>] [<replace_node=dirt> [<interval=3> [<acceleration=0>] ] ]",
|
|
description = "Generates a spiral that fills the defined region using the specified replace node. The spiral is either square (default) or circular in shape. The interval specifies the distance between the walls of the spiral, and the acceleration specifies how quickly this value should increase.",
|
|
privs = { worldedit = true },
|
|
require_pos = 2,
|
|
parse = function(params_text)
|
|
if not params_text then params_text = "" end
|
|
params_text = wea.trim(params_text)
|
|
if params_text == "" then return true, "square", "dirt", 3, 0 end
|
|
|
|
local parts = wea.split_shell(params_text)
|
|
|
|
local mode = "square"
|
|
local target_node = "dirt"
|
|
local target_node_found = false
|
|
local interval = 3
|
|
local acceleration = 0
|
|
|
|
if parts[1] ~= "circle" and parts[1] ~= "square" then
|
|
target_node = parts[1]
|
|
target_node_found = true
|
|
table.remove(parts, 1)
|
|
else
|
|
mode = parts[1]
|
|
table.remove(parts, 1)
|
|
end
|
|
|
|
if #parts >= 1 and not target_node_found then
|
|
target_node = parts[1]
|
|
table.remove(parts, 1)
|
|
end
|
|
if #parts >= 1 then
|
|
interval = tonumber(parts[1])
|
|
if not interval then
|
|
return false, "Error: Invalid interval value '"..tostring(parts[1]).."'. Interval values must be integers."
|
|
end
|
|
table.remove(parts, 1)
|
|
end
|
|
if #parts >= 1 then
|
|
acceleration = tonumber(parts[1])
|
|
if not acceleration then
|
|
return false, "Error: Invalid acceleration value '"..tostring(parts[1]).."'. Acceleration values must be integers."
|
|
end
|
|
table.remove(parts, 1)
|
|
end
|
|
|
|
local target_node_norm = worldedit.normalize_nodename(target_node)
|
|
if not target_node_norm then
|
|
return false, "Error: Unknown node '"..tostring(target_node).."'."
|
|
end
|
|
|
|
return true, mode, target_node_norm, interval, acceleration
|
|
end,
|
|
nodes_needed = function(name)
|
|
return worldedit.volume(worldedit.pos1[name], worldedit.pos2[name])
|
|
end,
|
|
func = function(name, mode, target_node, interval, acceleration)
|
|
local start_time = wea.get_ms_time()
|
|
|
|
local pos1, pos2 = Vector3.sort(worldedit.pos1[name], worldedit.pos2[name])
|
|
|
|
local success, count
|
|
|
|
if mode == "circle" then
|
|
success, count = wea.spiral_circle(
|
|
pos1, pos2,
|
|
target_node,
|
|
interval, acceleration
|
|
)
|
|
if not success then return success, count end
|
|
else
|
|
success, count = wea.spiral_square(
|
|
pos1, pos2,
|
|
target_node,
|
|
interval, acceleration
|
|
)
|
|
if not success then return success, count end
|
|
end
|
|
local time_taken = wea.get_ms_time() - start_time
|
|
|
|
minetest.log("action", name .. " used //spiral at "..pos1.." - "..pos2..", adding " .. count .. " nodes in " .. time_taken .. "s")
|
|
return true, count .. " nodes replaced in " .. wea.format.human_time(time_taken)
|
|
end
|
|
})
|