diff --git a/archaic/src/main/java/resonantinduction/archaic/channel/TileChannel.java b/archaic/src/main/java/resonantinduction/archaic/channel/TileChannel.java index 43c2b2933..dc7727291 100644 --- a/archaic/src/main/java/resonantinduction/archaic/channel/TileChannel.java +++ b/archaic/src/main/java/resonantinduction/archaic/channel/TileChannel.java @@ -135,25 +135,24 @@ public class TileChannel extends TileFluidNetwork implements IBlockActivate, IFl @Override public void onWrongPressure(ForgeDirection side, int pressure) { - // TODO place fluid blocks into the world } @Override - public int getMaxPressure() + public int getPressure(ForgeDirection dir) { return 0; } - @Override - public int getPressure() - { - return this.getNetwork().getPressure(); - } - @Override public int getMaxFlowRate() { return 500; } + + @Override + public void setPressure(int amount) + { + + } } diff --git a/build.gradle b/build.gradle index c9026e9d9..ae8c21c48 100644 --- a/build.gradle +++ b/build.gradle @@ -95,7 +95,7 @@ dependencies { compile group: 'calclaviacore', name: 'calclavia-core', version: "${config.version.calclaviacore}", classifier: "dev" compile name: 'CodeChickenLib', version: "${config.version.minecraft}-${config.version.cclib}", ext: 'jar' compile name: 'ForgeMultipart', version: "${config.version.minecraft}-${config.version.fmp}", ext: 'jar' - compile name: 'NotEnoughItems', version: "${config.version.nei}", type: 'jar' + compile name: 'NotEnoughItems', version: "${config.version.nei}", ext: 'jar' } publishing { diff --git a/mechanical/src/main/java/resonantinduction/mechanical/Mechanical.java b/mechanical/src/main/java/resonantinduction/mechanical/Mechanical.java index a9be50216..3aa387f3c 100644 --- a/mechanical/src/main/java/resonantinduction/mechanical/Mechanical.java +++ b/mechanical/src/main/java/resonantinduction/mechanical/Mechanical.java @@ -18,7 +18,9 @@ import resonantinduction.mechanical.fluid.pipe.ItemPipe; import resonantinduction.mechanical.fluid.tank.BlockTank; import resonantinduction.mechanical.fluid.tank.TileTank; import resonantinduction.mechanical.fluid.transport.BlockGrate; +import resonantinduction.mechanical.fluid.transport.BlockPump; import resonantinduction.mechanical.fluid.transport.TileGrate; +import resonantinduction.mechanical.fluid.transport.TilePump; import resonantinduction.mechanical.gear.ItemGear; import resonantinduction.mechanical.gear.ItemGearShaft; import resonantinduction.mechanical.item.ItemPipeGauge; @@ -94,6 +96,7 @@ public class Mechanical public static Block blockTank; public static Block blockReleaseValve; public static Block blockGrate; + public static Block blockPump; public static Item itemPipe; public static Item itemPipeGuage; @@ -124,6 +127,7 @@ public class Mechanical blockTank = contentRegistry.createBlock(BlockTank.class, ItemBlockFluidContainer.class, TileTank.class); blockGrate = contentRegistry.createTile(BlockGrate.class, TileGrate.class); + blockPump = contentRegistry.createTile(BlockPump.class, TilePump.class); itemPipeGuage = contentRegistry.createItem(ItemPipeGauge.class); itemPipe = contentRegistry.createItem(ItemPipe.class); diff --git a/mechanical/src/main/java/resonantinduction/mechanical/fluid/pipe/PartPipe.java b/mechanical/src/main/java/resonantinduction/mechanical/fluid/pipe/PartPipe.java index 7c07c31a8..57be7031d 100644 --- a/mechanical/src/main/java/resonantinduction/mechanical/fluid/pipe/PartPipe.java +++ b/mechanical/src/main/java/resonantinduction/mechanical/fluid/pipe/PartPipe.java @@ -34,8 +34,8 @@ import cpw.mods.fml.relauncher.SideOnly; public class PartPipe extends PartFramedConnection implements IFluidPipe, TSlottedPart, JNormalOcclusion, IHollowConnect, JIconHitEffects { - protected FluidTank tank = new FluidTank(1 * FluidContainerRegistry.BUCKET_VOLUME); - private boolean isExtracting = false; + protected FluidTank tank = new FluidTank(FluidContainerRegistry.BUCKET_VOLUME); + private int pressure; public PartPipe() { @@ -55,44 +55,16 @@ public class PartPipe extends PartFramedConnection> sideMap = new HashMap>(); public HashMap connectionMap = new HashMap(); public int maxFlowRate = 0; - public int maxPressure = 0; public int currentPressure = 0; public int currentFlowRate = 0; @Override public void update() + { + for (IFluidConnector connector : getConnectors()) + { + if (connector instanceof IFluidPipe) + { + calculatePressure((IFluidPipe) connector); + distribute((IFluidPipe) connector); + } + } + } + + /** + * Old pipe distribution code. + */ + @Deprecated + public void oldDistribution() { /* * Slight delay to allow visual effect to take place before draining the pipe's internal @@ -58,7 +75,7 @@ public class PipeNetwork extends FluidNetwork { stack.amount -= handler.fill(dir, FluidUtility.getStack(stack, Math.min(volPerSide, this.maxFlowRate)), true); } - + if (sideCount > 1) --sideCount; if (volPer <= 0) @@ -80,10 +97,130 @@ public class PipeNetwork extends FluidNetwork reconstructTankInfo(); } + /** + * Calculate pressure in this pipe. + */ + public void calculatePressure(IFluidPipe sourcePipe) + { + int totalPressure = 0; + int findCount = 0; + int minPressure = 0; + int maxPressure = 0; + + for (int i = 0; i < 6; i++) + { + Object obj = sourcePipe.getConnections()[i]; + + if (obj instanceof IPressure) + { + int pressure = ((IPressure) obj).getPressure(ForgeDirection.getOrientation(i).getOpposite()); + minPressure = Math.min(pressure, minPressure); + maxPressure = Math.max(pressure, maxPressure); + totalPressure += pressure; + findCount++; + } + } + + if (findCount == 0) + { + sourcePipe.setPressure(0); + } + else + { + /** + * Create pressure loss. + */ + if (minPressure < 0) + minPressure++; + if (maxPressure > 0) + maxPressure--; + + sourcePipe.setPressure(Math.max(minPressure, Math.min(maxPressure, totalPressure / findCount + Integer.signum(totalPressure)))); + } + } + + /** + * Distribute fluid in this pipe based on pressure. + */ + public static void distribute(IFluidPipe sourcePipe) + { + for (int i = 0; i < 6; i++) + { + Object obj = sourcePipe.getConnections()[i]; + + if (obj instanceof IFluidPipe) + { + IFluidPipe otherPipe = (IFluidPipe) obj; + + /** + * Move fluid from higher pressure to lower. In this case, move from tankA to tankB. + */ + int pressureA = sourcePipe.getPressure(ForgeDirection.getOrientation(i)); + int pressureB = otherPipe.getPressure(ForgeDirection.getOrientation(i).getOpposite()); + + if (pressureA >= pressureB) + { + FluidTank tankA = sourcePipe.getInternalTank(); + + if (tankA != null) + { + int amountA = tankA.getFluidAmount(); + + if (amountA > 0) + { + FluidTank tankB = otherPipe.getInternalTank(); + + if (tankB != null) + { + int amountB = tankB.getFluidAmount(); + + int quantity = Math.max(pressureA > pressureB ? 25 : 0, (amountA - amountB) / 2); + quantity = Math.min(Math.min(quantity, tankB.getCapacity() - amountB), amountA); + + if (quantity > 0) + { + tankA.drain(quantity, true); + tankB.fill(new FluidStack(tankA.getFluid().getFluid(), quantity), true); + } + } + } + } + } + } + else if (obj instanceof IFluidHandler) + { + IFluidHandler fluidHandler = (IFluidHandler) obj; + ForgeDirection dir = ForgeDirection.getOrientation(i); + int pressure = sourcePipe.getPressure(dir); + int tankPressure = fluidHandler instanceof IPressure ? ((IPressure) fluidHandler).getPressure(dir.getOpposite()) : 0; + FluidTank sourceTank = sourcePipe.getInternalTank(); + + int transferAmount = (Math.max(pressure, tankPressure) - Math.min(pressure, tankPressure)) * sourcePipe.getMaxFlowRate(); + + if (pressure > tankPressure) + { + if (sourceTank.getFluidAmount() > 0 && transferAmount > 0) + { + FluidStack drainStack = sourceTank.drain(transferAmount, false); + sourceTank.drain(fluidHandler.fill(dir.getOpposite(), drainStack, true), true); + } + } + else if (pressure < tankPressure) + { + if (transferAmount > 0) + { + FluidStack drainStack = fluidHandler.drain(dir.getOpposite(), transferAmount, false); + fluidHandler.drain(dir.getOpposite(), sourceTank.fill(drainStack, true), true); + } + } + } + } + } + @Override public boolean canUpdate() { - return getTank().getFluidAmount() > 0 && sideMap.size() > 0 && getConnectors().size() > 0; + return getConnectors().size() > 0; } @Override @@ -97,7 +234,6 @@ public class PipeNetwork extends FluidNetwork { this.sideMap.clear(); this.maxFlowRate = Integer.MAX_VALUE; - this.maxPressure = Integer.MAX_VALUE; super.reconstruct(); } @@ -106,14 +242,6 @@ public class PipeNetwork extends FluidNetwork { super.reconstructConnector(connector); - if (connector instanceof IFluidPipe) - { - if (((IFluidPipe) connector).getMaxFlowRate() < this.maxFlowRate) - this.maxFlowRate = ((IFluidPipe) connector).getMaxFlowRate(); - - if (((IFluidPipe) connector).getMaxPressure() < this.maxPressure) - this.maxPressure = ((IFluidPipe) connector).getMaxPressure(); - } for (int i = 0; i < 6; i++) { if (connector.getConnections()[i] instanceof IFluidHandler && !(connector.getConnections()[i] instanceof IFluidPipe)) @@ -154,10 +282,4 @@ public class PipeNetwork extends FluidNetwork { return new PipeNetwork(); } - - @Override - public int getPressure() - { - return this.currentPressure; - } } diff --git a/src/main/models/Archive/Pump.tcn b/src/main/models/Archive/Pump.tcn index 6789f39c7..b84fc5a83 100644 Binary files a/src/main/models/Archive/Pump.tcn and b/src/main/models/Archive/Pump.tcn differ diff --git a/src/main/models/Archive/BasicPump.tcn b/src/main/resources/assets/resonantinduction/models/pump.tcn similarity index 100% rename from src/main/models/Archive/BasicPump.tcn rename to src/main/resources/assets/resonantinduction/models/pump.tcn