private static void RedoHandler( Player player, Command 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();
}