Skip to content

Commit

Permalink
Fix #1203 Duplicate fuel entries for items with multiple oredict names
Browse files Browse the repository at this point in the history
  • Loading branch information
mezz committed Apr 28, 2018
1 parent 4f80ece commit adc0b63
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 54 deletions.
4 changes: 2 additions & 2 deletions src/main/java/mezz/jei/ingredients/IngredientRegistry.java
Expand Up @@ -30,8 +30,8 @@ public class IngredientRegistry implements IIngredientRegistry {
private final Map<Class, IngredientSet> ingredientsMap;
private final ImmutableMap<Class, IIngredientHelper> ingredientHelperMap;
private final ImmutableMap<Class, IIngredientRenderer> ingredientRendererMap;
private final List<ItemStack> fuels = new ArrayList<>();
private final List<ItemStack> potionIngredients = new ArrayList<>();
private final NonNullList<ItemStack> fuels = NonNullList.create();
private final NonNullList<ItemStack> potionIngredients = NonNullList.create();

public IngredientRegistry(
IModIdHelper modIdHelper,
Expand Down
80 changes: 30 additions & 50 deletions 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;
Expand All @@ -25,61 +27,39 @@ public static List<FuelRecipe> getFuelRecipes(IIngredientRegistry ingredientRegi
IGuiHelper guiHelper = helpers.getGuiHelper();
IStackHelper stackHelper = helpers.getStackHelper();
List<ItemStack> fuelStacks = ingredientRegistry.getFuels();
Set<String> oreDictNames = new HashSet<>();
Int2BooleanMap oreIdsHaveRecipe = new Int2BooleanArrayMap();
List<FuelRecipe> fuelRecipes = new ArrayList<>(fuelStacks.size());
for (ItemStack fuelStack : fuelStacks) {
if (fuelStack == null) {
continue;
int burnTime = TileEntityFurnace.getItemBurnTime(fuelStack);
List<ItemStack> 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<ItemStack> oreDictFuels = OreDictionary.getOres(name);
Collection<ItemStack> 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<ItemStack> 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<ItemStack> 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<ItemStack> itemStacks) {
itemStacks.removeIf(itemStack -> getBurnTime(itemStack) == 0);
}

private static int getBurnTime(ItemStack itemStack) {
return TileEntityFurnace.getItemBurnTime(itemStack);
}
}
5 changes: 3 additions & 2 deletions src/main/java/mezz/jei/startup/AbstractModIdHelper.java
Expand Up @@ -18,8 +18,9 @@ public <T> String getModNameForIngredient(T ingredient, IIngredientHelper<T> ing
@Override
public <T> List<String> addModNameToIngredientTooltip(List<String> tooltip, T ingredient, IIngredientHelper<T> 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;
Expand Down

0 comments on commit adc0b63

Please sign in to comment.