package shedar.mods.ic2.nuclearcontrol.crossmod.RF;
import shedar.mods.ic2.nuclearcontrol.crossmod.EnergyStorageData;
import shedar.mods.ic2.nuclearcontrol.tileentities.TileEntityAverageCounter;
import cofh.api.energy.EnergyStorage;
import cofh.api.energy.IEnergyHandler;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.util.ForgeDirection;
public class RFTileEntityAverageCounter extends TileEntityAverageCounter implements IEnergyHandler{
protected EnergyStorage storage = new EnergyStorage(32000);
private int rec;
private int send;
private int duration;
private int AVG;
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
storage.readFromNBT(nbt);
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
storage.writeToNBT(nbt);
}
/* IEnergyConnection */
@Override
public boolean canConnectEnergy(ForgeDirection from) {
return true;
}
/* IEnergyReceiver */
@Override
public int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate) {
rec = maxReceive;
return storage.receiveEnergy(maxReceive, simulate);
}
/* IEnergyProvider */
@Override
public int extractEnergy(ForgeDirection from, int maxExtract, boolean simulate) {
return storage.extractEnergy(maxExtract, simulate);
}
/* IEnergyReceiver and IEnergyProvider */
@Override
public int getEnergyStored(ForgeDirection from) {
return storage.getEnergyStored();
}
@Override
public int getMaxEnergyStored(ForgeDirection from) {
return storage.getMaxEnergyStored();
}
@Override
public void initData() {
super.initData();
}
@Override
public void updateEntity(){
super.updateEntity();
//NCLog.error(storage.getEnergyStored());
if(getNeibough()) {
if (storage.getEnergyStored() > 0) {
transferEnergy();
}
if (!worldObj.isRemote) {
index = (index + 1) % DATA_POINTS;
data[index] = 0;
duration = period * 20;
AVG = duration * send;
clientAverage = AVG;
data[index] = AVG;
//NCLog.fatal(send);
//NCLog.fatal(AVG);
setPowerType((byte) EnergyStorageData.TARGET_TYPE_RF);
send = 0;
rec = 0;
}
}
}
private boolean getNeibough(){
for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) {
TileEntity tile = getWorldObj().getTileEntity(xCoord + direction.offsetX, yCoord + direction.offsetY, zCoord + direction.offsetZ);
if (!(tile instanceof RFTileEntityAverageCounter)) {
if (tile instanceof IEnergyHandler) {
return true;
}
}
}
return false;
}
protected void transferEnergy() {
for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) {
TileEntity tile = getWorldObj().getTileEntity(xCoord + direction.offsetX, yCoord + direction.offsetY, zCoord + direction.offsetZ);
if (!(tile instanceof RFTileEntityAverageCounter)) {
if (tile instanceof IEnergyHandler) {
IEnergyHandler receiver = (IEnergyHandler) tile;
this.sendMaxTo(receiver, direction.getOpposite());
}
}
}
}
public int sendMaxTo(IEnergyHandler pEnergyHandler, ForgeDirection pFrom) {
send = Math.min(storage.getEnergyStored(), 128);
return extractEnergy(pFrom, pEnergyHandler.receiveEnergy(pFrom, Math.min(storage.getEnergyStored(), 128), false), false);
}
}