From 9039bbaa16083a8fb14e793c4fd9b4bbbdb27b39 Mon Sep 17 00:00:00 2001 From: altrisi Date: Fri, 6 Oct 2023 18:37:45 +0200 Subject: [PATCH] Fix hopper counters command error when guessing item color (#1826) * Fix hopper counters command crash when guessing item color * Less List types, slightly less copying and clearer Stream chain * Reverse result equal logic to not search through registries as much Gets the item being searched once outside instead of getting the id for every recipe --- .../carpet/fakes/RecipeManagerInterface.java | 2 +- .../mixins/RecipeManager_scarpetMixin.java | 27 ++++++++++--------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/main/java/carpet/fakes/RecipeManagerInterface.java b/src/main/java/carpet/fakes/RecipeManagerInterface.java index ff130d00..78cfe428 100644 --- a/src/main/java/carpet/fakes/RecipeManagerInterface.java +++ b/src/main/java/carpet/fakes/RecipeManagerInterface.java @@ -13,5 +13,5 @@ public interface RecipeManagerInterface * Gets all the recipes for a given item. Also used for {@link carpet.helpers.HopperCounter#guessColor} to guess the * colour of an item to display it prettily */ - List> getAllMatching(final RecipeType type, final ResourceLocation output, final RegistryAccess registryAccess); + List> getAllMatching(final RecipeType type, final ResourceLocation itemId, final RegistryAccess registryAccess); } diff --git a/src/main/java/carpet/mixins/RecipeManager_scarpetMixin.java b/src/main/java/carpet/mixins/RecipeManager_scarpetMixin.java index 217e8aef..864601af 100644 --- a/src/main/java/carpet/mixins/RecipeManager_scarpetMixin.java +++ b/src/main/java/carpet/mixins/RecipeManager_scarpetMixin.java @@ -1,21 +1,18 @@ package carpet.mixins; import carpet.fakes.RecipeManagerInterface; -import com.google.common.collect.Lists; import net.minecraft.core.Registry; import net.minecraft.core.RegistryAccess; -import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.world.item.Item; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import java.util.Collections; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.item.crafting.RecipeManager; import net.minecraft.world.item.crafting.RecipeType; @@ -23,17 +20,23 @@ import net.minecraft.world.item.crafting.RecipeType; public class RecipeManager_scarpetMixin implements RecipeManagerInterface { - @Shadow private Map, Map>> recipes; + @Shadow private Map, Map>> recipes; @Override - public List> getAllMatching(RecipeType type, ResourceLocation output, final RegistryAccess registryAccess) + public List> getAllMatching(RecipeType type, ResourceLocation itemId, final RegistryAccess registryAccess) { - Map> typeRecipes = recipes.get(type); + Map> typeRecipes = recipes.get(type); // happens when mods add recipe to the registry without updating recipe manager - if (typeRecipes == null) return Collections.emptyList(); - if (typeRecipes.containsKey(output)) return Collections.singletonList(typeRecipes.get(output)); - final Registry regs = registryAccess.registryOrThrow(Registries.ITEM); - return Lists.newArrayList(typeRecipes.values().stream().filter( - r -> regs.getKey(r.getResultItem(registryAccess).getItem()).equals(output)).collect(Collectors.toList())); + if (typeRecipes == null) return List.of(); + RecipeHolder recipeFromMap = typeRecipes.get(itemId); + if (recipeFromMap != null) + return List.of(recipeFromMap.value()); + Registry regs = registryAccess.registryOrThrow(Registries.ITEM); + Item item = regs.get(itemId); + return typeRecipes.values() + .stream() + .>map(RecipeHolder::value) + .filter(r -> r.getResultItem(registryAccess).getItem() == item) + .toList(); } }