Skip to content

Commit

Permalink
Fix custom stone cutter recipes
Browse files Browse the repository at this point in the history
closes #5257, closes #5268
  • Loading branch information
onebeastchris committed Jan 29, 2025
1 parent c666028 commit da6e2f6
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
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;
Expand All @@ -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());
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@
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;
Expand Down Expand Up @@ -120,16 +122,16 @@ public void translate(GeyserSession session, ClientboundUpdateRecipesPacket pack
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<>();
Expand All @@ -142,7 +144,7 @@ public void translate(GeyserSession session, ClientboundUpdateRecipesPacket pack
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 ?
Expand Down

0 comments on commit da6e2f6

Please sign in to comment.