/*
* Copyright (c) CovertJaguar, 2014 http://railcraft.info
*
* This code is the property of CovertJaguar
* and may only be used with explicit written
* permission unless otherwise specified on the
* license page at http://railcraft.info/wiki/info:license.
*/
package mods.railcraft.common.blocks.machine.gamma;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import net.minecraft.entity.item.EntityMinecart;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.IIcon;
import mods.railcraft.api.carts.CartTools;
import mods.railcraft.api.carts.IEnergyTransfer;
import mods.railcraft.common.blocks.machine.IEnumMachine;
import mods.railcraft.common.gui.EnumGui;
import mods.railcraft.common.gui.GuiHandler;
import mods.railcraft.common.plugins.ic2.ISinkDelegate;
import mods.railcraft.common.plugins.ic2.TileIC2SinkDelegate;
import mods.railcraft.common.util.misc.Game;
import mods.railcraft.common.util.network.IGuiReturnHandler;
import net.minecraftforge.common.util.ForgeDirection;
public class TileEnergyLoader extends TileLoaderEnergyBase implements ISinkDelegate, IGuiReturnHandler {
private static final short[] INPUT_LEVELS = {512, 2048};
private boolean waitTillFull = false;
private boolean waitIfEmpty = true;
private TileEntity sinkDelegate;
@Override
public IEnumMachine getMachineType() {
return EnumMachineGamma.ENERGY_LOADER;
}
@Override
public IIcon getIcon(int side) {
if (direction.ordinal() == side)
return getMachineType().getTexture(3);
if (side != 0 && side != 1)
return getMachineType().getTexture(2);
return getMachineType().getTexture(1);
}
@Override
public boolean openGui(EntityPlayer player) {
GuiHandler.openGui(EnumGui.LOADER_ENERGY, player, worldObj, xCoord, yCoord, zCoord);
return true;
}
@Override
public void updateEntity() {
super.updateEntity();
if (Game.isNotHost(getWorld()))
return;
transferedEnergy = false;
transferRate = 0;
EntityMinecart cart = CartTools.getMinecartOnSide(worldObj, xCoord, yCoord, zCoord, 0.1f, direction);
if (cart != currentCart) {
setPowered(false);
currentCart = cart;
cartWasSent();
}
if (cart == null)
return;
if (!(cart instanceof IEnergyTransfer)) {
if (CartTools.cartVelocityIsLessThan(cart, STOP_VELOCITY))
setPowered(true);
return;
}
if (isSendCartGateAction()) {
if (CartTools.cartVelocityIsLessThan(cart, STOP_VELOCITY))
setPowered(true);
return;
}
IEnergyTransfer energyCart = (IEnergyTransfer) cart;
if (!energyCart.canInjectEnergy() || energyCart.getTier() > getTier()) {
if (CartTools.cartVelocityIsLessThan(cart, STOP_VELOCITY))
setPowered(true);
return;
}
if (isPaused())
return;
if (energy > 0 && energyCart.getEnergy() < energyCart.getCapacity()) {
double usage = (int) (energyCart.getTransferLimit() * Math.pow(1.5, overclockerUpgrades));
double injection = (int) (energyCart.getTransferLimit() * Math.pow(1.3, overclockerUpgrades));
if (usage > energy) {
double ratio = (double) energy / (double) usage;
usage = energy;
injection = (int) (injection * ratio);
}
transferRate = (int) injection;
double extra = energyCart.injectEnergy(this, injection, getTier(), true, false, false);
energy -= usage - extra;
transferedEnergy = extra != injection;
}
if (!transferedEnergy && !isPowered() && CartTools.cartVelocityIsLessThan(cart, STOP_VELOCITY))
if (!waitTillFull && energyCart.getEnergy() > 0)
setPowered(true);
else if (!waitIfEmpty && !waitTillFull && energyCart.getEnergy() == 0)
setPowered(true);
else if (energyCart.getEnergy() >= energyCart.getCapacity())
setPowered(true);
}
@Override
public void writeToNBT(NBTTagCompound nbttagcompound) {
super.writeToNBT(nbttagcompound);
nbttagcompound.setBoolean("WaitIfEmpty", waitIfEmpty());
nbttagcompound.setBoolean("WaitTillFull", waitTillFull());
}
@Override
public void readFromNBT(NBTTagCompound nbttagcompound) {
super.readFromNBT(nbttagcompound);
setWaitIfEmpty(nbttagcompound.getBoolean("WaitIfEmpty"));
setWaitTillFull(nbttagcompound.getBoolean("WaitTillFull"));
}
@Override
public void writePacketData(DataOutputStream data) throws IOException {
super.writePacketData(data);
byte bits = 0;
bits |= waitIfEmpty ? 1 : 0;
bits |= waitTillFull ? 2 : 0;
data.writeByte(bits);
}
@Override
public void readPacketData(DataInputStream data) throws IOException {
super.readPacketData(data);
byte bits = data.readByte();
waitIfEmpty = (bits & 1) != 0;
waitTillFull = (bits & 2) != 0;
}
@Override
public void writeGuiData(DataOutputStream data) throws IOException {
data.writeBoolean(waitIfEmpty);
data.writeBoolean(waitTillFull);
}
@Override
public void readGuiData(DataInputStream data, EntityPlayer sender) throws IOException {
waitIfEmpty = data.readBoolean();
waitTillFull = data.readBoolean();
}
@Override
public double injectEnergy(ForgeDirection directionFrom, double amount) {
energy += amount;
return 0;
}
@Override
public boolean acceptsEnergyFrom(TileEntity emitter, ForgeDirection direction) {
return this.direction != direction;
}
public boolean waitTillFull() {
return waitTillFull;
}
public void setWaitTillFull(boolean waitTillFull) {
this.waitTillFull = waitTillFull;
}
public boolean waitIfEmpty() {
return waitIfEmpty;
}
public void setWaitIfEmpty(boolean waitIfEmpty) {
this.waitIfEmpty = waitIfEmpty;
}
@Override
public double getDemandedEnergy() {
return getCapacity() - energy;
}
@Override
public int getSinkTier() {
return transformerUpgrades <= 0 ? INPUT_LEVELS[0] : INPUT_LEVELS[1];
}
@Override
public TileEntity getIC2Delegate() {
if (sinkDelegate == null)
try {
sinkDelegate = new TileIC2SinkDelegate(this);
} catch (Throwable error) {
Game.logErrorAPI("IndustrialCraft", error, null);
}
return sinkDelegate;
}
@Override
public TileEntity getTile() {
return this;
}
}