mirror of
https://github.com/sbrl/Minetest-WorldEditAdditions.git
synced 2024-10-31 21:33:02 +00:00
Upgrade meta commands
This commit is contained in:
parent
4a56d45c4b
commit
6102a1adf5
9 changed files with 105 additions and 141 deletions
|
@ -1,9 +1,11 @@
|
||||||
|
local wea_c = worldeditadditions_core
|
||||||
|
local Vector3 = wea_c.Vector3
|
||||||
|
|
||||||
-- █████ ██ ██████ █████ ██████ ██████ ██ ██ ██
|
-- █████ ██ ██████ █████ ██████ ██████ ██ ██ ██
|
||||||
-- ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
|
-- ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
|
||||||
-- ███████ ██ ██████ ███████ ██████ ██████ ██ ████
|
-- ███████ ██ ██████ ███████ ██████ ██████ ██ ████
|
||||||
-- ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
|
-- ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
|
||||||
-- ██ ██ ██ ██ ██ ██ ██ ██ ██ ███████ ██
|
-- ██ ██ ██ ██ ██ ██ ██ ██ ██ ███████ ██
|
||||||
local wea_c = worldeditadditions_core
|
|
||||||
|
|
||||||
worldeditadditions_core.register_command("airapply", {
|
worldeditadditions_core.register_command("airapply", {
|
||||||
params = "<command_name> <args>",
|
params = "<command_name> <args>",
|
||||||
|
@ -30,7 +32,7 @@ worldeditadditions_core.register_command("airapply", {
|
||||||
|
|
||||||
-- Run parsing of target command
|
-- Run parsing of target command
|
||||||
-- Lifted from cubeapply in WorldEdit
|
-- Lifted from cubeapply in WorldEdit
|
||||||
local args_parsed = {cmd_we.parse(args_text)}
|
local args_parsed = { cmd_we.parse(args_text) }
|
||||||
if not table.remove(args_parsed, 1) then
|
if not table.remove(args_parsed, 1) then
|
||||||
return false, args_parsed[1]
|
return false, args_parsed[1]
|
||||||
end
|
end
|
||||||
|
@ -48,7 +50,7 @@ worldeditadditions_core.register_command("airapply", {
|
||||||
return false, "Your privileges are insufficient to execute the command '"..cmd.."'."
|
return false, "Your privileges are insufficient to execute the command '"..cmd.."'."
|
||||||
end
|
end
|
||||||
|
|
||||||
local pos1, pos2 = worldeditadditions.Vector3.sort(
|
local pos1, pos2 = Vector3.sort(
|
||||||
worldedit.pos1[name],
|
worldedit.pos1[name],
|
||||||
worldedit.pos2[name]
|
worldedit.pos2[name]
|
||||||
)
|
)
|
||||||
|
@ -57,15 +59,15 @@ worldeditadditions_core.register_command("airapply", {
|
||||||
local success, stats_time = worldeditadditions.airapply(
|
local success, stats_time = worldeditadditions.airapply(
|
||||||
pos1, pos2,
|
pos1, pos2,
|
||||||
function()
|
function()
|
||||||
cmd.func(name, worldeditadditions.table.unpack(args_parsed))
|
cmd.func(name, table.unpack(args_parsed))
|
||||||
end
|
end
|
||||||
)
|
)
|
||||||
if not success then return success, stats_time end
|
if not success then return success, stats_time end
|
||||||
|
|
||||||
|
|
||||||
local time_overhead = 100 - worldeditadditions.round((stats_time.fn / stats_time.all) * 100, 3)
|
local time_overhead = 100 - wea_c.round((stats_time.fn / stats_time.all) * 100, 3)
|
||||||
local text_time_all = worldeditadditions.format.human_time(stats_time.all)
|
local text_time_all = wea_c.format.human_time(stats_time.all)
|
||||||
local text_time_fn = worldeditadditions.format.human_time(stats_time.fn)
|
local text_time_fn = wea_c.format.human_time(stats_time.fn)
|
||||||
|
|
||||||
minetest.log("action", name.." used //airapply at "..pos1.." - "..pos2.." in "..text_time_all)
|
minetest.log("action", name.." used //airapply at "..pos1.." - "..pos2.." in "..text_time_all)
|
||||||
return true, "Complete in "..text_time_all.." ("..text_time_fn.." fn, "..time_overhead.."% airapply overhead)"
|
return true, "Complete in "..text_time_all.." ("..text_time_fn.." fn, "..time_overhead.."% airapply overhead)"
|
||||||
|
|
|
@ -1,9 +1,12 @@
|
||||||
|
local wea_c = worldeditadditions_core
|
||||||
|
local Vector3 = wea_c.Vector3
|
||||||
|
|
||||||
|
|
||||||
-- ███████ ██ ██ ██ ██████ ███████ ███████ █████ ██████ ██████ ██ ██ ██
|
-- ███████ ██ ██ ██ ██████ ███████ ███████ █████ ██████ ██████ ██ ██ ██
|
||||||
-- ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
|
-- ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
|
||||||
-- █████ ██ ██ ██ ██████ ███████ █████ ███████ ██████ ██████ ██ ████
|
-- █████ ██ ██ ██ ██████ ███████ █████ ███████ ██████ ██████ ██ ████
|
||||||
-- ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
|
-- ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
|
||||||
-- ███████ ███████ ███████ ██ ██ ███████ ███████ ██ ██ ██ ██ ███████ ██
|
-- ███████ ███████ ███████ ██ ██ ███████ ███████ ██ ██ ██ ██ ███████ ██
|
||||||
local wea_c = worldeditadditions_core
|
|
||||||
|
|
||||||
worldeditadditions_core.register_command("ellipsoidapply", {
|
worldeditadditions_core.register_command("ellipsoidapply", {
|
||||||
params = "<command_name> <args>",
|
params = "<command_name> <args>",
|
||||||
|
@ -48,16 +51,17 @@ worldeditadditions_core.register_command("ellipsoidapply", {
|
||||||
if not minetest.check_player_privs(name, cmd.privs) then
|
if not minetest.check_player_privs(name, cmd.privs) then
|
||||||
return false, "Your privileges are insufficient to execute the command '"..cmd.."'."
|
return false, "Your privileges are insufficient to execute the command '"..cmd.."'."
|
||||||
end
|
end
|
||||||
|
local pos1 = Vector3.clone(worldedit.pos1[name])
|
||||||
|
local pos2 = Vector3.clone(worldedit.pos2[name])
|
||||||
local success, stats_time = worldeditadditions.ellipsoidapply(
|
local success, stats_time = worldeditadditions.ellipsoidapply(
|
||||||
worldedit.pos1[name], worldedit.pos2[name],
|
pos1, pos2,
|
||||||
function()
|
function()
|
||||||
cmd.func(name, worldeditadditions.table.unpack(args_parsed))
|
cmd.func(name, wea_c.table.unpack(args_parsed))
|
||||||
end --, args_parsed
|
end --, args_parsed
|
||||||
)
|
)
|
||||||
local time_overhead = 100 - worldeditadditions.round((stats_time.fn / stats_time.all) * 100, 3)
|
local time_overhead = 100 - wea_c.round((stats_time.fn / stats_time.all) * 100, 3)
|
||||||
|
|
||||||
minetest.log("action", name.." used //ellipsoidapply at "..worldeditadditions.vector.tostring(worldedit.pos1[name]).." - "..worldeditadditions.vector.tostring(worldedit.pos2[name]).." in "..worldeditadditions.format.human_time(stats_time.all))
|
minetest.log("action", name.." used //ellipsoidapply at "..pos1.." - "..pos2.." in "..wea_c.format.human_time(stats_time.all))
|
||||||
return true, "Complete in "..worldeditadditions.format.human_time(stats_time.all).." ("..worldeditadditions.format.human_time(stats_time.fn).." fn, "..time_overhead.."% ellipsoidapply overhead)"
|
return true, "Complete in "..wea_c.format.human_time(stats_time.all).." ("..wea_c.format.human_time(stats_time.fn).." fn, "..time_overhead.."% ellipsoidapply overhead)"
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
-- ?Basename support for values
|
-- ?Basename support for values
|
||||||
-- ?Comma deliniation support for values
|
-- ?Comma deliniation support for values
|
||||||
|
|
||||||
local wea = worldeditadditions
|
local wea_c = worldeditadditions_core
|
||||||
local function step(params)
|
local function step(params)
|
||||||
-- Initialize additional params on first call
|
-- Initialize additional params on first call
|
||||||
if not params.first then
|
if not params.first then
|
||||||
|
@ -26,11 +26,11 @@ local function step(params)
|
||||||
local v = params.values[params.i]
|
local v = params.values[params.i]
|
||||||
|
|
||||||
-- Start a timer
|
-- Start a timer
|
||||||
local start_time = wea.get_ms_time()
|
local start_time = wea_c.get_ms_time()
|
||||||
-- Execute command
|
-- Execute command
|
||||||
params.cmd.func(params.player_name, params.args:gsub("%%+",v))
|
params.cmd.func(params.player_name, params.args:gsub("%%+",v))
|
||||||
-- Finish timer and add to total
|
-- Finish timer and add to total
|
||||||
params.time = params.time + wea.get_ms_time() - start_time
|
params.time = params.time + wea_c.get_ms_time() - start_time
|
||||||
-- Increment iteration state
|
-- Increment iteration state
|
||||||
params.i = params.i + 1
|
params.i = params.i + 1
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ local function step(params)
|
||||||
worldedit.player_notify(params.player_name, "For "..
|
worldedit.player_notify(params.player_name, "For "..
|
||||||
table.concat(params.values,", ")..
|
table.concat(params.values,", ")..
|
||||||
", /"..params.cmd_name.." completed in " ..
|
", /"..params.cmd_name.." completed in " ..
|
||||||
wea.format.human_time(params.time))
|
wea_c.format.human_time(params.time))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -53,17 +53,17 @@ worldeditadditions_core.register_command("for", {
|
||||||
if not params_text:match("%sdo%s") then
|
if not params_text:match("%sdo%s") then
|
||||||
return false, "Error: \"do\" argument is not present."
|
return false, "Error: \"do\" argument is not present."
|
||||||
end
|
end
|
||||||
local parts = wea.split(params_text,"%sdo%s")
|
local parts = wea_c.split(params_text,"%sdo%s")
|
||||||
if not parts[1] == "" then
|
if not parts[1] == "" then
|
||||||
return false, "Error: No values specified."
|
return false, "Error: No values specified."
|
||||||
end
|
end
|
||||||
if not parts[2] then
|
if not parts[2] then
|
||||||
return false, "Error: No command specified."
|
return false, "Error: No command specified."
|
||||||
end
|
end
|
||||||
local values = wea.split(parts[1],"%s")
|
local values = wea_c.split(parts[1],"%s")
|
||||||
local command, args = parts[2]:match("/([^%s]+)%s*(.*)$")
|
local command, args = parts[2]:match("/([^%s]+)%s*(.*)$")
|
||||||
if not args then args = ""
|
if not args then args = ""
|
||||||
else args = wea.trim(args) end
|
else args = wea_c.trim(args) end
|
||||||
|
|
||||||
return true, values, command, args
|
return true, values, command, args
|
||||||
end,
|
end,
|
||||||
|
|
|
@ -6,13 +6,13 @@
|
||||||
|
|
||||||
-- Commands that work on other commands.
|
-- Commands that work on other commands.
|
||||||
|
|
||||||
local we_cm = worldeditadditions_commands.modpath .. "/commands/meta/"
|
local we_cmdpath = worldeditadditions_commands.modpath .. "/commands/meta/"
|
||||||
|
|
||||||
dofile(we_cm.."airapply.lua")
|
dofile(we_cmdpath.."airapply.lua")
|
||||||
dofile(we_cm.."ellipsoidapply.lua")
|
dofile(we_cmdpath.."ellipsoidapply.lua")
|
||||||
dofile(we_cm.."for.lua")
|
dofile(we_cmdpath.."for.lua")
|
||||||
-- dofile(we_cm.."macro.lua") -- Async bug
|
-- dofile(we_cm.."macro.lua") -- Async bug
|
||||||
dofile(we_cm.."many.lua")
|
dofile(we_cmdpath.."many.lua")
|
||||||
dofile(we_cm.."multi.lua")
|
dofile(we_cmdpath.."multi.lua")
|
||||||
dofile(we_cm.."noiseapply2d.lua")
|
dofile(we_cmdpath.."noiseapply2d.lua")
|
||||||
dofile(we_cm.."subdivide.lua")
|
dofile(we_cmdpath.."subdivide.lua")
|
||||||
|
|
|
@ -4,7 +4,9 @@
|
||||||
-- ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
|
-- ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
|
||||||
-- ██ ██ ██ ██ ██████ ██ ██ ██████
|
-- ██ ██ ██ ██ ██████ ██ ██ ██████
|
||||||
local wea = worldeditadditions
|
local wea = worldeditadditions
|
||||||
local v3 = worldeditadditions.Vector3
|
local wea_c = worldeditadditions
|
||||||
|
local v3 = wea_c.Vector3
|
||||||
|
|
||||||
local function step(params)
|
local function step(params)
|
||||||
-- Initialize additional params on first call
|
-- Initialize additional params on first call
|
||||||
if not params.first then
|
if not params.first then
|
||||||
|
@ -27,11 +29,11 @@ local function step(params)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Start a timer
|
-- Start a timer
|
||||||
local start_time = wea.get_ms_time()
|
local start_time = wea_c.get_ms_time()
|
||||||
-- Execute command
|
-- Execute command
|
||||||
cmd.func(params.player_name, args)
|
cmd.func(params.player_name, args)
|
||||||
-- Finish timer and add to total
|
-- Finish timer and add to total
|
||||||
params.time = params.time + wea.get_ms_time() - start_time
|
params.time = params.time + wea_c.get_ms_time() - start_time
|
||||||
-- Increment iteration state
|
-- Increment iteration state
|
||||||
params.i = params.i + 1
|
params.i = params.i + 1
|
||||||
|
|
||||||
|
@ -41,7 +43,7 @@ local function step(params)
|
||||||
else
|
else
|
||||||
worldedit.player_notify(params.player_name, "The macro \""..
|
worldedit.player_notify(params.player_name, "The macro \""..
|
||||||
params.file.."\" was completed in " ..
|
params.file.."\" was completed in " ..
|
||||||
wea.format.human_time(params.time))
|
wea_c.format.human_time(params.time))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -51,7 +53,7 @@ worldeditadditions_core.register_command("macro", {
|
||||||
privs = {worldedit=true},
|
privs = {worldedit=true},
|
||||||
require_pos = 0,
|
require_pos = 0,
|
||||||
parse = function(params_text)
|
parse = function(params_text)
|
||||||
local parts = wea.split(params_text,"%s")
|
local parts = wea_c.split(params_text,"%s")
|
||||||
local file_name, delay -- = params_text:match("^(.-)%s*(%d*%.?%d*)$")
|
local file_name, delay -- = params_text:match("^(.-)%s*(%d*%.?%d*)$")
|
||||||
-- Check for params and delay
|
-- Check for params and delay
|
||||||
if not parts[1] then
|
if not parts[1] then
|
||||||
|
@ -72,7 +74,7 @@ worldeditadditions_core.register_command("macro", {
|
||||||
end,
|
end,
|
||||||
func = function(name, file_name, delay)
|
func = function(name, file_name, delay)
|
||||||
if not worldedit.pos1[name] then
|
if not worldedit.pos1[name] then
|
||||||
worldedit.pos1[name] = v3.add(wea.player_vector(name), v3.new(0.5,-0.5,0.5)):floor()
|
worldedit.pos1[name] = v3.add(wea_c.player_vector(name), v3.new(0.5,-0.5,0.5)):floor()
|
||||||
worldedit.mark_pos1(name)
|
worldedit.mark_pos1(name)
|
||||||
end
|
end
|
||||||
worldedit.pos2[name] = worldedit.pos1[name]
|
worldedit.pos2[name] = worldedit.pos1[name]
|
||||||
|
@ -99,7 +101,7 @@ worldeditadditions_core.register_command("macro", {
|
||||||
player_name = name,
|
player_name = name,
|
||||||
file = file_name:match("^[^%.]+"),
|
file = file_name:match("^[^%.]+"),
|
||||||
delay = delay,
|
delay = delay,
|
||||||
commands = wea.split(value,"[\n\r]+")
|
commands = wea_c.split(value,"[\n\r]+")
|
||||||
})
|
})
|
||||||
|
|
||||||
end,
|
end,
|
||||||
|
|
|
@ -1,43 +1,20 @@
|
||||||
--- Executes multiple worldedit commands in sequence.
|
--- Executes multiple worldedit commands in sequence.
|
||||||
-- @module worldeditadditions.multi
|
-- @module worldeditadditions_commands.multi
|
||||||
|
|
||||||
-- explode(separator, string)
|
local wea_c = worldeditadditions_core
|
||||||
-- From http://lua-users.org/wiki/SplitJoin
|
|
||||||
-- TODO: Refactor this to use wea.split instead
|
|
||||||
local function explode(delim, str)
|
|
||||||
local ll, is_done
|
|
||||||
local delim_length = string.len(delim)
|
|
||||||
ll = 0
|
|
||||||
is_done = false
|
|
||||||
|
|
||||||
return function()
|
|
||||||
if is_done then return end
|
|
||||||
|
|
||||||
local result
|
|
||||||
local loc = string.find(str, delim, ll, true) -- find the next d in the string
|
|
||||||
if loc ~= nil then -- if "not not" found then..
|
|
||||||
result = string.sub(str, ll, loc - 1) -- Save it in our array.
|
|
||||||
ll = loc + delim_length -- save just after where we found it for searching next time.
|
|
||||||
else
|
|
||||||
result = string.sub(str, ll) -- Save what's left in our array.
|
|
||||||
is_done = true
|
|
||||||
end
|
|
||||||
|
|
||||||
return result
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function step(params)
|
local function step(params)
|
||||||
local start_time = worldeditadditions.get_ms_time()
|
local start_time = wea_c.get_ms_time()
|
||||||
|
|
||||||
local full_cmd = params.cmd_name.." "..params.args
|
local full_cmd = params.cmd_name.." "..params.args
|
||||||
worldedit.player_notify(params.name, string.format("[ many | /%s ] %d / %d (~%.2f%%) complete | last: %s, average: %s, ETA: ~%s",
|
worldedit.player_notify(params.name, string.format("[ many | /%s ] %d / %d (~%.2f%%) complete | last: %s, average: %s, ETA: ~%s",
|
||||||
full_cmd,
|
full_cmd,
|
||||||
(params.i + 1), params.count,
|
(params.i + 1), params.count,
|
||||||
((params.i + 1) / params.count)*100,
|
((params.i + 1) / params.count)*100,
|
||||||
worldeditadditions.format.human_time(params.times[#params.times] or 0),
|
wea_c.format.human_time(params.times[#params.times] or 0),
|
||||||
worldeditadditions.format.human_time(worldeditadditions.average(params.times)),
|
wea_c.format.human_time(wea_c.average(params.times)),
|
||||||
worldeditadditions.format.human_time(worldeditadditions.eta(
|
wea_c.format.human_time(wea_c.eta(
|
||||||
params.times,
|
params.times,
|
||||||
params.i,
|
params.i,
|
||||||
params.count
|
params.count
|
||||||
|
@ -50,20 +27,20 @@ local function step(params)
|
||||||
cmd.func(params.name, params.args)
|
cmd.func(params.name, params.args)
|
||||||
|
|
||||||
|
|
||||||
table.insert(params.times, worldeditadditions.get_ms_time() - start_time)
|
table.insert(params.times, wea_c.get_ms_time() - start_time)
|
||||||
|
|
||||||
params.i = params.i + 1
|
params.i = params.i + 1
|
||||||
if params.i < params.count then
|
if params.i < params.count then
|
||||||
minetest.after(0, step, params)
|
minetest.after(0, step, params)
|
||||||
else
|
else
|
||||||
local total_time = (worldeditadditions.get_ms_time() - params.master_start_time)
|
local total_time = (wea_c.get_ms_time() - params.master_start_time)
|
||||||
local done_message = {}
|
local done_message = {}
|
||||||
table.insert(done_message,
|
table.insert(done_message,
|
||||||
string.format("Executed '"..full_cmd.."' %d times in %s (~%s / time)",
|
string.format("Executed '"..full_cmd.."' %d times in %s (~%s / time)",
|
||||||
#params.times,
|
#params.times,
|
||||||
worldeditadditions.format.human_time(total_time),
|
wea_c.format.human_time(total_time),
|
||||||
worldeditadditions.format.human_time(
|
wea_c.format.human_time(
|
||||||
worldeditadditions.average(params.times)
|
wea_c.average(params.times)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
@ -71,7 +48,7 @@ local function step(params)
|
||||||
if #params.times < 10 then
|
if #params.times < 10 then
|
||||||
local message_parts = {}
|
local message_parts = {}
|
||||||
for j=1,#params.times do
|
for j=1,#params.times do
|
||||||
table.insert(message_parts, worldeditadditions.format.human_time(params.times[j]))
|
table.insert(message_parts, wea_c.format.human_time(params.times[j]))
|
||||||
end
|
end
|
||||||
table.insert(done_message, "; ")
|
table.insert(done_message, "; ")
|
||||||
table.insert(done_message, table.concat(message_parts, ", "))
|
table.insert(done_message, table.concat(message_parts, ", "))
|
||||||
|
@ -88,7 +65,7 @@ minetest.register_chatcommand("/many", {
|
||||||
func = function(name, params_text)
|
func = function(name, params_text)
|
||||||
|
|
||||||
local i = 1 -- For feedback only
|
local i = 1 -- For feedback only
|
||||||
local master_start_time = worldeditadditions.get_ms_time()
|
local master_start_time = wea_c.get_ms_time()
|
||||||
local times = {}
|
local times = {}
|
||||||
|
|
||||||
local count, cmd_name, args = params_text:match("^(%d+)%s([^%s]+)%s(.+)$")
|
local count, cmd_name, args = params_text:match("^(%d+)%s([^%s]+)%s(.+)$")
|
||||||
|
@ -97,11 +74,11 @@ minetest.register_chatcommand("/many", {
|
||||||
if not count then return false, "Error: Invalid syntax" end
|
if not count then return false, "Error: Invalid syntax" end
|
||||||
end
|
end
|
||||||
if not args then args = "" end
|
if not args then args = "" end
|
||||||
args = worldeditadditions.trim(args)
|
args = wea_c.trim(args)
|
||||||
-- print("[many] count", count, "cmd_name", cmd_name, "args", args)
|
-- print("[many] count", count, "cmd_name", cmd_name, "args", args)
|
||||||
|
|
||||||
count = tonumber(count)
|
count = tonumber(count)
|
||||||
cmd_name = worldeditadditions.trim(cmd_name):sub(2) -- Things start at 1, not 0 in Lua :-(
|
cmd_name = wea_c.trim(cmd_name):sub(2) -- Things start at 1, not 0 in Lua :-(
|
||||||
|
|
||||||
-- Check the command we're going to execute
|
-- Check the command we're going to execute
|
||||||
local cmd = minetest.chatcommands[cmd_name]
|
local cmd = minetest.chatcommands[cmd_name]
|
||||||
|
|
|
@ -1,30 +1,6 @@
|
||||||
--- Executes multiple worldedit commands in sequence.
|
--- Executes multiple worldedit commands in sequence.
|
||||||
-- @module worldeditadditions.multi
|
-- @module worldeditadditions_commands.multi
|
||||||
|
local wea_c = worldeditadditions_core
|
||||||
-- explode(separator, string)
|
|
||||||
-- From http://lua-users.org/wiki/SplitJoin
|
|
||||||
local function explode(delim, str)
|
|
||||||
local ll, is_done
|
|
||||||
local delim_length = string.len(delim)
|
|
||||||
ll = 0
|
|
||||||
is_done = false
|
|
||||||
|
|
||||||
return function()
|
|
||||||
if is_done then return end
|
|
||||||
|
|
||||||
local result
|
|
||||||
local loc = string.find(str, delim, ll, true) -- find the next d in the string
|
|
||||||
if loc ~= nil then -- if "not not" found then..
|
|
||||||
result = string.sub(str, ll, loc - 1) -- Save it in our array.
|
|
||||||
ll = loc + delim_length -- save just after where we found it for searching next time.
|
|
||||||
else
|
|
||||||
result = string.sub(str, ll) -- Save what's left in our array.
|
|
||||||
is_done = true
|
|
||||||
end
|
|
||||||
|
|
||||||
return result
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
minetest.register_chatcommand("/multi", {
|
minetest.register_chatcommand("/multi", {
|
||||||
params = "/<command_a> <args> //<command_b> <args> /<command_c> <args>.....",
|
params = "/<command_a> <args> //<command_b> <args> /<command_c> <args>.....",
|
||||||
|
@ -32,24 +8,24 @@ minetest.register_chatcommand("/multi", {
|
||||||
privs = { worldedit = true },
|
privs = { worldedit = true },
|
||||||
func = function(name, params_text)
|
func = function(name, params_text)
|
||||||
if not params_text then return false, "Error: No commands specified, so there's nothing to do." end
|
if not params_text then return false, "Error: No commands specified, so there's nothing to do." end
|
||||||
params_text = worldeditadditions.trim(params_text)
|
params_text = wea_c.trim(params_text)
|
||||||
if #params_text == 0 then return false, "Error: No commands specified, so there's nothing to do." end
|
if #params_text == 0 then return false, "Error: No commands specified, so there's nothing to do." end
|
||||||
|
|
||||||
local master_start_time = worldeditadditions.get_ms_time()
|
local master_start_time = wea_c.get_ms_time()
|
||||||
local times = {}
|
local times = {}
|
||||||
|
|
||||||
-- Tokenise the input into a list of commands
|
-- Tokenise the input into a list of commands
|
||||||
local success, commands = worldeditadditions.parse.tokenise_commands(params_text)
|
local success, commands = wea_c.parse.tokenise_commands(params_text)
|
||||||
if not success then return success, commands end
|
if not success then return success, commands end
|
||||||
|
|
||||||
for i, command in ipairs(commands) do
|
for i, command in ipairs(commands) do
|
||||||
-- print("[DEBUG] i", i, "command: '"..command.."'")
|
-- print("[DEBUG] i", i, "command: '"..command.."'")
|
||||||
local start_time = worldeditadditions.get_ms_time()
|
local start_time = wea_c.get_ms_time()
|
||||||
|
|
||||||
local found, _, command_name, args = command:find("^([^%s]+)%s(.+)$")
|
local found, _, command_name, args = command:find("^([^%s]+)%s(.+)$")
|
||||||
if not found then command_name = command end
|
if not found then command_name = command end
|
||||||
-- Things start at 1, not 0 in Lua :-(
|
-- Things start at 1, not 0 in Lua :-(
|
||||||
command_name = worldeditadditions.trim(command_name):sub(2) -- Strip the leading /
|
command_name = wea_c.trim(command_name):sub(2) -- Strip the leading /
|
||||||
if not args then args = "" end
|
if not args then args = "" end
|
||||||
-- print("command_name", command_name)
|
-- print("command_name", command_name)
|
||||||
|
|
||||||
|
@ -66,21 +42,21 @@ minetest.register_chatcommand("/multi", {
|
||||||
minetest.log("action", name.." runs "..command)
|
minetest.log("action", name.." runs "..command)
|
||||||
cmd.func(name, args)
|
cmd.func(name, args)
|
||||||
|
|
||||||
times[#times + 1] = (worldeditadditions.get_ms_time() - start_time)
|
times[#times + 1] = (wea_c.get_ms_time() - start_time)
|
||||||
-- i = i + 1
|
-- i = i + 1
|
||||||
end
|
end
|
||||||
|
|
||||||
local total_time = (worldeditadditions.get_ms_time() - master_start_time)
|
local total_time = (wea_c.get_ms_time() - master_start_time)
|
||||||
local done_message = {}
|
local done_message = {}
|
||||||
table.insert(done_message,
|
table.insert(done_message,
|
||||||
string.format("Executed %d commands in %s (",
|
string.format("Executed %d commands in %s (",
|
||||||
#times,
|
#times,
|
||||||
worldeditadditions.format.human_time(total_time)
|
wea_c.format.human_time(total_time)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
local message_parts = {}
|
local message_parts = {}
|
||||||
for j=1,#times do
|
for j=1,#times do
|
||||||
table.insert(message_parts, worldeditadditions.format.human_time(times[j]))
|
table.insert(message_parts, wea_c.format.human_time(times[j]))
|
||||||
end
|
end
|
||||||
table.insert(done_message, table.concat(message_parts, ", "))
|
table.insert(done_message, table.concat(message_parts, ", "))
|
||||||
table.insert(done_message, ")")
|
table.insert(done_message, ")")
|
||||||
|
|
|
@ -1,10 +1,12 @@
|
||||||
|
local wea_c = worldeditadditions_core
|
||||||
|
local Vector3 = wea_c.Vector3
|
||||||
|
|
||||||
|
|
||||||
-- ███ ██ ██████ ██ ███████ ███████ █████ ██████ ██████ ██ ██ ██ ██████ ██████
|
-- ███ ██ ██████ ██ ███████ ███████ █████ ██████ ██████ ██ ██ ██ ██████ ██████
|
||||||
-- ████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
|
-- ████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
|
||||||
-- ██ ██ ██ ██ ██ ██ ███████ █████ ███████ ██████ ██████ ██ ████ █████ ██ ██
|
-- ██ ██ ██ ██ ██ ██ ███████ █████ ███████ ██████ ██████ ██ ████ █████ ██ ██
|
||||||
-- ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
|
-- ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
|
||||||
-- ██ ████ ██████ ██ ███████ ███████ ██ ██ ██ ██ ███████ ██ ███████ ██████
|
-- ██ ████ ██████ ██ ███████ ███████ ██ ██ ██ ██ ███████ ██ ███████ ██████
|
||||||
local wea_c = worldeditadditions_core
|
|
||||||
|
|
||||||
|
|
||||||
worldeditadditions_core.register_command("noiseapply2d", {
|
worldeditadditions_core.register_command("noiseapply2d", {
|
||||||
params = "<threshold> <scale> <command_name> <args>",
|
params = "<threshold> <scale> <command_name> <args>",
|
||||||
|
@ -30,7 +32,7 @@ worldeditadditions_core.register_command("noiseapply2d", {
|
||||||
|
|
||||||
-- Run parsing of target command
|
-- Run parsing of target command
|
||||||
-- Lifted from cubeapply in WorldEdit
|
-- Lifted from cubeapply in WorldEdit
|
||||||
local args_parsed = {cmd_we.parse(args_text)}
|
local args_parsed = { cmd_we.parse(args_text) }
|
||||||
if not table.remove(args_parsed, 1) then
|
if not table.remove(args_parsed, 1) then
|
||||||
return false, args_parsed[1]
|
return false, args_parsed[1]
|
||||||
end
|
end
|
||||||
|
@ -60,7 +62,7 @@ worldeditadditions_core.register_command("noiseapply2d", {
|
||||||
return false, "Your privileges are insufficient to execute the command '"..cmd.."'."
|
return false, "Your privileges are insufficient to execute the command '"..cmd.."'."
|
||||||
end
|
end
|
||||||
|
|
||||||
local pos1, pos2 = worldeditadditions.Vector3.sort(
|
local pos1, pos2 = Vector3.sort(
|
||||||
worldedit.pos1[name],
|
worldedit.pos1[name],
|
||||||
worldedit.pos2[name]
|
worldedit.pos2[name]
|
||||||
)
|
)
|
||||||
|
@ -69,18 +71,18 @@ worldeditadditions_core.register_command("noiseapply2d", {
|
||||||
local success, stats_time = worldeditadditions.noiseapply2d(
|
local success, stats_time = worldeditadditions.noiseapply2d(
|
||||||
pos1, pos2,
|
pos1, pos2,
|
||||||
threshold,
|
threshold,
|
||||||
worldeditadditions.Vector3.new(
|
Vector3.new(
|
||||||
scale, scale, scale
|
scale, scale, scale
|
||||||
),
|
),
|
||||||
function()
|
function()
|
||||||
cmd.func(name, worldeditadditions.table.unpack(args_parsed))
|
cmd.func(name, wea_c.table.unpack(args_parsed))
|
||||||
end
|
end
|
||||||
)
|
)
|
||||||
if not success then return success, stats_time end
|
if not success then return success, stats_time end
|
||||||
|
|
||||||
local time_overhead = 100 - worldeditadditions.round((stats_time.fn / stats_time.all) * 100, 3)
|
local time_overhead = 100 - wea_c.round((stats_time.fn / stats_time.all) * 100, 3)
|
||||||
local text_time_all = worldeditadditions.format.human_time(stats_time.all)
|
local text_time_all = wea_c.format.human_time(stats_time.all)
|
||||||
local text_time_fn = worldeditadditions.format.human_time(stats_time.fn)
|
local text_time_fn = wea_c.format.human_time(stats_time.fn)
|
||||||
|
|
||||||
minetest.log("action", name.." used //noiseapply2d at "..pos1.." - "..pos2.." in "..text_time_all)
|
minetest.log("action", name.." used //noiseapply2d at "..pos1.." - "..pos2.." in "..text_time_all)
|
||||||
return true, "Complete in "..text_time_all.." ("..text_time_fn.." fn, "..time_overhead.."% noiseapply2d overhead)"
|
return true, "Complete in "..text_time_all.." ("..text_time_fn.." fn, "..time_overhead.."% noiseapply2d overhead)"
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
local wea = worldeditadditions
|
local wea = worldeditadditions
|
||||||
local wea_c = worldeditadditions_core
|
local wea_c = worldeditadditions_core
|
||||||
|
local Vector3 = wea_c.Vector3
|
||||||
|
|
||||||
-- Test command:
|
-- Test command:
|
||||||
-- //multi //fp set1 1330 60 5455 //fp set2 1355 35 5430 //subdivide 10 10 10 fixlight //y
|
-- //multi //fp set1 1330 60 5455 //fp set2 1355 35 5430 //subdivide 10 10 10 fixlight //y
|
||||||
|
@ -14,7 +15,7 @@ local function will_trigger_saferegion(name, cmd_name, args)
|
||||||
if not parse_success then return nil, table.remove(parsed, 1) end
|
if not parse_success then return nil, table.remove(parsed, 1) end
|
||||||
|
|
||||||
if not def.nodes_needed then return false end
|
if not def.nodes_needed then return false end
|
||||||
local result = def.nodes_needed(name, wea.table.unpack(parsed))
|
local result = def.nodes_needed(name, wea_c.table.unpack(parsed))
|
||||||
if not result then return nil, result end
|
if not result then return nil, result end
|
||||||
if result > 10000 then return true end
|
if result > 10000 then return true end
|
||||||
return false
|
return false
|
||||||
|
@ -36,7 +37,7 @@ worldeditadditions_core.register_command("subdivide", {
|
||||||
privs = { worldedit = true },
|
privs = { worldedit = true },
|
||||||
require_pos = 2,
|
require_pos = 2,
|
||||||
parse = function(params_text)
|
parse = function(params_text)
|
||||||
local parts = wea.split(params_text, "%s+", false)
|
local parts = wea_c.split(params_text, "%s+", false)
|
||||||
|
|
||||||
if #parts < 4 then
|
if #parts < 4 then
|
||||||
return false, "Error: Not enough arguments (try /help /subdivide)."
|
return false, "Error: Not enough arguments (try /help /subdivide)."
|
||||||
|
@ -69,9 +70,9 @@ worldeditadditions_core.register_command("subdivide", {
|
||||||
return worldedit.volume(worldedit.pos1[name], worldedit.pos2[name])
|
return worldedit.volume(worldedit.pos1[name], worldedit.pos2[name])
|
||||||
end,
|
end,
|
||||||
func = function(name, chunk_size, cmd_name, args)
|
func = function(name, chunk_size, cmd_name, args)
|
||||||
local time_total = wea.get_ms_time()
|
local time_total = wea_c.get_ms_time()
|
||||||
|
|
||||||
local pos1, pos2 = worldedit.sort_pos(worldedit.pos1[name], worldedit.pos2[name])
|
local pos1, pos2 = Vector3.sort(worldedit.pos1[name], worldedit.pos2[name])
|
||||||
local volume = worldedit.volume(pos1, pos2)
|
local volume = worldedit.volume(pos1, pos2)
|
||||||
|
|
||||||
local cmd = wea_c.fetch_command_def(cmd_name)
|
local cmd = wea_c.fetch_command_def(cmd_name)
|
||||||
|
@ -88,8 +89,8 @@ worldeditadditions_core.register_command("subdivide", {
|
||||||
-- * math.ceil((pos2.y - pos1.y) / (chunk_size.y - 1))
|
-- * math.ceil((pos2.y - pos1.y) / (chunk_size.y - 1))
|
||||||
-- * math.ceil((pos2.z - pos1.z) / (chunk_size.z - 1))
|
-- * math.ceil((pos2.z - pos1.z) / (chunk_size.z - 1))
|
||||||
|
|
||||||
local msg_prefix = "[ subdivide | "..wea.trim(table.concat({cmd_name, args}, " ")).." ] "
|
local msg_prefix = "[ subdivide | "..wea_c.trim(table.concat({cmd_name, args}, " ")).." ] "
|
||||||
local time_last_msg = wea.get_ms_time()
|
local time_last_msg = wea_c.get_ms_time()
|
||||||
|
|
||||||
local cmd_args_parsed = {cmd.parse(args)}
|
local cmd_args_parsed = {cmd.parse(args)}
|
||||||
local success = table.remove(cmd_args_parsed, 1)
|
local success = table.remove(cmd_args_parsed, 1)
|
||||||
|
@ -100,15 +101,15 @@ worldeditadditions_core.register_command("subdivide", {
|
||||||
wea.subdivide(pos1, pos2, chunk_size, function(cpos1, cpos2, stats)
|
wea.subdivide(pos1, pos2, chunk_size, function(cpos1, cpos2, stats)
|
||||||
-- Called on every subblock
|
-- Called on every subblock
|
||||||
if stats.chunks_completed == 1 then
|
if stats.chunks_completed == 1 then
|
||||||
local chunk_size_display = {
|
local chunk_size_display = Vector3.new(
|
||||||
x = stats.chunk_size.x + 1,
|
stats.chunk_size.x + 1, -- x
|
||||||
y = stats.chunk_size.y + 1,
|
stats.chunk_size.y + 1, -- y
|
||||||
z = stats.chunk_size.z + 1
|
stats.chunk_size.z + 1 -- z
|
||||||
}
|
)
|
||||||
worldedit.player_notify(name, string.format(
|
worldedit.player_notify(name, string.format(
|
||||||
"%sStarting - chunk size: %s, %d chunks total (%d nodes)",
|
"%sStarting - chunk size: %s, %d chunks total (%d nodes)",
|
||||||
msg_prefix,
|
msg_prefix,
|
||||||
wea.vector.tostring(chunk_size_display),
|
tostring(chunk_size_display),
|
||||||
stats.chunks_total,
|
stats.chunks_total,
|
||||||
stats.volume_nodes
|
stats.volume_nodes
|
||||||
))
|
))
|
||||||
|
@ -118,26 +119,26 @@ worldeditadditions_core.register_command("subdivide", {
|
||||||
worldedit.pos1[name] = cpos1
|
worldedit.pos1[name] = cpos1
|
||||||
worldedit.pos2[name] = cpos2
|
worldedit.pos2[name] = cpos2
|
||||||
worldedit.marker_update(name)
|
worldedit.marker_update(name)
|
||||||
cmd.func(name, wea.table.unpack(cmd_args_parsed))
|
cmd.func(name, wea_c.table.unpack(cmd_args_parsed))
|
||||||
if will_trigger_saferegion(name, cmd_name, args) then
|
if will_trigger_saferegion(name, cmd_name, args) then
|
||||||
minetest.chatcommands["/y"].func(name)
|
minetest.chatcommands["/y"].func(name)
|
||||||
end
|
end
|
||||||
worldedit.player_notify_unsuppress(name)
|
worldedit.player_notify_unsuppress(name)
|
||||||
|
|
||||||
-- Send updates every 2 seconds, and after the first 3 chunks are done
|
-- Send updates every 2 seconds, and after the first 3 chunks are done
|
||||||
if worldeditadditions.get_ms_time() - time_last_msg > 2 * 1000 or stats.chunks_completed == 3 or stats.chunks_completed == stats.chunks_total then
|
if wea_c.get_ms_time() - time_last_msg > 2 * 1000 or stats.chunks_completed == 3 or stats.chunks_completed == stats.chunks_total then
|
||||||
worldedit.player_notify(name,
|
worldedit.player_notify(name,
|
||||||
string.format("%s%d / %d (~%.2f%%) complete | last chunk: %s, average: %s, %.2f%% emerge overhead, ETA: ~%s",
|
string.format("%s%d / %d (~%.2f%%) complete | last chunk: %s, average: %s, %.2f%% emerge overhead, ETA: ~%s",
|
||||||
msg_prefix,
|
msg_prefix,
|
||||||
stats.chunks_completed, stats.chunks_total,
|
stats.chunks_completed, stats.chunks_total,
|
||||||
(stats.chunks_completed / stats.chunks_total) * 100,
|
(stats.chunks_completed / stats.chunks_total) * 100,
|
||||||
worldeditadditions.format.human_time(math.floor(stats.times.step_last)), -- the time is an integer anyway because precision
|
wea_c.format.human_time(math.floor(stats.times.step_last)), -- the time is an integer anyway because precision
|
||||||
worldeditadditions.format.human_time(wea.average(stats.times.steps)),
|
wea_c.format.human_time(wea_c.average(stats.times.steps)),
|
||||||
stats.emerge_overhead * 100,
|
stats.emerge_overhead * 100,
|
||||||
worldeditadditions.format.human_time(stats.eta)
|
wea_c.format.human_time(stats.eta)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
time_last_msg = wea.get_ms_time()
|
time_last_msg = wea_c.get_ms_time()
|
||||||
end
|
end
|
||||||
end, function(_, _, stats)
|
end, function(_, _, stats)
|
||||||
worldedit.pos1[name] = pos1
|
worldedit.pos1[name] = pos1
|
||||||
|
@ -147,17 +148,17 @@ worldeditadditions_core.register_command("subdivide", {
|
||||||
-- Called on completion
|
-- Called on completion
|
||||||
minetest.log("action", string.format("%s used //subdivide at %s - %s, with %d chunks and %d total nodes in %s",
|
minetest.log("action", string.format("%s used //subdivide at %s - %s, with %d chunks and %d total nodes in %s",
|
||||||
name,
|
name,
|
||||||
wea.vector.tostring(pos1),
|
tostring(pos1),
|
||||||
wea.vector.tostring(pos2),
|
tostring(pos2),
|
||||||
stats.chunks_completed,
|
stats.chunks_completed,
|
||||||
stats.volume_nodes,
|
stats.volume_nodes,
|
||||||
worldeditadditions.format.human_time(stats.times.total)
|
wea_c.format.human_time(stats.times.total)
|
||||||
))
|
))
|
||||||
worldedit.player_notify(name, string.format(
|
worldedit.player_notify(name, string.format(
|
||||||
"%sComplete: %d chunks processed in %s (%.2f%% emerge overhead, emerge totals: %s)",
|
"%sComplete: %d chunks processed in %s (%.2f%% emerge overhead, emerge totals: %s)",
|
||||||
msg_prefix,
|
msg_prefix,
|
||||||
stats.chunks_completed,
|
stats.chunks_completed,
|
||||||
worldeditadditions.format.human_time(stats.times.total),
|
wea_c.format.human_time(stats.times.total),
|
||||||
stats.emerge_overhead * 100,
|
stats.emerge_overhead * 100,
|
||||||
emerge_stats_tostring(stats.emerge)
|
emerge_stats_tostring(stats.emerge)
|
||||||
))
|
))
|
||||||
|
|
Loading…
Reference in a new issue