Added max pressure and flow rate to pipe network reconstruct

This commit is contained in:
DarkGuardsman 2014-01-21 16:54:25 -05:00
parent ebeaab6400
commit a2a8f8c5e1

View file

@ -11,127 +11,135 @@ import net.minecraftforge.fluids.IFluidHandler;
import resonantinduction.api.fluid.IFluidConnector; import resonantinduction.api.fluid.IFluidConnector;
import resonantinduction.api.fluid.IFluidNetwork; import resonantinduction.api.fluid.IFluidNetwork;
import resonantinduction.api.fluid.IFluidPipe; import resonantinduction.api.fluid.IFluidPipe;
import universalelectricity.api.energy.IConductor;
import universalelectricity.api.vector.Vector3; import universalelectricity.api.vector.Vector3;
import calclavia.lib.utility.FluidUtility; import calclavia.lib.utility.FluidUtility;
/** /** The network for pipe fluid transfer. getNodes() is NOT used.
* The network for pipe fluid transfer. getNodes() is NOT used.
* *
* @author DarkGuardsman * @author DarkGuardsman */
*/
public class PipeNetwork extends FluidNetwork public class PipeNetwork extends FluidNetwork
{ {
public HashMap<IFluidHandler, EnumSet<ForgeDirection>> connectionMap = new HashMap<IFluidHandler, EnumSet<ForgeDirection>>(); public HashMap<IFluidHandler, EnumSet<ForgeDirection>> connectionMap = new HashMap<IFluidHandler, EnumSet<ForgeDirection>>();
public int maxFlowRate = 0;
public int maxPressure = 0;
@Override @Override
public void update() public void update()
{ {
/* /*
* Slight delay to allow visual effect to take place before draining the pipe's internal * Slight delay to allow visual effect to take place before draining the pipe's internal
* tank * tank
*/ */
FluidStack stack = this.getTank().getFluid().copy(); FluidStack stack = this.getTank().getFluid().copy();
int count = this.connectionMap.size(); int count = this.connectionMap.size();
for (Entry<IFluidHandler, EnumSet<ForgeDirection>> entry : this.connectionMap.entrySet()) for (Entry<IFluidHandler, EnumSet<ForgeDirection>> entry : this.connectionMap.entrySet())
{ {
int sideCount = entry.getValue().size(); int sideCount = entry.getValue().size();
for (ForgeDirection dir : entry.getValue()) for (ForgeDirection dir : entry.getValue())
{ {
int volPer = (stack.amount / count); int volPer = (stack.amount / count);
int volPerSide = (volPer / sideCount); int volPerSide = (volPer / sideCount);
int maxFill = 1000; int maxFill = 1000;
TileEntity tile = new Vector3((TileEntity) entry.getKey()).modifyPositionFromSide(dir).getTileEntity(((TileEntity) entry.getKey()).worldObj); TileEntity tile = new Vector3((TileEntity) entry.getKey()).modifyPositionFromSide(dir).getTileEntity(((TileEntity) entry.getKey()).worldObj);
if (tile instanceof IFluidPipe) if (tile instanceof IFluidPipe)
{ {
maxFill = ((IFluidPipe) tile).getMaxFlowRate(); maxFill = ((IFluidPipe) tile).getMaxFlowRate();
} }
stack.amount -= entry.getKey().fill(dir, FluidUtility.getStack(stack, Math.min(volPerSide, maxFill)), true); stack.amount -= entry.getKey().fill(dir, FluidUtility.getStack(stack, Math.min(volPerSide, maxFill)), true);
if (sideCount > 1) if (sideCount > 1)
--sideCount; --sideCount;
if (volPer <= 0) if (volPer <= 0)
break; break;
} }
if (count > 1) if (count > 1)
count--; count--;
if (stack == null || stack.amount <= 0) if (stack == null || stack.amount <= 0)
{ {
stack = null; stack = null;
break; break;
} }
} }
this.getTank().setFluid(stack); this.getTank().setFluid(stack);
// TODO check for change before rebuilding // TODO check for change before rebuilding
this.reconstructTankInfo(); this.reconstructTankInfo();
} }
@Override @Override
public boolean canUpdate() public boolean canUpdate()
{ {
return getTank().getFluidAmount() > 0 && connectionMap.size() > 0 && getConnectors().size() > 0; return getTank().getFluidAmount() > 0 && connectionMap.size() > 0 && getConnectors().size() > 0;
} }
@Override @Override
public boolean continueUpdate() public boolean continueUpdate()
{ {
return canUpdate(); return canUpdate();
} }
@Override @Override
public void reconstruct() public void reconstruct()
{ {
this.connectionMap.clear(); this.connectionMap.clear();
super.reconstruct(); this.maxFlowRate = Integer.MAX_VALUE;
} super.reconstruct();
}
@Override @Override
public void reconstructConnector(IFluidConnector part) public void reconstructConnector(IFluidConnector part)
{ {
super.reconstructConnector(part); super.reconstructConnector(part);
for (int i = 0; i < 6; i++) if (part instanceof IFluidPipe)
{ {
if (part.getConnections()[i] instanceof IFluidHandler && !(part.getConnections()[i] instanceof IFluidPipe)) if (((IFluidPipe) part).getMaxFlowRate() < this.maxFlowRate)
{ this.maxFlowRate = ((IFluidPipe) part).getMaxFlowRate();
EnumSet<ForgeDirection> set = this.connectionMap.get(part.getConnections()[i]);
if (set == null)
{
set = EnumSet.noneOf(ForgeDirection.class);
}
set.add(ForgeDirection.getOrientation(i).getOpposite());
this.connectionMap.put((IFluidHandler) part.getConnections()[i], set);
}
}
}
@Override if (((IFluidPipe) part).getMaxPressure() < this.maxPressure)
public FluidStack drain(IFluidConnector source, ForgeDirection from, FluidStack resource, boolean doDrain) this.maxPressure = ((IFluidPipe) part).getMaxPressure();
{ }
return null; for (int i = 0; i < 6; i++)
} {
if (part.getConnections()[i] instanceof IFluidHandler && !(part.getConnections()[i] instanceof IFluidPipe))
{
EnumSet<ForgeDirection> set = this.connectionMap.get(part.getConnections()[i]);
if (set == null)
{
set = EnumSet.noneOf(ForgeDirection.class);
}
set.add(ForgeDirection.getOrientation(i).getOpposite());
this.connectionMap.put((IFluidHandler) part.getConnections()[i], set);
}
}
}
@Override @Override
public FluidStack drain(IFluidConnector source, ForgeDirection from, int resource, boolean doDrain) public FluidStack drain(IFluidConnector source, ForgeDirection from, FluidStack resource, boolean doDrain)
{ {
return null; return null;
} }
@Override @Override
public Class getConnectorClass() public FluidStack drain(IFluidConnector source, ForgeDirection from, int resource, boolean doDrain)
{ {
return IFluidPipe.class; return null;
} }
@Override @Override
public IFluidNetwork newInstance() public Class getConnectorClass()
{ {
return new PipeNetwork(); return IFluidPipe.class;
} }
@Override
public IFluidNetwork newInstance()
{
return new PipeNetwork();
}
} }