diff --git a/src/main/java/appeng/fluids/parts/FluidHandlerAdapter.java b/src/main/java/appeng/fluids/parts/FluidHandlerAdapter.java index ad531097bdd..689856b53cf 100644 --- a/src/main/java/appeng/fluids/parts/FluidHandlerAdapter.java +++ b/src/main/java/appeng/fluids/parts/FluidHandlerAdapter.java @@ -26,6 +26,7 @@ import java.util.List; import java.util.Map; +import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fluids.capability.IFluidTankProperties; @@ -195,10 +196,13 @@ private static class InventoryCache { private IAEFluidStack[] cachedAeStacks = new IAEFluidStack[0]; private final IFluidHandler fluidHandler; + private ArrayList skipSlots; + public InventoryCache( IFluidHandler fluidHandler ) { this.fluidHandler = fluidHandler; + this.skipSlots = new ArrayList<>(this.fluidHandler.getTankProperties().length); } public List update() @@ -211,13 +215,22 @@ public List update() if( slots > this.cachedAeStacks.length ) { this.cachedAeStacks = Arrays.copyOf( this.cachedAeStacks, slots ); + this.skipSlots = new ArrayList<>(this.fluidHandler.getTankProperties().length); } for( int slot = 0; slot < slots; slot++ ) { + if (skipSlots.contains( slot )) + continue; // Save the old stuff final IAEFluidStack oldAEFS = this.cachedAeStacks[slot]; - final FluidStack newFS = tankProperties[slot].getContents(); + FluidStack newFS = tankProperties[slot].getContents(); + if (newFS != null) { + if (this.fluidHandler.drain( 1, false ) == null){ + newFS = null; + skipSlots.add( slot ); + } + } this.handlePossibleSlotChanges( slot, oldAEFS, newFS, changes ); } diff --git a/src/main/java/appeng/parts/misc/ItemHandlerAdapter.java b/src/main/java/appeng/parts/misc/ItemHandlerAdapter.java index 94332ccd8d7..b1dd5d976c4 100644 --- a/src/main/java/appeng/parts/misc/ItemHandlerAdapter.java +++ b/src/main/java/appeng/parts/misc/ItemHandlerAdapter.java @@ -26,7 +26,9 @@ import java.util.List; import java.util.Map; +import it.unimi.dsi.fastutil.ints.IntList; import net.minecraft.item.ItemStack; +import net.minecraft.util.NonNullList; import net.minecraftforge.items.IItemHandler; import appeng.api.AEApi; @@ -268,10 +270,12 @@ private static class InventoryCache { private IAEItemStack[] cachedAeStacks = new IAEItemStack[0]; private final IItemHandler itemHandler; + private ArrayList skipSlots; public InventoryCache( IItemHandler itemHandler ) { this.itemHandler = itemHandler; + this.skipSlots = new ArrayList<>(this.itemHandler.getSlots()); } public IItemList getAvailableItems( IItemList out ) @@ -289,14 +293,22 @@ public List update() if( slots > this.cachedAeStacks.length ) { this.cachedAeStacks = Arrays.copyOf( this.cachedAeStacks, slots ); + this.skipSlots = new ArrayList<>(this.itemHandler.getSlots()); } for( int slot = 0; slot < slots; slot++ ) { + if (skipSlots.contains( slot )) + continue; // Save the old stuff final IAEItemStack oldAeIS = this.cachedAeStacks[slot]; - final ItemStack newIS = this.itemHandler.getStackInSlot( slot ); - + ItemStack newIS = this.itemHandler.getStackInSlot( slot ); + if (!newIS.isEmpty()) { + if (this.itemHandler.extractItem( slot,1,true ).isEmpty()){ + newIS = ItemStack.EMPTY; + skipSlots.add( slot ); + } + } this.handlePossibleSlotChanges( slot, oldAeIS, newIS, changes ); }