diff --git a/build.gradle b/build.gradle index 402a3691..006fa233 100644 --- a/build.gradle +++ b/build.gradle @@ -69,6 +69,9 @@ dependencies { implementation 'org.bstats:bstats-bukkit:3.0.0' + implementation 'net.kyori:adventure-text-minimessage:4.17.0' + implementation 'net.kyori:adventure-text-serializer-legacy:4.17.0' + // Spigot jars compileOnly "org.spigotmc:v1_7_R3:latest" compileOnly 'org.spigotmc:v1_16_R3-Tuinity:latest' @@ -89,6 +92,7 @@ subprojects.each { evaluationDependsOn(it.path) } shadowJar { relocate 'org.bstats', 'com.bgsoftware.wildtools.libs.org.bstats' + relocate 'net.kyori', 'com.bgsoftware.wildtools.libs.net.kyori' archiveClassifier.set('') diff --git a/src/main/java/com/bgsoftware/wildtools/Locale.java b/src/main/java/com/bgsoftware/wildtools/Locale.java index eb2caa69..0d8cc8c8 100644 --- a/src/main/java/com/bgsoftware/wildtools/Locale.java +++ b/src/main/java/com/bgsoftware/wildtools/Locale.java @@ -1,7 +1,7 @@ package com.bgsoftware.wildtools; import com.bgsoftware.common.config.CommentedConfiguration; -import org.bukkit.ChatColor; +import com.bgsoftware.wildtools.utils.TextFormatter; import org.bukkit.command.CommandSender; import java.io.File; @@ -122,7 +122,7 @@ public static void reload() { } for (String identifier : localeMap.keySet()) - localeMap.get(identifier).setMessage(ChatColor.translateAlternateColorCodes('&', cfg.getString(identifier, ""))); + localeMap.get(identifier).setMessage(TextFormatter.format(cfg.getString(identifier, ""))); WildToolsPlugin.log(" - Found " + messagesAmount + " messages in lang.yml."); WildToolsPlugin.log("Loading messages done (Took " + (System.currentTimeMillis() - startTime) + "ms)"); diff --git a/src/main/java/com/bgsoftware/wildtools/listeners/PlayerListener.java b/src/main/java/com/bgsoftware/wildtools/listeners/PlayerListener.java index 32f3e131..5c6a7d48 100644 --- a/src/main/java/com/bgsoftware/wildtools/listeners/PlayerListener.java +++ b/src/main/java/com/bgsoftware/wildtools/listeners/PlayerListener.java @@ -5,10 +5,9 @@ import com.bgsoftware.wildtools.scheduler.Scheduler; import com.bgsoftware.wildtools.tools.ToolBreaksTracker; import com.bgsoftware.wildtools.tools.WCannonTool; +import com.bgsoftware.wildtools.utils.TextFormatter; import com.bgsoftware.wildtools.utils.WSelection; import com.bgsoftware.wildtools.utils.items.ItemUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -108,7 +107,7 @@ public void onPlayerRespawn(PlayerRespawnEvent e) { } private void sendMessage(Player player, String message) { - player.sendMessage(ChatColor.translateAlternateColorCodes('&', message)); + player.sendMessage(TextFormatter.format(message)); } } diff --git a/src/main/java/com/bgsoftware/wildtools/tools/WTool.java b/src/main/java/com/bgsoftware/wildtools/tools/WTool.java index 3740638c..ec0b74b5 100644 --- a/src/main/java/com/bgsoftware/wildtools/tools/WTool.java +++ b/src/main/java/com/bgsoftware/wildtools/tools/WTool.java @@ -2,13 +2,13 @@ import com.bgsoftware.common.reflection.ReflectMethod; import com.bgsoftware.wildtools.WildToolsPlugin; +import com.bgsoftware.wildtools.utils.TextFormatter; import com.bgsoftware.wildtools.api.objects.ToolMode; import com.bgsoftware.wildtools.api.objects.tools.Tool; import com.bgsoftware.wildtools.utils.Materials; import com.bgsoftware.wildtools.utils.items.ItemUtils; import com.bgsoftware.wildtools.utils.items.ToolItemStack; import com.bgsoftware.wildtools.world.BlockMaterial; -import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.block.Block; @@ -84,7 +84,7 @@ public WTool(Material type, String name, ToolMode toolMode) { @Override public void setDisplayName(String name) { ItemMeta im = toolItemStack.getItemMeta(); - im.setDisplayName(ChatColor.translateAlternateColorCodes('&', name)); + im.setDisplayName(TextFormatter.format(name)); toolItemStack.setItemMeta(im); } @@ -94,7 +94,7 @@ public void setLore(List lore) { List _lore = new ArrayList<>(); for (String line : lore) - _lore.add(ChatColor.translateAlternateColorCodes('&', line)); + _lore.add(TextFormatter.format(line)); im.setLore(_lore); toolItemStack.setItemMeta(im); diff --git a/src/main/java/com/bgsoftware/wildtools/utils/TextFormatter.java b/src/main/java/com/bgsoftware/wildtools/utils/TextFormatter.java new file mode 100644 index 00000000..1ce9a41f --- /dev/null +++ b/src/main/java/com/bgsoftware/wildtools/utils/TextFormatter.java @@ -0,0 +1,92 @@ +package com.bgsoftware.wildtools.utils; + +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; + +public final class TextFormatter { + + private static final MiniMessage MINI = MiniMessage.miniMessage(); + private static final LegacyComponentSerializer TO_LEGACY = LegacyComponentSerializer.builder() + .character(LegacyComponentSerializer.SECTION_CHAR) + .hexColors() + .useUnusualXRepeatedCharacterHexFormat() + .build(); + + private TextFormatter() { + } + + public static String format(String text) { + if (text == null || text.isEmpty()) return text; + return TO_LEGACY.serialize(MINI.deserialize(convertLegacyToMiniMessage(text))); + } + + private static String convertLegacyToMiniMessage(String text) { + if (!text.contains("&")) return text; + StringBuilder sb = new StringBuilder(text.length()); + for (int i = 0; i < text.length(); i++) { + char c = text.charAt(i); + if (c == '&' && i + 1 < text.length()) { + String tag = legacyCodeToTag(text.charAt(i + 1)); + if (tag != null) { + sb.append(tag); + i++; + continue; + } + } + sb.append(c); + } + return sb.toString(); + } + + private static String legacyCodeToTag(char code) { + switch (Character.toLowerCase(code)) { + case '0': + return ""; + case '1': + return ""; + case '2': + return ""; + case '3': + return ""; + case '4': + return ""; + case '5': + return ""; + case '6': + return ""; + case '7': + return ""; + case '8': + return ""; + case '9': + return ""; + case 'a': + return ""; + case 'b': + return ""; + case 'c': + return ""; + case 'd': + return ""; + case 'e': + return ""; + case 'f': + return ""; + case 'k': + return ""; + case 'l': + return ""; + case 'm': + return ""; + case 'n': + return ""; + case 'o': + return ""; + case 'r': + return ""; + default: + return null; + } + } + +} diff --git a/src/main/java/com/bgsoftware/wildtools/utils/items/ItemBuilder.java b/src/main/java/com/bgsoftware/wildtools/utils/items/ItemBuilder.java index 5bc789fd..22afb7dc 100644 --- a/src/main/java/com/bgsoftware/wildtools/utils/items/ItemBuilder.java +++ b/src/main/java/com/bgsoftware/wildtools/utils/items/ItemBuilder.java @@ -2,6 +2,7 @@ import com.bgsoftware.wildtools.WildToolsPlugin; import com.bgsoftware.wildtools.utils.Materials; +import com.bgsoftware.wildtools.utils.TextFormatter; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; @@ -75,18 +76,18 @@ public ItemBuilder(ConfigurationSection section) { public ItemBuilder withName(String name) { if (!name.isEmpty()) - itemMeta.setDisplayName(ChatColor.translateAlternateColorCodes('&', name)); + itemMeta.setDisplayName(TextFormatter.format(name)); return this; } public ItemBuilder withLore(String firstLine, List listLine) { List loreList = new ArrayList<>(); - firstLine = ChatColor.translateAlternateColorCodes('&', firstLine); + firstLine = TextFormatter.format(firstLine); loreList.add(firstLine); for (String line : listLine) { - loreList.add(ChatColor.getLastColors(firstLine) + ChatColor.translateAlternateColorCodes('&', line)); + loreList.add(ChatColor.getLastColors(firstLine) + TextFormatter.format(line)); } if (loreList.size() > 10) { @@ -104,7 +105,7 @@ public ItemBuilder withLore(List listLine) { List loreList = new ArrayList<>(); for (String line : listLine) { - loreList.add(ChatColor.translateAlternateColorCodes('&', line)); + loreList.add(TextFormatter.format(line)); } itemMeta.setLore(loreList); @@ -115,7 +116,7 @@ public ItemBuilder withLore(String... lore) { List loreList = new ArrayList<>(); for (String line : lore) { - loreList.add(ChatColor.translateAlternateColorCodes('&', line)); + loreList.add(TextFormatter.format(line)); } itemMeta.setLore(loreList);