Add support for using REI for creative search

This commit is contained in:
embeddedt 2023-03-09 10:15:29 -05:00
parent 63fa31bde1
commit eed3a80fc1
5 changed files with 58 additions and 3 deletions

View File

@ -62,6 +62,7 @@ repositories {
maven { // CTM
url "https://maven.tterrag.com/"
}
maven { url "https://maven.shedaniel.me" }
}
dependencies {
@ -92,6 +93,7 @@ dependencies {
modRuntimeOnly("curse.maven:jei-238222:4352925")
modCompileOnly("curse.maven:jeresources-240630:3831559")
modCompileOnly "me.shedaniel:RoughlyEnoughItems-forge:${rei_version}"
}
tasks.withType(JavaCompile) {

View File

@ -13,4 +13,5 @@ forge_version=1.18.2-40.2.1
lazydfu_version=3544496
parchment_version=2022.11.06
refined_storage_version=4392829
jei_version=10.2.1.283
jei_version=10.2.1.283
rei_version=8.3.590

View File

@ -46,9 +46,9 @@ public class ModernFixEarlyConfig {
this.addMixinRule("perf.faster_texture_stitching", false);
/* off by default in 1.18 because it doesn't work as well */
this.addMixinRule("perf.faster_singleplayer_load", false);
/* Keep this off if JEI isn't installed to prevent breaking vanilla gameplay */
/* Keep this off if JEI/REI isn't installed to prevent breaking vanilla gameplay */
Optional<ModInfo> jeiMod = FMLLoader.getLoadingModList().getMods().stream().filter(mod -> mod.getModId().equals("jei")).findFirst();
this.addMixinRule("perf.blast_search_trees", jeiMod.isPresent() && jeiMod.get().getVersion().getMajorVersion() >= 10);
this.addMixinRule("perf.blast_search_trees", (jeiMod.isPresent() && jeiMod.get().getVersion().getMajorVersion() >= 10) || FMLLoader.getLoadingModList().getModFileById("roughlyenoughitems") != null);
this.addMixinRule("safety", true);
this.addMixinRule("launch.transformer_cache", false);
this.addMixinRule("launch.class_search_cache", true);

View File

@ -7,6 +7,7 @@ import net.minecraftforge.fml.ModList;
import net.minecraftforge.forgespi.language.IModFileInfo;
import org.embeddedt.modernfix.searchtree.DummySearchTree;
import org.embeddedt.modernfix.searchtree.JEIBackedSearchTree;
import org.embeddedt.modernfix.searchtree.REIBackedSearchTree;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
@ -27,6 +28,9 @@ public class MinecraftMixin {
if(jeiContainer.isPresent() && jeiContainer.get().getModInfo().getVersion().getMajorVersion() >= 10) {
this.searchRegistry.register(SearchRegistry.CREATIVE_NAMES, new JEIBackedSearchTree(false));
this.searchRegistry.register(SearchRegistry.CREATIVE_TAGS, new JEIBackedSearchTree(true));
} else if(ModList.get().isLoaded("roughlyenoughitems")) {
this.searchRegistry.register(SearchRegistry.CREATIVE_NAMES, new REIBackedSearchTree(false));
this.searchRegistry.register(SearchRegistry.CREATIVE_TAGS, new REIBackedSearchTree(true));
} else {
this.searchRegistry.register(SearchRegistry.CREATIVE_NAMES, new DummySearchTree<>());
this.searchRegistry.register(SearchRegistry.CREATIVE_TAGS, new DummySearchTree<>());

View File

@ -0,0 +1,48 @@
package org.embeddedt.modernfix.searchtree;
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.world.item.ItemStack;
import java.util.ArrayList;
import java.util.List;
public class REIBackedSearchTree extends DummySearchTree<ItemStack> {
private final AsyncSearchManager searchManager = new AsyncSearchManager(EntryRegistry.getInstance()::getPreFilteredList, () -> {
return stack -> true;
}, EntryStack::normalize);
private final boolean filteringByTag;
private String lastSearchText = "";
private final List<ItemStack> listCache = new ArrayList<>();
public REIBackedSearchTree(boolean filteringByTag) {
this.filteringByTag = filteringByTag;
}
@Override
public List<ItemStack> search(String pSearchText) {
if(true) {
return this.searchREI(pSearchText);
} else {
/* Use the default, dummy implementation */
return super.search(pSearchText);
}
}
private List<ItemStack> searchREI(String pSearchText) {
if(!pSearchText.equals(lastSearchText)) {
listCache.clear();
this.searchManager.updateFilter(pSearchText);
List<EntryStack<?>> stacks = this.searchManager.getNow();
for(EntryStack<?> stack : stacks) {
if(stack.getType() == VanillaEntryTypes.ITEM) {
listCache.add(stack.cheatsAs().getValue());
}
}
lastSearchText = pSearchText;
}
return listCache;
}
}