diff --git a/src/main/java/codechicken/nei/BookmarkPanel.java b/src/main/java/codechicken/nei/BookmarkPanel.java index 69138f96..216c286d 100644 --- a/src/main/java/codechicken/nei/BookmarkPanel.java +++ b/src/main/java/codechicken/nei/BookmarkPanel.java @@ -9,6 +9,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -306,18 +307,33 @@ public class BookmarkPanel extends PanelWidget { if (recipeId == null || !removeFullRecipe) { this.grid.removeRecipe(slot.itemIndex, removeFullRecipe); - return true; } - if (group.crafting != null && group.crafting.recipeRelations.containsKey(recipeId)) { - boolean removed = false; + if (group.crafting != null && group.collapsed && removeFullRecipe) { + this.grid.removeGroup(groupId); + return true; + } else if (group.crafting != null) { + Set recipes = group.crafting.recipeRelations.getOrDefault(recipeId, Collections.emptySet()); - for (RecipeId relRecipeId : group.crafting.recipeRelations.get(recipeId)) { - removed = this.grid.removeRecipe(relRecipeId, groupId) || removed; + if (removeFullRecipe && recipes.isEmpty()) { + for (Map.Entry> entry : group.crafting.recipeRelations.entrySet()) { + if (entry.getValue().contains(recipeId)) { + recipes = entry.getValue(); + break; + } + } } - return removed; + if (!recipes.isEmpty()) { + boolean removed = false; + + for (RecipeId relRecipeId : recipes) { + removed = this.grid.removeRecipe(relRecipeId, groupId) || removed; + } + + return removed; + } } return this.grid.removeRecipe(recipeId, groupId); diff --git a/src/main/java/codechicken/nei/FavoriteRecipes.java b/src/main/java/codechicken/nei/FavoriteRecipes.java index 3d8bb40d..387a2b50 100644 --- a/src/main/java/codechicken/nei/FavoriteRecipes.java +++ b/src/main/java/codechicken/nei/FavoriteRecipes.java @@ -9,9 +9,11 @@ import java.io.OutputStream; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Set; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -32,6 +34,7 @@ import codechicken.nei.util.NBTJson; public class FavoriteRecipes { + private static final Set tools = new HashSet<>(); private static final Map items = new HashMap<>(); private static final Map fluids = new HashMap<>(); private static File favoriteFile; @@ -123,6 +126,10 @@ public class FavoriteRecipes { } items.put(itemStackNBT, recipeId); + + if (NEIServerUtils.isItemTool(stack)) { + tools.add(itemStackNBT); + } } } catch (IllegalArgumentException | JsonSyntaxException | IllegalStateException e) { @@ -143,7 +150,19 @@ public class FavoriteRecipes { recipeId = fluids.get(getFluidKey(stack)); } - return recipeId; + if (recipeId != null) { + return recipeId; + } + + if (NEIServerUtils.isItemTool(stack) + && (stack.stackTagCompound == null || !stack.stackTagCompound.hasKey("GT.ToolStats"))) { + for (NBTTagCompound nbt : tools) { + if (NEIServerUtils.areStacksSameTypeCraftingWithNBT(stack, StackInfo.loadFromNBT(nbt))) { + return items.get(nbt); + } + } + } + } return null; @@ -176,6 +195,10 @@ public class FavoriteRecipes { if (recipeId != null) { items.put(itemStackNBT, recipeId); + if (NEIServerUtils.isItemTool(stack)) { + tools.add(itemStackNBT); + } + if (fluidKey != null) { fluids.put(fluidKey, recipeId); } diff --git a/src/main/java/codechicken/nei/api/ShortcutInputHandler.java b/src/main/java/codechicken/nei/api/ShortcutInputHandler.java index 23dea821..679dc6ef 100644 --- a/src/main/java/codechicken/nei/api/ShortcutInputHandler.java +++ b/src/main/java/codechicken/nei/api/ShortcutInputHandler.java @@ -295,7 +295,7 @@ public abstract class ShortcutInputHandler { recipe.getIngredients().stream().forEach(ingr -> { final List permutations = ingr.getPermutations(); for (int index = 0; index < permutations.size(); index++) { - if (FavoriteRecipes.getFavorite(permutations.get(index)) != null) { + if (FavoriteRecipes.contains(permutations.get(index))) { ingr.setActiveIndex(index); break; }