From fb26e263cc15cc4e201fe5428a957ce33bcc1fb1 Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+Camotoy@users.noreply.github.com> Date: Fri, 1 Apr 2022 15:20:30 -0400 Subject: [PATCH] Be more resilient with different enchantment NBT types Fixes #2911 --- .../item/nbt/EnchantmentTranslator.java | 9 ++++----- .../java/org/geysermc/geyser/util/ItemUtils.java | 16 +++++++++++----- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/EnchantmentTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/EnchantmentTranslator.java index 155435c79..847a70a27 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/EnchantmentTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/EnchantmentTranslator.java @@ -121,10 +121,6 @@ public class EnchantmentTranslator extends NbtItemStackTranslator { private CompoundTag remapEnchantment(CompoundTag tag) { - Tag javaEnchLvl = tag.get("lvl"); - if (!(javaEnchLvl instanceof ShortTag || javaEnchLvl instanceof IntTag)) - return null; - Tag javaEnchId = tag.get("id"); if (!(javaEnchId instanceof StringTag)) return null; @@ -135,9 +131,12 @@ public class EnchantmentTranslator extends NbtItemStackTranslator { return null; } + Tag javaEnchLvl = tag.get("lvl"); + CompoundTag bedrockTag = new CompoundTag(""); bedrockTag.put(new ShortTag("id", (short) enchantment.ordinal())); - bedrockTag.put(new ShortTag("lvl", ((Number) javaEnchLvl.getValue()).shortValue())); + // If the tag cannot parse, Java Edition 1.18.2 sets to 0 + bedrockTag.put(new ShortTag("lvl", javaEnchLvl != null && javaEnchLvl.getValue() instanceof Number lvl ? lvl.shortValue() : 0)); return bedrockTag; } diff --git a/core/src/main/java/org/geysermc/geyser/util/ItemUtils.java b/core/src/main/java/org/geysermc/geyser/util/ItemUtils.java index f05d702a0..37c4609fe 100644 --- a/core/src/main/java/org/geysermc/geyser/util/ItemUtils.java +++ b/core/src/main/java/org/geysermc/geyser/util/ItemUtils.java @@ -29,21 +29,27 @@ import com.github.steveice10.opennbt.tag.builtin.*; import it.unimi.dsi.fastutil.ints.Int2IntMap; import org.geysermc.geyser.session.GeyserSession; +import javax.annotation.Nullable; + public class ItemUtils { private static Int2IntMap DYE_COLORS = null; - public static int getEnchantmentLevel(CompoundTag itemNBTData, String enchantmentId) { - ListTag enchantments = (itemNBTData == null ? null : itemNBTData.get("Enchantments")); + public static int getEnchantmentLevel(@Nullable CompoundTag itemNBTData, String enchantmentId) { + if (itemNBTData == null) { + return 0; + } + ListTag enchantments = itemNBTData.get("Enchantments"); if (enchantments != null) { - int enchantmentLevel = 0; for (Tag tag : enchantments) { CompoundTag enchantment = (CompoundTag) tag; StringTag enchantId = enchantment.get("id"); if (enchantId.getValue().equals(enchantmentId)) { - enchantmentLevel = (int) ((ShortTag) enchantment.get("lvl")).getValue(); + Tag lvl = enchantment.get("lvl"); + if (lvl != null && lvl.getValue() instanceof Number number) { + return number.intValue(); + } } } - return enchantmentLevel; } return 0; }