diff --git a/core/src/main/java/org/geysermc/geyser/inventory/StonecutterContainer.java b/core/src/main/java/org/geysermc/geyser/inventory/StonecutterContainer.java index 269a4fb7d..1eb115847 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/StonecutterContainer.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/StonecutterContainer.java @@ -25,11 +25,11 @@ package org.geysermc.geyser.inventory; -import org.geysermc.mcprotocollib.protocol.data.game.inventory.ContainerType; import lombok.Getter; import lombok.Setter; import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.mcprotocollib.protocol.data.game.inventory.ContainerType; public class StonecutterContainer extends Container { /** diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/GeyserHolderSet.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/GeyserHolderSet.java index c77f0a642..227436efc 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/GeyserHolderSet.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/GeyserHolderSet.java @@ -33,6 +33,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.cache.TagCache; import org.geysermc.geyser.session.cache.registry.JavaRegistryKey; +import org.geysermc.mcprotocollib.protocol.data.game.item.component.HolderSet; import java.util.List; import java.util.Objects; @@ -54,15 +55,24 @@ public final class GeyserHolderSet { private final int @Nullable [] holders; public GeyserHolderSet(JavaRegistryKey registry, int @NonNull [] holders) { - this.registry = registry; - this.tag = null; - this.holders = holders; + this(registry, null, holders); } public GeyserHolderSet(JavaRegistryKey registry, @NonNull Tag tagId) { + this(registry, tagId, null); + } + + private GeyserHolderSet(JavaRegistryKey registry, @Nullable Tag tag, int @Nullable [] holders) { this.registry = registry; - this.tag = tagId; - this.holders = null; + this.tag = tag; + this.holders = holders; + } + + /** + * Constructs a {@link GeyserHolderSet} from a MCPL HolderSet. + */ + public static GeyserHolderSet fromHolderSet(JavaRegistryKey registry, @NonNull HolderSet holderSet) { + return new GeyserHolderSet<>(registry, new Tag<>(registry, holderSet.getLocation()), holderSet.getHolders()); } /** diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaUpdateRecipesTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaUpdateRecipesTranslator.java index 3872321af..db2d2d403 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaUpdateRecipesTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaUpdateRecipesTranslator.java @@ -45,6 +45,8 @@ import org.geysermc.geyser.inventory.recipe.TrimRecipe; import org.geysermc.geyser.item.Items; import org.geysermc.geyser.registry.type.ItemMapping; import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.session.cache.registry.JavaRegistries; +import org.geysermc.geyser.session.cache.tags.GeyserHolderSet; import org.geysermc.geyser.translator.item.ItemTranslator; import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; @@ -120,16 +122,16 @@ public class JavaUpdateRecipesTranslator extends PacketTranslator stonecutterRecipes = packet.getStonecutterRecipes(); for (SelectableRecipe recipe : stonecutterRecipes) { // Hardcoding the heck out of this until we see different examples of how this works. - HolderSet ingredient = recipe.input().getValues(); - if (ingredient.getHolders() == null || ingredient.getHolders().length != 1) { - session.getGeyser().getLogger().debug("Ignoring stonecutter recipe for weird input: " + recipe); - continue; - } if (!(recipe.recipe() instanceof ItemStackSlotDisplay)) { - session.getGeyser().getLogger().debug("Ignoring stonecutter recipe for weird output: " + recipe); + session.getGeyser().getLogger().warning("Ignoring stonecutter recipe for weird output: " + recipe); continue; } - rawStonecutterData.computeIfAbsent(ingredient.getHolders()[0], $ -> new ArrayList<>()).add(recipe); + + int[] ingredients = GeyserHolderSet.fromHolderSet(JavaRegistries.ITEM, recipe.input().getValues()) + .resolveRaw(session.getTagCache()); + for (int ingredient : ingredients) { + rawStonecutterData.computeIfAbsent(ingredient, $ -> new ArrayList<>()).add(recipe); + } } Int2ObjectMap stonecutterRecipeMap = new Int2ObjectOpenHashMap<>(); @@ -142,7 +144,7 @@ public class JavaUpdateRecipesTranslator extends PacketTranslator