package zmaster587.advancedRocketry.cable;
import java.util.Iterator;
import java.util.Random;
import java.util.Map.Entry;
import zmaster587.advancedRocketry.api.DataStorage;
import zmaster587.advancedRocketry.api.DataStorage.DataType;
import zmaster587.advancedRocketry.api.satellite.IDataHandler;
import zmaster587.advancedRocketry.util.IDataInventory;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidTankInfo;
import net.minecraftforge.fluids.IFluidHandler;
public class DataNetwork extends CableNetwork {
/**
* Create a new network and get an ID
* @return ID of this new network
*/
public static DataNetwork initNetwork() {
Random random = new Random(System.currentTimeMillis());
int id = random.nextInt();
while(usedIds.contains(id)){ id = random.nextInt(); };
DataNetwork net = new DataNetwork();
usedIds.add(id);
net.networkID = id;
return net;
}
//TODO: balance tanks
@Override
public void tick() {
int amount = 1;
//Return if there is nothing to do
if(sinks.isEmpty() || sources.isEmpty())
return;
//Go through all sinks, if one is not full attempt to fill it
for(DataType data : DataType.values()) {
if(data == DataType.UNDEFINED)
continue;
int demand = 0;
int supply = 0;
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();
IDataHandler dataHandlerSink = (IDataHandler)obj.getKey();
demand += dataHandlerSink.addData(amount, data, obj.getValue(), false);
}
while(sourceItr.hasNext()) {
//Get tile and key
Entry<TileEntity,ForgeDirection> obj = (Entry<TileEntity, ForgeDirection>)sourceItr.next();
IDataHandler dataHandlerSink = (IDataHandler)obj.getKey();
supply += dataHandlerSink.extractData(amount, data, obj.getValue(), false);
}
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();
IDataHandler dataHandlerSink = (IDataHandler)obj.getKey();
amountToMove -= dataHandlerSink.addData(amountToMove, data, obj.getValue(), true);
}
sourceItr = sources.iterator();
while(sourceItr.hasNext()) {
//Get tile and key
Entry<TileEntity,ForgeDirection> obj = (Entry<TileEntity, ForgeDirection>)sourceItr.next();
IDataHandler dataHandlerSink = (IDataHandler)obj.getKey();
amountMoved -= dataHandlerSink.extractData(amountMoved, data, obj.getValue(), true);
}
}
}
}