diff --git a/worldeditadditions/init.lua b/worldeditadditions/init.lua index 2e12168..7b04b3c 100644 --- a/worldeditadditions/init.lua +++ b/worldeditadditions/init.lua @@ -63,7 +63,7 @@ dofile(wea.modpath.."/lib/conv/conv.lua") dofile(wea.modpath.."/lib/erode/erode.lua") dofile(wea.modpath.."/lib/noise/init.lua") wea.sculpt = dofile(wea.modpath.."/lib/sculpt/init.lua") -wea.metaballs = dofile(wea.modpath.."/lib/metaballs.lua") +wea.metaballs = dofile(wea.modpath.."/lib/metaballs/init.lua") dofile(wea.modpath.."/lib/copy.lua") dofile(wea.modpath.."/lib/move.lua") diff --git a/worldeditadditions_commands/commands/metaballs.lua b/worldeditadditions_commands/commands/metaballs.lua index bc9879d..311045a 100644 --- a/worldeditadditions_commands/commands/metaballs.lua +++ b/worldeditadditions_commands/commands/metaballs.lua @@ -7,7 +7,7 @@ local Vector3 = wea.Vector3 -- ██ ██ ██ ██ ██ ██ ██ ██ -- ██████ ██████ ██ ██ ███████ worldedit.register_command("metaballs", { - params = "add | remove | list | render | clear", + params = "add | remove | list | render [] | clear", description = "Defines and creates metaballs. After using the add subcommand to define 1 or more metaballs (uses pos1), the render subcommand can then be used to create the metaballs as nodes.", privs = { worldedit = true }, require_pos = 1, @@ -19,8 +19,18 @@ worldedit.register_command("metaballs", { if #parts < 1 then return false, "Error: Not enough arguments (see /help /dome for usage information)." end + local subcommand = parts[1] local subargs = {} + + if subcommand == "delete" then subcommand = "remove" end + if subcommand == "deleteall" then subcommand = "clear" end + if subcommand == "append" then subcommand = "add" end + if subcommand == "list" then subcommand = "list" end + if subcommand == "make" then subcommand = "render" end + if subcommand == "generate" then subcommand = "render" end + if subcommand == "create" then subcommand = "render" end + if subcommand == "add" then local radius = tonumber(parts[2]) if not radius then @@ -41,10 +51,22 @@ worldedit.register_command("metaballs", { table.insert(subargs, index) elseif subcommand == "render" then local replace_node = worldedit.normalize_nodename(parts[2]) + local threshold = 1 + if not replace_node then return false, "Error: Invalid replace_node '"..parts[2].."'." end + + if #parts >= 3 then + threshold = tonumber(parts[3]) + if not threshold then + return false, "Error: The threshold value must be a valid number (a floating-point number is ok)." + end + end table.insert(subargs, replace_node) + table.insert(subargs, threshold) + elseif subcommand ~= "list" and subcommand ~= "clear" then + return false, "Error: Unknown subcommand '"..parts[1].."'." end return true, subcommand, subargs @@ -56,16 +78,61 @@ worldedit.register_command("metaballs", { return 0 end end, - func = function(name, radius, replace_node, axes, hollow) + func = function(name, subcommand, subargs) local start_time = wea.get_ms_time() - - - + local message = "" + local append_time = true + if subcommand == "list" then + local success, list = wea.metaballs.list_pretty(name) + if not success then return success, list end + + message = list + append_time = false + elseif subcommand == "clear" then + local success, metaballs_cleared = wea.metaballs.clear(name) + if not success then return success, metaballs_cleared end + + message = tostring(metaballs_cleared).." cleared" + elseif subcommand == "remove" then + local index = subargs[1] + + local success, metaballs_count = wea.metaballs.remove(name, index) + if not success then return success, metaballs_count end + + message = "metaball at index "..tostring(index).." removed - "..metaballs_count.." metaballs remain" + elseif subcommand == "add" then + local pos = Vector3.clone(worldedit.pos1[name]) + local radius = subargs[1] + + local success, metaballs_count = wea.metaballs.add(name, pos, radius) + if not success then return success, metaballs_count end + + message = "added metaball at "..pos.." with radius "..tostring(radius).." - "..metaballs_count.." metaballs are now defined" + elseif subcommand == "render" then + local replace_node = subargs[1] + local threshold = subargs[2] + + local success, metaballs = wea.metaballs.list(name) + if not success then return success, metaballs end + + if #metaballs < 2 then + return false, "Error: At least 2 metaballs must be defined to render them." + end + + local success2, nodes_replaced = wea.metaballs.render(metaballs, replace_node, threshold) + if not success2 then return success2, nodes_replaced end + + message = nodes_replaced.." nodes replaced using "..tostring(#metaballs).." metaballs" + 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) + if append_time then + message = message.." in "..wea.format.human_time(time_taken) + end + + minetest.log("action", name.." used //metaballs "..subcommand.." in "..wea.format.human_time(time_taken)) + return true, message end })