diff options
Diffstat (limited to 'src/main/java/gregtech/api/util')
-rw-r--r-- | src/main/java/gregtech/api/util/GT_Recipe.java | 76 | ||||
-rw-r--r-- | src/main/java/gregtech/api/util/GT_Utility.java | 12 |
2 files changed, 61 insertions, 27 deletions
diff --git a/src/main/java/gregtech/api/util/GT_Recipe.java b/src/main/java/gregtech/api/util/GT_Recipe.java index b06c7f9e64..ddb0708716 100644 --- a/src/main/java/gregtech/api/util/GT_Recipe.java +++ b/src/main/java/gregtech/api/util/GT_Recipe.java @@ -36,6 +36,8 @@ import gregtech.api.recipe.metadata.IRecipeMetadataStorage; import gregtech.api.util.extensions.ArrayExt; import gregtech.api.util.item.ItemHolder; import ic2.core.Ic2Items; +import it.unimi.dsi.fastutil.objects.Object2LongArrayMap; +import it.unimi.dsi.fastutil.objects.Object2LongMap; import it.unimi.dsi.fastutil.objects.Reference2LongArrayMap; import it.unimi.dsi.fastutil.objects.Reference2LongMap; @@ -492,8 +494,8 @@ public class GT_Recipe implements Comparable<GT_Recipe> { // because of early exit condition above. if (mFluidInputs.length > 0 /* && aFluidInputs != null */) { // Create map for fluid -> stored amount - Reference2LongMap<Fluid> fluidMap = new Reference2LongArrayMap<>(4); - Reference2LongMap<Fluid> fluidCost = new Reference2LongArrayMap<>(4); + Reference2LongMap<Fluid> fluidMap = new Reference2LongArrayMap<>(2); + Reference2LongMap<Fluid> fluidCost = new Reference2LongArrayMap<>(2); for (FluidStack fluidStack : aFluidInputs) { if (fluidStack == null) continue; fluidMap.mergeLong(fluidStack.getFluid(), fluidStack.amount, Long::sum); @@ -516,46 +518,72 @@ public class GT_Recipe implements Comparable<GT_Recipe> { } } - double remainingCost; - long providedAmount; - if (aInputs != null) { - nextRecipeItemCost: for (ItemStack recipeItemCost : mInputs) { + if (mInputs.length > 0) { + double remainingCost; + long providedAmount; + Object2LongMap<GT_Utility.ItemId> itemCostMap = new Object2LongArrayMap<>(2); + + for (ItemStack itemStack : mInputs) { + if (itemStack == null) continue; + if (shouldCheckNBT(itemStack)) { + GT_Utility.ItemId itemId = GT_Utility.ItemId.createNoCopy(itemStack); + itemCostMap.mergeLong(itemId, itemStack.stackSize, Long::sum); + continue; + } + ItemStack unifiedItem = GT_OreDictUnificator.get_nocopy(true, itemStack); + if (unifiedItem != null) { + GT_Utility.ItemId unifiedId; + if (isNBTSensitive) unifiedId = GT_Utility.ItemId.createNoCopy(unifiedItem); + else unifiedId = GT_Utility.ItemId.createWithoutNBT(unifiedItem); + itemCostMap.mergeLong(unifiedId, itemStack.stackSize, Long::sum); + } + } - ItemStack unifiedItemCost = GT_OreDictUnificator.get_nocopy(true, recipeItemCost); + ItemStack unifiedItemCost; + nextRecipeItemCost: for (Map.Entry<GT_Utility.ItemId, Long> costEntry : itemCostMap.entrySet()) { + unifiedItemCost = costEntry.getKey() + .getItemStack(); if (unifiedItemCost != null) { - remainingCost = recipeItemCost.stackSize * currentParallel; + remainingCost = costEntry.getValue() * 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; - } - } + if (!areInputStackAndRecipeCostMatched(providedItem, unifiedItemCost)) continue; // for non-consumed input - if (recipeItemCost.stackSize == 0) continue nextRecipeItemCost; + if (costEntry.getValue() == 0) continue nextRecipeItemCost; providedAmount += providedItem.stackSize; if (providedAmount >= remainingCost) continue nextRecipeItemCost; } if (providedAmount == 0) return 0; - currentParallel = Math.min(currentParallel, (double) providedAmount / recipeItemCost.stackSize); + currentParallel = Math.min(currentParallel, (double) providedAmount / costEntry.getValue()); } } } return currentParallel; } + private boolean areInputStackAndRecipeCostMatched(ItemStack providedItem, ItemStack unifiedItemCost) { + if (isNBTSensitive || shouldCheckNBT(providedItem)) { + return GT_Utility.areStacksEqual(providedItem, unifiedItemCost, false); + } else { + return GT_OreDictUnificator.isInputStackEqual(providedItem, unifiedItemCost); + } + } + + /** + * Please see JavaDoc on {@link #GTppRecipeHelper} for why this is here. + */ + private boolean shouldCheckNBT(ItemStack item) { + if (GTppRecipeHelper) { + return GT_Utility.areStacksEqual(item, Ic2Items.FluidCell.copy(), true) + || GT_Utility.areStacksEqual(item, ItemList.Tool_DataStick.get(1L), true) + || GT_Utility.areStacksEqual(item, ItemList.Tool_DataOrb.get(1L), true); + } + return false; + } + public boolean isRecipePossible(@Nullable ItemInventoryLogic itemInput, @Nullable FluidInventoryLogic fluidInput) { return getAmountOfRecipesDone(itemInput, fluidInput, 1, true) > 0; } diff --git a/src/main/java/gregtech/api/util/GT_Utility.java b/src/main/java/gregtech/api/util/GT_Utility.java index 4f2d13dd04..467e52a1db 100644 --- a/src/main/java/gregtech/api/util/GT_Utility.java +++ b/src/main/java/gregtech/api/util/GT_Utility.java @@ -4883,7 +4883,7 @@ public class GT_Utility { nbt = (NBTTagCompound) nbt.copy(); } - return new AutoValue_GT_Utility_ItemId(itemStack.getItem(), itemStack.getItemDamage(), nbt); + return new AutoValue_GT_Utility_ItemId(itemStack.getItem(), Items.feather.getDamage(itemStack), nbt); } /** @@ -4907,7 +4907,7 @@ public class GT_Utility { * This method stores NBT as null. */ public static ItemId createWithoutNBT(ItemStack itemStack) { - return new AutoValue_GT_Utility_ItemId(itemStack.getItem(), itemStack.getItemDamage(), null); + return new AutoValue_GT_Utility_ItemId(itemStack.getItem(), Items.feather.getDamage(itemStack), null); } /** @@ -4916,7 +4916,7 @@ public class GT_Utility { public static ItemId createNoCopy(ItemStack itemStack) { return new AutoValue_GT_Utility_ItemId( itemStack.getItem(), - itemStack.getItemDamage(), + Items.feather.getDamage(itemStack), itemStack.getTagCompound()); } @@ -4941,6 +4941,12 @@ public class GT_Utility { if (nbt() != null) tag.setTag("tag", nbt()); return tag; } + + public ItemStack getItemStack() { + ItemStack itemStack = new ItemStack(item(), 1, metaData()); + itemStack.setTagCompound(nbt()); + return itemStack; + } } public static int getPlasmaFuelValueInEUPerLiterFromMaterial(Materials material) { |