diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/ItemFrameEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/ItemFrameEntity.java index f38e727c0..acb3df2b6 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/ItemFrameEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/ItemFrameEntity.java @@ -113,14 +113,23 @@ public class ItemFrameEntity extends Entity { if (entityMetadata.getValue() != null) { this.heldItem = entityMetadata.getValue(); ItemData itemData = ItemTranslator.translateToBedrock(session, heldItem); - String customIdentifier = session.getItemMappings().getCustomIdMappings().get(itemData.getDefinition().getRuntimeId()); NbtMapBuilder builder = NbtMap.builder(); - builder.putByte("Count", (byte) itemData.getCount()); - if (itemData.getTag() != null) { - builder.put("tag", itemData.getTag()); + NbtMap itemDataTag = itemData.getTag(); + if (itemDataTag != null) { + // Remove custom name that Geyser sets for items due to translating default components + String customName = ItemTranslator.getCustomName(session, heldItem.getDataComponents(), + session.getItemMappings().getMapping(heldItem), 'f', false); + if (customName == null) { + // No custom name found, must modify tag if custom name exists + NbtMapBuilder copy = itemDataTag.toBuilder(); + copy.remove("display"); // Also removes lore, but, should not matter + itemDataTag = copy.build(); + } + + builder.put("tag", itemDataTag); } builder.putShort("Damage", (short) itemData.getDamage()); builder.putString("Name", customIdentifier != null ? customIdentifier : session.getItemMappings().getMapping(entityMetadata.getValue()).getBedrockIdentifier()); diff --git a/core/src/main/java/org/geysermc/geyser/item/type/ShulkerBoxItem.java b/core/src/main/java/org/geysermc/geyser/item/type/ShulkerBoxItem.java index c3b739adc..d8d2c347d 100644 --- a/core/src/main/java/org/geysermc/geyser/item/type/ShulkerBoxItem.java +++ b/core/src/main/java/org/geysermc/geyser/item/type/ShulkerBoxItem.java @@ -98,7 +98,7 @@ public class ShulkerBoxItem extends BlockItem { // Only the display name is what we have interest in, so just translate that if relevant if (boxComponents != null) { - String customName = ItemTranslator.getCustomName(session, boxComponents, boxMapping, '7'); + String customName = ItemTranslator.getCustomName(session, boxComponents, boxMapping, '7', true); if (customName != null) { boxItemNbt.putCompound("tag", NbtMap.builder() .putCompound("display", NbtMap.builder() diff --git a/core/src/main/java/org/geysermc/geyser/translator/item/ItemTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/item/ItemTranslator.java index 691a320e5..96b64f56d 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/item/ItemTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/item/ItemTranslator.java @@ -173,7 +173,7 @@ public final class ItemTranslator { javaItem.translateComponentsToBedrock(session, components, nbtBuilder); Rarity rarity = Rarity.fromId(components.getOrDefault(DataComponentType.RARITY, 0)); - String customName = getCustomName(session, components, bedrockItem, rarity.getColor()); + String customName = getCustomName(session, components, bedrockItem, rarity.getColor(), true); if (customName != null) { nbtBuilder.setCustomName(customName); } @@ -493,7 +493,7 @@ public final class ItemTranslator { * @param translationColor if this item is not available on Java, the color that the new name should be. * Normally, this should just be white, but for shulker boxes this should be gray. */ - public static String getCustomName(GeyserSession session, DataComponents components, ItemMapping mapping, char translationColor) { + public static String getCustomName(GeyserSession session, DataComponents components, ItemMapping mapping, char translationColor, boolean includeDefault) { if (components != null) { // ItemStack#getHoverName as of 1.20.5 Component customName = components.get(DataComponentType.CUSTOM_NAME); @@ -514,7 +514,7 @@ public final class ItemTranslator { } } customName = components.get(DataComponentType.ITEM_NAME); - if (customName != null) { + if (customName != null && includeDefault) { // Get the translated name and prefix it with a reset char to prevent italics - matches Java Edition // behavior as of 1.21 return ChatColor.RESET + ChatColor.ESCAPE + translationColor + MessageTranslator.convertMessage(customName, session.locale());