package zmaster587.advancedRocketry.cable;
import java.util.Iterator;
import java.util.Random;
import java.util.Map.Entry;
import zmaster587.libVulpes.api.IUniversalEnergy;
import zmaster587.libVulpes.util.UniversalBattery;
import cofh.api.energy.IEnergyHandler;
import cofh.api.energy.IEnergyProvider;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.util.ForgeDirection;
public class EnergyNetwork extends CableNetwork implements IUniversalEnergy {
UniversalBattery battery;
public EnergyNetwork() {
battery = new UniversalBattery(500);
}
/**
* Create a new network and get an ID
* @return ID of this new network
*/
public static EnergyNetwork initNetwork() {
Random random = new Random(System.currentTimeMillis());
int id = random.nextInt();
while(usedIds.contains(id)){ id = random.nextInt(); };
EnergyNetwork net = new EnergyNetwork();
usedIds.add(id);
net.networkID = id;
return net;
}
@Override
public boolean merge(CableNetwork cableNetwork) {
//Try not to lose power
if(super.merge(cableNetwork)) {
battery.acceptEnergy(((EnergyNetwork)cableNetwork).battery.getEnergyStored(), false);
return true;
}
return false;
}
//TODO: balance tanks
@Override
public void tick() {
int amount = 1000;
//Return if there is nothing to do
if(sinks.isEmpty() || (sources.isEmpty() && battery.getEnergyStored() != 0))
return;
//Go through all sinks, if one is not full attempt to fill it
int demand = 0;
int supply = battery.getEnergyStored();
Iterator<Entry<TileEntity, ForgeDirection>> sinkItr = sinks.iterator();
Iterator<Entry<TileEntity,ForgeDirection>> sourceItr = sources.iterator();
while(sinkItr.hasNext()) {
//Get tile and key
Entry<TileEntity,ForgeDirection> obj = (Entry<TileEntity, ForgeDirection>)sinkItr.next();
IEnergyHandler dataHandlerSink = (IEnergyHandler) obj.getKey();
demand += dataHandlerSink.receiveEnergy(obj.getValue(), amount, true);
}
while(sourceItr.hasNext()) {
//Get tile and key
Entry<TileEntity,ForgeDirection> obj = (Entry<TileEntity, ForgeDirection>)sourceItr.next();
IEnergyProvider dataHandlerSink = (IEnergyProvider) obj.getKey();
supply += dataHandlerSink.extractEnergy(obj.getValue(),amount, true);
}
int amountMoved, amountToMove;
amountMoved = amountToMove = Math.min(supply, demand);
sinkItr = sinks.iterator();
while(sinkItr.hasNext()) {
//Get tile and key
Entry<TileEntity,ForgeDirection> obj = (Entry<TileEntity, ForgeDirection>)sinkItr.next();
IEnergyHandler dataHandlerSink = (IEnergyHandler) obj.getKey();
amountToMove -= dataHandlerSink.receiveEnergy(obj.getValue(), amountToMove, false);
}
//Try to drain from internal battery first
amountMoved -= battery.extractEnergy(amountMoved, false);
sourceItr = sources.iterator();
while(sourceItr.hasNext()) {
//Get tile and key
Entry<TileEntity,ForgeDirection> obj = (Entry<TileEntity, ForgeDirection>)sourceItr.next();
IEnergyProvider dataHandlerSink = (IEnergyProvider) obj.getKey();
amountMoved -= dataHandlerSink.extractEnergy(obj.getValue(),amountMoved, false);
}
}
@Override
public void setEnergyStored(int amt) {
}
@Override
public int extractEnergy(int amt, boolean simulate) {
return 0;
}
@Override
public int getEnergyStored() {
return 0;
}
@Override
public int getMaxEnergyStored() {
return 0;
}
@Override
public int acceptEnergy(int amt, boolean simulate) {
return battery.acceptEnergy(amt, simulate);
}
@Override
public void setMaxEnergyStored(int max) {
}
}