aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/api
diff options
context:
space:
mode:
authorHoleFish <48403212+HoleFish@users.noreply.github.com>2023-11-27 14:56:02 +0800
committerGitHub <noreply@github.com>2023-11-27 15:56:02 +0900
commit0484805cc05637afc9c45fe156e1ba87f33eaaf1 (patch)
tree6439d5ad1fd15df2e3e2609ecceec347c0709a23 /src/main/java/gregtech/api
parent8b69123596bbce5d1e464d77ed75f2d3ce160b3f (diff)
downloadGT5-Unofficial-0484805cc05637afc9c45fe156e1ba87f33eaaf1.tar.gz
GT5-Unofficial-0484805cc05637afc9c45fe156e1ba87f33eaaf1.tar.bz2
GT5-Unofficial-0484805cc05637afc9c45fe156e1ba87f33eaaf1.zip
Fix recipe check (#2379)
* Update GT_Recipe.java * strange spotless * part of miozune's suggestion * whatever. need more tests
Diffstat (limited to 'src/main/java/gregtech/api')
-rw-r--r--src/main/java/gregtech/api/util/GT_Recipe.java80
1 files changed, 32 insertions, 48 deletions
diff --git a/src/main/java/gregtech/api/util/GT_Recipe.java b/src/main/java/gregtech/api/util/GT_Recipe.java
index 333beeebea..535da25934 100644
--- a/src/main/java/gregtech/api/util/GT_Recipe.java
+++ b/src/main/java/gregtech/api/util/GT_Recipe.java
@@ -783,56 +783,40 @@ public class GT_Recipe implements Comparable<GT_Recipe> {
}
}
+ double remainingCost;
+ int providedAmount;
if (aInputs != null) {
- // Create map for item -> stored amount
- Map<GT_Utility.ItemId, Integer> itemCost = new HashMap<>();
- Map<GT_Utility.ItemId, Integer> itemMap = new HashMap<>();
- Map<GT_Utility.ItemId, Integer> itemMapWildcard = new HashMap<>(); // Used only when wildcard input is found
- boolean foundWildcard = false;
- for (ItemStack itemStack : mInputs) {
- if (itemStack == null) continue;
- if (itemStack.getItemDamage() == W) {
- foundWildcard = true;
- }
- if (isNBTSensitive) {
- itemCost.merge(GT_Utility.ItemId.createNoCopy(itemStack), itemStack.stackSize, Integer::sum);
- } else {
- itemCost.merge(GT_Utility.ItemId.createWithoutNBT(itemStack), itemStack.stackSize, Integer::sum);
- }
- }
- for (ItemStack itemStack : aInputs) {
- if (itemStack == null) continue;
- ItemStack unifiedStack = GT_OreDictUnificator.get(false, itemStack, true);
- if (unifiedStack == null) continue;
- if (isNBTSensitive) {
- itemMap.merge(GT_Utility.ItemId.createNoCopy(unifiedStack), unifiedStack.stackSize, Integer::sum);
- } else {
- itemMap
- .merge(GT_Utility.ItemId.createWithoutNBT(unifiedStack), unifiedStack.stackSize, Integer::sum);
- }
- if (foundWildcard) {
- itemMapWildcard
- .merge(GT_Utility.ItemId.createAsWildcard(unifiedStack), unifiedStack.stackSize, Integer::sum);
- }
- }
- // Check how many parallels can it perform for each item
- for (Map.Entry<GT_Utility.ItemId, Integer> costEntry : itemCost.entrySet()) {
- GT_Utility.ItemId costItem = costEntry.getKey();
- int costValue = costEntry.getValue();
- Map<GT_Utility.ItemId, Integer> mapToUse = costItem.metaData() == W ? itemMapWildcard : itemMap;
- if (costValue > 0) {
- currentParallel = Math
- .min(currentParallel, (double) mapToUse.getOrDefault(costItem, 0) / costValue);
- } else {
- // Non-consumed input
- // We need to distinguish null and 0 here, since not having item
- // and having 0-sized item (ghost circuit) are different.
- if (!mapToUse.containsKey(costItem)) {
- currentParallel = 0;
+ nextRecipeItemCost: for (ItemStack recipeItemCost : mInputs) {
+
+ ItemStack unifiedItemCost = GT_OreDictUnificator.get_nocopy(true, recipeItemCost);
+ if (unifiedItemCost != null) {
+ remainingCost = recipeItemCost.stackSize * currentParallel;
+ providedAmount = 0;
+
+ for (ItemStack providedItem : aInputs) {
+ if (isNBTSensitive && !GT_Utility.areStacksEqual(providedItem, unifiedItemCost, false)) {
+ continue;
+ } else if (!isNBTSensitive
+ && !GT_OreDictUnificator.isInputStackEqual(providedItem, unifiedItemCost)) {
+ continue;
+ }
+
+ if (GTppRecipeHelper) { // Please see JavaDoc on GTppRecipeHelper for why this is here.
+ if (GT_Utility.areStacksEqual(providedItem, Ic2Items.FluidCell.copy(), true)
+ || GT_Utility.areStacksEqual(providedItem, ItemList.Tool_DataStick.get(1L), true)
+ || GT_Utility.areStacksEqual(providedItem, ItemList.Tool_DataOrb.get(1L), true)) {
+ if (!GT_Utility.areStacksEqual(providedItem, recipeItemCost, false)) continue;
+ }
+ }
+ // for non-consumed input
+ if (recipeItemCost.stackSize == 0) continue nextRecipeItemCost;
+
+ providedAmount += providedItem.stackSize;
+
+ if (providedAmount >= remainingCost) continue nextRecipeItemCost;
}
- }
- if (currentParallel <= 0) {
- return 0;
+ if (providedAmount == 0) return 0;
+ currentParallel = Math.min(currentParallel, (double) providedAmount / recipeItemCost.stackSize);
}
}
}