From cba89b0323be18aebe7bf9b345825253767f4865 Mon Sep 17 00:00:00 2001 From: PrototypeTrousers Date: Tue, 27 Jun 2023 11:47:23 -0300 Subject: [PATCH 1/5] fix damageable container items not being returned immediately for simulation --- src/main/java/appeng/crafting/CraftingTreeProcess.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/appeng/crafting/CraftingTreeProcess.java b/src/main/java/appeng/crafting/CraftingTreeProcess.java index 469ca0a8e..30d496efc 100644 --- a/src/main/java/appeng/crafting/CraftingTreeProcess.java +++ b/src/main/java/appeng/crafting/CraftingTreeProcess.java @@ -207,6 +207,14 @@ public class CraftingTreeProcess { if (this.details.isCraftable() && stack.getItem().hasContainerItem(stack.getDefinition())) { final ItemStack is = Platform.getContainerItem(stack.createItemStack()); final IAEItemStack o = AEItemStack.fromItemStack(is); + + //if the container item is a identical copy or a damageable one, return it immediately. + //if it is not it will need to be recrafted + if (stack.equals(is) || is.getItem().isDamageable() || Platform.isGTDamageableItem(is.getItem())){ + inv.injectItems(o, Actionable.MODULATE, src); + this.bytes++; + continue; + } if (o != null) { if (containerItems == null) { containerItems = new ArrayList<>(); From 4aaa3f892943b3f84be3fb8cc264db32c58415f4 Mon Sep 17 00:00:00 2001 From: PrototypeTrousers Date: Thu, 29 Jun 2023 12:51:04 -0300 Subject: [PATCH 2/5] make container itens not arrive too late or early instead precisely when they are meant to --- .../appeng/crafting/CraftingTreeNode.java | 36 +++++++++++++++- .../appeng/crafting/CraftingTreeProcess.java | 42 ++++++------------- 2 files changed, 46 insertions(+), 32 deletions(-) diff --git a/src/main/java/appeng/crafting/CraftingTreeNode.java b/src/main/java/appeng/crafting/CraftingTreeNode.java index 2c9c8185e..44cb81ddd 100644 --- a/src/main/java/appeng/crafting/CraftingTreeNode.java +++ b/src/main/java/appeng/crafting/CraftingTreeNode.java @@ -32,9 +32,10 @@ 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; @@ -137,13 +138,23 @@ public class CraftingTreeNode { } for (IAEItemStack fuzz : itemList) { - if (this.parent.details.isValidItemForSlot(this.getSlot(), fuzz.copy().getCachedItemStack(1), this.world)) { + 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 +208,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(); @@ -238,6 +259,17 @@ public class CraftingTreeNode { } } + if (this.parent != null) { + if (what.getItem().hasContainerItem(what.createItemStack())) { + final ItemStack is2 = Platform.getContainerItem(what.copy().setStackSize(1).createItemStack()); + final IAEItemStack o = AEItemStack.fromItemStack(is2); + + if (o != null) { + this.parent.addContainers(o); + } + } + } + if (job.isSimulation()) { this.bytes += l; this.missing += l; diff --git a/src/main/java/appeng/crafting/CraftingTreeProcess.java b/src/main/java/appeng/crafting/CraftingTreeProcess.java index 30d496efc..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,40 +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 the container item is a identical copy or a damageable one, return it immediately. - //if it is not it will need to be recrafted - if (stack.equals(is) || is.getItem().isDamageable() || Platform.isGTDamageableItem(is.getItem())){ - inv.injectItems(o, Actionable.MODULATE, src); - this.bytes++; - continue; - } - 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.. @@ -243,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()) { From acb1d00197b6996f865a8aba4700d0635963d1b5 Mon Sep 17 00:00:00 2001 From: PrototypeTrousers Date: Thu, 29 Jun 2023 12:53:32 -0300 Subject: [PATCH 3/5] attempt to separate itens used simulation (threaded) from the main --- src/main/java/appeng/helpers/MultiCraftingTracker.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) 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; From 086ddd5a6739fc0ac9e4706ecc04426b49e60b76 Mon Sep 17 00:00:00 2001 From: PrototypeTrousers Date: Thu, 29 Jun 2023 15:21:33 -0300 Subject: [PATCH 4/5] shady optimization --- .../appeng/crafting/CraftingTreeNode.java | 11 +++++++--- .../java/appeng/helpers/PatternHelper.java | 20 +++++++++++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/main/java/appeng/crafting/CraftingTreeNode.java b/src/main/java/appeng/crafting/CraftingTreeNode.java index 44cb81ddd..4e5606396 100644 --- a/src/main/java/appeng/crafting/CraftingTreeNode.java +++ b/src/main/java/appeng/crafting/CraftingTreeNode.java @@ -40,6 +40,7 @@ import net.minecraft.world.World; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; +import java.util.LinkedList; import java.util.List; public class CraftingTreeNode { @@ -112,14 +113,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) { @@ -128,7 +131,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) { diff --git a/src/main/java/appeng/helpers/PatternHelper.java b/src/main/java/appeng/helpers/PatternHelper.java index 888195676..3c0e2b08d 100644 --- a/src/main/java/appeng/helpers/PatternHelper.java +++ b/src/main/java/appeng/helpers/PatternHelper.java @@ -26,6 +26,8 @@ import appeng.api.storage.data.IAEItemStack; import appeng.container.ContainerNull; import appeng.util.Platform; import appeng.util.item.AEItemStack; +import appeng.util.item.OreHelper; +import appeng.util.item.OreReference; import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -37,6 +39,8 @@ import net.minecraft.nbt.NBTTagList; import net.minecraft.util.NonNullList; import net.minecraft.world.World; import net.minecraftforge.common.crafting.IShapedRecipe; +import net.minecraftforge.oredict.OreDictionary; +import net.minecraftforge.oredict.ShapedOreRecipe; import java.util.*; @@ -239,6 +243,22 @@ public class PatternHelper implements ICraftingPatternDetails, Comparable Date: Mon, 3 Jul 2023 15:30:05 -0300 Subject: [PATCH 5/5] fix container items breaking not being taken into account during simulation properly optimize crafting with container items by checking IF WE HAVE ANY of before LOOKING UP IF THE RECIPE MATCHES with the item we DONT HAVE --- .../appeng/crafting/CraftingTreeNode.java | 16 +++++++-------- .../java/appeng/helpers/PatternHelper.java | 20 ------------------- 2 files changed, 7 insertions(+), 29 deletions(-) diff --git a/src/main/java/appeng/crafting/CraftingTreeNode.java b/src/main/java/appeng/crafting/CraftingTreeNode.java index 4e5606396..76ee5d10b 100644 --- a/src/main/java/appeng/crafting/CraftingTreeNode.java +++ b/src/main/java/appeng/crafting/CraftingTreeNode.java @@ -39,7 +39,6 @@ import net.minecraft.world.World; import java.io.IOException; import java.util.ArrayList; -import java.util.Collection; import java.util.LinkedList; import java.util.List; @@ -143,6 +142,9 @@ public class CraftingTreeNode { } for (IAEItemStack fuzz : itemList) { + if (fuzz.getStackSize() == 0) { + continue; + } if (this.parent.details.isValidItemForSlot(this.getSlot(), fuzz.getDefinition(), this.world)) { fuzz = fuzz.copy(); fuzz.setStackSize(l); @@ -150,7 +152,6 @@ public class CraftingTreeNode { 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); @@ -264,19 +265,16 @@ public class CraftingTreeNode { } } - if (this.parent != null) { - if (what.getItem().hasContainerItem(what.createItemStack())) { - final ItemStack is2 = Platform.getContainerItem(what.copy().setStackSize(1).createItemStack()); + 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); } } - } - - if (job.isSimulation()) { - this.bytes += l; this.missing += l; final IAEItemStack rv = this.what.copy(); rv.setStackSize(l); diff --git a/src/main/java/appeng/helpers/PatternHelper.java b/src/main/java/appeng/helpers/PatternHelper.java index 3c0e2b08d..888195676 100644 --- a/src/main/java/appeng/helpers/PatternHelper.java +++ b/src/main/java/appeng/helpers/PatternHelper.java @@ -26,8 +26,6 @@ import appeng.api.storage.data.IAEItemStack; import appeng.container.ContainerNull; import appeng.util.Platform; import appeng.util.item.AEItemStack; -import appeng.util.item.OreHelper; -import appeng.util.item.OreReference; import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -39,8 +37,6 @@ import net.minecraft.nbt.NBTTagList; import net.minecraft.util.NonNullList; import net.minecraft.world.World; import net.minecraftforge.common.crafting.IShapedRecipe; -import net.minecraftforge.oredict.OreDictionary; -import net.minecraftforge.oredict.ShapedOreRecipe; import java.util.*; @@ -243,22 +239,6 @@ public class PatternHelper implements ICraftingPatternDetails, Comparable