diff --git a/src/main/java/me/youhavetrouble/notjustnameplates/NotJustNameplates.java b/src/main/java/me/youhavetrouble/notjustnameplates/NotJustNameplates.java index 16cfc75..2dd9dd8 100644 --- a/src/main/java/me/youhavetrouble/notjustnameplates/NotJustNameplates.java +++ b/src/main/java/me/youhavetrouble/notjustnameplates/NotJustNameplates.java @@ -2,8 +2,10 @@ package me.youhavetrouble.notjustnameplates; import me.youhavetrouble.notjustnameplates.commands.MainCommand; import me.youhavetrouble.notjustnameplates.displays.DisplayContent; -import me.youhavetrouble.notjustnameplates.nameplates.Nameplate; import me.youhavetrouble.notjustnameplates.nameplates.NameplateManager; +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import net.kyori.adventure.text.minimessage.tag.standard.StandardTags; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.permissions.PermissionDefault; @@ -23,9 +25,12 @@ public final class NotJustNameplates extends JavaPlugin { private static boolean papiHook = false; + public static final MiniMessage miniMessage = null; + @Override public void onEnable() { instance = this; + config = new NJNConfig(this); papiHook = Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null && Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI"); diff --git a/src/main/java/me/youhavetrouble/notjustnameplates/hooks/PAPIHook.java b/src/main/java/me/youhavetrouble/notjustnameplates/hooks/PAPIHook.java deleted file mode 100644 index a079312..0000000 --- a/src/main/java/me/youhavetrouble/notjustnameplates/hooks/PAPIHook.java +++ /dev/null @@ -1,23 +0,0 @@ -package me.youhavetrouble.notjustnameplates.hooks; - -import me.clip.placeholderapi.PlaceholderAPI; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.TextReplacementConfig; -import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; -import org.bukkit.OfflinePlayer; - -public class PAPIHook { - - public static Component setPlaceholders(Component component, OfflinePlayer offlinePlayer) { - component = component.replaceText(TextReplacementConfig.builder() - .match(PlaceholderAPI.getPlaceholderPattern()) - .replacement((matchResult, builder) -> LegacyComponentSerializer.legacyAmpersand().deserialize(PlaceholderAPI.setPlaceholders(offlinePlayer, matchResult.group(0)))) - .build()); - return component; - } - - public static String setPlaceholders(String string, OfflinePlayer offlinePlayer) { - return PlaceholderAPI.setPlaceholders(offlinePlayer, string); - } - -} diff --git a/src/main/java/me/youhavetrouble/notjustnameplates/nameplates/Nameplate.java b/src/main/java/me/youhavetrouble/notjustnameplates/nameplates/Nameplate.java index 53cb034..fd501b2 100644 --- a/src/main/java/me/youhavetrouble/notjustnameplates/nameplates/Nameplate.java +++ b/src/main/java/me/youhavetrouble/notjustnameplates/nameplates/Nameplate.java @@ -2,10 +2,11 @@ package me.youhavetrouble.notjustnameplates.nameplates; import me.youhavetrouble.notjustnameplates.NotJustNameplates; import me.youhavetrouble.notjustnameplates.displays.DisplayContent; -import me.youhavetrouble.notjustnameplates.hooks.PAPIHook; +import me.youhavetrouble.notjustnameplates.text.TextParser; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; -import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import net.kyori.adventure.text.minimessage.tag.standard.StandardTags; import org.bukkit.Bukkit; import org.bukkit.Color; import org.bukkit.GameMode; @@ -186,43 +187,8 @@ public class Nameplate { if (player == null || !player.isOnline()) return Component.empty(); - if (NotJustNameplates.isPapiHooked()) { - text = PAPIHook.setPlaceholders(text, player); - } - - text = text.replaceAll("%displayname%", LegacyComponentSerializer.legacyAmpersand().serialize(player.displayName())); - - text = makeColorsWork(LegacyComponentSerializer.AMPERSAND_CHAR, text); - text = makeColorsWork(LegacyComponentSerializer.SECTION_CHAR, text); - - return MiniMessage.miniMessage().deserialize(text); + return TextParser.parseWithPlaceholders(text, player); } - private String makeColorsWork(Character symbol, String string) { - // Adventure and ChatColor do not like each other, so this is a thing. - string = string.replaceAll(symbol + "0", ""); - string = string.replaceAll(symbol + "1", ""); - string = string.replaceAll(symbol + "2", ""); - string = string.replaceAll(symbol + "3", ""); - string = string.replaceAll(symbol + "4", ""); - string = string.replaceAll(symbol + "5", ""); - string = string.replaceAll(symbol + "6", ""); - string = string.replaceAll(symbol + "7", ""); - string = string.replaceAll(symbol + "8", ""); - string = string.replaceAll(symbol + "9", ""); - string = string.replaceAll(symbol + "a", ""); - string = string.replaceAll(symbol + "b", ""); - string = string.replaceAll(symbol + "c", ""); - string = string.replaceAll(symbol + "d", ""); - string = string.replaceAll(symbol + "e", ""); - string = string.replaceAll(symbol + "f", ""); - string = string.replaceAll(symbol + "k", ""); - string = string.replaceAll(symbol + "l", ""); - string = string.replaceAll(symbol + "m", ""); - string = string.replaceAll(symbol + "n", ""); - string = string.replaceAll(symbol + "o", ""); - string = string.replaceAll(symbol + "r", ""); - return string; - } } diff --git a/src/main/java/me/youhavetrouble/notjustnameplates/text/TextParser.java b/src/main/java/me/youhavetrouble/notjustnameplates/text/TextParser.java new file mode 100644 index 0000000..1c47245 --- /dev/null +++ b/src/main/java/me/youhavetrouble/notjustnameplates/text/TextParser.java @@ -0,0 +1,50 @@ +package me.youhavetrouble.notjustnameplates.text; + +import me.clip.placeholderapi.PlaceholderAPI; +import me.youhavetrouble.notjustnameplates.NotJustNameplates; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import net.kyori.adventure.text.minimessage.tag.standard.StandardTags; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +public class TextParser { + + public static Component parseWithPlaceholders(String input, Player player) { + MiniMessage miniMessage = MiniMessage.builder() + .tags(TagResolver.builder() + .resolvers( + StandardTags.defaults(), + placeholderTag(player)) + .build()) + .build(); + return miniMessage.deserialize(input); + } + + public static @NotNull TagResolver placeholderTag(final @NotNull Player player) { + return TagResolver.resolver("placeholder", (argumentQueue, context) -> { + final String placeholder = argumentQueue.popOr("placeholder tag requires an argument").value(); + switch (placeholder) { + case "name" -> { + return Tag.selfClosingInserting(player.name()) ; + } + case "displayname" -> { + return Tag.selfClosingInserting(player.displayName()); + } + default -> { + if (NotJustNameplates.isPapiHooked()) { + final String parsedPlaceholder = PlaceholderAPI.setPlaceholders(player, '%' + placeholder + '%'); + Component componentPlaceholder = LegacyComponentSerializer.legacySection().deserialize(parsedPlaceholder); + return Tag.selfClosingInserting(componentPlaceholder); + } + return Tag.selfClosingInserting(Component.text(placeholder)); + } + } + + }); + } + +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index b9307d5..4aa1618 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -6,7 +6,7 @@ nameplates: billboard: "vertical" frames: 1: - text: "%displayname%" + text: "" messages: config-reloaded: "NJN Config reloaded."