diff --git a/api/src/main/java/me/shedaniel/rei/api/client/registry/display/DisplayCategory.java b/api/src/main/java/me/shedaniel/rei/api/client/registry/display/DisplayCategory.java index 818fdad8d..d9beed79a 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/registry/display/DisplayCategory.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/registry/display/DisplayCategory.java @@ -32,6 +32,7 @@ import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.display.Display; import me.shedaniel.rei.api.common.display.DisplayMerger; +import me.shedaniel.rei.api.common.entry.EntryIngredient; import me.shedaniel.rei.api.common.util.Identifiable; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -41,6 +42,7 @@ import org.jetbrains.annotations.Nullable; import java.util.Collections; +import java.util.Iterator; import java.util.List; @Environment(EnvType.CLIENT) @@ -149,8 +151,8 @@ static DisplayMerger getContentMerger() { @Override public boolean canMerge(T first, T second) { if (!first.getCategoryIdentifier().equals(second.getCategoryIdentifier())) return false; - if (!first.getInputEntries().equals(second.getInputEntries())) return false; - if (!first.getOutputEntries().equals(second.getOutputEntries())) return false; + if (!equals(first.getInputEntries(), second.getInputEntries())) return false; + if (!equals(first.getOutputEntries(), second.getOutputEntries())) return false; return true; } @@ -158,6 +160,16 @@ public boolean canMerge(T first, T second) { public int hashOf(T display) { return display.getCategoryIdentifier().hashCode() * 31 * 31 * 31 + display.getInputEntries().hashCode() * 31 * 31 + display.getOutputEntries().hashCode(); } + + private boolean equals(List l1, List l2) { + if (l1.size() != l2.size()) return false; + Iterator it1 = l1.iterator(); + Iterator it2 = l2.iterator(); + while (it1.hasNext() && it2.hasNext()) { + if (!it1.next().equals(it2.next())) return false; + } + return true; + } }; } diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/crafting/DefaultCraftingCategory.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/crafting/DefaultCraftingCategory.java index 83e435a5a..963717e45 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/crafting/DefaultCraftingCategory.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/crafting/DefaultCraftingCategory.java @@ -33,6 +33,7 @@ import me.shedaniel.rei.api.client.registry.display.DisplayCategory; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.display.DisplayMerger; +import me.shedaniel.rei.api.common.entry.EntryIngredient; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.entry.InputIngredient; import me.shedaniel.rei.api.common.util.EntryStacks; @@ -44,6 +45,7 @@ import net.minecraft.world.level.block.Blocks; import org.jetbrains.annotations.Nullable; +import java.util.Iterator; import java.util.List; @Environment(EnvType.CLIENT) @@ -89,6 +91,32 @@ public List setupDisplay(DefaultCraftingDisplay display, Rectangle bo @Override @Nullable public DisplayMerger> getDisplayMerger() { - return DisplayCategory.getContentMerger(); + return new DisplayMerger<>() { + @Override + public boolean canMerge(DefaultCraftingDisplay first, DefaultCraftingDisplay second) { + if (!first.getCategoryIdentifier().equals(second.getCategoryIdentifier())) return false; + if (!equals(first.getOrganisedInputEntries(3, 3), second.getInputEntries())) return false; + if (!equals(first.getOutputEntries(), second.getOutputEntries())) return false; + if (first.isShapeless() != second.isShapeless()) return false; + if (first.getWidth() != second.getWidth()) return false; + if (first.getHeight() != second.getHeight()) return false; + return true; + } + + @Override + public int hashOf(DefaultCraftingDisplay display) { + return display.getCategoryIdentifier().hashCode() * 31 * 31 * 31 + display.getOrganisedInputEntries(3, 3).hashCode() * 31 * 31 + display.getOutputEntries().hashCode(); + } + + private boolean equals(List l1, List l2) { + if (l1.size() != l2.size()) return false; + Iterator it1 = l1.iterator(); + Iterator it2 = l2.iterator(); + while (it1.hasNext() && it2.hasNext()) { + if (!it1.next().equals(it2.next())) return false; + } + return true; + } + }; } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java index 88496cef3..9c185764e 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java @@ -134,6 +134,8 @@ public boolean canDeleteItems() { @Override public void appendModIdToTooltips(Tooltip components, String modId) { final String modName = ClientHelper.getInstance().getModFromModId(modId); + if (this.preserveModId(components, modName)) return; + int i = 0; Iterator iterator = components.entries().iterator(); while (iterator.hasNext()) { @@ -145,6 +147,14 @@ public void appendModIdToTooltips(Tooltip components, String modId) { components.add(ClientHelper.getInstance().getFormattedModFromModId(modId)); } + private boolean preserveModId(Tooltip components, String modName) { + if (components.entries().isEmpty()) return false; + Tooltip.Entry lastEntry = components.entries().get(components.entries().size() - 1); + + if (!lastEntry.isText()) return false; + return FormattingUtils.stripFormatting(lastEntry.getAsText().getString()).equalsIgnoreCase(modName); + } + @Override public String getModFromModId(String modId) { if (modId == null) diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java index 54fe8ba5f..b815882c3 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java @@ -240,7 +240,7 @@ public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Wrapped)) return false; Wrapped wrapped = (Wrapped) o; - return merger.canMerge(display, wrapped.display); + return hash == wrapped.hash && merger.canMerge(display, wrapped.display); } @Override