From df0572e570ec2369062896b5c0da73befc6798d9 Mon Sep 17 00:00:00 2001 From: FlorianMichael Date: Sun, 30 Jun 2024 16:20:00 +0200 Subject: [PATCH] Handle Slot tag inside CONTAINER tag in 1.20.3->1.20.5 Fixes shulker box tooltips not showing all items for 1.20.3 clients on 1.20.5+ servers. TODO find out if we should backup the Slot tag in VV as well (it seems the server resyncs it, but I'm not sure if there are cases were that breaks) for creative mode. Closes https://github.com/ViaVersion/ViaBackwards/issues/803 Closes https://github.com/ViaVersion/ViaVersion/issues/3903 --- .../rewriter/StructuredDataConverter.java | 46 +++++++++++-------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_3to1_20_5/rewriter/StructuredDataConverter.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_3to1_20_5/rewriter/StructuredDataConverter.java index 1e35b8925..d77fb5edf 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_3to1_20_5/rewriter/StructuredDataConverter.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_3to1_20_5/rewriter/StructuredDataConverter.java @@ -18,6 +18,7 @@ package com.viaversion.viaversion.protocols.v1_20_3to1_20_5.rewriter; import com.google.common.base.Preconditions; +import com.viaversion.nbt.tag.ByteTag; import com.viaversion.nbt.tag.CompoundTag; import com.viaversion.nbt.tag.FloatTag; import com.viaversion.nbt.tag.IntArrayTag; @@ -798,30 +799,39 @@ public final class StructuredDataConverter { private void convertItemList(final UserConnection connection, final Item[] items, final CompoundTag tag, final String key) { final ListTag itemsTag = new ListTag<>(CompoundTag.class); - for (final Item item : items) { - final CompoundTag savedItem = new CompoundTag(); - if (item != null) { - final String name = toMappedItemName(item.identifier()); - savedItem.putString("id", name); - if (backupInconvertibleData && name.isEmpty()) { - savedItem.putInt(ITEM_BACKUP_TAG_KEY, item.identifier()); - } - savedItem.putByte("Count", (byte) item.amount()); - - final CompoundTag itemTag = new CompoundTag(); - for (final StructuredData data : item.dataContainer().data().values()) { - writeToTag(connection, data, itemTag); - } - savedItem.put("tag", itemTag); - } else { - savedItem.putString("id", "air"); + for (int i = 0; i < items.length; i++) { + final Item item = items[i]; + final CompoundTag savedItem = itemToTag(connection, item); + // 1.20.4 clients need the Slot to display the item correctly + if (backupInconvertibleData) { + savedItem.putByte("Slot", (byte) i); } - itemsTag.add(savedItem); } tag.put(key, itemsTag); } + private CompoundTag itemToTag(final UserConnection connection, final Item item) { + final CompoundTag savedItem = new CompoundTag(); + if (item != null) { + final String name = toMappedItemName(item.identifier()); + savedItem.putString("id", name); + if (backupInconvertibleData && name.isEmpty()) { + savedItem.putInt(ITEM_BACKUP_TAG_KEY, item.identifier()); + } + savedItem.putByte("Count", (byte) item.amount()); + + final CompoundTag itemTag = new CompoundTag(); + for (final StructuredData data : item.dataContainer().data().values()) { + writeToTag(connection, data, itemTag); + } + savedItem.put("tag", itemTag); + } else { + savedItem.putString("id", "air"); + } + return savedItem; + } + private void convertEnchantments(final Enchantments data, final CompoundTag tag, final boolean storedEnchantments) { final ListTag enchantments = new ListTag<>(CompoundTag.class); for (final Int2IntMap.Entry entry : data.enchantments().int2IntEntrySet()) {