diff --git a/Chat-Command-Reference.md b/Chat-Command-Reference.md index 6be4412..3d3e862 100644 --- a/Chat-Command-Reference.md +++ b/Chat-Command-Reference.md @@ -37,6 +37,7 @@ Note also that columns without any air nodes in them at all are also skipped, so //overlay grass_with_dirt 10 dirt //overlay grass_with_dirt 10 dirt 2 sand 1 //overlay sandstone dirt 2 sand 5 +//overlay dirt 90% stone 10% ``` ## `//layers [ []] [ []] ...` @@ -126,6 +127,8 @@ Creates a hollow ellipsoid at position 1 with the radius `(rx, ry, rz)`. Works t ## `//torus [ [h[ollow]]]` Creates a solid torus at position 1 with the specified major and minor radii. The major radius is the distance from the centre of the torus to the centre of the circle bit, and the minor radius is the radius of the circle bit. +The optional axes sets the axes upon which the torus will lay flat. Possible values: `xy` (the default), `xz`, `yz`. + ``` //torus 15 5 stone //torus 5 3 meselamp x @@ -139,6 +142,7 @@ Creates a hollow torus at position 1 with the radius major and minor radii. Work ``` //hollowtorus 10 5 glass //hollowtorus 21 11 stone +//hollowtorus 18 6 dirt xz ``` ## `//line [ []]` @@ -214,12 +218,15 @@ Also optionally takes a chance number. This is the chance that an eligible node For example, a chance number of 2 would mean a 50% chance that any given eligible node will get bonemealed. A chance number of 16 would be a 6.25% chance, and a chance number of 25 would be 2%. +Since WorldEditAdditions v1.12, a percentage chance is also supported. This is denoted by suffixing a number with a percent sign (e.g. `//bonemeal 1 25%`). + ``` //bonemeal //bonemeal 3 25 //bonemeal 4 //bonemeal 1 10 //bonemeal 2 15 +//bonemeal 2 10% ``` ## `//walls ` diff --git a/worldeditadditions/lib/torus.lua b/worldeditadditions/lib/torus.lua index 859ffdb..289fe33 100644 --- a/worldeditadditions/lib/torus.lua +++ b/worldeditadditions/lib/torus.lua @@ -1,4 +1,4 @@ ---- Overlap command. Places a specified node on top of +--- Overlap command. Places a specified node on top of -- @module worldeditadditions.overlay --- Generates a torus shape at the given position with the given parameters. @@ -12,7 +12,7 @@ function worldeditadditions.torus(position, major_radius, minor_radius, target_n local matrix = {x='yz', y='xz', z='xy'} if type(axes) ~= "string" then axes = "xz" end if #axes == 1 and axes:match('[xyz]') then axes = matrix[axes] end - + -- position = { x, y, z } local total_radius = major_radius + minor_radius local inner_minor_radius = minor_radius - 2 @@ -22,6 +22,7 @@ function worldeditadditions.torus(position, major_radius, minor_radius, target_n -- Fetch the nodes in the specified area -- OPTIMIZE: We should be able to calculate a more efficient box-area here + -- This is complicated by the multiple possible axes though local manip, area = worldedit.manip_helpers.init_radius(position, total_radius) local data = manip:get_data() @@ -44,6 +45,15 @@ function worldeditadditions.torus(position, major_radius, minor_radius, target_n for x = -total_radius, total_radius do local x_sq = x*x + local sq = vector.new(x_sq, y_sq, z_sq) + + -- Default: xy + if axes == "xz" then + sq.x, sq.y, sq.z = sq.x, sq.z, sq.y + elseif axes == "yz" then + sq.x, sq.y, sq.z = sq.y, sq.z, sq.x + end + -- (x^2+y^2+z^2-(a^2+b^2))^2-4 a b (b^2-z^2) -- Where: -- (x, y, z) is the point @@ -58,8 +68,8 @@ function worldeditadditions.torus(position, major_radius, minor_radius, target_n if not place_ok then -- It must be hollow! Do some additional calculations. - local inner_comp_a = (x_sq+y_sq+z_sq - (major_radius_sq+inner_minor_radius_sq)) - local inner_test_value = inner_comp_a*inner_comp_a - 4*major_radius*inner_minor_radius*(inner_minor_radius_sq-z_sq) + local inner_comp_a = (sq.x+sq.y+sq.z - (major_radius_sq+inner_minor_radius_sq)) + local inner_test_value = inner_comp_a*inner_comp_a - 4*major_radius*inner_minor_radius*(inner_minor_radius_sq-sq.z) -- It's only ok to place it if it's outside our inner torus place_ok = inner_test_value >= 0 diff --git a/worldeditadditions_commands/commands/bonemeal.lua b/worldeditadditions_commands/commands/bonemeal.lua index 4223115..088780f 100644 --- a/worldeditadditions_commands/commands/bonemeal.lua +++ b/worldeditadditions_commands/commands/bonemeal.lua @@ -27,7 +27,7 @@ worldedit.register_command("bonemeal", { end end if #parts >= 2 then - chance = tonumber(parts[2]) + chance = worldeditadditions.parse.chance(parts[2]) if not chance then return false, "Invalid chance value (must be a positive integer)" end diff --git a/worldeditadditions_commands/commands/replacemix.lua b/worldeditadditions_commands/commands/replacemix.lua index 965cd2c..5eaa61a 100644 --- a/worldeditadditions_commands/commands/replacemix.lua +++ b/worldeditadditions_commands/commands/replacemix.lua @@ -1,4 +1,4 @@ -local we_c = worldeditadditions_commands +local wea = worldeditadditions -- ██████ ███████ ██████ ██ █████ ██████ ███████ ███ ███ ██ ██ ██ -- ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ████ ████ ██ ██ ██ @@ -15,7 +15,7 @@ worldedit.register_command("replacemix", { return false, "Error: No arguments specified" end - local parts = worldeditadditions.split(params_text, "%s+", false) + local parts = wea.split(params_text, "%s+", false) local target_node = nil local target_node_chance = 1 @@ -30,16 +30,16 @@ worldedit.register_command("replacemix", { return false, "Error: Invalid target_node name" end mode = "target_chance" - elseif mode == "target_chance" and tonumber(part) then - target_node_chance = tonumber(part) + elseif mode == "target_chance" and wea.parse.chance(part) then + target_node_chance = wea.parse.chance(part) mode = "replace_node" - elseif (mode == "target_chance" and not tonumber(part)) or mode == "replace_node" then + elseif (mode == "target_chance" and not wea.parse.chance(part, "weight")) or mode == "replace_node" then mode = "replace_node" - if tonumber(part) then + if wea.parse.chance(part, "weight") then if not last_node_name then return false, "Error: No previous node name was found (this is a probably a bug)." end - replace_nodes[last_node_name] = math.floor(tonumber(part)) + replace_nodes[last_node_name] = math.floor(wea.parse.chance(part, "weight")) else if last_node_name and not replace_nodes[last_node_name] then replace_nodes[last_node_name] = 1 diff --git a/worldeditadditions_commands/commands/torus.lua b/worldeditadditions_commands/commands/torus.lua index 1f17d73..ac68f41 100644 --- a/worldeditadditions_commands/commands/torus.lua +++ b/worldeditadditions_commands/commands/torus.lua @@ -4,22 +4,36 @@ -- ██ ██ ██ ██ ██ ██ ██ ██ -- ██ ██████ ██ ██ ██████ ███████ local function parse_params_torus(params_text) - local found, _, major_radius, minor_radius, replace_node = params_text:find("([0-9]+)%s+([0-9]+)%s+([a-z:_\\-]+)") - - if found == nil then - return nil, nil + local parts = worldeditadditions.split(params_text, "%s+", false) + + if #parts < 1 then + return false, "Error: No replace_node specified." + end + if #parts < 2 then + return false, "Error: No major radius specified (expected integer greater than 0)." + end + if #parts < 3 then + return false, "Error: No minor radius specified (expected integer greater than 0)." + end + + local major_radius = tonumber(parts[1]) + local minor_radius = tonumber(parts[2]) + local replace_node = worldedit.normalize_nodename(parts[3]) + local axes + if #parts > 3 then axes = parts[4] end + if not axes then axes = "xy" end + + if major_radius < 1 then + return false, "Error: The major radius must be greater than 0." + end + if minor_radius < 1 then + return false, "Error: The minor radius must be greater than 0." end - - major_radius = tonumber(major_radius) - minor_radius = tonumber(minor_radius) - - replace_node = worldedit.normalize_nodename(replace_node) - if not replace_node then - return false, "Error: Invalid replace_node." + return false, "Error: Invalid node name." end - if not major_radius or major_radius < 1 then - return false, "Error: Invalid major radius (expected integer greater than 0)" + if axes:find("[^xyz]") then + return false, "Error: The axes may only contain the letters x, y, and z." end if #axes > 2 then return false, "Error: 2 or less axes must be specified. For example, xy is valid, but xzy is not." @@ -60,8 +74,8 @@ worldedit.register_command("torus", { -- TODO: This duplicates a lot of code. Perhaps we can trim it down a bit? worldedit.register_command("hollowtorus", { - params = " ", - description = "Creates a 3D hollow torus with a major radius of and a minor radius of at pos1, made out of .", + params = " []", + description = "Creates a 3D hollow torus with a major radius of and a minor radius of at pos1, made out of , on axes (i.e. 2 axis names: xz, zy, etc).", privs = { worldedit = true }, require_pos = 1, parse = function(params_text) @@ -73,7 +87,7 @@ worldedit.register_command("hollowtorus", { end, func = function(name, target_node, major_radius, minor_radius) local start_time = worldeditadditions.get_ms_time() - local replaced = worldeditadditions.torus(worldedit.pos1[name], major_radius, minor_radius, target_node, true) + local replaced = worldeditadditions.torus(worldedit.pos1[name], major_radius, minor_radius, target_node, axes, true) local time_taken = worldeditadditions.get_ms_time() - start_time minetest.log("action", name .. " used //hollowtorus at " .. worldeditadditions.vector.tostring(worldedit.pos1[name]) .. ", replacing " .. replaced .. " nodes in " .. time_taken .. "s")