static void RedoHandler([NotNull] Player player, [NotNull] CommandReader cmd) { if (cmd.HasNext) { CdRedo.PrintUsage(player); return; } World playerWorld = player.World; if (playerWorld == null) { PlayerOpException.ThrowNoWorld(player); } UndoState redoState = player.RedoPop(); if (redoState == null) { player.MessageNow("There is currently nothing to redo."); return; } string msg = "Redo: "; if (redoState.Op != null && !redoState.Op.IsDone) { redoState.Op.Cancel(); msg += String.Format("Cancelled {0} (was {1}% done). ", redoState.Op.Description, redoState.Op.PercentDone); } // no need to set player.drawingInProgress here because this is done on the user thread Logger.Log(LogType.UserActivity, "Player {0} initiated /Redo affecting {1} blocks (on world {2})", player.Name, redoState.Buffer.Count, playerWorld.Name); msg += String.Format("Restoring {0} blocks. Type &H/Undo&S to reverse.", redoState.Buffer.Count); player.MessageNow(msg); var op = new UndoDrawOperation(player, redoState, true); op.Prepare(new Vector3I[0]); op.Begin(); }
static void UndoHandler([NotNull] Player player, [NotNull] CommandReader cmd) { World playerWorld = player.World; if (playerWorld == null) { PlayerOpException.ThrowNoWorld(player); } if (cmd.HasNext) { player.Message("Undo command takes no parameters. Did you mean to do &H/UndoPlayer&S or &H/UndoArea&S?"); return; } string msg = "Undo: "; UndoState undoState = player.UndoPop(); if (undoState == null) { player.MessageNow("There is currently nothing to undo."); return; } // Cancel the last DrawOp, if still in progress if (undoState.Op != null && !undoState.Op.IsDone && !undoState.Op.IsCancelled) { undoState.Op.Cancel(); msg += String.Format("Cancelled {0} (was {1}% done). ", undoState.Op.Description, undoState.Op.PercentDone); } // Check if command was too massive. if (undoState.IsTooLargeToUndo) { if (undoState.Op != null) { player.MessageNow("Cannot undo {0}: too massive.", undoState.Op.Description); } else { player.MessageNow("Cannot undo: too massive."); } return; } // no need to set player.drawingInProgress here because this is done on the user thread Logger.Log(LogType.UserActivity, "Player {0} initiated /Undo affecting {1} blocks (on world {2})", player.Name, undoState.Buffer.Count, playerWorld.Name); msg += String.Format("Restoring {0} blocks. Type &H/Redo&S to reverse.", undoState.Buffer.Count); player.MessageNow(msg); var op = new UndoDrawOperation(player, undoState, false); op.Prepare(new Vector3I[0]); op.Begin(); }