diff --git a/src/main/java/resonantinduction/archaic/engineering/TileEngineeringTable.java b/src/main/java/resonantinduction/archaic/engineering/TileEngineeringTable.java index 14905fd2..12c055a3 100644 --- a/src/main/java/resonantinduction/archaic/engineering/TileEngineeringTable.java +++ b/src/main/java/resonantinduction/archaic/engineering/TileEngineeringTable.java @@ -239,7 +239,7 @@ public class TileEngineeringTable extends TileAdvanced implements IPacketReceive } } } - + onInventoryChanged(); } @@ -301,57 +301,60 @@ public class TileEngineeringTable extends TileAdvanced implements IPacketReceive @Override public void onInventoryChanged() { - if (!worldObj.isRemote) + if (worldObj != null) { - this.inventory[CRAFTING_OUTPUT_SLOT] = null; - - /** Try to craft from crafting grid. If not possible, then craft from imprint. */ - boolean didCraft = false; - - /** Simulate an Inventory Crafting Instance */ - InventoryCrafting inventoryCrafting = this.getCraftingMatrix(); - - ItemStack matrixOutput = CraftingManager.getInstance().findMatchingRecipe(inventoryCrafting, this.worldObj); - - if (matrixOutput != null && this.getCraftingManager().getIdealRecipe(matrixOutput) != null) + if (!worldObj.isRemote) { - this.inventory[CRAFTING_OUTPUT_SLOT] = matrixOutput; - didCraft = true; - } + this.inventory[CRAFTING_OUTPUT_SLOT] = null; - /** - * If output does not exist, try using the filter. - */ - if (!didCraft) - { - ItemStack filterStack = craftingMatrix[4];// this.inventory[IMPRINT_SLOT]; + /** Try to craft from crafting grid. If not possible, then craft from imprint. */ + boolean didCraft = false; - if (filterStack != null && filterStack.getItem() instanceof ItemBlockImprint) + /** Simulate an Inventory Crafting Instance */ + InventoryCrafting inventoryCrafting = this.getCraftingMatrix(); + + ItemStack matrixOutput = CraftingManager.getInstance().findMatchingRecipe(inventoryCrafting, this.worldObj); + + if (matrixOutput != null && this.getCraftingManager().getIdealRecipe(matrixOutput) != null) { - Set filters = ItemBlockImprint.getFilters(filterStack); + this.inventory[CRAFTING_OUTPUT_SLOT] = matrixOutput; + didCraft = true; + } - for (ItemStack outputStack : filters) + /** + * If output does not exist, try using the filter. + */ + if (!didCraft) + { + ItemStack filterStack = craftingMatrix[4];// this.inventory[IMPRINT_SLOT]; + + if (filterStack != null && filterStack.getItem() instanceof ItemBlockImprint) { - if (outputStack != null) - { - Pair idealRecipe = this.getCraftingManager().getIdealRecipe(outputStack); + Set filters = ItemBlockImprint.getFilters(filterStack); - if (idealRecipe != null) + for (ItemStack outputStack : filters) + { + if (outputStack != null) { - ItemStack recipeOutput = idealRecipe.left(); - if (recipeOutput != null & recipeOutput.stackSize > 0) + Pair idealRecipe = this.getCraftingManager().getIdealRecipe(outputStack); + + if (idealRecipe != null) { - this.inventory[CRAFTING_OUTPUT_SLOT] = recipeOutput; - didCraft = true; - break; + ItemStack recipeOutput = idealRecipe.left(); + if (recipeOutput != null & recipeOutput.stackSize > 0) + { + this.inventory[CRAFTING_OUTPUT_SLOT] = recipeOutput; + didCraft = true; + break; + } } } } } } - } - worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } } } diff --git a/src/main/java/resonantinduction/mechanical/fluid/pump/BlockGrate.java b/src/main/java/resonantinduction/mechanical/fluid/pump/BlockGrate.java index 8ebc3aa2..363ace14 100644 --- a/src/main/java/resonantinduction/mechanical/fluid/pump/BlockGrate.java +++ b/src/main/java/resonantinduction/mechanical/fluid/pump/BlockGrate.java @@ -56,10 +56,10 @@ public class BlockGrate extends BlockRIRotatable { if (side == metadata) { - return this.drainIcon; + return blockIcon; } - return this.blockIcon; + return drainIcon; } @Override @@ -72,18 +72,11 @@ public class BlockGrate extends BlockRIRotatable { if (dir == ((TileGrate) entity).getDirection()) { - if (((TileGrate) entity).canDrain()) - { - return this.drainIcon; - } - else - { - return this.fillIcon; - } + return blockIcon; } } - return this.blockIcon; + return ((TileGrate) entity).canDrain() ? drainIcon : fillIcon; } @Override @@ -95,7 +88,8 @@ public class BlockGrate extends BlockRIRotatable if (tile instanceof TileGrate) { - entityPlayer.sendChatToPlayer(ChatMessageComponent.createFromText("Draining Sources? " + ((TileGrate) tile).canDrain())); + ((TileGrate) tile).canDrain = !((TileGrate) tile).canDrain; + entityPlayer.sendChatToPlayer(ChatMessageComponent.createFromText("Drain fluid mode: " + ((TileGrate) tile).canDrain())); } return true; diff --git a/src/main/java/resonantinduction/mechanical/fluid/pump/TileGrate.java b/src/main/java/resonantinduction/mechanical/fluid/pump/TileGrate.java index 49b31ade..d84f951e 100644 --- a/src/main/java/resonantinduction/mechanical/fluid/pump/TileGrate.java +++ b/src/main/java/resonantinduction/mechanical/fluid/pump/TileGrate.java @@ -6,7 +6,9 @@ import java.util.Iterator; import java.util.List; import java.util.Set; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidContainerRegistry; @@ -34,9 +36,13 @@ public class TileGrate extends TileAdvanced implements IFluidHandler, IDrain private LiquidPathFinder pathDrain; private LiquidPathFinder pathFill; + private Vector3 lastDrainOrigin; + + public boolean canDrain = true; + public boolean canDrain() { - return this.getBlockMetadata() < 6; + return canDrain; } public LiquidPathFinder getFillFinder() @@ -82,17 +88,120 @@ public class TileGrate extends TileAdvanced implements IFluidHandler, IDrain /* ONLY FIND NEW SOURCES IF OUR CURRENT LIST RUNS DRY */ if (this.getLiquidFinder().results.size() < TileGrate.MAX_WORLD_EDITS_PER_PROCESS + 10) { - this.getLiquidFinder().refresh().start(new Vector3(this).modifyPositionFromSide(this.getDirection()), TileGrate.MAX_WORLD_EDITS_PER_PROCESS, false); + this.getLiquidFinder().refresh().start(new Vector3(this).translate(this.getDirection()), TileGrate.MAX_WORLD_EDITS_PER_PROCESS, false); } if (this.getFillFinder().results.size() < TileGrate.MAX_WORLD_EDITS_PER_PROCESS + 10) { - this.getFillFinder().refresh().start(new Vector3(this).modifyPositionFromSide(this.getDirection()), TileGrate.MAX_WORLD_EDITS_PER_PROCESS, true); + this.getFillFinder().refresh().start(new Vector3(this).translate(this.getDirection()), TileGrate.MAX_WORLD_EDITS_PER_PROCESS, true); } + /** + * If we can drain, do the drain action. + */ + if (canDrain()) + { + drainAroundArea(worldObj, new Vector3(this), 3); + } } } + /** + * Drains an area starting at the given location + * + * @param world - world to drain in, most cases will be the TileEntities world + * @param loc - origin to start the path finder with. If this is an instance of IDrain this + * method will act different + */ + public void drainAroundArea(World world, Vector3 vec, int update) + { + Vector3 origin = vec.clone(); + if (origin == null) + { + return; + } + + /* Update last drain origin to prevent failed path finding */ + if (this.lastDrainOrigin == null || !this.lastDrainOrigin.equals(origin)) + { + this.lastDrainOrigin = origin.clone(); + this.getLiquidFinder().reset(); + } + + TileEntity drain = vec.clone().getTileEntity(world); + TileEntity originTile = null; + + Set drainList = null; + if (drain instanceof IDrain) + { + if (!((IDrain) drain).canDrain(((IDrain) drain).getDirection())) + { + return; + } + origin = vec.translate(((IDrain) drain).getDirection()); + originTile = origin.getTileEntity(world); + + if (originTile instanceof IFluidHandler) + { + FluidStack draStack = ((IFluidHandler) originTile).drain(ForgeDirection.UP, MAX_WORLD_EDITS_PER_PROCESS * FluidContainerRegistry.BUCKET_VOLUME, false); + + if (draStack != null && FluidUtility.fillTanksAllSides(worldObj, new Vector3(this), draStack, false, ForgeDirection.DOWN) > 0) + { + ((IFluidHandler) originTile).drain(ForgeDirection.UP, FluidUtility.fillTanksAllSides(worldObj, new Vector3(this), draStack, true, ForgeDirection.DOWN), true); + + } + } + else + { + drainList = ((IDrain) drain).getFluidList(); + } + } + + if (drainList == null) + { + if (this.getLiquidFinder().results.size() < MAX_WORLD_EDITS_PER_PROCESS + 10) + { + this.getLiquidFinder().setWorld(world).refresh().start(origin, MAX_WORLD_EDITS_PER_PROCESS, false); + } + drainList = this.getLiquidFinder().refresh().results; + } + + if (originTile == null && drainList != null && drainList.size() > 0) + { + Iterator fluidList = drainList.iterator(); + + while (fluidList.hasNext()) + { + if (this.currentWorldEdits >= MAX_WORLD_EDITS_PER_PROCESS) + { + break; + } + + Vector3 drainLocation = fluidList.next(); + FluidStack drainStack = FluidUtility.drainBlock(world, drainLocation, false, 3); + + if (drainStack != null && this.fill(null, drainStack, false) >= drainStack.amount) + { + /* Remove the block that we drained. */ + FluidUtility.drainBlock(this.worldObj, drainLocation, true, update); + this.fill(null, drainStack, true); + this.currentWorldEdits++; + fluidList.remove(); + + if (drain instanceof IDrain) + { + ((IDrain) drain).onUse(drainLocation); + } + } + } + } + } + + /** + * Fills the area with fluid. + * + * @return Amount filled + */ public int fillArea(FluidStack resource, boolean doFill) { int fillVolume = 0; @@ -107,8 +216,6 @@ public class TileGrate extends TileAdvanced implements IFluidHandler, IDrain fillVolume = resource.amount; - // System.out.println("Drain>>FillArea>>Targets>> " + getFillFinder().results.size()); - List fluids = new ArrayList(); List blocks = new ArrayList(); List filled = new ArrayList(); @@ -141,8 +248,6 @@ public class TileGrate extends TileAdvanced implements IFluidHandler, IDrain { fillVolume -= FluidUtility.fillBlock(worldObj, loc, FluidUtility.getStack(resource, fillVolume), doFill); - // System.out.println("Drain>>FillArea>>Filling>>" + (doFill ? "" : "Sim>>") + - // ">>Fluid>" + loc.toString()); if (doFill) { @@ -167,7 +272,6 @@ public class TileGrate extends TileAdvanced implements IFluidHandler, IDrain if (FluidUtility.isFillableBlock(worldObj, loc)) { fillVolume -= FluidUtility.fillBlock(worldObj, loc, FluidUtility.getStack(resource, fillVolume), doFill); - System.out.println("Drain>>FillArea>>Filling>>" + (doFill ? "" : "Sim>>") + ">>Block>" + loc.toString()); if (doFill) { @@ -182,8 +286,6 @@ public class TileGrate extends TileAdvanced implements IFluidHandler, IDrain } } this.getLiquidFinder().results.removeAll(filled); - // System.out.println("Drain>>FillArea>>Filling>>Filled>>" + (doFill ? "" : "Sim>>") + - // (resource.amount - fillVolume) + "mb"); return Math.max(resource.amount - fillVolume, 0); } return 0; @@ -218,10 +320,16 @@ public class TileGrate extends TileAdvanced implements IFluidHandler, IDrain @Override public int fill(ForgeDirection from, FluidStack resource, boolean doFill) { - if (resource == null || this.canDrain()) + if (resource == null) { return 0; } + + if (canDrain()) + { + return FluidUtility.fillTanksAllSides(worldObj, new Vector3(this), resource, doFill); + } + return this.fillArea(resource, doFill); } @@ -234,7 +342,6 @@ public class TileGrate extends TileAdvanced implements IFluidHandler, IDrain @Override public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) { - // TODO Auto-generated method stub return null; } @@ -267,4 +374,18 @@ public class TileGrate extends TileAdvanced implements IFluidHandler, IDrain { this.currentWorldEdits++; } + + @Override + public void readFromNBT(NBTTagCompound nbt) + { + super.readFromNBT(nbt); + canDrain = nbt.getBoolean("canDrain"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) + { + super.writeToNBT(nbt); + nbt.setBoolean("canDrain", canDrain); + } } diff --git a/src/main/java/resonantinduction/mechanical/item/ItemPipeGauge.java b/src/main/java/resonantinduction/mechanical/item/ItemPipeGauge.java index c8b2508f..314a5a4c 100644 --- a/src/main/java/resonantinduction/mechanical/item/ItemPipeGauge.java +++ b/src/main/java/resonantinduction/mechanical/item/ItemPipeGauge.java @@ -23,11 +23,9 @@ public class ItemPipeGauge extends ItemRI public ItemPipeGauge() { - super("PipeGuage"); + super("pipeGuage"); this.setHasSubtypes(true); - this.setCreativeTab(CreativeTabs.tabTools); this.setMaxStackSize(1); - this.setTextureName(Reference.PREFIX + "readout.PipeGauge"); } diff --git a/src/main/resources/assets/resonantinduction/languages/en_US.properties b/src/main/resources/assets/resonantinduction/languages/en_US.properties index 3dfaf43a..57312afc 100644 --- a/src/main/resources/assets/resonantinduction/languages/en_US.properties +++ b/src/main/resources/assets/resonantinduction/languages/en_US.properties @@ -57,6 +57,7 @@ tile.resonantinduction\:manipulator.name=Manipulator tile.resonantinduction\:rejector.name=Rejector # Fluid pipes +item.resonantinduction\:pipeGauge.name=Pipe Gauge item.resonantinduction\:pipe.name=Pipe tile.resonantinduction\:fluidPipe.3.name=Green Wood Trough tile.resonantinduction\:fluidPipe.4.name=Brown Wood Trough diff --git a/src/main/resources/assets/resonantinduction/textures/items/readout.PipeGauge.png b/src/main/resources/assets/resonantinduction/textures/items/pipeGauge.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/readout.PipeGauge.png rename to src/main/resources/assets/resonantinduction/textures/items/pipeGauge.png