Newer
Older
ultramine_hawkeye / src / main / java / org / ultramine / mods / hawkeye / Undo.java
@zaxar163 zaxar163 on 5 Jul 2018 3 KB Inital.
package org.ultramine.mods.hawkeye;

import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.TickEvent.Phase;
import cpw.mods.fml.common.gameevent.TickEvent.ServerTickEvent;
import java.util.Iterator;
import java.util.List;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.network.play.server.S23PacketBlockChange;
import net.minecraftforge.common.util.BlockSnapshot;
import org.ultramine.mods.hawkeye.database.DataManager;
import org.ultramine.mods.hawkeye.entry.DataEntry;
import org.ultramine.mods.hawkeye.util.HawkUtil;

public class Undo {
   private final PlayerSession session;
   private Iterator undoQueue;
   private int counter = 0;
   private Rollback.RollbackType undoType;

   public Undo(Rollback.RollbackType undoType, PlayerSession session) {
      this.undoType = Rollback.RollbackType.GLOBAL;
      this.undoType = undoType;
      this.session = session;
      this.undoQueue = session.getRollbackResults().iterator();
      if (session.doingRollback()) {
         HawkUtil.sendMessage(session.getSender(), "&cYour previous rollback is still processing, please wait before performing an undo!");
      } else if (!this.undoQueue.hasNext()) {
         HawkUtil.sendMessage(session.getSender(), "&cNo results found to undo");
      } else {
         HawkUtil.debug("Starting undo of " + session.getRollbackResults().size() + " results");
         session.setDoingRollback(true);
         HawkUtil.sendMessage(session.getSender(), "&cAttempting to undo &7" + session.getRollbackResults().size() + "&c rollback edits");
         FMLCommonHandler.instance().bus().register(this);
      }
   }

   @SubscribeEvent
   public void onServerTick(ServerTickEvent e) {
      if (e.phase != Phase.END) {
         byte i = 0;

         while(i < 200 && this.undoQueue.hasNext()) {
            DataEntry entry = (DataEntry)this.undoQueue.next();
            if (entry.getUndoState() != null) {
               if (this.undoType == Rollback.RollbackType.GLOBAL) {
                  BlockSnapshot block = entry.getUndoState();
                  block.world.restoringBlockSnapshots = true;
                  block.restore(true);
                  block.world.restoringBlockSnapshots = false;
                  if (HawkEye.instance.config.general.deleteDataOnRollback) {
                     DataManager.addEntry(entry);
                  }
               } else {
                  EntityPlayerMP player = (EntityPlayerMP)this.session.getSender();
                  BlockSnapshot block = entry.getUndoState();
                  S23PacketBlockChange p = new S23PacketBlockChange(block.x, block.y, block.z, block.world);
                  p.field_148883_d = block.getReplacedBlock();
                  p.field_148884_e = block.meta;
                  player.playerNetServerHandler.sendPacket(p);
               }

               ++this.counter;
            }
         }

         if (!this.undoQueue.hasNext()) {
            FMLCommonHandler.instance().bus().unregister(this);
            this.session.setDoingRollback(false);
            this.session.setRollbackResults((List)null);
            HawkUtil.sendMessage(this.session.getSender(), "&cUndo complete, &7" + this.counter + " &cedits performed");
            HawkUtil.debug("Undo complete, " + this.counter + " edits performed");
         }

      }
   }
}