From 0868ea42998ae6f8902b23f52110bcbc6f4bc3d5 Mon Sep 17 00:00:00 2001 From: kekzdealer Date: Thu, 11 Jun 2020 18:09:33 +0200 Subject: New multi hatch code cleanup; Added auto-output handler; Removed object exposing method from MultiFluidHandler --- .../common/tileentities/GTMTE_TFFTMultiHatch.java | 82 ++++++++++++++++------ .../common/tileentities/TE_TFFTMultiHatch.java | 21 +++--- src/main/java/kekztech/MultiFluidHandler.java | 5 -- 3 files changed, 71 insertions(+), 37 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/common/tileentities/GTMTE_TFFTMultiHatch.java b/src/main/java/common/tileentities/GTMTE_TFFTMultiHatch.java index 529a948dbe..f34905ba14 100644 --- a/src/main/java/common/tileentities/GTMTE_TFFTMultiHatch.java +++ b/src/main/java/common/tileentities/GTMTE_TFFTMultiHatch.java @@ -11,8 +11,10 @@ import kekztech.MultiFluidHandler; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.IFluidHandler; import java.util.HashMap; @@ -116,32 +118,72 @@ public class GTMTE_TFFTMultiHatch extends GT_MetaTileEntity_Hatch { } public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.onPreTick(aBaseMetaTileEntity, aTick); if (aBaseMetaTileEntity.isServerSide() && mfh != null) { - // Handle emptying containers - final FluidStack fluidFromCell = GT_Utility.getFluidForFilledItem(super.mInventory[super.getInputSlot()], true); - // Check if fluid is not null, could be inserted, and if there is space for the empty container - if (fluidFromCell != null && mfh.couldPush(fluidFromCell) - && aBaseMetaTileEntity.addStackToSlot(super.getOutputSlot(), GT_Utility.getContainerItem(super.mInventory[super.getInputSlot()], true), 1)) { - // Consume one filled container if it was emptied successfully - if(mfh.pushFluid(fluidFromCell, true) == fluidFromCell.amount) { - aBaseMetaTileEntity.decrStackSize(this.getInputSlot(), 1); - } + emptyContainers(aBaseMetaTileEntity); + fillContainers(aBaseMetaTileEntity); + if(outputting && (aTick % 20 == 0)) { + doAutoOutputPerSecond(aBaseMetaTileEntity); } - // Handle filling containers. This will use the selected T.F.F.T fluid - final ItemStack cellFromFluid = GT_Utility.fillFluidContainer( - mfh.getFluid(mfh.getSelectedFluid()), super.mInventory[super.getInputSlot()], false, true); - // Check if cell is not null and if there is space for the filled container - if (cellFromFluid != null && aBaseMetaTileEntity.addStackToSlot(super.getOutputSlot(), cellFromFluid, 1)) { - // Convert back to FluidStack to learn the container capacity... - final FluidStack fluidCapacityStack = GT_Utility.getFluidForFilledItem(cellFromFluid, true); - // Consume one empty container if it was filled successfully - if(mfh.pullFluid(fluidCapacityStack, true) == fluidCapacityStack.amount) { - aBaseMetaTileEntity.decrStackSize(this.getInputSlot(), 1); - } + } + } + + /** + * Empty containers (cells, buckets, etc) from the GUI into the T.F.F.T + * @param aBaseMetaTileEntity + * this MetaTileEntity + */ + private void emptyContainers(IGregTechTileEntity aBaseMetaTileEntity) { + final FluidStack fluidFromCell = GT_Utility.getFluidForFilledItem(super.mInventory[super.getInputSlot()], true); + // Check if fluid is not null, could be inserted, and if there is space for the empty container + if (fluidFromCell != null && mfh.couldPush(fluidFromCell) + && aBaseMetaTileEntity.addStackToSlot(super.getOutputSlot(), GT_Utility.getContainerItem(super.mInventory[super.getInputSlot()], true), 1)) { + // Consume one filled container if it was emptied successfully + if(mfh.pushFluid(fluidFromCell, true) == fluidFromCell.amount) { + aBaseMetaTileEntity.decrStackSize(this.getInputSlot(), 1); + } + } + } + + /** + * Fill containers (cells, buckets, etc) in the GUI. The fluid used to fill containers will be the one that is + * selected through an Integrated Circuit in the T.F.F.T's controller GUI. + * @param aBaseMetaTileEntity + * this MetaTileEntity + */ + private void fillContainers(IGregTechTileEntity aBaseMetaTileEntity) { + final ItemStack cellFromFluid = GT_Utility.fillFluidContainer( + mfh.getFluid(mfh.getSelectedFluid()), super.mInventory[super.getInputSlot()], false, true); + // Check if cell is not null and if there is space for the filled container + if (cellFromFluid != null && aBaseMetaTileEntity.addStackToSlot(super.getOutputSlot(), cellFromFluid, 1)) { + // Convert back to FluidStack to learn the container capacity... + final FluidStack fluidCapacityStack = GT_Utility.getFluidForFilledItem(cellFromFluid, true); + // Consume one empty container if it was filled successfully + if(mfh.pullFluid(fluidCapacityStack, true) == fluidCapacityStack.amount) { + aBaseMetaTileEntity.decrStackSize(this.getInputSlot(), 1); } } } + /** + * Handle the Multi Hatch's auto-output feature. Should be called once per second only. + * @param aBaseMetaTileEntity + * this MetaTileEntity + */ + private void doAutoOutputPerSecond(IGregTechTileEntity aBaseMetaTileEntity) { + final ForgeDirection side = ForgeDirection.getOrientation(aBaseMetaTileEntity.getFrontFacing()); + final TileEntity adjacentTE = aBaseMetaTileEntity.getTileEntityOffset(side.offsetX, side.offsetY, side.offsetZ); + if(adjacentTE instanceof IFluidHandler) { + final IFluidHandler adj = (IFluidHandler) adjacentTE; + final int outputPerSec = vals.get(super.mTier); + // Cycle through fluids + for(int i = 0; i < mfh.getInfoData().size(); i++) { + final FluidStack storedFluid = mfh.getFluid(i); + } + + } + } + @Override public int fill(ForgeDirection from, FluidStack resource, boolean doFill) { return (mfh != null) ? mfh.pushFluid(resource, doFill) : 0; diff --git a/src/main/java/common/tileentities/TE_TFFTMultiHatch.java b/src/main/java/common/tileentities/TE_TFFTMultiHatch.java index 823d456b56..29370dc4f2 100644 --- a/src/main/java/common/tileentities/TE_TFFTMultiHatch.java +++ b/src/main/java/common/tileentities/TE_TFFTMultiHatch.java @@ -70,31 +70,28 @@ public class TE_TFFTMultiHatch extends TileEntity implements IFluidHandler { final IFluidHandler fh = (IFluidHandler) t; final int meta = t.getWorldObj().getBlockMetadata(t.xCoord, t.yCoord, t.zCoord); // Cycle through fluids - final Iterator volumes = mfh.getFluids().iterator(); - while(volumes.hasNext()) { - final FluidStack volume = volumes.next(); - + for (FluidStack volume : mfh.getFluids()) { // Remember for later final int oVolume = volume.amount; - + // Use API methods - if(fh.canFill(d.getOpposite(), volume.getFluid())) { - + if (fh.canFill(d.getOpposite(), volume.getFluid())) { + // Test how much can be output final FluidStack copy = volume.copy(); copy.amount = (int) Math.min(copy.amount, BASE_OUTPUT_PER_SECOND * Math.pow(10, meta)); - + // How much is drawn copy.amount = mfh.pullFluid(copy, false); - + // Test how much can be filled (and fill if possible) copy.amount = fh.fill(d.getOpposite(), copy, true); - + // Actually deplete storage mfh.pullFluid(copy, true); - + // Prevent ConcurrentModificationException - if(copy.amount >= oVolume) { + if (copy.amount >= oVolume) { break; } } diff --git a/src/main/java/kekztech/MultiFluidHandler.java b/src/main/java/kekztech/MultiFluidHandler.java index 1d8f4c2fea..b90d8a35bf 100644 --- a/src/main/java/kekztech/MultiFluidHandler.java +++ b/src/main/java/kekztech/MultiFluidHandler.java @@ -70,11 +70,6 @@ public class MultiFluidHandler { public int getCapacity() { return capacityPerFluid; } - - // TODO return deep copy instead - public List getFluids(){ - return (!locked) ? fluids : new ArrayList<>(); - } public FluidStack getFluid(int slot) { return (!locked && fluids.size() > 0 && slot >= 0 && slot < MAX_DISTINCT_FLUIDS) -- cgit