From c1e6c5d4985242169137a6c7bffed48e02e2d581 Mon Sep 17 00:00:00 2001 From: CovertJaguar Date: Thu, 8 Aug 2013 17:30:30 -0700 Subject: [PATCH] Fix AWB dupe And make it less likely to happen again in the future. Also cleaned up some fluid stuff. --- .../core/{liquids => fluids}/FluidUtils.java | 24 ++++++++++++- .../{liquids => fluids}/RestrictedTank.java | 2 +- .../{liquids => fluids}/SingleUseTank.java | 2 +- .../core/{liquids => fluids}/Tank.java | 2 +- .../core/{liquids => fluids}/TankManager.java | 2 +- .../buildcraft/core/inventory/InvUtils.java | 34 +++++++++++++++++++ common/buildcraft/core/utils/Utils.java | 32 ++--------------- common/buildcraft/energy/TileEngine.java | 4 +-- common/buildcraft/energy/TileEngineIron.java | 6 ++-- .../buildcraft/factory/TileAutoWorkbench.java | 9 ++--- common/buildcraft/factory/TileFloodGate.java | 4 +-- common/buildcraft/factory/TilePump.java | 23 +++---------- common/buildcraft/factory/TileRefinery.java | 4 +-- common/buildcraft/factory/TileTank.java | 4 +-- .../silicon/TileAdvancedCraftingTable.java | 2 +- common/buildcraft/transport/Pipe.java | 3 +- .../buildcraft/transport/TileGenericPipe.java | 6 ++-- 17 files changed, 88 insertions(+), 75 deletions(-) rename common/buildcraft/core/{liquids => fluids}/FluidUtils.java (74%) rename common/buildcraft/core/{liquids => fluids}/RestrictedTank.java (96%) rename common/buildcraft/core/{liquids => fluids}/SingleUseTank.java (97%) rename common/buildcraft/core/{liquids => fluids}/Tank.java (98%) rename common/buildcraft/core/{liquids => fluids}/TankManager.java (99%) diff --git a/common/buildcraft/core/liquids/FluidUtils.java b/common/buildcraft/core/fluids/FluidUtils.java similarity index 74% rename from common/buildcraft/core/liquids/FluidUtils.java rename to common/buildcraft/core/fluids/FluidUtils.java index 6bdd9ce6..143a95d8 100644 --- a/common/buildcraft/core/liquids/FluidUtils.java +++ b/common/buildcraft/core/fluids/FluidUtils.java @@ -1,15 +1,18 @@ -package buildcraft.core.liquids; +package buildcraft.core.fluids; +import buildcraft.core.TileBuffer; import buildcraft.core.utils.Utils; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidContainerRegistry; import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.IFluidHandler; +import net.minecraftforge.fluids.IFluidTank; /** * @@ -72,4 +75,23 @@ public class FluidUtils { return moving ? Block.lavaMoving.blockID : Block.lavaStill.blockID; return fluid.getBlockID(); } + + public static void pushFluidToConsumers(IFluidTank tank, int flowCap, TileBuffer[] tileBuffer) { + int amountToPush = flowCap; + for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { + FluidStack fluidStack = tank.drain(amountToPush, false); + if (fluidStack != null && fluidStack.amount > 0) { + TileEntity tile = tileBuffer[side.ordinal()].getTile(); + if (tile instanceof IFluidHandler) { + int used = ((IFluidHandler) tile).fill(side.getOpposite(), fluidStack, true); + if (used > 0) { + amountToPush -= used; + tank.drain(used, true); + if (amountToPush <= 0) + return; + } + } + } + } + } } diff --git a/common/buildcraft/core/liquids/RestrictedTank.java b/common/buildcraft/core/fluids/RestrictedTank.java similarity index 96% rename from common/buildcraft/core/liquids/RestrictedTank.java rename to common/buildcraft/core/fluids/RestrictedTank.java index 22d84116..b2f82b9a 100644 --- a/common/buildcraft/core/liquids/RestrictedTank.java +++ b/common/buildcraft/core/fluids/RestrictedTank.java @@ -6,7 +6,7 @@ * License 1.0, or MMPL. Please check the contents of the license located in * http://www.mod-buildcraft.com/MMPL-1.0.txt */ -package buildcraft.core.liquids; +package buildcraft.core.fluids; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; diff --git a/common/buildcraft/core/liquids/SingleUseTank.java b/common/buildcraft/core/fluids/SingleUseTank.java similarity index 97% rename from common/buildcraft/core/liquids/SingleUseTank.java rename to common/buildcraft/core/fluids/SingleUseTank.java index 9b663d42..cc67a0b3 100644 --- a/common/buildcraft/core/liquids/SingleUseTank.java +++ b/common/buildcraft/core/fluids/SingleUseTank.java @@ -6,7 +6,7 @@ * License 1.0, or MMPL. Please check the contents of the license located in * http://www.mod-buildcraft.com/MMPL-1.0.txt */ -package buildcraft.core.liquids; +package buildcraft.core.fluids; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.fluids.Fluid; diff --git a/common/buildcraft/core/liquids/Tank.java b/common/buildcraft/core/fluids/Tank.java similarity index 98% rename from common/buildcraft/core/liquids/Tank.java rename to common/buildcraft/core/fluids/Tank.java index b03ba2cf..9db95505 100644 --- a/common/buildcraft/core/liquids/Tank.java +++ b/common/buildcraft/core/fluids/Tank.java @@ -6,7 +6,7 @@ * License 1.0, or MMPL. Please check the contents of the license located in * http://www.mod-buildcraft.com/MMPL-1.0.txt */ -package buildcraft.core.liquids; +package buildcraft.core.fluids; import buildcraft.core.gui.tooltips.ToolTip; import buildcraft.core.gui.tooltips.ToolTipLine; diff --git a/common/buildcraft/core/liquids/TankManager.java b/common/buildcraft/core/fluids/TankManager.java similarity index 99% rename from common/buildcraft/core/liquids/TankManager.java rename to common/buildcraft/core/fluids/TankManager.java index 31f4ab9e..52501e7a 100644 --- a/common/buildcraft/core/liquids/TankManager.java +++ b/common/buildcraft/core/fluids/TankManager.java @@ -6,7 +6,7 @@ * License 1.0, or MMPL. Please check the contents of the license located in * http://www.mod-buildcraft.com/MMPL-1.0.txt */ -package buildcraft.core.liquids; +package buildcraft.core.fluids; import com.google.common.collect.ForwardingList; import cpw.mods.fml.relauncher.Side; diff --git a/common/buildcraft/core/inventory/InvUtils.java b/common/buildcraft/core/inventory/InvUtils.java index af7b0db1..1942983d 100644 --- a/common/buildcraft/core/inventory/InvUtils.java +++ b/common/buildcraft/core/inventory/InvUtils.java @@ -3,8 +3,10 @@ package buildcraft.core.inventory; import buildcraft.core.inventory.InventoryIterator.IInvSlot; import buildcraft.core.inventory.filters.ArrayStackFilter; import buildcraft.core.inventory.filters.IStackFilter; +import net.minecraft.entity.item.EntityItem; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; +import net.minecraft.world.World; import net.minecraftforge.common.ForgeDirection; /** @@ -82,4 +84,36 @@ public class InvUtils { public static ItemStack moveOneItem(IInventory source, ForgeDirection output, IInventory dest, ForgeDirection intput, ItemStack... filter) { return moveOneItem(source, output, dest, intput, new ArrayStackFilter(filter)); } + + /* STACK DROPS */ + public static void dropItems(World world, ItemStack stack, int i, int j, int k) { + if (stack.stackSize <= 0) { + return; + } + + float f1 = 0.7F; + double d = (world.rand.nextFloat() * f1) + (1.0F - f1) * 0.5D; + double d1 = (world.rand.nextFloat() * f1) + (1.0F - f1) * 0.5D; + double d2 = (world.rand.nextFloat() * f1) + (1.0F - f1) * 0.5D; + EntityItem entityitem = new EntityItem(world, i + d, j + d1, k + d2, stack); + entityitem.delayBeforeCanPickup = 10; + + world.spawnEntityInWorld(entityitem); + } + + public static void dropItems(World world, IInventory inv, int i, int j, int k) { + for (int slot = 0; slot < inv.getSizeInventory(); ++slot) { + ItemStack items = inv.getStackInSlot(slot); + + if (items != null && items.stackSize > 0) { + dropItems(world, inv.getStackInSlot(slot).copy(), i, j, k); + } + } + } + + public static void wipeInventory(IInventory inv) { + for (int slot = 0; slot < inv.getSizeInventory(); ++slot) { + inv.setInventorySlotContents(slot, null); + } + } } diff --git a/common/buildcraft/core/utils/Utils.java b/common/buildcraft/core/utils/Utils.java index cc6dc224..c4435fcb 100644 --- a/common/buildcraft/core/utils/Utils.java +++ b/common/buildcraft/core/utils/Utils.java @@ -11,7 +11,6 @@ import buildcraft.BuildCraftCore; import buildcraft.api.core.IAreaProvider; import buildcraft.api.core.LaserKind; import buildcraft.api.core.Position; -import buildcraft.api.transport.IPipeConnection; import buildcraft.api.transport.IPipeTile; import buildcraft.api.transport.IPipeTile.PipeType; import buildcraft.core.BlockIndex; @@ -20,6 +19,7 @@ import buildcraft.core.IDropControlInventory; import buildcraft.core.IFramePipeConnection; import buildcraft.core.TileBuildCraft; import buildcraft.core.inventory.ITransactor; +import buildcraft.core.inventory.InvUtils; import buildcraft.core.inventory.Transactor; import buildcraft.core.network.ISynchronizedTile; import buildcraft.core.network.PacketUpdate; @@ -32,7 +32,6 @@ import java.util.Collections; import java.util.List; import java.util.Random; import net.minecraft.block.Block; -import net.minecraft.entity.item.EntityItem; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.InventoryLargeChest; import net.minecraft.item.ItemStack; @@ -162,32 +161,6 @@ public class Utils { return 0; } - /* STACK DROPS */ - public static void dropItems(World world, ItemStack stack, int i, int j, int k) { - if (stack.stackSize <= 0) { - return; - } - - float f1 = 0.7F; - double d = (world.rand.nextFloat() * f1) + (1.0F - f1) * 0.5D; - double d1 = (world.rand.nextFloat() * f1) + (1.0F - f1) * 0.5D; - double d2 = (world.rand.nextFloat() * f1) + (1.0F - f1) * 0.5D; - EntityItem entityitem = new EntityItem(world, i + d, j + d1, k + d2, stack); - entityitem.delayBeforeCanPickup = 10; - - world.spawnEntityInWorld(entityitem); - } - - public static void dropItems(World world, IInventory inventory, int i, int j, int k) { - for (int l = 0; l < inventory.getSizeInventory(); ++l) { - ItemStack items = inventory.getStackInSlot(l); - - if (items != null && items.stackSize > 0) { - dropItems(world, inventory.getStackInSlot(l).copy(), i, j, k); - } - } - } - public static TileEntity getTile(World world, Position pos, ForgeDirection step) { Position tmp = new Position(pos); tmp.orientation = step; @@ -364,7 +337,8 @@ public class Utils { if (tile instanceof IInventory && !CoreProxy.proxy.isRenderWorld(world)) { if (!(tile instanceof IDropControlInventory) || ((IDropControlInventory) tile).doDrop()) { - dropItems(world, (IInventory) tile, i, j, k); + InvUtils.dropItems(world, (IInventory) tile, i, j, k); + InvUtils.wipeInventory((IInventory)tile); } } diff --git a/common/buildcraft/energy/TileEngine.java b/common/buildcraft/energy/TileEngine.java index 93cd5e42..2013c9ae 100644 --- a/common/buildcraft/energy/TileEngine.java +++ b/common/buildcraft/energy/TileEngine.java @@ -21,10 +21,10 @@ import buildcraft.api.transport.IPipeTile.PipeType; import buildcraft.core.DefaultProps; import buildcraft.core.TileBuffer; import buildcraft.core.TileBuildCraft; +import buildcraft.core.inventory.InvUtils; import buildcraft.core.inventory.SimpleInventory; import buildcraft.core.network.TileNetworkData; import buildcraft.core.proxy.CoreProxy; -import buildcraft.core.utils.Utils; import buildcraft.energy.gui.ContainerEngine; import java.util.LinkedList; import net.minecraft.entity.player.EntityPlayer; @@ -360,7 +360,7 @@ public abstract class TileEngine extends TileBuildCraft implements IPowerRecepto } public void delete() { - Utils.dropItems(worldObj, inv, xCoord, yCoord, zCoord); + InvUtils.dropItems(worldObj, inv, xCoord, yCoord, zCoord); } @Override diff --git a/common/buildcraft/energy/TileEngineIron.java b/common/buildcraft/energy/TileEngineIron.java index 7274d00c..1c4df7b9 100644 --- a/common/buildcraft/energy/TileEngineIron.java +++ b/common/buildcraft/energy/TileEngineIron.java @@ -16,9 +16,9 @@ import buildcraft.api.fuels.IronEngineFuel.Fuel; import buildcraft.api.gates.ITrigger; import buildcraft.core.GuiIds; import buildcraft.core.IItemPipe; -import buildcraft.core.liquids.FluidUtils; -import buildcraft.core.liquids.Tank; -import buildcraft.core.liquids.TankManager; +import buildcraft.core.fluids.FluidUtils; +import buildcraft.core.fluids.Tank; +import buildcraft.core.fluids.TankManager; import buildcraft.core.proxy.CoreProxy; import buildcraft.core.utils.Utils; import buildcraft.energy.gui.ContainerEngine; diff --git a/common/buildcraft/factory/TileAutoWorkbench.java b/common/buildcraft/factory/TileAutoWorkbench.java index bb06e664..adadee9f 100644 --- a/common/buildcraft/factory/TileAutoWorkbench.java +++ b/common/buildcraft/factory/TileAutoWorkbench.java @@ -8,6 +8,7 @@ package buildcraft.factory; import buildcraft.core.TileBuildCraft; +import buildcraft.core.inventory.InvUtils; import buildcraft.core.inventory.InventoryConcatenator; import buildcraft.core.inventory.InventoryIterator; import buildcraft.core.inventory.InventoryIterator.IInvSlot; @@ -82,12 +83,6 @@ public class TileAutoWorkbench extends TileBuildCraft implements ISidedInventory } } - @Override - public void destroy() { - super.destroy(); - Utils.dropItems(worldObj, craftMatrix, xCoord, yCoord, zCoord); - } - @Override public int getSizeInventory() { return 10; @@ -268,7 +263,7 @@ public class TileAutoWorkbench extends TileBuildCraft implements ISidedInventory ItemStack stack = slot.getStackInSlot(); if (stack != null) { slot.setStackInSlot(null); - Utils.dropItems(worldObj, stack, xCoord, yCoord + 1, zCoord); + InvUtils.dropItems(worldObj, stack, xCoord, yCoord + 1, zCoord); } } } diff --git a/common/buildcraft/factory/TileFloodGate.java b/common/buildcraft/factory/TileFloodGate.java index f9cd8223..3593b8a7 100644 --- a/common/buildcraft/factory/TileFloodGate.java +++ b/common/buildcraft/factory/TileFloodGate.java @@ -10,8 +10,8 @@ package buildcraft.factory; import buildcraft.api.core.SafeTimeTracker; import buildcraft.core.BlockIndex; import buildcraft.core.TileBuildCraft; -import buildcraft.core.liquids.FluidUtils; -import buildcraft.core.liquids.Tank; +import buildcraft.core.fluids.FluidUtils; +import buildcraft.core.fluids.Tank; import buildcraft.core.proxy.CoreProxy; import buildcraft.core.utils.BlockUtil; import buildcraft.core.utils.Utils; diff --git a/common/buildcraft/factory/TilePump.java b/common/buildcraft/factory/TilePump.java index ddc07a5c..5dcf3489 100644 --- a/common/buildcraft/factory/TilePump.java +++ b/common/buildcraft/factory/TilePump.java @@ -20,7 +20,8 @@ import buildcraft.core.EntityBlock; import buildcraft.core.IMachine; import buildcraft.core.TileBuffer; import buildcraft.core.TileBuildCraft; -import buildcraft.core.liquids.SingleUseTank; +import buildcraft.core.fluids.FluidUtils; +import buildcraft.core.fluids.SingleUseTank; import buildcraft.core.network.PacketPayload; import buildcraft.core.network.PacketPayloadStream; import buildcraft.core.network.PacketUpdate; @@ -132,23 +133,9 @@ public class TilePump extends TileBuildCraft implements IMachine, IPowerReceptor } private void pushToConsumers() { - FluidStack fluidStack = tank.getFluid(); - if (fluidStack != null && fluidStack.amount > 0) { - for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { - TileEntity tile = getTile(side); - - if (tile instanceof IFluidHandler) { - int moved = ((IFluidHandler) tile).fill(side.getOpposite(), fluidStack, true); - if (moved > 0) { - tank.drain(moved, true); - fluidStack = tank.getFluid(); - if (fluidStack == null || fluidStack.amount <= 0) { - break; - } - } - } - } - } + if(tileBuffer == null) + tileBuffer = TileBuffer.makeBuffer(worldObj, xCoord, yCoord, zCoord, false); + FluidUtils.pushFluidToConsumers(tank, 400, tileBuffer); } private TileEntity getTile(ForgeDirection side) { diff --git a/common/buildcraft/factory/TileRefinery.java b/common/buildcraft/factory/TileRefinery.java index 15682e19..56a1a977 100644 --- a/common/buildcraft/factory/TileRefinery.java +++ b/common/buildcraft/factory/TileRefinery.java @@ -18,8 +18,8 @@ import buildcraft.api.recipes.RefineryRecipes; import buildcraft.api.recipes.RefineryRecipes.Recipe; import buildcraft.core.IMachine; import buildcraft.core.TileBuildCraft; -import buildcraft.core.liquids.Tank; -import buildcraft.core.liquids.TankManager; +import buildcraft.core.fluids.Tank; +import buildcraft.core.fluids.TankManager; import buildcraft.core.network.PacketPayload; import buildcraft.core.network.PacketPayloadStream; import buildcraft.core.network.PacketUpdate; diff --git a/common/buildcraft/factory/TileTank.java b/common/buildcraft/factory/TileTank.java index 125e2b3e..9d36643d 100644 --- a/common/buildcraft/factory/TileTank.java +++ b/common/buildcraft/factory/TileTank.java @@ -10,8 +10,8 @@ package buildcraft.factory; import buildcraft.BuildCraftCore; import buildcraft.api.core.SafeTimeTracker; import buildcraft.core.TileBuildCraft; -import buildcraft.core.liquids.Tank; -import buildcraft.core.liquids.TankManager; +import buildcraft.core.fluids.Tank; +import buildcraft.core.fluids.TankManager; import buildcraft.core.network.PacketPayload; import buildcraft.core.network.PacketPayloadStream; import buildcraft.core.network.PacketUpdate; diff --git a/common/buildcraft/silicon/TileAdvancedCraftingTable.java b/common/buildcraft/silicon/TileAdvancedCraftingTable.java index c29e4808..42ea6138 100644 --- a/common/buildcraft/silicon/TileAdvancedCraftingTable.java +++ b/common/buildcraft/silicon/TileAdvancedCraftingTable.java @@ -349,7 +349,7 @@ public class TileAdvancedCraftingTable extends TileEntity implements IInventory, output.stackSize -= Utils.addToRandomInventoryAround(worldObj, xCoord, yCoord, zCoord, output); } if (output.stackSize > 0) { - Utils.dropItems(worldObj, output, xCoord, yCoord + 1, zCoord); + InvUtils.dropItems(worldObj, output, xCoord, yCoord + 1, zCoord); } } } diff --git a/common/buildcraft/transport/Pipe.java b/common/buildcraft/transport/Pipe.java index f66f70a5..e3d0f05e 100644 --- a/common/buildcraft/transport/Pipe.java +++ b/common/buildcraft/transport/Pipe.java @@ -16,6 +16,7 @@ import buildcraft.api.gates.ITrigger; import buildcraft.api.gates.TriggerParameter; import buildcraft.api.transport.IPipe; import buildcraft.core.IDropControlInventory; +import buildcraft.core.inventory.InvUtils; import buildcraft.core.network.TilePacketWrapper; import buildcraft.core.utils.Utils; import cpw.mods.fml.relauncher.Side; @@ -374,7 +375,7 @@ public abstract class Pipe implements IPipe, IDropContr } public void dropItem(ItemStack stack) { - Utils.dropItems(container.worldObj, stack, container.xCoord, container.yCoord, container.zCoord); + InvUtils.dropItems(container.worldObj, stack, container.xCoord, container.yCoord, container.zCoord); } public void onBlockRemoval() { diff --git a/common/buildcraft/transport/TileGenericPipe.java b/common/buildcraft/transport/TileGenericPipe.java index 65a3a047..9e635acd 100644 --- a/common/buildcraft/transport/TileGenericPipe.java +++ b/common/buildcraft/transport/TileGenericPipe.java @@ -25,10 +25,10 @@ import buildcraft.core.DefaultProps; import buildcraft.core.IDropControlInventory; import buildcraft.core.ITileBufferHolder; import buildcraft.core.TileBuffer; +import buildcraft.core.inventory.InvUtils; import buildcraft.core.network.IClientState; import buildcraft.core.network.ISyncedTile; import buildcraft.core.network.PacketTileState; -import buildcraft.core.utils.Utils; import buildcraft.transport.Gate.GateKind; import buildcraft.transport.network.PipeRenderStatePacket; import cpw.mods.fml.relauncher.Side; @@ -565,7 +565,7 @@ public class TileGenericPipe extends TileEntity implements IPowerReceptor, IFlui } private void dropFacadeItem(ForgeDirection direction) { - Utils.dropItems(worldObj, ItemFacade.getStack(this.facadeBlocks[direction.ordinal()], this.facadeMeta[direction.ordinal()]), this.xCoord, this.yCoord, this.zCoord); + InvUtils.dropItems(worldObj, ItemFacade.getStack(this.facadeBlocks[direction.ordinal()], this.facadeMeta[direction.ordinal()]), this.xCoord, this.yCoord, this.zCoord); } public void dropFacade(ForgeDirection direction) { @@ -663,7 +663,7 @@ public class TileGenericPipe extends TileEntity implements IPowerReceptor, IFlui return; plugs[side.ordinal()] = false; - Utils.dropItems(worldObj, new ItemStack(BuildCraftTransport.plugItem), this.xCoord, this.yCoord, this.zCoord); + InvUtils.dropItems(worldObj, new ItemStack(BuildCraftTransport.plugItem), this.xCoord, this.yCoord, this.zCoord); worldObj.notifyBlockChange(this.xCoord, this.yCoord, this.zCoord, getBlockId()); scheduleNeighborChange(); //To force recalculation of connections scheduleRenderUpdate();