Newer
Older
ultramine_hawkeye / src / main / java / org / ultramine / mods / hawkeye / Rebuild.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.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");
         }

      }
   }
}