153 lines
3.9 KiB
Java
153 lines
3.9 KiB
Java
/**
|
|
* Copyright (c) 2011-2014, SpaceToad and the BuildCraft Team
|
|
* http://www.mod-buildcraft.com
|
|
*
|
|
* 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.IAction;
|
|
import buildcraft.api.gates.IGate;
|
|
import buildcraft.api.gates.IGateExpansion;
|
|
import buildcraft.transport.triggers.ActionEnergyPulsar;
|
|
import buildcraft.transport.triggers.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;
|
|
|
|
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(IAction action) {
|
|
if (action instanceof ActionEnergyPulsar) {
|
|
enablePulse();
|
|
return true;
|
|
} else if (action instanceof ActionSingleEnergyPulse) {
|
|
enableSinglePulse();
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public void addActions(List<IAction> 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);
|
|
// TODO: (1 - 1) is coming from pulse count, which has been
|
|
// removed. The add energy algorithm probably needs to be
|
|
// reviewed altogether.
|
|
((IEnergyHandler) pipeTile).receiveEnergy(ForgeDirection.UNKNOWN, Math.min(1 << (1 - 1), 64) * 10,
|
|
false);
|
|
hasPulsed = true;
|
|
} else {
|
|
gate.setPulsing(true);
|
|
}
|
|
}
|
|
|
|
private void enableSinglePulse() {
|
|
singlePulse = true;
|
|
isActive = true;
|
|
}
|
|
|
|
private void enablePulse() {
|
|
isActive = true;
|
|
singlePulse = false;
|
|
}
|
|
|
|
private void disablePulse() {
|
|
if (!isActive) {
|
|
hasPulsed = false;
|
|
}
|
|
isActive = false;
|
|
}
|
|
|
|
@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.setInteger("tick", tick);
|
|
}
|
|
|
|
@Override
|
|
public void readFromNBT(NBTTagCompound nbt) {
|
|
isActive = nbt.getBoolean("isActive");
|
|
singlePulse = nbt.getBoolean("singlePulse");
|
|
hasPulsed = nbt.getBoolean("hasPulsed");
|
|
tick = nbt.getInteger("tick");
|
|
}
|
|
}
|
|
}
|