From 0949b970d69aed705ee6226dca2dae2dab2f885b Mon Sep 17 00:00:00 2001 From: Calclavia Date: Tue, 11 Mar 2014 21:27:37 +0800 Subject: [PATCH] Grate's drain distance now depends on pressure --- .../archaic/fluid/grate/TileGrate.java | 78 +++++++++++++------ .../fluid/gutter/FluidGravityNode.java | 4 +- .../archaic/fluid/gutter/TileGutter.java | 15 ++-- 3 files changed, 68 insertions(+), 29 deletions(-) diff --git a/archaic/src/main/java/resonantinduction/archaic/fluid/grate/TileGrate.java b/archaic/src/main/java/resonantinduction/archaic/fluid/grate/TileGrate.java index 269e40d5..d8da9015 100644 --- a/archaic/src/main/java/resonantinduction/archaic/fluid/grate/TileGrate.java +++ b/archaic/src/main/java/resonantinduction/archaic/fluid/grate/TileGrate.java @@ -15,10 +15,11 @@ import net.minecraftforge.fluids.FluidContainerRegistry; import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTankInfo; -import resonantinduction.archaic.fluid.gutter.FluidGravityNode; import resonantinduction.core.Reference; import resonantinduction.core.fluid.TilePressureNode; +import resonantinduction.core.grid.fluid.FluidPressureNode; import universalelectricity.api.vector.Vector3; +import calclavia.lib.configurable.Config; import calclavia.lib.prefab.tile.IRotatable; import calclavia.lib.utility.FluidUtility; import cpw.mods.fml.relauncher.Side; @@ -26,6 +27,9 @@ import cpw.mods.fml.relauncher.SideOnly; public class TileGrate extends TilePressureNode implements IRotatable { + @Config(comment = "The multiplier for the influence of the grate. This is multiplied by the pressure applied.") + private static final double grateEffectMultiplier = 10; + @SideOnly(Side.CLIENT) private static Icon iconFront, iconSide; @@ -37,7 +41,7 @@ public class TileGrate extends TilePressureNode implements IRotatable isOpaqueCube = false; normalRender = true; rotationMask = Byte.parseByte("111111", 2); - node = new FluidGravityNode(this); + node = new FluidPressureNode(this); } @Override @@ -63,7 +67,7 @@ public class TileGrate extends TilePressureNode implements IRotatable @Override public FluidTankInfo[] getTankInfo(ForgeDirection from) { - return null; + return new FluidTankInfo[] { getPressureTank().getInfo() }; } @Override @@ -83,27 +87,59 @@ public class TileGrate extends TilePressureNode implements IRotatable { super.updateEntity(); - System.out.println("" + getPressureTank().getFluidAmount()); + if (!world().isRemote) + { + if (ticks % 20 == 0) + { + int pressure = node.getPressure(getDirection()); + int blockEffect = (int) Math.abs(pressure * grateEffectMultiplier); + + if (pressure > 0) + { + // Fill + if (getPressureTank().getFluidAmount() >= FluidContainerRegistry.BUCKET_VOLUME) + { + if (gratePath == null) + { + gratePath = new GratePathfinder(true); + gratePath.startFill(new Vector3(this), getPressureTank().getFluid().getFluid().getID()); + } + + int filledInWorld = gratePath.tryFill(getPressureTank().getFluidAmount(), blockEffect); + getPressureTank().drain(filledInWorld, true); + } + } + else if (pressure < 0) + { + // Drain + int maxDrain = getPressureTank().getCapacity() - getPressureTank().getFluidAmount(); + + if (maxDrain > 0) + { + if (gratePath == null) + { + gratePath = new GratePathfinder(false); + + if (!gratePath.startDrain(new Vector3(this))) + { + resetPath(); + } + } + + if (gratePath != null && gratePath.tryPopulateDrainMap(blockEffect)) + { + getPressureTank().fill(gratePath.tryDrain(maxDrain, true), true); + } + } + } + } + } } @Override public int fill(ForgeDirection from, FluidStack resource, boolean doFill) { - int filled = getPressureTank().fill(resource, doFill); - - if (getPressureTank().getFluidAmount() > 0) - { - if (gratePath == null) - { - gratePath = new GratePathfinder(true); - gratePath.startFill(new Vector3(this), getPressureTank().getFluid().getFluid().getID()); - } - - int filledInWorld = gratePath.tryFill(getPressureTank().getFluidAmount(), 2000); - getPressureTank().drain(filledInWorld, true); - } - - return filled; + return getPressureTank().fill(resource, doFill); } @Override @@ -117,8 +153,6 @@ public class TileGrate extends TilePressureNode implements IRotatable @Override public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) { - System.out.println("DRAIN"); - if (maxDrain > 0) { if (gratePath == null) @@ -137,7 +171,7 @@ public class TileGrate extends TilePressureNode implements IRotatable } } - return null; + return getPressureTank().drain(maxDrain, doDrain); } /** diff --git a/archaic/src/main/java/resonantinduction/archaic/fluid/gutter/FluidGravityNode.java b/archaic/src/main/java/resonantinduction/archaic/fluid/gutter/FluidGravityNode.java index 96581c66..c5d065f5 100644 --- a/archaic/src/main/java/resonantinduction/archaic/fluid/gutter/FluidGravityNode.java +++ b/archaic/src/main/java/resonantinduction/archaic/fluid/gutter/FluidGravityNode.java @@ -19,10 +19,10 @@ public class FluidGravityNode extends FluidPressureNode public int getPressure(ForgeDirection dir) { if (dir == ForgeDirection.UP) - return -1; + return -2; if (dir == ForgeDirection.DOWN) - return 1; + return 2; return 0; } diff --git a/archaic/src/main/java/resonantinduction/archaic/fluid/gutter/TileGutter.java b/archaic/src/main/java/resonantinduction/archaic/fluid/gutter/TileGutter.java index e01c93fd..f0642ffb 100644 --- a/archaic/src/main/java/resonantinduction/archaic/fluid/gutter/TileGutter.java +++ b/archaic/src/main/java/resonantinduction/archaic/fluid/gutter/TileGutter.java @@ -232,6 +232,11 @@ public class TileGutter extends TilePressureNode } } + protected void onWorldJoin() + { + onNeighborChanged(); + } + @Override public void onNeighborChanged() { @@ -356,13 +361,13 @@ public class TileGutter extends TilePressureNode */ MODEL.renderOnly("left"); } - + if (!WorldUtility.isEnabledSide(sides, dir) || !WorldUtility.isEnabledSide(sides, dir.getRotation(ForgeDirection.UP))) { - /** - * Render strips - */ - MODEL.renderOnly("backCornerL"); + /** + * Render strips + */ + MODEL.renderOnly("backCornerL"); } GL11.glPopMatrix(); }