diff --git a/src/main/java/codechicken/nei/BookmarkPanel.java b/src/main/java/codechicken/nei/BookmarkPanel.java index dedd3a65..21263b14 100644 --- a/src/main/java/codechicken/nei/BookmarkPanel.java +++ b/src/main/java/codechicken/nei/BookmarkPanel.java @@ -29,6 +29,7 @@ import codechicken.nei.api.IBookmarkContainerHandler; import codechicken.nei.bookmark.BookmarkGrid; import codechicken.nei.bookmark.BookmarkGroup; import codechicken.nei.bookmark.BookmarkItem; +import codechicken.nei.bookmark.BookmarkItem.BookmarkItemType; import codechicken.nei.bookmark.BookmarkStorage; import codechicken.nei.bookmark.BookmarksGridSlot; import codechicken.nei.bookmark.GroupingItem; @@ -184,8 +185,8 @@ public class BookmarkPanel extends PanelWidget { final boolean existsRecipe = recipeId != null && this.grid.existsRecipe(recipeId, BookmarkGrid.DEFAULT_GROUP_ID); final NBTTagCompound nbTag = StackInfo.itemStackToNBT(itemStack); - long factor = nbTag.getInteger("Count"); - long count = factor; + long count = nbTag.getInteger("Count"); + long factor = existsRecipe ? Math.max(count, 1) : 1; if (existsRecipe) { for (int i = 0; i < this.grid.size(); i++) { @@ -196,12 +197,13 @@ public class BookmarkPanel extends PanelWidget { } } - if (factor == 0) { - factor = nbTag.hasKey("gtFluidName") ? Math.min(144, nbTag.getInteger("Count")) : 1; - } - this.grid.addItem( - BookmarkItem.of(groupId, StackInfo.withAmount(itemStack, count), factor, recipeId, false), + BookmarkItem.of( + groupId, + StackInfo.withAmount(itemStack, count), + factor, + recipeId, + existsRecipe ? BookmarkItemType.RESULT : BookmarkItemType.ITEM), true); return true; } @@ -244,7 +246,8 @@ public class BookmarkPanel extends PanelWidget { if (stack != null && uniqueRecipe.add(recipeId)) { this.grid.addItem( - BookmarkItem.of(groupId, stack, StackInfo.getAmount(stack), recipeId, false), + BookmarkItem + .of(groupId, stack, StackInfo.getAmount(stack), recipeId, BookmarkItemType.ITEM), true); uniqueStack.add(stack); } @@ -304,7 +307,7 @@ public class BookmarkPanel extends PanelWidget { } final int groupId = slot.getGroupId(); - final RecipeId recipeId = slot.getRecipeId(); + final RecipeId recipeId = slot.getType() == BookmarkItemType.ITEM ? null : slot.getRecipeId(); final BookmarkGroup group = slot.getGroup(); if (group.crafting != null && group.collapsed) { @@ -368,7 +371,7 @@ public class BookmarkPanel extends PanelWidget { public RecipeId getRecipeId(int itemIndex) { BookmarkItem meta = this.grid.getCalculatedItem(itemIndex); - return meta.isIngredient ? null : meta.recipeId; + return meta.type == BookmarkItemType.INGREDIENT ? null : meta.recipeId; } public boolean existsRecipe(RecipeId recipeId, int groupId) { @@ -922,7 +925,8 @@ public class BookmarkPanel extends PanelWidget { if (slot != null) { - if (slot.isIngredient() && slot.getRecipeId() != null && slot.getBookmarkItem().permutations.size() > 1) { + if (slot.getType() == BookmarkItemType.INGREDIENT && slot.getRecipeId() != null + && slot.getBookmarkItem().permutations.size() > 1) { RecipeId recipeId = slot.getRecipeId(); if (recipeId == null) { @@ -1020,7 +1024,8 @@ public class BookmarkPanel extends PanelWidget { if (NEIClientUtils.altKey()) { multiplier = NEIClientConfig.showItemQuantityWidget() ? NEIClientConfig.getItemQuantity() : 0; if (multiplier == 0) { - multiplier = slot.getItemStack().getMaxStackSize(); + multiplier = StackInfo.itemStackToNBT(slot.getItemStack()).hasKey("gtFluidName") ? 144 + : slot.getItemStack().getMaxStackSize(); } } @@ -1253,7 +1258,7 @@ public class BookmarkPanel extends PanelWidget { @Deprecated public BookmarkRecipeId getBookmarkRecipeId(int itemIndex) { BookmarkItem item = this.grid.getCalculatedItem(itemIndex); - return item == null || item.isIngredient || item.recipeId == null ? null + return item == null || item.type == BookmarkItemType.INGREDIENT || item.recipeId == null ? null : new BookmarkRecipeId(item.recipeId.getHandleName(), item.recipeId.getIngredients()); } diff --git a/src/main/java/codechicken/nei/NEIClientConfig.java b/src/main/java/codechicken/nei/NEIClientConfig.java index a6e51d42..adefc4d1 100644 --- a/src/main/java/codechicken/nei/NEIClientConfig.java +++ b/src/main/java/codechicken/nei/NEIClientConfig.java @@ -225,6 +225,10 @@ public class NEIClientConfig { .getBooleanValue(true); API.addOption(new OptionToggleButton("inventory.bookmarks.bookmarkItemsWithRecipe", true)); + tag.getTag("inventory.bookmarks.bookmarkRecipeWithCount").setComment("Bookmark recipe with count") + .getBooleanValue(false); + API.addOption(new OptionToggleButton("inventory.bookmarks.bookmarkRecipeWithCount", true)); + tag.getTag("inventory.guirecipe.jeiStyleTabs").setComment("Enable/disable JEI Style Tabs") .getBooleanValue(true); API.addOption(new OptionToggleButtonBoubs("inventory.guirecipe.jeiStyleTabs", true)); diff --git a/src/main/java/codechicken/nei/api/ShortcutInputHandler.java b/src/main/java/codechicken/nei/api/ShortcutInputHandler.java index 25e7d3ea..f7b33789 100644 --- a/src/main/java/codechicken/nei/api/ShortcutInputHandler.java +++ b/src/main/java/codechicken/nei/api/ShortcutInputHandler.java @@ -27,6 +27,7 @@ import codechicken.nei.SearchField; import codechicken.nei.bookmark.BookmarkGrid; import codechicken.nei.bookmark.BookmarkGroup; import codechicken.nei.bookmark.BookmarkItem; +import codechicken.nei.bookmark.BookmarkItem.BookmarkItemType; import codechicken.nei.bookmark.BookmarksGridSlot; import codechicken.nei.recipe.AutoCraftingManager; import codechicken.nei.recipe.GuiCraftingRecipe; @@ -233,7 +234,7 @@ public abstract class ShortcutInputHandler { if (recipe != null) { math = RecipeChainMath.of(recipe, 1); } - } else if (slot.getRecipeId() != null && !slot.isIngredient()) { + } else if (slot.getRecipeId() != null && slot.getType() == BookmarkItemType.RESULT) { if (slot.getGroup().crafting == null) { final Recipe recipe = Recipe.of(slot.getRecipeId()); @@ -312,11 +313,14 @@ public abstract class ShortcutInputHandler { private static boolean saveRecipeInBookmark(ItemStack stackover, boolean saveIngredients, boolean saveStackSize) { final Point mousePos = GuiDraw.getMousePosition(); + // If no slot was removed from the bookmark panel on click: if (!ItemPanels.bookmarkPanel.removeSlot(mousePos.x, mousePos.y, saveIngredients)) { final Recipe recipe = getFocusedRecipe(stackover, mousePos.x, mousePos.y, saveIngredients); + // --- Case 1: saving a recipe (with ingredients) --- if (recipe != null && saveIngredients) { + // If the recipe is not already bookmarked, add it if (!ItemPanels.bookmarkPanel.removeRecipe(recipe.getRecipeId(), BookmarkGrid.DEFAULT_GROUP_ID)) { final Recipe singleRecipe = Recipe.of( Arrays.asList(recipe.getResult(stackover)), @@ -324,18 +328,30 @@ public abstract class ShortcutInputHandler { recipe.getIngredients()); singleRecipe.setCustomRecipeId(recipe.getRecipeId()); - ItemPanels.bookmarkPanel - .addRecipe(singleRecipe, saveStackSize ? 1 : 0, BookmarkGrid.DEFAULT_GROUP_ID); + ItemPanels.bookmarkPanel.addRecipe( + singleRecipe, + // Determine if stack size should be saved + saveStackSize + || NEIClientConfig.getBooleanSetting("inventory.bookmarks.bookmarkRecipeWithCount") + ? 1 + : 0, + BookmarkGrid.DEFAULT_GROUP_ID); } + // --- Case 2: saving an item only --- } else { final RecipeId recipeId = recipe != null ? recipe.getRecipeId() : null; + + // Determine if the item is associated with a recipe and should be saved with it final boolean existsRecipe = recipeId != null && ItemPanels.bookmarkPanel.existsRecipe(recipeId, BookmarkGrid.DEFAULT_GROUP_ID) || NEIClientConfig.getBooleanSetting("inventory.bookmarks.bookmarkItemsWithRecipe"); + // If the item was not removed from the bookmarks, add it if (!ItemPanels.bookmarkPanel .removeItem(stackover, existsRecipe ? recipeId : null, BookmarkGrid.DEFAULT_GROUP_ID)) { + + // Determine whether to preserve the item count saveStackSize = saveStackSize || saveIngredients || ItemPanels.bookmarkPanel.existsRecipe(recipeId, BookmarkGrid.DEFAULT_GROUP_ID); @@ -469,7 +485,7 @@ public abstract class ShortcutInputHandler { hotkeys.put( NEIClientConfig.getKeyName("gui.bookmark", NEIClientUtils.SHIFT_HASH), NEIClientUtils.translate("bookmark.group.remove_recipe")); - } else if (slot.getRecipeId() == null) { + } else if (slot.getRecipeId() == null || slot.getType() == BookmarkItemType.ITEM) { hotkeys.put( NEIClientConfig.getKeyName("gui.bookmark"), NEIClientUtils.translate("bookmark.remove_item")); @@ -484,7 +500,7 @@ public abstract class ShortcutInputHandler { NEIClientConfig.getKeyName("gui.bookmark", NEIClientUtils.SHIFT_HASH), NEIClientUtils.translate("bookmark.remove_recipe")); - if (slot.isIngredient()) { + if (slot.getType() == BookmarkItemType.INGREDIENT) { hotkeys.put( NEIClientConfig.getKeyName("gui.bookmark"), NEIClientUtils.translate("bookmark.remove_item")); @@ -497,7 +513,8 @@ public abstract class ShortcutInputHandler { if (ItemPanels.bookmarkPanel.getGrid().createChainItems(groupId).values().stream() .noneMatch( - m -> !m.isIngredient && !m.equals(item) && item.equalsRecipe(m))) { + m -> m.type == BookmarkItemType.RESULT && !m.equals(item) + && item.equalsRecipe(m))) { hotkeys.put( NEIClientConfig.getKeyName("gui.bookmark"), NEIClientUtils.translate("bookmark.remove_recipe")); @@ -647,7 +664,7 @@ public abstract class ShortcutInputHandler { BookmarksGridSlot slot) { if (slot != null) { - return slot.isIngredient() ? null : slot.getRecipeId(); + return slot.getType() == BookmarkItemType.INGREDIENT ? null : slot.getRecipeId(); } ItemsGridSlot itemSlot = ItemPanels.itemPanel.getSlotMouseOver(mousex, mousey); diff --git a/src/main/java/codechicken/nei/bookmark/BookmarkGrid.java b/src/main/java/codechicken/nei/bookmark/BookmarkGrid.java index b027ff78..513b34b6 100644 --- a/src/main/java/codechicken/nei/bookmark/BookmarkGrid.java +++ b/src/main/java/codechicken/nei/bookmark/BookmarkGrid.java @@ -30,6 +30,7 @@ import codechicken.nei.ItemsGrid.MouseContext; import codechicken.nei.LayoutManager; import codechicken.nei.NEIClientConfig; import codechicken.nei.NEIClientUtils; +import codechicken.nei.bookmark.BookmarkItem.BookmarkItemType; import codechicken.nei.recipe.Recipe; import codechicken.nei.recipe.Recipe.RecipeId; import codechicken.nei.recipe.StackInfo; @@ -367,19 +368,26 @@ public class BookmarkGrid extends ItemsGrid !m.isIngredient && !m.equals(item) && item.equalsRecipe(m)); + .noneMatch(m -> m.type == BookmarkItemType.RESULT && !m.equals(item) && item.equalsRecipe(m)); } - if (item.recipeId != null && removeFullRecipe) { + if (item.recipeId != null && item.type != BookmarkItemType.ITEM && removeFullRecipe) { removeRecipe(item.recipeId, item.groupId); } else if (itemIndex >= 0) { this.bookmarkItems.remove(itemIndex); @@ -925,7 +940,8 @@ public class BookmarkGrid extends ItemsGrid item.equalsRecipe(recipeId, groupId)); + return this.bookmarkItems.stream() + .anyMatch(item -> item.type != BookmarkItemType.ITEM && item.equalsRecipe(recipeId, groupId)); } public RecipeId getRecipeId(int itemIndex) { @@ -1028,8 +1044,14 @@ public class BookmarkGrid extends ItemsGrid 0 && bookmarkItem.equalsRecipe(getCalculatedItem(sortedIndexes.get(sortIndex - 1)))) { + || group.viewMode == BookmarkViewMode.TODO_LIST + && sortableItem.bookmarkItem.type == BookmarkItemType.RESULT)) { + BookmarkItem prevBookmarkItem = sortIndex > 1 ? getCalculatedItem(sortedIndexes.get(sortIndex - 1)) : null; + + while (sortIndex > 0 && prevBookmarkItem != null + && prevBookmarkItem.type != BookmarkItemType.ITEM + && bookmarkItem.equalsRecipe(prevBookmarkItem)) { + prevBookmarkItem = sortIndex > 1 ? getCalculatedItem(sortedIndexes.get(sortIndex - 1)) : null; sortIndex--; } @@ -1058,7 +1080,7 @@ public class BookmarkGrid extends ItemsGrid fuzzyPermutations = new HashMap<>(); public int groupId; @@ -28,10 +43,10 @@ public class BookmarkItem { public long factor; public RecipeId recipeId; - public boolean isIngredient = false; + public BookmarkItemType type = BookmarkItemType.ITEM; protected BookmarkItem(int groupId, long amount, int fluidCellAmount, ItemStack itemStack, - Map permutations, long factor, RecipeId recipeId, boolean isIngredient) { + Map permutations, long factor, RecipeId recipeId, BookmarkItemType type) { this.groupId = groupId; this.amount = amount; @@ -41,10 +56,10 @@ public class BookmarkItem { this.factor = factor; this.recipeId = recipeId; - this.isIngredient = isIngredient; + this.type = type == null ? BookmarkItemType.ITEM : type; } - public static BookmarkItem of(int groupId, ItemStack stack, long factor, RecipeId recipeId, boolean isIngredient, + public static BookmarkItem of(int groupId, ItemStack stack, long factor, RecipeId recipeId, BookmarkItemType type, Map permutations) { final FluidStack fluidStack = StackInfo.getFluid(stack); int fluidCellAmount = 1; @@ -65,18 +80,29 @@ public class BookmarkItem { permutations, factor * fluidCellAmount, recipeId, - isIngredient); + type); } - public static BookmarkItem of(int groupId, ItemStack stack, long factor, RecipeId recipeId, boolean isIngredient) { - return of(groupId, stack, factor, recipeId, isIngredient, generatePermutations(stack, recipeId, isIngredient)); + public static BookmarkItem of(int groupId, ItemStack stack, long factor, RecipeId recipeId, BookmarkItemType type) { + return of( + groupId, + stack, + factor, + recipeId, + type, + generatePermutations(stack, recipeId, type == BookmarkItemType.INGREDIENT)); } public static BookmarkItem of(int groupId, ItemStack stack) { final NBTTagCompound nbTag = StackInfo.itemStackToNBT(stack); final long factor = nbTag.hasKey("gtFluidName") ? Math.min(144, nbTag.getInteger("Count")) : 1; - return BookmarkItem - .of(groupId, stack, factor, null, false, Collections.singletonMap(getItemGUID(stack), stack)); + return BookmarkItem.of( + groupId, + stack, + factor, + null, + BookmarkItemType.ITEM, + Collections.singletonMap(getItemGUID(stack), stack)); } public BookmarkItem copyWithAmount(long amount) { @@ -88,7 +114,7 @@ public class BookmarkItem { this.permutations, this.factor, this.recipeId, - this.isIngredient); + this.type); } public BookmarkItem copy() { @@ -186,14 +212,14 @@ public class BookmarkItem { @Override public int hashCode() { - return Objects.hash(this.groupId, this.fluidCellAmount, this.isIngredient, this.recipeId); + return Objects.hash(this.groupId, this.fluidCellAmount, this.type.toInt(), this.recipeId); } @Override public boolean equals(Object object) { if (object instanceof BookmarkItem item) { - return this.groupId == item.groupId && this.isIngredient == item.isIngredient + return this.groupId == item.groupId && this.type == item.type && this.fluidCellAmount == item.fluidCellAmount && StackInfo.equalItemAndNBT(this.itemStack, item.itemStack, true) && (this.recipeId == item.recipeId || this.recipeId != null && this.recipeId.equals(item.recipeId)); diff --git a/src/main/java/codechicken/nei/bookmark/BookmarkStorage.java b/src/main/java/codechicken/nei/bookmark/BookmarkStorage.java index 817a261a..89823697 100644 --- a/src/main/java/codechicken/nei/bookmark/BookmarkStorage.java +++ b/src/main/java/codechicken/nei/bookmark/BookmarkStorage.java @@ -25,6 +25,7 @@ import com.google.gson.JsonSyntaxException; import codechicken.nei.BookmarkPanel.BookmarkViewMode; import codechicken.nei.NEIClientConfig; +import codechicken.nei.bookmark.BookmarkItem.BookmarkItemType; import codechicken.nei.recipe.Recipe.RecipeId; import codechicken.nei.recipe.StackInfo; import codechicken.nei.util.NBTJson; @@ -239,7 +240,15 @@ public class BookmarkStorage { int groupId = jsonObject.has("groupId") ? jsonObject.get("groupId").getAsInt() : BookmarkGrid.DEFAULT_GROUP_ID; int factor = jsonObject.has("factor") ? Math.abs(jsonObject.get("factor").getAsInt()) : (isFluid ? 144 : 1); - boolean isIngredient = jsonObject.has("ingredient") && jsonObject.get("ingredient").getAsBoolean(); + BookmarkItemType type = jsonObject.has("type") ? BookmarkItemType.fromInt(jsonObject.get("type").getAsInt()) + : null; + + if (type == null) { + // old format + type = jsonObject.has("ingredient") && jsonObject.get("ingredient").getAsBoolean() + ? BookmarkItemType.INGREDIENT + : BookmarkItemType.RESULT; + } if (jsonObject.get("recipeId") instanceof JsonObject recipeJson) { recipeId = RecipeId.of(recipeJson); @@ -249,7 +258,7 @@ public class BookmarkStorage { groupId = BookmarkGrid.DEFAULT_GROUP_ID; } - grid.addItem(BookmarkItem.of(groupId, itemStack, factor, recipeId, isIngredient), false); + grid.addItem(BookmarkItem.of(groupId, itemStack, factor, recipeId, type), false); } return itemStack != null; @@ -266,7 +275,8 @@ public class BookmarkStorage { final Map recipes = new HashMap<>(); for (BookmarkItem item : grid.bookmarkItems) { - if (item.recipeId != null && !item.isIngredient && item.recipeId.getResult() == null) { + if (item.recipeId != null && item.type != BookmarkItemType.INGREDIENT + && item.recipeId.getResult() == null) { final JsonObject recipeJson = item.recipeId.toJsonObject(); final String recipeGUID = item.groupId + ":" + NBTJson.toJson(recipeJson); @@ -284,8 +294,10 @@ public class BookmarkStorage { if (recipes.containsKey(recipeGUID)) { item.recipeId = recipes.get(recipeGUID).copy(); - item.permutations = BookmarkItem - .generatePermutations(item.itemStack, item.recipeId, item.isIngredient); + item.permutations = BookmarkItem.generatePermutations( + item.itemStack, + item.recipeId, + item.type == BookmarkItemType.INGREDIENT); } else { item.recipeId = null; } @@ -338,7 +350,7 @@ public class BookmarkStorage { row.add("item", NBTJson.toJsonObject(StackInfo.itemStackToNBT(item.getItemStack()))); row.add("factor", new JsonPrimitive(item.getFactor())); - row.add("ingredient", new JsonPrimitive(item.isIngredient)); + row.add("type", new JsonPrimitive(item.type.toInt())); if (item.groupId != BookmarkGrid.DEFAULT_GROUP_ID) { row.add("groupId", new JsonPrimitive(item.groupId)); diff --git a/src/main/java/codechicken/nei/bookmark/BookmarksGridSlot.java b/src/main/java/codechicken/nei/bookmark/BookmarksGridSlot.java index 1b6f61ed..67bb2302 100644 --- a/src/main/java/codechicken/nei/bookmark/BookmarksGridSlot.java +++ b/src/main/java/codechicken/nei/bookmark/BookmarksGridSlot.java @@ -15,6 +15,7 @@ import codechicken.nei.NEIClientConfig; import codechicken.nei.NEIClientUtils; import codechicken.nei.NEIClientUtils.Alignment; import codechicken.nei.bookmark.BookmarkGrid.BookmarkMouseContext; +import codechicken.nei.bookmark.BookmarkItem.BookmarkItemType; import codechicken.nei.bookmark.RecipeChainDetails.CalculatedType; import codechicken.nei.guihook.GuiContainerManager; import codechicken.nei.recipe.GuiRecipeTab; @@ -89,7 +90,7 @@ public class BookmarksGridSlot extends ItemsGridSlot { this.realType = this.group.crafting.calculatedItems.get(this.itemIndex).calculatedType == CalculatedType.INGREDIENT ? CalculatedType.INGREDIENT : CalculatedType.RESULT; } else { - this.realType = this.bookmarkItem.isIngredient + this.realType = this.bookmarkItem.type == BookmarkItemType.INGREDIENT || this.group.crafting != null && this.bookmarkItem.recipeId == null ? CalculatedType.INGREDIENT : CalculatedType.RESULT; } @@ -97,9 +98,10 @@ public class BookmarksGridSlot extends ItemsGridSlot { final BookmarkGrid grid = ItemPanels.bookmarkPanel.getGrid(); final BookmarkItem prevItem = grid.getCalculatedItem( grid.gridGenerator.slotToItem.getOrDefault(grid.gridGenerator.itemToSlot.get(this.itemIndex) - 1, -1)); - this.isFirstOutput = this.itemIndex >= 0 && !this.bookmarkItem.isIngredient + this.isFirstOutput = this.itemIndex >= 0 && this.bookmarkItem.type == BookmarkItemType.RESULT && ((this.slotIndex % grid.getColumns()) == 0 || group.viewMode == BookmarkViewMode.DEFAULT) - && (prevItem == null || prevItem.isIngredient || !this.bookmarkItem.equalsRecipe(prevItem)); + && (prevItem == null || prevItem.type == BookmarkItemType.INGREDIENT + || !this.bookmarkItem.equalsRecipe(prevItem)); this.rowIndex = this.slotIndex / grid.getColumns(); } @@ -116,8 +118,8 @@ public class BookmarksGridSlot extends ItemsGridSlot { return this.bookmarkItem.recipeId; } - public boolean isIngredient() { - return this.bookmarkItem.isIngredient; + public BookmarkItemType getType() { + return this.bookmarkItem.type; } public BookmarkGroup getGroup() { @@ -151,11 +153,17 @@ public class BookmarksGridSlot extends ItemsGridSlot { return false; } - if (this.group.crafting != null) { + if (this.slotIndex == mouseContext.slotIndex || this.group.crafting != null) { return true; } - return this.bookmarkItem.equalsRecipe(mouseContext.recipeId, mouseContext.groupId); + if (this.bookmarkItem.type == BookmarkItemType.ITEM && this.group.viewMode == BookmarkViewMode.TODO_LIST + && mouseContext.rowIndex == this.rowIndex) { + return true; + } + + return this.bookmarkItem.type != BookmarkItemType.ITEM + && this.bookmarkItem.equalsRecipe(mouseContext.recipeId, mouseContext.groupId); } protected boolean showRealItem(BookmarkMouseContext mouseContext) { @@ -173,7 +181,8 @@ public class BookmarksGridSlot extends ItemsGridSlot { return true; } - if (this.bookmarkItem.equalsRecipe(mouseContext.recipeId, mouseContext.groupId)) { + if (this.bookmarkItem.type != BookmarkItemType.ITEM + && this.bookmarkItem.equalsRecipe(mouseContext.recipeId, mouseContext.groupId)) { return true; } @@ -212,7 +221,7 @@ public class BookmarksGridSlot extends ItemsGridSlot { } - if (!this.bookmarkItem.isIngredient && this.bookmarkItem.recipeId != null + if (this.bookmarkItem.type != BookmarkItemType.INGREDIENT && this.bookmarkItem.recipeId != null && calculatedType == null && showMarker && (mouseContext == null || mouseContext.slotIndex != this.slotIndex)) { @@ -259,7 +268,7 @@ public class BookmarksGridSlot extends ItemsGridSlot { drawStackSize(rect, shownItemType); - if (this.bookmarkItem.isIngredient || this.bookmarkItem.recipeId == null) { + if (this.bookmarkItem.type == BookmarkItemType.INGREDIENT || this.bookmarkItem.recipeId == null) { return; } @@ -283,18 +292,17 @@ public class BookmarksGridSlot extends ItemsGridSlot { NEIClientConfig.getSetting("inventory.bookmarks.recipeMarkerColor").getHexValue(), Alignment.TopLeft); } + } - if (NEIClientConfig.getBooleanSetting("inventory.bookmarks.showRecipeHandlerIcon") - && getHandlerInfo() != null) { - drawHandlerIcon(rect); - } else if (NEIClientConfig.showRecipeMarkerMode() == 1) { - drawMarker( - rect, - "R", - NEIClientConfig.getSetting("inventory.bookmarks.recipeMarkerColor").getHexValue(), - Alignment.TopRight); - } + if (this.isFirstOutput || NEIClientConfig.showRecipeMarkerMode() == 1) { + drawRecipeMarker(rect); + } + } + protected void drawRecipeMarker(Rectangle4i rect) { + if (NEIClientConfig.getBooleanSetting("inventory.bookmarks.showRecipeHandlerIcon") + && getHandlerInfo() != null) { + drawHandlerIcon(rect); } else if (NEIClientConfig.showRecipeMarkerMode() == 1) { drawMarker( rect, @@ -302,7 +310,6 @@ public class BookmarksGridSlot extends ItemsGridSlot { NEIClientConfig.getSetting("inventory.bookmarks.recipeMarkerColor").getHexValue(), Alignment.TopRight); } - } protected void drawHandlerIcon(Rectangle4i rect) { diff --git a/src/main/java/codechicken/nei/bookmark/GroupingItem.java b/src/main/java/codechicken/nei/bookmark/GroupingItem.java index 6b5938db..ec842097 100644 --- a/src/main/java/codechicken/nei/bookmark/GroupingItem.java +++ b/src/main/java/codechicken/nei/bookmark/GroupingItem.java @@ -7,6 +7,7 @@ import java.util.Map; import java.util.Set; import codechicken.nei.BookmarkPanel.BookmarkViewMode; +import codechicken.nei.bookmark.BookmarkItem.BookmarkItemType; import codechicken.nei.recipe.Recipe.RecipeId; public class GroupingItem { @@ -124,7 +125,7 @@ public class GroupingItem { final BookmarkItem item = this.grid.getCalculatedItem(itemIndex); - if (item.recipeId != null) { + if (item.recipeId != null && item.type != BookmarkItemType.ITEM) { final List sortedItems = this.grid.getSortedItems(); final BookmarkGroup group = this.grid.getGroup(item.groupId); final boolean isCollapsedGroup = group.collapsed @@ -139,7 +140,8 @@ public class GroupingItem { for (Integer rItemIndex : sortedItems) { final BookmarkItem rItem = this.grid.getCalculatedItem(rItemIndex); - if (rItem.groupId == item.groupId && (isCollapsedGroup || recipeRelations.contains(rItem.recipeId))) { + if (rItem.groupId == item.groupId && (isCollapsedGroup + || rItem.type != BookmarkItemType.ITEM && recipeRelations.contains(rItem.recipeId))) { return this.grid.getAbsoluteSlotIndex(rItemIndex) / this.grid.getColumns(); } } @@ -160,7 +162,7 @@ public class GroupingItem { final BookmarkItem item = this.grid.getCalculatedItem(itemIndex); - if (item.recipeId != null) { + if (item.recipeId != null && item.type != BookmarkItemType.ITEM) { final List sortedItems = this.grid.getSortedItems(); final BookmarkGroup group = this.grid.getGroup(item.groupId); final boolean isCollapsedGroup = group.collapsed @@ -176,7 +178,8 @@ public class GroupingItem { final int rItemIndex = sortedItems.get(index); final BookmarkItem rItem = this.grid.getCalculatedItem(rItemIndex); - if (rItem.groupId == item.groupId && (isCollapsedGroup || recipeRelations.contains(rItem.recipeId))) { + if (rItem.groupId == item.groupId && (isCollapsedGroup + || rItem.type != BookmarkItemType.ITEM && recipeRelations.contains(rItem.recipeId))) { return this.grid.getAbsoluteSlotIndex(rItemIndex) / this.grid.getColumns(); } } diff --git a/src/main/java/codechicken/nei/bookmark/RecipeChainDetails.java b/src/main/java/codechicken/nei/bookmark/RecipeChainDetails.java index c24e497a..615407ae 100644 --- a/src/main/java/codechicken/nei/bookmark/RecipeChainDetails.java +++ b/src/main/java/codechicken/nei/bookmark/RecipeChainDetails.java @@ -12,6 +12,7 @@ import java.util.stream.Collectors; import net.minecraft.item.ItemStack; +import codechicken.nei.bookmark.BookmarkItem.BookmarkItemType; import codechicken.nei.recipe.Recipe.RecipeId; import codechicken.nei.recipe.StackInfo; import codechicken.nei.recipe.chain.RecipeChainMath; @@ -69,7 +70,7 @@ public class RecipeChainDetails { item, item.amount, item.amount, - item.isIngredient ? CalculatedType.INGREDIENT : CalculatedType.RESULT); + item.type == BookmarkItemType.INGREDIENT ? CalculatedType.INGREDIENT : CalculatedType.RESULT); } public ItemStack getItemStack(long amount) { @@ -217,11 +218,12 @@ public class RecipeChainDetails { for (BookmarkChainItem value : items) { int itemIndex = sortingChainItems.get(value.getItem()); - if (value.getItem().isIngredient || !recipeId.equals(value.getItem().recipeId)) { + if (value.getItem().type == BookmarkItemType.INGREDIENT || !recipeId.equals(value.getItem().recipeId)) { itemIndex *= -1; } - if (!value.getItem().isIngredient && !math.outputRecipes.containsKey(value.getItem().recipeId)) { + if (value.getItem().type == BookmarkItemType.RESULT + && !math.outputRecipes.containsKey(value.getItem().recipeId)) { value.calculatedType = CalculatedType.REMAINDER; } @@ -251,7 +253,7 @@ public class RecipeChainDetails { for (BookmarkChainItem value : items) { int itemIndex = sortingChainItems.get(value.getItem()); - if (value.getItem().isIngredient || !recipeId.equals(value.getItem().recipeId)) { + if (value.getItem().type == BookmarkItemType.INGREDIENT || !recipeId.equals(value.getItem().recipeId)) { itemIndex *= -1; } diff --git a/src/main/java/codechicken/nei/bookmark/SortableItem.java b/src/main/java/codechicken/nei/bookmark/SortableItem.java index 89030a98..a52b1ef3 100644 --- a/src/main/java/codechicken/nei/bookmark/SortableItem.java +++ b/src/main/java/codechicken/nei/bookmark/SortableItem.java @@ -9,6 +9,7 @@ import java.util.Map; import codechicken.lib.vec.Rectangle4i; import codechicken.nei.BookmarkPanel.BookmarkViewMode; import codechicken.nei.ItemsGrid; +import codechicken.nei.bookmark.BookmarkItem.BookmarkItemType; import codechicken.nei.bookmark.RecipeChainDetails.BookmarkChainItem; import codechicken.nei.guihook.GuiContainerManager; import codechicken.nei.recipe.Recipe.RecipeId; @@ -30,10 +31,10 @@ public class SortableItem { this.grid = grid; this.bookmarkItem = bookmarkItem.copy(); - this.moveRecipe = bookmarkItem.recipeId != null && !bookmarkItem.isIngredient + this.moveRecipe = bookmarkItem.recipeId != null && bookmarkItem.type == BookmarkItemType.RESULT && (group.viewMode == BookmarkViewMode.TODO_LIST || group.crafting != null); this.crossGroup = !group.collapsed && group.viewMode == BookmarkViewMode.TODO_LIST - && !this.bookmarkItem.isIngredient; + && bookmarkItem.type != BookmarkItemType.INGREDIENT; this.isCollapsedRecipe = group.crafting != null && group.crafting.itemToRecipe.values().stream() .anyMatch(recipeId -> this.bookmarkItem.equalsRecipe(recipeId, this.bookmarkItem.groupId)); diff --git a/src/main/java/codechicken/nei/recipe/GuiCraftingRecipe.java b/src/main/java/codechicken/nei/recipe/GuiCraftingRecipe.java index 06f0211b..22cde1e5 100644 --- a/src/main/java/codechicken/nei/recipe/GuiCraftingRecipe.java +++ b/src/main/java/codechicken/nei/recipe/GuiCraftingRecipe.java @@ -18,6 +18,7 @@ import codechicken.nei.ItemPanels; import codechicken.nei.ItemsGrid.ItemsGridSlot; import codechicken.nei.NEIClientConfig; import codechicken.nei.NEIClientUtils; +import codechicken.nei.bookmark.BookmarkItem.BookmarkItemType; import codechicken.nei.bookmark.BookmarksGridSlot; import codechicken.nei.recipe.Recipe.RecipeId; @@ -121,7 +122,8 @@ public class GuiCraftingRecipe extends GuiRecipe { final BookmarksGridSlot panelSlot = ItemPanels.bookmarkPanel.getSlotMouseOver(mouseover.x, mouseover.y); if (panelSlot != null) { - return panelSlot.isIngredient() || panelSlot.getRecipeId() == null ? FavoriteRecipes.getFavorite(stackover) + return panelSlot.getType() == BookmarkItemType.INGREDIENT || panelSlot.getRecipeId() == null + ? FavoriteRecipes.getFavorite(stackover) : panelSlot.getRecipeId(); } diff --git a/src/main/java/codechicken/nei/recipe/GuiOverlayButton.java b/src/main/java/codechicken/nei/recipe/GuiOverlayButton.java index 27e18b62..33a5080b 100644 --- a/src/main/java/codechicken/nei/recipe/GuiOverlayButton.java +++ b/src/main/java/codechicken/nei/recipe/GuiOverlayButton.java @@ -313,8 +313,11 @@ public class GuiOverlayButton extends GuiRecipeButton { final Recipe recipe = getRecipe(); if (!ItemPanels.bookmarkPanel.removeRecipe(recipe.getRecipeId(), BookmarkGrid.DEFAULT_GROUP_ID)) { - ItemPanels.bookmarkPanel - .addRecipe(recipe, NEIClientUtils.controlKey() ? 1 : 0, BookmarkGrid.DEFAULT_GROUP_ID); + ItemPanels.bookmarkPanel.addRecipe( + recipe, + NEIClientUtils.controlKey() + || NEIClientConfig.getBooleanSetting("inventory.bookmarks.bookmarkRecipeWithCount") ? 1 : 0, + BookmarkGrid.DEFAULT_GROUP_ID); } } diff --git a/src/main/java/codechicken/nei/recipe/Recipe.java b/src/main/java/codechicken/nei/recipe/Recipe.java index 6efe2c43..7a68bfcc 100644 --- a/src/main/java/codechicken/nei/recipe/Recipe.java +++ b/src/main/java/codechicken/nei/recipe/Recipe.java @@ -236,11 +236,6 @@ public class Recipe { return false; } - if (this.result != null && anRecipeId.result != null - && !StackInfo.equalItemAndNBT(this.result, anRecipeId.result, true)) { - return false; - } - for (int idx = 0; idx < this.ingredients.size(); idx++) { if (!StackInfo.equalItemAndNBT(this.ingredients.get(idx), anRecipeId.ingredients.get(idx), true)) { return false; diff --git a/src/main/java/codechicken/nei/recipe/RecipeItemInputHandler.java b/src/main/java/codechicken/nei/recipe/RecipeItemInputHandler.java index 2947cf76..976a4d1a 100644 --- a/src/main/java/codechicken/nei/recipe/RecipeItemInputHandler.java +++ b/src/main/java/codechicken/nei/recipe/RecipeItemInputHandler.java @@ -14,6 +14,7 @@ import codechicken.nei.ItemPanels; import codechicken.nei.ItemsGrid.ItemsGridSlot; import codechicken.nei.NEIClientConfig; import codechicken.nei.api.ShortcutInputHandler; +import codechicken.nei.bookmark.BookmarkItem.BookmarkItemType; import codechicken.nei.bookmark.BookmarksGridSlot; import codechicken.nei.guihook.GuiContainerManager; import codechicken.nei.guihook.IContainerInputHandler; @@ -81,7 +82,7 @@ public class RecipeItemInputHandler implements IContainerInputHandler, IContaine final BookmarksGridSlot slot = ItemPanels.bookmarkPanel.getSlotMouseOver(mousex, mousey); if (slot != null && slot.getRecipeId() != null - && !slot.isIngredient() + && slot.getType() != BookmarkItemType.INGREDIENT && NEIClientConfig.getRecipeTooltipsMode() != 0) { final int tooltipMode = NEIClientConfig.getRecipeTooltipsMode(); final BookmarkViewMode viewMode = slot.getGroup().viewMode; diff --git a/src/main/java/codechicken/nei/recipe/chain/RecipeChainMath.java b/src/main/java/codechicken/nei/recipe/chain/RecipeChainMath.java index 3ca86e35..17bf778c 100644 --- a/src/main/java/codechicken/nei/recipe/chain/RecipeChainMath.java +++ b/src/main/java/codechicken/nei/recipe/chain/RecipeChainMath.java @@ -16,6 +16,7 @@ import net.minecraft.nbt.NBTTagCompound; import codechicken.nei.ItemStackAmount; import codechicken.nei.NEIClientUtils; import codechicken.nei.bookmark.BookmarkItem; +import codechicken.nei.bookmark.BookmarkItem.BookmarkItemType; import codechicken.nei.recipe.Recipe; import codechicken.nei.recipe.Recipe.RecipeId; import codechicken.nei.recipe.Recipe.RecipeIngredient; @@ -52,20 +53,12 @@ public class RecipeChainMath { private final List containerItemsBlacklist = new ArrayList<>(); private RecipeChainMath(List recipeItems, Set collapsedRecipes) { - final Map recipeState = new HashMap<>(); final Map multipliers = new HashMap<>(); for (BookmarkItem item : recipeItems) { - if (item.recipeId != null) { - recipeState - .put(item.recipeId, recipeState.getOrDefault(item.recipeId, 0) | (item.isIngredient ? 1 : 2)); - } - } - - for (BookmarkItem item : recipeItems) { - if (recipeState.getOrDefault(item.recipeId, 0) != 3) { + if (item.recipeId == null || item.type == BookmarkItemType.ITEM) { this.initialItems.add(item.copy()); - } else if (item.isIngredient) { + } else if (item.type == BookmarkItemType.INGREDIENT) { this.recipeIngredients.add(item.copyWithAmount(0)); } else { this.recipeResults.add(item.copyWithAmount(0)); @@ -209,7 +202,7 @@ public class RecipeChainMath { item.getItemStack(amount), item.getStackSize(amount), ROOT_RECIPE_ID, - true, + BookmarkItemType.INGREDIENT, BookmarkItem.generatePermutations(item.itemStack, null))); } } @@ -217,7 +210,7 @@ public class RecipeChainMath { this.outputRecipes.clear(); this.outputRecipes.put(ROOT_RECIPE_ID, 1L); this.recipeResults.removeIf(item -> ROOT_RECIPE_ID.equals(item.recipeId)); - this.recipeResults.add(BookmarkItem.of(-1, ROOT_ITEM, 1, ROOT_RECIPE_ID, false)); + this.recipeResults.add(BookmarkItem.of(-1, ROOT_ITEM, 1, ROOT_RECIPE_ID, BookmarkItemType.RESULT)); this.recipeIngredients.addAll(rootIngredients); return ROOT_RECIPE_ID; @@ -236,7 +229,7 @@ public class RecipeChainMath { final RecipeId recipeId = recipe.getRecipeId(); final ItemStack result = recipe.getResult(); - chainItems.add(BookmarkItem.of(-1, result, StackInfo.getAmount(result), recipeId, false)); + chainItems.add(BookmarkItem.of(-1, result, StackInfo.getAmount(result), recipeId, BookmarkItemType.RESULT)); for (RecipeIngredient ingr : recipe.getIngredients()) { chainItems.add( @@ -245,7 +238,7 @@ public class RecipeChainMath { ingr.getItemStack(), ingr.getAmount(), recipeId, - true, + BookmarkItemType.INGREDIENT, BookmarkItem.generatePermutations(ingr.getItemStack(), recipe))); } diff --git a/src/main/resources/assets/nei/lang/en_US.lang b/src/main/resources/assets/nei/lang/en_US.lang index 8a1db45b..6ae97183 100644 --- a/src/main/resources/assets/nei/lang/en_US.lang +++ b/src/main/resources/assets/nei/lang/en_US.lang @@ -247,6 +247,9 @@ nei.options.inventory.bookmarks.worldSpecific.false=No nei.options.inventory.bookmarks.bookmarkItemsWithRecipe=Bookmark items with recipe nei.options.inventory.bookmarks.bookmarkItemsWithRecipe.true=Yes nei.options.inventory.bookmarks.bookmarkItemsWithRecipe.false=No +nei.options.inventory.bookmarks.bookmarkRecipeWithCount=Bookmark recipe with count +nei.options.inventory.bookmarks.bookmarkRecipeWithCount.true=Yes +nei.options.inventory.bookmarks.bookmarkRecipeWithCount.false=No nei.options.inventory.favorites=Favorites nei.options.inventory.favorites.enabled=Visibility nei.options.inventory.favorites.enabled.true=Visible