/*
* 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 mods.railcraft.common.carts.EntityCartRF;
import mods.railcraft.common.util.misc.Game;
import mods.railcraft.common.util.misc.MiscTools;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.item.EntityMinecart;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.IIcon;
import net.minecraftforge.common.util.ForgeDirection;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
public abstract class TileRFLoaderBase extends TileLoaderBase {
protected static final int TRANSFER_RATE = 8000;
protected static final int TRANSFER_FADE = 20;
private static final int RF_CAP = 4000000;
protected int amountRF;
protected ForgeDirection direction = ForgeDirection.NORTH;
private int ticksSinceTransfer;
public TileRFLoaderBase() {
setInventorySize(0);
}
@Override
public IIcon getIcon(int side) {
if (side == direction.ordinal())
return getMachineType().getTexture(isProcessing() ? 7 : 8);
return getMachineType().getTexture(isProcessing() ? 0 : 6);
}
@Override
public void onBlockPlacedBy(EntityLivingBase entityliving, ItemStack stack) {
super.onBlockPlacedBy(entityliving, stack);
direction = MiscTools.getSideFacingTrack(worldObj, xCoord, yCoord, zCoord);
if (direction == ForgeDirection.UNKNOWN)
direction = MiscTools.getSideClosestToPlayer(worldObj, xCoord, yCoord, zCoord, entityliving);
}
@Override
public boolean isManualMode() {
return false;
}
@Override
public boolean canHandleCart(EntityMinecart cart) {
return !isSendCartGateAction() && cart instanceof EntityCartRF;
}
@Override
public boolean isProcessing() {
return ticksSinceTransfer > 0;
}
@Override
public void updateEntity() {
super.updateEntity();
if (Game.isNotHost(getWorld()))
return;
int capacity = getMaxRF();
if (amountRF > capacity)
amountRF = capacity;
boolean wasProcessing = isProcessing();
if (processCart())
ticksSinceTransfer = TRANSFER_FADE;
else if (ticksSinceTransfer > 0)
ticksSinceTransfer--;
if (isProcessing() != wasProcessing)
sendUpdateToClient();
}
protected abstract boolean processCart();
@Override
public void writeToNBT(NBTTagCompound data) {
super.writeToNBT(data);
data.setInteger("rf", amountRF);
data.setByte("direction", (byte) direction.ordinal());
}
@Override
public void readFromNBT(NBTTagCompound data) {
super.readFromNBT(data);
amountRF = data.getInteger("rf");
direction = ForgeDirection.getOrientation(data.getByte("direction"));
}
@Override
public void writePacketData(DataOutputStream data) throws IOException {
super.writePacketData(data);
data.writeByte(direction.ordinal());
data.writeBoolean(isProcessing());
}
@Override
public void readPacketData(DataInputStream data) throws IOException {
super.readPacketData(data);
direction = ForgeDirection.getOrientation(data.readByte());
boolean transfer = data.readBoolean();
if (isProcessing() != transfer) {
ticksSinceTransfer = transfer ? TRANSFER_FADE : 0;
markBlockForUpdate();
}
}
@Override
public boolean rotateBlock(ForgeDirection axis) {
if (direction == axis)
direction = axis.getOpposite();
else
direction = axis;
markBlockForUpdate();
return true;
}
public int addRF(int rf, boolean simulate) {
if (rf <= 0)
return 0;
if (amountRF >= RF_CAP)
return 0;
if (RF_CAP - amountRF >= rf) {
if (!simulate)
amountRF += rf;
return rf;
}
int used = RF_CAP - amountRF;
if (!simulate)
amountRF = RF_CAP;
return used;
}
public int removeRF(int request, boolean simulate) {
if (request <= 0)
return 0;
if (amountRF >= request) {
if (!simulate)
amountRF -= request;
return request;
}
int ret = amountRF;
if (!simulate)
amountRF = 0;
return ret;
}
public int getRF() {
return amountRF;
}
public void setRF(int energy) {
this.amountRF = energy;
}
public int getMaxRF() {
return RF_CAP;
}
}