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"; + } + }; }