package org.embeddedt.modernfix.searchtree; import mezz.jei.Internal; import mezz.jei.ingredients.IIngredientListElementInfo; import mezz.jei.ingredients.IngredientFilter; import mezz.jei.runtime.JeiRuntime; import net.minecraft.world.item.ItemStack; import org.embeddedt.modernfix.mixin.perf.blast_search_trees.IngredientFilterInvoker; import java.util.ArrayList; import java.util.List; /** * Uses JEI to handle search tree lookups. */ public class JEIBackedSearchTree extends DummySearchTree { private final boolean filteringByTag; private String lastSearchText = ""; private final List listCache = new ArrayList<>(); public JEIBackedSearchTree(boolean filteringByTag) { this.filteringByTag = filteringByTag; } @Override public List search(String pSearchText) { JeiRuntime runtime = Internal.getRuntime(); if(runtime != null) { return this.searchJEI(Internal.getIngredientFilter(), pSearchText); } else { /* Use the default, dummy implementation */ return super.search(pSearchText); } } private List searchJEI(IngredientFilter filter, String pSearchText) { if(!pSearchText.equals(lastSearchText)) { listCache.clear(); List> ingredients = ((IngredientFilterInvoker)filter).invokeGetIngredientListUncached(filteringByTag ? ("$" + pSearchText) : pSearchText); for(IIngredientListElementInfo ingredient : ingredients) { if(ingredient.getElement().getIngredient() instanceof ItemStack) { listCache.add((ItemStack)ingredient.getElement().getIngredient()); } } lastSearchText = pSearchText; } return listCache; } }