From 97b7583ff267afaa093fb438d15552b1eef79f9a Mon Sep 17 00:00:00 2001 From: yueh Date: Tue, 22 Sep 2015 15:49:01 +0200 Subject: [PATCH] Fixes incorrect handling of prioritized inventories Prioritized inventories are not longer used twice for storing leftover items and thus finally reporting twice the amount of storable items when they are the only possible option to store something. Also fixes import buses now respecting the amount of storable items inside the network instead of trying to place the exported items back and failing on any restricted inventory, potentially voiding the overflow. Fixes #1892 --- .../me/storage/NetworkInventoryHandler.java | 7 ++- .../parts/automation/PartImportBus.java | 44 +++++++++++++++++-- 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/src/main/java/appeng/me/storage/NetworkInventoryHandler.java b/src/main/java/appeng/me/storage/NetworkInventoryHandler.java index 247caa694..ca19910b4 100644 --- a/src/main/java/appeng/me/storage/NetworkInventoryHandler.java +++ b/src/main/java/appeng/me/storage/NetworkInventoryHandler.java @@ -111,11 +111,16 @@ public class NetworkInventoryHandler> implements IMEInvent } } + // We need to ignore prioritized inventories in the second pass. If they were not able to store everything + // during the first pass, they will do so in the second, but as this is stateless we will just report twice + // the amount of storable items. + // ignores craftingcache on the second pass. ii = invList.iterator(); while( ii.hasNext() && input != null ) { IMEInventoryHandler inv = ii.next(); - if( inv.validForPass( 2 ) && inv.canAccept( input ) )// ignore crafting on the second pass. + + if( inv.validForPass( 2 ) && inv.canAccept( input ) && !inv.isPrioritized( input ) ) { input = inv.injectItems( input, type, src ); } diff --git a/src/main/java/appeng/parts/automation/PartImportBus.java b/src/main/java/appeng/parts/automation/PartImportBus.java index 00eefd74e..da21034fe 100644 --- a/src/main/java/appeng/parts/automation/PartImportBus.java +++ b/src/main/java/appeng/parts/automation/PartImportBus.java @@ -53,6 +53,7 @@ import appeng.me.GridAccessException; import appeng.util.InventoryAdaptor; import appeng.util.Platform; import appeng.util.inv.IInventoryDestination; +import appeng.util.item.AEItemStack; public class PartImportBus extends PartSharedItemBus implements IInventoryDestination @@ -236,8 +237,8 @@ public class PartImportBus extends PartSharedItemBus implements IInventoryDestin private boolean importStuff( InventoryAdaptor myAdaptor, IAEItemStack whatToImport, IMEMonitor inv, IEnergySource energy, FuzzyMode fzMode ) { - final int toSend = Math.min( this.itemToSend, 64 ); - ItemStack newItems; + final int toSend = this.calculateMaximumAmountToImport( myAdaptor, whatToImport, inv, fzMode ); + final ItemStack newItems; if( this.getInstalledUpgrades( Upgrades.FUZZY ) > 0 ) { @@ -262,8 +263,8 @@ public class PartImportBus extends PartSharedItemBus implements IInventoryDestin this.lastItemChecked.setStackSize( newItems.stackSize ); } - IAEItemStack failed = Platform.poweredInsert( energy, this.destination, this.lastItemChecked, this.source ); - // destination.injectItems( lastItemChecked, Actionable.MODULATE ); + final IAEItemStack failed = Platform.poweredInsert( energy, this.destination, this.lastItemChecked, this.source ); + if( failed != null ) { myAdaptor.addItems( failed.getItemStack() ); @@ -282,6 +283,41 @@ public class PartImportBus extends PartSharedItemBus implements IInventoryDestin return false; } + private int calculateMaximumAmountToImport( InventoryAdaptor myAdaptor, IAEItemStack whatToImport, IMEMonitor inv, FuzzyMode fzMode ) + { + final int toSend = Math.min( this.itemToSend, 64 ); + final ItemStack simResult; + final IAEItemStack itemAmountNotStorable; + final ItemStack itemStackToImport; + + if( whatToImport == null ) + { + itemStackToImport = null; + } + else + { + itemStackToImport = whatToImport.getItemStack(); + } + + if( this.getInstalledUpgrades( Upgrades.FUZZY ) > 0 ) + { + simResult = myAdaptor.simulateSimilarRemove( toSend, itemStackToImport, fzMode, this.configDestination( inv ) ); + itemAmountNotStorable = this.destination.injectItems( AEItemStack.create( simResult ), Actionable.SIMULATE, this.source ); + } + else + { + simResult = myAdaptor.simulateRemove( toSend, itemStackToImport, this.configDestination( inv ) ); + itemAmountNotStorable = this.destination.injectItems( AEItemStack.create( simResult ), Actionable.SIMULATE, this.source ); + } + + if( itemAmountNotStorable != null ) + { + return (int) Math.min( simResult.stackSize - itemAmountNotStorable.getStackSize(), toSend ); + } + + return toSend; + } + private IInventoryDestination configDestination( IMEMonitor itemInventory ) { this.destination = itemInventory;