From 04c89a26edad7dd92e5adcb856191661102301ff Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 15 May 2023 13:28:40 -0400 Subject: [PATCH 1/8] Workaround for Forge issue #9505 --- .../modernfix/forge/mixin/core/BootstrapMixin.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/core/BootstrapMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/core/BootstrapMixin.java index 428145b7..89709891 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/core/BootstrapMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/core/BootstrapMixin.java @@ -1,6 +1,7 @@ package org.embeddedt.modernfix.forge.mixin.core; import net.minecraft.server.Bootstrap; +import net.minecraftforge.network.NetworkConstants; import org.slf4j.Logger; import org.embeddedt.modernfix.forge.load.ModWorkManagerQueue; import org.spongepowered.asm.mixin.Final; @@ -23,4 +24,11 @@ public class BootstrapMixin { ModWorkManagerQueue.replace(); } } + + /* for https://github.com/MinecraftForge/MinecraftForge/issues/9505 */ + @Inject(method = "bootStrap", at = @At("RETURN")) + private static void doClassloadHack(CallbackInfo ci) { + NetworkConstants.init(); + LOGGER.info("Worked around Forge issue #9505"); + } } From 32c1baf8879fd184c62d76c0d1046bca6a5d4061 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 15 May 2023 20:23:37 -0400 Subject: [PATCH 2/8] Move search tree replacement to common, support both modloaders --- .../blast_search_trees/MinecraftMixin.java | 30 +++++++++++ .../modernfix/searchtree/DummySearchTree.java | 19 +++++++ .../SearchTreeProviderRegistry.java | 30 +++++++++++ .../forge/init/ModernFixClientForge.java | 3 ++ .../blast_search_trees/MinecraftMixin.java | 50 ------------------- .../forge/searchtree/JEIBackedSearchTree.java | 20 ++++++++ 6 files changed, 102 insertions(+), 50 deletions(-) create mode 100644 common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/blast_search_trees/MinecraftMixin.java create mode 100644 common/src/main/java/org/embeddedt/modernfix/searchtree/SearchTreeProviderRegistry.java delete mode 100644 forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/blast_search_trees/MinecraftMixin.java 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 new file mode 100644 index 00000000..4b9d7c05 --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/blast_search_trees/MinecraftMixin.java @@ -0,0 +1,30 @@ +package org.embeddedt.modernfix.common.mixin.perf.blast_search_trees; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.searchtree.SearchRegistry; +import org.embeddedt.modernfix.ModernFix; +import org.embeddedt.modernfix.annotation.ClientOnlyMixin; +import org.embeddedt.modernfix.searchtree.DummySearchTree; +import org.embeddedt.modernfix.searchtree.SearchTreeProviderRegistry; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(Minecraft.class) +@ClientOnlyMixin +public class MinecraftMixin { + @Shadow @Final private SearchRegistry searchRegistry; + + @Inject(method = "createSearchTrees", at = @At("HEAD"), cancellable = true) + private void replaceSearchTrees(CallbackInfo ci) { + SearchTreeProviderRegistry.Provider provider = SearchTreeProviderRegistry.getSearchTreeProvider(); + 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)); + this.searchRegistry.register(SearchRegistry.RECIPE_COLLECTIONS, new DummySearchTree<>()); + ci.cancel(); + } +} diff --git a/common/src/main/java/org/embeddedt/modernfix/searchtree/DummySearchTree.java b/common/src/main/java/org/embeddedt/modernfix/searchtree/DummySearchTree.java index ff337dc0..87818a2f 100644 --- a/common/src/main/java/org/embeddedt/modernfix/searchtree/DummySearchTree.java +++ b/common/src/main/java/org/embeddedt/modernfix/searchtree/DummySearchTree.java @@ -2,6 +2,7 @@ package org.embeddedt.modernfix.searchtree; import net.minecraft.client.searchtree.MutableSearchTree; import net.minecraft.client.searchtree.ReloadableIdSearchTree; +import net.minecraft.world.item.ItemStack; import java.util.Collections; import java.util.List; @@ -34,4 +35,22 @@ public class DummySearchTree extends ReloadableIdSearchTree implements Mut public List search(String pSearchText) { return Collections.emptyList(); } + + static final SearchTreeProviderRegistry.Provider PROVIDER = new SearchTreeProviderRegistry.Provider() { + + @Override + public ReloadableIdSearchTree getSearchTree(boolean tag) { + return new DummySearchTree<>(); + } + + @Override + public boolean canUse() { + return true; + } + + @Override + public String getName() { + return "Dummy"; + } + }; } diff --git a/common/src/main/java/org/embeddedt/modernfix/searchtree/SearchTreeProviderRegistry.java b/common/src/main/java/org/embeddedt/modernfix/searchtree/SearchTreeProviderRegistry.java new file mode 100644 index 00000000..4dc5706b --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/searchtree/SearchTreeProviderRegistry.java @@ -0,0 +1,30 @@ +package org.embeddedt.modernfix.searchtree; + +import net.minecraft.client.searchtree.ReloadableIdSearchTree; +import net.minecraft.world.item.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class SearchTreeProviderRegistry { + private static final List searchTreeProviders = new ArrayList<>(); + + public static synchronized Provider getSearchTreeProvider() { + for(Provider p : searchTreeProviders) { + if(p.canUse()) + return p; + } + return DummySearchTree.PROVIDER; + } + + public static synchronized void register(Provider p) { + if(p.canUse()) + searchTreeProviders.add(p); + } + + public interface Provider { + ReloadableIdSearchTree getSearchTree(boolean tag); + boolean canUse(); + String getName(); + } +} 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 7db520f5..5f519d06 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,7 +22,9 @@ 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; @@ -34,6 +36,7 @@ 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/MinecraftMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/blast_search_trees/MinecraftMixin.java deleted file mode 100644 index 4d5c5b75..00000000 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/blast_search_trees/MinecraftMixin.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.embeddedt.modernfix.forge.mixin.perf.blast_search_trees; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.searchtree.SearchRegistry; -import net.minecraftforge.fml.ModContainer; -import net.minecraftforge.fml.ModList; -import org.embeddedt.modernfix.ModernFix; -import org.embeddedt.modernfix.annotation.ClientOnlyMixin; -import org.embeddedt.modernfix.searchtree.DummySearchTree; -import org.embeddedt.modernfix.searchtree.REIBackedSearchTree; -import org.embeddedt.modernfix.forge.searchtree.JEIBackedSearchTree; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.util.Optional; - -@Mixin(Minecraft.class) -@ClientOnlyMixin -public class MinecraftMixin { - @Shadow @Final private SearchRegistry searchRegistry; - - @Inject(method = "createSearchTrees", at = @At("HEAD"), cancellable = true) - private void replaceSearchTrees(CallbackInfo ci) { - Optional jeiContainer = ModList.get().getModContainerById("jei"); - if(ModList.get().isLoaded("roughlyenoughitems")) { - ModernFix.LOGGER.info("Replaced creative search logic with REI"); - this.searchRegistry.register(SearchRegistry.CREATIVE_NAMES, new REIBackedSearchTree(false)); - this.searchRegistry.register(SearchRegistry.CREATIVE_TAGS, new REIBackedSearchTree(true)); - } else if(jeiContainer.isPresent()) { - /* ugly hack since getMajorVersion() returns 0 */ - if(jeiContainer.get().getModInfo().getVersion().toString().startsWith("9.")) { - ModernFix.LOGGER.warn("Not disabling creative search as JEI 9 is in use"); - return; - } - ModernFix.LOGGER.info("Replaced creative search logic with JEI"); - this.searchRegistry.register(SearchRegistry.CREATIVE_NAMES, new JEIBackedSearchTree(false)); - this.searchRegistry.register(SearchRegistry.CREATIVE_TAGS, new JEIBackedSearchTree(true)); - } else { - ModernFix.LOGGER.info("Completely removed creative search logic"); - this.searchRegistry.register(SearchRegistry.CREATIVE_NAMES, new DummySearchTree<>()); - this.searchRegistry.register(SearchRegistry.CREATIVE_TAGS, new DummySearchTree<>()); - } - this.searchRegistry.register(SearchRegistry.RECIPE_COLLECTIONS, new DummySearchTree<>()); - ci.cancel(); - } -} diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/searchtree/JEIBackedSearchTree.java b/forge/src/main/java/org/embeddedt/modernfix/forge/searchtree/JEIBackedSearchTree.java index 7346062e..b9593da9 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/searchtree/JEIBackedSearchTree.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/searchtree/JEIBackedSearchTree.java @@ -5,10 +5,13 @@ import mezz.jei.common.Internal; import mezz.jei.common.ingredients.IngredientFilter; import mezz.jei.common.ingredients.IngredientFilterApi; 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.reflect.Field; import java.util.ArrayList; @@ -65,4 +68,21 @@ public class JEIBackedSearchTree extends DummySearchTree { } return listCache; } + + public static final SearchTreeProviderRegistry.Provider PROVIDER = new SearchTreeProviderRegistry.Provider() { + @Override + public ReloadableIdSearchTree getSearchTree(boolean tag) { + return new JEIBackedSearchTree(tag); + } + + @Override + public boolean canUse() { + return ModernFixPlatformHooks.modPresent("jei"); + } + + @Override + public String getName() { + return "JEI"; + } + }; } From 4a0b6339706318b5e571851ac6b5b9c73f1dad2e Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 15 May 2023 21:04:01 -0400 Subject: [PATCH 3/8] Fix workaround message printing twice --- .../modernfix/forge/mixin/core/BootstrapMixin.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/core/BootstrapMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/core/BootstrapMixin.java index 89709891..f41ccb15 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/core/BootstrapMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/core/BootstrapMixin.java @@ -28,7 +28,9 @@ public class BootstrapMixin { /* for https://github.com/MinecraftForge/MinecraftForge/issues/9505 */ @Inject(method = "bootStrap", at = @At("RETURN")) private static void doClassloadHack(CallbackInfo ci) { - NetworkConstants.init(); - LOGGER.info("Worked around Forge issue #9505"); + if(!isBootstrapped) { + NetworkConstants.init(); + LOGGER.info("Worked around Forge issue #9505"); + } } } 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 4/8] 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); -} From 8ee985928e19687473afb2576ae4377ee62de40f Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 15 May 2023 21:27:05 -0400 Subject: [PATCH 5/8] Add JEI plugin to fabric.mod.json --- fabric/src/main/resources/fabric.mod.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 7b3901e5..598db739 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -22,7 +22,8 @@ "client": [ "org.embeddedt.modernfix.ModernFixClientFabric" ], - "modmenu": [ "org.embeddedt.modernfix.fabric.modmenu.ModernFixModMenuApiImpl" ] + "modmenu": [ "org.embeddedt.modernfix.fabric.modmenu.ModernFixModMenuApiImpl" ], + "jei_mod_plugin": [ "org.embeddedt.modernfix.searchtree.JEIRuntimeCapturer"] }, "mixins": [ "modernfix-fabric.mixins.json", From f22dbf5df1b3a6fb92cfc6e08e1e8cc18c55d75f Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 15 May 2023 22:19:54 -0400 Subject: [PATCH 6/8] Use less invasive mixin on Blocks.rebuildCache() Related: #99 --- .../BlocksMixin.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/reduce_blockstate_cache_rebuilds/BlocksMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/reduce_blockstate_cache_rebuilds/BlocksMixin.java index c72bd661..08b7c307 100644 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/reduce_blockstate_cache_rebuilds/BlocksMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/reduce_blockstate_cache_rebuilds/BlocksMixin.java @@ -4,14 +4,15 @@ import net.minecraft.world.level.block.Blocks; import org.embeddedt.modernfix.blockstate.BlockStateCacheHandler; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.ModifyArg; -@Mixin(Blocks.class) +import java.util.function.Consumer; + +@Mixin(value = Blocks.class, priority = 1100) public class BlocksMixin { - @Inject(method = "rebuildCache", at = @At("HEAD"), cancellable = true) - private static void rebuildParallel(CallbackInfo ci) { - ci.cancel(); + @ModifyArg(method = "rebuildCache", at = @At(value = "INVOKE", target = "Lnet/minecraft/core/IdMapper;forEach(Ljava/util/function/Consumer;)V"), index = 0) + private static Consumer getEmptyConsumer(Consumer original) { BlockStateCacheHandler.rebuildParallel(true); + return o -> {}; } } From b25234e431795eaf031394b8c0cf7e53f218e1c0 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Tue, 16 May 2023 10:16:32 -0400 Subject: [PATCH 7/8] Fix search tree provider crash --- .../modernfix/searchtree/SearchTreeProviderRegistry.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 7b335c3d..f051e48c 100644 --- a/common/src/main/java/org/embeddedt/modernfix/searchtree/SearchTreeProviderRegistry.java +++ b/common/src/main/java/org/embeddedt/modernfix/searchtree/SearchTreeProviderRegistry.java @@ -3,6 +3,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 org.embeddedt.modernfix.core.config.Option; import java.util.ArrayList; import java.util.List; @@ -15,7 +16,8 @@ public class SearchTreeProviderRegistry { if(p.canUse()) return p; } - if(ModernFixMixinPlugin.instance.config.getEffectiveOptionForMixin("mixin.perf.blast_search_trees.Registry").isOverridden()) + Option option = ModernFixMixinPlugin.instance.config.getEffectiveOptionForMixin("perf.blast_search_trees.Registry"); + if(option != null && option.isOverridden()) return DummySearchTree.PROVIDER; else return null; From dba6e1210ee08e22d1e3d92db807ff045786d95a Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Tue, 16 May 2023 10:17:12 -0400 Subject: [PATCH 8/8] Fix classloading hack not working anymore --- .../embeddedt/modernfix/forge/mixin/core/BootstrapMixin.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/core/BootstrapMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/core/BootstrapMixin.java index f41ccb15..af3c25bd 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/core/BootstrapMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/core/BootstrapMixin.java @@ -28,9 +28,6 @@ public class BootstrapMixin { /* for https://github.com/MinecraftForge/MinecraftForge/issues/9505 */ @Inject(method = "bootStrap", at = @At("RETURN")) private static void doClassloadHack(CallbackInfo ci) { - if(!isBootstrapped) { - NetworkConstants.init(); - LOGGER.info("Worked around Forge issue #9505"); - } + NetworkConstants.init(); } }