Skip to content

Commit 7433d65

Browse files
committedNov 27, 2013
Rollback fixes and get_node_actions
1 parent 1fd9a11 commit 7433d65

File tree

8 files changed

+618
-568
lines changed

8 files changed

+618
-568
lines changed
 

‎builtin/chatcommands.lua

+32-21
Original file line numberDiff line numberDiff line change
@@ -515,34 +515,45 @@ minetest.register_on_punchnode(function(pos, node, puncher)
515515
end)
516516

517517
minetest.register_chatcommand("rollback_check", {
518-
params = "[<range>] [<seconds>]",
518+
params = "[<range>] [<seconds>] [limit]",
519519
description = "check who has last touched a node or near it, "..
520-
"max. <seconds> ago (default range=0, seconds=86400=24h)",
520+
"max. <seconds> ago (default range=0, seconds=86400=24h, limit=5)",
521521
privs = {rollback=true},
522522
func = function(name, param)
523-
local range, seconds = string.match(param, "(%d+) *(%d*)")
523+
local range, seconds, limit =
524+
param:match("(%d+) *(%d*) *(%d*)")
524525
range = tonumber(range) or 0
525526
seconds = tonumber(seconds) or 86400
526-
minetest.chat_send_player(name, "Punch a node (limits set: range="..
527-
dump(range).." seconds="..dump(seconds).."s)")
527+
limit = tonumber(limit) or 5
528+
if limit > 100 then
529+
minetest.chat_send_player(name, "That limit is too high!")
530+
return
531+
end
532+
minetest.chat_send_player(name, "Punch a node (range="..
533+
range..", seconds="..seconds.."s, limit="..limit..")")
534+
528535
minetest.rollback_punch_callbacks[name] = function(pos, node, puncher)
529536
local name = puncher:get_player_name()
530-
minetest.chat_send_player(name, "Checking...")
531-
local actor, act_p, act_seconds =
532-
minetest.rollback_get_last_node_actor(pos, range, seconds)
533-
if actor == "" then
537+
minetest.chat_send_player(name, "Checking "..minetest.pos_to_string(pos).."...")
538+
local actions = minetest.rollback_get_node_actions(pos, range, seconds, limit)
539+
local num_actions = #actions
540+
if num_actions == 0 then
534541
minetest.chat_send_player(name, "Nobody has touched the "..
535-
"specified location in "..dump(seconds).." seconds")
542+
"specified location in "..seconds.." seconds")
536543
return
537544
end
538-
local nodedesc = "this node"
539-
if act_p.x ~= pos.x or act_p.y ~= pos.y or act_p.z ~= pos.z then
540-
nodedesc = minetest.pos_to_string(act_p)
545+
local time = os.time()
546+
for i = num_actions, 1, -1 do
547+
local action = actions[i]
548+
minetest.chat_send_player(name,
549+
("%s %s %s -> %s %d seconds ago.")
550+
:format(
551+
minetest.pos_to_string(action.pos),
552+
action.actor,
553+
action.oldnode.name,
554+
action.newnode.name,
555+
time - action.time))
541556
end
542-
local nodename = minetest.get_node(act_p).name
543-
minetest.chat_send_player(name, "Last actor on "..nodedesc..
544-
" was "..actor..", "..dump(act_seconds)..
545-
"s ago (node is now "..nodename..")")
546557
end
547558
end,
548559
})
@@ -554,7 +565,7 @@ minetest.register_chatcommand("rollback", {
554565
func = function(name, param)
555566
local target_name, seconds = string.match(param, ":([^ ]+) *(%d*)")
556567
if not target_name then
557-
local player_name = nil;
568+
local player_name = nil
558569
player_name, seconds = string.match(param, "([^ ]+) *(%d*)")
559570
if not player_name then
560571
minetest.chat_send_player(name, "Invalid parameters. See /help rollback and /help rollback_check")
@@ -564,13 +575,13 @@ minetest.register_chatcommand("rollback", {
564575
end
565576
seconds = tonumber(seconds) or 60
566577
minetest.chat_send_player(name, "Reverting actions of "..
567-
dump(target_name).." since "..dump(seconds).." seconds.")
578+
target_name.." since "..seconds.." seconds.")
568579
local success, log = minetest.rollback_revert_actions_by(
569580
target_name, seconds)
570-
if #log > 10 then
581+
if #log > 100 then
571582
minetest.chat_send_player(name, "(log is too long to show)")
572583
else
573-
for _,line in ipairs(log) do
584+
for _, line in pairs(log) do
574585
minetest.chat_send_player(name, line)
575586
end
576587
end

‎builtin/deprecated.lua

+5
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,8 @@ setmetatable(minetest.env, {
4646
return rawget(table, key)
4747
end
4848
})
49+
50+
function minetest.rollback_get_last_node_actor(pos, range, seconds)
51+
return minetest.rollback_get_node_actions(pos, range, seconds, 1)[1]
52+
end
53+

‎doc/lua_api.txt

+2-2
Original file line numberDiff line numberDiff line change
@@ -1402,8 +1402,8 @@ minetest.handle_node_drops(pos, drops, digger)
14021402
^ Can be overridden to get different functionality (eg. dropping items on
14031403
ground)
14041404

1405-
Rollbacks:
1406-
minetest.rollback_get_last_node_actor(p, range, seconds) -> actor, p, seconds
1405+
Rollback:
1406+
minetest.rollback_get_node_actions(pos, range, seconds, limit) -> {{actor, pos, time, oldnode, newnode}, ...}
14071407
^ Find who has done something to a node, or near a node
14081408
^ actor: "player:<name>", also "liquid".
14091409
minetest.rollback_revert_actions_by(actor, seconds) -> bool, log messages

0 commit comments

Comments
 (0)
Please sign in to comment.