diff --git a/src/main/java/appeng/helpers/DualityInterface.java b/src/main/java/appeng/helpers/DualityInterface.java index 8ecec4b98..4d6e06165 100644 --- a/src/main/java/appeng/helpers/DualityInterface.java +++ b/src/main/java/appeng/helpers/DualityInterface.java @@ -1175,67 +1175,57 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn } else { - Iterator adit = ad.iterator(); - while ( adit.hasNext() ) + for ( ItemSlot itemSlot : ad ) { - ItemSlot is = adit.next(); //skip storage drawers slot 0 to avoid voiding items due to broken itemhandler implementation - if( isDrawer && is.getSlot() == 0 ) is = adit.next(); - + if( isDrawer && itemSlot.getSlot() == 0 ){ + continue; + } //some inventory may expose their special slots ( for upgrades, etc ) //if its empty AND we cant fit any of the items in the recipes, skip it. - if( is.getItemStack().isEmpty() ) + ItemStack stackInSlot = itemSlot.getItemStack(); + for ( IAEItemStack aeItemStack : patternDetails.getCondensedInputs() ) { - boolean validInputSlotForIngredients = false; - for( IAEItemStack aeItemStack : patternDetails.getCondensedInputs() ) + if( stackInSlot.isEmpty() ) { - if( is.insertItem( aeItemStack.getDefinition() ).isEmpty() ) + if( itemSlot.insertItem( aeItemStack.getDefinition() ).isEmpty() ) { - validInputSlotForIngredients = true; + copiedItemSlots.add( itemSlot.copy() ); break; } } - if( validInputSlotForIngredients ) + // copy partially filled slots for merging logic + else if( stackInSlot.getCount() < Math.min( itemSlot.getSlotLimit(), stackInSlot.getMaxStackSize() ) ) { - copiedItemSlots.add( is.copy() ); + if( aeItemStack.isSameType( stackInSlot ) ) + { + copiedItemSlots.add( itemSlot.copy() ); + break; + } } } - else if( !is.getItemStack().isEmpty() && is.getItemStack().getCount() < is.getSlotLimit() ) - { - copiedItemSlots.add( is.copy() ); - } } - Iterator copiedItemSlotIterator = copiedItemSlots.iterator(); - while ( copiedItemSlotIterator.hasNext() ) - { - ItemSlot copiedItemSlot = copiedItemSlotIterator.next(); - Iterator psi = patternedStacks.iterator(); - while ( psi.hasNext() ) + // start merging in order of slots, left to right. + for ( ItemSlot copiedItemSlot : copiedItemSlots ) + { + Iterator patStackIterator = patternedStacks.iterator(); + while ( patStackIterator.hasNext() ) { - ItemStack patternedStack = psi.next(); - ItemStack remainder = copiedItemSlot.insertItem( patternedStack ); + ItemStack patStack = patStackIterator.next(); + ItemStack remainder = copiedItemSlot.insertItem( patStack ); if( !remainder.isEmpty() ) { - patternedStack.setCount( patternedStack.getCount() - ( patternedStack.getCount() - remainder.getCount() ) ); - if( copiedItemSlot.getSlotLimit() == copiedItemSlot.getItemStack().getCount() ) - { - copiedItemSlotIterator.remove(); - break; - } + patStack.setCount( patStack.getCount() - ( patStack.getCount() - remainder.getCount() ) ); } - else + else //entire stack got injected { - if( copiedItemSlot.getSlotLimit() == copiedItemSlot.getItemStack().getCount() ) - { - copiedItemSlotIterator.remove(); - } - psi.remove(); + patStackIterator.remove(); break; } } - + // if we merged EVERYTHING successfully , return true. if( patternedStacks.size() == 0 ) { return true;