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;
|
package org.geysermc.geyser.inventory;
|
||||||
|
|
||||||
import org.geysermc.mcprotocollib.protocol.data.game.inventory.ContainerType;
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
import org.geysermc.geyser.session.GeyserSession;
|
import org.geysermc.geyser.session.GeyserSession;
|
||||||
|
import org.geysermc.mcprotocollib.protocol.data.game.inventory.ContainerType;
|
||||||
|
|
||||||
public class StonecutterContainer extends Container {
|
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.GeyserSession;
|
||||||
import org.geysermc.geyser.session.cache.TagCache;
|
import org.geysermc.geyser.session.cache.TagCache;
|
||||||
import org.geysermc.geyser.session.cache.registry.JavaRegistryKey;
|
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.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
@@ -54,15 +55,24 @@ public final class GeyserHolderSet<T> {
|
|||||||
private final int @Nullable [] holders;
|
private final int @Nullable [] holders;
|
||||||
|
|
||||||
public GeyserHolderSet(JavaRegistryKey<T> registry, int @NonNull [] holders) {
|
public GeyserHolderSet(JavaRegistryKey<T> registry, int @NonNull [] holders) {
|
||||||
this.registry = registry;
|
this(registry, null, holders);
|
||||||
this.tag = null;
|
|
||||||
this.holders = holders;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public GeyserHolderSet(JavaRegistryKey<T> registry, @NonNull Tag<T> tagId) {
|
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.registry = registry;
|
||||||
this.tag = tagId;
|
this.tag = tag;
|
||||||
this.holders = null;
|
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.item.Items;
|
||||||
import org.geysermc.geyser.registry.type.ItemMapping;
|
import org.geysermc.geyser.registry.type.ItemMapping;
|
||||||
import org.geysermc.geyser.session.GeyserSession;
|
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.item.ItemTranslator;
|
||||||
import org.geysermc.geyser.translator.protocol.PacketTranslator;
|
import org.geysermc.geyser.translator.protocol.PacketTranslator;
|
||||||
import org.geysermc.geyser.translator.protocol.Translator;
|
import org.geysermc.geyser.translator.protocol.Translator;
|
||||||
@@ -120,16 +122,16 @@ public class JavaUpdateRecipesTranslator extends PacketTranslator<ClientboundUpd
|
|||||||
List<SelectableRecipe> stonecutterRecipes = packet.getStonecutterRecipes();
|
List<SelectableRecipe> stonecutterRecipes = packet.getStonecutterRecipes();
|
||||||
for (SelectableRecipe recipe : stonecutterRecipes) {
|
for (SelectableRecipe recipe : stonecutterRecipes) {
|
||||||
// Hardcoding the heck out of this until we see different examples of how this works.
|
// 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)) {
|
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;
|
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<>();
|
Int2ObjectMap<GeyserStonecutterData> stonecutterRecipeMap = new Int2ObjectOpenHashMap<>();
|
||||||
@@ -142,7 +144,7 @@ public class JavaUpdateRecipesTranslator extends PacketTranslator<ClientboundUpd
|
|||||||
for (SelectableRecipe recipe : data.getValue()) {
|
for (SelectableRecipe recipe : data.getValue()) {
|
||||||
// As of 1.16.4, all stonecutter recipes have one ingredient option
|
// As of 1.16.4, all stonecutter recipes have one ingredient option
|
||||||
HolderSet ingredient = recipe.input().getValues();
|
HolderSet ingredient = recipe.input().getValues();
|
||||||
int javaInput = ingredient.getHolders()[0];
|
int javaInput = data.getIntKey();
|
||||||
ItemMapping mapping = session.getItemMappings().getMapping(javaInput);
|
ItemMapping mapping = session.getItemMappings().getMapping(javaInput);
|
||||||
if (mapping.getJavaItem() == Items.AIR) {
|
if (mapping.getJavaItem() == Items.AIR) {
|
||||||
// Modded ?
|
// Modded ?
|
||||||
|
|||||||
Reference in New Issue
Block a user