diff --git a/src/main/java/appeng/crafting/CraftingTreeNode.java b/src/main/java/appeng/crafting/CraftingTreeNode.java index 2c9c8185e..76ee5d10b 100644 --- a/src/main/java/appeng/crafting/CraftingTreeNode.java +++ b/src/main/java/appeng/crafting/CraftingTreeNode.java @@ -32,13 +32,14 @@ import appeng.core.sync.network.NetworkHandler; import appeng.core.sync.packets.PacketInformPlayer; import appeng.me.cluster.implementations.CraftingCPUCluster; import appeng.util.Platform; +import appeng.util.item.AEItemStack; import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; import net.minecraft.world.World; -import net.minecraftforge.fml.common.Optional; import java.io.IOException; import java.util.ArrayList; -import java.util.Collection; +import java.util.LinkedList; import java.util.List; public class CraftingTreeNode { @@ -111,14 +112,16 @@ public class CraftingTreeNode { this.what.setStackSize(l); if (this.getSlot() >= 0 && this.parent != null && this.parent.details.isCraftable()) { - Collection itemList = new ArrayList<>(); + LinkedList itemList = new LinkedList<>(); boolean damageableItem = this.what.getItem().isDamageable() || Platform.isGTDamageableItem(this.what.getItem()); if (this.parent.details.canSubstitute()) { for (IAEItemStack subs : this.parent.details.getSubstituteInputs(this.slot)) { if (damageableItem) { - itemList.addAll(inventoryList.findFuzzy(subs, FuzzyMode.IGNORE_ALL)); + for (IAEItemStack i : inventoryList.findFuzzy(subs, FuzzyMode.IGNORE_ALL)) { + itemList.add(i); + } } subs = inventoryList.findPrecise(subs); if (subs != null) { @@ -127,7 +130,9 @@ public class CraftingTreeNode { } } else { if (damageableItem) { - itemList.addAll(inventoryList.findFuzzy(this.what, FuzzyMode.IGNORE_ALL)); + for (IAEItemStack i : inventoryList.findFuzzy(this.what, FuzzyMode.IGNORE_ALL)) { + itemList.add(i); + } } else { final IAEItemStack item = inventoryList.findPrecise(this.what); if (item != null) { @@ -137,13 +142,25 @@ public class CraftingTreeNode { } for (IAEItemStack fuzz : itemList) { - if (this.parent.details.isValidItemForSlot(this.getSlot(), fuzz.copy().getCachedItemStack(1), this.world)) { + if (fuzz.getStackSize() == 0) { + continue; + } + if (this.parent.details.isValidItemForSlot(this.getSlot(), fuzz.getDefinition(), this.world)) { fuzz = fuzz.copy(); fuzz.setStackSize(l); final IAEItemStack available = inv.extractItems(fuzz, Actionable.MODULATE, src); if (available != null) { + if (available.getItem().hasContainerItem(available.getDefinition())) { + final ItemStack is2 = Platform.getContainerItem(available.createItemStack()); + final IAEItemStack o = AEItemStack.fromItemStack(is2); + + if (o != null) { + this.parent.addContainers(o); + } + } + if (!this.exhausted) { final IAEItemStack is = this.job.checkUse(available); @@ -197,6 +214,16 @@ public class CraftingTreeNode { final IAEItemStack available = inv.extractItems(madeWhat, Actionable.MODULATE, src); if (available != null) { + + if (parent != null && available.getItem().hasContainerItem(available.getDefinition())) { + final ItemStack is2 = Platform.getContainerItem(available.createItemStack()); + final IAEItemStack o = AEItemStack.fromItemStack(is2); + + if (o != null) { + this.parent.addContainers(o); + } + } + this.bytes += available.getStackSize(); l -= available.getStackSize(); @@ -240,6 +267,14 @@ public class CraftingTreeNode { if (job.isSimulation()) { this.bytes += l; + if (parent != null && this.what.getItem().hasContainerItem(this.what.getDefinition())) { + final ItemStack is2 = Platform.getContainerItem(this.what.copy().setStackSize(1).createItemStack()); + final IAEItemStack o = AEItemStack.fromItemStack(is2); + + if (o != null) { + this.parent.addContainers(o); + } + } this.missing += l; final IAEItemStack rv = this.what.copy(); rv.setStackSize(l); diff --git a/src/main/java/appeng/crafting/CraftingTreeProcess.java b/src/main/java/appeng/crafting/CraftingTreeProcess.java index 469ca0a8e..1d0d3e414 100644 --- a/src/main/java/appeng/crafting/CraftingTreeProcess.java +++ b/src/main/java/appeng/crafting/CraftingTreeProcess.java @@ -27,15 +27,11 @@ import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IItemList; import appeng.core.AEConfig; import appeng.me.cluster.implementations.CraftingCPUCluster; -import appeng.util.Platform; -import appeng.util.item.AEItemStack; import com.google.common.collect.ImmutableCollection; import it.unimi.dsi.fastutil.objects.Object2LongArrayMap; -import net.minecraft.item.ItemStack; import net.minecraft.world.World; import java.util.ArrayList; -import java.util.List; import java.util.Map.Entry; @@ -50,6 +46,7 @@ public class CraftingTreeProcess { boolean possible = true; private long crafts = 0; private long bytes = 0; + private ArrayList containers; public CraftingTreeProcess(final ICraftingGrid cc, final CraftingJob job, final ICraftingPatternDetails details, final CraftingTreeNode craftingTreeNode, final int depth) { this.parent = craftingTreeNode; @@ -198,32 +195,18 @@ public class CraftingTreeProcess { void request(final MECraftingInventory inv, final long amountOfTimes, final IActionSource src) throws CraftBranchFailure, InterruptedException { addProcess(); this.job.handlePausing(); - List containerItems = null; // request and remove inputs... for (final Entry entry : this.nodes.object2LongEntrySet()) { final IAEItemStack stack = entry.getKey().request(inv, entry.getValue() * amountOfTimes, src); - - if (this.details.isCraftable() && stack.getItem().hasContainerItem(stack.getDefinition())) { - final ItemStack is = Platform.getContainerItem(stack.createItemStack()); - final IAEItemStack o = AEItemStack.fromItemStack(is); - if (o != null) { - if (containerItems == null) { - containerItems = new ArrayList<>(); - } - this.bytes++; - o.setCachedItemStack(is); - containerItems.add(o); - } - } } - if (containerItems != null) { - for (IAEItemStack i : containerItems) { - inv.injectItems(i, Actionable.MODULATE, src); + if (this.containers != null) { + for (IAEItemStack iae : containers) { + inv.injectItems(iae, Actionable.MODULATE, src); } + containers = null; } - // assume its possible. // add crafting results.. @@ -235,6 +218,13 @@ public class CraftingTreeProcess { this.crafts += amountOfTimes; } + public void addContainers(IAEItemStack container) { + if (this.containers == null) { + this.containers = new ArrayList<>(); + } + this.containers.add(container); + } + void dive(final CraftingJob job) { job.addTask(this.getAmountCrafted(this.parent.getStack(1)), this.crafts, this.details, this.depth); for (final Entry entry : this.nodes.object2LongEntrySet()) { diff --git a/src/main/java/appeng/helpers/MultiCraftingTracker.java b/src/main/java/appeng/helpers/MultiCraftingTracker.java index 0860e33de..516dcef73 100644 --- a/src/main/java/appeng/helpers/MultiCraftingTracker.java +++ b/src/main/java/appeng/helpers/MultiCraftingTracker.java @@ -74,13 +74,11 @@ public class MultiCraftingTracker { public boolean handleCrafting(final int x, final long itemToCraft, final IAEItemStack ais, final InventoryAdaptor d, final World w, final IGrid g, final ICraftingGrid cg, final IActionSource mySrc) { if (ais != null) { - ItemStack inputStack = ais.getCachedItemStack(ais.getStackSize()); + ItemStack inputStack = ais.createItemStack(); ItemStack remaining = d.simulateAdd(inputStack); if (remaining.isEmpty()) { - ais.setCachedItemStack(inputStack); - final Future craftingJob = this.getJob(x); if (this.getLink(x) != null) { @@ -117,8 +115,6 @@ public class MultiCraftingTracker { this.setJob(x, cg.beginCraftingJob(w, g, mySrc, aisC, null)); } } - } else { - ais.setCachedItemStack(remaining); } } return false;