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; } }