Newer
Older
ultramine_hawkeye / src / main / java / org / ultramine / mods / hawkeye / Rollback.java
@zaxar163 zaxar163 on 5 Jul 2018 4 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.ArrayList;
import java.util.Iterator;
import java.util.List;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.world.World;
import net.minecraftforge.common.util.BlockSnapshot;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.ultramine.mods.hawkeye.database.DataManager;
import org.ultramine.mods.hawkeye.entry.DataEntry;
import org.ultramine.mods.hawkeye.util.HawkUtil;

public class Rollback {
   private static final Logger log = LogManager.getLogger();
   private final PlayerSession session;
   private Iterator rollbackQueue;
   private final List undo = new ArrayList();
   private Rollback.RollbackType rollbackType;

   public Rollback(Rollback.RollbackType rollbackType, PlayerSession session) {
      this.rollbackType = Rollback.RollbackType.GLOBAL;
      this.rollbackType = rollbackType;
      this.session = session;
      this.rollbackQueue = session.getRollbackResults().iterator();
      if (!this.rollbackQueue.hasNext()) {
         HawkUtil.sendMessage(session.getSender(), "&cNo results found to rollback");
      } else {
         HawkUtil.debug("Starting rollback of " + session.getRollbackResults().size() + " results");
         session.setDoingRollback(true);
         HawkUtil.sendMessage(session.getSender(), "&cAttempting to rollback &7" + session.getRollbackResults().size() + "&c results");
         FMLCommonHandler.instance().bus().register(this);
      }
   }

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

         while(i < 200 && this.rollbackQueue.hasNext()) {
            DataEntry entry = (DataEntry)this.rollbackQueue.next();
            if (entry.getType() != null && entry.getType().canRollback()) {
               World world = HawkEye.getWorld(entry.getWorld());
               if (world != null) {
                  BlockSnapshot state = BlockSnapshot.getBlockSnapshot(world, (int)entry.getX(), (int)entry.getY(), (int)entry.getZ());
                  if (this.rollbackType == Rollback.RollbackType.GLOBAL) {
                     boolean addUndo;
                     try {
                        addUndo = entry.rollback(world);
                     } catch (Exception var8) {
                        addUndo = true;
                        log.error("Error while rollbacking entry at [" + entry.getWorld() + "](" + entry.getX() + ", " + entry.getY() + ", " + entry.getZ() + ")", var8);
                     }

                     if (addUndo) {
                        entry.setUndoState(state);
                        this.undo.add(entry);
                     }
                  } else if (this.rollbackType == Rollback.RollbackType.LOCAL && entry.rollbackPlayer(world, (EntityPlayerMP)this.session.getSender())) {
                     entry.setUndoState(state);
                     this.undo.add(entry);
                  }

                  ++i;
               }
            }
         }

         if (!this.rollbackQueue.hasNext()) {
            FMLCommonHandler.instance().bus().unregister(this);
            this.session.setDoingRollback(false);
            this.session.setRollbackResults(this.undo);
            if (this.rollbackType == Rollback.RollbackType.GLOBAL) {
               HawkUtil.sendMessage(this.session.getSender(), "&cRollback complete, &7" + this.undo.size() + "&c edits performed");
               HawkUtil.sendMessage(this.session.getSender(), "&cUndo this rollback using &7/hawk undo");
               if (HawkEye.instance.config.general.deleteDataOnRollback) {
                  DataManager.deleteEntries(this.undo);
               }
            } else {
               HawkUtil.sendMessage(this.session.getSender(), "&cRollback preview complete, &7" + this.undo.size() + "&c edits performed to you");
               HawkUtil.sendMessage(this.session.getSender(), "&cType &7/hawk apply&c to make these changes permanent or &7/hawk cancel&c to cancel");
            }

            HawkUtil.debug("Rollback complete, " + this.undo.size() + " edits performed");
         }

      }
   }

   public static enum RollbackType {
      GLOBAL,
      LOCAL;
   }
}