From 245b7a0d2aac62b720887eb6fedbe3506a45fdbb Mon Sep 17 00:00:00 2001 From: booky10 Date: Wed, 10 Jul 2024 16:29:36 +0200 Subject: [PATCH] Fix reading/writing of item attribute modifier component in 1.21 --- .../builtin/item/ItemAttributeModifiers.java | 45 ++++++++++++++++--- .../WrapperPlayServerUpdateAttributes.java | 3 +- 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/api/src/main/java/com/github/retrooper/packetevents/protocol/component/builtin/item/ItemAttributeModifiers.java b/api/src/main/java/com/github/retrooper/packetevents/protocol/component/builtin/item/ItemAttributeModifiers.java index c62d154b92..00cca7642b 100644 --- a/api/src/main/java/com/github/retrooper/packetevents/protocol/component/builtin/item/ItemAttributeModifiers.java +++ b/api/src/main/java/com/github/retrooper/packetevents/protocol/component/builtin/item/ItemAttributeModifiers.java @@ -18,10 +18,14 @@ package com.github.retrooper.packetevents.protocol.component.builtin.item; +import com.github.retrooper.packetevents.manager.server.ServerVersion; import com.github.retrooper.packetevents.protocol.attribute.Attribute; import com.github.retrooper.packetevents.protocol.attribute.AttributeOperation; import com.github.retrooper.packetevents.protocol.attribute.Attributes; +import com.github.retrooper.packetevents.resources.ResourceLocation; import com.github.retrooper.packetevents.wrapper.PacketWrapper; +import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerUpdateAttributes.PropertyModifier; +import org.jetbrains.annotations.ApiStatus; import java.util.Collections; import java.util.List; @@ -168,11 +172,16 @@ public String toString() { public static class Modifier { - private UUID id; - private String name; + private UUID id; // removed in 1.21 + private String name; // ResourceLocation since 1.21 private double value; private AttributeOperation operation; + public Modifier(ResourceLocation name, double value, AttributeOperation operation) { + this(PropertyModifier.generateSemiUniqueId(name), name.toString(), value, operation); + } + + @ApiStatus.Obsolete public Modifier(UUID id, String name, double value, AttributeOperation operation) { this.id = id; this.name = name; @@ -181,32 +190,56 @@ public Modifier(UUID id, String name, double value, AttributeOperation operation } public static Modifier read(PacketWrapper wrapper) { - UUID id = wrapper.readUUID(); - String name = wrapper.readString(); + UUID id; + String name; + if (wrapper.getServerVersion().isNewerThanOrEquals(ServerVersion.V_1_21)) { + ResourceLocation nameKey = wrapper.readIdentifier(); + name = nameKey.toString(); + id = PropertyModifier.generateSemiUniqueId(nameKey); + } else { + id = wrapper.readUUID(); + name = wrapper.readString(); + } double value = wrapper.readDouble(); AttributeOperation operation = wrapper.readEnum(AttributeOperation.values()); return new Modifier(id, name, value, operation); } public static void write(PacketWrapper wrapper, Modifier modifier) { - wrapper.writeUUID(modifier.id); - wrapper.writeString(modifier.name); + if (wrapper.getServerVersion().isNewerThanOrEquals(ServerVersion.V_1_21)) { + wrapper.writeIdentifier(new ResourceLocation(modifier.name)); + } else { + wrapper.writeUUID(modifier.id); + wrapper.writeString(modifier.name); + } wrapper.writeDouble(modifier.value); wrapper.writeEnum(modifier.operation); } + public ResourceLocation getNameKey() { + return new ResourceLocation(this.name); + } + + public void setNameKey(ResourceLocation nameKey) { + this.name = nameKey.toString(); + } + + @ApiStatus.Obsolete public UUID getId() { return this.id; } + @ApiStatus.Obsolete public void setId(UUID id) { this.id = id; } + @ApiStatus.Obsolete public String getName() { return this.name; } + @ApiStatus.Obsolete public void setName(String name) { this.name = name; } diff --git a/api/src/main/java/com/github/retrooper/packetevents/wrapper/play/server/WrapperPlayServerUpdateAttributes.java b/api/src/main/java/com/github/retrooper/packetevents/wrapper/play/server/WrapperPlayServerUpdateAttributes.java index e3cc5e3549..ded2db91be 100644 --- a/api/src/main/java/com/github/retrooper/packetevents/wrapper/play/server/WrapperPlayServerUpdateAttributes.java +++ b/api/src/main/java/com/github/retrooper/packetevents/wrapper/play/server/WrapperPlayServerUpdateAttributes.java @@ -229,7 +229,8 @@ public PropertyModifier(ResourceLocation name, UUID uuid, double amount, Operati this.operation = operation; } - private static UUID generateSemiUniqueId(ResourceLocation name) { + @ApiStatus.Internal + public static UUID generateSemiUniqueId(ResourceLocation name) { String extendedName = "packetevents_" + name.toString(); return UUID.nameUUIDFromBytes(extendedName.getBytes(StandardCharsets.UTF_8)); }