From 6f8815200ea3d3013cd8b42ad987065d2aed2fa2 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 15 May 2023 21:05:01 -0400 Subject: [PATCH] Move search tree replacement to common module --- common/build.gradle | 2 + .../embeddedt/modernfix/ModernFixClient.java | 5 +++ .../blast_search_trees/MinecraftMixin.java | 2 + .../core/config/ModernFixEarlyConfig.java | 6 --- .../searchtree/JEIBackedSearchTree.java | 44 ++++++++++++++----- .../searchtree/REIBackedSearchTree.java | 19 ++++++++ .../SearchTreeProviderRegistry.java | 6 ++- forge/build.gradle | 3 -- .../forge/init/ModernFixClientForge.java | 3 -- .../IngredientFilterInvoker.java | 14 ------ 10 files changed, 66 insertions(+), 38 deletions(-) rename {forge/src/main/java/org/embeddedt/modernfix/forge => common/src/main/java/org/embeddedt/modernfix}/searchtree/JEIBackedSearchTree.java (63%) delete mode 100644 forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/blast_search_trees/IngredientFilterInvoker.java diff --git a/common/build.gradle b/common/build.gradle index 9ed3b9ae..f047ba1d 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -23,6 +23,8 @@ dependencies { modCompileOnly("me.shedaniel:RoughlyEnoughItems-fabric:${rei_version}") { transitive = false } + // compile against the JEI API but do not include it at runtime + modCompileOnly("mezz.jei:jei-${minecraft_version}-common:${jei_version}") // Remove the next line if you don't want to depend on the API // modApi "me.shedaniel:architectury:${rootProject.architectury_version}" } diff --git a/common/src/main/java/org/embeddedt/modernfix/ModernFixClient.java b/common/src/main/java/org/embeddedt/modernfix/ModernFixClient.java index c65a5ff8..7a020414 100644 --- a/common/src/main/java/org/embeddedt/modernfix/ModernFixClient.java +++ b/common/src/main/java/org/embeddedt/modernfix/ModernFixClient.java @@ -14,6 +14,9 @@ import net.minecraft.world.entity.Entity; import org.embeddedt.modernfix.core.ModernFixMixinPlugin; import org.embeddedt.modernfix.packet.EntityIDSyncPacket; import org.embeddedt.modernfix.platform.ModernFixPlatformHooks; +import org.embeddedt.modernfix.searchtree.JEIBackedSearchTree; +import org.embeddedt.modernfix.searchtree.REIBackedSearchTree; +import org.embeddedt.modernfix.searchtree.SearchTreeProviderRegistry; import org.embeddedt.modernfix.world.IntegratedWatchdog; import java.lang.management.ManagementFactory; @@ -36,6 +39,8 @@ public class ModernFixClient { if(ModernFixMixinPlugin.instance.isOptionEnabled("feature.branding.F3Screen")) { brandingString = "ModernFix " + ModernFixPlatformHooks.getVersionString(); } + SearchTreeProviderRegistry.register(JEIBackedSearchTree.PROVIDER); + SearchTreeProviderRegistry.register(REIBackedSearchTree.PROVIDER); } public void resetWorldLoadStateMachine() { 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 4b9d7c05..d28c2fc0 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 @@ -21,6 +21,8 @@ public class MinecraftMixin { @Inject(method = "createSearchTrees", at = @At("HEAD"), cancellable = true) private void replaceSearchTrees(CallbackInfo ci) { SearchTreeProviderRegistry.Provider provider = SearchTreeProviderRegistry.getSearchTreeProvider(); + if(provider == null) + return; ModernFix.LOGGER.info("Replacing search trees with '{}' provider", provider.getName()); this.searchRegistry.register(SearchRegistry.CREATIVE_NAMES, provider.getSearchTree(false)); this.searchRegistry.register(SearchRegistry.CREATIVE_TAGS, provider.getSearchTree(true)); diff --git a/common/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java b/common/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java index 1e49dcff..1d072c10 100644 --- a/common/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java +++ b/common/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java @@ -130,13 +130,8 @@ public class ModernFixEarlyConfig { } } - private static final boolean shouldReplaceSearchTrees; private static final boolean isDevEnv = ModernFixPlatformHooks.isDevEnv(); - static { - shouldReplaceSearchTrees = modPresent("jei"); - } - private static final ImmutableMap DEFAULT_SETTING_OVERRIDES = ImmutableMap.builder() .put("mixin.perf.dynamic_resources", false) .put("mixin.feature.direct_stack_trace", false) @@ -148,7 +143,6 @@ public class ModernFixEarlyConfig { .put("mixin.perf.dynamic_entity_renderers", false) .put("mixin.feature.integrated_server_watchdog", true) .put("mixin.perf.faster_item_rendering", false) - .put("mixin.perf.blast_search_trees", shouldReplaceSearchTrees) .put("mixin.devenv", isDevEnv) .put("mixin.perf.remove_spawn_chunks", isDevEnv) .build(); diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/searchtree/JEIBackedSearchTree.java b/common/src/main/java/org/embeddedt/modernfix/searchtree/JEIBackedSearchTree.java similarity index 63% rename from forge/src/main/java/org/embeddedt/modernfix/forge/searchtree/JEIBackedSearchTree.java rename to common/src/main/java/org/embeddedt/modernfix/searchtree/JEIBackedSearchTree.java index b9593da9..57a8ff25 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/searchtree/JEIBackedSearchTree.java +++ b/common/src/main/java/org/embeddedt/modernfix/searchtree/JEIBackedSearchTree.java @@ -1,5 +1,6 @@ -package org.embeddedt.modernfix.forge.searchtree; +package org.embeddedt.modernfix.searchtree; +import com.google.common.collect.ImmutableList; import mezz.jei.api.ingredients.ITypedIngredient; import mezz.jei.common.Internal; import mezz.jei.common.ingredients.IngredientFilter; @@ -8,12 +9,12 @@ import mezz.jei.common.runtime.JeiRuntime; import net.minecraft.client.searchtree.ReloadableIdSearchTree; import net.minecraft.world.item.ItemStack; import org.embeddedt.modernfix.ModernFix; -import org.embeddedt.modernfix.forge.mixin.perf.blast_search_trees.IngredientFilterInvoker; import org.embeddedt.modernfix.platform.ModernFixPlatformHooks; -import org.embeddedt.modernfix.searchtree.DummySearchTree; -import org.embeddedt.modernfix.searchtree.SearchTreeProviderRegistry; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -27,7 +28,25 @@ public class JEIBackedSearchTree extends DummySearchTree { private String lastSearchText = ""; private final List listCache = new ArrayList<>(); - private static Field filterField = null; + private static final Field filterField; + private static final MethodHandle getIngredientListUncached; + + static { + MethodHandle m; + Field f; + try { + Method jeiMethod = IngredientFilter.class.getDeclaredMethod("getIngredientListUncached", String.class); + jeiMethod.setAccessible(true); + m = MethodHandles.lookup().unreflect(jeiMethod); + f = IngredientFilterApi.class.getDeclaredField("ingredientFilter"); + f.setAccessible(true); + } catch(ReflectiveOperationException | RuntimeException | NoClassDefFoundError e) { + m = null; + f = null; + } + getIngredientListUncached = m; + filterField = f; + } public JEIBackedSearchTree(boolean filteringByTag) { this.filteringByTag = filteringByTag; @@ -39,10 +58,6 @@ public class JEIBackedSearchTree extends DummySearchTree { IngredientFilterApi iFilterApi = (IngredientFilterApi)runtime.get().getIngredientFilter(); IngredientFilter filter; try { - if(filterField == null) { - filterField = IngredientFilterApi.class.getDeclaredField("ingredientFilter"); - filterField.setAccessible(true); - } filter = (IngredientFilter)filterField.get(iFilterApi); } catch(ReflectiveOperationException e) { ModernFix.LOGGER.error(e); @@ -58,7 +73,14 @@ public class JEIBackedSearchTree extends DummySearchTree { private List searchJEI(IngredientFilter filter, String pSearchText) { if(!pSearchText.equals(lastSearchText)) { listCache.clear(); - List> ingredients = ((IngredientFilterInvoker)filter).invokeGetIngredientListUncached(filteringByTag ? ("$" + pSearchText) : pSearchText); + List> ingredients; + String finalSearchTerm = filteringByTag ? ("$" + pSearchText) : pSearchText; + try { + ingredients = (List>)getIngredientListUncached.invokeExact(filter, finalSearchTerm); + } catch(Throwable e) { + ModernFix.LOGGER.error("Error searching", e); + ingredients = ImmutableList.of(); + } for(ITypedIngredient ingredient : ingredients) { if(ingredient.getIngredient() instanceof ItemStack) { listCache.add((ItemStack)ingredient.getIngredient()); @@ -77,7 +99,7 @@ public class JEIBackedSearchTree extends DummySearchTree { @Override public boolean canUse() { - return ModernFixPlatformHooks.modPresent("jei"); + return ModernFixPlatformHooks.modPresent("jei") && getIngredientListUncached != null && filterField != null; } @Override diff --git a/common/src/main/java/org/embeddedt/modernfix/searchtree/REIBackedSearchTree.java b/common/src/main/java/org/embeddedt/modernfix/searchtree/REIBackedSearchTree.java index 7bb9f954..da92a2d0 100644 --- a/common/src/main/java/org/embeddedt/modernfix/searchtree/REIBackedSearchTree.java +++ b/common/src/main/java/org/embeddedt/modernfix/searchtree/REIBackedSearchTree.java @@ -4,8 +4,10 @@ import me.shedaniel.rei.api.client.registry.entry.EntryRegistry; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; import me.shedaniel.rei.impl.client.search.AsyncSearchManager; +import net.minecraft.client.searchtree.ReloadableIdSearchTree; import net.minecraft.world.item.ItemStack; import org.embeddedt.modernfix.ModernFix; +import org.embeddedt.modernfix.platform.ModernFixPlatformHooks; import java.util.ArrayList; import java.util.Collections; @@ -53,4 +55,21 @@ public class REIBackedSearchTree extends DummySearchTree { } return listCache; } + + public static final SearchTreeProviderRegistry.Provider PROVIDER = new SearchTreeProviderRegistry.Provider() { + @Override + public ReloadableIdSearchTree getSearchTree(boolean tag) { + return new REIBackedSearchTree(tag); + } + + @Override + public boolean canUse() { + return ModernFixPlatformHooks.modPresent("roughlyenoughitems"); + } + + @Override + public String getName() { + return "REI"; + } + }; } diff --git a/common/src/main/java/org/embeddedt/modernfix/searchtree/SearchTreeProviderRegistry.java b/common/src/main/java/org/embeddedt/modernfix/searchtree/SearchTreeProviderRegistry.java index 4dc5706b..7b335c3d 100644 --- a/common/src/main/java/org/embeddedt/modernfix/searchtree/SearchTreeProviderRegistry.java +++ b/common/src/main/java/org/embeddedt/modernfix/searchtree/SearchTreeProviderRegistry.java @@ -2,6 +2,7 @@ package org.embeddedt.modernfix.searchtree; import net.minecraft.client.searchtree.ReloadableIdSearchTree; import net.minecraft.world.item.ItemStack; +import org.embeddedt.modernfix.core.ModernFixMixinPlugin; import java.util.ArrayList; import java.util.List; @@ -14,7 +15,10 @@ public class SearchTreeProviderRegistry { if(p.canUse()) return p; } - return DummySearchTree.PROVIDER; + if(ModernFixMixinPlugin.instance.config.getEffectiveOptionForMixin("mixin.perf.blast_search_trees.Registry").isOverridden()) + return DummySearchTree.PROVIDER; + else + return null; } public static synchronized void register(Provider p) { diff --git a/forge/build.gradle b/forge/build.gradle index 1000783f..287be48b 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -38,9 +38,6 @@ dependencies { modCompileOnly("curse.maven:refinedstorage-243076:${refined_storage_version}") - // compile against the JEI API but do not include it at runtime - modCompileOnly("mezz.jei:jei-${minecraft_version}-forge:${jei_version}") - modCompileOnly("curse.maven:jeresources-240630:3831559") modCompileOnly "me.shedaniel:RoughlyEnoughItems-forge:${rei_version}" modCompileOnly("dev.latvian.mods:kubejs-forge:${kubejs_version}") diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/init/ModernFixClientForge.java b/forge/src/main/java/org/embeddedt/modernfix/forge/init/ModernFixClientForge.java index 5f519d06..7db520f5 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/init/ModernFixClientForge.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/init/ModernFixClientForge.java @@ -22,9 +22,7 @@ import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.fml.util.ObfuscationReflectionHelper; import org.embeddedt.modernfix.ModernFixClient; -import org.embeddedt.modernfix.forge.searchtree.JEIBackedSearchTree; import org.embeddedt.modernfix.screen.ModernFixConfigScreen; -import org.embeddedt.modernfix.searchtree.SearchTreeProviderRegistry; public class ModernFixClientForge { private static ModernFixClient commonMod; @@ -36,7 +34,6 @@ public class ModernFixClientForge { ConfigGuiHandler.ConfigGuiFactory.class, () -> new ConfigGuiHandler.ConfigGuiFactory((mc, screen) -> new ModernFixConfigScreen(screen)) ); - SearchTreeProviderRegistry.register(JEIBackedSearchTree.PROVIDER); } private KeyMapping configKey; diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/blast_search_trees/IngredientFilterInvoker.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/blast_search_trees/IngredientFilterInvoker.java deleted file mode 100644 index 813d55e3..00000000 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/blast_search_trees/IngredientFilterInvoker.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.embeddedt.modernfix.forge.mixin.perf.blast_search_trees; - -import mezz.jei.api.ingredients.ITypedIngredient; -import mezz.jei.common.ingredients.IngredientFilter; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -import java.util.List; - -@Mixin(IngredientFilter.class) -public interface IngredientFilterInvoker { - @Invoker(remap = false) - List> invokeGetIngredientListUncached(String filterText); -}