diff --git a/src/main/java/appeng/crafting/CraftingJob.java b/src/main/java/appeng/crafting/CraftingJob.java index 675617e6d..c934774e0 100644 --- a/src/main/java/appeng/crafting/CraftingJob.java +++ b/src/main/java/appeng/crafting/CraftingJob.java @@ -92,7 +92,7 @@ public class CraftingJob implements Runnable, ICraftingJob final ICraftingGrid cc = grid.getCache( ICraftingGrid.class ); final GridStorageCache sg = grid.getCache( IStorageGrid.class ); - this.original = new MECraftingInventory( sg.getExtractableList() ); + this.original = new MECraftingInventory( sg.getExtractableList( actionSrc ) ); this.setTree( this.getCraftingTree( cc, what ) ); this.availableCheck = null; diff --git a/src/main/java/appeng/crafting/CraftingTreeNode.java b/src/main/java/appeng/crafting/CraftingTreeNode.java index 4cbc0433f..4aeb8dc98 100644 --- a/src/main/java/appeng/crafting/CraftingTreeNode.java +++ b/src/main/java/appeng/crafting/CraftingTreeNode.java @@ -199,6 +199,11 @@ public class CraftingTreeNode final IAEItemStack available = inv.extractItems( madeWhat, Actionable.MODULATE, src ); + for( IAEItemStack i : pro.getReturnedContainers() ) + { + inv.injectItems( i, Actionable.MODULATE, src ); + } + if( available != null ) { this.bytes += available.getStackSize(); diff --git a/src/main/java/appeng/crafting/CraftingTreeProcess.java b/src/main/java/appeng/crafting/CraftingTreeProcess.java index e5db2e170..39ec2a971 100644 --- a/src/main/java/appeng/crafting/CraftingTreeProcess.java +++ b/src/main/java/appeng/crafting/CraftingTreeProcess.java @@ -19,11 +19,16 @@ package appeng.crafting; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; import java.util.Map.Entry; import appeng.api.config.FuzzyMode; import appeng.util.item.AEItemStack; import com.google.common.collect.ImmutableCollection; +import com.google.common.collect.Lists; import it.unimi.dsi.fastutil.objects.Object2LongArrayMap; import net.minecraft.item.ItemStack; import net.minecraft.world.World; @@ -51,6 +56,7 @@ public class CraftingTreeProcess private long crafts = 0; private IItemList containerItems; private boolean limitQty; + private List containerItemsList; private long bytes = 0; public CraftingTreeProcess( final ICraftingGrid cc, final CraftingJob job, final ICraftingPatternDetails details, final CraftingTreeNode craftingTreeNode, final int depth ) @@ -70,6 +76,7 @@ public class CraftingTreeProcess if( containerItems == null ) { containerItems = AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createList(); + containerItemsList = new ArrayList<>(); } containerItems.add( part ); this.limitQty = true; @@ -240,8 +247,9 @@ public class CraftingTreeProcess part = part.copy(); // use the first slot... this.nodes.put( new CraftingTreeNode( cc, job, part, this, x, depth + 1 ), wantedSize ); + wantedSize = 0; } - if( !isPartContainer || wantedSize == 0 ) + if( !isPartContainer && wantedSize == 0 ) { break; } @@ -298,7 +306,7 @@ public class CraftingTreeProcess if( o != null ) { this.bytes++; - inv.injectItems( o, Actionable.MODULATE, src ); + containerItemsList.add( o ); } } } @@ -315,6 +323,15 @@ public class CraftingTreeProcess this.crafts += amountOfTimes; } + public List getReturnedContainers() + { + if( containerItemsList == null ) + { + return Collections.emptyList(); + } + return containerItemsList; + } + void dive( final CraftingJob job ) { job.addTask( this.getAmountCrafted( this.parent.getStack( 1 ) ), this.crafts, this.details, this.depth ); diff --git a/src/main/java/appeng/me/cache/GridStorageCache.java b/src/main/java/appeng/me/cache/GridStorageCache.java index a7ebe9b4f..e976a1841 100644 --- a/src/main/java/appeng/me/cache/GridStorageCache.java +++ b/src/main/java/appeng/me/cache/GridStorageCache.java @@ -173,11 +173,11 @@ public class GridStorageCache implements IStorageGrid return (IMEMonitor) this.storageMonitors.get( channel ); } - public MECraftingInventory getExtractableList() + public MECraftingInventory getExtractableList( IActionSource src ) { if( localCache == null ) { - localCache = new MECraftingInventory( getInventory( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) ), new BaseActionSource(), false, false, false ); + localCache = new MECraftingInventory( getInventory( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) ), src, false, false, false ); } return localCache; }