From 3f172a8d2ca54e30b721b6e4e666fa3267f0be53 Mon Sep 17 00:00:00 2001 From: TheMode Date: Tue, 12 Apr 2022 16:20:17 +0200 Subject: [PATCH] Support Tag.Component and for record auto-structure Signed-off-by: TheMode --- .../net/minestom/server/tag/Serializers.java | 4 +++ .../java/net/minestom/server/tag/Tag.java | 5 +++ .../net/minestom/server/tag/TagRecord.java | 5 ++- .../minestom/server/tag/TagComponentTest.java | 34 +++++++++++++++++++ 4 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 src/test/java/net/minestom/server/tag/TagComponentTest.java diff --git a/src/main/java/net/minestom/server/tag/Serializers.java b/src/main/java/net/minestom/server/tag/Serializers.java index d29afe77d..1d41d4fb2 100644 --- a/src/main/java/net/minestom/server/tag/Serializers.java +++ b/src/main/java/net/minestom/server/tag/Serializers.java @@ -1,5 +1,7 @@ package net.minestom.server.tag; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import net.minestom.server.item.ItemStack; import org.jglrxavpok.hephaistos.nbt.*; @@ -22,6 +24,8 @@ final class Serializers { static final Entry NBT_ENTRY = new Entry<>(Function.identity(), Function.identity()); static final Entry ITEM = new Entry<>(ItemStack::fromItemNBT, ItemStack::toItemNBT); + static final Entry COMPONENT = new Entry<>(input -> GsonComponentSerializer.gson().deserialize(input.getValue()), + component -> NBT.String(GsonComponentSerializer.gson().serialize(component))); static Entry fromTagSerializer(TagSerializer serializer) { return new Serializers.Entry<>( diff --git a/src/main/java/net/minestom/server/tag/Tag.java b/src/main/java/net/minestom/server/tag/Tag.java index 2bbd40694..bd356f7d6 100644 --- a/src/main/java/net/minestom/server/tag/Tag.java +++ b/src/main/java/net/minestom/server/tag/Tag.java @@ -1,5 +1,6 @@ package net.minestom.server.tag; +import net.kyori.adventure.text.Component; import net.minestom.server.item.ItemStack; import net.minestom.server.utils.collection.IndexMap; import org.jetbrains.annotations.ApiStatus; @@ -277,6 +278,10 @@ public class Tag { return tag(key, Serializers.ITEM); } + public static @NotNull Tag Component(@NotNull String key) { + return tag(key, Serializers.COMPONENT); + } + /** * Creates a flexible tag able to read and write any {@link NBT} objects. *

diff --git a/src/main/java/net/minestom/server/tag/TagRecord.java b/src/main/java/net/minestom/server/tag/TagRecord.java index fa85a0f1e..52cc281d0 100644 --- a/src/main/java/net/minestom/server/tag/TagRecord.java +++ b/src/main/java/net/minestom/server/tag/TagRecord.java @@ -1,5 +1,6 @@ package net.minestom.server.tag; +import net.kyori.adventure.text.Component; import net.minestom.server.item.ItemStack; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -18,6 +19,7 @@ import static java.util.Map.entry; final class TagRecord { static final Map, Function>> SUPPORTED_TYPES = Map.ofEntries( entry(Byte.class, Tag::Byte), entry(byte.class, Tag::Byte), + entry(Boolean.class, Tag::Boolean), entry(boolean.class, Tag::Boolean), entry(Short.class, Tag::Short), entry(short.class, Tag::Short), entry(Integer.class, Tag::Integer), entry(int.class, Tag::Integer), entry(Long.class, Tag::Long), entry(long.class, Tag::Long), @@ -25,7 +27,8 @@ final class TagRecord { entry(Double.class, Tag::Double), entry(double.class, Tag::Double), entry(String.class, Tag::String), - entry(ItemStack.class, Tag::ItemStack)); + entry(ItemStack.class, Tag::ItemStack), + entry(Component.class, Tag::Component)); static final ClassValue> serializers = new ClassValue<>() { @Override diff --git a/src/test/java/net/minestom/server/tag/TagComponentTest.java b/src/test/java/net/minestom/server/tag/TagComponentTest.java new file mode 100644 index 000000000..7bd9ccef8 --- /dev/null +++ b/src/test/java/net/minestom/server/tag/TagComponentTest.java @@ -0,0 +1,34 @@ +package net.minestom.server.tag; + +import net.kyori.adventure.text.Component; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertSame; + +public class TagComponentTest { + + @Test + public void get() { + var component = Component.text("Hey"); + var tag = Tag.Component("component"); + var handler = TagHandler.newHandler(); + handler.setTag(tag, component); + assertSame(component, handler.getTag(tag)); + } + + @Test + public void empty() { + var tag = Tag.Component("component"); + var handler = TagHandler.newHandler(); + assertNull(handler.getTag(tag)); + } + + @Test + public void invalidTag() { + var tag = Tag.Component("entry"); + var handler = TagHandler.newHandler(); + handler.setTag(Tag.Integer("entry"), 1); + assertNull(handler.getTag(tag)); + } +}