2014-08-10 04:20:49 +02:00
|
|
|
package mekanism.common;
|
|
|
|
|
2014-08-20 21:54:05 +02:00
|
|
|
import java.util.ArrayList;
|
2014-08-10 04:20:49 +02:00
|
|
|
import java.util.Arrays;
|
|
|
|
import java.util.Collection;
|
2014-08-16 08:46:07 +02:00
|
|
|
import java.util.EnumSet;
|
2014-08-10 04:20:49 +02:00
|
|
|
import java.util.HashSet;
|
|
|
|
import java.util.Iterator;
|
2014-08-20 21:54:05 +02:00
|
|
|
import java.util.List;
|
2014-08-10 04:20:49 +02:00
|
|
|
import java.util.Map;
|
|
|
|
import java.util.Set;
|
|
|
|
|
|
|
|
import mekanism.api.Coord4D;
|
2014-08-16 08:46:07 +02:00
|
|
|
import mekanism.api.EnumColor;
|
2014-08-10 04:20:49 +02:00
|
|
|
import mekanism.api.transmitters.DynamicNetwork;
|
|
|
|
import mekanism.api.transmitters.IGridTransmitter;
|
|
|
|
import mekanism.api.transmitters.TransmissionType;
|
2014-08-20 21:54:05 +02:00
|
|
|
import mekanism.common.base.ILogisticalTransporter;
|
2014-08-20 21:22:55 +02:00
|
|
|
import mekanism.common.content.transporter.TransporterManager;
|
2014-08-10 04:20:49 +02:00
|
|
|
import mekanism.common.util.TransporterUtils;
|
2014-09-03 20:00:03 +02:00
|
|
|
|
2014-08-10 04:20:49 +02:00
|
|
|
import net.minecraft.inventory.IInventory;
|
2014-08-16 08:46:07 +02:00
|
|
|
import net.minecraft.item.ItemStack;
|
2014-08-10 04:20:49 +02:00
|
|
|
import net.minecraft.tileentity.TileEntity;
|
|
|
|
import net.minecraftforge.common.util.ForgeDirection;
|
|
|
|
import cpw.mods.fml.common.FMLCommonHandler;
|
|
|
|
|
|
|
|
public class InventoryNetwork extends DynamicNetwork<IInventory, InventoryNetwork>
|
|
|
|
{
|
|
|
|
public InventoryNetwork(IGridTransmitter<InventoryNetwork>... varPipes)
|
|
|
|
{
|
|
|
|
transmitters.addAll(Arrays.asList(varPipes));
|
|
|
|
register();
|
|
|
|
}
|
|
|
|
|
|
|
|
public InventoryNetwork(Collection<IGridTransmitter<InventoryNetwork>> collection)
|
|
|
|
{
|
|
|
|
transmitters.addAll(collection);
|
|
|
|
register();
|
|
|
|
}
|
|
|
|
|
|
|
|
public InventoryNetwork(Set<InventoryNetwork> networks)
|
|
|
|
{
|
|
|
|
for(InventoryNetwork net : networks)
|
|
|
|
{
|
|
|
|
if(net != null)
|
|
|
|
{
|
|
|
|
addAllTransmitters(net.transmitters);
|
|
|
|
net.deregister();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
register();
|
|
|
|
}
|
2014-08-16 08:46:07 +02:00
|
|
|
|
2014-08-20 21:54:05 +02:00
|
|
|
public List<AcceptorData> calculateAcceptors(ItemStack stack, EnumColor color)
|
2014-08-16 08:46:07 +02:00
|
|
|
{
|
2014-08-20 21:54:05 +02:00
|
|
|
List<AcceptorData> toReturn = new ArrayList<AcceptorData>();
|
2014-08-16 08:46:07 +02:00
|
|
|
|
2015-02-16 20:40:10 +01:00
|
|
|
for(Coord4D coord : possibleAcceptors.keySet())
|
2014-08-16 08:46:07 +02:00
|
|
|
{
|
|
|
|
EnumSet<ForgeDirection> sides = acceptorDirections.get(coord);
|
|
|
|
IInventory acceptor = (IInventory)coord.getTileEntity(getWorld());
|
|
|
|
|
|
|
|
if(sides == null || sides.isEmpty())
|
|
|
|
{
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2014-08-20 21:54:05 +02:00
|
|
|
AcceptorData data = null;
|
|
|
|
|
2014-08-16 08:46:07 +02:00
|
|
|
for(ForgeDirection side : sides)
|
|
|
|
{
|
|
|
|
ItemStack returned = TransporterManager.getPredictedInsert((TileEntity)acceptor, color, stack, side.ordinal());
|
|
|
|
|
|
|
|
if(TransporterManager.didEmit(stack, returned))
|
|
|
|
{
|
2014-08-20 21:54:05 +02:00
|
|
|
if(data == null)
|
|
|
|
{
|
|
|
|
data = new AcceptorData(coord, returned, side);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
data.sides.add(side);
|
|
|
|
}
|
2014-08-16 08:46:07 +02:00
|
|
|
}
|
|
|
|
}
|
2014-08-20 21:54:05 +02:00
|
|
|
|
|
|
|
if(data != null)
|
|
|
|
{
|
|
|
|
toReturn.add(data);
|
|
|
|
}
|
2014-08-16 08:46:07 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return toReturn;
|
|
|
|
}
|
2014-08-20 21:54:05 +02:00
|
|
|
|
|
|
|
public static class AcceptorData
|
|
|
|
{
|
|
|
|
public Coord4D location;
|
|
|
|
public ItemStack rejected;
|
|
|
|
public EnumSet<ForgeDirection> sides = EnumSet.noneOf(ForgeDirection.class);
|
|
|
|
|
|
|
|
public AcceptorData(Coord4D coord, ItemStack stack, ForgeDirection side)
|
|
|
|
{
|
|
|
|
location = coord;
|
|
|
|
rejected = stack;
|
|
|
|
sides.add(side);
|
|
|
|
}
|
|
|
|
}
|
2014-08-10 04:20:49 +02:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onUpdate()
|
|
|
|
{
|
|
|
|
super.onUpdate();
|
|
|
|
|
|
|
|
if(FMLCommonHandler.instance().getEffectiveSide().isServer())
|
|
|
|
{
|
2014-08-16 08:46:07 +02:00
|
|
|
//Future!
|
2014-08-10 04:20:49 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public synchronized Set<IInventory> getAcceptors(Object... data)
|
|
|
|
{
|
|
|
|
Set<IInventory> toReturn = new HashSet<IInventory>();
|
2014-08-16 08:46:07 +02:00
|
|
|
|
|
|
|
if(FMLCommonHandler.instance().getEffectiveSide().isClient())
|
2014-08-10 04:20:49 +02:00
|
|
|
{
|
2014-08-16 08:46:07 +02:00
|
|
|
return toReturn;
|
2014-08-10 04:20:49 +02:00
|
|
|
}
|
2014-08-16 08:46:07 +02:00
|
|
|
|
2014-08-10 04:20:49 +02:00
|
|
|
return toReturn;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public synchronized void refresh()
|
|
|
|
{
|
|
|
|
Set<IGridTransmitter<InventoryNetwork>> iterPipes = (Set<IGridTransmitter<InventoryNetwork>>)transmitters.clone();
|
|
|
|
Iterator it = iterPipes.iterator();
|
|
|
|
boolean networkChanged = false;
|
|
|
|
|
|
|
|
while(it.hasNext())
|
|
|
|
{
|
|
|
|
IGridTransmitter<InventoryNetwork> conductor = (IGridTransmitter<InventoryNetwork>)it.next();
|
|
|
|
|
|
|
|
if(conductor == null || conductor.getTile().isInvalid())
|
|
|
|
{
|
|
|
|
it.remove();
|
|
|
|
networkChanged = true;
|
|
|
|
transmitters.remove(conductor);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
conductor.setTransmitterNetwork(this);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if(networkChanged)
|
|
|
|
{
|
|
|
|
updateCapacity();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public synchronized void refresh(IGridTransmitter<InventoryNetwork> transmitter)
|
|
|
|
{
|
|
|
|
IInventory[] acceptors = TransporterUtils.getConnectedInventories((ILogisticalTransporter)transmitter.getTile());
|
|
|
|
|
|
|
|
clearAround(transmitter);
|
|
|
|
|
|
|
|
for(IInventory acceptor : acceptors)
|
|
|
|
{
|
|
|
|
ForgeDirection side = ForgeDirection.getOrientation(Arrays.asList(acceptors).indexOf(acceptor));
|
|
|
|
|
|
|
|
if(side != null && acceptor != null && !(acceptor instanceof IGridTransmitter) && transmitter.canConnectToAcceptor(side, true))
|
|
|
|
{
|
|
|
|
possibleAcceptors.put(Coord4D.get((TileEntity)acceptor), acceptor);
|
2014-08-15 22:21:58 +02:00
|
|
|
addSide(Coord4D.get((TileEntity)acceptor), ForgeDirection.getOrientation(Arrays.asList(acceptors).indexOf(acceptor)));
|
2014-08-10 04:20:49 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public String toString()
|
|
|
|
{
|
|
|
|
return "[FluidNetwork] " + transmitters.size() + " transmitters, " + possibleAcceptors.size() + " acceptors.";
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected InventoryNetwork create(Collection<IGridTransmitter<InventoryNetwork>> collection)
|
|
|
|
{
|
|
|
|
return new InventoryNetwork(collection);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public TransmissionType getTransmissionType()
|
|
|
|
{
|
|
|
|
return TransmissionType.ITEM;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public String getNeededInfo()
|
|
|
|
{
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public String getStoredInfo()
|
|
|
|
{
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public String getFlowInfo()
|
|
|
|
{
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|