mirror of
https://github.com/HybridDog/we_undo.git
synced 2024-12-04 21:23:54 +01:00
Show useful information in //show_journal
This commit is contained in:
parent
ce2136be18
commit
4d945c1ffd
@ -103,9 +103,6 @@ improve memory usage.
|
|||||||
* Allow undoing changes which happened before other changes (considered unsafe)
|
* Allow undoing changes which happened before other changes (considered unsafe)
|
||||||
e.g. //undo ~1 to undo the change before the latest one
|
e.g. //undo ~1 to undo the change before the latest one
|
||||||
* Add code for more of the WorldEdit chat commands (see the lists above)
|
* Add code for more of the WorldEdit chat commands (see the lists above)
|
||||||
* worldedit pyramid fix
|
* Add a verbose option to the //show_journal output to show detailed information
|
||||||
* Improve the //show_journal output
|
such as the UTC time when the changes happened and the required memory to
|
||||||
* Show the UTC time of the changes
|
store them
|
||||||
* Check if the shown number of changed nodes is correct
|
|
||||||
* Show the executed chat command and parameters
|
|
||||||
* Show the affected area, number of changed metadatas, nodes, etc.
|
|
||||||
|
180
init.lua
180
init.lua
@ -216,9 +216,10 @@ minetest.register_chatcommand("/show_journal", {
|
|||||||
minetest.get_color_escape_sequence"#8ABDA9" .. "* "
|
minetest.get_color_escape_sequence"#8ABDA9" .. "* "
|
||||||
end
|
end
|
||||||
local data = j.ring[(j.start + i) % max_commands]
|
local data = j.ring[(j.start + i) % max_commands]
|
||||||
info = info .. data.type
|
|
||||||
if undo_info_funcs[data.type] then
|
if undo_info_funcs[data.type] then
|
||||||
info = info .. ": " .. undo_info_funcs[data.type](data)
|
info = info .. undo_info_funcs[data.type](data)
|
||||||
|
else
|
||||||
|
info = info .. data.type
|
||||||
end
|
end
|
||||||
if i < j.entry_count-1 then
|
if i < j.entry_count-1 then
|
||||||
info = info .. "\n" ..
|
info = info .. "\n" ..
|
||||||
@ -293,7 +294,7 @@ if remember_innocuous then
|
|||||||
if not data.pos then
|
if not data.pos then
|
||||||
return "Set pos" .. data.id
|
return "Set pos" .. data.id
|
||||||
end
|
end
|
||||||
return "changed pos" .. data.id .. ", previous value: " ..
|
return "Changed pos" .. data.id .. ", previous value: " ..
|
||||||
minetest.pos_to_string(data.pos)
|
minetest.pos_to_string(data.pos)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -312,16 +313,16 @@ override_chatcommand("/n",
|
|||||||
)
|
)
|
||||||
|
|
||||||
override_chatcommand("/y",
|
override_chatcommand("/y",
|
||||||
function(...)
|
function()
|
||||||
local t = y_pending[command_invoker]
|
local t = y_pending[command_invoker]
|
||||||
if t and t.before then
|
if t and t.before then
|
||||||
t.before(...)
|
t.before(t.params)
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
function(...)
|
function()
|
||||||
local t = y_pending[command_invoker]
|
local t = y_pending[command_invoker]
|
||||||
if t and t.after then
|
if t and t.after then
|
||||||
t.after(...)
|
t.after(t.params)
|
||||||
end
|
end
|
||||||
y_pending[command_invoker] = nil
|
y_pending[command_invoker] = nil
|
||||||
end
|
end
|
||||||
@ -335,9 +336,10 @@ local function override_cc_with_confirm(cname, func_before, func_after)
|
|||||||
-- player then calls //y (unless the player calls //n before //y).
|
-- player then calls //y (unless the player calls //n before //y).
|
||||||
-- Therefore these two functions should only do temporary overridings of
|
-- Therefore these two functions should only do temporary overridings of
|
||||||
-- relevant functions, e.g. worldedit.cube.
|
-- relevant functions, e.g. worldedit.cube.
|
||||||
local function func_after_wrap(...)
|
local function func_after_wrap(params)
|
||||||
y_pending[command_invoker] = {before = func_before, after = func_after}
|
y_pending[command_invoker] = {before = func_before, after = func_after,
|
||||||
return func_after(...)
|
params = params}
|
||||||
|
return func_after(params)
|
||||||
end
|
end
|
||||||
return override_chatcommand(cname, func_before, func_after_wrap)
|
return override_chatcommand(cname, func_before, func_after_wrap)
|
||||||
end
|
end
|
||||||
@ -748,11 +750,45 @@ undo_funcs.nodes = function(name, data)
|
|||||||
data.count_p1 .. " param1s set, " .. data.count_p2 ..
|
data.count_p1 .. " param1s set, " .. data.count_p2 ..
|
||||||
" param2s set and " .. #indices_m .. " metaens changed")
|
" param2s set and " .. #indices_m .. " metaens changed")
|
||||||
end
|
end
|
||||||
|
undo_info_funcs.nodes = function(data)
|
||||||
|
local changed_info = {}
|
||||||
|
local changed_info_numbers = {}
|
||||||
|
if data.count_n > 0 then
|
||||||
|
changed_info[#changed_info+1] = "nodeids"
|
||||||
|
changed_info_numbers[#changed_info_numbers+1] = data.count_n
|
||||||
|
end
|
||||||
|
if data.count_p1 > 0 then
|
||||||
|
changed_info[#changed_info+1] = "param1"
|
||||||
|
changed_info_numbers[#changed_info_numbers+1] = data.count_p1
|
||||||
|
end
|
||||||
|
if data.count_p2 > 0 then
|
||||||
|
changed_info[#changed_info+1] = "param2"
|
||||||
|
changed_info_numbers[#changed_info_numbers+1] = data.count_p2
|
||||||
|
end
|
||||||
|
if data.count_m > 0 then
|
||||||
|
changed_info[#changed_info+1] = "metadata"
|
||||||
|
changed_info_numbers[#changed_info_numbers+1] = data.count_m
|
||||||
|
end
|
||||||
|
changed_info = "(" .. table.concat(changed_info, ", ") .. ")"
|
||||||
|
changed_info_numbers = "(" .. table.concat(changed_info_numbers, ", ") ..
|
||||||
|
")"
|
||||||
|
if changed_info == "()" then
|
||||||
|
changed_info = ", no node, param1, param2 or metadata changes"
|
||||||
|
else
|
||||||
|
changed_info = ", number of changed " .. changed_info .. ": " ..
|
||||||
|
changed_info_numbers
|
||||||
|
end
|
||||||
|
return string.format('Command: "%s", minp: %s, maxp: %s%s',
|
||||||
|
data.command,
|
||||||
|
minetest.pos_to_string(data.pos1),
|
||||||
|
minetest.pos_to_string(data.pos2),
|
||||||
|
changed_info)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
----------------------- World changing commands --------------------------------
|
----------------------- World changing commands --------------------------------
|
||||||
|
|
||||||
local function we_nodeset_wrapper(pos1, pos2, func, ...)
|
local function we_nodeset_wrapper(pos1, pos2, command, func, ...)
|
||||||
assert(command_invoker, "Player not known")
|
assert(command_invoker, "Player not known")
|
||||||
pos1, pos2 = worldedit.sort_pos(pos1, pos2)
|
pos1, pos2 = worldedit.sort_pos(pos1, pos2)
|
||||||
-- FIXME: Protection support isn't needed
|
-- FIXME: Protection support isn't needed
|
||||||
@ -763,7 +799,7 @@ local function we_nodeset_wrapper(pos1, pos2, func, ...)
|
|||||||
local data_before = manip:get_data()
|
local data_before = manip:get_data()
|
||||||
|
|
||||||
we_data = nil
|
we_data = nil
|
||||||
local rv = func(...)
|
local return_values = {func(...)}
|
||||||
|
|
||||||
local ystride = pos2.x - pos1.x + 1
|
local ystride = pos2.x - pos1.x + 1
|
||||||
local zstride = (pos2.y - pos1.y + 1) * ystride
|
local zstride = (pos2.y - pos1.y + 1) * ystride
|
||||||
@ -795,6 +831,7 @@ local function we_nodeset_wrapper(pos1, pos2, func, ...)
|
|||||||
}
|
}
|
||||||
add_to_history({
|
add_to_history({
|
||||||
type = "nodeids",
|
type = "nodeids",
|
||||||
|
command = command,
|
||||||
mem_use = #compressed_data,
|
mem_use = #compressed_data,
|
||||||
pos1 = pos1,
|
pos1 = pos1,
|
||||||
pos2 = pos2,
|
pos2 = pos2,
|
||||||
@ -803,7 +840,7 @@ local function we_nodeset_wrapper(pos1, pos2, func, ...)
|
|||||||
compressed_data = compressed_data
|
compressed_data = compressed_data
|
||||||
}, command_invoker)
|
}, command_invoker)
|
||||||
|
|
||||||
return rv
|
return unpack(return_values)
|
||||||
-- Note: param1, param2 and metadata are not changed by worldedit.set and
|
-- Note: param1, param2 and metadata are not changed by worldedit.set and
|
||||||
-- similar functions
|
-- similar functions
|
||||||
end
|
end
|
||||||
@ -852,9 +889,12 @@ undo_funcs.nodeids = function(name, data)
|
|||||||
worldedit.player_notify(name, data.count .. " nodes set")
|
worldedit.player_notify(name, data.count .. " nodes set")
|
||||||
end
|
end
|
||||||
undo_info_funcs.nodeids = function(data)
|
undo_info_funcs.nodeids = function(data)
|
||||||
return "pos1: " .. minetest.pos_to_string(data.pos1) .. ", pos2: " ..
|
return string.format(
|
||||||
minetest.pos_to_string(data.pos2) .. ", " .. data.count ..
|
'Command: "%s", minp: %s, maxp: %s, %d nodes changed',
|
||||||
" nodes changed"
|
data.command,
|
||||||
|
minetest.pos_to_string(data.pos1),
|
||||||
|
minetest.pos_to_string(data.pos2),
|
||||||
|
data.count)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- A helper function to override the simple functions, e.g. cube, sphere, etc.
|
-- A helper function to override the simple functions, e.g. cube, sphere, etc.
|
||||||
@ -862,21 +902,23 @@ local function override_nodeid_changer(command_names, function_name,
|
|||||||
func_get_boundaries)
|
func_get_boundaries)
|
||||||
-- The function from worldedit which changes nodes, e.g. worldedit["cube"]
|
-- The function from worldedit which changes nodes, e.g. worldedit["cube"]
|
||||||
local changer_original = worldedit[function_name]
|
local changer_original = worldedit[function_name]
|
||||||
-- The overridden function which uses we_nodeset_wrapper to get the nodes
|
|
||||||
-- before the Worldedit operation (changer_original),
|
|
||||||
-- then executes the Worldedit operation,
|
|
||||||
-- and after that calculates and saves the changes
|
|
||||||
local function changer_overridden(...)
|
|
||||||
-- func_get_boundaries depends on the command; it should determine the
|
|
||||||
-- area within which node ids are changed
|
|
||||||
local pos1, pos2 = func_get_boundaries(...)
|
|
||||||
return we_nodeset_wrapper(pos1, pos2, changer_original, ...)
|
|
||||||
end
|
|
||||||
-- Do the before and after overriding
|
-- Do the before and after overriding
|
||||||
for i = 1, #command_names do
|
for i = 1, #command_names do
|
||||||
override_cc_with_confirm(command_names[i],
|
override_cc_with_confirm(command_names[i],
|
||||||
function()
|
function(params)
|
||||||
worldedit[function_name] = changer_overridden
|
-- The overridden function uses we_nodeset_wrapper to get the
|
||||||
|
-- nodes before the Worldedit operation changer_original,
|
||||||
|
-- then executes the Worldedit operation,
|
||||||
|
-- and after that calculates and saves the changes
|
||||||
|
worldedit[function_name] = function(...)
|
||||||
|
-- func_get_boundaries depends on the command;
|
||||||
|
-- it should determine the area within which node ids are
|
||||||
|
-- changed
|
||||||
|
local pos1, pos2 = func_get_boundaries(...)
|
||||||
|
local command = command_names[i] .. " " .. params
|
||||||
|
return we_nodeset_wrapper(pos1, pos2, command,
|
||||||
|
changer_original, ...)
|
||||||
|
end
|
||||||
end,
|
end,
|
||||||
function()
|
function()
|
||||||
worldedit[function_name] = changer_original
|
worldedit[function_name] = changer_original
|
||||||
@ -971,6 +1013,7 @@ override_nodeid_changer({"/spiral"}, "spiral",
|
|||||||
|
|
||||||
|
|
||||||
local we_deserialize = worldedit.deserialize
|
local we_deserialize = worldedit.deserialize
|
||||||
|
local my_we_deserialize_currrent_command
|
||||||
local function my_we_deserialize(pos_base, ...)
|
local function my_we_deserialize(pos_base, ...)
|
||||||
-- remember the previous nodes and meta
|
-- remember the previous nodes and meta
|
||||||
-- Collect the changes by overriding minetest.add_node since this is
|
-- Collect the changes by overriding minetest.add_node since this is
|
||||||
@ -1132,6 +1175,7 @@ local function my_we_deserialize(pos_base, ...)
|
|||||||
}
|
}
|
||||||
add_to_history({
|
add_to_history({
|
||||||
type = "nodes",
|
type = "nodes",
|
||||||
|
command = my_we_deserialize_currrent_command,
|
||||||
mem_use = #compressed_data,
|
mem_use = #compressed_data,
|
||||||
pos1 = minp,
|
pos1 = minp,
|
||||||
pos2 = maxp,
|
pos2 = maxp,
|
||||||
@ -1146,7 +1190,8 @@ local function my_we_deserialize(pos_base, ...)
|
|||||||
return count
|
return count
|
||||||
end
|
end
|
||||||
override_cc_with_confirm("/load",
|
override_cc_with_confirm("/load",
|
||||||
function()
|
function(params)
|
||||||
|
my_we_deserialize_currrent_command = "/load " .. params
|
||||||
worldedit.deserialize = my_we_deserialize
|
worldedit.deserialize = my_we_deserialize
|
||||||
end,
|
end,
|
||||||
function()
|
function()
|
||||||
@ -1156,7 +1201,7 @@ override_cc_with_confirm("/load",
|
|||||||
|
|
||||||
|
|
||||||
-- A helper function to override a complex function, e.g. mtschemplace
|
-- A helper function to override a complex function, e.g. mtschemplace
|
||||||
local function get_overridden_changer(changer_original, func_get_boundaries,
|
local function get_overridden_changer(command, changer_original, func_get_boundaries,
|
||||||
collect_meta)
|
collect_meta)
|
||||||
return function(...)
|
return function(...)
|
||||||
-- Get the boundary positions
|
-- Get the boundary positions
|
||||||
@ -1175,6 +1220,7 @@ local function get_overridden_changer(changer_original, func_get_boundaries,
|
|||||||
local compressed_data = compress_nodedata(changes)
|
local compressed_data = compress_nodedata(changes)
|
||||||
add_to_history({
|
add_to_history({
|
||||||
type = "nodes",
|
type = "nodes",
|
||||||
|
command = command,
|
||||||
mem_use = #compressed_data,
|
mem_use = #compressed_data,
|
||||||
pos1 = pos1,
|
pos1 = pos1,
|
||||||
pos2 = pos2,
|
pos2 = pos2,
|
||||||
@ -1192,27 +1238,28 @@ local function get_overridden_changer(changer_original, func_get_boundaries,
|
|||||||
end
|
end
|
||||||
|
|
||||||
local original_place_schematic = minetest.place_schematic
|
local original_place_schematic = minetest.place_schematic
|
||||||
local my_place_schematic = get_overridden_changer(original_place_schematic,
|
|
||||||
function(pos, schematic_path, rotation, _, _, flags)
|
|
||||||
-- Get the area which is changed by the schematic
|
|
||||||
if rotation then
|
|
||||||
minetest.log("error",
|
|
||||||
"Received a rotation from worldedit's schematic placement; " ..
|
|
||||||
"not yet implemented in we_undo")
|
|
||||||
end
|
|
||||||
if flags then
|
|
||||||
minetest.log("error",
|
|
||||||
"Received flags from worldedit's schematic placement; " ..
|
|
||||||
"not yet implemented in we_undo")
|
|
||||||
end
|
|
||||||
local schem = minetest.read_schematic(schematic_path, {})
|
|
||||||
local pos1 = pos
|
|
||||||
local pos2 = vector.subtract(vector.add(pos1, schem.size), 1)
|
|
||||||
return pos1, pos2
|
|
||||||
end, false)
|
|
||||||
override_cc_with_confirm("/mtschemplace",
|
override_cc_with_confirm("/mtschemplace",
|
||||||
function()
|
function(params)
|
||||||
minetest.place_schematic = my_place_schematic
|
minetest.place_schematic = get_overridden_changer(
|
||||||
|
"/mtschemplace " .. params,
|
||||||
|
original_place_schematic,
|
||||||
|
function(pos, schematic_path, rotation, _, _, flags)
|
||||||
|
-- Get the area which is changed by the schematic
|
||||||
|
if rotation then
|
||||||
|
minetest.log("error",
|
||||||
|
"Received a rotation from worldedit's schematic " ..
|
||||||
|
"placement; not yet implemented in we_undo")
|
||||||
|
end
|
||||||
|
if flags then
|
||||||
|
minetest.log("error",
|
||||||
|
"Received flags from worldedit's schematic " ..
|
||||||
|
"placement; not yet implemented in we_undo")
|
||||||
|
end
|
||||||
|
local schem = minetest.read_schematic(schematic_path, {})
|
||||||
|
local pos1 = pos
|
||||||
|
local pos2 = vector.subtract(vector.add(pos1, schem.size), 1)
|
||||||
|
return pos1, pos2
|
||||||
|
end, false)
|
||||||
end,
|
end,
|
||||||
function()
|
function()
|
||||||
minetest.place_schematic = original_place_schematic
|
minetest.place_schematic = original_place_schematic
|
||||||
@ -1220,19 +1267,20 @@ override_cc_with_confirm("/mtschemplace",
|
|||||||
)
|
)
|
||||||
|
|
||||||
local we_luatransform = worldedit.luatransform
|
local we_luatransform = worldedit.luatransform
|
||||||
local my_luatransform = get_overridden_changer(we_luatransform,
|
|
||||||
function(pos1_actual, pos2_actual)
|
|
||||||
local pos1_further, pos2_further = worldedit.sort_pos(pos1_actual,
|
|
||||||
pos2_actual)
|
|
||||||
-- For safety, add a bit extra space since players can do arbitrary
|
|
||||||
-- things at arbitrary positions with luatransform
|
|
||||||
pos1_further = vector.subtract(pos1_further, 5)
|
|
||||||
pos2_further = vector.add(pos2_further, 5)
|
|
||||||
return pos1_further, pos2_further
|
|
||||||
end, true)
|
|
||||||
override_cc_with_confirm("/luatransform",
|
override_cc_with_confirm("/luatransform",
|
||||||
function()
|
function(params)
|
||||||
worldedit.luatransform = my_luatransform
|
worldedit.luatransform = get_overridden_changer(
|
||||||
|
"/luatransform " .. params,
|
||||||
|
we_luatransform,
|
||||||
|
function(pos1_actual, pos2_actual)
|
||||||
|
local pos1_further, pos2_further = worldedit.sort_pos(pos1_actual,
|
||||||
|
pos2_actual)
|
||||||
|
-- For safety, add a bit extra space since players can do arbitrary
|
||||||
|
-- things at arbitrary positions with luatransform
|
||||||
|
pos1_further = vector.subtract(pos1_further, 5)
|
||||||
|
pos2_further = vector.add(pos2_further, 5)
|
||||||
|
return pos1_further, pos2_further
|
||||||
|
end, true)
|
||||||
end,
|
end,
|
||||||
function()
|
function()
|
||||||
worldedit.luatransform = we_luatransform
|
worldedit.luatransform = we_luatransform
|
||||||
@ -1242,11 +1290,11 @@ override_cc_with_confirm("/luatransform",
|
|||||||
local function override_we_changer(command_name, function_name, collect_meta,
|
local function override_we_changer(command_name, function_name, collect_meta,
|
||||||
func_get_boundaries)
|
func_get_boundaries)
|
||||||
local original_changer = worldedit[function_name]
|
local original_changer = worldedit[function_name]
|
||||||
local my_changer = get_overridden_changer(original_changer,
|
|
||||||
func_get_boundaries, collect_meta)
|
|
||||||
override_cc_with_confirm(command_name,
|
override_cc_with_confirm(command_name,
|
||||||
function()
|
function(params)
|
||||||
worldedit[function_name] = my_changer
|
local command = command_name .. " " .. params
|
||||||
|
worldedit[function_name] = get_overridden_changer(command,
|
||||||
|
original_changer, func_get_boundaries, collect_meta)
|
||||||
end,
|
end,
|
||||||
function()
|
function()
|
||||||
worldedit[function_name] = original_changer
|
worldedit[function_name] = original_changer
|
||||||
|
Loading…
Reference in New Issue
Block a user