From db105905f770c177ad81b0ad85e96f8b51f02b16 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 30 Mar 2024 17:27:37 -0400 Subject: [PATCH 1/3] Implement a fallback search tree for the recipe book --- .../blast_search_trees/MinecraftMixin.java | 7 +- .../searchtree/RecipeBookSearchTree.java | 65 +++++++++++++++++++ 2 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 forge/src/main/java/org/embeddedt/modernfix/forge/searchtree/RecipeBookSearchTree.java diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/blast_search_trees/MinecraftMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/blast_search_trees/MinecraftMixin.java index 05bb5057..e2cbb4e6 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/blast_search_trees/MinecraftMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/blast_search_trees/MinecraftMixin.java @@ -9,6 +9,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraftforge.fml.ModList; import org.embeddedt.modernfix.annotation.ClientOnlyMixin; +import org.embeddedt.modernfix.forge.searchtree.RecipeBookSearchTree; import org.embeddedt.modernfix.searchtree.DummySearchTree; import org.embeddedt.modernfix.forge.searchtree.JEIBackedSearchTree; import org.spongepowered.asm.mixin.Final; @@ -28,13 +29,15 @@ public class MinecraftMixin { ci.cancel(); mfix$runItemFillingQuirk(); if(ModList.get().getModFileById("jei") != null && ModList.get().getModFileById("roughlyenoughitems") == null) { - this.searchRegistry.register(SearchRegistry.CREATIVE_NAMES, new JEIBackedSearchTree(false)); + JEIBackedSearchTree mainTree = new JEIBackedSearchTree(false); + this.searchRegistry.register(SearchRegistry.CREATIVE_NAMES, mainTree); this.searchRegistry.register(SearchRegistry.CREATIVE_TAGS, new JEIBackedSearchTree(true)); + this.searchRegistry.register(SearchRegistry.RECIPE_COLLECTIONS, new RecipeBookSearchTree(mainTree)); } else { this.searchRegistry.register(SearchRegistry.CREATIVE_NAMES, new DummySearchTree<>()); this.searchRegistry.register(SearchRegistry.CREATIVE_TAGS, new DummySearchTree<>()); + this.searchRegistry.register(SearchRegistry.RECIPE_COLLECTIONS, new DummySearchTree<>()); } - this.searchRegistry.register(SearchRegistry.RECIPE_COLLECTIONS, new DummySearchTree<>()); } diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/searchtree/RecipeBookSearchTree.java b/forge/src/main/java/org/embeddedt/modernfix/forge/searchtree/RecipeBookSearchTree.java new file mode 100644 index 00000000..35c45f03 --- /dev/null +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/searchtree/RecipeBookSearchTree.java @@ -0,0 +1,65 @@ +package org.embeddedt.modernfix.forge.searchtree; + +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import net.minecraft.client.gui.screens.recipebook.RecipeCollection; +import net.minecraft.client.searchtree.SearchTree; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import org.embeddedt.modernfix.searchtree.DummySearchTree; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class RecipeBookSearchTree extends DummySearchTree { + private final SearchTree stackCollector; + private Map> collectionsByItem = null; + private final List allCollections = new ArrayList<>(); + + public RecipeBookSearchTree(SearchTree stackCollector) { + this.stackCollector = stackCollector; + } + + private Map> populateCollectionMap() { + Map> collections = this.collectionsByItem; + if(collections == null) { + collections = new Object2ObjectOpenHashMap<>(); + Map> finalCollection = collections; + for(RecipeCollection collection : allCollections) { + collection.getRecipes().stream().map(recipe -> recipe.getResultItem().getItem()).distinct().forEach(item -> { + finalCollection.computeIfAbsent(item, k -> new ArrayList<>()).add(collection); + }); + } + this.collectionsByItem = collections; + } + return collections; + } + + @Override + public void add(RecipeCollection pObj) { + this.allCollections.add(pObj); + } + + @Override + public void clear() { + this.allCollections.clear(); + } + + @Override + public void refresh() { + this.collectionsByItem = null; + } + + @Override + public List search(String pSearchText) { + // Avoid constructing the recipe collection map until the first real search + if(pSearchText.trim().length() == 0) { + return this.allCollections; + } + List stacks = stackCollector.search(pSearchText); + Map> collections = this.populateCollectionMap(); + return stacks.stream().map(ItemStack::getItem).distinct().flatMap(item -> collections.getOrDefault(item, Collections.emptyList()).stream()).collect(Collectors.toList()); + } +} From 469b4b70932e753fed2778ea86df86050bb1bcaf Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 30 Mar 2024 17:35:06 -0400 Subject: [PATCH 2/3] Use separate backing search tree for recipe book --- .../forge/mixin/perf/blast_search_trees/MinecraftMixin.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/blast_search_trees/MinecraftMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/blast_search_trees/MinecraftMixin.java index e2cbb4e6..2742e56e 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/blast_search_trees/MinecraftMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/blast_search_trees/MinecraftMixin.java @@ -29,10 +29,9 @@ public class MinecraftMixin { ci.cancel(); mfix$runItemFillingQuirk(); if(ModList.get().getModFileById("jei") != null && ModList.get().getModFileById("roughlyenoughitems") == null) { - JEIBackedSearchTree mainTree = new JEIBackedSearchTree(false); - this.searchRegistry.register(SearchRegistry.CREATIVE_NAMES, mainTree); + this.searchRegistry.register(SearchRegistry.CREATIVE_NAMES, new JEIBackedSearchTree(false)); this.searchRegistry.register(SearchRegistry.CREATIVE_TAGS, new JEIBackedSearchTree(true)); - this.searchRegistry.register(SearchRegistry.RECIPE_COLLECTIONS, new RecipeBookSearchTree(mainTree)); + this.searchRegistry.register(SearchRegistry.RECIPE_COLLECTIONS, new RecipeBookSearchTree(new JEIBackedSearchTree(false))); } else { this.searchRegistry.register(SearchRegistry.CREATIVE_NAMES, new DummySearchTree<>()); this.searchRegistry.register(SearchRegistry.CREATIVE_TAGS, new DummySearchTree<>()); From e9c266cd16ee6e589e86fc442898088d8e731dc0 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 30 Mar 2024 17:39:36 -0400 Subject: [PATCH 3/3] Properly port recipe book tree to 1.19.2 --- .../perf/blast_search_trees/MinecraftMixin.java | 2 +- .../searchtree/RecipeBookSearchTree.java | 15 +++------------ 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/blast_search_trees/MinecraftMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/blast_search_trees/MinecraftMixin.java index ebdff6e4..6a29d012 100644 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/blast_search_trees/MinecraftMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/blast_search_trees/MinecraftMixin.java @@ -29,7 +29,7 @@ public class MinecraftMixin { ModernFix.LOGGER.info("Replacing search trees with '{}' provider", provider.getName()); this.searchRegistry.register(SearchRegistry.CREATIVE_NAMES, list -> provider.getSearchTree(false)); this.searchRegistry.register(SearchRegistry.CREATIVE_TAGS, list -> provider.getSearchTree(true)); - this.searchRegistry.register(SearchRegistry.RECIPE_COLLECTIONS, list -> new RecipeBookSearchTree(provider.getSearchTree(false))); + this.searchRegistry.register(SearchRegistry.RECIPE_COLLECTIONS, list -> new RecipeBookSearchTree(provider.getSearchTree(false), list)); // grab components for all key mappings in order to prevent them from being loaded off-thread later // this populates the LazyLoadedValues // we also need to suppress GLFW errors to prevent crashes if a key is missing diff --git a/common/src/main/java/org/embeddedt/modernfix/searchtree/RecipeBookSearchTree.java b/common/src/main/java/org/embeddedt/modernfix/searchtree/RecipeBookSearchTree.java index f4bf16b4..be37a5f1 100644 --- a/common/src/main/java/org/embeddedt/modernfix/searchtree/RecipeBookSearchTree.java +++ b/common/src/main/java/org/embeddedt/modernfix/searchtree/RecipeBookSearchTree.java @@ -15,10 +15,11 @@ import java.util.stream.Collectors; public class RecipeBookSearchTree extends DummySearchTree { private final SearchTree stackCollector; private Map> collectionsByItem = null; - private final List allCollections = new ArrayList<>(); + private final List allCollections; - public RecipeBookSearchTree(SearchTree stackCollector) { + public RecipeBookSearchTree(SearchTree stackCollector, List allCollections) { this.stackCollector = stackCollector; + this.allCollections = allCollections; } private Map> populateCollectionMap() { @@ -36,16 +37,6 @@ public class RecipeBookSearchTree extends DummySearchTree { return collections; } - @Override - public void add(RecipeCollection pObj) { - this.allCollections.add(pObj); - } - - @Override - public void clear() { - this.allCollections.clear(); - } - @Override public void refresh() { this.collectionsByItem = null;