resonant-induction/archive/java/resonantinduction/mechanical/fluid/network/NetworkPipes.java
2014-01-11 17:44:07 +08:00

144 lines
3.9 KiB
Java

package resonantinduction.mechanical.fluid.network;
import java.util.EnumSet;
import java.util.Map.Entry;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.ForgeDirection;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.IFluidHandler;
import resonantinduction.core.tilenetwork.INetworkPart;
import resonantinduction.core.tilenetwork.prefab.NetworkUpdateHandler;
import resonantinduction.old.api.fluid.INetworkPipe;
import calclavia.lib.utility.FluidHelper;
/**
* Extension on the fluid container network to provide a more advanced reaction to fluid passing
* threw each pipe. As well this doubled as a pressure network for those machines that support the
* use of pressure.
*
* @author Rseifert
*/
public class NetworkPipes extends NetworkFluidTiles
{
private boolean processingRequest;
public float pressureProduced;
static
{
NetworkUpdateHandler.registerNetworkClass("FluidPipes", NetworkPipes.class);
}
public NetworkPipes()
{
super();
}
public NetworkPipes(INetworkPart... parts)
{
super(parts);
}
@Override
public int fillNetworkTank(TileEntity source, FluidStack stack, boolean doFill)
{
int netFill = this.addFluidToNetwork(source, stack, doFill);
if (netFill > 0)
{
return netFill;
}
return super.fillNetworkTank(source, stack, doFill);
}
/**
* Adds FLuid to this network from one of the connected Pipes
*
* @param source - Were this liquid came from
* @param stack - LiquidStack to be sent
* @param doFill - actually fill the tank or just check numbers
* @return the amount of liquid consumed from the init stack
*/
public int addFluidToNetwork(TileEntity source, FluidStack stack, boolean doFill)
{
return this.addFluidToNetwork(source, stack, doFill, false);
}
/**
* Adds FLuid to this network from one of the connected Pipes
*
* @param source - Were this liquid came from
* @param stack - LiquidStack to be sent
* @param doFill - actually fill the tank or just check numbers
* @param allowStore - allows the network to store this liquid in the pipes
* @return the amount of liquid consumed from the init stack
*/
public int addFluidToNetwork(TileEntity source, FluidStack sta, boolean doFill, boolean allowStore)
{
int used = 0;
FluidStack stack = sta.copy();
if (!this.processingRequest && stack != null)
{
this.processingRequest = true;
if (stack.amount > this.getMaxFlow(stack))
{
stack = FluidHelper.getStack(stack, this.getMaxFlow(stack));
}
/* Secondary fill target if the main target is not found */
IFluidHandler tankToFill = null;
int mostFill = 0;
ForgeDirection fillDir = ForgeDirection.UNKNOWN;
boolean found = false;
/* FIND THE FILL TARGET FROM THE LIST OF FLUID RECIEVERS */
for (Entry<IFluidHandler, EnumSet<ForgeDirection>> entry : this.connctedFluidHandlers.entrySet())
{
IFluidHandler tankContainer = entry.getKey();
if (tankContainer instanceof TileEntity && tankContainer != source && !(tankContainer instanceof INetworkPipe))
{
for (ForgeDirection dir : entry.getValue())
{
if (tankContainer.canFill(dir, sta.getFluid()))
{
int fill = tankContainer.fill(dir, stack, false);
if (fill > mostFill)
{
tankToFill = tankContainer;
mostFill = fill;
fillDir = dir;
}
}
}
}
if (found)
{
break;
}
}// End of tank finder
if (tankToFill != null)
{
// TODO set up a list of tanks to actually fill rather than one at a time
used = tankToFill.fill(fillDir, stack, doFill);
// System.out.println("Seconday Target " + used + doFill);
}
}
this.processingRequest = false;
return used;
}
/** Gets the flow rate of the system using the lowest flow rate */
public int getMaxFlow(FluidStack stack)
{
return 1000;
}
/** Updates after the pressure has changed a good bit */
public void onPresureChange()
{
this.cleanUpMembers();
}
}