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:
@@ -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 {
|
||||
/**
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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 ?
|
||||
|
||||
Reference in New Issue
Block a user