From f5c23d37adb57c4428a8a58e4cc892a6b2e83c30 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Tue, 16 Mar 2021 21:09:24 +0800 Subject: Implement IIngredientFilter, IRecipeManagerPlugin and IGuiIngredientGroup#set, fix IDrawableBuilder with padding Signed-off-by: shedaniel --- .../rei/impl/registry/DisplayRegistryImpl.java | 65 +++++++++++++------- .../java/me/shedaniel/rei/impl/view/ViewsImpl.java | 70 ++++++++++++++-------- 2 files changed, 89 insertions(+), 46 deletions(-) (limited to 'runtime/src/main/java/me') diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/registry/DisplayRegistryImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/registry/DisplayRegistryImpl.java index 421eeb527..5246d38f2 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/registry/DisplayRegistryImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/registry/DisplayRegistryImpl.java @@ -32,10 +32,10 @@ import me.shedaniel.rei.api.registry.display.Display; import me.shedaniel.rei.api.registry.display.DisplayCategory; import me.shedaniel.rei.api.registry.display.DisplayRegistry; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.Container; import net.minecraft.world.InteractionResult; import net.minecraft.world.item.crafting.Recipe; import org.apache.commons.lang3.mutable.MutableInt; +import org.jetbrains.annotations.Nullable; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -45,8 +45,9 @@ import java.util.function.Predicate; public class DisplayRegistryImpl extends RecipeManagerContextImpl implements DisplayRegistry { private final Map> displays = new ConcurrentHashMap<>(); private final Map>> displayGenerators = new ConcurrentHashMap<>(); + private final List> globalDisplayGenerators = new ArrayList<>(); private final List visibilityPredicates = new ArrayList<>(); - private final List> fillers = new ArrayList<>(); + private final List> fillers = new ArrayList<>(); private final MutableInt displayCount = new MutableInt(0); @Override @@ -77,6 +78,11 @@ public class DisplayRegistryImpl extends RecipeManagerContextImpl implements Dis return Collections.unmodifiableMap(displays); } + @Override + public void registerGlobalDisplayGenerator(LiveDisplayGenerator generator) { + globalDisplayGenerators.add(generator); + } + @Override public void registerDisplayGenerator(ResourceLocation categoryId, LiveDisplayGenerator generator) { displayGenerators.computeIfAbsent(categoryId, location -> new ArrayList<>()) @@ -84,10 +90,15 @@ public class DisplayRegistryImpl extends RecipeManagerContextImpl implements Dis } @Override - public Map>> getAllDisplayGenerators() { + public Map>> getCategoryDisplayGenerators() { return Collections.unmodifiableMap(displayGenerators); } + @Override + public List> getGlobalDisplayGenerators() { + return Collections.unmodifiableList(globalDisplayGenerators); + } + @Override public void registerVisibilityPredicate(DisplayVisibilityPredicate predicate) { visibilityPredicates.add(predicate); @@ -117,8 +128,8 @@ public class DisplayRegistryImpl extends RecipeManagerContextImpl implements Dis } @Override - public , D extends Display> void registerRecipes(Predicate recipeFilter, Function mappingFunction) { - fillers.add(new RecipeFiller<>((Predicate) recipeFilter, mappingFunction)); + public void registerFiller(Class typeClass, Predicate predicate, Function mappingFunction) { + fillers.add(new DisplayFiller<>(typeClass, (Predicate) predicate, mappingFunction)); } @Override @@ -137,33 +148,47 @@ public class DisplayRegistryImpl extends RecipeManagerContextImpl implements Dis List> allSortedRecipes = getAllSortedRecipes(); for (int i = allSortedRecipes.size() - 1; i >= 0; i--) { Recipe recipe = allSortedRecipes.get(i); - for (RecipeFiller filler : fillers) { - try { - handleRecipe(filler, recipe); - } catch (Throwable e) { - RoughlyEnoughItemsCore.LOGGER.error("Failed to fill recipes!", e); - } + Display display = tryFillDisplay(recipe); + if (display != null) { + registerDisplay(0, display); } } } - this.fillers.clear(); } - private , D extends Display> void handleRecipe(RecipeFiller filler, Recipe recipe) { - if (filler.recipeFilter.test((T) recipe)) { - registerDisplay(0, filler.mappingFunction.apply((T) recipe)); + @Override + @Nullable + public Display tryFillDisplay(T value) { + if (value instanceof Display) return (Display) value; + for (DisplayFiller filler : fillers) { + Display display = tryFillDisplayGenerics(filler, value); + if (display != null) return display; } + return null; } - private static class RecipeFiller, D extends Display> { - private final Predicate recipeFilter; + private D tryFillDisplayGenerics(DisplayFiller filler, Object value) { + try { + if (filler.typeClass.isInstance(value) && filler.predicate.test((T) value)) { + return filler.mappingFunction.apply((T) value); + } + } catch (Throwable e) { + RoughlyEnoughItemsCore.LOGGER.error("Failed to fill displays!", e); + } + + return null; + } + + private static class DisplayFiller { + private final Class typeClass; + private final Predicate predicate; private final Function mappingFunction; - public RecipeFiller(Predicate recipeFilter, Function mappingFunction) { - this.recipeFilter = recipeFilter; + public DisplayFiller(Class typeClass, Predicate predicate, Function mappingFunction) { + this.typeClass = typeClass; + this.predicate = predicate; this.mappingFunction = mappingFunction; } - } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/view/ViewsImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/view/ViewsImpl.java index ad573abb9..55319da56 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/view/ViewsImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/view/ViewsImpl.java @@ -44,6 +44,7 @@ import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.ApiStatus; import java.util.*; +import java.util.function.Consumer; import java.util.stream.Collectors; @ApiStatus.Internal @@ -115,37 +116,13 @@ public class ViewsImpl implements Views { int generatorsCount = 0; - for (Map.Entry>> entry : DisplayRegistry.getInstance().getAllDisplayGenerators().entrySet()) { + for (Map.Entry>> entry : DisplayRegistry.getInstance().getCategoryDisplayGenerators().entrySet()) { ResourceLocation categoryId = entry.getKey(); Set set = new LinkedHashSet<>(); generatorsCount += entry.getValue().size(); for (LiveDisplayGenerator generator : (List>) (List) entry.getValue()) { - for (EntryStack stack : recipesFor) { - Optional> recipeForDisplays = generator.getRecipeFor(stack); - if (recipeForDisplays.isPresent()) { - for (Display display : recipeForDisplays.get()) { - if (isDisplayVisible(display)) - set.add(display); - } - } - } - for (EntryStack stack : usagesFor) { - Optional> usageForDisplays = generator.getUsageFor(stack); - if (usageForDisplays.isPresent()) { - for (Display display : usageForDisplays.get()) { - if (isDisplayVisible(display)) - set.add(display); - } - } - } - Optional> displaysGenerated = generator.generate(builder); - if (displaysGenerated.isPresent()) { - for (Display display : displaysGenerated.get()) { - if (isDisplayVisible(display)) - set.add(display); - } - } + generateLiveDisplays(generator, builder, set::add); } if (!set.isEmpty()) { @@ -153,6 +130,14 @@ public class ViewsImpl implements Views { } } + Consumer displayConsumer = display -> { + CollectionUtils.getOrPutEmptyList(result, CategoryRegistry.getInstance().get(display.getCategoryIdentifier()).getCategory()).add(display); + }; + for (LiveDisplayGenerator generator : (List>) (List) DisplayRegistry.getInstance().getGlobalDisplayGenerators()) { + generatorsCount++; + generateLiveDisplays(generator, builder, displayConsumer); + } + String message = String.format("Built Recipe View in %s for %d categories, %d recipes for, %d usages for and %d live recipe generators.", stopwatch.stop().toString(), categories.size(), recipesFor.size(), usagesFor.size(), generatorsCount); if (ConfigObject.getInstance().doDebugSearchTimeRequired()) { @@ -163,6 +148,39 @@ public class ViewsImpl implements Views { return result; } + private void generateLiveDisplays(LiveDisplayGenerator generator, ViewSearchBuilder builder, Consumer displayConsumer) { + for (EntryStack stack : builder.getRecipesFor()) { + Optional> recipeForDisplays = generator.getRecipeFor(stack); + if (recipeForDisplays.isPresent()) { + for (T display : recipeForDisplays.get()) { + if (isDisplayVisible(display)) { + displayConsumer.accept(display); + } + } + } + } + + for (EntryStack stack : builder.getUsagesFor()) { + Optional> usageForDisplays = generator.getUsageFor(stack); + if (usageForDisplays.isPresent()) { + for (T display : usageForDisplays.get()) { + if (isDisplayVisible(display)) { + displayConsumer.accept(display); + } + } + } + } + + Optional> displaysGenerated = generator.generate(builder); + if (displaysGenerated.isPresent()) { + for (T display : displaysGenerated.get()) { + if (isDisplayVisible(display)) { + displayConsumer.accept(display); + } + } + } + } + @Override public Collection> findCraftableEntriesByItems(Iterable> inventoryItems) { Set> craftables = new HashSet<>(); -- cgit