package speedytools.serverside.actions; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.world.WorldServer; import speedytools.common.utilities.ErrorLog; import speedytools.serverside.network.SpeedyToolsNetworkServer; import speedytools.serverside.worldmanipulation.AsynchronousToken; import speedytools.serverside.worldmanipulation.UniqueTokenID; import speedytools.serverside.worldmanipulation.WorldHistory; /** * User: The Grey Ghost * Date: 3/08/2014 */ public class AsynchronousActionUndo extends AsynchronousActionBase { public AsynchronousActionUndo(SpeedyToolsNetworkServer i_speedyToolsNetworkServer, WorldServer i_worldServer, EntityPlayerMP i_player, WorldHistory i_worldHistory, int i_undoSequenceNumber) { super(i_worldServer, i_player, i_worldHistory, i_undoSequenceNumber); currentStage = ActionStage.SETUP; } @Override public void continueProcessing() { switch (currentStage) { case SETUP: { transactionToUndo = worldHistory.getTransactionIDForNextComplexUndo(entityPlayerMP, worldServer); AsynchronousToken token = worldHistory.performComplexUndoAsynchronous(entityPlayerMP, worldServer, transactionToUndo); if (token == null) { aborting = true; currentStage = ActionStage.COMPLETE; completed = true; break; } currentStage = ActionStage.UNDO; setSubTask(token, currentStage.durationWeight, false); break; } case UNDO: { if (!executeSubTask()) break; AsynchronousToken token = worldHistory.performComplexUndoAsynchronous(entityPlayerMP, worldServer, transactionToUndo); // repeat for any other undo if (token == null) { currentStage = ActionStage.COMPLETE; } else { setSubTask(token, currentStage.durationWeight, true); } break; } case COMPLETE: { if (!completed) { completed = true; } break; } default: { assert false : "Invalid currentStage : " + currentStage; } } } @Override public void abortProcessing() { // can't abort an undo yet. maybe later (or not) ErrorLog.defaultLog().debug("Can't abort an undo yet: AsynchronousActionUndo.abortProcessing() called"); } public enum ActionStage { SETUP(0.0), UNDO(1.0), COMPLETE(0.0); ActionStage(double i_durationWeight) {durationWeight = i_durationWeight;} public double durationWeight; } private ActionStage currentStage; private UniqueTokenID transactionToUndo; }