Handle Slot tag inside CONTAINER tag in 1.20.3->1.20.5 (#3995)

Fixes shulker box tooltips not showing all items for 1.20.3 clients on 1.20.5+ servers
This commit is contained in:
EnZaXD 2024-07-02 11:53:34 +02:00 committed by GitHub
parent dc503cd613
commit e6da77cf47
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -18,6 +18,7 @@
package com.viaversion.viaversion.protocols.v1_20_3to1_20_5.rewriter; package com.viaversion.viaversion.protocols.v1_20_3to1_20_5.rewriter;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import com.viaversion.nbt.tag.ByteTag;
import com.viaversion.nbt.tag.CompoundTag; import com.viaversion.nbt.tag.CompoundTag;
import com.viaversion.nbt.tag.FloatTag; import com.viaversion.nbt.tag.FloatTag;
import com.viaversion.nbt.tag.IntArrayTag; 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) { private void convertItemList(final UserConnection connection, final Item[] items, final CompoundTag tag, final String key) {
final ListTag<CompoundTag> itemsTag = new ListTag<>(CompoundTag.class); final ListTag<CompoundTag> itemsTag = new ListTag<>(CompoundTag.class);
for (final Item item : items) { for (int i = 0; i < items.length; i++) {
final CompoundTag savedItem = new CompoundTag(); final Item item = items[i];
if (item != null) { final CompoundTag savedItem = itemToTag(connection, item);
final String name = toMappedItemName(item.identifier()); // 1.20.4 clients need the Slot to display the item correctly
savedItem.putString("id", name); if (backupInconvertibleData) {
if (backupInconvertibleData && name.isEmpty()) { savedItem.putByte("Slot", (byte) i);
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");
} }
itemsTag.add(savedItem); itemsTag.add(savedItem);
} }
tag.put(key, itemsTag); 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) { private void convertEnchantments(final Enchantments data, final CompoundTag tag, final boolean storedEnchantments) {
final ListTag<CompoundTag> enchantments = new ListTag<>(CompoundTag.class); final ListTag<CompoundTag> enchantments = new ListTag<>(CompoundTag.class);
for (final Int2IntMap.Entry entry : data.enchantments().int2IntEntrySet()) { for (final Int2IntMap.Entry entry : data.enchantments().int2IntEntrySet()) {