static void UndoPlayerLookup([NotNull] SchedulerTask task) {
BlockDBUndoArgs args = (BlockDBUndoArgs)task.UserState;
if (args == null) throw new NullReferenceException("task.UserState");
bool allPlayers = (args.Targets.Length == 0);
string cmdName = (args.Not ? "UndoPlayerNot" : "UndoPlayer");
// prepare to look up
string targetList;
if (allPlayers) {
targetList = "EVERYONE";
} else if (args.Not) {
targetList = "EVERYONE except " + args.Targets.JoinToClassyString();
} else {
targetList = args.Targets.JoinToClassyString();
}
BlockDBEntry[] changes;
if (args.CountLimit > 0) {
// count-limited lookup
if (args.Targets.Length == 0) {
changes = args.World.BlockDB.Lookup(args.CountLimit);
} else {
changes = args.World.BlockDB.Lookup(args.CountLimit, args.Targets, args.Not);
}
if (changes.Length > 0) {
Logger.Log(LogType.UserActivity,
"{0}: Asked {1} to confirm undo on world {2}",
cmdName,
args.Player.Name,
args.World.Name);
args.Player.Confirm(BlockDBUndoConfirmCallback,
args,
"Undo last {0} changes made by {1}&S?",
changes.Length,
targetList);
}
} else {
// time-limited lookup
if (args.Targets.Length == 0) {
changes = args.World.BlockDB.Lookup(Int32.MaxValue, args.AgeLimit);
} else {
changes = args.World.BlockDB.Lookup(Int32.MaxValue, args.Targets, args.Not, args.AgeLimit);
}
if (changes.Length > 0) {
Logger.Log(LogType.UserActivity,
"{0}: Asked {1} to confirm undo on world {2}",
cmdName,
args.Player.Name,
args.World.Name);
args.Player.Confirm(BlockDBUndoConfirmCallback,
args,
"Undo changes ({0}) made by {1}&S in the last {2}?",
changes.Length,
targetList,
args.AgeLimit.ToMiniString());
}
}
// stop if there's nothing to undo
if (changes.Length == 0) {
args.Player.Message("{0}: Found nothing to undo.", cmdName);
} else {
args.Entries = changes;
}
}