mirror of
https://github.com/sbrl/Minetest-WorldEditAdditions.git
synced 2024-08-19 21:14:21 +02:00
start working on converting everything to the new utils location
after we've done this, we'll rename utils → lib
This commit is contained in:
parent
6f3118036d
commit
e167fb1536
8
.vscode/settings.json
vendored
Normal file
8
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"Lua.diagnostics.disable": [
|
||||||
|
"trailing-space",
|
||||||
|
"undefined-global",
|
||||||
|
"lowercase-global",
|
||||||
|
"cast-local-type"
|
||||||
|
]
|
||||||
|
}
|
@ -21,7 +21,7 @@ local worldmt_settings = Settings(minetest.get_worldpath().."/world.mt")
|
|||||||
local should_override = worldmt_settings:get_bool("worldeditadditions_override_commands", false)
|
local should_override = worldmt_settings:get_bool("worldeditadditions_override_commands", false)
|
||||||
if should_override then
|
if should_override then
|
||||||
minetest.log("info", "[WorldEditAdditions] Enabling override aliases")
|
minetest.log("info", "[WorldEditAdditions] Enabling override aliases")
|
||||||
worldeditadditions_core.register_alias("copy", "copy+", true)
|
wea_c.register_alias("copy", "copy+", true)
|
||||||
worldeditadditions_core.register_alias("move", "move+", true)
|
wea_c.register_alias("move", "move+", true)
|
||||||
worldeditadditions_core.register_alias("replace", "replacemix", true)
|
wea_c.register_alias("replace", "replacemix", true)
|
||||||
end
|
end
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
|
local wea_c = worldeditadditions_core
|
||||||
|
local wea = worldeditadditions
|
||||||
|
local Vector3 = wea_c.Vector3
|
||||||
|
|
||||||
-- ██████ ██ ██ ███████ ██████ ██ █████ ██ ██
|
-- ██████ ██ ██ ███████ ██████ ██ █████ ██ ██
|
||||||
-- ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
|
-- ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
|
||||||
-- ██ ██ ██ ██ █████ ██████ ██ ███████ ████
|
-- ██ ██ ██ ██ █████ ██████ ██ ███████ ████
|
||||||
@ -9,8 +13,8 @@ worldeditadditions_core.register_command("overlay", {
|
|||||||
privs = { worldedit = true },
|
privs = { worldedit = true },
|
||||||
require_pos = 2,
|
require_pos = 2,
|
||||||
parse = function(params_text)
|
parse = function(params_text)
|
||||||
local success, node_list = worldeditadditions.parse.weighted_nodes(
|
local success, node_list = wea_c.parse.weighted_nodes(
|
||||||
worldeditadditions.split_shell(params_text)
|
wea_c.split_shell(params_text)
|
||||||
)
|
)
|
||||||
return success, node_list
|
return success, node_list
|
||||||
end,
|
end,
|
||||||
@ -20,11 +24,16 @@ worldeditadditions_core.register_command("overlay", {
|
|||||||
return (pos2.x - pos1.x) * (pos2.y - pos1.y)
|
return (pos2.x - pos1.x) * (pos2.y - pos1.y)
|
||||||
end,
|
end,
|
||||||
func = function(name, node_list)
|
func = function(name, node_list)
|
||||||
local start_time = worldeditadditions.get_ms_time()
|
local start_time = wea_c.get_ms_time()
|
||||||
local changes = worldeditadditions.overlay(worldedit.pos1[name], worldedit.pos2[name], node_list)
|
local pos1, pos2 = Vector3.sort(worldedit.pos1[name], worldedit.pos2[name])
|
||||||
local time_taken = worldeditadditions.get_ms_time() - start_time
|
|
||||||
|
|
||||||
minetest.log("action", name .. " used //overlay at " .. worldeditadditions.vector.tostring(worldedit.pos1[name]) .. ", replacing " .. changes.updated .. " nodes and skipping " .. changes.skipped_columns .. " columns in " .. time_taken .. "s")
|
local changes = wea.overlay(
|
||||||
return true, changes.updated .. " nodes replaced and " .. changes.skipped_columns .. " columns skipped in " .. worldeditadditions.format.human_time(time_taken)
|
pos1, pos2,
|
||||||
|
node_list
|
||||||
|
)
|
||||||
|
local time_taken = wea_c.get_ms_time() - start_time
|
||||||
|
|
||||||
|
minetest.log("action", name .. " used //overlay at " .. pos1 .. " - "..pos2..", replacing " .. changes.updated .. " nodes and skipping " .. changes.skipped_columns .. " columns in " .. time_taken .. "s")
|
||||||
|
return true, changes.updated .. " nodes replaced and " .. changes.skipped_columns .. " columns skipped in " .. wea_c.format.human_time(time_taken)
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
@ -1,11 +1,13 @@
|
|||||||
local wea = worldeditadditions
|
local wea = worldeditadditions
|
||||||
|
local wea_c = worldeditadditions_core
|
||||||
|
local Vector3 = wea_c.Vector3
|
||||||
|
|
||||||
-- ██████ ███████ ██████ ██ █████ ██████ ███████ ███ ███ ██ ██ ██
|
-- ██████ ███████ ██████ ██ █████ ██████ ███████ ███ ███ ██ ██ ██
|
||||||
-- ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ████ ████ ██ ██ ██
|
-- ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ████ ████ ██ ██ ██
|
||||||
-- ██████ █████ ██████ ██ ███████ ██ █████ ██ ████ ██ ██ ███
|
-- ██████ █████ ██████ ██ ███████ ██ █████ ██ ████ ██ ██ ███
|
||||||
-- ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
|
-- ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
|
||||||
-- ██ ██ ███████ ██ ███████ ██ ██ ██████ ███████ ██ ██ ██ ██ ██
|
-- ██ ██ ███████ ██ ███████ ██ ██ ██████ ███████ ██ ██ ██ ██ ██
|
||||||
worldeditadditions_core.register_command("replacemix", {
|
wea_c.register_command("replacemix", {
|
||||||
params = "<target_node> [<chance>] <replace_node_a> [<chance_a>] [<replace_node_b> [<chance_b>]] [<replace_node_N> [<chance_N>]] ...",
|
params = "<target_node> [<chance>] <replace_node_a> [<chance_a>] [<replace_node_b> [<chance_b>]] [<replace_node_N> [<chance_N>]] ...",
|
||||||
description = "Replaces target_node with a mix of other nodes. Functions simmilarly to //mix. <chance> is optional and the chance to replace the target node at all. replace_node_a is the node to replace target_node with. If multiple nodes are specified in a space separated list, then when replacing an instance of target_node one is randomly chosen from the list. Just like with //mix, if a positive integer is present after a replace_node, that adds a weighting to that particular node making it more common.",
|
description = "Replaces target_node with a mix of other nodes. Functions simmilarly to //mix. <chance> is optional and the chance to replace the target node at all. replace_node_a is the node to replace target_node with. If multiple nodes are specified in a space separated list, then when replacing an instance of target_node one is randomly chosen from the list. Just like with //mix, if a positive integer is present after a replace_node, that adds a weighting to that particular node making it more common.",
|
||||||
privs = { worldedit = true },
|
privs = { worldedit = true },
|
||||||
@ -15,7 +17,7 @@ worldeditadditions_core.register_command("replacemix", {
|
|||||||
return false, "Error: No arguments specified"
|
return false, "Error: No arguments specified"
|
||||||
end
|
end
|
||||||
|
|
||||||
local parts = wea.split_shell(params_text)
|
local parts = wea_c.split_shell(params_text)
|
||||||
|
|
||||||
local target_node = nil
|
local target_node = nil
|
||||||
local target_node_chance = 1
|
local target_node_chance = 1
|
||||||
@ -30,16 +32,16 @@ worldeditadditions_core.register_command("replacemix", {
|
|||||||
return false, "Error: Invalid target_node name"
|
return false, "Error: Invalid target_node name"
|
||||||
end
|
end
|
||||||
mode = "target_chance"
|
mode = "target_chance"
|
||||||
elseif mode == "target_chance" and wea.parse.chance(part) then
|
elseif mode == "target_chance" and wea_c.parse.chance(part) then
|
||||||
target_node_chance = wea.parse.chance(part)
|
target_node_chance = wea_c.parse.chance(part)
|
||||||
mode = "replace_node"
|
mode = "replace_node"
|
||||||
elseif (mode == "target_chance" and not wea.parse.chance(part, "weight")) or mode == "replace_node" then
|
elseif (mode == "target_chance" and not wea_c.parse.chance(part, "weight")) or mode == "replace_node" then
|
||||||
mode = "replace_node"
|
mode = "replace_node"
|
||||||
if wea.parse.chance(part, "weight") then
|
if wea_c.parse.chance(part, "weight") then
|
||||||
if not last_node_name then
|
if not last_node_name then
|
||||||
return false, "Error: No previous node name was found (this is a probably a bug)."
|
return false, "Error: No previous node name was found (this is a probably a bug)."
|
||||||
end
|
end
|
||||||
replace_nodes[last_node_name] = math.floor(wea.parse.chance(part, "weight"))
|
replace_nodes[last_node_name] = math.floor(wea_c.parse.chance(part, "weight"))
|
||||||
else
|
else
|
||||||
if last_node_name and not replace_nodes[last_node_name] then
|
if last_node_name and not replace_nodes[last_node_name] then
|
||||||
replace_nodes[last_node_name] = 1
|
replace_nodes[last_node_name] = 1
|
||||||
@ -67,9 +69,10 @@ worldeditadditions_core.register_command("replacemix", {
|
|||||||
return worldedit.volume(worldedit.pos1[name], worldedit.pos2[name])
|
return worldedit.volume(worldedit.pos1[name], worldedit.pos2[name])
|
||||||
end,
|
end,
|
||||||
func = function(name, target_node, target_node_chance, replace_nodes)
|
func = function(name, target_node, target_node_chance, replace_nodes)
|
||||||
local start_time = worldeditadditions.get_ms_time()
|
local start_time = wea_c.get_ms_time()
|
||||||
|
local pos1, pos2 = Vector3.sort(worldedit.pos1[name], worldedit.pos2[name])
|
||||||
|
|
||||||
local success, changed, candidates, distribution = worldeditadditions.replacemix(
|
local success, changed, candidates, distribution = wea.replacemix(
|
||||||
worldedit.pos1[name], worldedit.pos2[name],
|
worldedit.pos1[name], worldedit.pos2[name],
|
||||||
target_node,
|
target_node,
|
||||||
target_node_chance,
|
target_node_chance,
|
||||||
@ -79,19 +82,19 @@ worldeditadditions_core.register_command("replacemix", {
|
|||||||
return success, changed
|
return success, changed
|
||||||
end
|
end
|
||||||
|
|
||||||
local nodes_total = worldedit.volume(worldedit.pos1[name], worldedit.pos2[name])
|
local nodes_total = worldedit.volume(pos1, pos2)
|
||||||
local percentage_replaced = worldeditadditions.round((changed / candidates)*100, 2)
|
local percentage_replaced = wea_c.round((changed / candidates)*100, 2)
|
||||||
local distribution_table = worldeditadditions.format.node_distribution(
|
local distribution_table = wea_c.format.node_distribution(
|
||||||
distribution,
|
distribution,
|
||||||
changed,
|
changed,
|
||||||
true -- Add a grand total to the bottom
|
true -- Add a grand total to the bottom
|
||||||
)
|
)
|
||||||
|
|
||||||
local time_taken = worldeditadditions.get_ms_time() - start_time
|
local time_taken = wea_c.get_ms_time() - start_time
|
||||||
|
|
||||||
|
|
||||||
minetest.log("action", name .. " used //replacemix at "..worldeditadditions.vector.tostring(worldedit.pos1[name]).." - "..worldeditadditions.vector.tostring(worldedit.pos2[name])..", replacing " .. changed.." nodes (out of "..nodes_total.." nodes) in "..time_taken.."s")
|
minetest.log("action", name .. " used //replacemix at "..pos1.." - "..pos2..", replacing " .. changed.." nodes (out of "..nodes_total.." nodes) in "..time_taken.."s")
|
||||||
|
|
||||||
return true, distribution_table..changed.." out of "..candidates.." (~"..percentage_replaced.."%) candidates replaced in "..worldeditadditions.format.human_time(time_taken)
|
return true, distribution_table..changed.." out of "..candidates.." (~"..percentage_replaced.."%) candidates replaced in "..wea_c.format.human_time(time_taken)
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
@ -1,8 +1,12 @@
|
|||||||
|
local wea = worldeditadditions
|
||||||
|
local wea_c = worldeditadditions_core
|
||||||
|
local Vector3 = wea_c.Vector3
|
||||||
|
|
||||||
local function parse_scale_component(val)
|
local function parse_scale_component(val)
|
||||||
local result = tonumber(val)
|
local result = tonumber(val)
|
||||||
if result then return true, result end
|
if result then return true, result end
|
||||||
if string.find(val, "/") then
|
if string.find(val, "/") then
|
||||||
local parts = worldeditadditions.split(val, "/", true)
|
local parts = wea_c.split(val, "/", true)
|
||||||
local a = tonumber(parts[1])
|
local a = tonumber(parts[1])
|
||||||
local b = tonumber(parts[2])
|
local b = tonumber(parts[2])
|
||||||
if not b then return false, "Invalid number after the forward slash in scale component." end
|
if not b then return false, "Invalid number after the forward slash in scale component." end
|
||||||
@ -22,7 +26,7 @@ end
|
|||||||
-- ███████ ██ ███████ ██ █████
|
-- ███████ ██ ███████ ██ █████
|
||||||
-- ██ ██ ██ ██ ██ ██
|
-- ██ ██ ██ ██ ██ ██
|
||||||
-- ███████ ██████ ██ ██ ███████ ███████
|
-- ███████ ██████ ██ ██ ███████ ███████
|
||||||
worldeditadditions_core.register_command("scale", {
|
wea_c.register_command("scale", {
|
||||||
params = "<axis> <scale_factor> | <factor_x> [<factor_y> <factor_z> [<anchor_x> <anchor_y> <anchor_z>]]",
|
params = "<axis> <scale_factor> | <factor_x> [<factor_y> <factor_z> [<anchor_x> <anchor_y> <anchor_z>]]",
|
||||||
description = "Combined scale up / down. Takes either an axis name + a scale factor (e.g. y 3 or -z 2; negative values swap the anchor point for the scale operation), or 3 scale factor values for x, y, and z respectively. In the latter mode, a set of anchors can also be specified, which indicate which size the scale operation should be anchored to.",
|
description = "Combined scale up / down. Takes either an axis name + a scale factor (e.g. y 3 or -z 2; negative values swap the anchor point for the scale operation), or 3 scale factor values for x, y, and z respectively. In the latter mode, a set of anchors can also be specified, which indicate which size the scale operation should be anchored to.",
|
||||||
privs = { worldedit = true },
|
privs = { worldedit = true },
|
||||||
@ -30,10 +34,10 @@ worldeditadditions_core.register_command("scale", {
|
|||||||
parse = function(params_text)
|
parse = function(params_text)
|
||||||
if not params_text then params_text = "" end
|
if not params_text then params_text = "" end
|
||||||
|
|
||||||
local parts = worldeditadditions.split_shell(params_text)
|
local parts = wea_c.split_shell(params_text)
|
||||||
|
|
||||||
local scale = vector.new(1, 1, 1)
|
local scale = Vector3.new(1, 1, 1)
|
||||||
local anchor = vector.new(1, 1, 1)
|
local anchor = Vector3.new(1, 1, 1)
|
||||||
|
|
||||||
if #parts == 2 then
|
if #parts == 2 then
|
||||||
if not (parts[1] == "x" or parts[1] == "y" or parts[1] == "z"
|
if not (parts[1] == "x" or parts[1] == "y" or parts[1] == "z"
|
||||||
@ -48,7 +52,7 @@ worldeditadditions_core.register_command("scale", {
|
|||||||
axis = axis:sub(2, 2)
|
axis = axis:sub(2, 2)
|
||||||
anchor[axis] = -1
|
anchor[axis] = -1
|
||||||
end
|
end
|
||||||
|
-- BUG: POTENTIAL BUG HERE
|
||||||
scale[axis] = factor
|
scale[axis] = factor
|
||||||
elseif #parts >= 3 then
|
elseif #parts >= 3 then
|
||||||
local success, val = parse_scale_component(parts[1])
|
local success, val = parse_scale_component(parts[1])
|
||||||
@ -102,14 +106,13 @@ worldeditadditions_core.register_command("scale", {
|
|||||||
return volume * factor
|
return volume * factor
|
||||||
end,
|
end,
|
||||||
func = function(name, scale, anchor)
|
func = function(name, scale, anchor)
|
||||||
-- print("initial scale: "..worldeditadditions.vector.tostring(scale)..", anchor: "..worldeditadditions.vector.tostring(anchor))
|
|
||||||
|
|
||||||
|
local start_time = wea_c.get_ms_time()
|
||||||
|
|
||||||
local start_time = worldeditadditions.get_ms_time()
|
local pos1, pos2 = Vector3.sort(worldedit.pos1[name], worldedit.pos2[name])
|
||||||
|
|
||||||
local success, stats = worldeditadditions.scale(
|
local success, stats = wea.scale(
|
||||||
worldedit.pos1[name],
|
pos1, pos2,
|
||||||
worldedit.pos2[name],
|
|
||||||
scale, anchor
|
scale, anchor
|
||||||
)
|
)
|
||||||
if not success then return success, stats end
|
if not success then return success, stats end
|
||||||
@ -118,10 +121,10 @@ worldeditadditions_core.register_command("scale", {
|
|||||||
worldedit.pos2[name] = stats.pos2
|
worldedit.pos2[name] = stats.pos2
|
||||||
worldedit.marker_update(name)
|
worldedit.marker_update(name)
|
||||||
|
|
||||||
local time_taken = worldeditadditions.get_ms_time() - start_time
|
local time_taken = wea_c.get_ms_time() - start_time
|
||||||
|
|
||||||
|
|
||||||
minetest.log("action", name.." used //scale at "..worldeditadditions.vector.tostring(worldedit.pos1[name]).." - "..worldeditadditions.vector.tostring(worldedit.pos2[name])..", updating "..stats.updated.." nodes in "..time_taken.."s")
|
minetest.log("action", name.." used //scale at "..pos1.." - "..pos2..", updating "..stats.updated.." nodes in "..time_taken.."s")
|
||||||
return true, stats.updated.." nodes updated in " .. worldeditadditions.format.human_time(time_taken)
|
return true, stats.updated.." nodes updated in " .. wea_c.format.human_time(time_taken)
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
local we_c = worldeditadditions_commands
|
local wea_c = worldeditadditions_core
|
||||||
local wea = worldeditadditions
|
local wea = worldeditadditions
|
||||||
local Vector3 = wea.Vector3
|
local wea_cmd = worldeditadditions_commands
|
||||||
|
local Vector3 = wea_c.Vector3
|
||||||
|
|
||||||
-- ███████ ██████ ██ ██ ██ ██████ ████████
|
-- ███████ ██████ ██ ██ ██ ██████ ████████
|
||||||
-- ██ ██ ██ ██ ██ ██ ██ ██
|
-- ██ ██ ██ ██ ██ ██ ██ ██
|
||||||
@ -17,7 +18,7 @@ worldeditadditions_core.register_command("sculpt", {
|
|||||||
params_text = "circle_soft1"
|
params_text = "circle_soft1"
|
||||||
end
|
end
|
||||||
|
|
||||||
local parts = wea.split_shell(params_text)
|
local parts = wea_c.split_shell(params_text)
|
||||||
|
|
||||||
local brush_name = "circle_soft1"
|
local brush_name = "circle_soft1"
|
||||||
local height = 5
|
local height = 5
|
||||||
@ -53,25 +54,25 @@ worldeditadditions_core.register_command("sculpt", {
|
|||||||
-- This solution allows for brushes with negative values
|
-- This solution allows for brushes with negative values
|
||||||
-- it also allows for brushes that 'break the rules' and have values
|
-- it also allows for brushes that 'break the rules' and have values
|
||||||
-- that exceed the -1 to 1 range
|
-- that exceed the -1 to 1 range
|
||||||
local brush_min = wea.min(brush)
|
local brush_min = wea_c.min(brush)
|
||||||
local brush_max = wea.max(brush)
|
local brush_max = wea_c.max(brush)
|
||||||
local range_nodes = (brush_max * height) - (brush_min * height)
|
local range_nodes = (brush_max * height) - (brush_min * height)
|
||||||
|
|
||||||
return size_actual.x * size_actual.y * range_nodes
|
return size_actual.x * size_actual.y * range_nodes
|
||||||
end,
|
end,
|
||||||
func = function(name, brush_name, height, brush_size)
|
func = function(name, brush_name, height, brush_size)
|
||||||
local start_time = wea.get_ms_time()
|
local start_time = wea_c.get_ms_time()
|
||||||
|
|
||||||
local pos1 = wea.Vector3.clone(worldedit.pos1[name])
|
local pos1 = wea_c.Vector3.clone(worldedit.pos1[name])
|
||||||
local success, stats = wea.sculpt.apply(
|
local success, stats = wea.sculpt.apply(
|
||||||
pos1,
|
pos1,
|
||||||
brush_name, height, brush_size
|
brush_name, height, brush_size
|
||||||
)
|
)
|
||||||
if not success then return success, stats.added end
|
if not success then return success, stats.added end
|
||||||
|
|
||||||
local time_taken = wea.get_ms_time() - start_time
|
local time_taken = wea_c.get_ms_time() - start_time
|
||||||
|
|
||||||
minetest.log("action", name .. " used //sculpt at "..pos1..", adding " .. stats.added.." nodes and removing "..stats.removed.." nodes in "..time_taken.."s")
|
minetest.log("action", name .. " used //sculpt at "..pos1..", adding " .. stats.added.." nodes and removing "..stats.removed.." nodes in "..time_taken.."s")
|
||||||
return true, stats.added.." nodes added and "..stats.removed.." removed in "..wea.format.human_time(time_taken)
|
return true, stats.added.." nodes added and "..stats.removed.." removed in "..wea_c.format.human_time(time_taken)
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
@ -1,18 +1,18 @@
|
|||||||
|
|
||||||
local wea = worldeditadditions
|
local wea_c = worldeditadditions_core
|
||||||
local Vector3 = wea.Vector3
|
local Vector3 = wea_c.Vector3
|
||||||
|
|
||||||
worldeditadditions_core.register_command("spiral2", {
|
wea_c.register_command("spiral2", {
|
||||||
params = "[circle|square] [<replace_node=dirt> [<interval=3> [<acceleration=0>] ] ]",
|
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.",
|
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 },
|
privs = { worldedit = true },
|
||||||
require_pos = 2,
|
require_pos = 2,
|
||||||
parse = function(params_text)
|
parse = function(params_text)
|
||||||
if not params_text then params_text = "" end
|
if not params_text then params_text = "" end
|
||||||
params_text = wea.trim(params_text)
|
params_text = wea_c.trim(params_text)
|
||||||
if params_text == "" then return true, "square", "dirt", 3, 0 end
|
if params_text == "" then return true, "square", "dirt", 3, 0 end
|
||||||
|
|
||||||
local parts = wea.split_shell(params_text)
|
local parts = wea_c.split_shell(params_text)
|
||||||
|
|
||||||
local mode = "square"
|
local mode = "square"
|
||||||
local target_node = "dirt"
|
local target_node = "dirt"
|
||||||
@ -59,30 +59,30 @@ worldeditadditions_core.register_command("spiral2", {
|
|||||||
return worldedit.volume(worldedit.pos1[name], worldedit.pos2[name])
|
return worldedit.volume(worldedit.pos1[name], worldedit.pos2[name])
|
||||||
end,
|
end,
|
||||||
func = function(name, mode, target_node, interval, acceleration)
|
func = function(name, mode, target_node, interval, acceleration)
|
||||||
local start_time = wea.get_ms_time()
|
local start_time = wea_c.get_ms_time()
|
||||||
|
|
||||||
local pos1, pos2 = Vector3.sort(worldedit.pos1[name], worldedit.pos2[name])
|
local pos1, pos2 = Vector3.sort(worldedit.pos1[name], worldedit.pos2[name])
|
||||||
|
|
||||||
local success, count
|
local success, count
|
||||||
|
|
||||||
if mode == "circle" then
|
if mode == "circle" then
|
||||||
success, count = wea.spiral_circle(
|
success, count = worldeditadditions.spiral_circle(
|
||||||
pos1, pos2,
|
pos1, pos2,
|
||||||
target_node,
|
target_node,
|
||||||
interval, acceleration
|
interval, acceleration
|
||||||
)
|
)
|
||||||
if not success then return success, count end
|
if not success then return success, count end
|
||||||
else
|
else
|
||||||
success, count = wea.spiral_square(
|
success, count = worldeditadditions.spiral_square(
|
||||||
pos1, pos2,
|
pos1, pos2,
|
||||||
target_node,
|
target_node,
|
||||||
interval, acceleration
|
interval, acceleration
|
||||||
)
|
)
|
||||||
if not success then return success, count end
|
if not success then return success, count end
|
||||||
end
|
end
|
||||||
local time_taken = wea.get_ms_time() - start_time
|
local time_taken = wea_c.get_ms_time() - start_time
|
||||||
|
|
||||||
minetest.log("action", name .. " used //spiral at "..pos1.." - "..pos2..", adding " .. count .. " nodes in " .. time_taken .. "s")
|
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)
|
return true, count .. " nodes replaced in " .. wea_c.format.human_time(time_taken)
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
@ -1,10 +1,14 @@
|
|||||||
|
local wea_c = worldeditadditions_core
|
||||||
|
local Vector3 = wea_c.Vector3
|
||||||
|
|
||||||
|
|
||||||
-- ████████ ██████ ██████ ██ ██ ███████
|
-- ████████ ██████ ██████ ██ ██ ███████
|
||||||
-- ██ ██ ██ ██ ██ ██ ██ ██
|
-- ██ ██ ██ ██ ██ ██ ██ ██
|
||||||
-- ██ ██ ██ ██████ ██ ██ ███████
|
-- ██ ██ ██ ██████ ██ ██ ███████
|
||||||
-- ██ ██ ██ ██ ██ ██ ██ ██
|
-- ██ ██ ██ ██ ██ ██ ██ ██
|
||||||
-- ██ ██████ ██ ██ ██████ ███████
|
-- ██ ██████ ██ ██ ██████ ███████
|
||||||
local function parse_params_torus(params_text)
|
local function parse_params_torus(params_text)
|
||||||
local parts = worldeditadditions.split_shell(params_text)
|
local parts = wea_c.split_shell(params_text)
|
||||||
|
|
||||||
if #parts < 1 then
|
if #parts < 1 then
|
||||||
return false, "Error: No replace_node specified."
|
return false, "Error: No replace_node specified."
|
||||||
@ -59,24 +63,25 @@ worldeditadditions_core.register_command("torus", {
|
|||||||
require_pos = 1,
|
require_pos = 1,
|
||||||
parse = function(params_text)
|
parse = function(params_text)
|
||||||
local values = {parse_params_torus(params_text)}
|
local values = {parse_params_torus(params_text)}
|
||||||
return worldeditadditions.table.unpack(values)
|
return wea_c.table.unpack(values)
|
||||||
end,
|
end,
|
||||||
nodes_needed = function(name, target_node, major_radius, minor_radius)
|
nodes_needed = function(name, target_node, major_radius, minor_radius)
|
||||||
return math.ceil(2 * math.pi*math.pi * major_radius * minor_radius*minor_radius)
|
return math.ceil(2 * math.pi*math.pi * major_radius * minor_radius*minor_radius)
|
||||||
end,
|
end,
|
||||||
func = function(name, target_node, major_radius, minor_radius, axes, hollow)
|
func = function(name, target_node, major_radius, minor_radius, axes, hollow)
|
||||||
local start_time = worldeditadditions.get_ms_time()
|
local start_time = wea_c.get_ms_time()
|
||||||
|
local pos1 = Vector3.clone(worldedit.pos1[name])
|
||||||
local replaced = worldeditadditions.torus(
|
local replaced = worldeditadditions.torus(
|
||||||
worldedit.pos1[name],
|
pos1,
|
||||||
major_radius, minor_radius,
|
major_radius, minor_radius,
|
||||||
target_node,
|
target_node,
|
||||||
axes,
|
axes,
|
||||||
hollow
|
hollow
|
||||||
)
|
)
|
||||||
local time_taken = worldeditadditions.get_ms_time() - start_time
|
local time_taken = wea_c.get_ms_time() - start_time
|
||||||
|
|
||||||
minetest.log("action", name .. " used //torus at " .. worldeditadditions.vector.tostring(worldedit.pos1[name]) .. ", replacing " .. replaced .. " nodes in " .. time_taken .. "s")
|
minetest.log("action", name .. " used //torus at " .. pos1 .. ", replacing " .. replaced .. " nodes in " .. time_taken .. "s")
|
||||||
return true, replaced .. " nodes replaced in " .. worldeditadditions.format.human_time(time_taken)
|
return true, replaced .. " nodes replaced in " .. wea_c.format.human_time(time_taken)
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
local wea_c = worldeditadditions_core
|
||||||
|
local Vector3 = wea_c.Vector3
|
||||||
|
|
||||||
-- ██ ██ █████ ██ ██ ███████
|
-- ██ ██ █████ ██ ██ ███████
|
||||||
-- ██ ██ ██ ██ ██ ██ ██
|
-- ██ ██ ██ ██ ██ ██ ██
|
||||||
-- ██ █ ██ ███████ ██ ██ ███████
|
-- ██ █ ██ ███████ ██ ██ ███████
|
||||||
@ -10,7 +13,7 @@ worldeditadditions_core.register_command("walls", {
|
|||||||
require_pos = 2,
|
require_pos = 2,
|
||||||
parse = function(params_text)
|
parse = function(params_text)
|
||||||
if not params_text or params_text == "" then params_text = "dirt" end
|
if not params_text or params_text == "" then params_text = "dirt" end
|
||||||
local parts = worldeditadditions.split_shell(params_text)
|
local parts = wea_c.split_shell(params_text)
|
||||||
|
|
||||||
local target_node
|
local target_node
|
||||||
local thickness = 1
|
local thickness = 1
|
||||||
@ -42,14 +45,16 @@ worldeditadditions_core.register_command("walls", {
|
|||||||
return worldedit.volume(pos1, pos2) - worldedit.volume(pos1, pos3)
|
return worldedit.volume(pos1, pos2) - worldedit.volume(pos1, pos3)
|
||||||
end,
|
end,
|
||||||
func = function(name, target_node, thickness)
|
func = function(name, target_node, thickness)
|
||||||
local start_time = worldeditadditions.get_ms_time()
|
local start_time = wea_c.get_ms_time()
|
||||||
local success, replaced = worldeditadditions.walls(
|
local pos1, pos2 = Vector3.sort(worldedit.pos1[name], worldedit.pos2[name])
|
||||||
worldedit.pos1[name], worldedit.pos2[name],
|
|
||||||
|
local success, replaced = wea_c.walls(
|
||||||
|
pos1, pos2,
|
||||||
target_node, thickness
|
target_node, thickness
|
||||||
)
|
)
|
||||||
local time_taken = worldeditadditions.get_ms_time() - start_time
|
local time_taken = wea_c.get_ms_time() - start_time
|
||||||
|
|
||||||
minetest.log("action", name .. " used //walls from "..worldeditadditions.vector.tostring(worldedit.pos1[name]).." to "..worldeditadditions.vector.tostring(worldedit.pos1[name])..", replacing " .. replaced .. " nodes in " .. time_taken .. "s")
|
minetest.log("action", name .. " used //walls from "..pos1.." to "..pos2..", replacing " .. replaced .. " nodes in " .. time_taken .. "s")
|
||||||
return true, replaced .. " nodes replaced in " .. worldeditadditions.format.human_time(time_taken)
|
return true, replaced .. " nodes replaced in " .. wea_c.format.human_time(time_taken)
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
-- Long-form article descriptions: Chat-Command-Reference.md
|
-- Long-form article descriptions: Chat-Command-Reference.md
|
||||||
-- Short descriptions: Undecided, but maybe from the registered command definition?
|
-- Short descriptions: Undecided, but maybe from the registered command definition?
|
||||||
|
|
||||||
worldeditadditions.doc = {}
|
worldeditadditions.doc = {
|
||||||
|
parse_reference = dofile(worldeditadditions_commands.modpath.."/doc/parse_reference.lua")
|
||||||
|
}
|
||||||
|
|
||||||
dofile(worldeditadditions_commands.modpath.."/doc/parse_reference.lua")
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
|
local wea_c = worldeditadditions_core
|
||||||
|
|
||||||
local function get_reference()
|
local function get_reference()
|
||||||
local lines = {}
|
local lines = {}
|
||||||
for line in io.lines(worldeditadditions_commands.modpath.."/Chat-Command-Reference.md") do
|
for line in io.lines(wea_c.modpath.."/Chat-Command-Reference.md") do
|
||||||
table.insert(lines, line)
|
table.insert(lines, line)
|
||||||
end
|
end
|
||||||
return lines
|
return lines
|
||||||
@ -13,7 +13,7 @@ local function group_by_heading(lines, max_level)
|
|||||||
local acc = {}
|
local acc = {}
|
||||||
|
|
||||||
for i,line in ipairs(lines) do
|
for i,line in ipairs(lines) do
|
||||||
if worldeditadditions.str_starts(line, "#") then
|
if wea_c.str_starts(line, "#") then
|
||||||
local _, _, heading, headingtext = line:find("(#+)%s*(.*)")
|
local _, _, heading, headingtext = line:find("(#+)%s*(.*)")
|
||||||
if #heading <= max_level then
|
if #heading <= max_level then
|
||||||
table.insert(groups, {
|
table.insert(groups, {
|
||||||
@ -30,9 +30,9 @@ local function group_by_heading(lines, max_level)
|
|||||||
return groups
|
return groups
|
||||||
end
|
end
|
||||||
|
|
||||||
function worldeditadditions.doc.parse_reference()
|
local function parse_reference()
|
||||||
local lines = get_reference()
|
local lines = get_reference()
|
||||||
local headings = worldeditadditions.table.filter(
|
local headings = wea_c.table.filter(
|
||||||
group_by_heading(lines, 2),
|
group_by_heading(lines, 2),
|
||||||
function(item, i) return item.level ~= 2 end
|
function(item, i) return item.level ~= 2 end
|
||||||
)
|
)
|
||||||
@ -41,5 +41,4 @@ function worldeditadditions.doc.parse_reference()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
return parse_reference
|
||||||
worldeditadditions.doc.parse_reference()
|
|
||||||
|
@ -6,63 +6,57 @@
|
|||||||
-- @author Starbeamrainbowlabs
|
-- @author Starbeamrainbowlabs
|
||||||
|
|
||||||
worldeditadditions_commands = {}
|
worldeditadditions_commands = {}
|
||||||
local we_c = worldeditadditions_commands
|
local wea_cmd = worldeditadditions_commands
|
||||||
|
|
||||||
we_c.modpath = minetest.get_modpath("worldeditadditions_commands")
|
wea_cmd.modpath = minetest.get_modpath("worldeditadditions_commands")
|
||||||
|
|
||||||
dofile(we_c.modpath.."/player_notify_suppress.lua")
|
dofile(wea_cmd.modpath.."/player_notify_suppress.lua")
|
||||||
|
|
||||||
|
|
||||||
|
dofile(wea_cmd.modpath.."/commands/convolve.lua")
|
||||||
-- We no longer need our own implementation of safe_region thanks to @sfan5's
|
dofile(wea_cmd.modpath.."/commands/ellipsoid.lua")
|
||||||
-- suggestion in issue #5 - yay!
|
dofile(wea_cmd.modpath.."/commands/ellipsoid2.lua")
|
||||||
-- we_c.safe_region, we_c.check_region, we_c.reset_pending
|
dofile(wea_cmd.modpath.."/commands/erode.lua")
|
||||||
-- = dofile(we_c.modpath.."/safe.lua")
|
dofile(wea_cmd.modpath.."/commands/fillcaves.lua")
|
||||||
|
dofile(wea_cmd.modpath.."/commands/floodfill.lua")
|
||||||
dofile(we_c.modpath.."/commands/convolve.lua")
|
dofile(wea_cmd.modpath.."/commands/hollow.lua")
|
||||||
dofile(we_c.modpath.."/commands/ellipsoid.lua")
|
dofile(wea_cmd.modpath.."/commands/layers.lua")
|
||||||
dofile(we_c.modpath.."/commands/ellipsoid2.lua")
|
dofile(wea_cmd.modpath.."/commands/line.lua")
|
||||||
dofile(we_c.modpath.."/commands/erode.lua")
|
dofile(wea_cmd.modpath.."/commands/maze.lua")
|
||||||
dofile(we_c.modpath.."/commands/fillcaves.lua")
|
dofile(wea_cmd.modpath.."/commands/noise2d.lua")
|
||||||
dofile(we_c.modpath.."/commands/floodfill.lua")
|
dofile(wea_cmd.modpath.."/commands/overlay.lua")
|
||||||
dofile(we_c.modpath.."/commands/hollow.lua")
|
dofile(wea_cmd.modpath.."/commands/replacemix.lua")
|
||||||
dofile(we_c.modpath.."/commands/layers.lua")
|
dofile(wea_cmd.modpath.."/commands/scale.lua")
|
||||||
dofile(we_c.modpath.."/commands/line.lua")
|
dofile(wea_cmd.modpath.."/commands/torus.lua")
|
||||||
dofile(we_c.modpath.."/commands/maze.lua")
|
dofile(wea_cmd.modpath.."/commands/walls.lua")
|
||||||
dofile(we_c.modpath.."/commands/noise2d.lua")
|
dofile(wea_cmd.modpath.."/commands/spiral2.lua")
|
||||||
dofile(we_c.modpath.."/commands/overlay.lua")
|
dofile(wea_cmd.modpath.."/commands/copy.lua")
|
||||||
dofile(we_c.modpath.."/commands/replacemix.lua")
|
dofile(wea_cmd.modpath.."/commands/move.lua")
|
||||||
dofile(we_c.modpath.."/commands/scale.lua")
|
dofile(wea_cmd.modpath.."/commands/dome.lua")
|
||||||
dofile(we_c.modpath.."/commands/torus.lua")
|
dofile(wea_cmd.modpath.."/commands/metaball.lua")
|
||||||
dofile(we_c.modpath.."/commands/walls.lua")
|
dofile(wea_cmd.modpath.."/commands/count.lua")
|
||||||
dofile(we_c.modpath.."/commands/spiral2.lua")
|
dofile(wea_cmd.modpath.."/commands/sculpt.lua")
|
||||||
dofile(we_c.modpath.."/commands/copy.lua")
|
|
||||||
dofile(we_c.modpath.."/commands/move.lua")
|
|
||||||
dofile(we_c.modpath.."/commands/dome.lua")
|
|
||||||
dofile(we_c.modpath.."/commands/metaball.lua")
|
|
||||||
dofile(we_c.modpath.."/commands/count.lua")
|
|
||||||
dofile(we_c.modpath.."/commands/sculpt.lua")
|
|
||||||
|
|
||||||
-- Meta Commands
|
-- Meta Commands
|
||||||
dofile(we_c.modpath.."/commands/meta/init.lua")
|
dofile(wea_cmd.modpath.."/commands/meta/init.lua")
|
||||||
|
|
||||||
-- Selection Tools
|
-- Selection Tools
|
||||||
dofile(we_c.modpath.."/commands/selectors/init.lua")
|
dofile(wea_cmd.modpath.."/commands/selectors/init.lua")
|
||||||
|
|
||||||
-- Measure Tools
|
-- Measure Tools
|
||||||
dofile(we_c.modpath.."/commands/measure/init.lua")
|
dofile(wea_cmd.modpath.."/commands/measure/init.lua")
|
||||||
|
|
||||||
-- Wireframe
|
-- Wireframe
|
||||||
dofile(we_c.modpath.."/commands/wireframe/init.lua")
|
dofile(wea_cmd.modpath.."/commands/wireframe/init.lua")
|
||||||
|
|
||||||
dofile(we_c.modpath.."/commands/extra/saplingaliases.lua")
|
dofile(wea_cmd.modpath.."/commands/extra/saplingaliases.lua")
|
||||||
dofile(we_c.modpath.."/commands/extra/basename.lua")
|
dofile(wea_cmd.modpath.."/commands/extra/basename.lua")
|
||||||
dofile(we_c.modpath.."/commands/extra/sculptlist.lua")
|
dofile(wea_cmd.modpath.."/commands/extra/sculptlist.lua")
|
||||||
|
|
||||||
-- Don't register the //bonemeal command if the bonemeal mod isn't present
|
-- Don't register the //bonemeal command if the bonemeal mod isn't present
|
||||||
if minetest.global_exists("bonemeal") then
|
if minetest.global_exists("bonemeal") then
|
||||||
dofile(we_c.modpath.."/commands/bonemeal.lua")
|
dofile(wea_cmd.modpath.."/commands/bonemeal.lua")
|
||||||
dofile(we_c.modpath.."/commands/forest.lua")
|
dofile(wea_cmd.modpath.."/commands/forest.lua")
|
||||||
else
|
else
|
||||||
minetest.log("action", "[WorldEditAdditions] bonemeal mod not detected: //bonemeal and //forest commands not registered (if you see this message and you're using an alternative mod that provides bonemeal, please get in touch by opening an issue)")
|
minetest.log("action", "[WorldEditAdditions] bonemeal mod not detected: //bonemeal and //forest commands not registered (if you see this message and you're using an alternative mod that provides bonemeal, please get in touch by opening an issue)")
|
||||||
end
|
end
|
||||||
@ -80,4 +74,4 @@ end
|
|||||||
-- end
|
-- end
|
||||||
|
|
||||||
|
|
||||||
dofile(we_c.modpath.."/aliases.lua")
|
dofile(wea_cmd.modpath.."/aliases.lua")
|
||||||
|
@ -1,68 +0,0 @@
|
|||||||
local safe_region_callback = {}
|
|
||||||
local safe_region_param = {}
|
|
||||||
|
|
||||||
worldeditadditions._override_safe_regions = false -- internal use ONLY!
|
|
||||||
|
|
||||||
local function check_region(name, param)
|
|
||||||
local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] --obtain positions
|
|
||||||
if pos1 == nil or pos2 == nil then
|
|
||||||
worldedit.player_notify(name, "no region selected")
|
|
||||||
return nil
|
|
||||||
end
|
|
||||||
return worldedit.volume(pos1, pos2)
|
|
||||||
end
|
|
||||||
|
|
||||||
--`callback` is a callback to run when the user confirms
|
|
||||||
--`nodes_needed` is a function accepting `param`, `pos1`, and `pos2` to calculate the number of nodes needed
|
|
||||||
local function safe_region(callback, nodes_needed)
|
|
||||||
--default node volume calculation
|
|
||||||
nodes_needed = nodes_needed or check_region
|
|
||||||
|
|
||||||
return function(name, param)
|
|
||||||
--check if the operation applies to a safe number of nodes
|
|
||||||
local count = nodes_needed(name, param)
|
|
||||||
if count == nil then return end --invalid command
|
|
||||||
if worldeditadditions._override_safe_regions or count < 10000 then
|
|
||||||
return callback(name, param)
|
|
||||||
end
|
|
||||||
|
|
||||||
--save callback to call later
|
|
||||||
safe_region_callback[name], safe_region_param[name] = callback, param
|
|
||||||
worldedit.player_notify(name, "WARNING: this operation could affect up to " .. count .. " nodes; type //yy to continue or //nn to cancel")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function reset_pending(name)
|
|
||||||
safe_region_callback[name], safe_region_param[name] = nil, nil
|
|
||||||
end
|
|
||||||
|
|
||||||
minetest.register_chatcommand("/yy", {
|
|
||||||
params = "",
|
|
||||||
description = "Confirm a pending operation",
|
|
||||||
func = function(name)
|
|
||||||
local callback, param = safe_region_callback[name], safe_region_param[name]
|
|
||||||
if not callback then
|
|
||||||
worldedit.player_notify(name, "no operation pending")
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
reset_pending(name)
|
|
||||||
callback(name, param)
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_chatcommand("/nn", {
|
|
||||||
params = "",
|
|
||||||
description = "Abort a pending operation",
|
|
||||||
func = function(name)
|
|
||||||
if not safe_region_callback[name] then
|
|
||||||
worldedit.player_notify(name, "no operation pending")
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
reset_pending(name)
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
return safe_region, check_region, reset_pending
|
|
@ -6,7 +6,7 @@ local human_size = wea_c.format.human_size
|
|||||||
-- TODO: Reimplement worldedit.player_notify(player_name, msg_text)
|
-- TODO: Reimplement worldedit.player_notify(player_name, msg_text)
|
||||||
|
|
||||||
local function run_command_stage2(player_name, func, parse_result)
|
local function run_command_stage2(player_name, func, parse_result)
|
||||||
local success, result_message = func(player_name, unpack(parse_result))
|
local success, result_message = func(player_name, wea_c.table.unpack(parse_result))
|
||||||
if result_message then
|
if result_message then
|
||||||
-- TODO: If we were unsuccessfull, then colour the message red
|
-- TODO: If we were unsuccessfull, then colour the message red
|
||||||
worldedit.player_notify(player_name, result_message)
|
worldedit.player_notify(player_name, result_message)
|
||||||
@ -31,7 +31,7 @@ local function run_command(cmdname, options, player_name, paramtext)
|
|||||||
end
|
end
|
||||||
|
|
||||||
if options.nodes_needed then
|
if options.nodes_needed then
|
||||||
local potential_changes = options.nodes_needed(player_name, unpack(parse_result))
|
local potential_changes = options.nodes_needed(player_name, wea_c.table.unpack(parse_result))
|
||||||
|
|
||||||
local limit = wea_c.safe_region_limit_default
|
local limit = wea_c.safe_region_limit_default
|
||||||
if wea_c.safe_region_limits[player_name] then
|
if wea_c.safe_region_limits[player_name] then
|
||||||
|
@ -389,6 +389,7 @@ function Vector3.fromBearing(angle_x, angle_y, length)
|
|||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- TODO: Implement .volume() here
|
||||||
|
|
||||||
|
|
||||||
-- ██████ ██████ ███████ ██████ █████ ████████ ██████ ██████
|
-- ██████ ██████ ███████ ██████ █████ ████████ ██████ ██████
|
||||||
|
Loading…
Reference in New Issue
Block a user