From 0261b0ceae2ba072acb8c91bb93d5d2f81c79609 Mon Sep 17 00:00:00 2001 From: YouHaveTrouble Date: Mon, 24 Nov 2025 23:26:29 +0100 Subject: [PATCH] common methods for saving and loading raw (minimessage) display name --- .../standin/converter/EntityConverter.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/main/java/me/youhavetrouble/standin/converter/EntityConverter.java b/src/main/java/me/youhavetrouble/standin/converter/EntityConverter.java index 391ac2e..e802990 100644 --- a/src/main/java/me/youhavetrouble/standin/converter/EntityConverter.java +++ b/src/main/java/me/youhavetrouble/standin/converter/EntityConverter.java @@ -1,13 +1,19 @@ package me.youhavetrouble.standin.converter; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import org.bukkit.NamespacedKey; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; +import org.bukkit.persistence.PersistentDataContainer; +import org.bukkit.persistence.PersistentDataType; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public interface EntityConverter { NamespacedKey PLAYER_PROFILE_KEY = new NamespacedKey("stand-in", "player-profile"); + NamespacedKey CUSTOM_NAME_KEY = new NamespacedKey("stand-in", "raw-custom-name"); @NotNull EntityType entityFrom(); @@ -20,4 +26,41 @@ public interface EntityConverter { */ T spawn(@NotNull F from); + /** + * MiniMessage serialized entity name + * @param entity Entity to get name for + * @return Raw entity name + */ + static @Nullable String getRawEntityName(@NotNull Entity entity) { + PersistentDataContainer pdc = entity.getPersistentDataContainer(); + String pdcCustomName = pdc.get(CUSTOM_NAME_KEY, PersistentDataType.STRING); + if (pdcCustomName != null) { + // Prioritize PDC stored name + return pdcCustomName; + } + Component entityCustomName = entity.customName(); + + // Fallback to custom name component + // Cannot be serialized to minimessage because gradients would be extremely long and not fit dialog fields + if (entityCustomName != null) { + return PlainTextComponentSerializer.plainText().serialize(entityCustomName); + } + + return null; + } + + /** + * Save raw minimessage string in entity's PDC + * @param entity Entity to save name for + * @param rawName minimessage string to save + */ + static void saveRawEntityName(@NotNull Entity entity, @Nullable String rawName) { + PersistentDataContainer pdc = entity.getPersistentDataContainer(); + if (rawName != null && !rawName.isEmpty()) { + pdc.set(CUSTOM_NAME_KEY, PersistentDataType.STRING, rawName); + return; + } + pdc.remove(CUSTOM_NAME_KEY); + } + }