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