From 9022150e380b0cf22ecbcb71d3cfd7de8f838b68 Mon Sep 17 00:00:00 2001 From: fscan Date: Mon, 14 Aug 2017 11:03:53 +0200 Subject: [PATCH] Fill existing stacks first when adding to player inventory. (#3025) --- .../java/appeng/util/InventoryAdaptor.java | 4 +- .../appeng/util/inv/AdaptorItemHandler.java | 17 ++--- .../util/inv/AdaptorItemHandlerPlayerInv.java | 75 +++++++++++++++++++ 3 files changed, 83 insertions(+), 13 deletions(-) create mode 100644 src/main/java/appeng/util/inv/AdaptorItemHandlerPlayerInv.java diff --git a/src/main/java/appeng/util/InventoryAdaptor.java b/src/main/java/appeng/util/InventoryAdaptor.java index f0b2e04ae..07b330d29 100644 --- a/src/main/java/appeng/util/InventoryAdaptor.java +++ b/src/main/java/appeng/util/InventoryAdaptor.java @@ -25,10 +25,10 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.wrapper.PlayerInvWrapper; import appeng.api.config.FuzzyMode; import appeng.util.inv.AdaptorItemHandler; +import appeng.util.inv.AdaptorItemHandlerPlayerInv; import appeng.util.inv.IInventoryDestination; import appeng.util.inv.ItemSlot; @@ -59,7 +59,7 @@ public abstract class InventoryAdaptor implements Iterable { if( te != null ) { - return new AdaptorItemHandler( new PlayerInvWrapper( te.inventory ) ); + return new AdaptorItemHandlerPlayerInv( te ); } return null; } diff --git a/src/main/java/appeng/util/inv/AdaptorItemHandler.java b/src/main/java/appeng/util/inv/AdaptorItemHandler.java index 7eb66fe19..e80859154 100644 --- a/src/main/java/appeng/util/inv/AdaptorItemHandler.java +++ b/src/main/java/appeng/util/inv/AdaptorItemHandler.java @@ -31,7 +31,7 @@ import appeng.util.Platform; public class AdaptorItemHandler extends InventoryAdaptor { - private final IItemHandler itemHandler; + protected final IItemHandler itemHandler; public AdaptorItemHandler( IItemHandler itemHandler ) { @@ -223,9 +223,9 @@ public class AdaptorItemHandler extends InventoryAdaptor return this.addItems( toBeSimulated, true ); } - private ItemStack addItems( final ItemStack itemsToAdd, final boolean simulate ) + protected ItemStack addItems( final ItemStack itemsToAdd, final boolean simulate ) { - if( itemsToAdd.isEmpty() || itemsToAdd.getCount() == 0 ) + if( itemsToAdd.isEmpty() ) { return ItemStack.EMPTY; } @@ -234,16 +234,11 @@ public class AdaptorItemHandler extends InventoryAdaptor for( int slot = 0; slot < this.itemHandler.getSlots(); slot++ ) { - ItemStack is = this.itemHandler.getStackInSlot( slot ); + left = this.itemHandler.insertItem( slot, left, simulate ); - if( is.isEmpty() || Platform.itemComparisons().isSameItem( is, left ) ) + if( left.isEmpty() ) { - left = this.itemHandler.insertItem( slot, left, simulate ); - - if( left.isEmpty() || left.getCount() <= 0 ) - { - return ItemStack.EMPTY; - } + return ItemStack.EMPTY; } } diff --git a/src/main/java/appeng/util/inv/AdaptorItemHandlerPlayerInv.java b/src/main/java/appeng/util/inv/AdaptorItemHandlerPlayerInv.java new file mode 100644 index 000000000..fbffaaf33 --- /dev/null +++ b/src/main/java/appeng/util/inv/AdaptorItemHandlerPlayerInv.java @@ -0,0 +1,75 @@ +/* + * This file is part of Applied Energistics 2. + * Copyright (c) 2013 - 2017, AlgorithmX2, All rights reserved. + * + * Applied Energistics 2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Applied Energistics 2 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Applied Energistics 2. If not, see . + */ + +package appeng.util.inv; + + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraftforge.items.wrapper.PlayerInvWrapper; + +import appeng.util.Platform; + + +public class AdaptorItemHandlerPlayerInv extends AdaptorItemHandler +{ + public AdaptorItemHandlerPlayerInv( final EntityPlayer playerInv ) + { + super( new PlayerInvWrapper( playerInv.inventory ) ); + } + + /** + * Tries to fill existing stacks first + */ + @Override + protected ItemStack addItems( final ItemStack itemsToAdd, final boolean simulate ) + { + if( itemsToAdd.isEmpty() ) + { + return ItemStack.EMPTY; + } + + ItemStack left = itemsToAdd.copy(); + + for( int slot = 0; slot < this.itemHandler.getSlots(); slot++ ) + { + ItemStack is = this.itemHandler.getStackInSlot( slot ); + + if( Platform.itemComparisons().isSameItem( is, left ) ) + { + left = this.itemHandler.insertItem( slot, left, simulate ); + } + if( left.isEmpty() ) + { + return ItemStack.EMPTY; + } + } + + for( int slot = 0; slot < this.itemHandler.getSlots(); slot++ ) + { + left = this.itemHandler.insertItem( slot, left, simulate ); + if( left.isEmpty() ) + { + return ItemStack.EMPTY; + } + } + + return left; + } + +}