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.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.entry.DataEntry; import org.ultramine.mods.hawkeye.util.HawkUtil; public class Rebuild { private static final Logger log = LogManager.getLogger(); private final PlayerSession session; private Iterator rebuildQueue; private final List undo = new ArrayList(); private int counter = 0; public Rebuild(PlayerSession session) { this.session = session; this.rebuildQueue = session.getRollbackResults().iterator(); if (!this.rebuildQueue.hasNext()) { HawkUtil.sendMessage(session.getSender(), "&cNo results found to rebuild"); } else { HawkUtil.debug("Starting rebuild of " + session.getRollbackResults().size() + " results"); session.setDoingRollback(true); HawkUtil.sendMessage(session.getSender(), "&cAttempting to rebuild &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.rebuildQueue.hasNext()) { ++i; DataEntry entry = (DataEntry)this.rebuildQueue.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()); boolean addUndo; try { addUndo = entry.rebuild(world); } catch (Exception var8) { addUndo = true; log.error("Error while rebuild entry at [" + entry.getWorld() + "](" + entry.getX() + ", " + entry.getY() + ", " + entry.getZ() + ")", var8); } if (addUndo) { entry.setUndoState(state); this.undo.add(entry); } ++this.counter; } } } if (!this.rebuildQueue.hasNext()) { FMLCommonHandler.instance().bus().unregister(this); this.session.setDoingRollback(false); this.session.setRollbackResults(this.undo); HawkUtil.sendMessage(this.session.getSender(), "&cRebuild complete, &7" + this.counter + "&c edits performed"); HawkUtil.sendMessage(this.session.getSender(), "&cUndo this rebuild using &7/hawk undo"); HawkUtil.debug("Rebuild complete, " + this.counter + " edits performed"); } } } }