From adc0b638a242cd60e4ff4fe0b217fcf08a80d802 Mon Sep 17 00:00:00 2001 From: mezz Date: Fri, 27 Apr 2018 00:09:08 -0700 Subject: [PATCH] Fix #1203 Duplicate fuel entries for items with multiple oredict names --- .../jei/ingredients/IngredientRegistry.java | 4 +- .../vanilla/furnace/FuelRecipeMaker.java | 80 +++++++------------ .../mezz/jei/startup/AbstractModIdHelper.java | 5 +- 3 files changed, 35 insertions(+), 54 deletions(-) diff --git a/src/main/java/mezz/jei/ingredients/IngredientRegistry.java b/src/main/java/mezz/jei/ingredients/IngredientRegistry.java index 698b4e850..2510eedab 100644 --- a/src/main/java/mezz/jei/ingredients/IngredientRegistry.java +++ b/src/main/java/mezz/jei/ingredients/IngredientRegistry.java @@ -30,8 +30,8 @@ public class IngredientRegistry implements IIngredientRegistry { private final Map ingredientsMap; private final ImmutableMap ingredientHelperMap; private final ImmutableMap ingredientRendererMap; - private final List fuels = new ArrayList<>(); - private final List potionIngredients = new ArrayList<>(); + private final NonNullList fuels = NonNullList.create(); + private final NonNullList potionIngredients = NonNullList.create(); public IngredientRegistry( IModIdHelper modIdHelper, diff --git a/src/main/java/mezz/jei/plugins/vanilla/furnace/FuelRecipeMaker.java b/src/main/java/mezz/jei/plugins/vanilla/furnace/FuelRecipeMaker.java index 9b3e345db..c0e1e43bd 100644 --- a/src/main/java/mezz/jei/plugins/vanilla/furnace/FuelRecipeMaker.java +++ b/src/main/java/mezz/jei/plugins/vanilla/furnace/FuelRecipeMaker.java @@ -1,17 +1,19 @@ package mezz.jei.plugins.vanilla.furnace; import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; +import java.util.Collections; +import java.util.HashMap; import java.util.List; -import java.util.Set; +import java.util.Map; +import it.unimi.dsi.fastutil.ints.Int2BooleanArrayMap; +import it.unimi.dsi.fastutil.ints.Int2BooleanMap; +import it.unimi.dsi.fastutil.ints.IntArraySet; +import it.unimi.dsi.fastutil.ints.IntSet; import mezz.jei.api.IGuiHelper; import mezz.jei.api.IJeiHelpers; import mezz.jei.api.ingredients.IIngredientRegistry; import mezz.jei.api.recipe.IStackHelper; -import mezz.jei.util.ErrorUtil; -import mezz.jei.util.Log; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntityFurnace; import net.minecraftforge.oredict.OreDictionary; @@ -25,61 +27,39 @@ public static List getFuelRecipes(IIngredientRegistry ingredientRegi IGuiHelper guiHelper = helpers.getGuiHelper(); IStackHelper stackHelper = helpers.getStackHelper(); List fuelStacks = ingredientRegistry.getFuels(); - Set oreDictNames = new HashSet<>(); + Int2BooleanMap oreIdsHaveRecipe = new Int2BooleanArrayMap(); List fuelRecipes = new ArrayList<>(fuelStacks.size()); for (ItemStack fuelStack : fuelStacks) { - if (fuelStack == null) { - continue; + int burnTime = TileEntityFurnace.getItemBurnTime(fuelStack); + List fuels = stackHelper.getSubtypes(fuelStack); + fuels.removeIf(itemStack -> TileEntityFurnace.getItemBurnTime(itemStack) != burnTime); + if (fuels.isEmpty()) { + fuels = Collections.singletonList(fuelStack); } - - int[] oreIDs = OreDictionary.getOreIDs(fuelStack); - if (oreIDs.length > 0) { - for (int oreID : oreIDs) { - String name = OreDictionary.getOreName(oreID); - if (oreDictNames.contains(name)) { - continue; - } - - oreDictNames.add(name); - List oreDictFuels = OreDictionary.getOres(name); - Collection oreDictFuelsSet = stackHelper.getAllSubtypes(oreDictFuels); - removeNoBurnTime(oreDictFuelsSet); - if (oreDictFuels.isEmpty()) { - continue; + if (fuels.size() <= 1) { + int[] oreIDs = OreDictionary.getOreIDs(fuelStack); + boolean hasOreRecipe = false; + for (int oreId : oreIDs) { + if (!oreIdsHaveRecipe.containsKey(oreId)) { + String oreName = OreDictionary.getOreName(oreId); + List ores = stackHelper.getAllSubtypes(OreDictionary.getOres(oreName)); + if (ores.size() > 1 && ores.stream().allMatch(itemStack -> TileEntityFurnace.getItemBurnTime(itemStack) == burnTime)) { + oreIdsHaveRecipe.put(oreId, true); + fuelRecipes.add(new FuelRecipe(guiHelper, ores, burnTime)); + } else { + oreIdsHaveRecipe.put(oreId, false); + } } - ItemStack itemStack = oreDictFuels.get(0); - int burnTime = getBurnTime(itemStack); - if (burnTime > 0) { - fuelRecipes.add(new FuelRecipe(guiHelper, oreDictFuelsSet, burnTime)); - } else { - String itemStackInfo = ErrorUtil.getItemStackInfo(itemStack); - Log.get().error("Fuel has no burn time ({}): {}", burnTime, itemStackInfo); - } - } - } else { - List fuels = stackHelper.getSubtypes(fuelStack); - removeNoBurnTime(fuels); - if (fuels.isEmpty()) { - continue; + hasOreRecipe |= oreIdsHaveRecipe.get(oreId); } - ItemStack itemStack = fuels.get(0); - int burnTime = getBurnTime(itemStack); - if (burnTime > 0) { + if (!hasOreRecipe) { fuelRecipes.add(new FuelRecipe(guiHelper, fuels, burnTime)); - } else { - String itemStackInfo = ErrorUtil.getItemStackInfo(itemStack); - Log.get().error("Fuel has no burn time ({}): {}", burnTime, itemStackInfo); } + } else { + fuelRecipes.add(new FuelRecipe(guiHelper, fuels, burnTime)); } } return fuelRecipes; } - private static void removeNoBurnTime(Collection itemStacks) { - itemStacks.removeIf(itemStack -> getBurnTime(itemStack) == 0); - } - - private static int getBurnTime(ItemStack itemStack) { - return TileEntityFurnace.getItemBurnTime(itemStack); - } } diff --git a/src/main/java/mezz/jei/startup/AbstractModIdHelper.java b/src/main/java/mezz/jei/startup/AbstractModIdHelper.java index 405084060..c1dc7b51a 100644 --- a/src/main/java/mezz/jei/startup/AbstractModIdHelper.java +++ b/src/main/java/mezz/jei/startup/AbstractModIdHelper.java @@ -18,8 +18,9 @@ public String getModNameForIngredient(T ingredient, IIngredientHelper ing @Override public List addModNameToIngredientTooltip(List tooltip, T ingredient, IIngredientHelper ingredientHelper) { if (Config.isDebugModeEnabled()) { - tooltip.add(TextFormatting.GRAY + "JEI Debug ingredient info:"); - tooltip.add(TextFormatting.GRAY + ingredientHelper.getErrorInfo(ingredient)); + tooltip.add(TextFormatting.GRAY + "JEI Debug:"); + tooltip.add(TextFormatting.GRAY + "info: " + ingredientHelper.getErrorInfo(ingredient)); + tooltip.add(TextFormatting.GRAY + "uid: " + ingredientHelper.getUniqueId(ingredient)); } if (Config.isModNameFormatOverrideActive() && ingredient instanceof ItemStack) { // we detected that another mod is adding the mod name already return tooltip;