diff --git a/src/main/java/resonantinduction/mechanical/fluid/pipe/PartPipe.java b/src/main/java/resonantinduction/mechanical/fluid/pipe/PartPipe.java index e9012764..18ad16fb 100644 --- a/src/main/java/resonantinduction/mechanical/fluid/pipe/PartPipe.java +++ b/src/main/java/resonantinduction/mechanical/fluid/pipe/PartPipe.java @@ -52,7 +52,7 @@ public class PartPipe extends PartFramedConnection>>BlockDrain>>FillArea>>Error>>CollectionSorter"); e.printStackTrace(); } } diff --git a/src/main/java/resonantinduction/mechanical/fluid/pump/TileGrate.java b/src/main/java/resonantinduction/mechanical/fluid/pump/TileGrate.java index bf736b4b..c0c9dc86 100644 --- a/src/main/java/resonantinduction/mechanical/fluid/pump/TileGrate.java +++ b/src/main/java/resonantinduction/mechanical/fluid/pump/TileGrate.java @@ -17,7 +17,9 @@ import net.minecraftforge.fluids.FluidTank; import net.minecraftforge.fluids.FluidTankInfo; import net.minecraftforge.fluids.IFluidHandler; import resonantinduction.api.fluid.IDrain; +import universalelectricity.api.net.IUpdate; import universalelectricity.api.vector.Vector3; +import universalelectricity.core.net.NetworkTickHandler; import calclavia.lib.prefab.tile.TileAdvanced; import calclavia.lib.utility.FluidUtility; @@ -116,7 +118,8 @@ public class TileGrate extends TileAdvanced implements IFluidHandler, IDrain return 0; } if (currentWorldEdits < MAX_FLUID_MODIFY_RATE) - { int remainingVolume = resource.amount; + { + int remainingVolume = resource.amount; /* ID LIQUID BLOCK AND SET VARS FOR BLOCK PLACEMENT */ if (resource == null || resource.amount < FluidContainerRegistry.BUCKET_VOLUME) @@ -127,13 +130,12 @@ public class TileGrate extends TileAdvanced implements IFluidHandler, IDrain List fluids = new ArrayList(); List blocks = new ArrayList(); List filled = new ArrayList(); - if (getFillList() == null || getFillList().size() == 0) { doPathfinding(); } - + /* Sort results out into two groups and clear the rest out of the result list */ Iterator it = this.getFillFinder().refresh().results.iterator(); while (it.hasNext()) @@ -152,7 +154,7 @@ public class TileGrate extends TileAdvanced implements IFluidHandler, IDrain it.remove(); } } - + /* Fill non-full fluids first */ for (Vector3 loc : fluids) { @@ -160,7 +162,7 @@ public class TileGrate extends TileAdvanced implements IFluidHandler, IDrain { break; } - + if (FluidUtility.isFillableFluid(worldObj, loc)) { remainingVolume -= FluidUtility.fillBlock(worldObj, loc, FluidUtility.getStack(resource, remainingVolume), doFill); @@ -172,7 +174,7 @@ public class TileGrate extends TileAdvanced implements IFluidHandler, IDrain } } } - + /* Fill air or replaceable blocks after non-full fluids */ for (Vector3 loc : blocks) { @@ -180,7 +182,7 @@ public class TileGrate extends TileAdvanced implements IFluidHandler, IDrain { break; } - + if (FluidUtility.isFillableBlock(worldObj, loc)) { remainingVolume -= FluidUtility.fillBlock(worldObj, loc, FluidUtility.getStack(resource, remainingVolume), doFill); @@ -233,26 +235,56 @@ public class TileGrate extends TileAdvanced implements IFluidHandler, IDrain break; } - Vector3 drainLocation = iterator.next(); + final Vector3 drainLocation = iterator.next(); FluidStack drainStack = FluidUtility.drainBlock(worldObj, drainLocation, false, 3); if (resultStack == null) { - drainStack = FluidUtility.drainBlock(worldObj, drainLocation, doDrain, 3); + drainStack = FluidUtility.drainBlock(worldObj, drainLocation, doDrain, 2); resultStack = drainStack; } else if (resultStack.equals(drainStack)) { - drainStack = FluidUtility.drainBlock(worldObj, drainLocation, doDrain, 3); + drainStack = FluidUtility.drainBlock(worldObj, drainLocation, doDrain, 2); resultStack.amount += drainStack.amount; } if (doDrain) { - currentWorldEdits++; - iterator.remove(); + /** + * Add a delayed notify event to prevent infinite fluids from reconstructing + * quickly. + */ + NetworkTickHandler.addNetwork(new IUpdate() + { + int wait = 60; + + @Override + public void update() + { + if (--wait <= 0) + { + worldObj.notifyBlocksOfNeighborChange(drainLocation.intX(), drainLocation.intY(), drainLocation.intZ(), worldObj.getBlockId(drainLocation.intX(), drainLocation.intY(), drainLocation.intZ()), 20); + } + } + + @Override + public boolean canUpdate() + { + return true; + } + + @Override + public boolean continueUpdate() + { + return wait > 0; + } + }); } + currentWorldEdits++; + iterator.remove(); + if (resultStack.amount >= maxDrain) { break; diff --git a/src/main/java/resonantinduction/mechanical/fluid/pump/TilePump.java b/src/main/java/resonantinduction/mechanical/fluid/pump/TilePump.java index c6057180..c83d5773 100644 --- a/src/main/java/resonantinduction/mechanical/fluid/pump/TilePump.java +++ b/src/main/java/resonantinduction/mechanical/fluid/pump/TilePump.java @@ -117,11 +117,8 @@ public class TilePump extends TileMachine implements IReadOut, ITileConnector, I Set drainList = null; if (drain instanceof IDrain) { - if (!((IDrain) drain).canDrain(((IDrain) drain).getDirection())) - { - return; - } - origin = vec.modifyPositionFromSide(((IDrain) drain).getDirection()); + + origin = vec.modifyPositionFromSide(((IDrain) drain).getDirection()); entity = origin.getTileEntity(world); if (entity instanceof IFluidHandler) { diff --git a/src/main/java/resonantinduction/mechanical/fluid/tank/TileTank.java b/src/main/java/resonantinduction/mechanical/fluid/tank/TileTank.java index 1a5f7e8e..b62758c5 100644 --- a/src/main/java/resonantinduction/mechanical/fluid/tank/TileTank.java +++ b/src/main/java/resonantinduction/mechanical/fluid/tank/TileTank.java @@ -50,4 +50,10 @@ public class TileTank extends TileFluidNetwork } } + @Override + public boolean canFlow() + { + return false; + } + }