/** * Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team * http://www.mod-buildcraft.com * <p/> * BuildCraft is distributed under the terms of the Minecraft Mod Public * License 1.0, or MMPL. Please check the contents of the license located in * http://www.mod-buildcraft.com/MMPL-1.0.txt */ package buildcraft.transport.gates; import java.util.List; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; import cofh.api.energy.IEnergyHandler; import buildcraft.BuildCraftTransport; import buildcraft.api.gates.GateExpansionController; import buildcraft.api.gates.IGate; import buildcraft.api.gates.IGateExpansion; import buildcraft.api.statements.IActionInternal; import buildcraft.api.statements.IStatement; import buildcraft.transport.statements.ActionEnergyPulsar; import buildcraft.transport.statements.ActionSingleEnergyPulse; public final class GateExpansionPulsar extends GateExpansionBuildcraft implements IGateExpansion { public static GateExpansionPulsar INSTANCE = new GateExpansionPulsar(); private GateExpansionPulsar() { super("pulsar"); } @Override public GateExpansionController makeController(TileEntity pipeTile) { return new GateExpansionControllerPulsar(pipeTile); } private class GateExpansionControllerPulsar extends GateExpansionController { private static final int PULSE_PERIOD = 10; private boolean isActive; private boolean singlePulse; private boolean hasPulsed; private int tick; private int count; public GateExpansionControllerPulsar(TileEntity pipeTile) { super(GateExpansionPulsar.this, pipeTile); // by default, initialize tick so that not all gates created at // one single moment would do the work at the same time. This // spreads a bit work load. Note, this is not a problem for // existing gates since tick is stored in NBT tick = (int) (Math.random() * PULSE_PERIOD); } @Override public void startResolution() { if (isActive()) { disablePulse(); } } @Override public boolean resolveAction(IStatement action, int count) { if (action instanceof ActionEnergyPulsar) { enablePulse(count); return true; } else if (action instanceof ActionSingleEnergyPulse) { enableSinglePulse(count); return true; } return false; } @Override public void addActions(List<IActionInternal> list) { super.addActions(list); list.add(BuildCraftTransport.actionEnergyPulser); list.add(BuildCraftTransport.actionSingleEnergyPulse); } @Override public void tick(IGate gate) { if (!isActive && hasPulsed) { hasPulsed = false; } if (tick++ % PULSE_PERIOD != 0) { // only do the treatement once every period return; } if (!isActive) { gate.setPulsing(false); return; } if (pipeTile instanceof IEnergyHandler && (!singlePulse || !hasPulsed)) { gate.setPulsing(true); ((IEnergyHandler) pipeTile).receiveEnergy(ForgeDirection.UNKNOWN, Math.min(1 << (count - 1), 64) * 10, false); hasPulsed = true; } else { gate.setPulsing(true); } } private void enableSinglePulse(int count) { singlePulse = true; isActive = true; this.count = count; } private void enablePulse(int count) { isActive = true; singlePulse = false; this.count = count; } private void disablePulse() { if (!isActive) { hasPulsed = false; } isActive = false; this.count = 0; } @Override public boolean isActive() { return isActive; } @Override public void writeToNBT(NBTTagCompound nbt) { nbt.setBoolean("singlePulse", singlePulse); nbt.setBoolean("isActive", isActive); nbt.setBoolean("hasPulsed", hasPulsed); nbt.setByte("pulseCount", (byte) count); nbt.setInteger("tick", tick); } @Override public void readFromNBT(NBTTagCompound nbt) { isActive = nbt.getBoolean("isActive"); singlePulse = nbt.getBoolean("singlePulse"); hasPulsed = nbt.getBoolean("hasPulsed"); count = nbt.getByte("pulseCount"); tick = nbt.getInteger("tick"); } } }