Handle attribute_modifiers inside container components in 1.21->1.20.5 (#4035)

Closes https://github.com/ViaVersion/ViaVersion/issues/3968
This commit is contained in:
EnZaXD 2024-07-22 17:42:25 +02:00 committed by GitHub
parent 7f4faab4ab
commit 35fa7e78a0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 37 additions and 10 deletions

View File

@ -34,20 +34,42 @@ public final class ComponentRewriter1_21 extends ComponentRewriter<ClientboundPa
super(protocol, ReadType.NBT); super(protocol, ReadType.NBT);
} }
@Override private void convertAttributeModifiersComponent(final CompoundTag tag) {
protected void handleShowItem(final UserConnection connection, final CompoundTag componentsTag) { final CompoundTag attributeModifiers = TagUtil.getNamespacedCompoundTag(tag, "minecraft:attribute_modifiers");
final CompoundTag attributeModifiers = TagUtil.getNamespacedCompoundTag(componentsTag, "minecraft:attribute_modifiers"); if (attributeModifiers == null) {
if (attributeModifiers != null) { return;
final ListTag<CompoundTag> modifiers = attributeModifiers.getListTag("modifiers", CompoundTag.class); }
for (final CompoundTag modifier : modifiers) { final ListTag<CompoundTag> modifiers = attributeModifiers.getListTag("modifiers", CompoundTag.class);
final String name = modifier.getString("name"); for (final CompoundTag modifier : modifiers) {
final UUID uuid = UUIDUtil.fromIntArray(modifier.getIntArrayTag("uuid").getValue()); final String name = modifier.getString("name");
final String id = Protocol1_20_5To1_21.mapAttributeUUID(uuid, name); final UUID uuid = UUIDUtil.fromIntArray(modifier.getIntArrayTag("uuid").getValue());
modifier.putString("id", id); final String id = Protocol1_20_5To1_21.mapAttributeUUID(uuid, name);
modifier.putString("id", id);
}
}
private void handleContainerComponent(final CompoundTag tag) {
final ListTag<CompoundTag> container = TagUtil.getNamespacedCompoundTagList(tag, "minecraft: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);
}
@Override @Override
protected SerializerVersion inputSerializerVersion() { protected SerializerVersion inputSerializerVersion() {
return SerializerVersion.V1_20_5; return SerializerVersion.V1_20_5;

View File

@ -64,6 +64,11 @@ public final class TagUtil {
return compoundTag != null ? compoundTag : tag.getCompoundTag(Key.stripMinecraftNamespace(key)); return compoundTag != null ? compoundTag : tag.getCompoundTag(Key.stripMinecraftNamespace(key));
} }
public static @Nullable ListTag<CompoundTag> getNamespacedCompoundTagList(final CompoundTag tag, final String key) {
final ListTag<CompoundTag> listTag = tag.getListTag(Key.namespaced(key), CompoundTag.class);
return listTag != null ? listTag : tag.getListTag(Key.stripMinecraftNamespace(key), CompoundTag.class);
}
public static Tag handleDeep(final Tag tag, final TagUpdater consumer) { public static Tag handleDeep(final Tag tag, final TagUpdater consumer) {
return handleDeep(null, tag, consumer); return handleDeep(null, tag, consumer);
} }