//metaball: address a number of stability issues

This commit is contained in:
Starbeamrainbowlabs 2023-07-11 19:14:59 +01:00
parent 5baa72cf6f
commit 95a82add86
Signed by: sbrl
GPG key ID: 1BE5172E637709C2
2 changed files with 25 additions and 11 deletions

View file

@ -55,6 +55,9 @@ end
local function list_pretty(player_name) local function list_pretty(player_name)
local success, metaball_list = list(player_name) local success, metaball_list = list(player_name)
if not success then return success, metaball_list end if not success then return success, metaball_list end
if not metaball_list or type(metaball_list) ~= "table" then
return false, "Invalid metaball list returned"
end
local rows = { { "Index", "Position", "Radius" } } local rows = { { "Index", "Position", "Radius" } }
for i,metaball in ipairs(metaball_list) do for i,metaball in ipairs(metaball_list) do
@ -75,6 +78,9 @@ end
local function remove(player_name, index) local function remove(player_name, index)
local success, metaball_list = list(player_name) local success, metaball_list = list(player_name)
if not success then return success, metaball_list end if not success then return success, metaball_list end
if not metaball_list or type(metaball_list) ~= "table" then
return false, "Invalid metaball list returned"
end
if index > #metaball_list then if index > #metaball_list then
return false, "Error: Requested the removal of metaball "..tostring(index)..", but there are "..tostring(#metaball_list).." metaballs defined." return false, "Error: Requested the removal of metaball "..tostring(index)..", but there are "..tostring(#metaball_list).." metaballs defined."
@ -82,7 +88,7 @@ local function remove(player_name, index)
table.remove(metaball_list, index) table.remove(metaball_list, index)
return #metaball_list return true, #metaball_list
end end
--- Removes all the currently defined metaballs for the given player. --- Removes all the currently defined metaballs for the given player.
@ -104,8 +110,11 @@ local function volume(player_name)
local success, metaball_list = list(player_name) local success, metaball_list = list(player_name)
if not success then return success, metaball_list end if not success then return success, metaball_list end
if not metaball_list or not metaball_list[1] or type(metaball_list) ~= "table" then return false, "Error: Invalid metaball list returned" end
if #metaball_list == 0 then return 0 end if #metaball_list == 0 then return 0 end
local pos1 = metaball_list[1].pos local pos1 = metaball_list[1].pos
local pos2 = pos1 local pos2 = pos1
@ -114,7 +123,7 @@ local function volume(player_name)
pos2 = Vector3.max(pos2, metaball.pos + metaball.radius) pos2 = Vector3.max(pos2, metaball.pos + metaball.radius)
end end
return (pos2 - pos1):area() return true, (pos2 - pos1):area()
end end
return { return {

View file

@ -18,7 +18,7 @@ worldeditadditions_core.register_command("metaball", {
local parts = wea_c.split_shell(params_text) local parts = wea_c.split_shell(params_text)
if #parts < 1 then if #parts < 1 then
return false, "Error: Not enough arguments (see /help /dome for usage information)." return false, "Error: Not enough arguments (see /help /metaball for usage information)."
end end
local subcommand = parts[1] local subcommand = parts[1]
@ -83,7 +83,14 @@ worldeditadditions_core.register_command("metaball", {
end, end,
nodes_needed = function(name, subcommand) nodes_needed = function(name, subcommand)
if subcommand == "render" then if subcommand == "render" then
return wea.metaballs.volume(name) local success, value = wea.metaballs.volume(name)
if not success then
worldedit.player_notify(name, value)
return -1
end
return value
else else
return 0 return 0
end end
@ -103,21 +110,19 @@ worldeditadditions_core.register_command("metaball", {
local success2, volume = wea.metaballs.volume(name) local success2, volume = wea.metaballs.volume(name)
if not success2 then return success2, volume end if not success2 then return success2, volume end
message = #metaballs_list.." will take up to "..tostring(volume).." nodes of space" message = #metaballs_list.." metaballs will take up to "..tostring(volume).." nodes of space"
elseif subcommand == "clear" then elseif subcommand == "clear" then
local success, metaballs_cleared = wea.metaballs.clear(name) local metaballs_cleared = wea.metaballs.clear(name)
if not success then return success, metaballs_cleared end message = tostring(metaballs_cleared).." metaball cleared"
message = tostring(metaballs_cleared).." cleared"
elseif subcommand == "remove" then elseif subcommand == "remove" then
local index = subargs[1] local index = subargs[1]
local success, metaballs_count = wea.metaballs.remove(name, index) local success, metaballs_count = wea.metaballs.remove(name, index)
if not success then return success, metaballs_count end if not success then return success, metaballs_count end
message = "metaball at index "..tostring(index).." removed - "..metaballs_count.." metaballs remain" message = "metaball at index "..tostring(index).." removed - "..tostring(metaballs_count).." metaballs remain"
elseif subcommand == "add" then elseif subcommand == "add" then
local pos = Vector3.clone(worldedit.pos1[name]) local pos = Vector3.clone(worldedit.pos1[name]):round()
local radius = subargs[1] local radius = subargs[1]
local success, metaballs_count = wea.metaballs.add(name, pos, radius) local success, metaballs_count = wea.metaballs.add(name, pos, radius)