diff --git a/worldeditadditions/init.lua b/worldeditadditions/init.lua index 163a071..49acea4 100644 --- a/worldeditadditions/init.lua +++ b/worldeditadditions/init.lua @@ -15,6 +15,7 @@ dofile(worldeditadditions.modpath.."/utils/node_identification.lua") dofile(worldeditadditions.modpath.."/utils/tables.lua") dofile(worldeditadditions.modpath.."/utils/terrain.lua") dofile(worldeditadditions.modpath.."/utils/raycast_adv.lua") -- For the farwand +dofile(worldeditadditions.modpath.."/utils/selector_helps.lua") dofile(worldeditadditions.modpath.."/lib/compat/saplingnames.lua") diff --git a/worldeditadditions/utils/numbers.lua b/worldeditadditions/utils/numbers.lua index 82565fe..f287199 100644 --- a/worldeditadditions/utils/numbers.lua +++ b/worldeditadditions/utils/numbers.lua @@ -1,7 +1,7 @@ -- From http://lua-users.org/wiki/SimpleRound function worldeditadditions.round(num, numDecimalPlaces) - local mult = 10^(numDecimalPlaces or 0) - return math.floor(num * mult + 0.5) / mult + local mult = 10^(numDecimalPlaces or 0) + return math.floor(num * mult + 0.5) / mult end function worldeditadditions.hypotenuse(x1, y1, x2, y2) @@ -11,17 +11,17 @@ function worldeditadditions.hypotenuse(x1, y1, x2, y2) end function worldeditadditions.sum(list) - if #list == 0 then return 0 end + if #list == 0 then return 0 end local sum = 0 for i,value in ipairs(list) do sum = sum + value end - return sum + return sum end function worldeditadditions.average(list) - if #list == 0 then return 0 end + if #list == 0 then return 0 end return worldeditadditions.sum(list) / #list end @@ -32,11 +32,33 @@ function worldeditadditions.get_ms_time() end function worldeditadditions.eta(existing_times, done_count, total_count) - local max = 100 - local average = worldeditadditions.average( - worldeditadditions.table_get_last(existing_times, max) - ) - local times_left = total_count - done_count - if times_left == 0 then return 0 end - return average * times_left + local max = 100 + local average = worldeditadditions.average( + worldeditadditions.table_get_last(existing_times, max) + ) + local times_left = total_count - done_count + if times_left == 0 then return 0 end + return average * times_left end + +--- Returns the sign (+ or -) at the beginning of a string if present. +-- @param str string Input string. +-- @param type string The type of value to return. Valid values: "string" (default), "int" +-- @return string|int Returns the sign string or signed multiplier (1|-1). +function worldeditadditions.getsign(str, type) + if not type then type = "string" end + if not (type == "string" or type == "int") then + return false, "Error: Unknown type '"..type.."'." + end + if str:sub(1, 1) == "-" then + if type == "int" then return true, -1 + else return true, "-" end + else + if type == "int" then return true, 1 + else return true, "+" end + end +end + +-- For Testing: +-- worldeditadditions = {} +-- print(worldeditadditions.getsign('-y')) diff --git a/worldeditadditions/utils/selector_helps.lua b/worldeditadditions/utils/selector_helps.lua new file mode 100644 index 0000000..60d31ba --- /dev/null +++ b/worldeditadditions/utils/selector_helps.lua @@ -0,0 +1,12 @@ +-- Returns the player's facing direction on the horizontal axes only. +-- @param name string The name of the player to return facing direction of. +-- @return table Returns axis name and sign multiplyer. +function worldeditadditions.player_axis2d(name) + -- minetest.get_player_by_name("singleplayer"): + local dir = math.floor(minetest.get_player_by_name(name):get_look_horizontal() / math.pi * 2 + 0.5) % 4 + local crdnl = { {1,"z"},{-1,"x"},{-1,"z"},{1,"x"} } + return crdnl[dir+1] +end + +-- Tests +-- /lua print(unpack(worldeditadditions.player_axis2d(myname))) diff --git a/worldeditadditions_commands/commands/extra/basename.lua b/worldeditadditions_commands/commands/extra/basename.lua new file mode 100644 index 0000000..39d92b5 --- /dev/null +++ b/worldeditadditions_commands/commands/extra/basename.lua @@ -0,0 +1,20 @@ +-- ██████ █████ ███████ ███████ ███ ██ █████ ███ ███ ███████ +-- ██ ██ ██ ██ ██ ██ ████ ██ ██ ██ ████ ████ ██ +-- ██████ ███████ ███████ █████ ██ ██ ██ ███████ ██ ████ ██ █████ +-- ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ +-- ██████ ██ ██ ███████ ███████ ██ ████ ██ ██ ██ ██ ███████ +worldedit.register_command("basename", { + params = "", + description = "Returns the base name of nodes that use a given alias.", + privs = {worldedit = true}, + parse = function(params_text) + if params_text == "" or not params_text then + return false, "Node not specified." + end + return true, params_text + end, + func = function(name, params_text) + if name == nil then return end + worldedit.player_notify(name, worldedit.normalize_nodename(params_text) or 'Error 404: "'..params_text..'" not found!') + end +}) diff --git a/worldeditadditions_commands/commands/saplingaliases.lua b/worldeditadditions_commands/commands/extra/saplingaliases.lua similarity index 55% rename from worldeditadditions_commands/commands/saplingaliases.lua rename to worldeditadditions_commands/commands/extra/saplingaliases.lua index 7fd1b11..a495ca6 100644 --- a/worldeditadditions_commands/commands/saplingaliases.lua +++ b/worldeditadditions_commands/commands/extra/saplingaliases.lua @@ -1,3 +1,8 @@ +-- ███████ █████ ██████ ██ ██ ███ ██ ██████ █████ ██ ██ █████ ███████ ███████ ███████ +-- ██ ██ ██ ██ ██ ██ ██ ████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ +-- ███████ ███████ ██████ ██ ██ ██ ██ ██ ██ ███ ███████ ██ ██ ███████ ███████ █████ ███████ +-- ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ +-- ███████ ██ ██ ██ ███████ ██ ██ ████ ██████ ██ ██ ███████ ██ ██ ██ ███████ ███████ ███████ minetest.register_chatcommand("/saplingaliases", { params = "[aliases|all_saplings]", description = "Lists all the currently registered sapling aliases (default). A single argument is taken as the mode of operation. Current modes: aliases (default; as described previously), all_saplings (lists all node names with the group \"sapling\")", diff --git a/worldeditadditions_commands/commands/forest.lua b/worldeditadditions_commands/commands/forest.lua index e780ea4..e9d8336 100644 --- a/worldeditadditions_commands/commands/forest.lua +++ b/worldeditadditions_commands/commands/forest.lua @@ -1,8 +1,9 @@ --- ██████ ██ ██ ███████ ██████ ██ █████ ██ ██ --- ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ --- ██ ██ ██ ██ █████ ██████ ██ ███████ ████ --- ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ --- ██████ ████ ███████ ██ ██ ███████ ██ ██ ██ +-- ███████ ██████ ██████ ███████ ███████ ████████ +-- ██ ██ ██ ██ ██ ██ ██ ██ +-- █████ ██ ██ ██████ █████ ███████ ██ +-- ██ ██ ██ ██ ██ ██ ██ ██ +-- ██ ██████ ██ ██ ███████ ███████ ██ + worldedit.register_command("forest", { params = "[] [] [] [ []] ...", description = "Plants and grows trees in the defined region according to the given list of sapling names and chances and density factor. The density controls the relative density of the resulting forest, and defaults to 1 (floating-point numbers allowed). Higher chance numbers result in a lower relative chance with respect to other saplings in the list. Saplings that fail to grow are subsequently removed (this will affect pre-existing saplings too).", diff --git a/worldeditadditions_commands/commands/selectors/srect.lua b/worldeditadditions_commands/commands/selectors/srect.lua new file mode 100644 index 0000000..ee25709 --- /dev/null +++ b/worldeditadditions_commands/commands/selectors/srect.lua @@ -0,0 +1,64 @@ +-- ███████ ██████ ███████ ██████ ████████ +-- ██ ██ ██ ██ ██ ██ +-- ███████ ██████ █████ ██ ██ +-- ██ ██ ██ ██ ██ ██ +-- ███████ ██ ██ ███████ ██████ ██ +-- local -- TODO: set this to local once development is finished +function parse_params_srect(params_text) + local wea = worldeditadditions + local find = wea.split(params_text, "%s", false) + local ax1, ax2, len = find[1], find[2], find[table.maxn(find)] + + -- If ax1 is bad set to player facing dir + if ax1 == len or not ax1:match('[xyz]') then ax1 = "get" + else + local success, value = wea.getsign(ax1, "int") + if not success then return success, value + else ax1 = { value, ax1:gsub('[^xyz]',''):sub(1,1) } + end + end + -- If ax2 is bad set to +y + if not ax2 or ax2 == len or not ax2:match('[xyz]') then ax2 = "y" end + local success, value = wea.getsign(ax2, "int") + if not success then return success, value end + ax2 = { value, ax2:gsub('[^xyz]',''):sub(1,1) } + + len = tonumber(len) + -- If len == nill cancel the operation + if len == nil then + return false, "No length specified." + end + + return true, ax1, ax2, len +end +worldedit.register_command("srect", { + params = "[ []] ", + description = "Set WorldEdit region position 2 at a set distance along 2 axes.", + privs = {worldedit=true}, + require_pos = 1, + parse = function(params_text) + local values = {parse_params_srect(params_text)} + return unpack(values) + end, + func = function(name, axis1, axis2, len) + if axis1 == "get" then axis1 = worldeditadditions.player_axis2d(name) end + + local p2 = vector.new(worldedit.pos1[name]) + + p2[axis1[2]] = p2[axis1[2]] + tonumber(len) * axis1[1] + p2[axis2[2]] = p2[axis2[2]] + tonumber(len) * axis2[1] + + worldedit.pos2[name] = p2 + worldedit.mark_pos2(name) + return true, "position 2 set to " .. minetest.pos_to_string(p2) + end, +}) + +-- Tests +-- /multi //fp set1 -63 19 -20 //srect 5 +-- /multi //fp set1 -63 19 -20 //srect z 5 +-- /multi //fp set1 -63 19 -20 //srect a z 5 +-- /multi //fp set1 -63 19 -20 //srect z a 5 +-- /multi //fp set1 -63 19 -20 //srect -z 5 +-- /multi //fp set1 -63 19 -20 //srect a -x 5 +-- /multi //fp set1 -63 19 -20 //srect -x -a 5 diff --git a/worldeditadditions_commands/init.lua b/worldeditadditions_commands/init.lua index ff3aa89..425413c 100644 --- a/worldeditadditions_commands/init.lua +++ b/worldeditadditions_commands/init.lua @@ -35,13 +35,19 @@ dofile(we_c.modpath.."/commands/hollow.lua") dofile(we_c.modpath.."/commands/scale.lua") dofile(we_c.modpath.."/commands/count.lua") -dofile(we_c.modpath.."/commands/saplingaliases.lua") dofile(we_c.modpath.."/commands/meta/multi.lua") dofile(we_c.modpath.."/commands/meta/many.lua") dofile(we_c.modpath.."/commands/meta/subdivide.lua") dofile(we_c.modpath.."/commands/meta/ellipsoidapply.lua") +-- dofile(we_c.modpath.."/commands/selectors/scol.lua") +dofile(we_c.modpath.."/commands/selectors/srect.lua") +-- dofile(we_c.modpath.."/commands/selectors/scube.lua") + +dofile(we_c.modpath.."/commands/extra/saplingaliases.lua") +dofile(we_c.modpath.."/commands/extra/basename.lua") + -- Don't registry the //bonemeal command if the bonemeal mod isn't present if minetest.get_modpath("bonemeal") then dofile(we_c.modpath.."/commands/bonemeal.lua")