From 8b4afcac8c9760a510960e51892c6377e05c86c1 Mon Sep 17 00:00:00 2001 From: Calclavia Date: Sun, 23 Feb 2014 21:59:52 +0800 Subject: [PATCH] Added pump and new pressure fluid system --- .../archaic/channel/TileChannel.java | 15 +- build.gradle | 2 +- .../mechanical/Mechanical.java | 4 + .../mechanical/fluid/pipe/PartPipe.java | 70 ++------ .../mechanical/fluid/tank/TankNetwork.java | 9 - ...BlockHydrualicPump.java => BlockPump.java} | 6 +- .../fluid/transport/RenderPump.java | 34 ++++ .../{TileHydraulicPump.java => TilePump.java} | 67 ++++---- .../api/mechanical/fluid/IFluidNetwork.java | 3 - .../api/mechanical/fluid/IFluidPipe.java | 11 +- .../api/mechanical/fluid/IPressure.java | 10 ++ .../api/mechanical/fluid/IPressureInput.java | 2 +- .../core/prefab/fluid/PipeNetwork.java | 158 ++++++++++++++++-- src/main/models/Archive/Pump.tcn | Bin 1783 -> 3158 bytes .../assets/resonantinduction/models/pump.tcn} | Bin 15 files changed, 251 insertions(+), 140 deletions(-) rename mechanical/src/main/java/resonantinduction/mechanical/fluid/transport/{BlockHydrualicPump.java => BlockPump.java} (87%) create mode 100644 mechanical/src/main/java/resonantinduction/mechanical/fluid/transport/RenderPump.java rename mechanical/src/main/java/resonantinduction/mechanical/fluid/transport/{TileHydraulicPump.java => TilePump.java} (56%) create mode 100644 src/main/java/resonantinduction/api/mechanical/fluid/IPressure.java rename src/main/{models/Archive/BasicPump.tcn => resources/assets/resonantinduction/models/pump.tcn} (100%) 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 6789f39c71e9ca262c7e2ee48cdf12cfae0819e1..b84fc5a83d20ab9bc168795a0b8968c4ee890144 100644 GIT binary patch literal 3158 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 literal 1783 zcmbW2eNfT|7{`CXBoP!tR7i4`Z)w&LQ)#}YGv`ZQ_;+K5QfrbspT?flhkAi ztYx((Y7;V>Z<#Yo0aH^md~4Ip1WYI5vS6-1x?6X<+jh@A&vVb+bKk$dpZgL+!0({| z0MG}-#nwCb*iC`1g8+br1pp{u10eW!p-dhl_NI*2-9ZI9ANr*R0gOym87oHJJuQimcJ? z>^b?u5ARdT2L*l&1>gM+KIC^a{o-(3z1i{CeKX4!ELtj^mi5X7EnJKv?l!gt^VJ+_ zqC8-Wp+6Fjr1$dR=1!)Ty%-^qp^IV=JQoaeU`b7+PHvi6AZ+V-=o8aD6Pc&Z+YonG z&Xm{6!aoP68&-HtSw1OuN`r6EqR!e&WNkNkM_gp=v5{wEY<}7~9J<~W7B>iIM!`) zaLb3TbHn(4Jmpev44)4+O1OXXk|if_-hcYe!;#(s{pey->aDAlue=5Jx51a}>)bP2 zxWl&6GP{qcU#I6zdOR)UC<+()mZz9Ot{by9`j!@AH$aQ_v3jIozcEd0KTqfOb&v|tIk###Pj9)$NYC$kJSyr6Oh}v+Poh~NY_i_ zHVHNT`U%d%oKg{l;7`+jw04I{KsBT*akS_)_KHw0nZ)3+UgF{ng1RqVyP7i1;>n{m z*`%A}57sLS?>^YaOz*0j^obE}apdj|bnpia249w_Zkjx`&lbMSCBb5^xw|oT`0b z-nX=y;eAD@@U~4%>Cu+8mEIP}T_b$0?*4Q%7WC4>FXCwUBFZ+ucHJ4P7?zAqKFyPa z@wY>Ih<~%bNVqj&c-8u&tBqK-K9P}>noebfpO`3Hb@-;F3p$B^A0l?8V^t6V>Ld(x&czViMjH}?lk87 zYbf&6mrgZ!)7t7Xmqa> zQc5+Xv}$x!%Y0q>z;@W6xsQ>v{h?I75#x*(vWlRSM>-v>bLxWUhXYQVP%U#q@jmSp z;;ovH?@Fd~zIK=cKUCM`lkhlaoEwgSLsj$#zktcjk=6Ehh{u(hMPah^v_;oiqq&8Z zjwB|N8NT22LdQ@pDy?LOq=3T%>%&xC?iyXo0gu#(LEgDpjjlG5)O=Zd!tLem#!kufcCYE{p<>V)wy18MY!Zlb5`F#a=871Sx9xd1|&Wl}!iD^h6} zgHIR-HaMIQRX-6!9W7)&-Bgp3C<3)ga{J*ozbLM|Qy6bw5YaFSyCKb6k{+12{K*MOF^GNO{2{0 zAfd)||1WfMAR6Xn?rl8OKhQ(ved=cd5JT30wgUeg6K|s7?f6fj@vii{7`{~nR#w6M VA5aoQ^dNtUfL5z%b=$tV{scc0C