Move search tree replacement to common, support both modloaders

This commit is contained in:
embeddedt 2023-05-15 20:23:37 -04:00
parent 04c89a26ed
commit 32c1baf887
No known key found for this signature in database
GPG Key ID: A69433EC199B5613
6 changed files with 102 additions and 50 deletions

View File

@ -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();
}
}

View File

@ -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<T> extends ReloadableIdSearchTree<T> implements Mut
public List<T> search(String pSearchText) {
return Collections.emptyList();
}
static final SearchTreeProviderRegistry.Provider PROVIDER = new SearchTreeProviderRegistry.Provider() {
@Override
public ReloadableIdSearchTree<ItemStack> getSearchTree(boolean tag) {
return new DummySearchTree<>();
}
@Override
public boolean canUse() {
return true;
}
@Override
public String getName() {
return "Dummy";
}
};
}

View File

@ -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<Provider> 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<ItemStack> getSearchTree(boolean tag);
boolean canUse();
String getName();
}
}

View File

@ -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;

View File

@ -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<? extends ModContainer> 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();
}
}

View File

@ -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<ItemStack> {
}
return listCache;
}
public static final SearchTreeProviderRegistry.Provider PROVIDER = new SearchTreeProviderRegistry.Provider() {
@Override
public ReloadableIdSearchTree<ItemStack> getSearchTree(boolean tag) {
return new JEIBackedSearchTree(tag);
}
@Override
public boolean canUse() {
return ModernFixPlatformHooks.modPresent("jei");
}
@Override
public String getName() {
return "JEI";
}
};
}