1
0
mirror of https://github.com/GeyserMC/Geyser.git synced 2025-12-19 14:59:27 +00:00

Fix custom stone cutter recipes

closes https://github.com/GeyserMC/Geyser/issues/5257, closes https://github.com/GeyserMC/Geyser/issues/5268
This commit is contained in:
onebeastchris
2025-01-29 18:18:14 +01:00
parent c666028eb6
commit da6e2f678b
3 changed files with 26 additions and 14 deletions

View File

@@ -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 {
/**

View File

@@ -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<T> {
private final int @Nullable [] holders;
public GeyserHolderSet(JavaRegistryKey<T> registry, int @NonNull [] holders) {
this.registry = registry;
this.tag = null;
this.holders = holders;
this(registry, null, holders);
}
public GeyserHolderSet(JavaRegistryKey<T> registry, @NonNull Tag<T> tagId) {
this(registry, tagId, null);
}
private GeyserHolderSet(JavaRegistryKey<T> registry, @Nullable Tag<T> 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 <T> GeyserHolderSet<T> fromHolderSet(JavaRegistryKey<T> registry, @NonNull HolderSet holderSet) {
return new GeyserHolderSet<>(registry, new Tag<>(registry, holderSet.getLocation()), holderSet.getHolders());
}
/**

View File

@@ -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<ClientboundUpd
List<SelectableRecipe> 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<GeyserStonecutterData> stonecutterRecipeMap = new Int2ObjectOpenHashMap<>();
@@ -142,7 +144,7 @@ public class JavaUpdateRecipesTranslator extends PacketTranslator<ClientboundUpd
for (SelectableRecipe recipe : data.getValue()) {
// As of 1.16.4, all stonecutter recipes have one ingredient option
HolderSet ingredient = recipe.input().getValues();
int javaInput = ingredient.getHolders()[0];
int javaInput = data.getIntKey();
ItemMapping mapping = session.getItemMappings().getMapping(javaInput);
if (mapping.getJavaItem() == Items.AIR) {
// Modded ?