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
This commit is contained in:
1 parent
453f5c0813
commit
9039bbaa16
2 files changed
+16
-13
No files matched your search
@@ -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<Recipe<?>> getAllMatching(final RecipeType<?> type, final ResourceLocation output, final RegistryAccess registryAccess);
|
||||
List<Recipe<?>> getAllMatching(final RecipeType<?> type, final ResourceLocation itemId, final RegistryAccess registryAccess);
|
||||
}
|
||||
@@ -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<RecipeType<?>, Map<ResourceLocation, Recipe<?>>> recipes;
|
||||
@Shadow private Map<RecipeType<?>, Map<ResourceLocation, RecipeHolder<?>>> recipes;
|
||||
|
||||
@Override
|
||||
public List<Recipe<?>> getAllMatching(RecipeType<?> type, ResourceLocation output, final RegistryAccess registryAccess)
|
||||
public List<Recipe<?>> getAllMatching(RecipeType<?> type, ResourceLocation itemId, final RegistryAccess registryAccess)
|
||||
{
|
||||
Map<ResourceLocation, Recipe<?>> typeRecipes = recipes.get(type);
|
||||
Map<ResourceLocation, RecipeHolder<?>> 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<Item> 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<Item> regs = registryAccess.registryOrThrow(Registries.ITEM);
|
||||
Item item = regs.get(itemId);
|
||||
return typeRecipes.values()
|
||||
.stream()
|
||||
.<Recipe<?>>map(RecipeHolder::value)
|
||||
.filter(r -> r.getResultItem(registryAccess).getItem() == item)
|
||||
.toList();
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user