From 1413bd63efa13fe444dca3465264a45e14a2b03d Mon Sep 17 00:00:00 2001 From: EnZaXD Date: Wed, 24 Jul 2024 14:33:56 +0200 Subject: [PATCH] Handle attribute_modifiers inside container components in 1.21->1.20.5 (#829) --- .../rewriter/ComponentRewriter1_21.java | 44 ++++++++++++++----- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_21to1_20_5/rewriter/ComponentRewriter1_21.java b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_21to1_20_5/rewriter/ComponentRewriter1_21.java index 8d7aa29c..98fad6a9 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_21to1_20_5/rewriter/ComponentRewriter1_21.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_21to1_20_5/rewriter/ComponentRewriter1_21.java @@ -37,19 +37,41 @@ public final class ComponentRewriter1_21 extends TranslatableRewriter modifiers = attributeModifiers.getListTag("modifiers", CompoundTag.class); - for (final CompoundTag modifier : modifiers) { - final String id = modifier.getString("id"); - final UUID uuid = Protocol1_20_5To1_21.mapAttributeId(id); - final String name = AttributeModifierMappings1_21.idToName(id); - modifier.put("uuid", new IntArrayTag(UUIDUtil.toIntArray(uuid))); - modifier.putString("name", name != null ? name : id); + private void convertAttributeModifiersComponent(final CompoundTag tag) { + final CompoundTag attributeModifiers = TagUtil.getNamespacedCompoundTag(tag, "attribute_modifiers"); + if (attributeModifiers == null) { + return; + } + final ListTag modifiers = attributeModifiers.getListTag("modifiers", CompoundTag.class); + for (final CompoundTag modifier : modifiers) { + final String id = modifier.getString("id"); + final UUID uuid = Protocol1_20_5To1_21.mapAttributeId(id); + final String name = AttributeModifierMappings1_21.idToName(id); + modifier.put("uuid", new IntArrayTag(UUIDUtil.toIntArray(uuid))); + modifier.putString("name", name != null ? name : id); + } + } + + private void handleContainerComponent(final CompoundTag tag) { + final ListTag container = TagUtil.getNamespacedCompoundTagList(tag, "container"); + if (container == null) { + return; + } + for (final CompoundTag entryTag : container) { + final CompoundTag itemTag = entryTag.getCompoundTag("item"); + + final CompoundTag componentsTag = itemTag.getCompoundTag("components"); + if (componentsTag != null) { + convertAttributeModifiersComponent(componentsTag); + handleContainerComponent(componentsTag); } } + } + + @Override + protected void handleShowItem(final UserConnection connection, final CompoundTag componentsTag) { + convertAttributeModifiersComponent(componentsTag); + handleContainerComponent(componentsTag); TagUtil.removeNamespaced(componentsTag, "jukebox_playable"); }