From 6f9bd9f5523aa458144a307c6d1fd2b1ad5b8941 Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Sat, 4 Apr 2026 11:51:02 +0100 Subject: [PATCH 01/58] Update for 26.1.1 --- README.md | 2 +- advanced-achievements-plugin/pom.xml | 1 - .../src/main/resources/plugin.yml | 2 +- pom.xml | 12 ++++-------- 4 files changed, 6 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 11926e74..caec4288 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ Custom fork for Minecraft server 1MoreBlock.com -Recent changes include java 21+, 1.21.11, and legacy color code fixes. +Recent changes include java 25+, 26.1.1, and legacy color code fixes. **Advanced Achievements enables unique and challenging achievements on Minecraft servers. Collect as many as you can, earn rewards, climb the rankings and receive RP books! The plugin supports SQLite, MySQL, H2 and PostgreSQL, manages an diff --git a/advanced-achievements-plugin/pom.xml b/advanced-achievements-plugin/pom.xml index 60fd3a1c..6860e3a0 100644 --- a/advanced-achievements-plugin/pom.xml +++ b/advanced-achievements-plugin/pom.xml @@ -52,7 +52,6 @@ petmaster provided - com.github.Zrips CMI-API diff --git a/advanced-achievements-plugin/src/main/resources/plugin.yml b/advanced-achievements-plugin/src/main/resources/plugin.yml index 79310d0d..2193ee22 100644 --- a/advanced-achievements-plugin/src/main/resources/plugin.yml +++ b/advanced-achievements-plugin/src/main/resources/plugin.yml @@ -5,7 +5,7 @@ author: DarkPyves, Greymagic27 softdepend: [ CMI,Essentials,Jobs,PetMaster,PlaceholderAPI,Vault ] description: Advanced Achievements enables unique and challenging achievements. Try to collect as many as you can, earn rewards, climb the rankings and receive RP books! website: https://github.com/mrfdev/advanced-achievements -api-version: 1.21.11 +api-version: 26.1.1 commands: aach: description: Main Advanced Achievements command, use it to list sub-commands. diff --git a/pom.xml b/pom.xml index 311f2f4a..f5ee5455 100644 --- a/pom.xml +++ b/pom.xml @@ -14,8 +14,8 @@ UTF-8 - 21 - 7.3.9 + 25 + 7.4.0 5.23.0 6.0.3 2.59.2 @@ -63,7 +63,7 @@ io.papermc.paper paper-api - 1.21.11-R0.1-SNAPSHOT + 26.1.1.build.14-alpha provided @@ -84,7 +84,6 @@ v5.2.6.2 provided - com.github.Zrips CMI-API @@ -226,10 +225,7 @@ io.github.greymagic27 McTestServer - 1.0.5 - - true - + 1.0.6 From 5018660742d3cd58a0c1397e9edba8fef2fb1c5d Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Sat, 4 Apr 2026 11:53:18 +0100 Subject: [PATCH 02/58] Update workflow to Java 25 --- .github/workflows/maven.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 8262a098..28525081 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -11,10 +11,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6.0.2 - - name: Set up JDK 21 + - name: Set up JDK 25 uses: actions/setup-java@v5.2.0 with: - java-version: '21' + java-version: '25' distribution: 'microsoft' cache: maven - name: Build with Maven From 849fff15da984762eab1e3df1ec00208c6e61098 Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Sat, 4 Apr 2026 11:56:55 +0100 Subject: [PATCH 03/58] Minor updates --- .../command/external/CommandUtils.java | 2 +- .../listener/statistics/CraftsListener.java | 25 +++++++++++-------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/external/CommandUtils.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/external/CommandUtils.java index 494dde80..850640fc 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/external/CommandUtils.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/external/CommandUtils.java @@ -526,7 +526,7 @@ private static int getInt(@NonNull String arg) { } public static @NonNull String getString(@NonNull String arg) { - return arg.split("=")[1].replaceAll("!", ""); + return arg.split("=")[1].replace("!", ""); } private static boolean isLessThan(String arg, double value) { diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/statistics/CraftsListener.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/statistics/CraftsListener.java index 1744f9c0..09bee2b5 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/statistics/CraftsListener.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/statistics/CraftsListener.java @@ -64,16 +64,7 @@ public void onCraftItem(@NonNull CraftItemEvent event) { int eventAmount = item.getAmount(); if (event.isShiftClick()) { - int maxAmount = event.getInventory().getMaxStackSize(); - ItemStack[] matrix = event.getInventory().getMatrix(); - for (ItemStack itemStack : matrix) { - if (itemStack != null && itemStack.getType() != Material.AIR) { - int itemStackAmount = itemStack.getAmount(); - if (itemStackAmount < maxAmount && itemStackAmount > 0) { - maxAmount = itemStackAmount; - } - } - } + int maxAmount = getMaxAmount(event); eventAmount *= maxAmount; eventAmount = Math.min(eventAmount, InventoryHelper.getAvailableSpace(player, item)); if (eventAmount == 0) { @@ -84,6 +75,20 @@ public void onCraftItem(@NonNull CraftItemEvent event) { updateStatisticAndAwardAchievementsIfAvailable(player, subcategories, eventAmount); } + private static int getMaxAmount(@NonNull CraftItemEvent event) { + int maxAmount = event.getInventory().getMaxStackSize(); + ItemStack[] matrix = event.getInventory().getMatrix(); + for (ItemStack itemStack : matrix) { + if (itemStack != null && itemStack.getType() != Material.AIR) { + int itemStackAmount = itemStack.getAmount(); + if (itemStackAmount < maxAmount && itemStackAmount > 0) { + maxAmount = itemStackAmount; + } + } + } + return maxAmount; + } + /** * Metal blocks can be used for repeated crafts of ingots (e.g. iron block -> 9 iron ingots -> iron block -> ...). * Detect and prevent this. From c6003004318a6ebc918b12beadb4c65182025ee5 Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Sun, 5 Apr 2026 19:23:27 +0100 Subject: [PATCH 04/58] Bump paper version --- pom.xml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f5ee5455..14341f7f 100644 --- a/pom.xml +++ b/pom.xml @@ -63,7 +63,7 @@ io.papermc.paper paper-api - 26.1.1.build.14-alpha + 26.1.1.build.20-alpha provided @@ -227,6 +227,11 @@ McTestServer 1.0.6 + + org.apache.maven.plugins + maven-dependency-plugin + 3.10.0 + \ No newline at end of file From 2f2c9cde462503f1c0c88751534bbf8a34d09f8b Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Sat, 11 Apr 2026 10:23:25 +0100 Subject: [PATCH 05/58] Bump paper --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 14341f7f..17e3d023 100644 --- a/pom.xml +++ b/pom.xml @@ -63,7 +63,7 @@ io.papermc.paper paper-api - 26.1.1.build.20-alpha + 26.1.1.build.29-alpha provided From d6b35300e0f99bd8953df6b84b23154f07a8e4d6 Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Sat, 11 Apr 2026 13:55:54 +0100 Subject: [PATCH 06/58] Change how plugin is named --- advanced-achievements-plugin/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/advanced-achievements-plugin/pom.xml b/advanced-achievements-plugin/pom.xml index 6860e3a0..f58fda14 100644 --- a/advanced-achievements-plugin/pom.xml +++ b/advanced-achievements-plugin/pom.xml @@ -162,7 +162,7 @@ - advanced-achievements-plugin-${project.version} + advanced-achievements-${project.version} true false ${project.build.directory}/${project.build.finalName}.jar From fa3520b75faea171d3a56689fef81b8918a862b0 Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Sat, 11 Apr 2026 14:01:51 +0100 Subject: [PATCH 07/58] Update for 26.1.2 --- README.md | 2 +- advanced-achievements-plugin/src/main/resources/plugin.yml | 2 +- pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index caec4288..b0a27f91 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ Custom fork for Minecraft server 1MoreBlock.com -Recent changes include java 25+, 26.1.1, and legacy color code fixes. +Recent changes include java 25+, 26.1.2, and legacy color code fixes. **Advanced Achievements enables unique and challenging achievements on Minecraft servers. Collect as many as you can, earn rewards, climb the rankings and receive RP books! The plugin supports SQLite, MySQL, H2 and PostgreSQL, manages an diff --git a/advanced-achievements-plugin/src/main/resources/plugin.yml b/advanced-achievements-plugin/src/main/resources/plugin.yml index 2193ee22..0f0f0720 100644 --- a/advanced-achievements-plugin/src/main/resources/plugin.yml +++ b/advanced-achievements-plugin/src/main/resources/plugin.yml @@ -5,7 +5,7 @@ author: DarkPyves, Greymagic27 softdepend: [ CMI,Essentials,Jobs,PetMaster,PlaceholderAPI,Vault ] description: Advanced Achievements enables unique and challenging achievements. Try to collect as many as you can, earn rewards, climb the rankings and receive RP books! website: https://github.com/mrfdev/advanced-achievements -api-version: 26.1.1 +api-version: 26.1.2 commands: aach: description: Main Advanced Achievements command, use it to list sub-commands. diff --git a/pom.xml b/pom.xml index 17e3d023..09a3d7fb 100644 --- a/pom.xml +++ b/pom.xml @@ -63,7 +63,7 @@ io.papermc.paper paper-api - 26.1.1.build.29-alpha + 26.1.2.build.2-alpha provided From 5ae4033ba00d1506bfcc4900f9fee7d597214acd Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Sat, 11 Apr 2026 14:03:18 +0100 Subject: [PATCH 08/58] Mass format --- CONTRIBUTING.md | 3 +- .../db/AbstractDatabaseManager.java | 4 +-- .../listener/statistics/CraftsListener.java | 28 +++++++++---------- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 46cb527b..f64f1be8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -3,7 +3,8 @@ Found a problem or need some help? The following steps may help: 1. Upgrade to the latest version of the plugin ( - available [here](https://www.spigotmc.org/resources/advancedachievements.121486/history)) and a recent Paper build for + available [here](https://www.spigotmc.org/resources/advancedachievements.121486/history)) and a recent Paper build + for your Minecraft version (see [here](https://docs.papermc.io/paper/getting-started)). 2. Check your server's logs (including when plugins are loaded!), there may be warnings/errors/stack straces to help you out with your issue. diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/db/AbstractDatabaseManager.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/db/AbstractDatabaseManager.java index 2346cb72..a462fcba 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/db/AbstractDatabaseManager.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/db/AbstractDatabaseManager.java @@ -253,9 +253,9 @@ public Map getTopList(long start) { // Either consider all the achievements or only those received after the start date. String sql = start == 0L ? "SELECT playername, COUNT(*) FROM " + prefix - + "achievements GROUP BY playername ORDER BY COUNT(*) DESC" + + "achievements GROUP BY playername ORDER BY COUNT(*) DESC" : "SELECT playername, COUNT(*) FROM " + prefix - + "achievements WHERE date > ? GROUP BY playername ORDER BY COUNT(*) DESC"; + + "achievements WHERE date > ? GROUP BY playername ORDER BY COUNT(*) DESC"; Map topList = new LinkedHashMap<>(); try (PreparedStatement ps = getConnection().prepareStatement(sql)) { if (start > 0L) { diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/statistics/CraftsListener.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/statistics/CraftsListener.java index 09bee2b5..a653df87 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/statistics/CraftsListener.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/statistics/CraftsListener.java @@ -41,6 +41,20 @@ public CraftsListener(@Named("main") YamlConfiguration mainConfig, AchievementMa super(MultipleAchievements.CRAFTS, mainConfig, achievementMap, cacheManager); } + private static int getMaxAmount(@NonNull CraftItemEvent event) { + int maxAmount = event.getInventory().getMaxStackSize(); + ItemStack[] matrix = event.getInventory().getMatrix(); + for (ItemStack itemStack : matrix) { + if (itemStack != null && itemStack.getType() != Material.AIR) { + int itemStackAmount = itemStack.getAmount(); + if (itemStackAmount < maxAmount && itemStackAmount > 0) { + maxAmount = itemStackAmount; + } + } + } + return maxAmount; + } + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onCraftItem(@NonNull CraftItemEvent event) { if (!(event.getWhoClicked() instanceof Player player) || event.getAction() == InventoryAction.NOTHING @@ -75,20 +89,6 @@ public void onCraftItem(@NonNull CraftItemEvent event) { updateStatisticAndAwardAchievementsIfAvailable(player, subcategories, eventAmount); } - private static int getMaxAmount(@NonNull CraftItemEvent event) { - int maxAmount = event.getInventory().getMaxStackSize(); - ItemStack[] matrix = event.getInventory().getMatrix(); - for (ItemStack itemStack : matrix) { - if (itemStack != null && itemStack.getType() != Material.AIR) { - int itemStackAmount = itemStack.getAmount(); - if (itemStackAmount < maxAmount && itemStackAmount > 0) { - maxAmount = itemStackAmount; - } - } - } - return maxAmount; - } - /** * Metal blocks can be used for repeated crafts of ingots (e.g. iron block -> 9 iron ingots -> iron block -> ...). * Detect and prevent this. From 11d9a06649a6aec4f096e5087636b8f2c06f040e Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Sat, 11 Apr 2026 16:19:18 +0100 Subject: [PATCH 09/58] Convert to Adventure rather than ChatColor --- advanced-achievements-plugin/pom.xml | 4 + .../command/executable/AbstractCommand.java | 7 +- .../executable/AbstractRankingCommand.java | 25 +-- .../command/executable/BookCommand.java | 84 ++------ .../command/executable/HelpCommand.java | 198 ++++++++---------- .../config/ConfigurationParser.java | 11 +- .../PlayerAdvancedAchievementListener.java | 27 +-- .../com/hm/achievement/utils/ColorHelper.java | 36 ++-- .../achievement/utils/FancyMessageSender.java | 47 +---- .../src/main/resources/config.yml | 4 +- pom.xml | 2 +- 11 files changed, 172 insertions(+), 273 deletions(-) diff --git a/advanced-achievements-plugin/pom.xml b/advanced-achievements-plugin/pom.xml index f58fda14..78abc183 100644 --- a/advanced-achievements-plugin/pom.xml +++ b/advanced-achievements-plugin/pom.xml @@ -196,6 +196,10 @@ com.hm.fasterxml.jackson + + + + package diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractCommand.java index 90be2012..39ad15bf 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractCommand.java @@ -1,7 +1,8 @@ package com.hm.achievement.command.executable; import com.hm.achievement.lifecycle.Reloadable; -import org.bukkit.ChatColor; +import net.kyori.adventure.text.TextComponent; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.YamlConfiguration; @@ -53,7 +54,7 @@ public void execute(CommandSender sender, String[] args) { */ abstract void onExecute(CommandSender sender, String[] args); - String translateColorCodes(String translate) { - return ChatColor.translateAlternateColorCodes('&', translate); + TextComponent translateColorCodes(String translate) { + return LegacyComponentSerializer.legacyAmpersand().deserialize(translate); } } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractRankingCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractRankingCommand.java index c28bf8c7..56528cb7 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractRankingCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractRankingCommand.java @@ -2,6 +2,7 @@ import com.hm.achievement.command.pagination.CommandPagination; import com.hm.achievement.db.AbstractDatabaseManager; +import com.hm.achievement.utils.ColorHelper; import com.hm.achievement.utils.SoundPlayer; import com.hm.achievement.utils.StringHelper; import java.util.ArrayList; @@ -11,9 +12,9 @@ import java.util.Objects; import java.util.UUID; import java.util.logging.Logger; +import net.kyori.adventure.text.format.NamedTextColor; import org.apache.commons.lang3.math.NumberUtils; import org.bukkit.Bukkit; -import org.bukkit.ChatColor; import org.bukkit.Particle; import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.YamlConfiguration; @@ -39,7 +40,7 @@ public abstract class AbstractRankingCommand extends AbstractCommand { private final AbstractDatabaseManager databaseManager; private final SoundPlayer soundPlayer; - private ChatColor configColor; + private NamedTextColor configColor; private int configTopList; private boolean configAdditionalEffects; private boolean configSound; @@ -52,8 +53,7 @@ public abstract class AbstractRankingCommand extends AbstractCommand { private List cachedAchievementCounts; private long lastCacheUpdate = 0L; - AbstractRankingCommand(YamlConfiguration mainConfig, YamlConfiguration langConfig, StringBuilder pluginHeader, - Logger logger, String languageKey, AbstractDatabaseManager databaseManager, SoundPlayer soundPlayer) { + AbstractRankingCommand(YamlConfiguration mainConfig, YamlConfiguration langConfig, StringBuilder pluginHeader, Logger logger, String languageKey, AbstractDatabaseManager databaseManager, SoundPlayer soundPlayer) { super(mainConfig, langConfig, pluginHeader); this.logger = logger; this.languageKey = languageKey; @@ -64,8 +64,7 @@ public abstract class AbstractRankingCommand extends AbstractCommand { @Override public void extractConfigurationParameters() { super.extractConfigurationParameters(); - - configColor = ChatColor.getByChar(Objects.requireNonNull(mainConfig.getString("Color"))); + configColor = ColorHelper.configColor(); configTopList = mainConfig.getInt("TopList"); configAdditionalEffects = mainConfig.getBoolean("AdditionalEffects"); configSound = mainConfig.getBoolean("Sound"); @@ -110,8 +109,7 @@ public void onExecute(CommandSender sender, String[] args) { if (playerRank <= configTopList) { launchEffects((Player) sender); } - sender.sendMessage( - langPlayerRank + playerRank + ChatColor.GRAY + "/" + configColor + cachedSortedRankings.size()); + sender.sendMessage(langPlayerRank + playerRank + NamedTextColor.GRAY + "/" + configColor + cachedSortedRankings.size()); } } } @@ -127,9 +125,8 @@ private List getRankingMessages(CommandSender sender) { String playerName = Bukkit.getOfflinePlayer(UUID.fromString(ranking.getKey())).getName(); if (playerName != null) { // Color the name of the player if he is in the top list. - ChatColor color = playerName.equals(sender.getName()) ? configColor : ChatColor.GRAY; - rankingMessages.add(color + " " + getRankingSymbol(currentRank) + " " + playerName + " - " - + ranking.getValue()); + NamedTextColor color = playerName.equals(sender.getName()) ? configColor : NamedTextColor.GRAY; + rankingMessages.add(color + " " + getRankingSymbol(currentRank) + " " + playerName + " - " + ranking.getValue()); } else { logger.warning("Ranking command: could not find player's name using a database UUID."); } @@ -145,8 +142,8 @@ private List getRankingMessages(CommandSender sender) { /** * Returns a UTF-8 circled number based on the player's rank. * - * @param rank - * @return an UTF-8 string corresponding to the rank + * @param rank rank + * @return a UTF-8 string corresponding to the rank */ private String getRankingSymbol(int rank) { int decimalRankSymbol; @@ -172,7 +169,7 @@ private String getRankingSymbol(int rank) { /** * Launches sound and particle effects if player is in a top list. * - * @param player + * @param player player */ private void launchEffects(Player player) { if (configAdditionalEffects) { diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/BookCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/BookCommand.java index 11134734..383f826f 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/BookCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/BookCommand.java @@ -9,8 +9,6 @@ import jakarta.inject.Inject; import jakarta.inject.Named; import jakarta.inject.Singleton; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; import java.text.DateFormat; import java.util.ArrayList; import java.util.Collections; @@ -19,10 +17,10 @@ import java.util.Locale; import java.util.Objects; import java.util.UUID; -import java.util.logging.Logger; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TextComponent; +import net.kyori.adventure.text.format.NamedTextColor; import org.apache.commons.lang3.StringUtils; -import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.Particle; import org.bukkit.command.CommandSender; @@ -30,6 +28,7 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.BookMeta; +import org.jspecify.annotations.NonNull; /** * Class in charge of handling the /aach book command, which creates and gives a @@ -42,19 +41,9 @@ @CommandSpec(name = "book", permission = "book", minArgs = 1, maxArgs = 1) public class BookCommand extends AbstractCommand implements Cleanable { - // Strings related to Reflection. - private static final String PACKAGE_INVENTORY = "inventory"; - private static final String PACKAGE_UTIL = "util"; - private static final String CLASS_CRAFT_META_BOOK = "CraftMetaBook"; - private static final String CLASS_CRAFT_CHAT_MESSAGE = "CraftChatMessage"; - private static final String FIELD_PAGES = "pages"; - private static final String METHOD_FROM_STRING = "fromString"; - // Corresponds to times at which players have received their books. Cooldown // structure. private final HashMap playersBookTime = new HashMap<>(); - private final Logger logger; - private final int serverVersion; private final AbstractDatabaseManager databaseManager; private final SoundPlayer soundPlayer; private final AchievementMap achievementMap; @@ -66,16 +55,14 @@ public class BookCommand extends AbstractCommand implements Cleanable { private String configSoundBook; private String langBookDelay; private String langBookNotReceived; - private String langBookDate; + private TextComponent langBookDate; private String langBookName; private String langBookReceived; private DateFormat dateFormat; @Inject - public BookCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, StringBuilder pluginHeader, Logger logger, int serverVersion, AbstractDatabaseManager databaseManager, SoundPlayer soundPlayer, AchievementMap achievementMap) { + public BookCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, StringBuilder pluginHeader, AbstractDatabaseManager databaseManager, SoundPlayer soundPlayer, AchievementMap achievementMap) { super(mainConfig, langConfig, pluginHeader); - this.logger = logger; - this.serverVersion = serverVersion; this.databaseManager = databaseManager; this.soundPlayer = soundPlayer; this.achievementMap = achievementMap; @@ -92,7 +79,7 @@ public void extractConfigurationParameters() { configSoundBook = Objects.requireNonNull(mainConfig.getString("SoundBook")).toUpperCase(); langBookDelay = pluginHeader + StringUtils.replaceEach(langConfig.getString("book-delay"), new String[]{"TIME"}, new String[]{Integer.toString(configTimeBook / 1000)}); langBookNotReceived = pluginHeader + langConfig.getString("book-not-received"); - langBookDate = translateColorCodes("&8" + langConfig.getString("book-date")); + langBookDate = translateColorCodes(langConfig.getString("book-date")).colorIfAbsent(NamedTextColor.DARK_GRAY); langBookName = langConfig.getString("book-name"); langBookReceived = pluginHeader + langConfig.getString("book-received"); @@ -137,29 +124,27 @@ void onExecute(CommandSender sender, String[] args) { /** * Constructs the pages of a book. * - * @param achievements - * @param player + * @param achievements achievements + * @param player player */ - private void fillBook(List achievements, Player player) { + private void fillBook(@NonNull List achievements, Player player) { ItemStack book = new ItemStack(Material.WRITTEN_BOOK); - List bookPages = new ArrayList<>(achievements.size()); + List bookPages = new ArrayList<>(achievements.size()); BookMeta bookMeta = (BookMeta) book.getItemMeta(); - for (AwardedDBAchievement awardedAchievement : achievements) { Achievement achievement = achievementMap.getForName(awardedAchievement.name()); if (achievement != null) { String currentAchievement = "&0" + achievement.getDisplayName() + configBookSeparator + achievement.getMessage() + configBookSeparator + awardedAchievement.formattedDate(); - currentAchievement = translateColorCodes(currentAchievement); - bookPages.add(currentAchievement); + bookPages.add(translateColorCodes(currentAchievement)); } } // Set the pages and other elements of the book (author, title and date of // reception). - setBookPages(bookPages, bookMeta); + bookMeta.addPages(bookPages.toArray(new Component[0])); bookMeta.setAuthor(player.getName()); bookMeta.setTitle(langBookName); - bookMeta.lore(Collections.singletonList(Component.text(StringUtils.replaceEach(langBookDate, new String[]{"DATE"}, new String[]{dateFormat.format(System.currentTimeMillis())})))); + bookMeta.lore(Collections.singletonList(Component.text(StringUtils.replaceEach(String.valueOf(langBookDate), new String[]{"DATE"}, new String[]{dateFormat.format(System.currentTimeMillis())})))); book.setItemMeta(bookMeta); // Check whether player has room in his inventory, else drop book on the ground. @@ -175,10 +160,10 @@ private void fillBook(List achievements, Player player) { * Checks if player hasn't done a command too recently (with "too recently" * being defined in configuration file). * - * @param player + * @param player player * @return whether a player is authorised to perform the list command */ - private boolean isInCooldownPeriod(Player player) { + private boolean isInCooldownPeriod(@NonNull Player player) { // Player bypasses cooldown if he has full plugin permissions. if (player.hasPermission("achievement.*") || configTimeBook == 0) { return false; @@ -191,41 +176,4 @@ private boolean isInCooldownPeriod(Player player) { } return true; } - - /** - * Adds pages to the BookMeta. A Spigot commit in the late days of Minecraft - * 1.11.2 started enforcing extremely low - * limits (why? If it's not broken, don't fix it.), with books limited in page - * size and total number of pages, as - * well as title length. This function bypasses such limits and restores the - * original CraftBukkit behaviour. See - * ... - * for more information. - * - * @param bookPages - * @param bookMeta - */ - @SuppressWarnings({"unchecked", "deprecation"}) - private void setBookPages(List bookPages, BookMeta bookMeta) { - if (serverVersion <= 15) { - try { - // Code we're trying to execute: - // this.pages.add(CraftChatMessage.fromString(page, true)[0]); in - // CraftMetaBook.java. - String versionIdentifier = Bukkit.getServer().getClass().getPackage().getName().substring(23); - Class craftMetaBookClass = Class.forName("org.bukkit.craftbukkit." + versionIdentifier + "." + PACKAGE_INVENTORY + "." + CLASS_CRAFT_META_BOOK); - List pages = (List) craftMetaBookClass.getField(FIELD_PAGES).get(craftMetaBookClass.cast(bookMeta)); - Method fromStringMethod = Class.forName("org.bukkit.craftbukkit." + versionIdentifier + "." + PACKAGE_UTIL + "." + CLASS_CRAFT_CHAT_MESSAGE).getMethod(METHOD_FROM_STRING, String.class, boolean.class); - for (String bookPage : bookPages) { - pages.add(((Object[]) fromStringMethod.invoke(null, bookPage, true))[0]); - } - } catch (ClassNotFoundException | InvocationTargetException | SecurityException | NoSuchMethodException | - NoSuchFieldException | IllegalArgumentException | IllegalAccessException e) { - logger.warning("Error while creating book pages. Your achievements book may be trimmed down to 50 pages."); - bookMeta.setPages(bookPages); - } - } else { - bookMeta.setPages(bookPages); - } - } -} +} \ No newline at end of file diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/HelpCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/HelpCommand.java index 85f779b1..ad10e608 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/HelpCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/HelpCommand.java @@ -1,12 +1,17 @@ package com.hm.achievement.command.executable; +import com.hm.achievement.utils.ColorHelper; import com.hm.achievement.utils.FancyMessageSender; import com.hm.achievement.utils.StringHelper; import jakarta.inject.Inject; import jakarta.inject.Named; import jakarta.inject.Singleton; import java.util.Objects; -import org.bukkit.ChatColor; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TextComponent; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.TextDecoration; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; @@ -23,44 +28,44 @@ public class HelpCommand extends AbstractCommand { private final FancyMessageSender fancyMessageSender; - private ChatColor configColor; + private NamedTextColor configColor; private String configIcon; - private String langCommandList; - private String langCommandListHover; - private String langCommandTop; - private String langCommandTopHover; - private String langCommandInfo; - private String langCommandInfoHover; - private String langCommandBook; - private String langCommandBookHover; - private String langCommandWeek; - private String langCommandWeekHover; - private String langCommandStats; - private String langCommandStatsHover; - private String langCommandMonth; - private String langCommandMonthHover; - private String langCommandToggleHover; - private String langCommandToggle; - private String langCommandReload; - private String langCommandReloadHover; - private String langCommandGenerate; - private String langCommandGenerateHover; - private String langCommandInspect; - private String langCommandInspectHover; - private String langCommandGive; - private String langCommandGiveHover; - private String langCommandAdd; - private String langCommandAddHover; - private String langCommandReset; - private String langCommandResetHover; - private String langCommandCheck; - private String langCommandCheckHover; - private String langCommandDelete; - private String langCommandDeleteHover; - private String langCommandGrant; - private String langCommandGrantHover; - private String langTip; + private TextComponent langCommandList; + private TextComponent langCommandListHover; + private TextComponent langCommandTop; + private TextComponent langCommandTopHover; + private TextComponent langCommandInfo; + private TextComponent langCommandInfoHover; + private TextComponent langCommandBook; + private TextComponent langCommandBookHover; + private TextComponent langCommandWeek; + private TextComponent langCommandWeekHover; + private TextComponent langCommandStats; + private TextComponent langCommandStatsHover; + private TextComponent langCommandMonth; + private TextComponent langCommandMonthHover; + private TextComponent langCommandToggleHover; + private TextComponent langCommandToggle; + private TextComponent langCommandReload; + private TextComponent langCommandReloadHover; + private TextComponent langCommandGenerate; + private TextComponent langCommandGenerateHover; + private TextComponent langCommandInspect; + private TextComponent langCommandInspectHover; + private TextComponent langCommandGive; + private TextComponent langCommandGiveHover; + private TextComponent langCommandAdd; + private TextComponent langCommandAddHover; + private TextComponent langCommandReset; + private TextComponent langCommandResetHover; + private TextComponent langCommandCheck; + private TextComponent langCommandCheckHover; + private TextComponent langCommandDelete; + private TextComponent langCommandDeleteHover; + private TextComponent langCommandGrant; + private TextComponent langCommandGrantHover; + private TextComponent langTip; @Inject public HelpCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, StringBuilder pluginHeader, FancyMessageSender fancyMessageSender) { @@ -72,125 +77,107 @@ public HelpCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") Y public void extractConfigurationParameters() { super.extractConfigurationParameters(); - configColor = ChatColor.getByChar(Objects.requireNonNull(mainConfig.getString("Color"))); + String colorValue = mainConfig.getString("Color", "DARK_PURPLE"); + configColor = ColorHelper.configColor(); configIcon = StringHelper.unescapeJava(mainConfig.getString("Icon")); - langCommandList = header("/aach list") + langConfig.getString("aach-command-list"); - langCommandListHover = langConfig.getString("aach-command-list-hover"); - langCommandTop = header("/aach top") + langConfig.getString("aach-command-top"); - langCommandTopHover = langConfig.getString("aach-command-top-hover"); - langCommandInfo = header("/aach info") + langConfig.getString("aach-command-info"); - langCommandInfoHover = langConfig.getString("aach-command-info-hover"); - langCommandBook = header("/aach book") + langConfig.getString("aach-command-book"); - langCommandBookHover = langConfig.getString("aach-command-book-hover"); - langCommandWeek = header("/aach week") + langConfig.getString("aach-command-week"); - langCommandWeekHover = langConfig.getString("aach-command-week-hover"); - langCommandStats = header("/aach stats") + langConfig.getString("aach-command-stats"); - langCommandStatsHover = langConfig.getString("aach-command-stats-hover"); - langCommandMonth = header("/aach month") + langConfig.getString("aach-command-month"); - langCommandMonthHover = langConfig.getString("aach-command-month-hover"); - langCommandToggle = header("/aach toggle") + langConfig.getString("aach-command-toggle"); - langCommandToggleHover = langConfig.getString("aach-command-toggle-hover"); - langCommandReload = header("/aach reload") + langConfig.getString("aach-command-reload"); - langCommandReloadHover = langConfig.getString("aach-command-reload-hover"); - langCommandGenerate = header("/aach generate") + langConfig.getString("aach-command-generate"); - langCommandGenerateHover = langConfig.getString("aach-command-generate-hover"); - langCommandGive = header("/aach give player") + langConfig.getString("aach-command-give"); - langCommandInspect = header("/aach inspect") + langConfig.getString("aach-command-inspect"); - langCommandInspectHover = langConfig.getString("aach-command-inspect-hover"); - langCommandGiveHover = langConfig.getString("aach-command-give-hover"); - langCommandAdd = header("/aach add 1 cat player") + langConfig.getString("aach-command-add"); - langCommandAddHover = langConfig.getString("aach-command-add-hover"); - langCommandReset = header("/aach reset cat player") + langConfig.getString("aach-command-reset"); - langCommandResetHover = langConfig.getString("aach-command-reset-hover"); - langCommandCheck = header("/aach check cat player") + langConfig.getString("aach-command-check"); - langCommandCheckHover = langConfig.getString("aach-command-check-hover"); - langCommandDelete = header("/aach delete cat player") + langConfig.getString("aach-command-delete"); - langCommandDeleteHover = langConfig.getString("aach-command-delete-hover"); - langCommandGrant = header("/aach grant cat player") + langConfig.getString("aach-command-grant"); - langCommandGrantHover = langConfig.getString("aach-command-grant-hover"); - - langTip = ChatColor.GRAY + translateColorCodes(langConfig.getString("aach-tip")); + langCommandList = header("/aach list").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-list")))); + langCommandListHover = Component.text(Objects.requireNonNull(langConfig.getString("aach-command-list-hover"))); + langCommandTop = header("/aach top").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-top")))); + langCommandTopHover =Component.text(Objects.requireNonNull(langConfig.getString("aach-command-top-hover"))); + langCommandInfo = header("/aach info").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-info")))); + langCommandInfoHover = Component.text(Objects.requireNonNull(langConfig.getString("aach-command-info-hover"))); + langCommandBook = header("/aach book").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-book")))); + langCommandBookHover = Component.text(Objects.requireNonNull(langConfig.getString("aach-command-book-hover"))); + langCommandWeek = header("/aach week").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-week")))); + langCommandWeekHover = Component.text(Objects.requireNonNull(langConfig.getString("aach-command-week-hover"))); + langCommandStats = header("/aach stats").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-stats")))); + langCommandStatsHover = Component.text(Objects.requireNonNull(langConfig.getString("aach-command-stats-hover"))); + langCommandMonth = header("/aach month").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-month")))); + langCommandMonthHover = Component.text(Objects.requireNonNull(langConfig.getString("aach-command-month-hover"))); + langCommandToggle = header("/aach toggle").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-toggle")))); + langCommandToggleHover = Component.text(Objects.requireNonNull(langConfig.getString("aach-command-toggle-hover"))); + langCommandReload = header("/aach reload").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-reload")))); + langCommandReloadHover = Component.text(Objects.requireNonNull(langConfig.getString("aach-command-reload-hover"))); + langCommandGenerate = header("/aach generate").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-generate")))); + langCommandGenerateHover = Component.text(Objects.requireNonNull(langConfig.getString("aach-command-generate-hover"))); + langCommandInspect = header("/aach inspect").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-inspect")))); + langCommandInspectHover = Component.text(Objects.requireNonNull(langConfig.getString("aach-command-inspect-hover"))); + langCommandGive = header("/aach give player").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-give")))); + langCommandGiveHover = Component.text(Objects.requireNonNull(langConfig.getString("aach-command-give-hover"))); + langCommandAdd = header("/aach add 1 cat player").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-add")))); + langCommandAddHover = Component.text(Objects.requireNonNull(Objects.requireNonNull(langConfig.getString("aach-command-add-hover")))); + langCommandReset = header("/aach reset cat player").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-reset")))); + langCommandResetHover = Component.text(Objects.requireNonNull(langConfig.getString("aach-command-reset-hover"))); + langCommandCheck = header("/aach check cat player").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-check")))); + langCommandCheckHover = Component.text(Objects.requireNonNull(langConfig.getString("aach-command-check-hover"))); + langCommandDelete = header("/aach delete cat player").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-delete")))); + langCommandDeleteHover = Component.text(Objects.requireNonNull(langConfig.getString("aach-command-delete-hover"))); + langCommandGrant = header("/aach grant cat player").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-grant")))); + langCommandGrantHover = Component.text(Objects.requireNonNull(langConfig.getString("aach-command-grant-hover"))); + + langTip = translateColorCodes(langConfig.getString("aach-tip")).colorIfAbsent(NamedTextColor.GRAY); } - private @NonNull String header(String command) { - return pluginHeader.toString() + configColor + command + ChatColor.GRAY + " > "; + private @NonNull TextComponent header(String command) { + return Component.text().append(LegacyComponentSerializer.legacySection().deserialize(pluginHeader.toString())).append(Component.text(command, configColor)).append(Component.text(" > ", NamedTextColor.GRAY)).build(); } @Override void onExecute(@NonNull CommandSender sender, String[] args) { - // Header. - sender.sendMessage(configColor + "------------ " + configIcon + translateColorCodes(" &lAdvanced Achievements ") + configColor + configIcon + configColor + " ------------"); + sender.sendMessage(Component.text().append(Component.text("------------ " + configIcon + " ", configColor)).append(Component.text("Advanced Achievements", configColor).decorate(TextDecoration.BOLD)).append(Component.text(" " + configIcon + " ------------", configColor)).build()); if (sender.hasPermission("achievement.list")) { sendJsonClickableHoverableMessage(sender, langCommandList, "/aach list", langCommandListHover); } - if (sender.hasPermission("achievement.top")) { sendJsonClickableHoverableMessage(sender, langCommandTop, "/aach top", langCommandTopHover); } - sendJsonClickableHoverableMessage(sender, langCommandInfo, "/aach info", langCommandInfoHover); - if (sender.hasPermission("achievement.book")) { sendJsonClickableHoverableMessage(sender, langCommandBook, "/aach book", langCommandBookHover); } - if (sender.hasPermission("achievement.week")) { sendJsonClickableHoverableMessage(sender, langCommandWeek, "/aach week", langCommandWeekHover); } - if (sender.hasPermission("achievement.stats")) { sendJsonClickableHoverableMessage(sender, langCommandStats, "/aach stats", langCommandStatsHover); } - if (sender.hasPermission("achievement.month")) { sendJsonClickableHoverableMessage(sender, langCommandMonth, "/aach month", langCommandMonthHover); } - if (sender.hasPermission("achievement.toggle")) { sendJsonClickableHoverableMessage(sender, langCommandToggle, "/aach toggle", langCommandToggleHover); } - if (sender.hasPermission("achievement.reload")) { sendJsonClickableHoverableMessage(sender, langCommandReload, "/aach reload", langCommandReloadHover); } - if (sender.hasPermission("achievement.generate")) { sendJsonClickableHoverableMessage(sender, langCommandGenerate, "/aach generate", langCommandGenerateHover); } - if (sender.hasPermission("achievement.inspect")) { sendJsonClickableHoverableMessage(sender, langCommandInspect, "/aach inspect ach", langCommandInspectHover); } - if (sender.hasPermission("achievement.give")) { sendJsonClickableHoverableMessage(sender, langCommandGive, "/aach give ach name", langCommandGiveHover); } - if (sender.hasPermission("achievement.add")) { sendJsonClickableHoverableMessage(sender, langCommandAdd, "/aach add x cat name", langCommandAddHover); } - if (sender.hasPermission("achievement.reset")) { sendJsonClickableHoverableMessage(sender, langCommandReset, "/aach reset cat name", langCommandResetHover); } - if (sender.hasPermission("achievement.check")) { sendJsonClickableHoverableMessage(sender, langCommandCheck, "/aach check ach name", langCommandCheckHover); } - if (sender.hasPermission("achievement.delete")) { sendJsonClickableHoverableMessage(sender, langCommandDelete, "/aach delete ach name", langCommandDeleteHover); } - if (sender.hasPermission("achievement.grant")) { sendJsonClickableHoverableMessage(sender, langCommandGrant, "/aach grant ach name", langCommandGrantHover); } - // Empty line. - sender.sendMessage(configColor + " "); - + sender.sendMessage(Component.text(" ")); sender.sendMessage(langTip); } @@ -198,17 +185,16 @@ void onExecute(@NonNull CommandSender sender, String[] args) { * Sends a packet message to the server in order to display a clickable and hoverable message. A suggested command * is displayed in the chat when clicked on, and an additional help message appears when a command is hovered. * - * @param sender - * @param message - * @param command - * @param hover + * @param sender sender + * @param message message + * @param command command + * @param hover hover */ - private void sendJsonClickableHoverableMessage(CommandSender sender, String message, String command, String hover) { - // Send clickable and hoverable message if sender is a player. - if (sender instanceof Player) { - fancyMessageSender.sendHoverableCommandMessage((Player) sender, message, command, hover, configColor.name().toLowerCase()); + private void sendJsonClickableHoverableMessage(CommandSender sender, TextComponent message, String command, TextComponent hover) { + if (sender instanceof Player player) { + fancyMessageSender.sendHoverableCommandMessage(player, message, command, hover); } else { sender.sendMessage(message); } } -} +} \ No newline at end of file diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/config/ConfigurationParser.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/config/ConfigurationParser.java index 4ccfe69a..05045a3b 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/config/ConfigurationParser.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/config/ConfigurationParser.java @@ -8,6 +8,7 @@ import com.hm.achievement.domain.Achievement; import com.hm.achievement.domain.Achievement.AchievementBuilder; import com.hm.achievement.exception.PluginLoadError; +import com.hm.achievement.utils.ColorHelper; import com.hm.achievement.utils.StringHelper; import jakarta.inject.Inject; import jakarta.inject.Named; @@ -25,10 +26,11 @@ import java.util.logging.Level; import java.util.logging.Logger; import java.util.stream.Collectors; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Strings; import org.bukkit.Bukkit; -import org.bukkit.ChatColor; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.InvalidConfigurationException; import org.bukkit.configuration.file.YamlConfiguration; @@ -79,6 +81,7 @@ public void loadAndParseConfiguration() throws PluginLoadError { backupAndLoadConfiguration("config.yml", "config.yml", mainConfig); backupAndLoadConfiguration("lang.yml", mainConfig.getString("LanguageFileName"), langConfig); backupAndLoadConfiguration("gui.yml", "gui.yml", guiConfig); + ColorHelper.setMainConfig(mainConfig); parseHeader(); parseDisabledCategories(); parseAchievements(); @@ -141,8 +144,10 @@ private void parseHeader() { pluginHeader.setLength(0); String icon = StringHelper.unescapeJava(mainConfig.getString("Icon")); if (StringUtils.isNotBlank(icon)) { - String coloredIcon = ChatColor.getByChar(Objects.requireNonNull(mainConfig.getString("Color"))) + icon; - pluginHeader.append(ChatColor.translateAlternateColorCodes('&', Objects.requireNonNull(Strings.CS.replace(mainConfig.getString("ChatHeader"), "%ICON%", coloredIcon)))).append(" "); + String coloredIcon = LegacyComponentSerializer.legacySection().serialize(Component.text(icon, ColorHelper.configColor())); + String rawHeader = Strings.CS.replace(mainConfig.getString("ChatHeader"), "%ICON%", coloredIcon); + Component header = LegacyComponentSerializer.legacyAmpersand().deserialize(Objects.requireNonNull(rawHeader)); + pluginHeader.append(LegacyComponentSerializer.legacySection().serialize(header)).append(" "); } pluginHeader.trimToSize(); } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java index 68bce30b..a3e295f9 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java @@ -27,8 +27,10 @@ import java.util.Random; import java.util.logging.Logger; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import net.kyori.adventure.title.Title; import org.apache.commons.lang3.EnumUtils; @@ -197,8 +199,8 @@ public void onPlayerAdvancedAchievementReception(@NonNull PlayerAdvancedAchievem * Displays chat messages, screen title and launches a firework when a player * receives an achievement. * - * @param player - * @param achievement + * @param player player + * @param achievement achievement */ private void displayAchievement(@NonNull Player player, @NonNull Achievement achievement) { logger.info("Player " + player.getName() + " received the achievement: " + achievement.getDisplayName()); @@ -248,23 +250,24 @@ private void displayAchievement(@NonNull Player player, @NonNull Achievement ach * can display a single hoverable * message or several messages one after the other. * - * @param player - * @param nameToShowUser - * @param messageToShowUser - * @param rewards + * @param player player + * @param nameToShowUser name shown to user + * @param messageToShowUser message shown to user + * @param rewards rewards */ private void displayReceiverMessages(Player player, String nameToShowUser, String messageToShowUser, @NonNull List rewards) { List chatMessages = rewards.stream().map(Reward::chatTexts).flatMap(List::stream).map(m -> StringHelper.replacePlayerPlaceholders(m, player)).map(m -> PlainTextComponentSerializer.plainText().serialize(m)).toList(); String message = langAchievementNew.contains("ACH") ? StringUtils.replaceEach(langAchievementNew, new String[]{"ACH"}, new String[]{nameToShowUser}) : langAchievementNew + nameToShowUser; if (configHoverableReceiverChatText) { - StringBuilder hover = new StringBuilder(applyPrefix(messageToShowUser + "\n")); - chatMessages.forEach(t -> hover.append(applyPrefix(ChatColor.translateAlternateColorCodes('&', t))).append("\n")); - fancyMessageSender.sendHoverableMessage(player, applyPrefix(message), hover.substring(0, hover.length() - 1), "white"); + TextComponent messageComponent = LegacyComponentSerializer.legacyAmpersand().deserialize(applyPrefix(message)); + TextComponent.Builder hoverBuilder = Component.text().append(LegacyComponentSerializer.legacyAmpersand().deserialize(applyPrefix(messageToShowUser))); + chatMessages.forEach(t -> hoverBuilder.append(Component.newline()).append(LegacyComponentSerializer.legacyAmpersand().deserialize(applyPrefix(t)))); + fancyMessageSender.sendHoverableMessage(player, messageComponent, hoverBuilder.build()); return; } - player.sendMessage(applyPrefix(message)); - player.sendMessage(pluginHeader.toString() + ChatColor.WHITE + applyPrefix(messageToShowUser)); - chatMessages.forEach(t -> player.sendMessage(pluginHeader + ChatColor.translateAlternateColorCodes('&', t))); + player.sendMessage(LegacyComponentSerializer.legacyAmpersand().deserialize(applyPrefix(message))); + player.sendMessage(LegacyComponentSerializer.legacyAmpersand().deserialize(applyPrefix(messageToShowUser)).colorIfAbsent(NamedTextColor.WHITE)); + chatMessages.forEach(t -> player.sendMessage(LegacyComponentSerializer.legacyAmpersand().deserialize(applyPrefix(t)))); } /** diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/ColorHelper.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/ColorHelper.java index 3d0c986d..7397970a 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/ColorHelper.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/ColorHelper.java @@ -1,14 +1,13 @@ package com.hm.achievement.utils; import java.util.List; -import java.util.Locale; import java.util.Map; import java.util.stream.Collectors; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextColor; import org.bukkit.Color; import org.bukkit.boss.BarColor; -import org.jspecify.annotations.NonNull; +import org.bukkit.configuration.file.YamlConfiguration; import static net.kyori.adventure.text.format.NamedTextColor.AQUA; import static net.kyori.adventure.text.format.NamedTextColor.BLACK; @@ -34,10 +33,7 @@ public class ColorHelper { private static final Map COLOR_MAP = Map.ofEntries(Map.entry(AQUA, Color.fromRGB(0x55, 0xFF, 0xFF)), Map.entry(BLACK, Color.BLACK), Map.entry(BLUE, Color.fromRGB(0x55, 0x55, 0xFF)), Map.entry(GRAY, Color.fromRGB(0xAA, 0xAA, 0xAA)), Map.entry(DARK_AQUA, Color.fromRGB(0x00, 0xAA, 0xAA)), Map.entry(DARK_BLUE, Color.fromRGB(0x00, 0x00, 0xAA)), Map.entry(DARK_GRAY, Color.fromRGB(0x55, 0x55, 0x55)), Map.entry(DARK_GREEN, Color.fromRGB(0x00, 0xAA, 0x00)), Map.entry(DARK_PURPLE, Color.fromRGB(0xAA, 0x00, 0xAA)), Map.entry(DARK_RED, Color.fromRGB(0xAA, 0x00, 0x00)), Map.entry(GOLD, Color.fromRGB(0xFF, 0xAA, 0x00)), Map.entry(GREEN, Color.fromRGB(0x55, 0xFF, 0x55)), Map.entry(LIGHT_PURPLE, Color.fromRGB(0xFF, 0x55, 0xFF)), Map.entry(RED, Color.fromRGB(0xFF, 0x55, 0x55)), Map.entry(WHITE, Color.WHITE), Map.entry(YELLOW, Color.fromRGB(0xFF, 0xFF, 0x55))); private static final Map BAR_COLOR_MAP = Map.ofEntries(Map.entry(AQUA, BarColor.GREEN), Map.entry(BLACK, BarColor.PURPLE), Map.entry(BLUE, BarColor.BLUE), Map.entry(GRAY, BarColor.WHITE), Map.entry(DARK_AQUA, BarColor.BLUE), Map.entry(DARK_BLUE, BarColor.BLUE), Map.entry(DARK_GRAY, BarColor.PURPLE), Map.entry(DARK_GREEN, BarColor.GREEN), Map.entry(DARK_PURPLE, BarColor.PURPLE), Map.entry(DARK_RED, BarColor.RED), Map.entry(GOLD, BarColor.YELLOW), Map.entry(GREEN, BarColor.GREEN), Map.entry(LIGHT_PURPLE, BarColor.PURPLE), Map.entry(RED, BarColor.RED), Map.entry(WHITE, BarColor.WHITE), Map.entry(YELLOW, BarColor.YELLOW)); private static final Map EXACT_RGB_MAP = ALL_NAMED_COLORS.stream().collect(Collectors.toMap(c -> (c.red() << 16) | (c.green() << 8) | c.blue(), c -> c)); - - private ColorHelper() { - // Not called. - } + private static YamlConfiguration mainConfig; public static Color convertChatColorToColor(NamedTextColor chatColor) { return COLOR_MAP.getOrDefault(chatColor, Color.WHITE); @@ -47,29 +43,25 @@ public static BarColor convertChatColorToBarColor(NamedTextColor chatColor) { return BAR_COLOR_MAP.getOrDefault(chatColor, BarColor.WHITE); } - public static NamedTextColor parseColor(String nameorHex) { - if (nameorHex == null) return WHITE; - try { // TODO: Forcing 5 to be dark_purple for config as that uses numbers. Remove at some point - int index = Integer.parseInt(nameorHex); - if (index == 5) { - return DARK_PURPLE; - } - } catch (NumberFormatException ignored) { - } - NamedTextColor named = NAMES.value(nameorHex.toLowerCase(Locale.ROOT)); + public static NamedTextColor parseColor(String color) { + if (color == null) return WHITE; + NamedTextColor named = NAMES.value(color.toLowerCase()); if (named != null) return named; try { - int rgb = Integer.parseInt(nameorHex.replace("#", ""), 16); + int rgb = Integer.parseInt(color.replace("#", ""), 16); NamedTextColor exact = EXACT_RGB_MAP.get(rgb); if (exact != null) return exact; - return nearestTo(Color.fromRGB(rgb)); + return NamedTextColor.nearestTo(TextColor.color(rgb)); } catch (IllegalArgumentException e) { - throw new RuntimeException("Invalid color: " + nameorHex, e); + throw new RuntimeException("Invalid color: " + color, e); } } - private static @NonNull NamedTextColor nearestTo(@NonNull Color color) { - TextColor advColor = TextColor.color(color.getRed(), color.getGreen(), color.getBlue()); - return NamedTextColor.nearestTo(advColor); + public static NamedTextColor configColor() { + return parseColor(mainConfig.getString("Color", "DARK_PURPLE")); + } + + public static void setMainConfig(YamlConfiguration mainConfig) { + ColorHelper.mainConfig = mainConfig; } } \ No newline at end of file diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/FancyMessageSender.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/FancyMessageSender.java index 4e864f51..0c95574b 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/FancyMessageSender.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/FancyMessageSender.java @@ -2,19 +2,15 @@ import jakarta.inject.Inject; import jakarta.inject.Singleton; -import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.event.HoverEvent; -import net.kyori.adventure.text.format.TextColor; -import org.bukkit.ChatColor; import org.bukkit.entity.Player; -import org.jetbrains.annotations.Contract; import org.jspecify.annotations.NonNull; /** * Class used to send fancy messages to the player; can be titles, hoverable chat messages or action bar messages. All - * methods are static and this class cannot be instanciated. + * methods are static and this class cannot be instantiated. * * @author Pyves */ @@ -35,14 +31,9 @@ public FancyMessageSender(int serverVersion) { * @param player Online player to send the message to. * @param message The text to display in the chat. * @param hover The text to display in the hover. - * @param color The color of the hover text. */ - public void sendHoverableMessage(@NonNull Player player, String message, String hover, @NonNull String color) { - String hexColor = chatColorToHex(ChatColor.valueOf(color.toUpperCase())); - net.kyori.adventure.text.TextComponent textComponent = Component.text(message).color(TextColor.fromHexString(hexColor)); - net.kyori.adventure.text.event.HoverEvent hoverEvent = net.kyori.adventure.text.event.HoverEvent.showText(Component.text(hover)); - textComponent = textComponent.hoverEvent(hoverEvent); - player.sendMessage(textComponent); + public void sendHoverableMessage(@NonNull Player player, @NonNull TextComponent message, TextComponent hover) { + player.sendMessage(message.hoverEvent(HoverEvent.showText(hover))); } /** @@ -52,37 +43,9 @@ public void sendHoverableMessage(@NonNull Player player, String message, String * @param message The text to display in the chat. * @param command The command that is entered when clicking on the message. * @param hover The text to display in the hover. - * @param color The color of the hover text. */ - public void sendHoverableCommandMessage(@NonNull Player player, String message, String command, String hover, @NonNull String color) { - String hexColor = chatColorToHex(ChatColor.valueOf(color.toUpperCase())); - TextComponent textComponent = Component.text(message).color(TextColor.fromHexString(hexColor)).clickEvent(ClickEvent.runCommand(command)); - HoverEvent hoverEvent = HoverEvent.showText(Component.text(hover)); - textComponent = textComponent.hoverEvent(hoverEvent); - player.sendMessage(textComponent); - - } - - @Contract(pure = true) - private @NonNull String chatColorToHex(@NonNull ChatColor chatColor) { - return switch (chatColor) { - case DARK_BLUE -> "#0000AA"; - case GREEN -> "#00AA00"; - case AQUA -> "#00AAAA"; - case RED -> "#AA0000"; - case LIGHT_PURPLE -> "#AA00AA"; - case YELLOW -> "#AAAA00"; - case WHITE, GRAY -> "#AAAAAA"; - case DARK_GRAY -> "#555555"; - case DARK_RED -> "#550000"; - case DARK_GREEN -> "#005500"; - case DARK_AQUA -> "#005555"; - case DARK_PURPLE -> "#550055"; - case GOLD -> "#FFAA00"; - case BLUE -> "#5555FF"; - case BLACK -> "#000000"; - default -> "#FFFFFF"; - }; + public void sendHoverableCommandMessage(@NonNull Player player, @NonNull TextComponent message, String command, TextComponent hover) { + player.sendMessage(message.clickEvent(ClickEvent.runCommand(command)).hoverEvent(HoverEvent.showText(hover))); } } diff --git a/advanced-achievements-plugin/src/main/resources/config.yml b/advanced-achievements-plugin/src/main/resources/config.yml index ca9a2056..ae4f6865 100644 --- a/advanced-achievements-plugin/src/main/resources/config.yml +++ b/advanced-achievements-plugin/src/main/resources/config.yml @@ -64,8 +64,8 @@ SoundRanking: entity_firework_rocket_blast # Icon of the plugin (default: shamrock, \u2618). Icon: \u2618 -# Main color of the plugin (default: 5, dark purple). -Color: 5 +# Main color of the plugin (default: DARK_PURPLE). +Color: DARK_PURPLE # Notify other connected players when an achievement is received. This defines the default behaviour, players can # override what they see by using /aach toggle. diff --git a/pom.xml b/pom.xml index 09a3d7fb..2c5de413 100644 --- a/pom.xml +++ b/pom.xml @@ -63,7 +63,7 @@ io.papermc.paper paper-api - 26.1.2.build.2-alpha + 26.1.2.build.5-alpha provided From f9be528ae0d9e01053ba8ffce6dd08128a515685 Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Sat, 11 Apr 2026 16:21:54 +0100 Subject: [PATCH 10/58] Prefix is now in grey as well --- .../achievement/listener/PlayerAdvancedAchievementListener.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java index a3e295f9..15bb2372 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java @@ -348,7 +348,7 @@ private void handleAllAchievementsReceived(@NonNull Player player) { } private String applyPrefix(String s) { - if (mainConfig.getBoolean("PrefixEnabled")) return "[AACH] " + s; + if (mainConfig.getBoolean("PrefixEnabled")) return "§7[AACH] §r " + s; return s; } } \ No newline at end of file From 948c602471ceae57a1761e84f7b9551d4fbd8caa Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Sat, 11 Apr 2026 16:22:39 +0100 Subject: [PATCH 11/58] Spacing fix --- .../achievement/listener/PlayerAdvancedAchievementListener.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java index 15bb2372..37e0d6f1 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java @@ -348,7 +348,7 @@ private void handleAllAchievementsReceived(@NonNull Player player) { } private String applyPrefix(String s) { - if (mainConfig.getBoolean("PrefixEnabled")) return "§7[AACH] §r " + s; + if (mainConfig.getBoolean("PrefixEnabled")) return "§7[AACH]§r " + s; return s; } } \ No newline at end of file From c3843442cbd91632a22ead4415b0ffa31418f919 Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Sat, 11 Apr 2026 16:29:14 +0100 Subject: [PATCH 12/58] Remove message as it's clear when this is granted anyway --- .../com/hm/achievement/command/executable/GiveCommand.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GiveCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GiveCommand.java index af5ede4d..2804da3d 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GiveCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GiveCommand.java @@ -31,7 +31,6 @@ public class GiveCommand extends AbstractParsableCommand { private boolean configMultiCommand; private String langAchievementAlreadyReceived; - private String langAchievementGiven; private String langAchievementNotFound; private String langAchievementNoPermission; @@ -50,7 +49,6 @@ public void extractConfigurationParameters() { configMultiCommand = mainConfig.getBoolean("MultiCommand"); langAchievementAlreadyReceived = pluginHeader + langConfig.getString("achievement-already-received"); - langAchievementGiven = pluginHeader + langConfig.getString("achievement-given"); langAchievementNotFound = pluginHeader + langConfig.getString("achievement-not-found"); langAchievementNoPermission = pluginHeader + langConfig.getString("achievement-no-permission"); } @@ -73,8 +71,6 @@ void onExecuteForPlayer(CommandSender sender, String[] args, Player player) { } Bukkit.getPluginManager().callEvent(new PlayerAdvancedAchievementEvent(player, achievement.get())); - - sender.sendMessage(langAchievementGiven); } else { Set commandKeys = achievementMap.getSubcategoriesForCategory(CommandAchievements.COMMANDS); sender.sendMessage(StringUtils.replaceEach(langAchievementNotFound, From 1e606b0c436a9a102a9186ddefbe9e06bb8d2bef Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Sat, 11 Apr 2026 16:31:05 +0100 Subject: [PATCH 13/58] Remove message as it's clear when this is granted anyway --- .../com/hm/achievement/command/executable/GrantCommand.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GrantCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GrantCommand.java index 83db9437..25ee5423 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GrantCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GrantCommand.java @@ -26,7 +26,6 @@ public class GrantCommand extends AbstractParsableCommand { private final AchievementMap achievementMap; private boolean configMultiCommand; private String langAchievementAlreadyReceived; - private String langAchievementGranted; private String langAchievementNotFound; private String langAchievementNoPermission; private String langPlayerNotFound; @@ -44,7 +43,6 @@ public void extractConfigurationParameters() { super.extractConfigurationParameters(); configMultiCommand = mainConfig.getBoolean("MultiCommand"); langAchievementAlreadyReceived = pluginHeader + langConfig.getString("achievement-already-received"); - langAchievementGranted = pluginHeader + langConfig.getString("achievement-granted"); langAchievementGrantedAll = pluginHeader + langConfig.getString("achievement-granted-all"); langAchievementNotFound = pluginHeader + langConfig.getString("achievement-not-found"); langAchievementNoPermission = pluginHeader + langConfig.getString("achievement-no-permission"); @@ -94,7 +92,6 @@ public void onExecuteForPlayer(CommandSender sender, String @NonNull [] args, Pl return; } Bukkit.getPluginManager().callEvent(new PlayerAdvancedAchievementEvent(targetPlayer, ach)); - sender.sendMessage(StringUtils.replaceEach(langAchievementGranted, new String[]{"PLAYER"}, new String[]{playerName})); } else { Set names = achievementMap.getForCategory(CommandAchievements.COMMANDS).stream().map(Achievement::getName).collect(Collectors.toSet()); sender.sendMessage(StringUtils.replaceEach(langAchievementNotFound, new String[]{"CLOSEST_MATCH"}, new String[]{StringHelper.getClosestMatch(achName, names)})); From 6431aaf01a4c5589a1935b4266212e95f59146f1 Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Sat, 11 Apr 2026 16:31:47 +0100 Subject: [PATCH 14/58] Undo last 2 commits --- .../com/hm/achievement/command/executable/GiveCommand.java | 4 ++++ .../com/hm/achievement/command/executable/GrantCommand.java | 3 +++ 2 files changed, 7 insertions(+) diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GiveCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GiveCommand.java index 2804da3d..af5ede4d 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GiveCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GiveCommand.java @@ -31,6 +31,7 @@ public class GiveCommand extends AbstractParsableCommand { private boolean configMultiCommand; private String langAchievementAlreadyReceived; + private String langAchievementGiven; private String langAchievementNotFound; private String langAchievementNoPermission; @@ -49,6 +50,7 @@ public void extractConfigurationParameters() { configMultiCommand = mainConfig.getBoolean("MultiCommand"); langAchievementAlreadyReceived = pluginHeader + langConfig.getString("achievement-already-received"); + langAchievementGiven = pluginHeader + langConfig.getString("achievement-given"); langAchievementNotFound = pluginHeader + langConfig.getString("achievement-not-found"); langAchievementNoPermission = pluginHeader + langConfig.getString("achievement-no-permission"); } @@ -71,6 +73,8 @@ void onExecuteForPlayer(CommandSender sender, String[] args, Player player) { } Bukkit.getPluginManager().callEvent(new PlayerAdvancedAchievementEvent(player, achievement.get())); + + sender.sendMessage(langAchievementGiven); } else { Set commandKeys = achievementMap.getSubcategoriesForCategory(CommandAchievements.COMMANDS); sender.sendMessage(StringUtils.replaceEach(langAchievementNotFound, diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GrantCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GrantCommand.java index 25ee5423..83db9437 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GrantCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GrantCommand.java @@ -26,6 +26,7 @@ public class GrantCommand extends AbstractParsableCommand { private final AchievementMap achievementMap; private boolean configMultiCommand; private String langAchievementAlreadyReceived; + private String langAchievementGranted; private String langAchievementNotFound; private String langAchievementNoPermission; private String langPlayerNotFound; @@ -43,6 +44,7 @@ public void extractConfigurationParameters() { super.extractConfigurationParameters(); configMultiCommand = mainConfig.getBoolean("MultiCommand"); langAchievementAlreadyReceived = pluginHeader + langConfig.getString("achievement-already-received"); + langAchievementGranted = pluginHeader + langConfig.getString("achievement-granted"); langAchievementGrantedAll = pluginHeader + langConfig.getString("achievement-granted-all"); langAchievementNotFound = pluginHeader + langConfig.getString("achievement-not-found"); langAchievementNoPermission = pluginHeader + langConfig.getString("achievement-no-permission"); @@ -92,6 +94,7 @@ public void onExecuteForPlayer(CommandSender sender, String @NonNull [] args, Pl return; } Bukkit.getPluginManager().callEvent(new PlayerAdvancedAchievementEvent(targetPlayer, ach)); + sender.sendMessage(StringUtils.replaceEach(langAchievementGranted, new String[]{"PLAYER"}, new String[]{playerName})); } else { Set names = achievementMap.getForCategory(CommandAchievements.COMMANDS).stream().map(Achievement::getName).collect(Collectors.toSet()); sender.sendMessage(StringUtils.replaceEach(langAchievementNotFound, new String[]{"CLOSEST_MATCH"}, new String[]{StringHelper.getClosestMatch(achName, names)})); From 7849ac97f6db7510dd64aacca74908a4d8d4b874 Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Sat, 11 Apr 2026 20:46:09 +0100 Subject: [PATCH 15/58] Minor spacing changes --- .../command/executable/ListCommand.java | 25 +++++-------------- .../java/com/hm/achievement/gui/GUIItems.java | 3 +-- 2 files changed, 7 insertions(+), 21 deletions(-) diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ListCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ListCommand.java index a6fae6cd..8eef8831 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ListCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ListCommand.java @@ -35,8 +35,7 @@ public class ListCommand extends AbstractCommand { private String langCategoryDoesNotExist; @Inject - public ListCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, - StringBuilder pluginHeader, MainGUI mainGUI, CategoryGUI categoryGUI, GUIItems guiItems) { + public ListCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, StringBuilder pluginHeader, MainGUI mainGUI, CategoryGUI categoryGUI, GUIItems guiItems) { super(mainConfig, langConfig, pluginHeader); this.mainGUI = mainGUI; this.categoryGUI = categoryGUI; @@ -46,39 +45,27 @@ public ListCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") Y @Override public void extractConfigurationParameters() { super.extractConfigurationParameters(); - langCategoryDoesNotExist = pluginHeader + langConfig.getString("category-does-not-exist"); } @Override void onExecute(CommandSender sender, String[] args) { - if (!(sender instanceof Player player)) { - return; - } - + if (!(sender instanceof Player player)) return; if (player.isSleeping()) { sender.sendMessage(Objects.requireNonNull(langConfig.getString("list-unavailable-whilst-sleeping"))); return; } - if (args.length == 1) { mainGUI.displayMainGUI(player); } else { String categoryName = args[1]; - Optional> matchingCategory = guiItems.getOrderedAchievementItems().entrySet() - .stream() - .filter(e -> e.getKey().category().toString().equals(categoryName)) - .findFirst(); + Optional> matchingCategory = guiItems.getOrderedAchievementItems().entrySet().stream().filter(e -> e.getKey().category().toString().equals(categoryName)).findFirst(); if (matchingCategory.isPresent()) { categoryGUI.displayCategoryGUI(matchingCategory.get().getValue(), player, 0); } else { - List allGUICategoryNames = guiItems.getOrderedAchievementItems().keySet() - .stream() - .map(c -> c.category().toString()) - .collect(Collectors.toList()); - sender.sendMessage(StringUtils.replaceEach(langCategoryDoesNotExist, new String[]{"CAT", "CLOSEST_MATCH"}, - new String[]{categoryName, StringHelper.getClosestMatch(categoryName, allGUICategoryNames)})); + List allGUICategoryNames = guiItems.getOrderedAchievementItems().keySet().stream().map(c -> c.category().toString()).collect(Collectors.toList()); + sender.sendMessage(StringUtils.replaceEach(langCategoryDoesNotExist, new String[]{"CAT", "CLOSEST_MATCH"}, new String[]{categoryName, StringHelper.getClosestMatch(categoryName, allGUICategoryNames)})); } } } -} +} \ No newline at end of file diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/GUIItems.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/GUIItems.java index 3a1f734f..6a44bb19 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/GUIItems.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/GUIItems.java @@ -204,5 +204,4 @@ public ItemStack getAchievementLock() { public ItemStack getCategoryLock() { return categoryLock; } - -} +} \ No newline at end of file From 034f7de0bbbc550f9924241c9339accd7ad75b2a Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Sat, 11 Apr 2026 21:34:08 +0100 Subject: [PATCH 16/58] Cleaning up colors further - can now specify firework color in config --- .../executable/AbstractRankingCommand.java | 2 +- .../command/executable/HelpCommand.java | 4 +- .../command/executable/InfoCommand.java | 2 +- .../command/executable/StatsCommand.java | 2 +- .../config/ConfigurationParser.java | 3 +- .../java/com/hm/achievement/gui/MainGUI.java | 3 +- .../PlayerAdvancedAchievementListener.java | 52 +++---------- .../com/hm/achievement/utils/ColorHelper.java | 22 ++---- .../src/main/resources/config.yml | 12 ++- ...PlayerAdvancedAchievementListenerTest.java | 18 +---- .../hm/achievement/utils/ColorHelperTest.java | 77 ++++++++----------- 11 files changed, 66 insertions(+), 131 deletions(-) diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractRankingCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractRankingCommand.java index 56528cb7..f2e06a9e 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractRankingCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractRankingCommand.java @@ -64,7 +64,7 @@ public abstract class AbstractRankingCommand extends AbstractCommand { @Override public void extractConfigurationParameters() { super.extractConfigurationParameters(); - configColor = ColorHelper.configColor(); + configColor = ColorHelper.configColor(mainConfig); configTopList = mainConfig.getInt("TopList"); configAdditionalEffects = mainConfig.getBoolean("AdditionalEffects"); configSound = mainConfig.getBoolean("Sound"); diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/HelpCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/HelpCommand.java index ad10e608..74bb4f78 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/HelpCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/HelpCommand.java @@ -76,9 +76,7 @@ public HelpCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") Y @Override public void extractConfigurationParameters() { super.extractConfigurationParameters(); - - String colorValue = mainConfig.getString("Color", "DARK_PURPLE"); - configColor = ColorHelper.configColor(); + configColor = ColorHelper.configColor(mainConfig); configIcon = StringHelper.unescapeJava(mainConfig.getString("Icon")); langCommandList = header("/aach list").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-list")))); diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InfoCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InfoCommand.java index 96f39ecd..9ea6aa71 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InfoCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InfoCommand.java @@ -52,7 +52,7 @@ public InfoCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") Y public void extractConfigurationParameters() { super.extractConfigurationParameters(); - NamedTextColor configColor = ColorHelper.parseColor(Objects.requireNonNull(mainConfig.getString("Color"))); + NamedTextColor configColor = ColorHelper.configColor(mainConfig); String configIcon = StringHelper.unescapeJava(mainConfig.getString("Icon")); configDatabaseType = mainConfig.getString("DatabaseType"); diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/StatsCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/StatsCommand.java index c5068aa7..b440a09f 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/StatsCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/StatsCommand.java @@ -55,7 +55,7 @@ public void extractConfigurationParameters() { super.extractConfigurationParameters(); // Load configuration parameters. - configColor = ColorHelper.parseColor(mainConfig.getString("Color")); + configColor = ColorHelper.configColor(mainConfig); configIcon = StringHelper.unescapeJava(mainConfig.getString("Icon")); configAdditionalEffects = mainConfig.getBoolean("AdditionalEffects"); configSound = mainConfig.getBoolean("Sound"); diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/config/ConfigurationParser.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/config/ConfigurationParser.java index 05045a3b..3d342cbc 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/config/ConfigurationParser.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/config/ConfigurationParser.java @@ -81,7 +81,6 @@ public void loadAndParseConfiguration() throws PluginLoadError { backupAndLoadConfiguration("config.yml", "config.yml", mainConfig); backupAndLoadConfiguration("lang.yml", mainConfig.getString("LanguageFileName"), langConfig); backupAndLoadConfiguration("gui.yml", "gui.yml", guiConfig); - ColorHelper.setMainConfig(mainConfig); parseHeader(); parseDisabledCategories(); parseAchievements(); @@ -144,7 +143,7 @@ private void parseHeader() { pluginHeader.setLength(0); String icon = StringHelper.unescapeJava(mainConfig.getString("Icon")); if (StringUtils.isNotBlank(icon)) { - String coloredIcon = LegacyComponentSerializer.legacySection().serialize(Component.text(icon, ColorHelper.configColor())); + String coloredIcon = LegacyComponentSerializer.legacySection().serialize(Component.text(icon, ColorHelper.configColor(mainConfig))); String rawHeader = Strings.CS.replace(mainConfig.getString("ChatHeader"), "%ICON%", coloredIcon); Component header = LegacyComponentSerializer.legacyAmpersand().deserialize(Objects.requireNonNull(rawHeader)); pluginHeader.append(LegacyComponentSerializer.legacySection().serialize(header)).append(" "); diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/MainGUI.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/MainGUI.java index e9356fe3..edd82bb1 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/MainGUI.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/MainGUI.java @@ -61,8 +61,7 @@ public MainGUI(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlC public void extractConfigurationParameters() { configHideNotReceivedCategories = mainConfig.getBoolean("HideNotReceivedCategories"); configHideNoPermissionCategories = mainConfig.getBoolean("HideNoPermissionCategories"); - - langListGUITitle = Component.text(ChatColor.translateAlternateColorCodes('&', Objects.requireNonNull(langConfig.getString("list-gui-title")))); + langListGUITitle = Component.text(Objects.requireNonNull(langConfig.getString("list-gui-title"))); langListAchievementsInCategoryPlural = langConfig.getString("list-achievements-in-category-plural"); langListAchievementInCategorySingular = langConfig.getString("list-achievements-in-category-singular"); } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java index 37e0d6f1..80205651 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java @@ -20,9 +20,8 @@ import jakarta.inject.Named; import jakarta.inject.Singleton; import java.time.Duration; -import java.util.HashMap; +import java.util.Collections; import java.util.List; -import java.util.Map; import java.util.Objects; import java.util.Random; import java.util.logging.Logger; @@ -66,33 +65,11 @@ * * @author Pyves */ -@SuppressWarnings("deprecation") @Singleton public class PlayerAdvancedAchievementListener implements Listener, Reloadable { private static final Random RANDOM = new Random(); private static final String ADVANCED_ACHIEVEMENTS_FIREWORK = "advanced_achievements_firework"; - private static final Map FIREWORK_COLOR_MIX = new HashMap<>(); - - static { - FIREWORK_COLOR_MIX.put(NamedTextColor.AQUA, NamedTextColor.DARK_AQUA); - FIREWORK_COLOR_MIX.put(NamedTextColor.BLACK, NamedTextColor.GRAY); - FIREWORK_COLOR_MIX.put(NamedTextColor.BLUE, NamedTextColor.DARK_BLUE); - FIREWORK_COLOR_MIX.put(NamedTextColor.GRAY, NamedTextColor.DARK_GRAY); - FIREWORK_COLOR_MIX.put(NamedTextColor.DARK_AQUA, NamedTextColor.AQUA); - FIREWORK_COLOR_MIX.put(NamedTextColor.DARK_BLUE, NamedTextColor.BLUE); - FIREWORK_COLOR_MIX.put(NamedTextColor.DARK_GRAY, NamedTextColor.GRAY); - FIREWORK_COLOR_MIX.put(NamedTextColor.DARK_GREEN, NamedTextColor.GREEN); - FIREWORK_COLOR_MIX.put(NamedTextColor.DARK_PURPLE, NamedTextColor.LIGHT_PURPLE); - FIREWORK_COLOR_MIX.put(NamedTextColor.DARK_RED, NamedTextColor.RED); - FIREWORK_COLOR_MIX.put(NamedTextColor.GOLD, NamedTextColor.YELLOW); - FIREWORK_COLOR_MIX.put(NamedTextColor.GREEN, NamedTextColor.DARK_GREEN); - FIREWORK_COLOR_MIX.put(NamedTextColor.LIGHT_PURPLE, NamedTextColor.DARK_PURPLE); - FIREWORK_COLOR_MIX.put(NamedTextColor.RED, NamedTextColor.DARK_RED); - FIREWORK_COLOR_MIX.put(NamedTextColor.WHITE, NamedTextColor.GRAY); - FIREWORK_COLOR_MIX.put(NamedTextColor.YELLOW, NamedTextColor.GOLD); - } - private final YamlConfiguration mainConfig; private final YamlConfiguration langConfig; private final Logger logger; @@ -104,12 +81,13 @@ public class PlayerAdvancedAchievementListener implements Listener, Reloadable { private final AbstractDatabaseManager databaseManager; private final ToggleCommand toggleCommand; private final FancyMessageSender fancyMessageSender; - private String configFireworkStyle; + private String langAchievementReceived; + private String langAchievementNew; + private String langAllAchievementsReceived; + private String langBossBarProgress; + private NamedTextColor configFireworkColor; private boolean configFirework; - private Color configColor; - private Color mixColor; - private BarColor barColor; private boolean configSimplifiedReception; private boolean configTitleScreen; private boolean configNotifyOtherPlayers; @@ -118,11 +96,6 @@ public class PlayerAdvancedAchievementListener implements Listener, Reloadable { private boolean configReceiverChatMessages; private boolean configBossBarProgress; - private String langAchievementReceived; - private String langAchievementNew; - private String langAllAchievementsReceived; - private String langBossBarProgress; - @Inject public PlayerAdvancedAchievementListener(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Logger logger, StringBuilder pluginHeader, CacheManager cacheManager, AdvancedAchievements advancedAchievements, RewardParser rewardParser, AchievementMap achievementMap, AbstractDatabaseManager databaseManager, ToggleCommand toggleCommand, FancyMessageSender fancyMessageSender) { this.mainConfig = mainConfig; @@ -146,6 +119,7 @@ public void extractConfigurationParameters() { logger.warning("Failed to load FireworkStyle, using ball_large instead. Please use one of the following: " + "ball_large, ball, burst, creeper, star or random."); } configFirework = mainConfig.getBoolean("Firework"); + configFireworkColor = ColorHelper.configFireworkColor(mainConfig); configSimplifiedReception = mainConfig.getBoolean("SimplifiedReception"); configTitleScreen = mainConfig.getBoolean("TitleScreen"); configNotifyOtherPlayers = mainConfig.getBoolean("NotifyOtherPlayers"); @@ -153,11 +127,6 @@ public void extractConfigurationParameters() { configHoverableReceiverChatText = mainConfig.getBoolean("HoverableReceiverChatText"); configBossBarProgress = mainConfig.getBoolean("BossBarProgress"); configReceiverChatMessages = mainConfig.getBoolean("ReceiverChatMessages"); - NamedTextColor chatColor = ColorHelper.parseColor(Objects.requireNonNull(mainConfig.getString("Color"))); - configColor = ColorHelper.convertChatColorToColor(Objects.requireNonNull(chatColor)); - mixColor = Color.WHITE.mixColors(ColorHelper.convertChatColorToColor(FIREWORK_COLOR_MIX.get(chatColor))); - barColor = ColorHelper.convertChatColorToBarColor(chatColor); - langAchievementReceived = langConfig.getString("achievement-received") + " " + ChatColor.WHITE; langAchievementNew = pluginHeader + langConfig.getString("achievement-new") + " " + ChatColor.WHITE; langAllAchievementsReceived = pluginHeader + langConfig.getString("all-achievements-received"); @@ -199,7 +168,7 @@ public void onPlayerAdvancedAchievementReception(@NonNull PlayerAdvancedAchievem * Displays chat messages, screen title and launches a firework when a player * receives an achievement. * - * @param player player + * @param player player * @param achievement achievement */ private void displayAchievement(@NonNull Player player, @NonNull Achievement achievement) { @@ -238,7 +207,7 @@ private void displayAchievement(@NonNull Player player, @NonNull Achievement ach int totalAmount = achievementMap.getAll().size(); double progress = ((double) receivedAmount) / totalAmount; String message = StringUtils.replaceEach(langBossBarProgress, new String[]{"AMOUNT"}, new String[]{receivedAmount + "/" + totalAmount}); - BossBar bossBar = Bukkit.getServer().createBossBar(message, barColor, BarStyle.SOLID); + BossBar bossBar = Bukkit.getServer().createBossBar(message, BarColor.PURPLE, BarStyle.SOLID); bossBar.setProgress(progress); Bukkit.getScheduler().scheduleSyncDelayedTask(advancedAchievements, () -> bossBar.addPlayer(player), 110); Bukkit.getScheduler().scheduleSyncDelayedTask(advancedAchievements, () -> bossBar.removePlayer(player), 240); @@ -298,7 +267,8 @@ private void displayFirework(@NonNull Player player) { Location location = player.getLocation().subtract(0, 1, 0); Firework firework = player.getWorld().spawn(location, Firework.class); FireworkMeta fireworkMeta = firework.getFireworkMeta(); - FireworkEffect fireworkEffect = FireworkEffect.builder().withColor(configColor).withFade(mixColor).with(getFireworkType()).build(); + Color fireworkColor = Color.fromRGB(configFireworkColor.red(), configFireworkColor.green(), configFireworkColor.blue()); + FireworkEffect fireworkEffect = FireworkEffect.builder().withColor(fireworkColor).withFade(fireworkColor).build(); fireworkMeta.addEffects(fireworkEffect); firework.setFireworkMeta(fireworkMeta); firework.setMetadata(ADVANCED_ACHIEVEMENTS_FIREWORK, new FixedMetadataValue(advancedAchievements, true)); diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/ColorHelper.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/ColorHelper.java index 7397970a..9a236564 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/ColorHelper.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/ColorHelper.java @@ -5,9 +5,8 @@ import java.util.stream.Collectors; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextColor; -import org.bukkit.Color; -import org.bukkit.boss.BarColor; import org.bukkit.configuration.file.YamlConfiguration; +import org.jspecify.annotations.NonNull; import static net.kyori.adventure.text.format.NamedTextColor.AQUA; import static net.kyori.adventure.text.format.NamedTextColor.BLACK; @@ -30,20 +29,9 @@ public class ColorHelper { protected static final List ALL_NAMED_COLORS = List.of(BLACK, DARK_BLUE, DARK_GREEN, DARK_AQUA, DARK_RED, DARK_PURPLE, GOLD, GRAY, DARK_GRAY, BLUE, GREEN, AQUA, RED, LIGHT_PURPLE, YELLOW, WHITE); - private static final Map COLOR_MAP = Map.ofEntries(Map.entry(AQUA, Color.fromRGB(0x55, 0xFF, 0xFF)), Map.entry(BLACK, Color.BLACK), Map.entry(BLUE, Color.fromRGB(0x55, 0x55, 0xFF)), Map.entry(GRAY, Color.fromRGB(0xAA, 0xAA, 0xAA)), Map.entry(DARK_AQUA, Color.fromRGB(0x00, 0xAA, 0xAA)), Map.entry(DARK_BLUE, Color.fromRGB(0x00, 0x00, 0xAA)), Map.entry(DARK_GRAY, Color.fromRGB(0x55, 0x55, 0x55)), Map.entry(DARK_GREEN, Color.fromRGB(0x00, 0xAA, 0x00)), Map.entry(DARK_PURPLE, Color.fromRGB(0xAA, 0x00, 0xAA)), Map.entry(DARK_RED, Color.fromRGB(0xAA, 0x00, 0x00)), Map.entry(GOLD, Color.fromRGB(0xFF, 0xAA, 0x00)), Map.entry(GREEN, Color.fromRGB(0x55, 0xFF, 0x55)), Map.entry(LIGHT_PURPLE, Color.fromRGB(0xFF, 0x55, 0xFF)), Map.entry(RED, Color.fromRGB(0xFF, 0x55, 0x55)), Map.entry(WHITE, Color.WHITE), Map.entry(YELLOW, Color.fromRGB(0xFF, 0xFF, 0x55))); - private static final Map BAR_COLOR_MAP = Map.ofEntries(Map.entry(AQUA, BarColor.GREEN), Map.entry(BLACK, BarColor.PURPLE), Map.entry(BLUE, BarColor.BLUE), Map.entry(GRAY, BarColor.WHITE), Map.entry(DARK_AQUA, BarColor.BLUE), Map.entry(DARK_BLUE, BarColor.BLUE), Map.entry(DARK_GRAY, BarColor.PURPLE), Map.entry(DARK_GREEN, BarColor.GREEN), Map.entry(DARK_PURPLE, BarColor.PURPLE), Map.entry(DARK_RED, BarColor.RED), Map.entry(GOLD, BarColor.YELLOW), Map.entry(GREEN, BarColor.GREEN), Map.entry(LIGHT_PURPLE, BarColor.PURPLE), Map.entry(RED, BarColor.RED), Map.entry(WHITE, BarColor.WHITE), Map.entry(YELLOW, BarColor.YELLOW)); private static final Map EXACT_RGB_MAP = ALL_NAMED_COLORS.stream().collect(Collectors.toMap(c -> (c.red() << 16) | (c.green() << 8) | c.blue(), c -> c)); - private static YamlConfiguration mainConfig; - public static Color convertChatColorToColor(NamedTextColor chatColor) { - return COLOR_MAP.getOrDefault(chatColor, Color.WHITE); - } - - public static BarColor convertChatColorToBarColor(NamedTextColor chatColor) { - return BAR_COLOR_MAP.getOrDefault(chatColor, BarColor.WHITE); - } - - public static NamedTextColor parseColor(String color) { + static NamedTextColor parseColor(String color) { if (color == null) return WHITE; NamedTextColor named = NAMES.value(color.toLowerCase()); if (named != null) return named; @@ -57,11 +45,11 @@ public static NamedTextColor parseColor(String color) { } } - public static NamedTextColor configColor() { + public static NamedTextColor configColor(@NonNull YamlConfiguration mainConfig) { return parseColor(mainConfig.getString("Color", "DARK_PURPLE")); } - public static void setMainConfig(YamlConfiguration mainConfig) { - ColorHelper.mainConfig = mainConfig; + public static NamedTextColor configFireworkColor(@NonNull YamlConfiguration mainConfig) { + return parseColor(mainConfig.getString("FireworkColor", "DARK_PURPLE")); } } \ No newline at end of file diff --git a/advanced-achievements-plugin/src/main/resources/config.yml b/advanced-achievements-plugin/src/main/resources/config.yml index ae4f6865..a7360b8c 100644 --- a/advanced-achievements-plugin/src/main/resources/config.yml +++ b/advanced-achievements-plugin/src/main/resources/config.yml @@ -64,9 +64,16 @@ SoundRanking: entity_firework_rocket_blast # Icon of the plugin (default: shamrock, \u2618). Icon: \u2618 -# Main color of the plugin (default: DARK_PURPLE). +# Main color of the plugin for chat messages and information (default: DARK_PURPLE). +# https://jd.advntr.dev/api/4.26.1/net/kyori/adventure/text/format/NamedTextColor.html Color: DARK_PURPLE +# Color used for not yet received achievements in /aach list (default: DARK_GRAY). +ListColorNotReceived: DARK_GRAY + +# Color used for the firework and fade when you get an achievement (default: DARK_PURPLE). +FireworkColor: DARK_PURPLE + # Notify other connected players when an achievement is received. This defines the default behaviour, players can # override what they see by using /aach toggle. NotifyOtherPlayers: true @@ -218,9 +225,6 @@ EnrichedListProgressBars: true # Annotate each achievement displayed in a /aach list category with a number. NumberedItemsInList: false -# Color used for not yet received achievements in /aach list. -ListColorNotReceived: 8 - # Italicise not yet received achievements in /aach list. Obfuscated achievements are not affected. ListItaliciseNotReceived: true diff --git a/advanced-achievements-plugin/src/test/java/com/hm/achievement/listener/PlayerAdvancedAchievementListenerTest.java b/advanced-achievements-plugin/src/test/java/com/hm/achievement/listener/PlayerAdvancedAchievementListenerTest.java index e6bfd2d8..d2b3781a 100644 --- a/advanced-achievements-plugin/src/test/java/com/hm/achievement/listener/PlayerAdvancedAchievementListenerTest.java +++ b/advanced-achievements-plugin/src/test/java/com/hm/achievement/listener/PlayerAdvancedAchievementListenerTest.java @@ -55,13 +55,9 @@ void itShouldRegisterNewAchievementInDatabase() { AchievementMap achievementMap = new AchievementMap(); achievementMap.put(new AchievementBuilder().name("connect_1").displayName("Good Choice").build()); achievementMap.put(new AchievementBuilder().name("place_500_smooth_brick").displayName("Stone Brick Layer").build()); - YamlConfiguration mainConfig = YamlConfiguration - .loadConfiguration(new InputStreamReader(Objects.requireNonNull(getClass().getResourceAsStream("/config-reception.yml")))); - YamlConfiguration langConfig = YamlConfiguration - .loadConfiguration(new InputStreamReader(Objects.requireNonNull(getClass().getResourceAsStream("/lang.yml")))); - PlayerAdvancedAchievementListener underTest = new PlayerAdvancedAchievementListener(mainConfig, langConfig, mock(Logger.class), - new StringBuilder(PLUGIN_HEADER), new CacheManager(plugin, abstractDatabaseManager), plugin, null, - achievementMap, abstractDatabaseManager, null, new FancyMessageSender(16)); + YamlConfiguration mainConfig = YamlConfiguration.loadConfiguration(new InputStreamReader(Objects.requireNonNull(getClass().getResourceAsStream("/config-reception.yml")))); + YamlConfiguration langConfig = YamlConfiguration.loadConfiguration(new InputStreamReader(Objects.requireNonNull(getClass().getResourceAsStream("/lang.yml")))); + PlayerAdvancedAchievementListener underTest = new PlayerAdvancedAchievementListener(mainConfig, langConfig, mock(Logger.class), new StringBuilder(PLUGIN_HEADER), new CacheManager(plugin, abstractDatabaseManager), plugin, null, achievementMap, abstractDatabaseManager, null, new FancyMessageSender(16)); underTest.extractConfigurationParameters(); when(player.getUniqueId()).thenReturn(PLAYER_UUID); when(player.getName()).thenReturn("DarkPyves"); @@ -70,14 +66,8 @@ void itShouldRegisterNewAchievementInDatabase() { Set receivedAchievements = new HashSet<>(); receivedAchievements.add("connect_1"); when(abstractDatabaseManager.getPlayerAchievementNames(PLAYER_UUID)).thenReturn(receivedAchievements); - Achievement achievement = new AchievementBuilder() - .name("connect_1") - .displayName("Good Choice") - .message("Connected for the first time!") - .build(); - + Achievement achievement = new AchievementBuilder().name("connect_1").displayName("Good Choice").message("Connected for the first time!").build(); underTest.onPlayerAdvancedAchievementReception(new PlayerAdvancedAchievementEvent(player, achievement)); - verify(abstractDatabaseManager).registerAchievement(eq(PLAYER_UUID), eq("connect_1"), anyLong()); } diff --git a/advanced-achievements-plugin/src/test/java/com/hm/achievement/utils/ColorHelperTest.java b/advanced-achievements-plugin/src/test/java/com/hm/achievement/utils/ColorHelperTest.java index 52f856bb..a26e84e0 100644 --- a/advanced-achievements-plugin/src/test/java/com/hm/achievement/utils/ColorHelperTest.java +++ b/advanced-achievements-plugin/src/test/java/com/hm/achievement/utils/ColorHelperTest.java @@ -6,15 +6,13 @@ import java.util.stream.Stream; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.util.Index; -import org.bukkit.Color; -import org.bukkit.boss.BarColor; +import org.bukkit.configuration.file.YamlConfiguration; import org.jspecify.annotations.NonNull; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import org.mockito.Mockito; import static net.kyori.adventure.text.format.NamedTextColor.AQUA; import static net.kyori.adventure.text.format.NamedTextColor.BLACK; @@ -35,10 +33,6 @@ class ColorHelperTest { - static @NonNull Stream namedAndBarColors() { - return Stream.of(Arguments.of(BLACK, BarColor.PURPLE), Arguments.of(DARK_BLUE, BarColor.BLUE), Arguments.of(DARK_GREEN, BarColor.GREEN), Arguments.of(DARK_AQUA, BarColor.BLUE), Arguments.of(DARK_RED, BarColor.RED), Arguments.of(DARK_PURPLE, BarColor.PURPLE), Arguments.of(GOLD, BarColor.YELLOW), Arguments.of(GRAY, BarColor.WHITE), Arguments.of(DARK_GRAY, BarColor.PURPLE), Arguments.of(BLUE, BarColor.BLUE), Arguments.of(GREEN, BarColor.GREEN), Arguments.of(AQUA, BarColor.GREEN), Arguments.of(RED, BarColor.RED), Arguments.of(LIGHT_PURPLE, BarColor.PURPLE), Arguments.of(YELLOW, BarColor.YELLOW), Arguments.of(WHITE, BarColor.WHITE)); - } - static @NonNull Stream namedColors() { return Stream.of(Arguments.of(BLACK), Arguments.of(DARK_BLUE), Arguments.of(DARK_GREEN), Arguments.of(DARK_AQUA), Arguments.of(DARK_RED), Arguments.of(DARK_PURPLE), Arguments.of(GOLD), Arguments.of(GRAY), Arguments.of(DARK_GRAY), Arguments.of(BLUE), Arguments.of(GREEN), Arguments.of(AQUA), Arguments.of(RED), Arguments.of(LIGHT_PURPLE), Arguments.of(YELLOW), Arguments.of(WHITE)); } @@ -47,65 +41,58 @@ class ColorHelperTest { return Stream.of(Arguments.of("not_a_color"), Arguments.of("#GGGGGG"), Arguments.of("")); } - @ParameterizedTest - @MethodSource("namedAndBarColors") - void shouldConvertNamedTextColorToBarColor(NamedTextColor namedTextColor, BarColor expectedBarColor) { - BarColor actualBarColor = ColorHelper.convertChatColorToBarColor(namedTextColor); - Assertions.assertEquals(expectedBarColor, actualBarColor); - } - - @ParameterizedTest - @MethodSource("namedColors") - void shouldConvertNamedTextColorToBukkitCOlor(@NonNull NamedTextColor namedTextColor) { - Color expectedColor = Color.fromRGB(namedTextColor.red(), namedTextColor.green(), namedTextColor.blue()); - Color actualColor = ColorHelper.convertChatColorToColor(namedTextColor); - Assertions.assertEquals(expectedColor, actualColor); - } - @ParameterizedTest @MethodSource("invalidColorInputs") - void shouldThrowOnInvalidColor(String input) { + void throwOnInvalidColor(String input) { Assertions.assertThrows(RuntimeException.class, () -> ColorHelper.parseColor(input)); } @ParameterizedTest @MethodSource("namedColors") - void shouldParseNamedTextColorCaseInsensitive(@NonNull NamedTextColor namedTextColor) { + void parseNamedTextColorCaseInsensitive(@NonNull NamedTextColor namedTextColor) { String mixedCase = namedTextColor.toString().substring(0, 1).toUpperCase(Locale.ROOT) + namedTextColor.toString().substring(1).toLowerCase(Locale.ROOT); NamedTextColor actual = ColorHelper.parseColor(mixedCase); Assertions.assertEquals(namedTextColor, actual); } @Test - void shouldReturnWhiteForUnknownNamedTextColor() { - NamedTextColor namedTextColor = Mockito.mock(NamedTextColor.class); - Mockito.when(namedTextColor.red()).thenReturn(123); - Mockito.when(namedTextColor.green()).thenReturn(123); - Mockito.when(namedTextColor.blue()).thenReturn(123); - Color color = ColorHelper.convertChatColorToColor(namedTextColor); - Assertions.assertEquals(Color.WHITE, color); + void returnWhiteWhenParsingNull() { + Assertions.assertEquals(WHITE, ColorHelper.parseColor(null)); + } + + @Test + void namedTextColorsArePresentInIndex() { + Index namesIndex = NamedTextColor.NAMES; + Set keys = namesIndex.keys(); + Set expectedNames = ColorHelper.ALL_NAMED_COLORS.stream().map(c -> c.toString().toLowerCase()).collect(Collectors.toSet()); + Assertions.assertTrue(keys.containsAll(expectedNames), "NAMES index should contain all expected colors"); + } + + @Test + void parseHexColor() { + Assertions.assertEquals(AQUA, ColorHelper.parseColor("#55FFFF")); } @Test - void shouldReturnWhiteBarColorForUnknownNamedTextColor() { - NamedTextColor namedTextColor = Mockito.mock(NamedTextColor.class); - Mockito.when(namedTextColor.red()).thenReturn(123); - Mockito.when(namedTextColor.green()).thenReturn(123); - Mockito.when(namedTextColor.blue()).thenReturn(123); - BarColor barColor = ColorHelper.convertChatColorToBarColor(namedTextColor); - Assertions.assertEquals(BarColor.WHITE, barColor); + void parseHexColorWithoutHash() { + Assertions.assertEquals(AQUA, ColorHelper.parseColor("55FFFF")); } @Test - void shouldReturnWhiteWhenParsingNull() { - Assertions.assertEquals(WHITE, ColorHelper.parseColor(null)); + void returnNearestNamedColorForApproximateHex() { + Assertions.assertEquals(RED, ColorHelper.parseColor("#FF5556")); } @Test - void namedTextColorsArePresentinIndex() { - Index namesIndex = NamedTextColor.NAMES; - Set keys = namesIndex.keys(); - Set expectedNames = ColorHelper.ALL_NAMED_COLORS.stream().map(c -> c.toString().toLowerCase()).collect(Collectors.toSet()); - Assertions.assertTrue(keys.containsAll(expectedNames), "NAMES index should contain all expected colors"); + void returnConfiguredColor() { + YamlConfiguration config = new YamlConfiguration(); + config.set("Color", "RED"); + Assertions.assertEquals(RED, ColorHelper.configColor(config)); + } + + @Test + void returnsDarkPurpleAsDefaultConfigColor() { + YamlConfiguration config = new YamlConfiguration(); + Assertions.assertEquals(DARK_PURPLE, ColorHelper.configColor(config)); } } \ No newline at end of file From 83d40073dac560582b3e811a65cfed9adb2c2c9b Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Sat, 11 Apr 2026 21:36:51 +0100 Subject: [PATCH 17/58] Code cleanup --- .../listener/PlayerAdvancedAchievementListener.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java index 80205651..b838f893 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java @@ -20,7 +20,6 @@ import jakarta.inject.Named; import jakarta.inject.Singleton; import java.time.Duration; -import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.Random; @@ -277,9 +276,11 @@ private void displayFirework(@NonNull Player player) { /** * Gets the type of the firework, which can either be predefined or random. + * Can be set to random via the config * * @return the firework type. */ + @SuppressWarnings("unused") private Type getFireworkType() { if ("RANDOM".equals(configFireworkStyle)) { Type[] fireworkTypes = Type.values(); From 729fa2327c8ece86f574e49115a513b68eaa9219 Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Sat, 11 Apr 2026 22:13:40 +0100 Subject: [PATCH 18/58] Fix gui elements having color codes written in --- .../com/hm/achievement/gui/CategoryGUI.java | 147 ++++++++---------- .../java/com/hm/achievement/gui/MainGUI.java | 22 +-- .../com/hm/achievement/utils/ColorHelper.java | 47 +++--- .../hm/achievement/utils/ColorHelperTest.java | 4 +- 4 files changed, 92 insertions(+), 128 deletions(-) diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/CategoryGUI.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/CategoryGUI.java index 58180a16..ecdce512 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/CategoryGUI.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/CategoryGUI.java @@ -9,6 +9,7 @@ import com.hm.achievement.domain.Achievement; import com.hm.achievement.domain.Reward; import com.hm.achievement.lifecycle.Reloadable; +import com.hm.achievement.utils.ColorHelper; import com.hm.achievement.utils.NumberHelper; import com.hm.achievement.utils.StringHelper; import jakarta.inject.Inject; @@ -28,10 +29,9 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; +import net.kyori.adventure.text.format.NamedTextColor; import org.apache.commons.lang3.StringUtils; import org.bukkit.Bukkit; -import org.bukkit.ChatColor; import org.bukkit.NamespacedKey; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; @@ -39,7 +39,6 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.persistence.PersistentDataType; -import org.jetbrains.annotations.Contract; import org.jspecify.annotations.NonNull; /** @@ -77,19 +76,19 @@ public class CategoryGUI implements Reloadable { private boolean configNumberedItemsInList; private boolean configBackButtonIsCategoryItem; private String configFormatNotReceived; - private String langListBackMessage; - private String langListBackLore; - private String langListGUITitle; + private String configColorCode; + private String configListColorNotReceivedCode; private String langListAchievementReceived; private String langListAchievementNotReceived; - private String langListDescription; - private String langListReception; - private String langListGoal; - private String langListProgress; - private String langListReward; - private String langListRewards; - private ChatColor configColor; - private ChatColor configListColorNotReceived; + private Component langListBackMessage; + private Component langListBackLore; + private Component langListGUITitle; + private Component langListDescription; + private Component langListReception; + private Component langListGoal; + private Component langListProgress; + private Component langListReward; + private Component langListRewards; @Inject public CategoryGUI(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, CacheManager cacheManager, AbstractDatabaseManager databaseManager, GUIItems guiItems, AchievementMap achievementMap) { @@ -109,27 +108,29 @@ public void extractConfigurationParameters() { configHideRewardDisplayInList = mainConfig.getBoolean("HideRewardDisplayInList"); configEnrichedProgressBars = mainConfig.getBoolean("EnrichedListProgressBars"); configNumberedItemsInList = mainConfig.getBoolean("NumberedItemsInList"); - configColor = ChatColor.getByChar(Objects.requireNonNull(mainConfig.getString("Color"))); - configListColorNotReceived = ChatColor.getByChar(Objects.requireNonNull(mainConfig.getString("ListColorNotReceived"))); + NamedTextColor configColor = ColorHelper.configColor(mainConfig); + configColorCode = ColorHelper.namedTextColorToLegacyAmpersand(configColor); + NamedTextColor configListColorNotReceived = ColorHelper.parseColor(mainConfig.getString("ListColorNotReceived")); + configListColorNotReceivedCode = ColorHelper.namedTextColorToLegacyAmpersand(configListColorNotReceived); configFormatNotReceived = mainConfig.getBoolean("ListItaliciseNotReceived") ? "&o" : ""; configBackButtonIsCategoryItem = mainConfig.getBoolean("BackButtonIsCategoryItem"); - langListBackMessage = translateColorCodes(langConfig.getString("list-back-message")); - langListBackLore = translateColorCodes(langConfig.getString("list-back-lore")); - langListGUITitle = translateColorCodes(langConfig.getString("list-gui-title")); + langListBackMessage = ColorHelper.legacyAmpersandToComponent(langConfig.getString("list-back-message")); + langListBackLore = ColorHelper.legacyAmpersandToComponent(langConfig.getString("list-back-lore")); + langListGUITitle = ColorHelper.legacyAmpersandToComponent(langConfig.getString("list-gui-title")); langListAchievementReceived = StringHelper.unescapeJava(langConfig.getString("list-achievement-received")); - langListAchievementNotReceived = StringHelper.unescapeJava(langConfig.getString("list-achievement-not-received")) + configListColorNotReceived; + langListAchievementNotReceived = StringHelper.unescapeJava(langConfig.getString("list-achievement-not-received")) + configListColorNotReceivedCode; String description = langConfig.getString("list-description"); - langListDescription = Objects.requireNonNull(description).isEmpty() ? "" : translateColorCodes("&7&l" + description); + langListDescription = Objects.requireNonNull(description).isEmpty() ? Component.empty() : ColorHelper.legacyAmpersandToComponent("&7&l" + description); String reception = langConfig.getString("list-reception"); - langListReception = Objects.requireNonNull(reception).isEmpty() ? "" : translateColorCodes("&7&l" + reception); + langListReception = Objects.requireNonNull(reception).isEmpty() ? Component.empty() : ColorHelper.legacyAmpersandToComponent("&7&l" + reception); String goal = langConfig.getString("list-goal"); - langListGoal = Objects.requireNonNull(goal).isEmpty() ? "" : translateColorCodes("&7&l" + goal); + langListGoal = Objects.requireNonNull(goal).isEmpty() ? Component.empty() : ColorHelper.legacyAmpersandToComponent("&7&l" + goal); String progress = langConfig.getString("list-progress"); - langListProgress = Objects.requireNonNull(progress).isEmpty() ? "" : translateColorCodes("&7&l" + progress); + langListProgress = Objects.requireNonNull(progress).isEmpty() ? Component.empty() : ColorHelper.legacyAmpersandToComponent("&7&l" + progress); String reward = langConfig.getString("list-reward"); - langListReward = Objects.requireNonNull(reward).isEmpty() ? "" : translateColorCodes("&7&l" + reward); + langListReward = Objects.requireNonNull(reward).isEmpty() ? Component.empty() : ColorHelper.legacyAmpersandToComponent("&7&l" + reward); String rewards = langConfig.getString("list-rewards"); - langListRewards = Objects.requireNonNull(rewards).isEmpty() ? "" : translateColorCodes("&7&l" + rewards); + langListRewards = Objects.requireNonNull(rewards).isEmpty() ? Component.empty() : ColorHelper.legacyAmpersandToComponent("&7&l" + rewards); } /** @@ -151,7 +152,7 @@ public void displayCategoryGUI(ItemStack item, Player player, int requestedPage) long statistic = getNormalStatistic((NormalAchievements) category, player); subcategoriesToStatistics = Collections.singletonMap(NO_SUBCATEGORY, statistic); } else { - subcategoriesToStatistics = achievements.stream().collect(Collectors.toMap(Achievement::getSubcategory, a -> NO_STAT)); + subcategoriesToStatistics = achievements.stream().collect(Collectors.toMap(Achievement::getSubcategory, _ -> NO_STAT)); } displayPage(player, subcategoriesToStatistics, requestedPage, item, achievements); return; @@ -176,7 +177,7 @@ private void displayPage(Player player, Map subcategoriesToStatist // The inventory must be big enough to contain all page achievements and an entire row for the navigation items. int guiSize = Math.min(NumberHelper.nextMultipleOf9(achievements.size()), MAX_ACHIEVEMENTS_PER_PAGE) + ROW_SIZE; AchievementInventoryHolder inventoryHolder = new AchievementInventoryHolder(pageIndex, clickedItem); - Inventory inventory = Bukkit.createInventory(inventoryHolder, guiSize, Component.text(langListGUITitle)); + Inventory inventory = Bukkit.createInventory(inventoryHolder, guiSize, langListGUITitle); inventoryHolder.setInventory(inventory); String previousItemDate = null; @@ -212,7 +213,7 @@ private void displayPage(Player player, Map subcategoriesToStatist if (configHideProgressiveAchievements && ineligibleSeriesItem) { inventory.setItem(index - pageStart, guiItems.getAchievementLock()); } else { - List lore = buildLore(achievement, receptionDate, statistic, ineligibleSeriesItem, player); + List lore = buildLore(achievement, receptionDate, statistic, ineligibleSeriesItem, player); insertAchievement(inventory, index - pageStart, statistic, achievement.getDisplayName(), receptionDate, ineligibleSeriesItem, index - seriesStart, lore, achievement.getType()); } @@ -221,29 +222,29 @@ private void displayPage(Player player, Map subcategoriesToStatist } // Add navigation items. + ItemStack backButton; if (configBackButtonIsCategoryItem) { - ItemStack backButton = clickedItem.clone(); + backButton = clickedItem.clone(); ItemMeta backMeta = backButton.getItemMeta(); if (backMeta != null) { - backMeta.displayName(Component.text(langListBackMessage)); - if (StringUtils.isNotBlank(langListBackLore)) { - backMeta.lore(Collections.singletonList(Component.text(langListBackLore))); + backMeta.displayName(langListBackMessage); + if (langListBackLore != Component.empty()) { + backMeta.lore(Collections.singletonList(langListBackLore)); } else { backMeta.lore(Collections.emptyList()); } backMeta.getPersistentDataContainer().set(BACK_BUTTON_KEY, PersistentDataType.BYTE, (byte) 1); backButton.setItemMeta(backMeta); } - inventory.setItem(guiSize - (ROW_SIZE + 1) / 2, backButton); } else { - ItemStack backButton = guiItems.getBackButton().clone(); + backButton = guiItems.getBackButton().clone(); ItemMeta backMeta = backButton.getItemMeta(); if (backMeta != null) { backMeta.getPersistentDataContainer().set(BACK_BUTTON_KEY, PersistentDataType.BYTE, (byte) 1); backButton.setItemMeta(backMeta); } - inventory.setItem(guiSize - (ROW_SIZE + 1) / 2, backButton); } + inventory.setItem(guiSize - (ROW_SIZE + 1) / 2, backButton); if (pageIndex > 0) { inventory.setItem(guiSize - ROW_SIZE, guiItems.getPreviousButton()); } @@ -266,7 +267,7 @@ private void displayPage(Player player, Map subcategoriesToStatist * @param lore * @param type */ - private void insertAchievement(Inventory gui, int position, long statistic, String name, String date, boolean ineligibleSeriesItem, int seriesIndex, List lore, String type) { + private void insertAchievement(Inventory gui, int position, long statistic, String name, String date, boolean ineligibleSeriesItem, int seriesIndex, List lore, String type) { // Display an item depending on whether the achievement was received or not, or whether progress was started. // Clone in order to work with an independent set of metadata. ItemStack achItem; @@ -280,9 +281,8 @@ private void insertAchievement(Inventory gui, int position, long statistic, Stri String displayName = date == null ? langListAchievementNotReceived + notReceivedStyle(name, ineligibleSeriesItem) : langListAchievementReceived + name; ItemMeta itemMeta = achItem.getItemMeta(); - itemMeta.displayName(Component.text(translateColorCodes(displayName))); - List loreComponents = lore.stream().map(this::translateColorCodes).map(Component::text).collect(Collectors.toList()); - itemMeta.lore(loreComponents); + itemMeta.displayName(ColorHelper.legacyAmpersandToComponent(displayName)); + itemMeta.lore(lore); achItem.setItemMeta(itemMeta); if (configNumberedItemsInList) { achItem.setAmount(seriesIndex + 1); @@ -355,50 +355,42 @@ private int getPageIndex(int requestedPage, int totalAchievements) { * @param player * @return the list representing the lore of a category item */ - private @NonNull List buildLore(Achievement achievement, String date, long statistic, boolean ineligibleSeriesItem, Player player) { + private @NonNull List buildLore(Achievement achievement, String date, long statistic, boolean ineligibleSeriesItem, Player player) { List descriptions = getDescriptionsToDisplay(achievement, date != null); - List lore = new ArrayList<>(); - lore.add(""); + List lore = new ArrayList<>(); + lore.add(Component.empty()); if (date != null) { - if (!langListDescription.isEmpty()) { - lore.add(langListDescription); - } - descriptions.forEach(d -> lore.add(translateColorCodes("&r&f" + d))); - lore.add(""); - if (!langListReception.isEmpty()) { - lore.add(langListReception); - } - lore.add(translateColorCodes("&r&f" + date)); + if (langListDescription != Component.empty()) lore.add(langListDescription); + descriptions.forEach(d -> lore.add(ColorHelper.legacyAmpersandToComponent("&r&f" + d))); + lore.add(Component.empty()); + if (langListReception != Component.empty()) lore.add(langListReception); + lore.add(ColorHelper.legacyAmpersandToComponent("&r&f" + date)); } else { - if (!langListGoal.isEmpty()) { - lore.add(langListGoal); - } - descriptions.forEach(d -> lore.add(translateColorCodes(notReceivedStyle(d, ineligibleSeriesItem)))); + if (langListGoal != Component.empty()) lore.add(langListGoal); + descriptions.forEach(d -> lore.add(ColorHelper.legacyAmpersandToComponent(notReceivedStyle(d, ineligibleSeriesItem)))); // Display progress if not Commands category. if (!configObfuscateNotReceived && statistic != NO_STAT) { - lore.add(""); + lore.add(Component.empty()); boolean timeStat = NormalAchievements.PLAYEDTIME == achievement.getCategory(); - if (!langListProgress.isEmpty()) { - lore.add(langListProgress); - } - lore.add(translateColorCodes(constructProgressBar(achievement.getThreshold(), statistic, timeStat))); + if (langListProgress != Component.empty()) lore.add(langListProgress); + lore.add(ColorHelper.legacyAmpersandToComponent(constructProgressBar(achievement.getThreshold(), statistic, timeStat))); } } List rewards = achievement.getRewards(); // Add the rewards' information. if (!rewards.isEmpty() && !configHideRewardDisplayInList) { - lore.add(""); - if (rewards.size() == 1 && !langListReward.isEmpty()) { + lore.add(Component.empty()); + if (rewards.size() == 1 && langListReward != Component.empty()) { lore.add(langListReward); - } else if (rewards.size() > 1 && !langListRewards.isEmpty()) { + } else if (rewards.size() > 1 && langListReward != Component.empty()) { lore.add(langListRewards); } - String dot = StringHelper.unescapeJava(date == null ? configListColorNotReceived + "● " + configFormatNotReceived : "&r&f● "); + String dot = StringHelper.unescapeJava(date == null ? configListColorNotReceivedCode + "● " + configFormatNotReceived : "&r&f● "); for (Reward reward : rewards) { for (String listText : reward.listTexts()) { - lore.add(LegacyComponentSerializer.legacyAmpersand().serialize(StringHelper.replacePlayerPlaceholders(translateColorCodes(dot + listText), player))); + lore.add(StringHelper.replacePlayerPlaceholders(ColorHelper.legacyAmpersandToComponent(dot + listText), player)); } } } @@ -425,9 +417,9 @@ private int getPageIndex(int requestedPage, int totalAchievements) { statisticDouble = statistic; // Cast to double. statisticString = Long.toString(statistic); } - String middleText = " " + configListColorNotReceived + configFormatNotReceived + statisticString + "/" + threshold + " "; + String middleText = " " + configListColorNotReceivedCode + configFormatNotReceived + statisticString + "/" + threshold + " "; - StringBuilder barDisplay = new StringBuilder().append(configListColorNotReceived).append("[").append(configColor); + StringBuilder barDisplay = new StringBuilder().append(configListColorNotReceivedCode).append("[").append(configColorCode); // Approximation: colours chars account for no size, spaces ~2 vertical bars, other chars ~3 vertical bars. int middleTextSize = configEnrichedProgressBars ? (middleText.length() - 6) * 3 + 4 : 0; boolean hasDisplayedMiddleText = false; @@ -438,7 +430,7 @@ private int getPageIndex(int requestedPage, int totalAchievements) { // Middle reached: append enriched statistic information. barDisplay.append(middleText); if (!hasDisplayedNotReceivedColor) { - barDisplay.append(configColor); + barDisplay.append(configColorCode); } // Do not display middleText again. hasDisplayedMiddleText = true; @@ -448,14 +440,14 @@ private int getPageIndex(int requestedPage, int totalAchievements) { i = PROGRESS_BAR_SIZE - i; } else { if (i >= PROGRESS_BAR_SIZE * statisticDouble / threshold && !hasDisplayedNotReceivedColor) { - // Not received color: amount not yet reached by user. + // Not received colour: amount not yet reached by user. hasDisplayedNotReceivedColor = true; - barDisplay.append(configListColorNotReceived); + barDisplay.append(configListColorNotReceivedCode); } barDisplay.append("|"); } } - return barDisplay.append(configListColorNotReceived).append("]").toString(); + return barDisplay.append(configListColorNotReceivedCode).append("]").toString(); } /** @@ -483,14 +475,9 @@ private int getPageIndex(int requestedPage, int totalAchievements) { private @NonNull String notReceivedStyle(String input, boolean ineligibleSeriesItem) { if (configObfuscateNotReceived || (configObfuscateProgressiveAchievements && ineligibleSeriesItem)) { - return configListColorNotReceived + "&k" + randomiseParts(StringHelper.removeFormattingCodes(input)); + return configListColorNotReceivedCode + "&k" + randomiseParts(StringHelper.removeFormattingCodes(input)); } else { - return configListColorNotReceived + configFormatNotReceived + StringHelper.removeFormattingCodes(input); + return configListColorNotReceivedCode + configFormatNotReceived + StringHelper.removeFormattingCodes(input); } } - - @Contract("_ -> new") - private @NonNull String translateColorCodes(String translate) { - return ChatColor.translateAlternateColorCodes('&', translate); - } -} +} \ No newline at end of file diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/MainGUI.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/MainGUI.java index edd82bb1..f65b70c5 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/MainGUI.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/MainGUI.java @@ -6,6 +6,7 @@ import com.hm.achievement.config.AchievementMap; import com.hm.achievement.db.CacheManager; import com.hm.achievement.lifecycle.Reloadable; +import com.hm.achievement.utils.ColorHelper; import jakarta.inject.Inject; import jakarta.inject.Named; import jakarta.inject.Singleton; @@ -16,7 +17,6 @@ import net.kyori.adventure.text.Component; import org.apache.commons.lang3.StringUtils; import org.bukkit.Bukkit; -import org.bukkit.ChatColor; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; @@ -37,18 +37,14 @@ public class MainGUI implements Reloadable { private final Set disabledCategories; private final GUIItems guiItems; private final AchievementMap achievementMap; - private boolean configHideNotReceivedCategories; private boolean configHideNoPermissionCategories; - private String langListAchievementsInCategoryPlural; private String langListAchievementInCategorySingular; - private Component langListGUITitle; @Inject - public MainGUI(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, - CacheManager cacheManager, Set disabledCategories, GUIItems guiItems, AchievementMap achievementMap) { + public MainGUI(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, CacheManager cacheManager, Set disabledCategories, GUIItems guiItems, AchievementMap achievementMap) { this.mainConfig = mainConfig; this.langConfig = langConfig; this.cacheManager = cacheManager; @@ -61,7 +57,7 @@ public MainGUI(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlC public void extractConfigurationParameters() { configHideNotReceivedCategories = mainConfig.getBoolean("HideNotReceivedCategories"); configHideNoPermissionCategories = mainConfig.getBoolean("HideNoPermissionCategories"); - langListGUITitle = Component.text(Objects.requireNonNull(langConfig.getString("list-gui-title"))); + langListGUITitle = ColorHelper.legacySectionSignToComponent(langConfig.getString("list-gui-title")); langListAchievementsInCategoryPlural = langConfig.getString("list-achievements-in-category-plural"); langListAchievementInCategorySingular = langConfig.getString("list-achievements-in-category-singular"); } @@ -78,7 +74,6 @@ public void displayMainGUI(Player player) { int guiSize = ((totalEnabledCategories - 1) / 9 + 1) * 9; // Round up to multiple of 9 Inventory mainGUI = Bukkit.createInventory(inventoryHolder, guiSize, langListGUITitle); inventoryHolder.setInventory(mainGUI); - int displayedSoFar = 0; for (Entry achievementItem : guiItems.getOrderedAchievementItems().entrySet()) { Category category = achievementItem.getKey().category(); @@ -88,7 +83,6 @@ public void displayMainGUI(Player player) { ++displayedSoFar; } } - // Display the main GUI to the player. player.openInventory(mainGUI); } @@ -103,9 +97,7 @@ public void displayMainGUI(Player player) { */ private boolean shouldDisplayCategory(ItemStack item, Player player, Category category) { // Hide category if an empty name is defined for it, if it's disabled or if the player is missing permissions. - return item.getItemMeta().hasCustomName() && !Objects.requireNonNull(item.getItemMeta().customName()).equals(Component.empty()) && - !disabledCategories.contains(category) - && (!configHideNoPermissionCategories || player.hasPermission(category.toPermName())); + return item.getItemMeta().hasCustomName() && !Objects.requireNonNull(item.getItemMeta().customName()).equals(Component.empty()) && !disabledCategories.contains(category) && (!configHideNoPermissionCategories || player.hasPermission(category.toPermName())); } /** @@ -118,9 +110,7 @@ private boolean shouldDisplayCategory(ItemStack item, Player player, Category ca * @param position */ private void displayCategory(ItemStack item, Inventory gui, Player player, Category category, int position) { - long receivedAmount = achievementMap.getForCategory(category).stream() - .filter(a -> cacheManager.hasPlayerAchievement(player.getUniqueId(), a.getName())) - .count(); + long receivedAmount = achievementMap.getForCategory(category).stream().filter(a -> cacheManager.hasPlayerAchievement(player.getUniqueId(), a.getName())).count(); if (!configHideNotReceivedCategories || receivedAmount > 0) { int totalAmount = achievementMap.getForCategory(category).size(); String message = totalAmount > 1 ? langListAchievementsInCategoryPlural : langListAchievementInCategorySingular; @@ -130,7 +120,7 @@ private void displayCategory(ItemStack item, Inventory gui, Player player, Categ ItemStack itemWithLore = item.clone(); ItemMeta itemMetaWithLore = itemWithLore.getItemMeta(); String amountMessage = StringUtils.replaceEach(message, new String[]{"AMOUNT"}, new String[]{receivedAmount + "/" + totalAmount}); - List loreComponents = List.of(Component.text(ChatColor.translateAlternateColorCodes('&', "&8" + amountMessage))); + List loreComponents = List.of(ColorHelper.legacyAmpersandToComponent(amountMessage)); itemMetaWithLore.lore(loreComponents); itemWithLore.setItemMeta(itemMetaWithLore); gui.setItem(position, itemWithLore); diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/ColorHelper.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/ColorHelper.java index 9a236564..d6062176 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/ColorHelper.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/ColorHelper.java @@ -1,44 +1,20 @@ package com.hm.achievement.utils; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; +import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextColor; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.bukkit.configuration.file.YamlConfiguration; import org.jspecify.annotations.NonNull; -import static net.kyori.adventure.text.format.NamedTextColor.AQUA; -import static net.kyori.adventure.text.format.NamedTextColor.BLACK; -import static net.kyori.adventure.text.format.NamedTextColor.BLUE; -import static net.kyori.adventure.text.format.NamedTextColor.DARK_AQUA; -import static net.kyori.adventure.text.format.NamedTextColor.DARK_BLUE; -import static net.kyori.adventure.text.format.NamedTextColor.DARK_GRAY; -import static net.kyori.adventure.text.format.NamedTextColor.DARK_GREEN; -import static net.kyori.adventure.text.format.NamedTextColor.DARK_PURPLE; -import static net.kyori.adventure.text.format.NamedTextColor.DARK_RED; -import static net.kyori.adventure.text.format.NamedTextColor.GOLD; -import static net.kyori.adventure.text.format.NamedTextColor.GRAY; -import static net.kyori.adventure.text.format.NamedTextColor.GREEN; -import static net.kyori.adventure.text.format.NamedTextColor.LIGHT_PURPLE; -import static net.kyori.adventure.text.format.NamedTextColor.NAMES; -import static net.kyori.adventure.text.format.NamedTextColor.RED; -import static net.kyori.adventure.text.format.NamedTextColor.WHITE; -import static net.kyori.adventure.text.format.NamedTextColor.YELLOW; - public class ColorHelper { - protected static final List ALL_NAMED_COLORS = List.of(BLACK, DARK_BLUE, DARK_GREEN, DARK_AQUA, DARK_RED, DARK_PURPLE, GOLD, GRAY, DARK_GRAY, BLUE, GREEN, AQUA, RED, LIGHT_PURPLE, YELLOW, WHITE); - private static final Map EXACT_RGB_MAP = ALL_NAMED_COLORS.stream().collect(Collectors.toMap(c -> (c.red() << 16) | (c.green() << 8) | c.blue(), c -> c)); - - static NamedTextColor parseColor(String color) { - if (color == null) return WHITE; - NamedTextColor named = NAMES.value(color.toLowerCase()); + public static NamedTextColor parseColor(String color) { + if (color == null) return NamedTextColor.WHITE; + NamedTextColor named = NamedTextColor.NAMES.value(color.toLowerCase()); if (named != null) return named; try { int rgb = Integer.parseInt(color.replace("#", ""), 16); - NamedTextColor exact = EXACT_RGB_MAP.get(rgb); - if (exact != null) return exact; return NamedTextColor.nearestTo(TextColor.color(rgb)); } catch (IllegalArgumentException e) { throw new RuntimeException("Invalid color: " + color, e); @@ -52,4 +28,17 @@ public static NamedTextColor configColor(@NonNull YamlConfiguration mainConfig) public static NamedTextColor configFireworkColor(@NonNull YamlConfiguration mainConfig) { return parseColor(mainConfig.getString("FireworkColor", "DARK_PURPLE")); } + + // TODO: Find all of these legacy ones and make them modern so this can be removed + public static @NonNull Component legacySectionSignToComponent(String text) { + return LegacyComponentSerializer.legacySection().deserialize(text); + } + + public static @NonNull Component legacyAmpersandToComponent(String text) { + return LegacyComponentSerializer.legacyAmpersand().deserialize(text); + } + + public static @NonNull String namedTextColorToLegacyAmpersand(NamedTextColor color) { + return LegacyComponentSerializer.legacyAmpersand().serialize(Component.empty().color(color)).replace("%r", ""); + } } \ No newline at end of file diff --git a/advanced-achievements-plugin/src/test/java/com/hm/achievement/utils/ColorHelperTest.java b/advanced-achievements-plugin/src/test/java/com/hm/achievement/utils/ColorHelperTest.java index a26e84e0..76c0d850 100644 --- a/advanced-achievements-plugin/src/test/java/com/hm/achievement/utils/ColorHelperTest.java +++ b/advanced-achievements-plugin/src/test/java/com/hm/achievement/utils/ColorHelperTest.java @@ -2,7 +2,6 @@ import java.util.Locale; import java.util.Set; -import java.util.stream.Collectors; import java.util.stream.Stream; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.util.Index; @@ -64,8 +63,7 @@ void returnWhiteWhenParsingNull() { void namedTextColorsArePresentInIndex() { Index namesIndex = NamedTextColor.NAMES; Set keys = namesIndex.keys(); - Set expectedNames = ColorHelper.ALL_NAMED_COLORS.stream().map(c -> c.toString().toLowerCase()).collect(Collectors.toSet()); - Assertions.assertTrue(keys.containsAll(expectedNames), "NAMES index should contain all expected colors"); + Assertions.assertTrue(keys.isEmpty(), "NAMES index should contain all expected colors"); } @Test From 1d4603ce0d1c090776b7bd1e0e1aba9b6607a193 Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Sun, 12 Apr 2026 18:18:05 +0100 Subject: [PATCH 19/58] Remove all instances of ChatColor --- .../com/hm/achievement/domain/Reward.java | 5 +- .../executable/AbstractRankingCommand.java | 32 ++--- .../command/executable/InspectCommand.java | 20 +-- .../command/pagination/CommandPagination.java | 20 +-- .../pagination/SupplierCommandPagination.java | 23 ++-- .../hm/achievement/config/RewardParser.java | 28 ++-- .../com/hm/achievement/gui/CategoryGUI.java | 30 ++--- .../java/com/hm/achievement/gui/MainGUI.java | 4 +- .../PlayerAdvancedAchievementListener.java | 69 +++++----- .../com/hm/achievement/utils/ColorHelper.java | 7 +- .../achievement/utils/FancyMessageSender.java | 3 +- .../pagination/CommandPaginationTest.java | 127 ++++-------------- .../achievement/config/RewardParserTest.java | 33 ++--- ...PlayerAdvancedAchievementListenerTest.java | 5 +- .../hm/achievement/utils/ColorHelperTest.java | 2 +- 15 files changed, 141 insertions(+), 267 deletions(-) diff --git a/advanced-achievements-api/src/main/java/com/hm/achievement/domain/Reward.java b/advanced-achievements-api/src/main/java/com/hm/achievement/domain/Reward.java index 3ec4c4fd..98bc6f39 100644 --- a/advanced-achievements-api/src/main/java/com/hm/achievement/domain/Reward.java +++ b/advanced-achievements-api/src/main/java/com/hm/achievement/domain/Reward.java @@ -2,9 +2,8 @@ import java.util.List; import java.util.function.Consumer; +import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; -public record Reward(List listTexts, List chatTexts, Consumer rewarder) { - - +public record Reward(List listTexts, List chatTexts, Consumer rewarder) { } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractRankingCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractRankingCommand.java index f2e06a9e..07329db9 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractRankingCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractRankingCommand.java @@ -12,6 +12,7 @@ import java.util.Objects; import java.util.UUID; import java.util.logging.Logger; +import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.apache.commons.lang3.math.NumberUtils; import org.bukkit.Bukkit; @@ -19,6 +20,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; +import org.jspecify.annotations.NonNull; /** * Abstract class in charge of factoring out common functionality for /aach top, week and month commands. @@ -86,7 +88,7 @@ public void onExecute(CommandSender sender, String[] args) { sender.sendMessage(langPeriodAchievement); - List rankingMessages = getRankingMessages(sender); + List rankingMessages = getRankingMessages(sender); // If config has top set at less than one page, don't use pagination. if (configTopList < PER_PAGE) { @@ -114,27 +116,22 @@ public void onExecute(CommandSender sender, String[] args) { } } - private int getPage(String[] args) { + private int getPage(String @NonNull [] args) { return args.length > 1 && NumberUtils.isDigits(args[1]) ? Integer.parseInt(args[1]) : 1; } - private List getRankingMessages(CommandSender sender) { - List rankingMessages = new ArrayList<>(); + private @NonNull List getRankingMessages(CommandSender sender) { + List rankingMessages = new ArrayList<>(); int currentRank = 1; for (Entry ranking : cachedSortedRankings.entrySet()) { String playerName = Bukkit.getOfflinePlayer(UUID.fromString(ranking.getKey())).getName(); if (playerName != null) { - // Color the name of the player if he is in the top list. + // Colour the name of the player if he is in the top list. NamedTextColor color = playerName.equals(sender.getName()) ? configColor : NamedTextColor.GRAY; - rankingMessages.add(color + " " + getRankingSymbol(currentRank) + " " + playerName + " - " + ranking.getValue()); - } else { - logger.warning("Ranking command: could not find player's name using a database UUID."); - } - + rankingMessages.add(Component.text(" " + getRankingSymbol(currentRank) + " " + playerName + " - " + ranking.getValue()).color(color)); + } else logger.warning("Ranking command: could not find player's name using a database UUID."); ++currentRank; - if (currentRank > configTopList) { - break; - } + if (currentRank > configTopList) break; } return rankingMessages; } @@ -172,12 +169,7 @@ private String getRankingSymbol(int rank) { * @param player player */ private void launchEffects(Player player) { - if (configAdditionalEffects) { - player.spawnParticle(Particle.PORTAL, player.getLocation(), 100, 0, 1, 0, 0.5f); - } - - if (configSound) { - soundPlayer.play(player, configSoundRanking, "ENTITY_FIREWORK_ROCKET_BLAST"); - } + if (configAdditionalEffects) player.spawnParticle(Particle.PORTAL, player.getLocation(), 100, 0, 1, 0, 0.5f); + if (configSound) soundPlayer.play(player, configSoundRanking, "ENTITY_FIREWORK_ROCKET_BLAST"); } } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InspectCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InspectCommand.java index d251c843..6990923a 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InspectCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InspectCommand.java @@ -19,6 +19,7 @@ import java.util.UUID; import java.util.function.Supplier; import java.util.stream.Collectors; +import net.kyori.adventure.text.Component; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import org.bukkit.OfflinePlayer; @@ -43,7 +44,7 @@ public class InspectCommand extends AbstractCommand { private final AchievementMap achievementMap; private final Map lastCached; - private final Map cachedPaginations; + private final Map cachedPagination; @Inject public InspectCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, StringBuilder pluginHeader, AdvancedAchievements advancedAchievements, AbstractDatabaseManager databaseManager, AchievementMap achievementMap) { @@ -51,9 +52,8 @@ public InspectCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang" this.advancedAchievements = advancedAchievements; this.databaseManager = databaseManager; this.achievementMap = achievementMap; - this.lastCached = new HashMap<>(); - this.cachedPaginations = new HashMap<>(); + this.cachedPagination = new HashMap<>(); } @SuppressWarnings("EmptyMethod") @@ -84,7 +84,7 @@ void onExecute(CommandSender sender, String[] args) { checkAndCache(achievement.getName()); // Send pagination - SupplierCommandPagination pagination = cachedPaginations.get(achievement.getName()); + SupplierCommandPagination pagination = cachedPagination.get(achievement.getName()); pagination.sendPage(page, sender); }); } @@ -115,7 +115,7 @@ private void cleanUpCache() { } } for (String achievementName : toRemove) { - cachedPaginations.remove(achievementName); + cachedPagination.remove(achievementName); lastCached.remove(achievementName); } @@ -124,18 +124,18 @@ private void cleanUpCache() { private void checkAndCache(String achievementName) { if (System.currentTimeMillis() - CACHE_EXPIRATION_DELAY > lastCached.getOrDefault(achievementName, 0L)) { List recipientList = databaseManager.getAchievementsRecipientList(achievementName); - List> messages; - if (recipientList.isEmpty()) messages = List.of(() -> "No one has this achievement yet"); + List> messages; + if (recipientList.isEmpty()) messages = List.of(() -> Component.text("No one has this achievement yet")); else { - messages = recipientList.stream().map(achievement -> (Supplier) () -> { + messages = recipientList.stream().map(achievement -> (Supplier) () -> { UUID uuid = achievement.awardedTo(); OfflinePlayer player = advancedAchievements.getServer().getOfflinePlayer(uuid); String identifier = player.hasPlayedBefore() ? player.getName() : uuid.toString(); - return " " + identifier + " (" + achievement.formattedDate() + ")"; + return Component.text(" " + identifier + " (" + achievement.formattedDate() + ")"); }).collect(Collectors.toList()); } SupplierCommandPagination pagination = new SupplierCommandPagination(messages, PER_PAGE, langConfig); - cachedPaginations.put(achievementName, pagination); + cachedPagination.put(achievementName, pagination); lastCached.put(achievementName, System.currentTimeMillis()); } } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/pagination/CommandPagination.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/pagination/CommandPagination.java index 290f3fac..32ca8cc0 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/pagination/CommandPagination.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/pagination/CommandPagination.java @@ -1,10 +1,10 @@ package com.hm.achievement.command.pagination; +import com.hm.achievement.utils.ColorHelper; import java.util.List; -import java.util.Objects; import java.util.function.Consumer; +import net.kyori.adventure.text.Component; import org.apache.commons.lang3.StringUtils; -import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.YamlConfiguration; import org.jetbrains.annotations.Contract; @@ -23,14 +23,14 @@ */ public class CommandPagination { - private final List toPaginate; + private final List toPaginate; private final YamlConfiguration langConfig; private final int perPage; private final int size; private final int maxPage; @Contract(pure = true) - public CommandPagination(@NonNull List toPaginate, int perPage, YamlConfiguration langConfig) { + public CommandPagination(@NonNull List toPaginate, int perPage, YamlConfiguration langConfig) { this.toPaginate = toPaginate; size = toPaginate.size(); this.perPage = perPage; @@ -44,16 +44,11 @@ public void sendPage(int page, @NonNull CommandSender to) { sendPage(page, to::sendMessage); } - public void sendPage(int page, @NonNull Consumer to) { + public void sendPage(int page, @NonNull Consumer to) { int pageToSend = Math.min(page, maxPage); - - String header = ChatColor.translateAlternateColorCodes('&', - Objects.requireNonNull(StringUtils.replaceEach(langConfig.getString("pagination-header"), new String[]{"PAGE", "MAX"}, - new String[]{Integer.toString(pageToSend), Integer.toString(maxPage)}))); - String footer = ChatColor.translateAlternateColorCodes('&', Objects.requireNonNull(langConfig.getString("pagination-footer"))); - + Component header = ColorHelper.convertAmpersandToComponent(StringUtils.replaceEach(langConfig.getString("pagination-header"), new String[]{"PAGE", "MAX"}, new String[]{Integer.toString(pageToSend), Integer.toString(maxPage)})); + Component footer = ColorHelper.convertAmpersandToComponent(langConfig.getString("pagination-footer")); to.accept(header); - int index = pageToSend - 1; // Handling case where empty list is given to CommandPagination int pageStart = index > 0 ? (index * perPage) : 0; @@ -62,7 +57,6 @@ public void sendPage(int page, @NonNull Consumer to) { for (int i = pageStart; i < Math.min(nextPageStart, size); i++) { to.accept(toPaginate.get(i)); } - to.accept(footer); } } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/pagination/SupplierCommandPagination.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/pagination/SupplierCommandPagination.java index 9be4884b..90281c59 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/pagination/SupplierCommandPagination.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/pagination/SupplierCommandPagination.java @@ -1,12 +1,12 @@ package com.hm.achievement.command.pagination; +import com.hm.achievement.utils.ColorHelper; import java.util.ArrayList; import java.util.List; -import java.util.Objects; import java.util.function.Consumer; import java.util.function.Supplier; +import net.kyori.adventure.text.Component; import org.apache.commons.lang3.StringUtils; -import org.bukkit.ChatColor; import org.bukkit.configuration.file.YamlConfiguration; import org.jspecify.annotations.NonNull; @@ -23,13 +23,13 @@ */ public class SupplierCommandPagination extends CommandPagination { - private final List> toPaginate; + private final List> toPaginate; private final YamlConfiguration langConfig; private final int perPage; private final int size; private final int maxPage; - public SupplierCommandPagination(@NonNull List> toPaginate, int perPage, YamlConfiguration langConfig) { + public SupplierCommandPagination(@NonNull List> toPaginate, int perPage, YamlConfiguration langConfig) { super(new ArrayList<>(), perPage, langConfig); this.toPaginate = toPaginate; size = toPaginate.size(); @@ -45,23 +45,16 @@ public boolean isEmpty() { } @Override - public void sendPage(int page, @NonNull Consumer to) { + public void sendPage(int page, @NonNull Consumer to) { int pageToSend = Math.min(page, maxPage); - - String header = ChatColor.translateAlternateColorCodes('&', Objects.requireNonNull(StringUtils.replaceEach(langConfig.getString("pagination-header"), new String[]{"PAGE", "MAX"}, new String[]{Integer.toString(pageToSend), Integer.toString(maxPage)}))); - String footer = ChatColor.translateAlternateColorCodes('&', Objects.requireNonNull(langConfig.getString("pagination-footer"))); - + Component header = ColorHelper.convertAmpersandToComponent(StringUtils.replaceEach(langConfig.getString("pagination-header"), new String[]{"PAGE", "MAX"}, new String[]{Integer.toString(pageToSend), Integer.toString(maxPage)})); + Component footer = ColorHelper.convertAmpersandToComponent(langConfig.getString("pagination-footer")); to.accept(header); - int index = pageToSend - 1; // Handling case where empty list is given to CommandPagination int pageStart = index > 0 ? (index * perPage) : 0; int nextPageStart = pageToSend * perPage; - - for (int i = pageStart; i < Math.min(nextPageStart, size); i++) { - to.accept(toPaginate.get(i).get()); - } - + for (int i = pageStart; i < Math.min(nextPageStart, size); i++) to.accept(toPaginate.get(i).get()); to.accept(footer); } } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/config/RewardParser.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/config/RewardParser.java index 0bd9c0a2..22faf6b2 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/config/RewardParser.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/config/RewardParser.java @@ -26,7 +26,6 @@ import net.milkbowl.vault.economy.Economy; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; -import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.Registry; @@ -110,7 +109,7 @@ public List parseRewards(String path) { int amount = configSection.getInt("Money"); String currencyName = amount > 1 ? economy.currencyNamePlural() : economy.currencyNameSingular(); String listText = StringUtils.replaceEach(langConfig.getString("list-reward-money"), new String[]{"AMOUNT"}, new String[]{amount + " " + currencyName}); - String chatText = ChatColor.translateAlternateColorCodes('&', Objects.requireNonNull(StringUtils.replaceEach(langConfig.getString("money-reward-received"), new String[]{"AMOUNT"}, new String[]{amount + " " + currencyName}))); + Component chatText = Component.text(Objects.requireNonNull(StringUtils.replaceEach(langConfig.getString("money-reward-received"), new String[]{"AMOUNT"}, new String[]{amount + " " + currencyName}))); Consumer rewarder = player -> economy.depositPlayer(player, amount); return new Reward(Collections.singletonList(listText), Collections.singletonList(chatText), rewarder); } @@ -118,7 +117,7 @@ public List parseRewards(String path) { @Contract("_ -> new") private @NonNull Reward parseItemReward(@NonNull ConfigurationSection configSection) { List listTexts = new ArrayList<>(); - List chatTexts = new ArrayList<>(); + List chatTexts = new ArrayList<>(); List itemStacks = new ArrayList<>(); String itemPath = configSection.contains("Item") ? "Item" : "Items"; for (String item : getOneOrManyConfigStrings(configSection, itemPath)) { @@ -157,7 +156,7 @@ public List parseRewards(String path) { itemStack.setItemMeta(itemMeta); } listTexts.add(StringUtils.replaceEach(langConfig.getString("list-reward-item"), new String[]{"AMOUNT", "ITEM"}, new String[]{Integer.toString(amount), name})); - chatTexts.add(StringUtils.replaceEach(langConfig.getString("item-reward-received"), new String[]{"AMOUNT", "ITEM"}, new String[]{Integer.toString(amount), name})); + chatTexts.add(Component.text(Objects.requireNonNull(StringUtils.replaceEach(langConfig.getString("item-reward-received"), new String[]{"AMOUNT", "ITEM"}, new String[]{Integer.toString(amount), name})))); itemStacks.add(itemStack); } } @@ -179,7 +178,7 @@ public List parseRewards(String path) { private @NonNull Reward parseExperienceReward(@NonNull ConfigurationSection configSection) { int amount = configSection.getInt("Experience"); String listText = StringUtils.replaceEach(langConfig.getString("list-reward-experience"), new String[]{"AMOUNT"}, new String[]{Integer.toString(amount)}); - String chatText = ChatColor.translateAlternateColorCodes('&', Objects.requireNonNull(StringUtils.replaceEach(langConfig.getString("experience-reward-received"), new String[]{"AMOUNT"}, new String[]{Integer.toString(amount)}))); + Component chatText = Component.text(Objects.requireNonNull(StringUtils.replaceEach(langConfig.getString("experience-reward-received"), new String[]{"AMOUNT"}, new String[]{Integer.toString(amount)}))); Consumer rewarder = player -> player.giveExp(amount); return new Reward(Collections.singletonList(listText), Collections.singletonList(chatText), rewarder); } @@ -187,7 +186,7 @@ public List parseRewards(String path) { private @NonNull Reward parseIncreaseMaxHealthReward(@NonNull ConfigurationSection configSection) { int amount = configSection.getInt("IncreaseMaxHealth"); String listText = StringUtils.replaceEach(langConfig.getString("list-reward-increase-max-health"), new String[]{"AMOUNT"}, new String[]{Integer.toString(amount)}); - String chatText = ChatColor.translateAlternateColorCodes('&', Objects.requireNonNull(StringUtils.replaceEach(langConfig.getString("increase-max-health-reward-received"), new String[]{"AMOUNT"}, new String[]{Integer.toString(amount)}))); + Component chatText = Component.text(Objects.requireNonNull(StringUtils.replaceEach(langConfig.getString("increase-max-health-reward-received"), new String[]{"AMOUNT"}, new String[]{Integer.toString(amount)}))); Consumer rewarder = player -> { AttributeInstance playerAttribute = player.getAttribute(Attribute.MAX_HEALTH); Objects.requireNonNull(playerAttribute).setBaseValue(playerAttribute.getBaseValue() + amount); @@ -198,7 +197,7 @@ public List parseRewards(String path) { private @NonNull Reward parseIncreaseMaxOxygenReward(@NonNull ConfigurationSection configSection) { int amount = configSection.getInt("IncreaseMaxOxygen"); String listText = StringUtils.replaceEach(langConfig.getString("list-reward-increase-max-oxygen"), new String[]{"AMOUNT"}, new String[]{Integer.toString(amount)}); - String chatText = ChatColor.translateAlternateColorCodes('&', Objects.requireNonNull(StringUtils.replaceEach(langConfig.getString("increase-max-oxygen-reward-received"), new String[]{"AMOUNT"}, new String[]{Integer.toString(amount)}))); + Component chatText = Component.text(Objects.requireNonNull(StringUtils.replaceEach(langConfig.getString("increase-max-oxygen-reward-received"), new String[]{"AMOUNT"}, new String[]{Integer.toString(amount)}))); Consumer rewarder = player -> player.setMaximumAir(player.getMaximumAir() + amount); return new Reward(Collections.singletonList(listText), Collections.singletonList(chatText), rewarder); } @@ -206,7 +205,7 @@ public List parseRewards(String path) { private @NonNull Reward parseCommandReward(@NonNull ConfigurationSection configSection) { String displayPath = configSection.contains("Command") ? "Command.Display" : "Commands.Display"; List listTexts = getOneOrManyConfigStrings(configSection, displayPath); - List chatTexts = listTexts.stream().map(message -> StringUtils.replaceEach(langConfig.getString("custom-command-reward"), new String[]{"MESSAGE"}, new String[]{message})).collect(Collectors.toList()); + List chatTexts = listTexts.stream().map(message -> Component.text(Objects.requireNonNull(StringUtils.replaceEach(langConfig.getString("custom-command-reward"), new String[]{"MESSAGE"}, new String[]{message})))).collect(Collectors.toList()); String executePath = configSection.contains("Command") ? "Command.Execute" : "Commands.Execute"; Consumer rewarder = player -> getOneOrManyConfigStrings(configSection, executePath).forEach(command -> { Component component = StringHelper.replacePlayerPlaceholders(command, player); @@ -217,16 +216,9 @@ public List parseRewards(String path) { } private List getOneOrManyConfigStrings(@NonNull ConfigurationSection configSection, String path) { - if (configSection.isList(path)) { - // Real YAML list. - return configSection.getStringList(path); - } + if (configSection.isList(path)) return configSection.getStringList(path); String configString = configSection.getString(path); - if (configString != null) { - // Either a list of strings separate by "; " (old configuration style), or a single string. - return Arrays.asList(MULTIPLE_REWARDS_SPLITTER.split(StringUtils.normalizeSpace(configString))); - } + if (configString != null) return Arrays.asList(MULTIPLE_REWARDS_SPLITTER.split(StringUtils.normalizeSpace(configString))); return Collections.emptyList(); } - -} +} \ No newline at end of file diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/CategoryGUI.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/CategoryGUI.java index ecdce512..acd8fb2d 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/CategoryGUI.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/CategoryGUI.java @@ -114,23 +114,23 @@ public void extractConfigurationParameters() { configListColorNotReceivedCode = ColorHelper.namedTextColorToLegacyAmpersand(configListColorNotReceived); configFormatNotReceived = mainConfig.getBoolean("ListItaliciseNotReceived") ? "&o" : ""; configBackButtonIsCategoryItem = mainConfig.getBoolean("BackButtonIsCategoryItem"); - langListBackMessage = ColorHelper.legacyAmpersandToComponent(langConfig.getString("list-back-message")); - langListBackLore = ColorHelper.legacyAmpersandToComponent(langConfig.getString("list-back-lore")); - langListGUITitle = ColorHelper.legacyAmpersandToComponent(langConfig.getString("list-gui-title")); + langListBackMessage = ColorHelper.convertAmpersandToComponent(langConfig.getString("list-back-message")); + langListBackLore = Component.text(Objects.requireNonNull(langConfig.getString("list-back-lore"))); + langListGUITitle = ColorHelper.convertAmpersandToComponent(langConfig.getString("list-gui-title")); langListAchievementReceived = StringHelper.unescapeJava(langConfig.getString("list-achievement-received")); langListAchievementNotReceived = StringHelper.unescapeJava(langConfig.getString("list-achievement-not-received")) + configListColorNotReceivedCode; String description = langConfig.getString("list-description"); - langListDescription = Objects.requireNonNull(description).isEmpty() ? Component.empty() : ColorHelper.legacyAmpersandToComponent("&7&l" + description); + langListDescription = Objects.requireNonNull(description).isEmpty() ? Component.empty() : ColorHelper.convertAmpersandToComponent("&7&l" + description); String reception = langConfig.getString("list-reception"); - langListReception = Objects.requireNonNull(reception).isEmpty() ? Component.empty() : ColorHelper.legacyAmpersandToComponent("&7&l" + reception); + langListReception = Objects.requireNonNull(reception).isEmpty() ? Component.empty() : ColorHelper.convertAmpersandToComponent("&7&l" + reception); String goal = langConfig.getString("list-goal"); - langListGoal = Objects.requireNonNull(goal).isEmpty() ? Component.empty() : ColorHelper.legacyAmpersandToComponent("&7&l" + goal); + langListGoal = Objects.requireNonNull(goal).isEmpty() ? Component.empty() : ColorHelper.convertAmpersandToComponent("&7&l" + goal); String progress = langConfig.getString("list-progress"); - langListProgress = Objects.requireNonNull(progress).isEmpty() ? Component.empty() : ColorHelper.legacyAmpersandToComponent("&7&l" + progress); + langListProgress = Objects.requireNonNull(progress).isEmpty() ? Component.empty() : ColorHelper.convertAmpersandToComponent("&7&l" + progress); String reward = langConfig.getString("list-reward"); - langListReward = Objects.requireNonNull(reward).isEmpty() ? Component.empty() : ColorHelper.legacyAmpersandToComponent("&7&l" + reward); + langListReward = Objects.requireNonNull(reward).isEmpty() ? Component.empty() : ColorHelper.convertAmpersandToComponent("&7&l" + reward); String rewards = langConfig.getString("list-rewards"); - langListRewards = Objects.requireNonNull(rewards).isEmpty() ? Component.empty() : ColorHelper.legacyAmpersandToComponent("&7&l" + rewards); + langListRewards = Objects.requireNonNull(rewards).isEmpty() ? Component.empty() : ColorHelper.convertAmpersandToComponent("&7&l" + rewards); } /** @@ -281,7 +281,7 @@ private void insertAchievement(Inventory gui, int position, long statistic, Stri String displayName = date == null ? langListAchievementNotReceived + notReceivedStyle(name, ineligibleSeriesItem) : langListAchievementReceived + name; ItemMeta itemMeta = achItem.getItemMeta(); - itemMeta.displayName(ColorHelper.legacyAmpersandToComponent(displayName)); + itemMeta.displayName(ColorHelper.convertAmpersandToComponent(displayName)); itemMeta.lore(lore); achItem.setItemMeta(itemMeta); if (configNumberedItemsInList) { @@ -362,19 +362,19 @@ private int getPageIndex(int requestedPage, int totalAchievements) { if (date != null) { if (langListDescription != Component.empty()) lore.add(langListDescription); - descriptions.forEach(d -> lore.add(ColorHelper.legacyAmpersandToComponent("&r&f" + d))); + descriptions.forEach(d -> lore.add(ColorHelper.convertAmpersandToComponent("&r&f" + d))); lore.add(Component.empty()); if (langListReception != Component.empty()) lore.add(langListReception); - lore.add(ColorHelper.legacyAmpersandToComponent("&r&f" + date)); + lore.add(ColorHelper.convertAmpersandToComponent("&r&f" + date)); } else { if (langListGoal != Component.empty()) lore.add(langListGoal); - descriptions.forEach(d -> lore.add(ColorHelper.legacyAmpersandToComponent(notReceivedStyle(d, ineligibleSeriesItem)))); + descriptions.forEach(d -> lore.add(ColorHelper.convertAmpersandToComponent(notReceivedStyle(d, ineligibleSeriesItem)))); // Display progress if not Commands category. if (!configObfuscateNotReceived && statistic != NO_STAT) { lore.add(Component.empty()); boolean timeStat = NormalAchievements.PLAYEDTIME == achievement.getCategory(); if (langListProgress != Component.empty()) lore.add(langListProgress); - lore.add(ColorHelper.legacyAmpersandToComponent(constructProgressBar(achievement.getThreshold(), statistic, timeStat))); + lore.add(ColorHelper.convertAmpersandToComponent(constructProgressBar(achievement.getThreshold(), statistic, timeStat))); } } @@ -390,7 +390,7 @@ private int getPageIndex(int requestedPage, int totalAchievements) { String dot = StringHelper.unescapeJava(date == null ? configListColorNotReceivedCode + "● " + configFormatNotReceived : "&r&f● "); for (Reward reward : rewards) { for (String listText : reward.listTexts()) { - lore.add(StringHelper.replacePlayerPlaceholders(ColorHelper.legacyAmpersandToComponent(dot + listText), player)); + lore.add(StringHelper.replacePlayerPlaceholders(ColorHelper.convertAmpersandToComponent(dot + listText), player)); } } } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/MainGUI.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/MainGUI.java index f65b70c5..2d4335ff 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/MainGUI.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/MainGUI.java @@ -57,7 +57,7 @@ public MainGUI(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlC public void extractConfigurationParameters() { configHideNotReceivedCategories = mainConfig.getBoolean("HideNotReceivedCategories"); configHideNoPermissionCategories = mainConfig.getBoolean("HideNoPermissionCategories"); - langListGUITitle = ColorHelper.legacySectionSignToComponent(langConfig.getString("list-gui-title")); + langListGUITitle = ColorHelper.convertAmpersandToComponent(langConfig.getString("list-gui-title")); langListAchievementsInCategoryPlural = langConfig.getString("list-achievements-in-category-plural"); langListAchievementInCategorySingular = langConfig.getString("list-achievements-in-category-singular"); } @@ -120,7 +120,7 @@ private void displayCategory(ItemStack item, Inventory gui, Player player, Categ ItemStack itemWithLore = item.clone(); ItemMeta itemMetaWithLore = itemWithLore.getItemMeta(); String amountMessage = StringUtils.replaceEach(message, new String[]{"AMOUNT"}, new String[]{receivedAmount + "/" + totalAmount}); - List loreComponents = List.of(ColorHelper.legacyAmpersandToComponent(amountMessage)); + List loreComponents = List.of(Component.text(amountMessage)); itemMetaWithLore.lore(loreComponents); itemWithLore.setItemMeta(itemMetaWithLore); gui.setItem(position, itemWithLore); diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java index b838f893..be25715a 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java @@ -25,16 +25,14 @@ import java.util.Random; import java.util.logging.Logger; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; -import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import net.kyori.adventure.title.Title; +import net.kyori.adventure.title.Title.Times; import org.apache.commons.lang3.EnumUtils; import org.apache.commons.lang3.StringUtils; import org.bukkit.Bukkit; -import org.bukkit.ChatColor; import org.bukkit.Color; import org.bukkit.FireworkEffect; import org.bukkit.FireworkEffect.Type; @@ -55,7 +53,7 @@ import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.inventory.meta.FireworkMeta; -import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.persistence.PersistentDataType; import org.jspecify.annotations.NonNull; /** @@ -72,7 +70,7 @@ public class PlayerAdvancedAchievementListener implements Listener, Reloadable { private final YamlConfiguration mainConfig; private final YamlConfiguration langConfig; private final Logger logger; - private final StringBuilder pluginHeader; + private final Component pluginHeader; private final CacheManager cacheManager; private final AdvancedAchievements advancedAchievements; private final RewardParser rewardParser; @@ -81,10 +79,10 @@ public class PlayerAdvancedAchievementListener implements Listener, Reloadable { private final ToggleCommand toggleCommand; private final FancyMessageSender fancyMessageSender; private String configFireworkStyle; - private String langAchievementReceived; - private String langAchievementNew; - private String langAllAchievementsReceived; private String langBossBarProgress; + private Component langAchievementReceived; + private Component langAchievementNew; + private Component langAllAchievementsReceived; private NamedTextColor configFireworkColor; private boolean configFirework; private boolean configSimplifiedReception; @@ -96,7 +94,7 @@ public class PlayerAdvancedAchievementListener implements Listener, Reloadable { private boolean configBossBarProgress; @Inject - public PlayerAdvancedAchievementListener(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Logger logger, StringBuilder pluginHeader, CacheManager cacheManager, AdvancedAchievements advancedAchievements, RewardParser rewardParser, AchievementMap achievementMap, AbstractDatabaseManager databaseManager, ToggleCommand toggleCommand, FancyMessageSender fancyMessageSender) { + public PlayerAdvancedAchievementListener(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Logger logger, Component pluginHeader, CacheManager cacheManager, AdvancedAchievements advancedAchievements, RewardParser rewardParser, AchievementMap achievementMap, AbstractDatabaseManager databaseManager, ToggleCommand toggleCommand, FancyMessageSender fancyMessageSender) { this.mainConfig = mainConfig; this.langConfig = langConfig; this.logger = logger; @@ -126,16 +124,16 @@ public void extractConfigurationParameters() { configHoverableReceiverChatText = mainConfig.getBoolean("HoverableReceiverChatText"); configBossBarProgress = mainConfig.getBoolean("BossBarProgress"); configReceiverChatMessages = mainConfig.getBoolean("ReceiverChatMessages"); - langAchievementReceived = langConfig.getString("achievement-received") + " " + ChatColor.WHITE; - langAchievementNew = pluginHeader + langConfig.getString("achievement-new") + " " + ChatColor.WHITE; - langAllAchievementsReceived = pluginHeader + langConfig.getString("all-achievements-received"); + langAchievementReceived = Component.text(Objects.requireNonNull(langConfig.getString("achievement-received"))).color(NamedTextColor.WHITE); + langAchievementNew = pluginHeader.append(Component.text(Objects.requireNonNull(langConfig.getString("achievement-new"))).color(NamedTextColor.WHITE)); + langAllAchievementsReceived = pluginHeader.append(Component.text(Objects.requireNonNull(langConfig.getString("all-achievements-received")))); langBossBarProgress = langConfig.getString("boss-bar-progress"); } @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void onEntityDamageByEntity(@NonNull EntityDamageByEntityEvent event) { // Cancel damage if the firework was launched by the plugin. - event.setCancelled(event.getEntity().hasMetadata(ADVANCED_ACHIEVEMENTS_FIREWORK)); + event.setCancelled(event.getEntity().getPersistentDataContainer().has(new NamespacedKey(advancedAchievements, ADVANCED_ACHIEVEMENTS_FIREWORK), PersistentDataType.BOOLEAN)); } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) @@ -173,8 +171,8 @@ public void onPlayerAdvancedAchievementReception(@NonNull PlayerAdvancedAchievem private void displayAchievement(@NonNull Player player, @NonNull Achievement achievement) { logger.info("Player " + player.getName() + " received the achievement: " + achievement.getDisplayName()); - String nameToShowUser = ChatColor.translateAlternateColorCodes('&', achievement.getDisplayName()); - String messageToShowUser = ChatColor.translateAlternateColorCodes('&', achievement.getMessage()); + Component nameToShowUser = Component.text(achievement.getDisplayName()); + Component messageToShowUser = Component.text(achievement.getMessage()); if (configReceiverChatMessages || player.hasPermission("achievement.config.receiver.chat.messages")) { displayReceiverMessages(player, nameToShowUser, messageToShowUser, achievement.getRewards()); @@ -197,7 +195,7 @@ private void displayAchievement(@NonNull Player player, @NonNull Achievement ach } if (configTitleScreen || player.hasPermission("achievement.config.title.screen")) { - Title title = Title.title(Component.text(nameToShowUser), Component.text(messageToShowUser), Title.Times.times(Duration.ofSeconds(5), Duration.ofSeconds(0), Duration.ofSeconds(5))); + Title title = Title.title(nameToShowUser, messageToShowUser, Times.times(Duration.ofSeconds(5), Duration.ofSeconds(0), Duration.ofSeconds(5))); player.showTitle(title); } @@ -223,19 +221,17 @@ private void displayAchievement(@NonNull Player player, @NonNull Achievement ach * @param messageToShowUser message shown to user * @param rewards rewards */ - private void displayReceiverMessages(Player player, String nameToShowUser, String messageToShowUser, @NonNull List rewards) { + private void displayReceiverMessages(Player player, Component nameToShowUser, Component messageToShowUser, @NonNull List rewards) { List chatMessages = rewards.stream().map(Reward::chatTexts).flatMap(List::stream).map(m -> StringHelper.replacePlayerPlaceholders(m, player)).map(m -> PlainTextComponentSerializer.plainText().serialize(m)).toList(); - String message = langAchievementNew.contains("ACH") ? StringUtils.replaceEach(langAchievementNew, new String[]{"ACH"}, new String[]{nameToShowUser}) : langAchievementNew + nameToShowUser; + Component message = langAchievementNew.replaceText(b -> b.matchLiteral("ACH").replacement(nameToShowUser)); if (configHoverableReceiverChatText) { - TextComponent messageComponent = LegacyComponentSerializer.legacyAmpersand().deserialize(applyPrefix(message)); - TextComponent.Builder hoverBuilder = Component.text().append(LegacyComponentSerializer.legacyAmpersand().deserialize(applyPrefix(messageToShowUser))); - chatMessages.forEach(t -> hoverBuilder.append(Component.newline()).append(LegacyComponentSerializer.legacyAmpersand().deserialize(applyPrefix(t)))); - fancyMessageSender.sendHoverableMessage(player, messageComponent, hoverBuilder.build()); - return; + Component hoverComponent = messageToShowUser; + for (Component t : chatMessages.stream().map(ColorHelper::convertAmpersandToComponent).toList()) hoverComponent = hoverComponent.append(Component.newline().append(t)); + fancyMessageSender.sendHoverableMessage(player, applyPrefix(message), applyPrefix(hoverComponent)); } - player.sendMessage(LegacyComponentSerializer.legacyAmpersand().deserialize(applyPrefix(message))); - player.sendMessage(LegacyComponentSerializer.legacyAmpersand().deserialize(applyPrefix(messageToShowUser)).colorIfAbsent(NamedTextColor.WHITE)); - chatMessages.forEach(t -> player.sendMessage(LegacyComponentSerializer.legacyAmpersand().deserialize(applyPrefix(t)))); + player.sendMessage(applyPrefix(message)); + player.sendMessage(applyPrefix(messageToShowUser).colorIfAbsent(NamedTextColor.WHITE)); + chatMessages.stream().map(ColorHelper::convertAmpersandToComponent).forEach(t -> player.sendMessage(applyPrefix(t))); } /** @@ -245,15 +241,10 @@ private void displayReceiverMessages(Player player, String nameToShowUser, Strin * @param nameToShowUser * @param otherPlayer */ - private void displayNotification(Player receiver, String nameToShowUser, Player otherPlayer) { - String message = langAchievementReceived.contains("ACH") ? StringUtils.replaceEach(langAchievementReceived, new String[]{"PLAYER", "ACH"}, new String[]{receiver.getName(), nameToShowUser}) : StringUtils.replaceEach(langAchievementReceived, new String[]{"PLAYER"}, new String[]{receiver.getName()}) + nameToShowUser; - if (configActionBarNotify) { - Component actionBarMessage = Component.text(message).decorate(TextDecoration.ITALIC); - otherPlayer.sendActionBar(actionBarMessage); - } else { - Component regularMessage = Component.text(pluginHeader + message).decorate(TextDecoration.ITALIC); - otherPlayer.sendMessage(regularMessage); - } + private void displayNotification(Player receiver, Component nameToShowUser, Player otherPlayer) { + Component message = langAchievementReceived.replaceText(b -> b.matchLiteral("PLAYER").replacement(receiver.getName())).replaceText(b -> b.matchLiteral("ACH").replacement(nameToShowUser)); + if (configActionBarNotify) otherPlayer.sendActionBar(message.decorate(TextDecoration.ITALIC)); + else otherPlayer.sendMessage(pluginHeader.append(message).decorate(TextDecoration.ITALIC)); } /** @@ -270,7 +261,7 @@ private void displayFirework(@NonNull Player player) { FireworkEffect fireworkEffect = FireworkEffect.builder().withColor(fireworkColor).withFade(fireworkColor).build(); fireworkMeta.addEffects(fireworkEffect); firework.setFireworkMeta(fireworkMeta); - firework.setMetadata(ADVANCED_ACHIEVEMENTS_FIREWORK, new FixedMetadataValue(advancedAchievements, true)); + firework.getPersistentDataContainer().set(new NamespacedKey(advancedAchievements, ADVANCED_ACHIEVEMENTS_FIREWORK), PersistentDataType.BOOLEAN, true); firework.setVelocity(location.getDirection().multiply(0)); } @@ -315,11 +306,11 @@ private void handleAllAchievementsReceived(@NonNull Player player) { List rewards = rewardParser.parseRewards("AllAchievementsReceivedRewards"); rewards.forEach(r -> r.rewarder().accept(player)); player.sendMessage(langAllAchievementsReceived); - rewards.stream().map(Reward::chatTexts).flatMap(List::stream).map(m -> StringHelper.replacePlayerPlaceholders(m, player)).map(m -> PlainTextComponentSerializer.plainText().serialize(m)).forEach(t -> player.sendMessage(pluginHeader + ChatColor.translateAlternateColorCodes('&', t))); + rewards.stream().map(Reward::chatTexts).flatMap(List::stream).map(m -> StringHelper.replacePlayerPlaceholders(PlainTextComponentSerializer.plainText().serialize(m), player)).forEach(t -> player.sendMessage(pluginHeader.append(t))); } - private String applyPrefix(String s) { - if (mainConfig.getBoolean("PrefixEnabled")) return "§7[AACH]§r " + s; + private Component applyPrefix(Component s) { + if (mainConfig.getBoolean("PrefixEnabled")) return Component.text("[AACH] ").color(NamedTextColor.GRAY).append(s); return s; } } \ No newline at end of file diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/ColorHelper.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/ColorHelper.java index d6062176..9b5d50a0 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/ColorHelper.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/ColorHelper.java @@ -29,12 +29,7 @@ public static NamedTextColor configFireworkColor(@NonNull YamlConfiguration main return parseColor(mainConfig.getString("FireworkColor", "DARK_PURPLE")); } - // TODO: Find all of these legacy ones and make them modern so this can be removed - public static @NonNull Component legacySectionSignToComponent(String text) { - return LegacyComponentSerializer.legacySection().deserialize(text); - } - - public static @NonNull Component legacyAmpersandToComponent(String text) { + public static @NonNull Component convertAmpersandToComponent(String text) { return LegacyComponentSerializer.legacyAmpersand().deserialize(text); } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/FancyMessageSender.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/FancyMessageSender.java index 0c95574b..00a730f5 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/FancyMessageSender.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/FancyMessageSender.java @@ -2,6 +2,7 @@ import jakarta.inject.Inject; import jakarta.inject.Singleton; +import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.event.HoverEvent; @@ -32,7 +33,7 @@ public FancyMessageSender(int serverVersion) { * @param message The text to display in the chat. * @param hover The text to display in the hover. */ - public void sendHoverableMessage(@NonNull Player player, @NonNull TextComponent message, TextComponent hover) { + public void sendHoverableMessage(@NonNull Player player, @NonNull Component message, Component hover) { player.sendMessage(message.hoverEvent(HoverEvent.showText(hover))); } diff --git a/advanced-achievements-plugin/src/test/java/com/hm/achievement/command/pagination/CommandPaginationTest.java b/advanced-achievements-plugin/src/test/java/com/hm/achievement/command/pagination/CommandPaginationTest.java index c976d76c..c847db47 100644 --- a/advanced-achievements-plugin/src/test/java/com/hm/achievement/command/pagination/CommandPaginationTest.java +++ b/advanced-achievements-plugin/src/test/java/com/hm/achievement/command/pagination/CommandPaginationTest.java @@ -1,15 +1,15 @@ package com.hm.achievement.command.pagination; +import com.hm.achievement.utils.ColorHelper; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Objects; +import net.kyori.adventure.text.Component; import org.apache.commons.lang3.StringUtils; -import org.bukkit.ChatColor; import org.bukkit.configuration.file.YamlConfiguration; -import org.jetbrains.annotations.Contract; import org.jspecify.annotations.NonNull; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -23,13 +23,7 @@ */ class CommandPaginationTest { - private final List toPaginate = Arrays.asList( - "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", - "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", - "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", - "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", - "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", - "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"); + private final List toPaginate = Arrays.asList(Component.text("1"), Component.text("2"), Component.text("3"), Component.text("4"), Component.text("5"), Component.text("6"), Component.text("7"), Component.text("8"), Component.text("9"), Component.text("10"), Component.text("1"), Component.text("2"), Component.text("3"), Component.text("4"), Component.text("5"), Component.text("6"), Component.text("7"), Component.text("8"), Component.text("9"), Component.text("10"), Component.text("1"), Component.text("2"), Component.text("3"), Component.text("4"), Component.text("5"), Component.text("6"), Component.text("7"), Component.text("8"), Component.text("9"), Component.text("10"), Component.text("1"), Component.text("2"), Component.text("3"), Component.text("4"), Component.text("5"), Component.text("6"), Component.text("7"), Component.text("8"), Component.text("9"), Component.text("10"), Component.text("1"), Component.text("2"), Component.text("3"), Component.text("4"), Component.text("5"), Component.text("6"), Component.text("7"), Component.text("8"), Component.text("9"), Component.text("10"), Component.text("1"), Component.text("2"), Component.text("3"), Component.text("4"), Component.text("5"), Component.text("6"), Component.text("7"), Component.text("8"), Component.text("9"), Component.text("10")); private YamlConfiguration langConfig; @@ -38,123 +32,60 @@ void setUp() { langConfig = YamlConfiguration.loadConfiguration(new InputStreamReader(Objects.requireNonNull(getClass().getResourceAsStream("/lang.yml")))); } - @Test - void testPagination() { - CommandPagination pagination = new CommandPagination(toPaginate, 18, langConfig); - - List expected = Arrays.asList( - getPaginationHeader(1, 4), - "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", - "1", "2", "3", "4", "5", "6", "7", "8", - getPaginationFooter()); + private @NonNull List paginate(List items, int page) { + List result = new ArrayList<>(); + new CommandPagination(items, 18, langConfig).sendPage(page, result::add); + return result; + } - List result = new ArrayList<>(); - pagination.sendPage(1, result::add); - assertEquals(expected, result); + @Test + void testPagination() { + List expected = Arrays.asList(getPaginationHeader(1, 4), Component.text("1"), Component.text("2"), Component.text("3"), Component.text("4"), Component.text("5"), Component.text("6"), Component.text("7"), Component.text("8"), Component.text("9"), Component.text("10"), Component.text("1"), Component.text("2"), Component.text("3"), Component.text("4"), Component.text("5"), Component.text("6"), Component.text("7"), Component.text("8"), getPaginationFooter()); + assertEquals(expected, paginate(toPaginate, 1)); } @Test void testPaginationPage2() { - CommandPagination pagination = new CommandPagination(toPaginate, 18, langConfig); - - List expected = Arrays.asList( - getPaginationHeader(2, 4), - "9", "10", "1", "2", "3", "4", "5", "6", "7", "8", - "9", "10", "1", "2", "3", "4", "5", "6", - getPaginationFooter()); - - List result = new ArrayList<>(); - pagination.sendPage(2, result::add); - - assertEquals(expected, result); + List expected = Arrays.asList(getPaginationHeader(2, 4), Component.text("9"), Component.text("10"), Component.text("1"), Component.text("2"), Component.text("3"), Component.text("4"), Component.text("5"), Component.text("6"), Component.text("7"), Component.text("8"), Component.text("9"), Component.text("10"), Component.text("1"), Component.text("2"), Component.text("3"), Component.text("4"), Component.text("5"), Component.text("6"), getPaginationFooter()); + assertEquals(expected, paginate(toPaginate, 2)); } @Test void testPaginationPage3() { - CommandPagination pagination = new CommandPagination(toPaginate, 18, langConfig); - - List expected = Arrays.asList( - getPaginationHeader(3, 4), - "7", "8", "9", "10", "1", "2", "3", "4", "5", "6", - "7", "8", "9", "10", "1", "2", "3", "4", - getPaginationFooter()); - - List result = new ArrayList<>(); - pagination.sendPage(3, result::add); - - assertEquals(expected, result); + List expected = Arrays.asList(getPaginationHeader(3, 4), Component.text("7"), Component.text("8"), Component.text("9"), Component.text("10"), Component.text("1"), Component.text("2"), Component.text("3"), Component.text("4"), Component.text("5"), Component.text("6"), Component.text("7"), Component.text("8"), Component.text("9"), Component.text("10"), Component.text("1"), Component.text("2"), Component.text("3"), Component.text("4"), getPaginationFooter()); + assertEquals(expected, paginate(toPaginate, 3)); } @Test void testPaginationPage4() { - CommandPagination pagination = new CommandPagination(toPaginate, 18, langConfig); - - List expected = Arrays.asList( - getPaginationHeader(4, 4), - "5", "6", "7", "8", "9", "10", - getPaginationFooter()); - - List result = new ArrayList<>(); - pagination.sendPage(4, result::add); - - assertEquals(expected, result); + List expected = Arrays.asList(getPaginationHeader(4, 4), Component.text("5"), Component.text("6"), Component.text("7"), Component.text("8"), Component.text("9"), Component.text("10"), getPaginationFooter()); + assertEquals(expected, paginate(toPaginate, 4)); } @Test void testPaginationPage5WhenOnly4Pages() { - CommandPagination pagination = new CommandPagination(toPaginate, 18, langConfig); - - List expected = Arrays.asList( - getPaginationHeader(4, 4), - "5", "6", "7", "8", "9", "10", - getPaginationFooter()); - - List result = new ArrayList<>(); - pagination.sendPage(5, result::add); - - assertEquals(expected, result); + List expected = Arrays.asList(getPaginationHeader(4, 4), Component.text("5"), Component.text("6"), Component.text("7"), Component.text("8"), Component.text("9"), Component.text("10"), getPaginationFooter()); + assertEquals(expected, paginate(toPaginate, 5)); } @Test void testPaginationPageSinglePage() { - CommandPagination pagination = new CommandPagination(Collections.singletonList("1"), 18, langConfig); - - List expected = Arrays.asList( - getPaginationHeader(1, 1), - "1", - getPaginationFooter()); - - List result = new ArrayList<>(); - pagination.sendPage(5, result::add); - - assertEquals(expected, result); + List expected = Arrays.asList(getPaginationHeader(1, 1), Component.text("1"), getPaginationFooter()); + assertEquals(expected, paginate(Collections.singletonList(Component.text("1")), 5)); } @Test void testEmptyPagination() { - CommandPagination pagination = new CommandPagination(Collections.emptyList(), 18, langConfig); - - List expected = Arrays.asList( - getPaginationHeader(0, 0), - getPaginationFooter()); - - List result = new ArrayList<>(); - pagination.sendPage(1, result::add); - - assertEquals(expected, result); + List expected = Arrays.asList(getPaginationHeader(0, 0), getPaginationFooter()); + assertEquals(expected, paginate(Collections.emptyList(), 1)); } - @Contract("_, _ -> new") - private @NonNull String getPaginationHeader(int page, int max) { - return ChatColor.translateAlternateColorCodes('&', - Objects.requireNonNull(StringUtils.replaceEach(langConfig.getString("pagination-header"), new String[]{"PAGE", "MAX"}, - new String[]{Integer.toString(page), Integer.toString(max)}))); + private @NonNull Component getPaginationHeader(int page, int max) { + return ColorHelper.convertAmpersandToComponent(StringUtils.replaceEach(langConfig.getString("pagination-header"), new String[]{"PAGE", "MAX"}, new String[]{Integer.toString(page), Integer.toString(max)})); } - @Contract(" -> new") - private @NonNull String getPaginationFooter() { - return ChatColor.translateAlternateColorCodes('&', Objects.requireNonNull(langConfig.getString("pagination-footer"))); + private @NonNull Component getPaginationFooter() { + return ColorHelper.convertAmpersandToComponent(langConfig.getString("pagination-footer")); } - -} +} \ No newline at end of file diff --git a/advanced-achievements-plugin/src/test/java/com/hm/achievement/config/RewardParserTest.java b/advanced-achievements-plugin/src/test/java/com/hm/achievement/config/RewardParserTest.java index fd972081..eaa4f01f 100644 --- a/advanced-achievements-plugin/src/test/java/com/hm/achievement/config/RewardParserTest.java +++ b/advanced-achievements-plugin/src/test/java/com/hm/achievement/config/RewardParserTest.java @@ -10,6 +10,7 @@ import java.util.List; import java.util.Objects; import java.util.logging.Logger; +import java.util.stream.Collectors; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; @@ -67,13 +68,11 @@ void setUp() throws URISyntaxException, IOException, InvalidConfigurationExcepti void shouldParseMoneyRewardSingular() throws URISyntaxException, IOException, InvalidConfigurationException { mainConfig.load(Paths.get(Objects.requireNonNull(getClass().getClassLoader().getResource("reward-parser/money-1.yml")).toURI()).toFile()); when(economy.currencyNameSingular()).thenReturn("coin"); - List rewards = underTest.parseRewards("Reward"); - assertEquals(1, rewards.size()); Reward reward = rewards.getFirst(); assertEquals(List.of("receive 1 coin"), reward.listTexts()); - assertEquals(List.of("You received: 1 coin!"), reward.chatTexts()); + assertEquals(List.of("You received: 1 coin!"), reward.chatTexts().stream().map(c -> PlainTextComponentSerializer.plainText().serialize(c)).collect(Collectors.toList())); reward.rewarder().accept(player); verify(economy).depositPlayer(player, 1); } @@ -82,13 +81,11 @@ void shouldParseMoneyRewardSingular() throws URISyntaxException, IOException, In void shouldParseMoneyRewardPlural() throws URISyntaxException, IOException, InvalidConfigurationException { mainConfig.load(Paths.get(Objects.requireNonNull(getClass().getClassLoader().getResource("reward-parser/money-2.yml")).toURI()).toFile()); when(economy.currencyNamePlural()).thenReturn("coins"); - List rewards = underTest.parseRewards("Reward"); - assertEquals(1, rewards.size()); Reward reward = rewards.getFirst(); assertEquals(List.of("receive 2 coins"), reward.listTexts()); - assertEquals(List.of("You received: 2 coins!"), reward.chatTexts()); + assertEquals(List.of("You received: 2 coins!"), reward.chatTexts().stream().map(c -> PlainTextComponentSerializer.plainText().serialize(c)).collect(Collectors.toList())); reward.rewarder().accept(player); verify(economy).depositPlayer(player, 2); } @@ -101,13 +98,11 @@ void shouldParseSingleCommandReward() throws URISyntaxException, IOException, In when(player.getLocation()).thenReturn(new Location(world, 1, 5, 8)); when(player.getWorld()).thenReturn(world); when(world.getName()).thenReturn("Nether"); - List rewards = underTest.parseRewards("Reward"); - assertEquals(1, rewards.size()); Reward reward = rewards.getFirst(); assertEquals(List.of("teleportation to somewhere special!"), reward.listTexts()); - assertEquals(List.of("You received your reward: teleportation to somewhere special!"), reward.chatTexts()); + assertEquals(List.of("You received your reward: teleportation to somewhere special!"), reward.chatTexts().stream().map(c -> PlainTextComponentSerializer.plainText().serialize(c)).collect(Collectors.toList())); reward.rewarder().accept(player); TextComponent expectedCommand = Component.text("teleport Pyves"); String expectedRaw = PlainTextComponentSerializer.plainText().serialize(expectedCommand); @@ -122,14 +117,11 @@ void shouldParseMultipleCommandRewards() throws URISyntaxException, IOException, when(player.getLocation()).thenReturn(new Location(world, 1, 5, 8)); when(player.getWorld()).thenReturn(world); when(world.getName()).thenReturn("Nether"); - List rewards = underTest.parseRewards("Reward"); - assertEquals(1, rewards.size()); Reward reward = rewards.getFirst(); assertEquals(Arrays.asList("display 1", "display 2"), reward.listTexts()); - assertEquals(Arrays.asList("You received your reward: display 1", "You received your reward: display 2"), - reward.chatTexts()); + assertEquals(Arrays.asList("You received your reward: display 1", "You received your reward: display 2"), reward.chatTexts().stream().map(c -> PlainTextComponentSerializer.plainText().serialize(c)).collect(Collectors.toList())); reward.rewarder().accept(player); TextComponent exec1 = Component.text("execute 1"); TextComponent exec2 = Component.text("execute 2"); @@ -142,13 +134,11 @@ void shouldParseMultipleCommandRewards() throws URISyntaxException, IOException, @Test void shouldParseExperienceReward() throws URISyntaxException, IOException, InvalidConfigurationException { mainConfig.load(Paths.get(Objects.requireNonNull(getClass().getClassLoader().getResource("reward-parser/experience.yml")).toURI()).toFile()); - List rewards = underTest.parseRewards("Reward"); - assertEquals(1, rewards.size()); Reward reward = rewards.getFirst(); assertEquals(List.of("receive 500 experience"), reward.listTexts()); - assertEquals(List.of("You received: 500 experience!"), reward.chatTexts()); + assertEquals(List.of("You received: 500 experience!"), reward.chatTexts().stream().map(c -> PlainTextComponentSerializer.plainText().serialize(c)).collect(Collectors.toList())); reward.rewarder().accept(player); verify(player).giveExp(500); } @@ -160,13 +150,11 @@ void shouldParseMaxHealthReward() throws URISyntaxException, IOException, Invali AttributeInstance healthAttribute = Mockito.mock(AttributeInstance.class); when(player.getAttribute(any())).thenReturn(healthAttribute); when(healthAttribute.getBaseValue()).thenReturn(1.0); - List rewards = underTest.parseRewards("Reward"); - assertEquals(1, rewards.size()); Reward reward = rewards.getFirst(); assertEquals(List.of("increase max health by 2"), reward.listTexts()); - assertEquals(List.of("Your max health has increased by 2!"), reward.chatTexts()); + assertEquals(List.of("Your max health has increased by 2!"), reward.chatTexts().stream().map(c -> PlainTextComponentSerializer.plainText().serialize(c)).collect(Collectors.toList())); reward.rewarder().accept(player); verify(player).getAttribute(Attribute.MAX_HEALTH); verify(healthAttribute).setBaseValue(3.0); @@ -176,15 +164,12 @@ void shouldParseMaxHealthReward() throws URISyntaxException, IOException, Invali void shouldParseMaxOxygenReward() throws URISyntaxException, IOException, InvalidConfigurationException { mainConfig.load(Paths.get(Objects.requireNonNull(getClass().getClassLoader().getResource("reward-parser/max-oxygen.yml")).toURI()).toFile()); when(player.getMaximumAir()).thenReturn(5); - List rewards = underTest.parseRewards("Reward"); - assertEquals(1, rewards.size()); Reward reward = rewards.getFirst(); assertEquals(List.of("increase max oxygen by 10"), reward.listTexts()); - assertEquals(List.of("Your max oxygen has increased by 10!"), reward.chatTexts()); + assertEquals(List.of("Your max oxygen has increased by 10!"), reward.chatTexts().stream().map(c -> PlainTextComponentSerializer.plainText().serialize(c)).collect(Collectors.toList())); reward.rewarder().accept(player); verify(player).setMaximumAir(15); } - -} +} \ No newline at end of file diff --git a/advanced-achievements-plugin/src/test/java/com/hm/achievement/listener/PlayerAdvancedAchievementListenerTest.java b/advanced-achievements-plugin/src/test/java/com/hm/achievement/listener/PlayerAdvancedAchievementListenerTest.java index d2b3781a..d63650c9 100644 --- a/advanced-achievements-plugin/src/test/java/com/hm/achievement/listener/PlayerAdvancedAchievementListenerTest.java +++ b/advanced-achievements-plugin/src/test/java/com/hm/achievement/listener/PlayerAdvancedAchievementListenerTest.java @@ -15,6 +15,7 @@ import java.util.Set; import java.util.UUID; import java.util.logging.Logger; +import net.kyori.adventure.text.Component; import org.bukkit.Server; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; @@ -38,7 +39,7 @@ @ExtendWith(MockitoExtension.class) class PlayerAdvancedAchievementListenerTest { - private static final String PLUGIN_HEADER = "[HEADER]"; + private static final Component PLUGIN_HEADER = Component.text("[HEADER]"); private static final UUID PLAYER_UUID = UUID.randomUUID(); @Mock @@ -57,7 +58,7 @@ void itShouldRegisterNewAchievementInDatabase() { achievementMap.put(new AchievementBuilder().name("place_500_smooth_brick").displayName("Stone Brick Layer").build()); YamlConfiguration mainConfig = YamlConfiguration.loadConfiguration(new InputStreamReader(Objects.requireNonNull(getClass().getResourceAsStream("/config-reception.yml")))); YamlConfiguration langConfig = YamlConfiguration.loadConfiguration(new InputStreamReader(Objects.requireNonNull(getClass().getResourceAsStream("/lang.yml")))); - PlayerAdvancedAchievementListener underTest = new PlayerAdvancedAchievementListener(mainConfig, langConfig, mock(Logger.class), new StringBuilder(PLUGIN_HEADER), new CacheManager(plugin, abstractDatabaseManager), plugin, null, achievementMap, abstractDatabaseManager, null, new FancyMessageSender(16)); + PlayerAdvancedAchievementListener underTest = new PlayerAdvancedAchievementListener(mainConfig, langConfig, mock(Logger.class), PLUGIN_HEADER, new CacheManager(plugin, abstractDatabaseManager), plugin, null, achievementMap, abstractDatabaseManager, null, new FancyMessageSender(16)); underTest.extractConfigurationParameters(); when(player.getUniqueId()).thenReturn(PLAYER_UUID); when(player.getName()).thenReturn("DarkPyves"); diff --git a/advanced-achievements-plugin/src/test/java/com/hm/achievement/utils/ColorHelperTest.java b/advanced-achievements-plugin/src/test/java/com/hm/achievement/utils/ColorHelperTest.java index 76c0d850..f131d5fd 100644 --- a/advanced-achievements-plugin/src/test/java/com/hm/achievement/utils/ColorHelperTest.java +++ b/advanced-achievements-plugin/src/test/java/com/hm/achievement/utils/ColorHelperTest.java @@ -63,7 +63,7 @@ void returnWhiteWhenParsingNull() { void namedTextColorsArePresentInIndex() { Index namesIndex = NamedTextColor.NAMES; Set keys = namesIndex.keys(); - Assertions.assertTrue(keys.isEmpty(), "NAMES index should contain all expected colors"); + Assertions.assertFalse(keys.isEmpty(), "NAMES index should contain all expected colors"); } @Test From 527e4b9fe7e5885e82af5ff4a5e3fb7605e9784e Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Sun, 12 Apr 2026 18:20:37 +0100 Subject: [PATCH 20/58] Update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b0a27f91..4c96efe0 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ Custom fork for Minecraft server 1MoreBlock.com -Recent changes include java 25+, 26.1.2, and legacy color code fixes. +Recent changes include java 25+, 26.1.2, and removing deprecated ChatColor methods in favour of Adventure Components. **Advanced Achievements enables unique and challenging achievements on Minecraft servers. Collect as many as you can, earn rewards, climb the rankings and receive RP books! The plugin supports SQLite, MySQL, H2 and PostgreSQL, manages an From a1ccbe5a8a9845d17591edf95c52b1e4024eca9e Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Sun, 12 Apr 2026 18:21:14 +0100 Subject: [PATCH 21/58] Format --- .../hm/achievement/AdvancedAchievements.java | 20 +++++-------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/AdvancedAchievements.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/AdvancedAchievements.java index b2dba459..0bd33e9d 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/AdvancedAchievements.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/AdvancedAchievements.java @@ -19,14 +19,7 @@ import org.bukkit.plugin.java.JavaPlugin; @Singleton -@Component(modules = { - CleanableModule.class, - CommandModule.class, - ConfigModule.class, - DatabaseModule.class, - ReloadableModule.class, - ServerVersionModule.class -}) +@Component(modules = {CleanableModule.class, CommandModule.class, ConfigModule.class, DatabaseModule.class, ReloadableModule.class, ServerVersionModule.class}) interface AdvancedAchievementsComponent { PluginLoader pluginLoader(); @@ -64,8 +57,7 @@ public void onEnable() { long startTime = System.currentTimeMillis(); // DaggerAdvancedAchievementsComponent is generated by Dagger. Add target/generated-sources/annotations to your // build path if the IDE complains here. In any case this will not actually prevent you from compiling. - AdvancedAchievementsComponent advancedAchievementsComponent = DaggerAdvancedAchievementsComponent.builder() - .advancedAchievements(this).logger(getLogger()).build(); + AdvancedAchievementsComponent advancedAchievementsComponent = DaggerAdvancedAchievementsComponent.builder().advancedAchievements(this).logger(getLogger()).build(); pluginLoader = advancedAchievementsComponent.pluginLoader(); advancedAchievementsAPI = advancedAchievementsComponent.advancedAchievementsBukkitAPI(); @@ -73,14 +65,11 @@ public void onEnable() { try { pluginLoader.loadAdvancedAchievements(); } catch (PluginLoadError e) { - getLogger().log(Level.SEVERE, - "A non recoverable error was encountered while loading the plugin, disabling it:", e); + getLogger().log(Level.SEVERE, "A non recoverable error was encountered while loading the plugin, disabling it:", e); Bukkit.getPluginManager().disablePlugin(this); return; } - - getLogger().info( - "Plugin has finished loading and is ready to run! Took " + (System.currentTimeMillis() - startTime) + "ms."); + getLogger().info("Plugin has finished loading and is ready to run! Took " + (System.currentTimeMillis() - startTime) + "ms."); } @Override @@ -88,6 +77,7 @@ public void onDisable() { pluginLoader.disableAdvancedAchievements(); } + @SuppressWarnings("unused") public AdvancedAchievementsAPI getAdvancedAchievementsAPI() { return advancedAchievementsAPI; } From 586c3ee647ee86dce425fd3df840ef791f045666 Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Sun, 12 Apr 2026 18:22:22 +0100 Subject: [PATCH 22/58] Update ConfigModule to use Component for PluginHeader --- .../main/java/com/hm/achievement/module/ConfigModule.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/module/ConfigModule.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/module/ConfigModule.java index 303bd641..8ecf064f 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/module/ConfigModule.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/module/ConfigModule.java @@ -7,6 +7,7 @@ import jakarta.inject.Singleton; import java.util.HashSet; import java.util.Set; +import net.kyori.adventure.text.Component; import org.bukkit.configuration.file.YamlConfiguration; @Module @@ -20,8 +21,8 @@ Set provideDisabledCategories() { @Provides @Singleton - StringBuilder providePluginHeader() { - return new StringBuilder(); + Component providePluginHeader() { + return Component.empty(); } @Provides From a47f7ff693453c4a6ee71549ba8940e50110890d Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Sun, 12 Apr 2026 18:24:10 +0100 Subject: [PATCH 23/58] Add legacy stringbuilder for now --- .../main/java/com/hm/achievement/module/ConfigModule.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/module/ConfigModule.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/module/ConfigModule.java index 8ecf064f..17c6e6ef 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/module/ConfigModule.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/module/ConfigModule.java @@ -25,6 +25,13 @@ Component providePluginHeader() { return Component.empty(); } + @Provides + @Singleton + // TODO: Convert all to component + StringBuilder provideLegacyPluginHeader() { + return new StringBuilder(); + } + @Provides @Singleton @Named("main") From b943ed60f59cbfdb563a9e9da26814eaf2132fdc Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Sun, 12 Apr 2026 18:26:36 +0100 Subject: [PATCH 24/58] Readme update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4c96efe0..3056faec 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ Custom fork for Minecraft server 1MoreBlock.com -Recent changes include java 25+, 26.1.2, and removing deprecated ChatColor methods in favour of Adventure Components. +Recent changes include Java 25, 26.1.2, and removing deprecated ChatColor methods in favour of Adventure Components. **Advanced Achievements enables unique and challenging achievements on Minecraft servers. Collect as many as you can, earn rewards, climb the rankings and receive RP books! The plugin supports SQLite, MySQL, H2 and PostgreSQL, manages an From 4e359536dc0416fc8d3a37bcfdd0750dc89436ad Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Sun, 12 Apr 2026 18:28:13 +0100 Subject: [PATCH 25/58] Readme update --- README.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 3056faec..0aabed1e 100644 --- a/README.md +++ b/README.md @@ -23,23 +23,22 @@ releases page here on GitHub by the way, but here it is.)

-## :star: Support and feedback +## ⭐ Support and feedback -Thought of a cool idea? Found a problem or need some help? Simply open an [**issue -**](https://github.com/mrfdev/advanced-achievements/issues)! +Thought of a cool idea? Found a problem or need some help? Simply open an [**issue**](https://github.com/mrfdev/advanced-achievements/issues)! Find the project useful, fun or interesting? **Star** the repository by clicking on the icon on the top right of this page! -## :computer: Code contributions +## 🖥️ Code contributions Want to make Advanced Achievements better, faster, stronger? Contributions are welcome, open a **pull request** and share your code! Simply **fork** the repository by clicking on the icon on the top right of this page to get started. -## :balance_scale: License +## ⚖️ License GNU General Public License v3.0 -## Special credits +## 📜 Special credits Pierre-Yves Bigourdan, [@PyvesB](https://github.com/PyvesB/) From e02b87f088f12bb5f931a92e7c66a367978a1b4d Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Sun, 12 Apr 2026 18:40:26 +0100 Subject: [PATCH 26/58] Possibly resolve #159 --- .../com/hm/achievement/command/executable/InspectCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InspectCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InspectCommand.java index 6990923a..73c6d051 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InspectCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InspectCommand.java @@ -73,7 +73,7 @@ void onExecute(CommandSender sender, String[] args) { String displayName = parseAchievementName(args); Achievement achievement = getAchievement(displayName); if (achievement == null) { - sender.sendMessage(pluginHeader + StringUtils.replaceEach(langConfig.getString("achievement_not_recognized"), new String[]{"NAME", "CLOSEST_MATCH"}, new String[]{displayName, StringHelper.getClosestMatch(displayName, achievementMap.getAllSanitisedDisplayNames())})); + sender.sendMessage(pluginHeader + StringUtils.replaceEach(langConfig.getString("achievement-not-recognized"), new String[]{"NAME", "CLOSEST_MATCH"}, new String[]{displayName, StringHelper.getClosestMatch(displayName, achievementMap.getAllSanitisedDisplayNames())})); return; } int page = getPage(args); From b90d0ea8d0ca22c56349c96ca91b7451c5075d98 Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Sun, 12 Apr 2026 18:42:38 +0100 Subject: [PATCH 27/58] Possibly resolve #157 --- .../hm/achievement/command/executable/AbstractCommand.java | 5 +++-- .../command/executable/AbstractRankingCommand.java | 2 +- .../com/hm/achievement/command/executable/MonthCommand.java | 4 ++-- .../com/hm/achievement/command/executable/TopCommand.java | 4 ++-- .../com/hm/achievement/command/executable/WeekCommand.java | 4 ++-- 5 files changed, 10 insertions(+), 9 deletions(-) diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractCommand.java index 39ad15bf..2275099a 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractCommand.java @@ -1,6 +1,7 @@ package com.hm.achievement.command.executable; import com.hm.achievement.lifecycle.Reloadable; +import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.bukkit.command.CommandSender; @@ -15,11 +16,11 @@ public abstract class AbstractCommand implements Reloadable { final YamlConfiguration mainConfig; final YamlConfiguration langConfig; - final StringBuilder pluginHeader; + final Component pluginHeader; private String langNoPermissions; - AbstractCommand(YamlConfiguration mainConfig, YamlConfiguration langConfig, StringBuilder pluginHeader) { + AbstractCommand(YamlConfiguration mainConfig, YamlConfiguration langConfig, Component pluginHeader) { this.mainConfig = mainConfig; this.langConfig = langConfig; this.pluginHeader = pluginHeader; diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractRankingCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractRankingCommand.java index 07329db9..0b523005 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractRankingCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractRankingCommand.java @@ -55,7 +55,7 @@ public abstract class AbstractRankingCommand extends AbstractCommand { private List cachedAchievementCounts; private long lastCacheUpdate = 0L; - AbstractRankingCommand(YamlConfiguration mainConfig, YamlConfiguration langConfig, StringBuilder pluginHeader, Logger logger, String languageKey, AbstractDatabaseManager databaseManager, SoundPlayer soundPlayer) { + AbstractRankingCommand(YamlConfiguration mainConfig, YamlConfiguration langConfig, Component pluginHeader, Logger logger, String languageKey, AbstractDatabaseManager databaseManager, SoundPlayer soundPlayer) { super(mainConfig, langConfig, pluginHeader); this.logger = logger; this.languageKey = languageKey; diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/MonthCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/MonthCommand.java index b1cd6f9e..70de18a8 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/MonthCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/MonthCommand.java @@ -7,6 +7,7 @@ import jakarta.inject.Singleton; import java.util.Calendar; import java.util.logging.Logger; +import net.kyori.adventure.text.Component; import org.bukkit.configuration.file.YamlConfiguration; /** @@ -19,8 +20,7 @@ public class MonthCommand extends AbstractRankingCommand { @Inject - public MonthCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, - StringBuilder pluginHeader, Logger logger, AbstractDatabaseManager databaseManager, SoundPlayer soundPlayer) { + public MonthCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Component pluginHeader, Logger logger, AbstractDatabaseManager databaseManager, SoundPlayer soundPlayer) { super(mainConfig, langConfig, pluginHeader, logger, "month-achievement", databaseManager, soundPlayer); } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/TopCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/TopCommand.java index dd5be739..58644ab1 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/TopCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/TopCommand.java @@ -6,6 +6,7 @@ import jakarta.inject.Named; import jakarta.inject.Singleton; import java.util.logging.Logger; +import net.kyori.adventure.text.Component; import org.bukkit.configuration.file.YamlConfiguration; /** @@ -18,8 +19,7 @@ public class TopCommand extends AbstractRankingCommand { @Inject - public TopCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, - StringBuilder pluginHeader, Logger logger, AbstractDatabaseManager databaseManager, SoundPlayer soundPlayer) { + public TopCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Component pluginHeader, Logger logger, AbstractDatabaseManager databaseManager, SoundPlayer soundPlayer) { super(mainConfig, langConfig, pluginHeader, logger, "top-achievement", databaseManager, soundPlayer); } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/WeekCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/WeekCommand.java index 4d3729cc..8fb139fc 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/WeekCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/WeekCommand.java @@ -7,6 +7,7 @@ import jakarta.inject.Singleton; import java.util.Calendar; import java.util.logging.Logger; +import net.kyori.adventure.text.Component; import org.bukkit.configuration.file.YamlConfiguration; /** @@ -19,8 +20,7 @@ public class WeekCommand extends AbstractRankingCommand { @Inject - public WeekCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, - StringBuilder pluginHeader, Logger logger, AbstractDatabaseManager databaseManager, SoundPlayer soundPlayer) { + public WeekCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Component pluginHeader, Logger logger, AbstractDatabaseManager databaseManager, SoundPlayer soundPlayer) { super(mainConfig, langConfig, pluginHeader, logger, "week-achievement", databaseManager, soundPlayer); } From 436c69e5dde7e0bf5b28a78f7f5ea5012ba60e3e Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Mon, 13 Apr 2026 17:21:02 +0100 Subject: [PATCH 28/58] Fix compile error --- .../command/executable/AbstractParsableCommand.java | 3 ++- .../com/hm/achievement/command/executable/AddCommand.java | 3 ++- .../com/hm/achievement/command/executable/BookCommand.java | 2 +- .../com/hm/achievement/command/executable/CheckCommand.java | 3 ++- .../com/hm/achievement/command/executable/DeleteCommand.java | 3 ++- .../hm/achievement/command/executable/GenerateCommand.java | 3 ++- .../com/hm/achievement/command/executable/GiveCommand.java | 3 ++- .../com/hm/achievement/command/executable/GrantCommand.java | 3 ++- .../com/hm/achievement/command/executable/HelpCommand.java | 2 +- .../com/hm/achievement/command/executable/InfoCommand.java | 2 +- .../hm/achievement/command/executable/InspectCommand.java | 2 +- .../com/hm/achievement/command/executable/ListCommand.java | 3 ++- .../com/hm/achievement/command/executable/ReloadCommand.java | 3 ++- .../com/hm/achievement/command/executable/ResetCommand.java | 3 ++- .../com/hm/achievement/command/executable/StatsCommand.java | 2 +- .../com/hm/achievement/command/executable/ToggleCommand.java | 3 ++- .../achievement/command/executor/PluginCommandExecutor.java | 5 +++-- .../command/executor/PluginCommandExecutorTest.java | 5 +++-- 18 files changed, 33 insertions(+), 20 deletions(-) diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractParsableCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractParsableCommand.java index 05af0862..c9ef73e2 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractParsableCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractParsableCommand.java @@ -1,6 +1,7 @@ package com.hm.achievement.command.executable; import com.hm.achievement.command.external.CommandUtils; +import net.kyori.adventure.text.Component; import org.apache.commons.lang3.StringUtils; import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.YamlConfiguration; @@ -18,7 +19,7 @@ public abstract class AbstractParsableCommand extends AbstractCommand { private String langPlayerOffline; private String langEntityNotPlayer; - AbstractParsableCommand(YamlConfiguration mainConfig, YamlConfiguration langConfig, StringBuilder pluginHeader) { + AbstractParsableCommand(YamlConfiguration mainConfig, YamlConfiguration langConfig, Component pluginHeader) { super(mainConfig, langConfig, pluginHeader); } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AddCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AddCommand.java index 591fd547..922a17aa 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AddCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AddCommand.java @@ -13,6 +13,7 @@ import java.util.Set; import java.util.UUID; import java.util.concurrent.TimeUnit; +import net.kyori.adventure.text.Component; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import org.bukkit.command.CommandSender; @@ -40,7 +41,7 @@ public class AddCommand extends AbstractParsableCommand { @Inject public AddCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, - StringBuilder pluginHeader, AbstractDatabaseManager databaseManager, CacheManager cacheManager, + Component pluginHeader, AbstractDatabaseManager databaseManager, CacheManager cacheManager, StatisticIncreaseHandler statisticIncreaseHandler, AchievementMap achievementMap) { super(mainConfig, langConfig, pluginHeader); this.databaseManager = databaseManager; diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/BookCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/BookCommand.java index 383f826f..8c13315e 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/BookCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/BookCommand.java @@ -61,7 +61,7 @@ public class BookCommand extends AbstractCommand implements Cleanable { private DateFormat dateFormat; @Inject - public BookCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, StringBuilder pluginHeader, AbstractDatabaseManager databaseManager, SoundPlayer soundPlayer, AchievementMap achievementMap) { + public BookCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Component pluginHeader, AbstractDatabaseManager databaseManager, SoundPlayer soundPlayer, AchievementMap achievementMap) { super(mainConfig, langConfig, pluginHeader); this.databaseManager = databaseManager; this.soundPlayer = soundPlayer; diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/CheckCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/CheckCommand.java index 8cf25e15..44518bdf 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/CheckCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/CheckCommand.java @@ -4,6 +4,7 @@ import jakarta.inject.Inject; import jakarta.inject.Named; import jakarta.inject.Singleton; +import net.kyori.adventure.text.Component; import org.apache.commons.lang3.StringUtils; import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.YamlConfiguration; @@ -25,7 +26,7 @@ public class CheckCommand extends AbstractParsableCommand { @Inject public CheckCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, - StringBuilder pluginHeader, CacheManager cacheManager) { + Component pluginHeader, CacheManager cacheManager) { super(mainConfig, langConfig, pluginHeader); this.cacheManager = cacheManager; } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/DeleteCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/DeleteCommand.java index a4c73688..952764cb 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/DeleteCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/DeleteCommand.java @@ -7,6 +7,7 @@ import jakarta.inject.Named; import jakarta.inject.Singleton; import java.util.Collections; +import net.kyori.adventure.text.Component; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Strings; import org.bukkit.command.CommandSender; @@ -34,7 +35,7 @@ public class DeleteCommand extends AbstractParsableCommand { @Inject public DeleteCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, - StringBuilder pluginHeader, CacheManager cacheManager, AbstractDatabaseManager databaseManager, + Component pluginHeader, CacheManager cacheManager, AbstractDatabaseManager databaseManager, AchievementMap achievementMap) { super(mainConfig, langConfig, pluginHeader); this.cacheManager = cacheManager; diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GenerateCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GenerateCommand.java index 19bc3e3c..c6166ac0 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GenerateCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GenerateCommand.java @@ -4,6 +4,7 @@ import jakarta.inject.Inject; import jakarta.inject.Named; import jakarta.inject.Singleton; +import net.kyori.adventure.text.Component; import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.YamlConfiguration; @@ -23,7 +24,7 @@ public class GenerateCommand extends AbstractCommand { @Inject public GenerateCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, - StringBuilder pluginHeader, AdvancementManager advancementManager) { + Component pluginHeader, AdvancementManager advancementManager) { super(mainConfig, langConfig, pluginHeader); this.advancementManager = advancementManager; } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GiveCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GiveCommand.java index af5ede4d..05a1727b 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GiveCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GiveCommand.java @@ -11,6 +11,7 @@ import jakarta.inject.Singleton; import java.util.Optional; import java.util.Set; +import net.kyori.adventure.text.Component; import org.apache.commons.lang3.StringUtils; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; @@ -37,7 +38,7 @@ public class GiveCommand extends AbstractParsableCommand { @Inject public GiveCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, - StringBuilder pluginHeader, CacheManager cacheManager, AchievementMap achievementMap) { + Component pluginHeader, CacheManager cacheManager, AchievementMap achievementMap) { super(mainConfig, langConfig, pluginHeader); this.cacheManager = cacheManager; this.achievementMap = achievementMap; diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GrantCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GrantCommand.java index 83db9437..767fe6a9 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GrantCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GrantCommand.java @@ -12,6 +12,7 @@ import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; +import net.kyori.adventure.text.Component; import org.apache.commons.lang3.StringUtils; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; @@ -33,7 +34,7 @@ public class GrantCommand extends AbstractParsableCommand { private String langAchievementGrantedAll; @Inject - public GrantCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, StringBuilder pluginHeader, CacheManager cacheManager, AchievementMap achievementMap) { + public GrantCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Component pluginHeader, CacheManager cacheManager, AchievementMap achievementMap) { super(mainConfig, langConfig, pluginHeader); this.cacheManager = cacheManager; this.achievementMap = achievementMap; diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/HelpCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/HelpCommand.java index 74bb4f78..a4a8c5b1 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/HelpCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/HelpCommand.java @@ -68,7 +68,7 @@ public class HelpCommand extends AbstractCommand { private TextComponent langTip; @Inject - public HelpCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, StringBuilder pluginHeader, FancyMessageSender fancyMessageSender) { + public HelpCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Component pluginHeader, FancyMessageSender fancyMessageSender) { super(mainConfig, langConfig, pluginHeader); this.fancyMessageSender = fancyMessageSender; } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InfoCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InfoCommand.java index 9ea6aa71..a49c9f59 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InfoCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InfoCommand.java @@ -42,7 +42,7 @@ public class InfoCommand extends AbstractCommand { private Component langVersionCommandDatabase; @Inject - public InfoCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, StringBuilder pluginHeader, AdvancedAchievements advancedAchievements, RewardParser rewardParser) { + public InfoCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Component pluginHeader, AdvancedAchievements advancedAchievements, RewardParser rewardParser) { super(mainConfig, langConfig, pluginHeader); this.advancedAchievements = advancedAchievements; this.rewardParser = rewardParser; diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InspectCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InspectCommand.java index 73c6d051..5c165577 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InspectCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InspectCommand.java @@ -47,7 +47,7 @@ public class InspectCommand extends AbstractCommand { private final Map cachedPagination; @Inject - public InspectCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, StringBuilder pluginHeader, AdvancedAchievements advancedAchievements, AbstractDatabaseManager databaseManager, AchievementMap achievementMap) { + public InspectCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Component pluginHeader, AdvancedAchievements advancedAchievements, AbstractDatabaseManager databaseManager, AchievementMap achievementMap) { super(mainConfig, langConfig, pluginHeader); this.advancedAchievements = advancedAchievements; this.databaseManager = databaseManager; diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ListCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ListCommand.java index 8eef8831..f047423d 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ListCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ListCommand.java @@ -13,6 +13,7 @@ import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; +import net.kyori.adventure.text.Component; import org.apache.commons.lang3.StringUtils; import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.YamlConfiguration; @@ -35,7 +36,7 @@ public class ListCommand extends AbstractCommand { private String langCategoryDoesNotExist; @Inject - public ListCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, StringBuilder pluginHeader, MainGUI mainGUI, CategoryGUI categoryGUI, GUIItems guiItems) { + public ListCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Component pluginHeader, MainGUI mainGUI, CategoryGUI categoryGUI, GUIItems guiItems) { super(mainConfig, langConfig, pluginHeader); this.mainGUI = mainGUI; this.categoryGUI = categoryGUI; diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ReloadCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ReloadCommand.java index 16f3f553..01bc4b14 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ReloadCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ReloadCommand.java @@ -11,6 +11,7 @@ import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; +import net.kyori.adventure.text.Component; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.YamlConfiguration; @@ -35,7 +36,7 @@ public class ReloadCommand extends AbstractCommand { @Inject public ReloadCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, - StringBuilder pluginHeader, AdvancedAchievements advancedAchievements, Logger logger, + Component pluginHeader, AdvancedAchievements advancedAchievements, Logger logger, Lazy pluginLoader, Lazy> reloadables) { super(mainConfig, langConfig, pluginHeader); this.advancedAchievements = advancedAchievements; diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ResetCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ResetCommand.java index c710d51f..3f0bfa11 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ResetCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ResetCommand.java @@ -8,6 +8,7 @@ import jakarta.inject.Singleton; import java.util.Collections; import java.util.Set; +import net.kyori.adventure.text.Component; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Strings; import org.bukkit.command.CommandSender; @@ -35,7 +36,7 @@ public class ResetCommand extends AbstractParsableCommand { @Inject public ResetCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, - StringBuilder pluginHeader, CacheManager cacheManager, AchievementMap achievementMap) { + Component pluginHeader, CacheManager cacheManager, AchievementMap achievementMap) { super(mainConfig, langConfig, pluginHeader); this.cacheManager = cacheManager; this.achievementMap = achievementMap; diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/StatsCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/StatsCommand.java index b440a09f..21de8b84 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/StatsCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/StatsCommand.java @@ -43,7 +43,7 @@ public class StatsCommand extends AbstractCommand { private Component langNumberAchievements; @Inject - public StatsCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, StringBuilder pluginHeader, CacheManager cacheManager, AchievementMap achievementMap, SoundPlayer soundPlayer) { + public StatsCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Component pluginHeader, CacheManager cacheManager, AchievementMap achievementMap, SoundPlayer soundPlayer) { super(mainConfig, langConfig, pluginHeader); this.cacheManager = cacheManager; this.achievementMap = achievementMap; diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ToggleCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ToggleCommand.java index 7b4dd789..0b698e98 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ToggleCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ToggleCommand.java @@ -9,6 +9,7 @@ import java.util.Map; import java.util.Set; import java.util.UUID; +import net.kyori.adventure.text.Component; import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; @@ -33,7 +34,7 @@ public class ToggleCommand extends AbstractCommand { @Inject public ToggleCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, - StringBuilder pluginHeader) { + Component pluginHeader) { super(mainConfig, langConfig, pluginHeader); } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executor/PluginCommandExecutor.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executor/PluginCommandExecutor.java index 7fe3a7e5..dbd45ab2 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executor/PluginCommandExecutor.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executor/PluginCommandExecutor.java @@ -9,6 +9,7 @@ import java.util.Arrays; import java.util.Optional; import java.util.Set; +import net.kyori.adventure.text.Component; import org.apache.commons.lang3.StringUtils; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -26,12 +27,12 @@ public class PluginCommandExecutor implements CommandExecutor, Reloadable { private final YamlConfiguration langConfig; private final Set commands; - private final StringBuilder pluginHeader; + private final Component pluginHeader; private String langInvalidCommand; @Inject - public PluginCommandExecutor(@Named("lang") YamlConfiguration langConfig, Set commands, StringBuilder pluginHeader) { + public PluginCommandExecutor(@Named("lang") YamlConfiguration langConfig, Set commands, Component pluginHeader) { this.langConfig = langConfig; this.commands = commands; this.pluginHeader = pluginHeader; diff --git a/advanced-achievements-plugin/src/test/java/com/hm/achievement/command/executor/PluginCommandExecutorTest.java b/advanced-achievements-plugin/src/test/java/com/hm/achievement/command/executor/PluginCommandExecutorTest.java index 4e003bfc..fbedbada 100644 --- a/advanced-achievements-plugin/src/test/java/com/hm/achievement/command/executor/PluginCommandExecutorTest.java +++ b/advanced-achievements-plugin/src/test/java/com/hm/achievement/command/executor/PluginCommandExecutorTest.java @@ -6,6 +6,7 @@ import com.hm.achievement.command.executable.ListCommand; import java.util.HashSet; import java.util.Set; +import net.kyori.adventure.text.Component; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.YamlConfiguration; @@ -28,7 +29,7 @@ @ExtendWith(MockitoExtension.class) class PluginCommandExecutorTest { - private static final String PLUGIN_HEADER = "header "; + private static final Component PLUGIN_HEADER = Component.text("header "); private static final String ERROR_MESSAGE = "error message"; private static final String label = "label"; @@ -59,7 +60,7 @@ void setUp() { commands.add(helpCommand); commands.add(listCommand); commands.add(argsCommand); - StringBuilder pluginHeader = new StringBuilder(PLUGIN_HEADER); + Component pluginHeader = PLUGIN_HEADER; underTest = new PluginCommandExecutor(langConfig, commands, pluginHeader); underTest.extractConfigurationParameters(); } From d225338cc404ca63b37190b54dc2e06075c81719 Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Mon, 13 Apr 2026 19:04:59 +0100 Subject: [PATCH 29/58] Readme update - Changes to support this are still in the works --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 0aabed1e..9843acdd 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,14 @@ Recent changes include Java 25, 26.1.2, and removing deprecated ChatColor method earn rewards, climb the rankings and receive RP books! The plugin supports SQLite, MySQL, H2 and PostgreSQL, manages an extensive statistics system, handles YAML configuration files and features fancy in-game GUIs and effects!** +# Key Change for 26.1.2: + +Colours are now solely done via the config and not hardcoded in (for the most part). If a string does not support a +colour yet, please open a [GitHub issue](https://github.com/mrfdev/advanced-achievements/issues) for support to be added. No colours should be hardcoded anymore to allow for +users to customise their config fully. + +Currently only the english lang.yml is updated as I do not have the scope or knowledge to expand into other languages. If you would like to contribute towards syncing the English lang.yml with other languages, please do! + ## Spigot release! We have [a Spigot release page](https://www.spigotmc.org/resources/advancedachievements.121486/) now (which links to the From f8a766e197b880ef8179edb09f65749735d93d7c Mon Sep 17 00:00:00 2001 From: Greymagic27 <46166848+Greymagic27@users.noreply.github.com> Date: Mon, 13 Apr 2026 19:08:59 +0100 Subject: [PATCH 30/58] Potential fix for pull request finding 'Potential input resource leak' Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com> --- .../PlayerAdvancedAchievementListenerTest.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/advanced-achievements-plugin/src/test/java/com/hm/achievement/listener/PlayerAdvancedAchievementListenerTest.java b/advanced-achievements-plugin/src/test/java/com/hm/achievement/listener/PlayerAdvancedAchievementListenerTest.java index d63650c9..fd21bd4c 100644 --- a/advanced-achievements-plugin/src/test/java/com/hm/achievement/listener/PlayerAdvancedAchievementListenerTest.java +++ b/advanced-achievements-plugin/src/test/java/com/hm/achievement/listener/PlayerAdvancedAchievementListenerTest.java @@ -8,6 +8,7 @@ import com.hm.achievement.domain.Achievement.AchievementBuilder; import com.hm.achievement.utils.FancyMessageSender; import com.hm.achievement.utils.PlayerAdvancedAchievementEvent; +import java.io.IOException; import java.io.InputStreamReader; import java.util.HashSet; import java.util.List; @@ -52,12 +53,18 @@ class PlayerAdvancedAchievementListenerTest { private AdvancedAchievements plugin; @Test - void itShouldRegisterNewAchievementInDatabase() { + void itShouldRegisterNewAchievementInDatabase() throws IOException { AchievementMap achievementMap = new AchievementMap(); achievementMap.put(new AchievementBuilder().name("connect_1").displayName("Good Choice").build()); achievementMap.put(new AchievementBuilder().name("place_500_smooth_brick").displayName("Stone Brick Layer").build()); - YamlConfiguration mainConfig = YamlConfiguration.loadConfiguration(new InputStreamReader(Objects.requireNonNull(getClass().getResourceAsStream("/config-reception.yml")))); - YamlConfiguration langConfig = YamlConfiguration.loadConfiguration(new InputStreamReader(Objects.requireNonNull(getClass().getResourceAsStream("/lang.yml")))); + YamlConfiguration mainConfig; + try (InputStreamReader mainConfigReader = new InputStreamReader(Objects.requireNonNull(getClass().getResourceAsStream("/config-reception.yml")))) { + mainConfig = YamlConfiguration.loadConfiguration(mainConfigReader); + } + YamlConfiguration langConfig; + try (InputStreamReader langConfigReader = new InputStreamReader(Objects.requireNonNull(getClass().getResourceAsStream("/lang.yml")))) { + langConfig = YamlConfiguration.loadConfiguration(langConfigReader); + } PlayerAdvancedAchievementListener underTest = new PlayerAdvancedAchievementListener(mainConfig, langConfig, mock(Logger.class), PLUGIN_HEADER, new CacheManager(plugin, abstractDatabaseManager), plugin, null, achievementMap, abstractDatabaseManager, null, new FancyMessageSender(16)); underTest.extractConfigurationParameters(); when(player.getUniqueId()).thenReturn(PLAYER_UUID); From f59195bd07afa3795f3efdd068cedc61d8ce5f01 Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Mon, 13 Apr 2026 19:10:11 +0100 Subject: [PATCH 31/58] Github CQ suggestion --- ...PlayerAdvancedAchievementListenerTest.java | 34 +++++++++++-------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/advanced-achievements-plugin/src/test/java/com/hm/achievement/listener/PlayerAdvancedAchievementListenerTest.java b/advanced-achievements-plugin/src/test/java/com/hm/achievement/listener/PlayerAdvancedAchievementListenerTest.java index d63650c9..659fed1f 100644 --- a/advanced-achievements-plugin/src/test/java/com/hm/achievement/listener/PlayerAdvancedAchievementListenerTest.java +++ b/advanced-achievements-plugin/src/test/java/com/hm/achievement/listener/PlayerAdvancedAchievementListenerTest.java @@ -8,6 +8,7 @@ import com.hm.achievement.domain.Achievement.AchievementBuilder; import com.hm.achievement.utils.FancyMessageSender; import com.hm.achievement.utils.PlayerAdvancedAchievementEvent; +import java.io.IOException; import java.io.InputStreamReader; import java.util.HashSet; import java.util.List; @@ -56,20 +57,23 @@ void itShouldRegisterNewAchievementInDatabase() { AchievementMap achievementMap = new AchievementMap(); achievementMap.put(new AchievementBuilder().name("connect_1").displayName("Good Choice").build()); achievementMap.put(new AchievementBuilder().name("place_500_smooth_brick").displayName("Stone Brick Layer").build()); - YamlConfiguration mainConfig = YamlConfiguration.loadConfiguration(new InputStreamReader(Objects.requireNonNull(getClass().getResourceAsStream("/config-reception.yml")))); - YamlConfiguration langConfig = YamlConfiguration.loadConfiguration(new InputStreamReader(Objects.requireNonNull(getClass().getResourceAsStream("/lang.yml")))); - PlayerAdvancedAchievementListener underTest = new PlayerAdvancedAchievementListener(mainConfig, langConfig, mock(Logger.class), PLUGIN_HEADER, new CacheManager(plugin, abstractDatabaseManager), plugin, null, achievementMap, abstractDatabaseManager, null, new FancyMessageSender(16)); - underTest.extractConfigurationParameters(); - when(player.getUniqueId()).thenReturn(PLAYER_UUID); - when(player.getName()).thenReturn("DarkPyves"); - when(plugin.getServer()).thenReturn(server); - doReturn(List.of(player)).when(server).getOnlinePlayers(); - Set receivedAchievements = new HashSet<>(); - receivedAchievements.add("connect_1"); - when(abstractDatabaseManager.getPlayerAchievementNames(PLAYER_UUID)).thenReturn(receivedAchievements); - Achievement achievement = new AchievementBuilder().name("connect_1").displayName("Good Choice").message("Connected for the first time!").build(); - underTest.onPlayerAdvancedAchievementReception(new PlayerAdvancedAchievementEvent(player, achievement)); - verify(abstractDatabaseManager).registerAchievement(eq(PLAYER_UUID), eq("connect_1"), anyLong()); + try (InputStreamReader mainConfigReader = new InputStreamReader(Objects.requireNonNull(getClass().getResourceAsStream("/config-reception.yml"))); InputStreamReader langConfigReader = new InputStreamReader(Objects.requireNonNull(getClass().getResourceAsStream("/lang.yml")))) { + YamlConfiguration mainConfig = YamlConfiguration.loadConfiguration(mainConfigReader); + YamlConfiguration langConfig = YamlConfiguration.loadConfiguration(langConfigReader); + PlayerAdvancedAchievementListener underTest = new PlayerAdvancedAchievementListener(mainConfig, langConfig, mock(Logger.class), PLUGIN_HEADER, new CacheManager(plugin, abstractDatabaseManager), plugin, null, achievementMap, abstractDatabaseManager, null, new FancyMessageSender(16)); + underTest.extractConfigurationParameters(); + when(player.getUniqueId()).thenReturn(PLAYER_UUID); + when(player.getName()).thenReturn("DarkPyves"); + when(plugin.getServer()).thenReturn(server); + doReturn(List.of(player)).when(server).getOnlinePlayers(); + Set receivedAchievements = new HashSet<>(); + receivedAchievements.add("connect_1"); + when(abstractDatabaseManager.getPlayerAchievementNames(PLAYER_UUID)).thenReturn(receivedAchievements); + Achievement achievement = new AchievementBuilder().name("connect_1").displayName("Good Choice").message("Connected for the first time!").build(); + underTest.onPlayerAdvancedAchievementReception(new PlayerAdvancedAchievementEvent(player, achievement)); + verify(abstractDatabaseManager).registerAchievement(eq(PLAYER_UUID), eq("connect_1"), anyLong()); + } catch (IOException e) { + throw new RuntimeException(e); + } } - } \ No newline at end of file From 7034fa47e507d0031f980d4b42319d0e2f05b0ff Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Mon, 13 Apr 2026 19:22:53 +0100 Subject: [PATCH 32/58] Hardcode more colours into strings --- advanced-achievements-plugin/src/main/resources/lang.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/advanced-achievements-plugin/src/main/resources/lang.yml b/advanced-achievements-plugin/src/main/resources/lang.yml index b8ddc610..4cabcdd6 100644 --- a/advanced-achievements-plugin/src/main/resources/lang.yml +++ b/advanced-achievements-plugin/src/main/resources/lang.yml @@ -16,8 +16,8 @@ all-achievements-received: "Congratulations, you have received all the achieveme invalid-command: "Invalid command. Please type /aach to display the command help." # Used in /aach reload. -configuration-successfully-reloaded: "Configuration successfully reloaded." -configuration-reload-failed: "Errors while reloading configuration. Please view logs for more details." +configuration-successfully-reloaded: "&2Configuration successfully reloaded." +configuration-reload-failed: "&cErrors while reloading configuration. Please view logs for more details." # Used in /aach top week and month. top-achievement: "Top achievement owners:" From b3a9fa86a3f2912e28ce1a3e2345702faaa26970 Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Mon, 13 Apr 2026 19:30:59 +0100 Subject: [PATCH 33/58] Combine lines --- .../src/main/java/com/hm/achievement/gui/CategoryGUI.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/CategoryGUI.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/CategoryGUI.java index acd8fb2d..337a87bd 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/CategoryGUI.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/CategoryGUI.java @@ -29,7 +29,6 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.NamedTextColor; import org.apache.commons.lang3.StringUtils; import org.bukkit.Bukkit; import org.bukkit.NamespacedKey; @@ -108,10 +107,8 @@ public void extractConfigurationParameters() { configHideRewardDisplayInList = mainConfig.getBoolean("HideRewardDisplayInList"); configEnrichedProgressBars = mainConfig.getBoolean("EnrichedListProgressBars"); configNumberedItemsInList = mainConfig.getBoolean("NumberedItemsInList"); - NamedTextColor configColor = ColorHelper.configColor(mainConfig); - configColorCode = ColorHelper.namedTextColorToLegacyAmpersand(configColor); - NamedTextColor configListColorNotReceived = ColorHelper.parseColor(mainConfig.getString("ListColorNotReceived")); - configListColorNotReceivedCode = ColorHelper.namedTextColorToLegacyAmpersand(configListColorNotReceived); + configColorCode = ColorHelper.namedTextColorToLegacyAmpersand(ColorHelper.configColor(mainConfig)); + configListColorNotReceivedCode = ColorHelper.namedTextColorToLegacyAmpersand(ColorHelper.parseColor(mainConfig.getString("ListColorNotReceived"))); configFormatNotReceived = mainConfig.getBoolean("ListItaliciseNotReceived") ? "&o" : ""; configBackButtonIsCategoryItem = mainConfig.getBoolean("BackButtonIsCategoryItem"); langListBackMessage = ColorHelper.convertAmpersandToComponent(langConfig.getString("list-back-message")); From 74e404dca1d592fa44a97ec9ea7dd99ff343c8c2 Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Mon, 13 Apr 2026 19:34:43 +0100 Subject: [PATCH 34/58] Revert readme --- README.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/README.md b/README.md index 9843acdd..0aabed1e 100644 --- a/README.md +++ b/README.md @@ -13,14 +13,6 @@ Recent changes include Java 25, 26.1.2, and removing deprecated ChatColor method earn rewards, climb the rankings and receive RP books! The plugin supports SQLite, MySQL, H2 and PostgreSQL, manages an extensive statistics system, handles YAML configuration files and features fancy in-game GUIs and effects!** -# Key Change for 26.1.2: - -Colours are now solely done via the config and not hardcoded in (for the most part). If a string does not support a -colour yet, please open a [GitHub issue](https://github.com/mrfdev/advanced-achievements/issues) for support to be added. No colours should be hardcoded anymore to allow for -users to customise their config fully. - -Currently only the english lang.yml is updated as I do not have the scope or knowledge to expand into other languages. If you would like to contribute towards syncing the English lang.yml with other languages, please do! - ## Spigot release! We have [a Spigot release page](https://www.spigotmc.org/resources/advancedachievements.121486/) now (which links to the From 99556075b0ffe9504cfd23d527d1fb311751a396 Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Mon, 13 Apr 2026 20:10:19 +0100 Subject: [PATCH 35/58] Fix commands appearing as raw strings --- .../command/executable/AbstractCommand.java | 12 ++- .../command/executable/AddCommand.java | 28 +++--- .../command/executable/BookCommand.java | 9 +- .../command/executable/CheckCommand.java | 27 +++--- .../command/executable/DeleteCommand.java | 32 +++---- .../command/executable/GenerateCommand.java | 10 +-- .../command/executable/GiveCommand.java | 36 ++++---- .../command/executable/GrantCommand.java | 38 ++++---- .../command/executable/HelpCommand.java | 90 +++++++++---------- .../command/executable/InfoCommand.java | 36 +++----- .../command/executable/InspectCommand.java | 3 +- .../command/executable/ListCommand.java | 7 +- .../command/executable/ReloadCommand.java | 13 ++- .../command/executable/ResetCommand.java | 28 +++--- .../command/executable/StatsCommand.java | 12 +-- .../command/executable/ToggleCommand.java | 33 +++---- .../achievement/utils/FancyMessageSender.java | 3 +- 17 files changed, 178 insertions(+), 239 deletions(-) diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractCommand.java index 2275099a..93249a76 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractCommand.java @@ -2,10 +2,9 @@ import com.hm.achievement.lifecycle.Reloadable; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.TextComponent; -import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.YamlConfiguration; +import org.jspecify.annotations.NonNull; /** * Abstract class in charge of factoring out common functionality for commands. @@ -55,7 +54,12 @@ public void execute(CommandSender sender, String[] args) { */ abstract void onExecute(CommandSender sender, String[] args); - TextComponent translateColorCodes(String translate) { - return LegacyComponentSerializer.legacyAmpersand().deserialize(translate); + protected Component replace(@NonNull Component component, String placeholder, String value) { + return component.replaceText(b -> b.matchLiteral(placeholder).replacement(value)); + } + + protected Component replace(@NonNull Component component, String @NonNull [] placeholders, String[] values) { + for (int i = 0; i < placeholders.length; i++) component = replace(component, placeholders[i], values[i]); + return component; } } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AddCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AddCommand.java index 922a17aa..351547f0 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AddCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AddCommand.java @@ -10,6 +10,7 @@ import jakarta.inject.Inject; import jakarta.inject.Named; import jakarta.inject.Singleton; +import java.util.Objects; import java.util.Set; import java.util.UUID; import java.util.concurrent.TimeUnit; @@ -19,6 +20,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; +import org.jspecify.annotations.NonNull; /** * Class in charge of increase a statistic of an achievement by command. @@ -35,14 +37,12 @@ public class AddCommand extends AbstractParsableCommand { private final CacheManager cacheManager; private final StatisticIncreaseHandler statisticIncreaseHandler; private final AchievementMap achievementMap; - private String langErrorValue; - private String langStatisticIncreased; - private String langCategoryDoesNotExist; + private Component langErrorValue; + private Component langStatisticIncreased; + private Component langCategoryDoesNotExist; @Inject - public AddCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, - Component pluginHeader, AbstractDatabaseManager databaseManager, CacheManager cacheManager, - StatisticIncreaseHandler statisticIncreaseHandler, AchievementMap achievementMap) { + public AddCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Component pluginHeader, AbstractDatabaseManager databaseManager, CacheManager cacheManager, StatisticIncreaseHandler statisticIncreaseHandler, AchievementMap achievementMap) { super(mainConfig, langConfig, pluginHeader); this.databaseManager = databaseManager; this.cacheManager = cacheManager; @@ -54,15 +54,15 @@ public AddCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") Ya public void extractConfigurationParameters() { super.extractConfigurationParameters(); - langErrorValue = pluginHeader + langConfig.getString("error-value"); - langStatisticIncreased = pluginHeader + langConfig.getString("statistic-increased"); - langCategoryDoesNotExist = pluginHeader + langConfig.getString("category-does-not-exist"); + langErrorValue = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("error-value")))).build(); + langStatisticIncreased = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("statistic-increased")))).build(); + langCategoryDoesNotExist = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("category-does-not-exist")))).build(); } @Override - void onExecuteForPlayer(CommandSender sender, String[] args, Player player) { + void onExecuteForPlayer(CommandSender sender, String @NonNull [] args, Player player) { if (!NumberUtils.isCreatable(args[1])) { - sender.sendMessage(StringUtils.replaceEach(langErrorValue, new String[]{"VALUE"}, new String[]{args[1]})); + sender.sendMessage(replace(langErrorValue, "VALUE", args[1])); return; } @@ -90,11 +90,9 @@ void onExecuteForPlayer(CommandSender sender, String[] args, Player player) { } statisticIncreaseHandler.checkThresholdsAndAchievements(player, category, amount); } - sender.sendMessage(StringUtils.replaceEach(langStatisticIncreased, new String[]{"ACH", "AMOUNT", "PLAYER"}, - new String[]{args[2], args[1], args[3]})); + sender.sendMessage(replace(langStatisticIncreased, new String[]{"ACH", "AMOUNT", "PLAYER"}, new String[]{args[2], args[1], args[3]})); } else { - sender.sendMessage(StringUtils.replaceEach(langCategoryDoesNotExist, new String[]{"CAT", "CLOSEST_MATCH"}, - new String[]{args[2], StringHelper.getClosestMatch(args[2], categorySubcategories)})); + sender.sendMessage(replace(langCategoryDoesNotExist, new String[]{"CAT", "CLOSEST_MATCH"}, new String[]{args[2], StringHelper.getClosestMatch(args[2], categorySubcategories)})); } } } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/BookCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/BookCommand.java index 8c13315e..a5e24cad 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/BookCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/BookCommand.java @@ -5,6 +5,7 @@ import com.hm.achievement.db.data.AwardedDBAchievement; import com.hm.achievement.domain.Achievement; import com.hm.achievement.lifecycle.Cleanable; +import com.hm.achievement.utils.ColorHelper; import com.hm.achievement.utils.SoundPlayer; import jakarta.inject.Inject; import jakarta.inject.Named; @@ -18,8 +19,6 @@ import java.util.Objects; import java.util.UUID; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.TextComponent; -import net.kyori.adventure.text.format.NamedTextColor; import org.apache.commons.lang3.StringUtils; import org.bukkit.Material; import org.bukkit.Particle; @@ -55,7 +54,7 @@ public class BookCommand extends AbstractCommand implements Cleanable { private String configSoundBook; private String langBookDelay; private String langBookNotReceived; - private TextComponent langBookDate; + private Component langBookDate; private String langBookName; private String langBookReceived; private DateFormat dateFormat; @@ -79,7 +78,7 @@ public void extractConfigurationParameters() { configSoundBook = Objects.requireNonNull(mainConfig.getString("SoundBook")).toUpperCase(); langBookDelay = pluginHeader + StringUtils.replaceEach(langConfig.getString("book-delay"), new String[]{"TIME"}, new String[]{Integer.toString(configTimeBook / 1000)}); langBookNotReceived = pluginHeader + langConfig.getString("book-not-received"); - langBookDate = translateColorCodes(langConfig.getString("book-date")).colorIfAbsent(NamedTextColor.DARK_GRAY); + langBookDate = ColorHelper.convertAmpersandToComponent(langConfig.getString("book-date")); langBookName = langConfig.getString("book-name"); langBookReceived = pluginHeader + langConfig.getString("book-received"); @@ -135,7 +134,7 @@ private void fillBook(@NonNull List achievements, Player p Achievement achievement = achievementMap.getForName(awardedAchievement.name()); if (achievement != null) { String currentAchievement = "&0" + achievement.getDisplayName() + configBookSeparator + achievement.getMessage() + configBookSeparator + awardedAchievement.formattedDate(); - bookPages.add(translateColorCodes(currentAchievement)); + bookPages.add(ColorHelper.convertAmpersandToComponent(currentAchievement)); } } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/CheckCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/CheckCommand.java index 44518bdf..77abacbd 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/CheckCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/CheckCommand.java @@ -4,11 +4,12 @@ import jakarta.inject.Inject; import jakarta.inject.Named; import jakarta.inject.Singleton; +import java.util.Objects; import net.kyori.adventure.text.Component; -import org.apache.commons.lang3.StringUtils; import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; +import org.jspecify.annotations.NonNull; /** * Class in charge of handling the /aach check command, which checks whether a player has received an achievement. @@ -21,12 +22,11 @@ public class CheckCommand extends AbstractParsableCommand { private final CacheManager cacheManager; - private String langCheckAchievementTrue; - private String langCheckAchievementFalse; + private Component langCheckAchievementTrue; + private Component langCheckAchievementFalse; @Inject - public CheckCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, - Component pluginHeader, CacheManager cacheManager) { + public CheckCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Component pluginHeader, CacheManager cacheManager) { super(mainConfig, langConfig, pluginHeader); this.cacheManager = cacheManager; } @@ -34,22 +34,15 @@ public CheckCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") @Override public void extractConfigurationParameters() { super.extractConfigurationParameters(); - - langCheckAchievementTrue = pluginHeader + langConfig.getString("check-achievement-true"); - langCheckAchievementFalse = pluginHeader + langConfig.getString("check-achievements-false"); + langCheckAchievementTrue = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("check-achievement-true")))).build(); + langCheckAchievementFalse = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("check-achievements-false")))).build(); } @Override - void onExecuteForPlayer(CommandSender sender, String[] args, Player player) { + void onExecuteForPlayer(CommandSender sender, String[] args, @NonNull Player player) { String achievementName = parseAchievementName(args); - // Check if achievement exists in database and display message accordingly. - if (cacheManager.hasPlayerAchievement(player.getUniqueId(), achievementName)) { - sender.sendMessage(StringUtils.replaceEach(langCheckAchievementTrue, new String[]{"PLAYER", "ACH"}, - new String[]{args[args.length - 1], achievementName})); - } else { - sender.sendMessage(StringUtils.replaceEach(langCheckAchievementFalse, new String[]{"PLAYER", "ACH"}, - new String[]{args[args.length - 1], achievementName})); - } + if (cacheManager.hasPlayerAchievement(player.getUniqueId(), achievementName)) sender.sendMessage(replace(langCheckAchievementTrue, new String[]{"PLAYER", "ACH"}, new String[]{args[args.length - 1], achievementName})); + else sender.sendMessage(replace(langCheckAchievementFalse, new String[]{"PLAYER", "ACH"}, new String[]{args[args.length - 1], achievementName})); } } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/DeleteCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/DeleteCommand.java index 952764cb..5672c607 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/DeleteCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/DeleteCommand.java @@ -7,9 +7,8 @@ import jakarta.inject.Named; import jakarta.inject.Singleton; import java.util.Collections; +import java.util.Objects; import net.kyori.adventure.text.Component; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.Strings; import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; @@ -29,14 +28,12 @@ public class DeleteCommand extends AbstractParsableCommand { private final AbstractDatabaseManager databaseManager; private final AchievementMap achievementMap; - private String langCheckAchievementFalse; - private String langDeleteAchievements; - private String langAllDeleteAchievements; + private Component langCheckAchievementFalse; + private Component langDeleteAchievements; + private Component langAllDeleteAchievements; @Inject - public DeleteCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, - Component pluginHeader, CacheManager cacheManager, AbstractDatabaseManager databaseManager, - AchievementMap achievementMap) { + public DeleteCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Component pluginHeader, CacheManager cacheManager, AbstractDatabaseManager databaseManager, AchievementMap achievementMap) { super(mainConfig, langConfig, pluginHeader); this.cacheManager = cacheManager; this.databaseManager = databaseManager; @@ -47,9 +44,9 @@ public DeleteCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") public void extractConfigurationParameters() { super.extractConfigurationParameters(); - langCheckAchievementFalse = pluginHeader + langConfig.getString("check-achievements-false"); - langDeleteAchievements = pluginHeader + langConfig.getString("delete-achievements"); - langAllDeleteAchievements = pluginHeader + langConfig.getString("delete-all-achievements"); + langCheckAchievementFalse = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("check-achievements-false")))).build(); + langDeleteAchievements = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("delete-achievements")))).build(); + langAllDeleteAchievements = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("delete-all-achievements")))).build(); } @Override @@ -59,16 +56,11 @@ void onExecuteForPlayer(CommandSender sender, String[] args, Player player) { if (WILDCARD.equals(achievementName)) { cacheManager.removePreviouslyReceivedAchievements(player.getUniqueId(), achievementMap.getAllNames()); databaseManager.deleteAllPlayerAchievements(player.getUniqueId()); - sender.sendMessage(Strings.CS.replace(langAllDeleteAchievements, "PLAYER", args[args.length - 1])); + sender.sendMessage(replace(langAllDeleteAchievements, "PLAYER", args[args.length - 1])); } else if (cacheManager.hasPlayerAchievement(player.getUniqueId(), achievementName)) { - cacheManager.removePreviouslyReceivedAchievements(player.getUniqueId(), - Collections.singletonList(achievementName)); + cacheManager.removePreviouslyReceivedAchievements(player.getUniqueId(), Collections.singletonList(achievementName)); databaseManager.deletePlayerAchievement(player.getUniqueId(), achievementName); - sender.sendMessage(StringUtils.replaceEach(langDeleteAchievements, new String[]{"PLAYER", "ACH"}, - new String[]{args[args.length - 1], achievementName})); - } else { - sender.sendMessage(StringUtils.replaceEach(langCheckAchievementFalse, new String[]{"PLAYER", "ACH"}, - new String[]{args[args.length - 1], achievementName})); - } + sender.sendMessage(replace(langDeleteAchievements, new String[]{"PLAYER", "ACH"}, new String[]{args[args.length - 1], achievementName})); + } else sender.sendMessage(replace(langCheckAchievementFalse, new String[]{"PLAYER", "ACH"}, new String[]{args[args.length - 1], achievementName})); } } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GenerateCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GenerateCommand.java index c6166ac0..6c89cc7f 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GenerateCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GenerateCommand.java @@ -4,6 +4,7 @@ import jakarta.inject.Inject; import jakarta.inject.Named; import jakarta.inject.Singleton; +import java.util.Objects; import net.kyori.adventure.text.Component; import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.YamlConfiguration; @@ -20,11 +21,10 @@ public class GenerateCommand extends AbstractCommand { private final AdvancementManager advancementManager; - private String langAdvancementsGenerated; + private Component langAdvancementsGenerated; @Inject - public GenerateCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, - Component pluginHeader, AdvancementManager advancementManager) { + public GenerateCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Component pluginHeader, AdvancementManager advancementManager) { super(mainConfig, langConfig, pluginHeader); this.advancementManager = advancementManager; } @@ -32,14 +32,12 @@ public GenerateCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang @Override public void extractConfigurationParameters() { super.extractConfigurationParameters(); - - langAdvancementsGenerated = pluginHeader + langConfig.getString("advancements-generated"); + langAdvancementsGenerated = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("advancements-generated")))).build(); } @Override void onExecute(CommandSender sender, String[] args) { advancementManager.registerAdvancements(); - sender.sendMessage(langAdvancementsGenerated); } } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GiveCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GiveCommand.java index 05a1727b..7bc71a94 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GiveCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GiveCommand.java @@ -9,10 +9,10 @@ import jakarta.inject.Inject; import jakarta.inject.Named; import jakarta.inject.Singleton; +import java.util.Objects; import java.util.Optional; import java.util.Set; import net.kyori.adventure.text.Component; -import org.apache.commons.lang3.StringUtils; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.YamlConfiguration; @@ -31,14 +31,13 @@ public class GiveCommand extends AbstractParsableCommand { private final AchievementMap achievementMap; private boolean configMultiCommand; - private String langAchievementAlreadyReceived; - private String langAchievementGiven; - private String langAchievementNotFound; - private String langAchievementNoPermission; + private Component langAchievementAlreadyReceived; + private Component langAchievementGiven; + private Component langAchievementNotFound; + private Component langAchievementNoPermission; @Inject - public GiveCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, - Component pluginHeader, CacheManager cacheManager, AchievementMap achievementMap) { + public GiveCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Component pluginHeader, CacheManager cacheManager, AchievementMap achievementMap) { super(mainConfig, langConfig, pluginHeader); this.cacheManager = cacheManager; this.achievementMap = achievementMap; @@ -50,26 +49,23 @@ public void extractConfigurationParameters() { configMultiCommand = mainConfig.getBoolean("MultiCommand"); - langAchievementAlreadyReceived = pluginHeader + langConfig.getString("achievement-already-received"); - langAchievementGiven = pluginHeader + langConfig.getString("achievement-given"); - langAchievementNotFound = pluginHeader + langConfig.getString("achievement-not-found"); - langAchievementNoPermission = pluginHeader + langConfig.getString("achievement-no-permission"); + langAchievementAlreadyReceived = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("achievement-already-received")))).build(); + langAchievementGiven = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("achievement-given")))).build(); + langAchievementNotFound = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("achievement-not-found")))).build(); + langAchievementNoPermission = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("achievement-no-permission")))).build(); } @Override void onExecuteForPlayer(CommandSender sender, String[] args, Player player) { - Optional achievement = achievementMap.getForCategory(CommandAchievements.COMMANDS).stream() - .filter(ach -> ach.getSubcategory().equals(args[1])) - .findAny(); + Optional achievement = achievementMap.getForCategory(CommandAchievements.COMMANDS).stream().filter(ach -> ach.getSubcategory().equals(args[1])).findAny(); if (achievement.isPresent()) { // Check whether player has already received achievement and cannot receive it again. - if (!configMultiCommand - && cacheManager.hasPlayerAchievement(player.getUniqueId(), achievement.get().getName())) { - sender.sendMessage(StringUtils.replaceEach(langAchievementAlreadyReceived, new String[]{"PLAYER"}, new String[]{args[2]})); + if (!configMultiCommand && cacheManager.hasPlayerAchievement(player.getUniqueId(), achievement.get().getName())) { + sender.sendMessage(replace(langAchievementAlreadyReceived, "PLAYER", args[2])); return; } else if (!player.hasPermission("achievement." + achievement.get().getName())) { - sender.sendMessage(StringUtils.replaceEach(langAchievementNoPermission, new String[]{"PLAYER"}, new String[]{args[2]})); + sender.sendMessage(replace(langAchievementNoPermission, "PLAYER", args[2])); return; } @@ -78,9 +74,7 @@ void onExecuteForPlayer(CommandSender sender, String[] args, Player player) { sender.sendMessage(langAchievementGiven); } else { Set commandKeys = achievementMap.getSubcategoriesForCategory(CommandAchievements.COMMANDS); - sender.sendMessage(StringUtils.replaceEach(langAchievementNotFound, - new String[]{"CLOSEST_MATCH"}, - new String[]{StringHelper.getClosestMatch(args[1], commandKeys)})); + sender.sendMessage(replace(langAchievementNotFound, "CLOSEST_MATCH", StringHelper.getClosestMatch(args[1], commandKeys))); } } } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GrantCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GrantCommand.java index 767fe6a9..7700219b 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GrantCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GrantCommand.java @@ -9,11 +9,11 @@ import jakarta.inject.Inject; import jakarta.inject.Named; import jakarta.inject.Singleton; +import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; import net.kyori.adventure.text.Component; -import org.apache.commons.lang3.StringUtils; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.YamlConfiguration; @@ -26,12 +26,12 @@ public class GrantCommand extends AbstractParsableCommand { private final CacheManager cacheManager; private final AchievementMap achievementMap; private boolean configMultiCommand; - private String langAchievementAlreadyReceived; - private String langAchievementGranted; - private String langAchievementNotFound; - private String langAchievementNoPermission; - private String langPlayerNotFound; - private String langAchievementGrantedAll; + private Component langAchievementAlreadyReceived; + private Component langAchievementGranted; + private Component langAchievementNotFound; + private Component langAchievementNoPermission; + private Component langPlayerNotFound; + private Component langAchievementGrantedAll; @Inject public GrantCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Component pluginHeader, CacheManager cacheManager, AchievementMap achievementMap) { @@ -44,12 +44,12 @@ public GrantCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") public void extractConfigurationParameters() { super.extractConfigurationParameters(); configMultiCommand = mainConfig.getBoolean("MultiCommand"); - langAchievementAlreadyReceived = pluginHeader + langConfig.getString("achievement-already-received"); - langAchievementGranted = pluginHeader + langConfig.getString("achievement-granted"); - langAchievementGrantedAll = pluginHeader + langConfig.getString("achievement-granted-all"); - langAchievementNotFound = pluginHeader + langConfig.getString("achievement-not-found"); - langAchievementNoPermission = pluginHeader + langConfig.getString("achievement-no-permission"); - langPlayerNotFound = pluginHeader + langConfig.getString("player-not-found", "Player not found."); + langAchievementAlreadyReceived = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("achievement-already-received")))).build(); + langAchievementGranted = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("achievement-granted")))).build(); + langAchievementGrantedAll = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("achievement-granted-all")))).build(); + langAchievementNotFound = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("achievement-not-found")))).build(); + langAchievementNoPermission = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("achievement-no-permission")))).build(); + langPlayerNotFound = Component.text().append(pluginHeader).append(Component.text(langConfig.getString("player-not-found", "Player not found."))).build(); } @Override @@ -76,9 +76,9 @@ public void onExecuteForPlayer(CommandSender sender, String @NonNull [] args, Pl grantedAny = true; } if (grantedAny) { - sender.sendMessage(StringUtils.replaceEach(langAchievementGrantedAll, new String[]{"PLAYER"}, new String[]{playerName})); + sender.sendMessage(replace(langAchievementGrantedAll, "PLAYER", playerName)); } else { - sender.sendMessage(StringUtils.replaceEach(langAchievementAlreadyReceived, new String[]{"PLAYER"}, new String[]{playerName})); + sender.sendMessage(replace(langAchievementAlreadyReceived, "PLAYER", playerName)); } return; } @@ -87,18 +87,18 @@ public void onExecuteForPlayer(CommandSender sender, String @NonNull [] args, Pl if (achievement.isPresent()) { Achievement ach = achievement.get(); if (!configMultiCommand && cacheManager.hasPlayerAchievement(targetPlayer.getUniqueId(), ach.getName())) { - sender.sendMessage(StringUtils.replaceEach(langAchievementAlreadyReceived, new String[]{"PLAYER"}, new String[]{playerName})); + sender.sendMessage(replace(langAchievementAlreadyReceived, "PLAYER", playerName)); return; } if (!sender.hasPermission("achievement." + ach.getName())) { - sender.sendMessage(StringUtils.replaceEach(langAchievementNoPermission, new String[]{"PLAYER"}, new String[]{playerName})); + sender.sendMessage(replace(langAchievementNoPermission, "PLAYER", playerName)); return; } Bukkit.getPluginManager().callEvent(new PlayerAdvancedAchievementEvent(targetPlayer, ach)); - sender.sendMessage(StringUtils.replaceEach(langAchievementGranted, new String[]{"PLAYER"}, new String[]{playerName})); + sender.sendMessage(replace(langAchievementGranted, "PLAYER", playerName)); } else { Set names = achievementMap.getForCategory(CommandAchievements.COMMANDS).stream().map(Achievement::getName).collect(Collectors.toSet()); - sender.sendMessage(StringUtils.replaceEach(langAchievementNotFound, new String[]{"CLOSEST_MATCH"}, new String[]{StringHelper.getClosestMatch(achName, names)})); + sender.sendMessage(replace(langAchievementNotFound, "CLOSEST_MATCH", StringHelper.getClosestMatch(achName, names))); } } } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/HelpCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/HelpCommand.java index a4a8c5b1..ec760a08 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/HelpCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/HelpCommand.java @@ -11,7 +11,6 @@ import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; -import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; @@ -31,41 +30,41 @@ public class HelpCommand extends AbstractCommand { private NamedTextColor configColor; private String configIcon; - private TextComponent langCommandList; - private TextComponent langCommandListHover; - private TextComponent langCommandTop; - private TextComponent langCommandTopHover; - private TextComponent langCommandInfo; - private TextComponent langCommandInfoHover; - private TextComponent langCommandBook; - private TextComponent langCommandBookHover; - private TextComponent langCommandWeek; - private TextComponent langCommandWeekHover; - private TextComponent langCommandStats; - private TextComponent langCommandStatsHover; - private TextComponent langCommandMonth; - private TextComponent langCommandMonthHover; - private TextComponent langCommandToggleHover; - private TextComponent langCommandToggle; - private TextComponent langCommandReload; - private TextComponent langCommandReloadHover; - private TextComponent langCommandGenerate; - private TextComponent langCommandGenerateHover; - private TextComponent langCommandInspect; - private TextComponent langCommandInspectHover; - private TextComponent langCommandGive; - private TextComponent langCommandGiveHover; - private TextComponent langCommandAdd; - private TextComponent langCommandAddHover; - private TextComponent langCommandReset; - private TextComponent langCommandResetHover; - private TextComponent langCommandCheck; - private TextComponent langCommandCheckHover; - private TextComponent langCommandDelete; - private TextComponent langCommandDeleteHover; - private TextComponent langCommandGrant; - private TextComponent langCommandGrantHover; - private TextComponent langTip; + private Component langCommandList; + private Component langCommandListHover; + private Component langCommandTop; + private Component langCommandTopHover; + private Component langCommandInfo; + private Component langCommandInfoHover; + private Component langCommandBook; + private Component langCommandBookHover; + private Component langCommandWeek; + private Component langCommandWeekHover; + private Component langCommandStats; + private Component langCommandStatsHover; + private Component langCommandMonth; + private Component langCommandMonthHover; + private Component langCommandToggleHover; + private Component langCommandToggle; + private Component langCommandReload; + private Component langCommandReloadHover; + private Component langCommandGenerate; + private Component langCommandGenerateHover; + private Component langCommandInspect; + private Component langCommandInspectHover; + private Component langCommandGive; + private Component langCommandGiveHover; + private Component langCommandAdd; + private Component langCommandAddHover; + private Component langCommandReset; + private Component langCommandResetHover; + private Component langCommandCheck; + private Component langCommandCheckHover; + private Component langCommandDelete; + private Component langCommandDeleteHover; + private Component langCommandGrant; + private Component langCommandGrantHover; + private Component langTip; @Inject public HelpCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Component pluginHeader, FancyMessageSender fancyMessageSender) { @@ -82,7 +81,7 @@ public void extractConfigurationParameters() { langCommandList = header("/aach list").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-list")))); langCommandListHover = Component.text(Objects.requireNonNull(langConfig.getString("aach-command-list-hover"))); langCommandTop = header("/aach top").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-top")))); - langCommandTopHover =Component.text(Objects.requireNonNull(langConfig.getString("aach-command-top-hover"))); + langCommandTopHover = Component.text(Objects.requireNonNull(langConfig.getString("aach-command-top-hover"))); langCommandInfo = header("/aach info").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-info")))); langCommandInfoHover = Component.text(Objects.requireNonNull(langConfig.getString("aach-command-info-hover"))); langCommandBook = header("/aach book").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-book")))); @@ -114,11 +113,11 @@ public void extractConfigurationParameters() { langCommandGrant = header("/aach grant cat player").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-grant")))); langCommandGrantHover = Component.text(Objects.requireNonNull(langConfig.getString("aach-command-grant-hover"))); - langTip = translateColorCodes(langConfig.getString("aach-tip")).colorIfAbsent(NamedTextColor.GRAY); + langTip = ColorHelper.convertAmpersandToComponent(langConfig.getString("aach-tip")); } private @NonNull TextComponent header(String command) { - return Component.text().append(LegacyComponentSerializer.legacySection().deserialize(pluginHeader.toString())).append(Component.text(command, configColor)).append(Component.text(" > ", NamedTextColor.GRAY)).build(); + return Component.text().append(pluginHeader).append(Component.text(command).color(configColor)).append(Component.text(" > ").color(NamedTextColor.GRAY)).build(); } @Override @@ -183,16 +182,13 @@ void onExecute(@NonNull CommandSender sender, String[] args) { * Sends a packet message to the server in order to display a clickable and hoverable message. A suggested command * is displayed in the chat when clicked on, and an additional help message appears when a command is hovered. * - * @param sender sender + * @param sender sender * @param message message * @param command command - * @param hover hover + * @param hover hover */ - private void sendJsonClickableHoverableMessage(CommandSender sender, TextComponent message, String command, TextComponent hover) { - if (sender instanceof Player player) { - fancyMessageSender.sendHoverableCommandMessage(player, message, command, hover); - } else { - sender.sendMessage(message); - } + private void sendJsonClickableHoverableMessage(CommandSender sender, Component message, String command, Component hover) { + if (sender instanceof Player player) fancyMessageSender.sendHoverableCommandMessage(player, message, command, hover); + else sender.sendMessage(message); } } \ No newline at end of file diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InfoCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InfoCommand.java index a49c9f59..f2fe0e13 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InfoCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InfoCommand.java @@ -10,7 +10,6 @@ import java.util.Objects; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; -import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.YamlConfiguration; @@ -58,46 +57,41 @@ public void extractConfigurationParameters() { header = Component.text("------------ ", configColor).append(Component.text(Objects.requireNonNull(configIcon))).append(Component.text(" Advanced Achievements ", NamedTextColor.WHITE)).append(Component.text(configIcon)).append(Component.text(" ------------", configColor)); - langVersionCommandDescription = Component.text(pluginHeader.toString()).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-description")), configColor)).append(Component.text(" ")).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-description-details")), NamedTextColor.GRAY)); + langVersionCommandDescription = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-description")), configColor)).append(Component.text(" ")).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-description-details")), NamedTextColor.GRAY)).build(); - langVersionCommandVersion = Component.text(pluginHeader.toString()).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-version")), configColor)).append(Component.text(" ")).append(Component.text(advancedAchievements.getPluginMeta().getVersion(), NamedTextColor.GRAY)); + langVersionCommandVersion = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-version")), configColor)).append(Component.text(" ")).append(Component.text(advancedAchievements.getPluginMeta().getVersion(), NamedTextColor.GRAY)).build(); - langVersionCommandAuthor = Component.text(pluginHeader.toString()).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-author")), configColor)).append(Component.text(" ")).append(Component.text(advancedAchievements.getPluginMeta().getAuthors().getFirst(), NamedTextColor.GRAY)); + langVersionCommandAuthor = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-author")), configColor)).append(Component.text(" ")).append(Component.text(advancedAchievements.getPluginMeta().getAuthors().getFirst(), NamedTextColor.GRAY)).build(); - langVersionCommandWebsite = Component.text(pluginHeader.toString()).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-website")), configColor)).append(Component.text(" ")).append(Component.text(Objects.requireNonNull(advancedAchievements.getPluginMeta().getWebsite()), NamedTextColor.GRAY)); + langVersionCommandWebsite = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-website")), configColor)).append(Component.text(" ")).append(Component.text(Objects.requireNonNull(advancedAchievements.getPluginMeta().getWebsite()), NamedTextColor.GRAY)).build(); // Display whether Advanced Achievements is linked to Vault. String vaultState = rewardParser.getEconomy() != null ? "&a✔" : "&4✘"; - langVersionCommandVault = Component.text(pluginHeader.toString()).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-vault")), configColor)).append(Component.text(" ")).append(fromLegacy(vaultState).color(NamedTextColor.GRAY)); + langVersionCommandVault = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-vault")), configColor)).append(Component.text(" ")).append(ColorHelper.convertAmpersandToComponent(vaultState).color(NamedTextColor.GRAY)).build(); // Display whether Advanced Achievements is linked to Pet Master. String petMasterState = Bukkit.getPluginManager().isPluginEnabled("PetMaster") ? "&a✔" : "&4✘"; - langVersionCommandPetmaster = Component.text(pluginHeader.toString()).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-petmaster")), configColor)).append(Component.text(" ")).append(fromLegacy(petMasterState).color(NamedTextColor.GRAY)); + langVersionCommandPetmaster = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-petmaster")), configColor)).append(Component.text(" ")).append(ColorHelper.convertAmpersandToComponent(petMasterState).color(NamedTextColor.GRAY)).build(); // Display whether Advanced Achievements is linked to Essentials. boolean essentialsUsed = Bukkit.getPluginManager().isPluginEnabled("Essentials") && mainConfig.getBoolean("IgnoreAFKPlayedTime"); String essentialsState = essentialsUsed ? "&a✔" : "&4✘"; - langVersionCommandEssentials = Component.text(pluginHeader.toString()).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-essentials")), configColor)).append(Component.text(" ")).append(fromLegacy(essentialsState).color(NamedTextColor.GRAY)); + langVersionCommandEssentials = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-essentials")), configColor)).append(Component.text(" ")).append(ColorHelper.convertAmpersandToComponent(essentialsState).color(NamedTextColor.GRAY)).build(); // Display whether Advanced Achievements is linked to PlaceholderAPI. String placeholderAPIState = Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI") ? "&a✔" : "&4✘"; - langVersionCommandPlaceholderAPI = Component.text(pluginHeader.toString()).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-placeholderapi")), configColor)).append(Component.text(" ")).append(fromLegacy(placeholderAPIState).color(NamedTextColor.GRAY)); + langVersionCommandPlaceholderAPI = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-placeholderapi")), configColor)).append(Component.text(" ")).append(ColorHelper.convertAmpersandToComponent(placeholderAPIState).color(NamedTextColor.GRAY)).build(); // Display database type. String databaseType = getDatabaseType(); - langVersionCommandDatabase = Component.text(pluginHeader.toString()).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-database")), configColor)).append(Component.text(" ")).append(Component.text(databaseType, NamedTextColor.GRAY)); + langVersionCommandDatabase = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-database")), configColor)).append(Component.text(" ")).append(Component.text(databaseType, NamedTextColor.GRAY)).build(); } private @NonNull String getDatabaseType() { - if ("mysql".equalsIgnoreCase(configDatabaseType)) { - return "MySQL"; - } else if ("postgresql".equalsIgnoreCase(configDatabaseType)) { - return "PostgreSQL"; - } else if ("h2".equalsIgnoreCase(configDatabaseType)) { - return "H2"; - } else { - return "SQLite"; - } + if ("mysql".equalsIgnoreCase(configDatabaseType)) return "MySQL"; + else if ("postgresql".equalsIgnoreCase(configDatabaseType)) return "PostgreSQL"; + else if ("h2".equalsIgnoreCase(configDatabaseType)) return "H2"; + else return "SQLite"; } @Override @@ -115,8 +109,4 @@ void onExecute(@NonNull CommandSender sender, String[] args) { sender.sendMessage(langVersionCommandDatabase); } } - - private @NonNull Component fromLegacy(String legacy) { - return LegacyComponentSerializer.legacyAmpersand().deserialize(legacy); - } } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InspectCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InspectCommand.java index 5c165577..f7eff45b 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InspectCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InspectCommand.java @@ -15,6 +15,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.UUID; import java.util.function.Supplier; @@ -73,7 +74,7 @@ void onExecute(CommandSender sender, String[] args) { String displayName = parseAchievementName(args); Achievement achievement = getAchievement(displayName); if (achievement == null) { - sender.sendMessage(pluginHeader + StringUtils.replaceEach(langConfig.getString("achievement-not-recognized"), new String[]{"NAME", "CLOSEST_MATCH"}, new String[]{displayName, StringHelper.getClosestMatch(displayName, achievementMap.getAllSanitisedDisplayNames())})); + sender.sendMessage(Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(StringUtils.replaceEach(langConfig.getString("achievement-not-recognized"), new String[]{"NAME", "CLOSEST_MATCH"}, new String[]{displayName, StringHelper.getClosestMatch(displayName, achievementMap.getAllSanitisedDisplayNames())})))).build()); return; } int page = getPage(args); diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ListCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ListCommand.java index f047423d..41b4f26d 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ListCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ListCommand.java @@ -14,7 +14,6 @@ import java.util.Optional; import java.util.stream.Collectors; import net.kyori.adventure.text.Component; -import org.apache.commons.lang3.StringUtils; import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; @@ -33,7 +32,7 @@ public class ListCommand extends AbstractCommand { private final CategoryGUI categoryGUI; private final GUIItems guiItems; - private String langCategoryDoesNotExist; + private Component langCategoryDoesNotExist; @Inject public ListCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Component pluginHeader, MainGUI mainGUI, CategoryGUI categoryGUI, GUIItems guiItems) { @@ -46,7 +45,7 @@ public ListCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") Y @Override public void extractConfigurationParameters() { super.extractConfigurationParameters(); - langCategoryDoesNotExist = pluginHeader + langConfig.getString("category-does-not-exist"); + langCategoryDoesNotExist = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("category-does-not-exist")))).build(); } @Override @@ -65,7 +64,7 @@ void onExecute(CommandSender sender, String[] args) { categoryGUI.displayCategoryGUI(matchingCategory.get().getValue(), player, 0); } else { List allGUICategoryNames = guiItems.getOrderedAchievementItems().keySet().stream().map(c -> c.category().toString()).collect(Collectors.toList()); - sender.sendMessage(StringUtils.replaceEach(langCategoryDoesNotExist, new String[]{"CAT", "CLOSEST_MATCH"}, new String[]{categoryName, StringHelper.getClosestMatch(categoryName, allGUICategoryNames)})); + sender.sendMessage(replace(langCategoryDoesNotExist, new String[]{"CAT", "CLOSEST_MATCH"}, new String[]{categoryName, StringHelper.getClosestMatch(categoryName, allGUICategoryNames)})); } } } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ReloadCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ReloadCommand.java index 01bc4b14..68fad149 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ReloadCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ReloadCommand.java @@ -4,6 +4,7 @@ import com.hm.achievement.exception.PluginLoadError; import com.hm.achievement.lifecycle.PluginLoader; import com.hm.achievement.lifecycle.Reloadable; +import com.hm.achievement.utils.ColorHelper; import dagger.Lazy; import jakarta.inject.Inject; import jakarta.inject.Named; @@ -31,13 +32,11 @@ public class ReloadCommand extends AbstractCommand { private final Lazy pluginLoader; private final Lazy> reloadables; - private String langConfigReloadFailed; - private String langConfigSuccessfullyReloaded; + private Component langConfigReloadFailed; + private Component langConfigSuccessfullyReloaded; @Inject - public ReloadCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, - Component pluginHeader, AdvancedAchievements advancedAchievements, Logger logger, - Lazy pluginLoader, Lazy> reloadables) { + public ReloadCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Component pluginHeader, AdvancedAchievements advancedAchievements, Logger logger, Lazy pluginLoader, Lazy> reloadables) { super(mainConfig, langConfig, pluginHeader); this.advancedAchievements = advancedAchievements; this.logger = logger; @@ -49,8 +48,8 @@ public ReloadCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") public void extractConfigurationParameters() { super.extractConfigurationParameters(); - langConfigReloadFailed = pluginHeader + langConfig.getString("configuration-reload-failed"); - langConfigSuccessfullyReloaded = pluginHeader + langConfig.getString("configuration-successfully-reloaded"); + langConfigReloadFailed = Component.text().append(pluginHeader).append(ColorHelper.convertAmpersandToComponent(langConfig.getString("configuration-reload-failed"))).build(); + langConfigSuccessfullyReloaded = Component.text().append(pluginHeader).append(ColorHelper.convertAmpersandToComponent(langConfig.getString("configuration-successfully-reloaded"))).build(); } /** diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ResetCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ResetCommand.java index 3f0bfa11..24eecaa5 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ResetCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ResetCommand.java @@ -7,10 +7,9 @@ import jakarta.inject.Named; import jakarta.inject.Singleton; import java.util.Collections; +import java.util.Objects; import java.util.Set; import net.kyori.adventure.text.Component; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.Strings; import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; @@ -30,13 +29,12 @@ public class ResetCommand extends AbstractParsableCommand { private final CacheManager cacheManager; private final AchievementMap achievementMap; - private String langResetSuccessful; - private String langResetAllSuccessful; - private String langCategoryDoesNotExist; + private Component langResetSuccessful; + private Component langResetAllSuccessful; + private Component langCategoryDoesNotExist; @Inject - public ResetCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, - Component pluginHeader, CacheManager cacheManager, AchievementMap achievementMap) { + public ResetCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Component pluginHeader, CacheManager cacheManager, AchievementMap achievementMap) { super(mainConfig, langConfig, pluginHeader); this.cacheManager = cacheManager; this.achievementMap = achievementMap; @@ -45,10 +43,9 @@ public ResetCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") @Override public void extractConfigurationParameters() { super.extractConfigurationParameters(); - - langResetSuccessful = pluginHeader + langConfig.getString("reset-successful"); - langResetAllSuccessful = pluginHeader + langConfig.getString("reset-all-successful"); - langCategoryDoesNotExist = pluginHeader + langConfig.getString("category-does-not-exist"); + langResetSuccessful = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("reset-successful")))).build(); + langResetAllSuccessful = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("reset-all-successful")))).build(); + langCategoryDoesNotExist = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("category-does-not-exist")))).build(); } @Override @@ -57,15 +54,12 @@ void onExecuteForPlayer(CommandSender sender, String[] args, Player player) { Set categorySubcategories = achievementMap.getCategorySubcategories(); if (WILDCARD.equals(categoryWithSubcategory)) { cacheManager.resetPlayerStatistics(player.getUniqueId(), categorySubcategories); - sender.sendMessage(Strings.CS.replace(langResetAllSuccessful, "PLAYER", player.getName())); + sender.sendMessage(replace(langResetAllSuccessful, "PLAYER", player.getName())); } else if (categorySubcategories.contains(categoryWithSubcategory)) { cacheManager.resetPlayerStatistics(player.getUniqueId(), Collections.singletonList(categoryWithSubcategory)); - sender.sendMessage(StringUtils.replaceEach(langResetSuccessful, new String[]{"CAT", "PLAYER"}, - new String[]{categoryWithSubcategory, player.getName()})); + sender.sendMessage(replace(langResetSuccessful, new String[]{"CAT", "PLAYER"}, new String[]{categoryWithSubcategory, player.getName()})); } else { - sender.sendMessage(StringUtils.replaceEach(langCategoryDoesNotExist, new String[]{"CAT", "CLOSEST_MATCH"}, - new String[]{categoryWithSubcategory, - StringHelper.getClosestMatch(categoryWithSubcategory, categorySubcategories)})); + sender.sendMessage(replace(langCategoryDoesNotExist, new String[]{"CAT", "CLOSEST_MATCH"}, new String[]{categoryWithSubcategory, StringHelper.getClosestMatch(categoryWithSubcategory, categorySubcategories)})); } } } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/StatsCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/StatsCommand.java index 21de8b84..ad7306dd 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/StatsCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/StatsCommand.java @@ -53,14 +53,13 @@ public StatsCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") @Override public void extractConfigurationParameters() { super.extractConfigurationParameters(); - // Load configuration parameters. configColor = ColorHelper.configColor(mainConfig); configIcon = StringHelper.unescapeJava(mainConfig.getString("Icon")); configAdditionalEffects = mainConfig.getBoolean("AdditionalEffects"); configSound = mainConfig.getBoolean("Sound"); configSoundStats = Objects.requireNonNull(mainConfig.getString("SoundStats")).toUpperCase(); - langNumberAchievements = Component.text(String.valueOf(pluginHeader)).append(Component.text(Objects.requireNonNull(langConfig.getString("number-achievements")))).append(Component.text(" ")); + langNumberAchievements = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("number-achievements")))).append(Component.text(" ")).build(); } @Override @@ -107,13 +106,8 @@ void onExecute(CommandSender sender, String[] args) { // Player has received all achievement; play special effect and sound. if (playerAchievements >= totalAchievements) { - if (configAdditionalEffects) { - player.spawnParticle(Particle.WITCH, player.getLocation(), 400, 0, 1, 0, 0.5f); - } - - if (configSound) { - soundPlayer.play(player, configSoundStats, "ENTITY_FIREWORK_ROCKET_BLAST"); - } + if (configAdditionalEffects) player.spawnParticle(Particle.WITCH, player.getLocation(), 400, 0, 1, 0, 0.5f); + if (configSound) soundPlayer.play(player, configSoundStats, "ENTITY_FIREWORK_ROCKET_BLAST"); } } } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ToggleCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ToggleCommand.java index 0b698e98..b1e7c9f3 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ToggleCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ToggleCommand.java @@ -7,6 +7,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.UUID; import net.kyori.adventure.text.Component; @@ -29,23 +30,20 @@ public class ToggleCommand extends AbstractCommand { private final Map> typesToToggledPlayers = new HashMap<>(); private boolean configNotifyOtherPlayers; - private String langToggleDisplayed; - private String langToggleHidden; + private Component langToggleDisplayed; + private Component langToggleHidden; @Inject - public ToggleCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, - Component pluginHeader) { + public ToggleCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Component pluginHeader) { super(mainConfig, langConfig, pluginHeader); } @Override public void extractConfigurationParameters() { super.extractConfigurationParameters(); - configNotifyOtherPlayers = mainConfig.getBoolean("NotifyOtherPlayers"); - - langToggleDisplayed = pluginHeader + langConfig.getString("toggle-displayed"); - langToggleHidden = pluginHeader + langConfig.getString("toggle-hidden"); + langToggleDisplayed = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("toggle-displayed")))).build(); + langToggleHidden = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("toggle-hidden")))).build(); } /** @@ -56,20 +54,14 @@ public void extractConfigurationParameters() { * @return true if player has used the toggle command, false otherwise */ public boolean isPlayerToggled(Player player, String type) { - return toggledPlayers.contains(player.getUniqueId()) - || typesToToggledPlayers.getOrDefault(type, Collections.emptySet()).contains(player.getUniqueId()); + return toggledPlayers.contains(player.getUniqueId()) || typesToToggledPlayers.getOrDefault(type, Collections.emptySet()).contains(player.getUniqueId()); } @Override void onExecute(CommandSender sender, String[] args) { - if (!(sender instanceof Player player)) { - return; - } - + if (!(sender instanceof Player player)) return; Set toggledPlayersForType = toggledPlayers; - if (args.length > 1) { - toggledPlayersForType = typesToToggledPlayers.computeIfAbsent(args[1], t -> new HashSet<>()); - } + if (args.length > 1) toggledPlayersForType = typesToToggledPlayers.computeIfAbsent(args[1], _ -> new HashSet<>()); if (toggledPlayersForType.contains(player.getUniqueId())) { toggledPlayersForType.remove(player.getUniqueId()); @@ -81,10 +73,7 @@ void onExecute(CommandSender sender, String[] args) { } private void displayChatMessage(Player player, boolean notifications) { - if (notifications) { - player.sendMessage(langToggleDisplayed); - } else { - player.sendMessage(langToggleHidden); - } + if (notifications) player.sendMessage(langToggleDisplayed); + else player.sendMessage(langToggleHidden); } } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/FancyMessageSender.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/FancyMessageSender.java index 00a730f5..837a0bd0 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/FancyMessageSender.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/FancyMessageSender.java @@ -3,7 +3,6 @@ import jakarta.inject.Inject; import jakarta.inject.Singleton; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.event.HoverEvent; import org.bukkit.entity.Player; @@ -46,7 +45,7 @@ public void sendHoverableMessage(@NonNull Player player, @NonNull Component mess * @param hover The text to display in the hover. */ - public void sendHoverableCommandMessage(@NonNull Player player, @NonNull TextComponent message, String command, TextComponent hover) { + public void sendHoverableCommandMessage(@NonNull Player player, @NonNull Component message, String command, Component hover) { player.sendMessage(message.clickEvent(ClickEvent.runCommand(command)).hoverEvent(HoverEvent.showText(hover))); } } From 01e3ea301a21715e0518ab3f79b67f993ef72aaf Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Mon, 13 Apr 2026 20:50:32 +0100 Subject: [PATCH 36/58] Fixes #159 --- .../hm/achievement/command/executable/InspectCommand.java | 5 +---- advanced-achievements-plugin/src/main/resources/lang-BP.yml | 3 --- advanced-achievements-plugin/src/main/resources/lang-CN.yml | 3 --- advanced-achievements-plugin/src/main/resources/lang-DA.yml | 3 --- advanced-achievements-plugin/src/main/resources/lang-DE.yml | 3 --- advanced-achievements-plugin/src/main/resources/lang-ES.yml | 3 --- advanced-achievements-plugin/src/main/resources/lang-FI.yml | 3 --- advanced-achievements-plugin/src/main/resources/lang-FR.yml | 3 --- advanced-achievements-plugin/src/main/resources/lang-HU.yml | 3 --- advanced-achievements-plugin/src/main/resources/lang-PL.yml | 3 --- advanced-achievements-plugin/src/main/resources/lang-RU.yml | 2 -- advanced-achievements-plugin/src/main/resources/lang-SK.yml | 3 --- advanced-achievements-plugin/src/main/resources/lang-TR.yml | 4 ---- advanced-achievements-plugin/src/main/resources/lang-TW.yml | 3 --- advanced-achievements-plugin/src/main/resources/lang.yml | 3 --- 15 files changed, 1 insertion(+), 46 deletions(-) diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InspectCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InspectCommand.java index f7eff45b..9a3587ea 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InspectCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InspectCommand.java @@ -6,7 +6,6 @@ import com.hm.achievement.db.AbstractDatabaseManager; import com.hm.achievement.db.data.AwardedDBAchievement; import com.hm.achievement.domain.Achievement; -import com.hm.achievement.utils.StringHelper; import jakarta.inject.Inject; import jakarta.inject.Named; import jakarta.inject.Singleton; @@ -15,13 +14,11 @@ import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.Set; import java.util.UUID; import java.util.function.Supplier; import java.util.stream.Collectors; import net.kyori.adventure.text.Component; -import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import org.bukkit.OfflinePlayer; import org.bukkit.command.CommandSender; @@ -74,7 +71,7 @@ void onExecute(CommandSender sender, String[] args) { String displayName = parseAchievementName(args); Achievement achievement = getAchievement(displayName); if (achievement == null) { - sender.sendMessage(Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(StringUtils.replaceEach(langConfig.getString("achievement-not-recognized"), new String[]{"NAME", "CLOSEST_MATCH"}, new String[]{displayName, StringHelper.getClosestMatch(displayName, achievementMap.getAllSanitisedDisplayNames())})))).build()); + sender.sendMessage(Component.text().append(pluginHeader).append(Component.text("You must specify an achievement name"))); return; } int page = getPage(args); diff --git a/advanced-achievements-plugin/src/main/resources/lang-BP.yml b/advanced-achievements-plugin/src/main/resources/lang-BP.yml index 4872a896..797e1b88 100644 --- a/advanced-achievements-plugin/src/main/resources/lang-BP.yml +++ b/advanced-achievements-plugin/src/main/resources/lang-BP.yml @@ -214,9 +214,6 @@ reset-all-successful: "Todas as estatísticas foram apagadas para PLAYER." # Related to /aach generate. advancements-generated: "Avanços foram gerados com sucesso." -# Used in /aach inspect -achievement-not-recognized: "Conquista chamada 'NAME' não foi reconhecido. Você quis dizer CLOSEST_MATCH?" - #============================================================# # +--------------------------------------------------------+ # # | Parameters in future plugin versions will appear here | # diff --git a/advanced-achievements-plugin/src/main/resources/lang-CN.yml b/advanced-achievements-plugin/src/main/resources/lang-CN.yml index ee706f68..eb5f343e 100644 --- a/advanced-achievements-plugin/src/main/resources/lang-CN.yml +++ b/advanced-achievements-plugin/src/main/resources/lang-CN.yml @@ -211,9 +211,6 @@ reset-all-successful: " 玩家 PLAYER 的所有统计数据已经被清除。" # 与 /aach generate 相关 advancements-generated: "成功生成成就." -# 与 /aach inspect 相关 -achievement-not-recognized: 名称为 'NAME' 的成就无法识别,您的意思是 CLOSEST_MATCH 吗?" - #======================================================================================================================# # 更新内容 # # 翻译by Fur_Xia # diff --git a/advanced-achievements-plugin/src/main/resources/lang-DA.yml b/advanced-achievements-plugin/src/main/resources/lang-DA.yml index 171a4a4f..17ba358b 100644 --- a/advanced-achievements-plugin/src/main/resources/lang-DA.yml +++ b/advanced-achievements-plugin/src/main/resources/lang-DA.yml @@ -213,9 +213,6 @@ reset-all-successful: "Alle statistikker var ryddet for PLAYER." # Relateret til /aach generate. advancements-generated: "præsentationer var vellykket genereret." -# Relateret til /aach inspect -achievement-not-recognized: "Præsentation kaldet 'NAME' var ikke genkedt. Mente du CLOSEST_MATCH?" - #======================================================================================================================# # FUTURE PAREMETERS # # # diff --git a/advanced-achievements-plugin/src/main/resources/lang-DE.yml b/advanced-achievements-plugin/src/main/resources/lang-DE.yml index 0ee89dd8..76fe920e 100644 --- a/advanced-achievements-plugin/src/main/resources/lang-DE.yml +++ b/advanced-achievements-plugin/src/main/resources/lang-DE.yml @@ -203,9 +203,6 @@ reset-successful: "Die Statistik von Spieler wurde zurückgesetzt." # Related to /aach generate advancements-generated: "Fortschritte wurden erfolgreich generiert." -# Related to /aach inspect -achievement-not-recognized: "Der Erfolg mit dem namen 'NAME' wurde nicht erkannt. Meintest du CLOSEST_MATCH?" - #============================================================# # +--------------------------------------------------------+ # # | Parameters to appear in future versions | # diff --git a/advanced-achievements-plugin/src/main/resources/lang-ES.yml b/advanced-achievements-plugin/src/main/resources/lang-ES.yml index ba764004..9f9e62a9 100644 --- a/advanced-achievements-plugin/src/main/resources/lang-ES.yml +++ b/advanced-achievements-plugin/src/main/resources/lang-ES.yml @@ -239,9 +239,6 @@ reset-all-successful: "Se han reiniciado todas las estadísticas del jugador PLA # Mensajes para /aach generate. advancements-generated: "Se han generado logros exitosamente" -# Mensajes para /aach inspect -achievement-not-recognized: "El logro de NAME no existe. ¿Quizás quisiste decir CLOSEST_MATCH?" - #======================================================================================================================# # NUEVOS MENSAJES # # # diff --git a/advanced-achievements-plugin/src/main/resources/lang-FI.yml b/advanced-achievements-plugin/src/main/resources/lang-FI.yml index f7a0a703..05a3038b 100644 --- a/advanced-achievements-plugin/src/main/resources/lang-FI.yml +++ b/advanced-achievements-plugin/src/main/resources/lang-FI.yml @@ -198,9 +198,6 @@ reset-successful: " tilastot nollattiin pelaajalle PLAYER." # Related to /aach generate. advancements-generated: "MC-Saavutukset Generoitu onnistuneesti." -# Related to /aach inspect -achievement-not-recognized: "Saavutusta nimellä 'NAME' ei tunnistettu. Tarkoititko CLOSEST_MATCH?" - #============================================================# # +--------------------------------------------------------+ # # | Parameters in future plugin versions will appear here | # diff --git a/advanced-achievements-plugin/src/main/resources/lang-FR.yml b/advanced-achievements-plugin/src/main/resources/lang-FR.yml index a0e12cfc..30bfbfb3 100644 --- a/advanced-achievements-plugin/src/main/resources/lang-FR.yml +++ b/advanced-achievements-plugin/src/main/resources/lang-FR.yml @@ -214,9 +214,6 @@ reset-all-successful: "Toute les statistiques ont été réinitialisées pour PL # Used in /aach generate. advancements-generated: "Avancements générés avec succès." -# Used in /aach inspect -achievement-not-recognized: "Le succès 'NAME' n'existe pas. Voulez-vous dire CLOSEST_MATCH ?" - #======================================================================================================================# # FUTURE PAREMETERS # # # diff --git a/advanced-achievements-plugin/src/main/resources/lang-HU.yml b/advanced-achievements-plugin/src/main/resources/lang-HU.yml index 39f59ff1..84ef6926 100644 --- a/advanced-achievements-plugin/src/main/resources/lang-HU.yml +++ b/advanced-achievements-plugin/src/main/resources/lang-HU.yml @@ -199,9 +199,6 @@ reset-successful: " a statisztikák törölve PLAYER játékostól." # Related to /aach generate. advancements-generated: "A küldetések sikeresen létrehozva." -# Related to /aach inspect -achievement-not-recognized: "A(z) 'NAME' elnevezésű küldetést nem sikerült felismerni. Úgy érted CLOSEST_MATCH?" - #============================================================# # +--------------------------------------------------------+ # # | Parameters in future plugin versions will appear here | # diff --git a/advanced-achievements-plugin/src/main/resources/lang-PL.yml b/advanced-achievements-plugin/src/main/resources/lang-PL.yml index a66a4d14..9174b9eb 100644 --- a/advanced-achievements-plugin/src/main/resources/lang-PL.yml +++ b/advanced-achievements-plugin/src/main/resources/lang-PL.yml @@ -212,9 +212,6 @@ advancements-generated: Pomyslnie wygenerowano postepy. error-value: Wartosc musi byc liczba! statistic-increased: Statystyka ACH zostala zwiekszona o AMOUNT dla PLAYER ! -# Related to /aach inspect -achievement-not-recognized: Nie odnaleziono osiagniecia. Czy chodzilo ci o CLOSEST_MATCH? - #============================================================# # +--------------------------------------------------------+ # # | Parameters in future plugin versions will appear here | # diff --git a/advanced-achievements-plugin/src/main/resources/lang-RU.yml b/advanced-achievements-plugin/src/main/resources/lang-RU.yml index 130f92eb..983a093b 100644 --- a/advanced-achievements-plugin/src/main/resources/lang-RU.yml +++ b/advanced-achievements-plugin/src/main/resources/lang-RU.yml @@ -212,8 +212,6 @@ reset-all-successful: 'Статистика достижений PLAYER сбро # Команда /aach generate. advancements-generated: Достижения успешно скопированы в окно достижений игры. -# Команда /aach inspect. -achievement-not-recognized: Достижение NAME не найдено. Возможно, вы имели ввиду CLOSEST_MATCH? # =============================================================# # +----------------------------------------------------------+ # diff --git a/advanced-achievements-plugin/src/main/resources/lang-SK.yml b/advanced-achievements-plugin/src/main/resources/lang-SK.yml index ffa71fa3..eec83075 100644 --- a/advanced-achievements-plugin/src/main/resources/lang-SK.yml +++ b/advanced-achievements-plugin/src/main/resources/lang-SK.yml @@ -210,9 +210,6 @@ reset-all-successful: "Všetky štatistiky pre hráča PLAYER boli vyčistené." # Related to /aach generate. advancements-generated: "Úspechy boli úspešne vygenerované." -# Related to /aach inspect -achievement-not-recognized: "Úspech s názvom 'NAME' nebol rozpoznaný. Myslel si CLOSEST_MATCH?" - #============================================================# # +--------------------------------------------------------+ # # | Parameters in future plugin versions will appear here | # diff --git a/advanced-achievements-plugin/src/main/resources/lang-TR.yml b/advanced-achievements-plugin/src/main/resources/lang-TR.yml index 0384fa8d..eeebe7ae 100644 --- a/advanced-achievements-plugin/src/main/resources/lang-TR.yml +++ b/advanced-achievements-plugin/src/main/resources/lang-TR.yml @@ -205,10 +205,6 @@ reset-successful: PLAYER oyuncusunun istatistikleri sıfırlandı. # Related to /aach generate. advancements-generated: Gelişimler başarıyla oluşturuldu. -# Related to /aach inspect -achievement-not-recognized: '''NAME'' isimli başarım bulunamadı. Bunu mu demek istediniz: - CLOSEST_MATCH?' - #============================================================# # +--------------------------------------------------------+ # # | Parameters in future plugin versions will appear here | # diff --git a/advanced-achievements-plugin/src/main/resources/lang-TW.yml b/advanced-achievements-plugin/src/main/resources/lang-TW.yml index 9d79669f..4e047bd3 100644 --- a/advanced-achievements-plugin/src/main/resources/lang-TW.yml +++ b/advanced-achievements-plugin/src/main/resources/lang-TW.yml @@ -198,9 +198,6 @@ reset-successful: " 統計資訊已為 PLAYER 清除。" # Related to /aach generate. advancements-generated: "進度已順利生成。" -# Related to /aach inspect -achievement-not-recognized: "名為 'NAME' 無法被識別,你想表達的是 CLOSEST_MATCH 嗎?" - #============================================================# # +--------------------------------------------------------+ # # | Parameters in future plugin versions will appear here | # diff --git a/advanced-achievements-plugin/src/main/resources/lang.yml b/advanced-achievements-plugin/src/main/resources/lang.yml index 4cabcdd6..c36ef1e1 100644 --- a/advanced-achievements-plugin/src/main/resources/lang.yml +++ b/advanced-achievements-plugin/src/main/resources/lang.yml @@ -222,9 +222,6 @@ reset-all-successful: "All statistics were cleared for PLAYER." # Used in /aach generate. advancements-generated: "Advancements were successfully generated." -# Used in /aach inspect -achievement-not-recognized: "Achievement called 'NAME' was not recognized. Did you mean CLOSEST_MATCH?" - #======================================================================================================================# # FUTURE PAREMETERS # # # From ba1a1efbd3457ca86cae97dc1d972d2583e97537 Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Mon, 13 Apr 2026 21:02:31 +0100 Subject: [PATCH 37/58] Closes #165 --- .../com/hm/achievement/config/ConfigurationParser.java | 7 +++---- .../src/main/java/com/hm/achievement/gui/GUIItems.java | 8 ++++---- .../achievement/listener/statistics/PlacesListener.java | 7 +++---- .../main/java/com/hm/achievement/utils/StringHelper.java | 5 +++++ 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/config/ConfigurationParser.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/config/ConfigurationParser.java index 3d342cbc..78eefe3a 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/config/ConfigurationParser.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/config/ConfigurationParser.java @@ -27,7 +27,6 @@ import java.util.logging.Logger; import java.util.stream.Collectors; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Strings; import org.bukkit.Bukkit; @@ -143,10 +142,10 @@ private void parseHeader() { pluginHeader.setLength(0); String icon = StringHelper.unescapeJava(mainConfig.getString("Icon")); if (StringUtils.isNotBlank(icon)) { - String coloredIcon = LegacyComponentSerializer.legacySection().serialize(Component.text(icon, ColorHelper.configColor(mainConfig))); + String coloredIcon = StringHelper.componentToLegacySection(Component.text(icon, ColorHelper.configColor(mainConfig))); String rawHeader = Strings.CS.replace(mainConfig.getString("ChatHeader"), "%ICON%", coloredIcon); - Component header = LegacyComponentSerializer.legacyAmpersand().deserialize(Objects.requireNonNull(rawHeader)); - pluginHeader.append(LegacyComponentSerializer.legacySection().serialize(header)).append(" "); + Component header = ColorHelper.convertAmpersandToComponent(rawHeader); + pluginHeader.append(StringHelper.componentToLegacySection(header)).append(" "); } pluginHeader.trimToSize(); } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/GUIItems.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/GUIItems.java index 6a44bb19..af38f7e2 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/GUIItems.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/GUIItems.java @@ -4,6 +4,7 @@ import com.hm.achievement.category.MultipleAchievements; import com.hm.achievement.category.NormalAchievements; import com.hm.achievement.lifecycle.Reloadable; +import com.hm.achievement.utils.ColorHelper; import com.hm.achievement.utils.MaterialHelper; import com.hm.achievement.utils.StringHelper; import jakarta.inject.Inject; @@ -17,7 +18,6 @@ import java.util.Objects; import java.util.TreeMap; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.apache.commons.lang3.StringUtils; import org.bukkit.Material; import org.bukkit.configuration.file.YamlConfiguration; @@ -134,12 +134,12 @@ private ItemStack createItemStack(String categoryName) { private @NonNull ItemStack createButton(String category, String msg, String lore) { ItemStack button = createItemStack(category); ItemMeta meta = button.getItemMeta(); - Component displayName = LegacyComponentSerializer.legacyAmpersand().deserialize(Objects.requireNonNull(StringHelper.unescapeJava(langConfig.getString(msg)))); + Component displayName = ColorHelper.convertAmpersandToComponent(StringHelper.unescapeJava(langConfig.getString(msg))); meta.displayName(displayName); if (lore != null) { String loreString = StringHelper.unescapeJava(langConfig.getString(lore)); if (!Objects.requireNonNull(loreString).isEmpty()) { - Component loreComponent = LegacyComponentSerializer.legacyAmpersand().deserialize(loreString); + Component loreComponent = ColorHelper.convertAmpersandToComponent(loreString); List loreComponents = Collections.singletonList(loreComponent); meta.lore(loreComponents); } @@ -164,7 +164,7 @@ private void buildItemLore(@NonNull ItemStack item, @NonNull String categoryName itemMeta.customName(null); } else { String formattedDisplayName = StringUtils.replaceEach(configListAchievementFormat, new String[]{"%ICON%", "%NAME%"}, new String[]{configIcon, "&l" + displayName + "&8"}); - itemMeta.customName(LegacyComponentSerializer.legacyAmpersand().deserialize(formattedDisplayName)); + itemMeta.customName(ColorHelper.convertAmpersandToComponent(formattedDisplayName)); } item.setItemMeta(itemMeta); } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/statistics/PlacesListener.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/statistics/PlacesListener.java index bee5ac5e..9929d56f 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/statistics/PlacesListener.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/statistics/PlacesListener.java @@ -3,13 +3,13 @@ import com.hm.achievement.category.MultipleAchievements; import com.hm.achievement.config.AchievementMap; import com.hm.achievement.db.CacheManager; +import com.hm.achievement.utils.StringHelper; import jakarta.inject.Inject; import jakarta.inject.Named; import jakarta.inject.Singleton; import java.util.HashSet; import java.util.Set; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.apache.commons.lang3.StringUtils; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; @@ -29,8 +29,7 @@ public class PlacesListener extends AbstractListener { @Inject - public PlacesListener(@Named("main") YamlConfiguration mainConfig, AchievementMap achievementMap, - CacheManager cacheManager) { + public PlacesListener(@Named("main") YamlConfiguration mainConfig, AchievementMap achievementMap, CacheManager cacheManager) { super(MultipleAchievements.PLACES, mainConfig, achievementMap, cacheManager); } @@ -50,7 +49,7 @@ public void onBlockPlace(@NonNull BlockPlaceEvent event) { if (itemMeta != null && itemMeta.hasDisplayName()) { Component displayNameComp = itemMeta.customName(); if (displayNameComp != null) { - String displayName = LegacyComponentSerializer.legacySection().serialize(displayNameComp); + String displayName = StringHelper.componentToLegacySection(displayNameComp); if (player.hasPermission(category.toChildPermName(StringUtils.deleteWhitespace(displayName)))) { addMatchingSubcategories(subcategories, displayName); } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/StringHelper.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/StringHelper.java index 7e8e2929..2e1b0e1b 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/StringHelper.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/StringHelper.java @@ -3,6 +3,7 @@ import java.util.Collection; import java.util.regex.Pattern; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.apache.commons.lang3.StringUtils; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -139,4 +140,8 @@ public static int levenshteinDistance(@NonNull CharSequence lhs, @NonNull CharSe } return prev[m]; } + + public static @NonNull String componentToLegacySection(Component component) { + return LegacyComponentSerializer.legacySection().serialize(component); + } } From a88f2886846d1d90f27cbdfb51c8fa6a8641c7d3 Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Mon, 13 Apr 2026 21:04:32 +0100 Subject: [PATCH 38/58] Inline variable --- .../command/executor/PluginCommandExecutorTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/advanced-achievements-plugin/src/test/java/com/hm/achievement/command/executor/PluginCommandExecutorTest.java b/advanced-achievements-plugin/src/test/java/com/hm/achievement/command/executor/PluginCommandExecutorTest.java index fbedbada..202afa9f 100644 --- a/advanced-achievements-plugin/src/test/java/com/hm/achievement/command/executor/PluginCommandExecutorTest.java +++ b/advanced-achievements-plugin/src/test/java/com/hm/achievement/command/executor/PluginCommandExecutorTest.java @@ -60,8 +60,7 @@ void setUp() { commands.add(helpCommand); commands.add(listCommand); commands.add(argsCommand); - Component pluginHeader = PLUGIN_HEADER; - underTest = new PluginCommandExecutor(langConfig, commands, pluginHeader); + underTest = new PluginCommandExecutor(langConfig, commands, PLUGIN_HEADER); underTest.extractConfigurationParameters(); } From 3cb885c1e66b7ea93df4b24e955ab86d7b6046f5 Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Mon, 13 Apr 2026 21:11:36 +0100 Subject: [PATCH 39/58] Expand test suite --- .../achievement/utils/NumberHelperTest.java | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/advanced-achievements-plugin/src/test/java/com/hm/achievement/utils/NumberHelperTest.java b/advanced-achievements-plugin/src/test/java/com/hm/achievement/utils/NumberHelperTest.java index 0cf93095..7d1411c0 100644 --- a/advanced-achievements-plugin/src/test/java/com/hm/achievement/utils/NumberHelperTest.java +++ b/advanced-achievements-plugin/src/test/java/com/hm/achievement/utils/NumberHelperTest.java @@ -8,9 +8,33 @@ class NumberHelperTest { @Test void shouldComputeNextMultipleOf9() { - assertEquals(18, NumberHelper.nextMultipleOf9(17)); + assertEquals(9, NumberHelper.nextMultipleOf9(1)); + assertEquals(9, NumberHelper.nextMultipleOf9(9)); + assertEquals(18, NumberHelper.nextMultipleOf9(10)); assertEquals(18, NumberHelper.nextMultipleOf9(18)); assertEquals(27, NumberHelper.nextMultipleOf9(19)); + assertEquals(27, NumberHelper.nextMultipleOf9(27)); + assertEquals(36, NumberHelper.nextMultipleOf9(28)); + assertEquals(36, NumberHelper.nextMultipleOf9(36)); } + @Test + void shouldHandleZero() { + assertEquals(0, NumberHelper.nextMultipleOf9(0)); + } + + @Test + void shouldHandleExactMultiples() { + assertEquals(9, NumberHelper.nextMultipleOf9(9)); + assertEquals(27, NumberHelper.nextMultipleOf9(27)); + assertEquals(90, NumberHelper.nextMultipleOf9(90)); + } + + @Test + void shouldHandleNegativeNumbers() { + assertEquals(0, NumberHelper.nextMultipleOf9(-1)); + assertEquals(0, NumberHelper.nextMultipleOf9(-8)); + assertEquals(-9, NumberHelper.nextMultipleOf9(-9)); + assertEquals(-9, NumberHelper.nextMultipleOf9(-10)); + } } From 897ff1919293aa73c638ccafb4694fa315426c35 Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Mon, 13 Apr 2026 21:13:32 +0100 Subject: [PATCH 40/58] Inline method to remove class --- .../com/hm/achievement/gui/CategoryGUI.java | 3 +- .../hm/achievement/utils/NumberHelper.java | 28 ------------- .../achievement/utils/NumberHelperTest.java | 40 ------------------- 3 files changed, 1 insertion(+), 70 deletions(-) delete mode 100644 advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/NumberHelper.java delete mode 100644 advanced-achievements-plugin/src/test/java/com/hm/achievement/utils/NumberHelperTest.java diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/CategoryGUI.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/CategoryGUI.java index 337a87bd..cb56ead6 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/CategoryGUI.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/CategoryGUI.java @@ -10,7 +10,6 @@ import com.hm.achievement.domain.Reward; import com.hm.achievement.lifecycle.Reloadable; import com.hm.achievement.utils.ColorHelper; -import com.hm.achievement.utils.NumberHelper; import com.hm.achievement.utils.StringHelper; import jakarta.inject.Inject; import jakarta.inject.Named; @@ -172,7 +171,7 @@ private void displayPage(Player player, Map subcategoriesToStatist int pageEnd = Math.min(MAX_ACHIEVEMENTS_PER_PAGE * (pageIndex + 1), achievements.size()); // The inventory must be big enough to contain all page achievements and an entire row for the navigation items. - int guiSize = Math.min(NumberHelper.nextMultipleOf9(achievements.size()), MAX_ACHIEVEMENTS_PER_PAGE) + ROW_SIZE; + int guiSize = Math.min(Math.ceilDiv(achievements.size(), 9) * 9, MAX_ACHIEVEMENTS_PER_PAGE) + ROW_SIZE; AchievementInventoryHolder inventoryHolder = new AchievementInventoryHolder(pageIndex, clickedItem); Inventory inventory = Bukkit.createInventory(inventoryHolder, guiSize, langListGUITitle); inventoryHolder.setInventory(inventory); diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/NumberHelper.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/NumberHelper.java deleted file mode 100644 index 1837be9c..00000000 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/NumberHelper.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.hm.achievement.utils; - -/** - * Simple class providing helper methods to perform simple number operations. - * - * @author Pyves - */ -public class NumberHelper { - - private NumberHelper() { - // Not called. - } - - /** - * This simple function gets the smallest multiple of 9 greater than its input value. - * - * @param value - * @return closest multiple of 9 greater than value - */ - public static int nextMultipleOf9(int value) { - int multipleOfNine = 9; - while (multipleOfNine < value) { - multipleOfNine += 9; - } - return multipleOfNine; - } - -} diff --git a/advanced-achievements-plugin/src/test/java/com/hm/achievement/utils/NumberHelperTest.java b/advanced-achievements-plugin/src/test/java/com/hm/achievement/utils/NumberHelperTest.java deleted file mode 100644 index 7d1411c0..00000000 --- a/advanced-achievements-plugin/src/test/java/com/hm/achievement/utils/NumberHelperTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.hm.achievement.utils; - -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -class NumberHelperTest { - - @Test - void shouldComputeNextMultipleOf9() { - assertEquals(9, NumberHelper.nextMultipleOf9(1)); - assertEquals(9, NumberHelper.nextMultipleOf9(9)); - assertEquals(18, NumberHelper.nextMultipleOf9(10)); - assertEquals(18, NumberHelper.nextMultipleOf9(18)); - assertEquals(27, NumberHelper.nextMultipleOf9(19)); - assertEquals(27, NumberHelper.nextMultipleOf9(27)); - assertEquals(36, NumberHelper.nextMultipleOf9(28)); - assertEquals(36, NumberHelper.nextMultipleOf9(36)); - } - - @Test - void shouldHandleZero() { - assertEquals(0, NumberHelper.nextMultipleOf9(0)); - } - - @Test - void shouldHandleExactMultiples() { - assertEquals(9, NumberHelper.nextMultipleOf9(9)); - assertEquals(27, NumberHelper.nextMultipleOf9(27)); - assertEquals(90, NumberHelper.nextMultipleOf9(90)); - } - - @Test - void shouldHandleNegativeNumbers() { - assertEquals(0, NumberHelper.nextMultipleOf9(-1)); - assertEquals(0, NumberHelper.nextMultipleOf9(-8)); - assertEquals(-9, NumberHelper.nextMultipleOf9(-9)); - assertEquals(-9, NumberHelper.nextMultipleOf9(-10)); - } -} From 555374865acb5778bf03184bf898d7c90c9877d6 Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Mon, 13 Apr 2026 21:29:05 +0100 Subject: [PATCH 41/58] Code cleanup --- .../command/external/CommandUtils.java | 5 ++-- .../hm/achievement/config/RewardParser.java | 9 +++---- .../PlayerAdvancedAchievementListener.java | 5 ++-- .../listener/statistics/KillsListener.java | 17 ++++++------- .../hm/achievement/utils/InventoryHelper.java | 16 +++--------- .../hm/achievement/utils/MaterialHelper.java | 22 ++++++---------- .../com/hm/achievement/utils/SoundPlayer.java | 4 +-- .../utils/StatisticIncreaseHandler.java | 25 ++++++------------- .../hm/achievement/utils/StringHelper.java | 19 ++++++-------- .../achievement/config/RewardParserTest.java | 25 ++++++++----------- .../achievement/utils/StringHelperTest.java | 10 ++------ 11 files changed, 54 insertions(+), 103 deletions(-) diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/external/CommandUtils.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/external/CommandUtils.java index 850640fc..201d6ee5 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/external/CommandUtils.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/external/CommandUtils.java @@ -1,11 +1,10 @@ package com.hm.achievement.command.external; +import com.hm.achievement.utils.StringHelper; import java.util.ArrayList; import java.util.List; -import java.util.Objects; import java.util.Random; import java.util.concurrent.ThreadLocalRandom; -import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; @@ -507,7 +506,7 @@ private static boolean isW(String arg) { private static boolean isName(String arg, Entity e) { if (getName(arg) == null) return true; - return isInverted(arg) == (e.customName() == null) && isInverted(arg) != (getName(arg).equals(Objects.requireNonNull(PlainTextComponentSerializer.plainText().serialize(Objects.requireNonNull(e.customName()))).replace(" ", "_")) || (e instanceof Player && e.getName().replace(" ", "_").equalsIgnoreCase(getName(arg)))); + return isInverted(arg) == (e.customName() == null) && isInverted(arg) != (getName(arg).equals(StringHelper.componentToString((e.customName())).replace(" ", "_")) || (e instanceof Player && e.getName().replace(" ", "_").equalsIgnoreCase(getName(arg)))); } private static boolean isType(String arg, @NonNull Entity e) { diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/config/RewardParser.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/config/RewardParser.java index 22faf6b2..ee915644 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/config/RewardParser.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/config/RewardParser.java @@ -22,7 +22,6 @@ import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.Style; import net.kyori.adventure.text.format.TextDecoration; -import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import net.milkbowl.vault.economy.Economy; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; @@ -165,8 +164,7 @@ public List parseRewards(String path) { ItemMeta itemMeta = playerItem.getItemMeta(); if (itemMeta != null && itemMeta.hasDisplayName()) { Component displayName = itemMeta.displayName(); - String plainName = PlainTextComponentSerializer.plainText().serialize(Objects.requireNonNull(displayName)); - itemMeta.displayName(Component.text(plainName).style(Style.style().decoration(TextDecoration.ITALIC, false))); + itemMeta.displayName(Objects.requireNonNull(displayName).style(Style.style().decoration(TextDecoration.ITALIC, false))); playerItem.setItemMeta(itemMeta); } Map leftoverItem = player.getInventory().addItem(playerItem); @@ -208,9 +206,8 @@ public List parseRewards(String path) { List chatTexts = listTexts.stream().map(message -> Component.text(Objects.requireNonNull(StringUtils.replaceEach(langConfig.getString("custom-command-reward"), new String[]{"MESSAGE"}, new String[]{message})))).collect(Collectors.toList()); String executePath = configSection.contains("Command") ? "Command.Execute" : "Commands.Execute"; Consumer rewarder = player -> getOneOrManyConfigStrings(configSection, executePath).forEach(command -> { - Component component = StringHelper.replacePlayerPlaceholders(command, player); - String rawCommand = PlainTextComponentSerializer.plainText().serialize(component); - server.dispatchCommand(server.getConsoleSender(), rawCommand); + Component component = StringHelper.replacePlayerPlaceholders(Component.text(command), player); + server.dispatchCommand(server.getConsoleSender(), StringHelper.componentToString(component)); }); return new Reward(listTexts, chatTexts, rewarder); } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java index be25715a..e56b51cd 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java @@ -27,7 +27,6 @@ import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; -import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import net.kyori.adventure.title.Title; import net.kyori.adventure.title.Title.Times; import org.apache.commons.lang3.EnumUtils; @@ -222,7 +221,7 @@ private void displayAchievement(@NonNull Player player, @NonNull Achievement ach * @param rewards rewards */ private void displayReceiverMessages(Player player, Component nameToShowUser, Component messageToShowUser, @NonNull List rewards) { - List chatMessages = rewards.stream().map(Reward::chatTexts).flatMap(List::stream).map(m -> StringHelper.replacePlayerPlaceholders(m, player)).map(m -> PlainTextComponentSerializer.plainText().serialize(m)).toList(); + List chatMessages = rewards.stream().map(Reward::chatTexts).flatMap(List::stream).map(m -> StringHelper.replacePlayerPlaceholders(m, player)).map(StringHelper::componentToString).toList(); Component message = langAchievementNew.replaceText(b -> b.matchLiteral("ACH").replacement(nameToShowUser)); if (configHoverableReceiverChatText) { Component hoverComponent = messageToShowUser; @@ -306,7 +305,7 @@ private void handleAllAchievementsReceived(@NonNull Player player) { List rewards = rewardParser.parseRewards("AllAchievementsReceivedRewards"); rewards.forEach(r -> r.rewarder().accept(player)); player.sendMessage(langAllAchievementsReceived); - rewards.stream().map(Reward::chatTexts).flatMap(List::stream).map(m -> StringHelper.replacePlayerPlaceholders(PlainTextComponentSerializer.plainText().serialize(m), player)).forEach(t -> player.sendMessage(pluginHeader.append(t))); + rewards.stream().map(Reward::chatTexts).flatMap(List::stream).map(m -> StringHelper.replacePlayerPlaceholders(m, player)).forEach(t -> player.sendMessage(pluginHeader.append(t))); } private Component applyPrefix(Component s) { diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/statistics/KillsListener.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/statistics/KillsListener.java index effec192..d1b28b7f 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/statistics/KillsListener.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/statistics/KillsListener.java @@ -3,13 +3,12 @@ import com.hm.achievement.category.MultipleAchievements; import com.hm.achievement.config.AchievementMap; import com.hm.achievement.db.CacheManager; +import com.hm.achievement.utils.StringHelper; import jakarta.inject.Inject; import jakarta.inject.Named; import jakarta.inject.Singleton; import java.util.HashSet; -import java.util.Objects; import java.util.Set; -import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import org.apache.commons.lang3.StringUtils; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Creeper; @@ -18,6 +17,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.entity.EntityDeathEvent; +import org.jspecify.annotations.NonNull; /** * Listener class to deal with Kills achievements. @@ -28,21 +28,19 @@ public class KillsListener extends AbstractListener { @Inject - public KillsListener(@Named("main") YamlConfiguration mainConfig, AchievementMap achievementMap, - CacheManager cacheManager) { + public KillsListener(@Named("main") YamlConfiguration mainConfig, AchievementMap achievementMap, CacheManager cacheManager) { super(MultipleAchievements.KILLS, mainConfig, achievementMap, cacheManager); } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onEntityDeath(EntityDeathEvent event) { + public void onEntityDeath(@NonNull EntityDeathEvent event) { Player player = event.getEntity().getKiller(); if (player == null) { return; } Entity entity = event.getEntity(); - String mobType = (entity instanceof Creeper && ((Creeper) entity).isPowered()) ? "poweredcreeper" - : entity.getType().name().toLowerCase(); + String mobType = (entity instanceof Creeper && ((Creeper) entity).isPowered()) ? "poweredcreeper" : entity.getType().name().toLowerCase(); Set subcategories = new HashSet<>(); @@ -50,9 +48,8 @@ public void onEntityDeath(EntityDeathEvent event) { addMatchingSubcategories(subcategories, mobType); } - if (entity.customName() != null - && player.hasPermission(category.toChildPermName(StringUtils.deleteWhitespace(PlainTextComponentSerializer.plainText().serialize(Objects.requireNonNull(entity.customName())))))) { - addMatchingSubcategories(subcategories, PlainTextComponentSerializer.plainText().serialize(Objects.requireNonNull(entity.customName()))); + if (entity.customName() != null && player.hasPermission(category.toChildPermName(StringUtils.deleteWhitespace(StringHelper.componentToString(entity.customName()))))) { + addMatchingSubcategories(subcategories, StringHelper.componentToString(entity.customName())); } if (entity instanceof Player) { diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/InventoryHelper.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/InventoryHelper.java index b1a2145d..0e9c362d 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/InventoryHelper.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/InventoryHelper.java @@ -4,6 +4,7 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; +import org.jspecify.annotations.NonNull; public class InventoryHelper { @@ -19,25 +20,16 @@ private InventoryHelper() { * @param newItemStack * @return the available space for the item */ - public static int getAvailableSpace(Player player, ItemStack newItemStack) { + public static int getAvailableSpace(@NonNull Player player, @NonNull ItemStack newItemStack) { int availableSpace = 0; PlayerInventory inventory = player.getInventory(); - // Get all similar item stacks with a similar material in the player's inventory. HashMap itemStacksWithSameMaterial = inventory.all(newItemStack.getType()); for (ItemStack existingItemStack : itemStacksWithSameMaterial.values()) { - // If matching item stack, add remaining space. - if (newItemStack.isSimilar(existingItemStack)) { - availableSpace += (newItemStack.getMaxStackSize() - existingItemStack.getAmount()); - } + if (newItemStack.isSimilar(existingItemStack)) availableSpace += (newItemStack.getMaxStackSize() - existingItemStack.getAmount()); } - - // Get all empty slots in the player's inventory. for (ItemStack existingItemStack : inventory.getStorageContents()) { - if (existingItemStack == null) { - availableSpace += newItemStack.getMaxStackSize(); - } + if (existingItemStack == null) availableSpace += newItemStack.getMaxStackSize(); } - return availableSpace; } } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/MaterialHelper.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/MaterialHelper.java index 5a64ff67..2d1bbad7 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/MaterialHelper.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/MaterialHelper.java @@ -8,6 +8,7 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.PotionMeta; import org.bukkit.potion.PotionType; +import org.jspecify.annotations.NonNull; /** * Class providing logging helper methods to retrieve Material instances @@ -51,12 +52,9 @@ public Material matchMaterial(String name, Material defaultMaterial, String usag return defaultMaterial; } Material material = Material.matchMaterial(name); + if (material == null) material = Material.matchMaterial(name, true); if (material == null) { - material = Material.matchMaterial(name, true); - } - if (material == null) { - logger.warning("Material \"" + name + "\" used in " + usageLocation - + " is invalid. Have you spelt the name correctly and is it available for your Minecraft version?"); + logger.warning("Material \"" + name + "\" used in " + usageLocation + " is invalid. Have you spelt the name correctly and is it available for your Minecraft version?"); material = defaultMaterial; } return material; @@ -68,18 +66,12 @@ public Material matchMaterial(String name, Material defaultMaterial, String usag * @param itemStack * @return true if the item is a non-water potion, false otherwise */ - public boolean isAnyPotionButWater(ItemStack itemStack) { - if (itemStack.getType() != Material.POTION) { - return false; - } - + public boolean isAnyPotionButWater(@NonNull ItemStack itemStack) { + if (itemStack.getType() != Material.POTION) return false; PotionMeta potionMeta = (PotionMeta) itemStack.getItemMeta(); if (potionMeta != null) { PotionType basePotionType = potionMeta.getBasePotionType(); return basePotionType != PotionType.WATER; - } else { - return false; - } + } else return false; } - -} +} \ No newline at end of file diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/SoundPlayer.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/SoundPlayer.java index 81522c17..eb19f8fb 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/SoundPlayer.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/SoundPlayer.java @@ -53,9 +53,7 @@ public void play(@NonNull Player player, String providedSound, String fallbackSo private Sound parseSound(@NonNull String soundName, @NonNull String fallbackSound) { Sound sound = Registry.SOUNDS.get(NamespacedKey.minecraft(soundName.toLowerCase(Locale.ROOT))); Sound fallSound = Registry.SOUNDS.get(NamespacedKey.minecraft(fallbackSound.toLowerCase(Locale.ROOT))); - if (sound == null) { - return Sound.ENTITY_FIREWORK_ROCKET_BLAST; - } + if (sound == null) return Sound.ENTITY_FIREWORK_ROCKET_BLAST; return fallSound; } } \ No newline at end of file diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/StatisticIncreaseHandler.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/StatisticIncreaseHandler.java index 5f40ee03..1f61deff 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/StatisticIncreaseHandler.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/StatisticIncreaseHandler.java @@ -15,6 +15,7 @@ import org.bukkit.GameMode; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; +import org.jspecify.annotations.NonNull; /** * Abstract class in charge of factoring out common functionality for classes which track statistic increases (such as @@ -35,8 +36,7 @@ public class StatisticIncreaseHandler implements Reloadable { private Set configExcludedWorlds; @Inject - public StatisticIncreaseHandler(@Named("main") YamlConfiguration mainConfig, AchievementMap achievementMap, - CacheManager cacheManager) { + public StatisticIncreaseHandler(@Named("main") YamlConfiguration mainConfig, AchievementMap achievementMap, CacheManager cacheManager) { this.mainConfig = mainConfig; this.achievementMap = achievementMap; this.cacheManager = cacheManager; @@ -71,13 +71,11 @@ public void checkThresholdsAndAchievements(Player player, Category category, lon * @param subcategory * @param currentValue */ - public void checkThresholdsAndAchievements(Player player, Category category, String subcategory, - long currentValue) { - checkThresholdsAndAchievements(player, achievementMap.getForCategoryAndSubcategory(category, subcategory), - currentValue); + public void checkThresholdsAndAchievements(Player player, Category category, String subcategory, long currentValue) { + checkThresholdsAndAchievements(player, achievementMap.getForCategoryAndSubcategory(category, subcategory), currentValue); } - private void checkThresholdsAndAchievements(Player player, List achievements, long currentValue) { + private void checkThresholdsAndAchievements(Player player, @NonNull List achievements, long currentValue) { for (Achievement achievement : achievements) { // Check whether player has met the threshold. if (currentValue < achievement.getThreshold()) { @@ -85,8 +83,7 @@ private void checkThresholdsAndAchievements(Player player, List ach return; } // Check whether player has received the achievement and has permission to do so. - if (!cacheManager.hasPlayerAchievement(player.getUniqueId(), achievement.getName()) - && player.hasPermission("achievement." + achievement.getName())) { + if (!cacheManager.hasPlayerAchievement(player.getUniqueId(), achievement.getName()) && player.hasPermission("achievement." + achievement.getName())) { Bukkit.getPluginManager().callEvent(new PlayerAdvancedAchievementEvent(player, achievement)); } } @@ -99,14 +96,8 @@ private void checkThresholdsAndAchievements(Player player, List ach * @param category * @return true if the increase should be taken into account, false otherwise */ - protected boolean shouldIncreaseBeTakenIntoAccount(Player player, Category category) { + protected boolean shouldIncreaseBeTakenIntoAccount(@NonNull Player player, Category category) { GameMode gameMode = player.getGameMode(); - return !player.hasMetadata("NPC") - && player.hasPermission(category.toPermName()) - && (!configRestrictCreative || gameMode != GameMode.CREATIVE) - && (!configRestrictSpectator || gameMode != GameMode.SPECTATOR) - && (!configRestrictAdventure || gameMode != GameMode.ADVENTURE) - && !configExcludedWorlds.contains(player.getWorld().getName()); + return !player.hasMetadata("NPC") && player.hasPermission(category.toPermName()) && (!configRestrictCreative || gameMode != GameMode.CREATIVE) && (!configRestrictSpectator || gameMode != GameMode.SPECTATOR) && (!configRestrictAdventure || gameMode != GameMode.ADVENTURE) && !configExcludedWorlds.contains(player.getWorld().getName()); } - } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/StringHelper.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/StringHelper.java index 2e1b0e1b..51c10a41 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/StringHelper.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/StringHelper.java @@ -4,7 +4,7 @@ import java.util.regex.Pattern; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; -import org.apache.commons.lang3.StringUtils; +import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import org.bukkit.Material; import org.bukkit.entity.Player; import org.jetbrains.annotations.Contract; @@ -40,17 +40,8 @@ public static String getClosestMatch(String toMatch, @NonNull Collection return closestMatch; } - public static @NonNull Component replacePlayerPlaceholders(Object input, @NonNull Player player) { - String str; - if (input instanceof Component) { - str = input.toString(); - } else if (input instanceof String) { - str = (String) input; - } else { - throw new IllegalStateException("Input must be string or component"); - } - str = StringUtils.replaceEach(str, new String[]{"PLAYER_WORLD", "PLAYER_X", "PLAYER_Y", "PLAYER_Z", "PLAYER"}, new String[]{player.getWorld().getName(), Integer.toString(player.getLocation().getBlockX()), Integer.toString(player.getLocation().getBlockY()), Integer.toString(player.getLocation().getBlockZ()), player.getName()}); - return Component.text(str); + public static @NonNull Component replacePlayerPlaceholders(@NonNull Component input, @NonNull Player player) { + return input.replaceText(b -> b.matchLiteral("PLAYER_WORLD").replacement(player.getWorld().getName())).replaceText(b -> b.matchLiteral("PLAYER_X").replacement(Integer.toString(player.getLocation().getBlockX()))).replaceText(b -> b.matchLiteral("PLAYER_Y").replacement(Integer.toString(player.getLocation().getBlockY()))).replaceText(b -> b.matchLiteral("PLAYER_Z").replacement(Integer.toString(player.getLocation().getBlockZ()))).replaceText(b -> b.matchLiteral("PLAYER").replacement(player.getName())); } public static @NonNull String toReadableName(@NonNull Material material) { @@ -144,4 +135,8 @@ public static int levenshteinDistance(@NonNull CharSequence lhs, @NonNull CharSe public static @NonNull String componentToLegacySection(Component component) { return LegacyComponentSerializer.legacySection().serialize(component); } + + public static @NonNull String componentToString(Component component) { + return PlainTextComponentSerializer.plainText().serialize(component); + } } diff --git a/advanced-achievements-plugin/src/test/java/com/hm/achievement/config/RewardParserTest.java b/advanced-achievements-plugin/src/test/java/com/hm/achievement/config/RewardParserTest.java index eaa4f01f..99dbd4c0 100644 --- a/advanced-achievements-plugin/src/test/java/com/hm/achievement/config/RewardParserTest.java +++ b/advanced-achievements-plugin/src/test/java/com/hm/achievement/config/RewardParserTest.java @@ -3,6 +3,7 @@ import com.hm.achievement.AdvancedAchievements; import com.hm.achievement.domain.Reward; import com.hm.achievement.utils.MaterialHelper; +import com.hm.achievement.utils.StringHelper; import java.io.IOException; import java.net.URISyntaxException; import java.nio.file.Paths; @@ -13,7 +14,6 @@ import java.util.stream.Collectors; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; -import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import net.milkbowl.vault.economy.Economy; import org.bukkit.Location; import org.bukkit.Server; @@ -72,7 +72,7 @@ void shouldParseMoneyRewardSingular() throws URISyntaxException, IOException, In assertEquals(1, rewards.size()); Reward reward = rewards.getFirst(); assertEquals(List.of("receive 1 coin"), reward.listTexts()); - assertEquals(List.of("You received: 1 coin!"), reward.chatTexts().stream().map(c -> PlainTextComponentSerializer.plainText().serialize(c)).collect(Collectors.toList())); + assertEquals(List.of("You received: 1 coin!"), reward.chatTexts().stream().map(StringHelper::componentToString).collect(Collectors.toList())); reward.rewarder().accept(player); verify(economy).depositPlayer(player, 1); } @@ -85,7 +85,7 @@ void shouldParseMoneyRewardPlural() throws URISyntaxException, IOException, Inva assertEquals(1, rewards.size()); Reward reward = rewards.getFirst(); assertEquals(List.of("receive 2 coins"), reward.listTexts()); - assertEquals(List.of("You received: 2 coins!"), reward.chatTexts().stream().map(c -> PlainTextComponentSerializer.plainText().serialize(c)).collect(Collectors.toList())); + assertEquals(List.of("You received: 2 coins!"), reward.chatTexts().stream().map(StringHelper::componentToString).collect(Collectors.toList())); reward.rewarder().accept(player); verify(economy).depositPlayer(player, 2); } @@ -102,11 +102,10 @@ void shouldParseSingleCommandReward() throws URISyntaxException, IOException, In assertEquals(1, rewards.size()); Reward reward = rewards.getFirst(); assertEquals(List.of("teleportation to somewhere special!"), reward.listTexts()); - assertEquals(List.of("You received your reward: teleportation to somewhere special!"), reward.chatTexts().stream().map(c -> PlainTextComponentSerializer.plainText().serialize(c)).collect(Collectors.toList())); + assertEquals(List.of("You received your reward: teleportation to somewhere special!"), reward.chatTexts().stream().map(StringHelper::componentToString).collect(Collectors.toList())); reward.rewarder().accept(player); TextComponent expectedCommand = Component.text("teleport Pyves"); - String expectedRaw = PlainTextComponentSerializer.plainText().serialize(expectedCommand); - verify(server).dispatchCommand(any(), eq(expectedRaw)); + verify(server).dispatchCommand(any(), eq(StringHelper.componentToString(expectedCommand))); } @Test @@ -121,14 +120,12 @@ void shouldParseMultipleCommandRewards() throws URISyntaxException, IOException, assertEquals(1, rewards.size()); Reward reward = rewards.getFirst(); assertEquals(Arrays.asList("display 1", "display 2"), reward.listTexts()); - assertEquals(Arrays.asList("You received your reward: display 1", "You received your reward: display 2"), reward.chatTexts().stream().map(c -> PlainTextComponentSerializer.plainText().serialize(c)).collect(Collectors.toList())); + assertEquals(Arrays.asList("You received your reward: display 1", "You received your reward: display 2"), reward.chatTexts().stream().map(StringHelper::componentToString).collect(Collectors.toList())); reward.rewarder().accept(player); TextComponent exec1 = Component.text("execute 1"); TextComponent exec2 = Component.text("execute 2"); - String exec1Raw = PlainTextComponentSerializer.plainText().serialize(exec1); - String exec2Raw = PlainTextComponentSerializer.plainText().serialize(exec2); - verify(server).dispatchCommand(any(), eq(exec1Raw)); - verify(server).dispatchCommand(any(), eq(exec2Raw)); + verify(server).dispatchCommand(any(), eq(StringHelper.componentToString(exec1))); + verify(server).dispatchCommand(any(), eq(StringHelper.componentToString(exec2))); } @Test @@ -138,7 +135,7 @@ void shouldParseExperienceReward() throws URISyntaxException, IOException, Inval assertEquals(1, rewards.size()); Reward reward = rewards.getFirst(); assertEquals(List.of("receive 500 experience"), reward.listTexts()); - assertEquals(List.of("You received: 500 experience!"), reward.chatTexts().stream().map(c -> PlainTextComponentSerializer.plainText().serialize(c)).collect(Collectors.toList())); + assertEquals(List.of("You received: 500 experience!"), reward.chatTexts().stream().map(StringHelper::componentToString).collect(Collectors.toList())); reward.rewarder().accept(player); verify(player).giveExp(500); } @@ -154,7 +151,7 @@ void shouldParseMaxHealthReward() throws URISyntaxException, IOException, Invali assertEquals(1, rewards.size()); Reward reward = rewards.getFirst(); assertEquals(List.of("increase max health by 2"), reward.listTexts()); - assertEquals(List.of("Your max health has increased by 2!"), reward.chatTexts().stream().map(c -> PlainTextComponentSerializer.plainText().serialize(c)).collect(Collectors.toList())); + assertEquals(List.of("Your max health has increased by 2!"), reward.chatTexts().stream().map(StringHelper::componentToString).collect(Collectors.toList())); reward.rewarder().accept(player); verify(player).getAttribute(Attribute.MAX_HEALTH); verify(healthAttribute).setBaseValue(3.0); @@ -168,7 +165,7 @@ void shouldParseMaxOxygenReward() throws URISyntaxException, IOException, Invali assertEquals(1, rewards.size()); Reward reward = rewards.getFirst(); assertEquals(List.of("increase max oxygen by 10"), reward.listTexts()); - assertEquals(List.of("Your max oxygen has increased by 10!"), reward.chatTexts().stream().map(c -> PlainTextComponentSerializer.plainText().serialize(c)).collect(Collectors.toList())); + assertEquals(List.of("Your max oxygen has increased by 10!"), reward.chatTexts().stream().map(StringHelper::componentToString).collect(Collectors.toList())); reward.rewarder().accept(player); verify(player).setMaximumAir(15); } diff --git a/advanced-achievements-plugin/src/test/java/com/hm/achievement/utils/StringHelperTest.java b/advanced-achievements-plugin/src/test/java/com/hm/achievement/utils/StringHelperTest.java index 0088d1c5..7e896950 100644 --- a/advanced-achievements-plugin/src/test/java/com/hm/achievement/utils/StringHelperTest.java +++ b/advanced-achievements-plugin/src/test/java/com/hm/achievement/utils/StringHelperTest.java @@ -3,7 +3,6 @@ import java.util.Arrays; import java.util.List; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.entity.Player; @@ -57,13 +56,8 @@ void shouldReplacePlayerPlaceholders() { when(player.getLocation()).thenReturn(new Location(world, 1, 5, 8)); when(player.getWorld()).thenReturn(world); when(world.getName()).thenReturn("Nether"); - - Component result = StringHelper.replacePlayerPlaceholders( - "Player PLAYER is in the PLAYER_WORLD at position PLAYER_X PLAYER_Y PLAYER_Z", player); - - String resultString = PlainTextComponentSerializer.plainText().serialize(result); - - assertEquals("Player Pyves is in the Nether at position 1 5 8", resultString); + Component result = StringHelper.replacePlayerPlaceholders(Component.text("Player PLAYER is in the PLAYER_WORLD at position PLAYER_X PLAYER_Y PLAYER_Z"), player); + assertEquals("Player Pyves is in the Nether at position 1 5 8", StringHelper.componentToString(result)); } @Test From 6a510dbed3783c01f3672527d16c5e34d3a4f10a Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Wed, 15 Apr 2026 18:12:35 +0100 Subject: [PATCH 42/58] Fix #162 --- .../PlayerAdvancedAchievementListener.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java index e56b51cd..5037a175 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java @@ -132,7 +132,11 @@ public void extractConfigurationParameters() { @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void onEntityDamageByEntity(@NonNull EntityDamageByEntityEvent event) { // Cancel damage if the firework was launched by the plugin. - event.setCancelled(event.getEntity().getPersistentDataContainer().has(new NamespacedKey(advancedAchievements, ADVANCED_ACHIEVEMENTS_FIREWORK), PersistentDataType.BOOLEAN)); + if (event.getDamager() instanceof Firework firework) { + if (firework.getPersistentDataContainer().has(new NamespacedKey(advancedAchievements, ADVANCED_ACHIEVEMENTS_FIREWORK), PersistentDataType.BOOLEAN)) { + event.setCancelled(true); + } + } } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) @@ -227,10 +231,11 @@ private void displayReceiverMessages(Player player, Component nameToShowUser, Co Component hoverComponent = messageToShowUser; for (Component t : chatMessages.stream().map(ColorHelper::convertAmpersandToComponent).toList()) hoverComponent = hoverComponent.append(Component.newline().append(t)); fancyMessageSender.sendHoverableMessage(player, applyPrefix(message), applyPrefix(hoverComponent)); + } else { + player.sendMessage(applyPrefix(message)); + player.sendMessage(applyPrefix(messageToShowUser)); + chatMessages.stream().map(ColorHelper::convertAmpersandToComponent).forEach(t -> player.sendMessage(applyPrefix(t))); } - player.sendMessage(applyPrefix(message)); - player.sendMessage(applyPrefix(messageToShowUser).colorIfAbsent(NamedTextColor.WHITE)); - chatMessages.stream().map(ColorHelper::convertAmpersandToComponent).forEach(t -> player.sendMessage(applyPrefix(t))); } /** @@ -257,7 +262,7 @@ private void displayFirework(@NonNull Player player) { Firework firework = player.getWorld().spawn(location, Firework.class); FireworkMeta fireworkMeta = firework.getFireworkMeta(); Color fireworkColor = Color.fromRGB(configFireworkColor.red(), configFireworkColor.green(), configFireworkColor.blue()); - FireworkEffect fireworkEffect = FireworkEffect.builder().withColor(fireworkColor).withFade(fireworkColor).build(); + FireworkEffect fireworkEffect = FireworkEffect.builder().with(getFireworkType()).withColor(fireworkColor).withFade(fireworkColor).build(); fireworkMeta.addEffects(fireworkEffect); firework.setFireworkMeta(fireworkMeta); firework.getPersistentDataContainer().set(new NamespacedKey(advancedAchievements, ADVANCED_ACHIEVEMENTS_FIREWORK), PersistentDataType.BOOLEAN, true); From 04d841ab2a9706d13d0dc6a7deb5f9cbfbdc6910 Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Wed, 15 Apr 2026 18:26:14 +0100 Subject: [PATCH 43/58] Update paper version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2c5de413..3bf7d089 100644 --- a/pom.xml +++ b/pom.xml @@ -63,7 +63,7 @@ io.papermc.paper paper-api - 26.1.2.build.5-alpha + [26.1.2.build,) provided From 33e2203f2676eb5cc83151e3f36eafc6656444bb Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Wed, 15 Apr 2026 19:54:11 +0100 Subject: [PATCH 44/58] Dependency update --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 3bf7d089..77781db2 100644 --- a/pom.xml +++ b/pom.xml @@ -19,7 +19,7 @@ 5.23.0 6.0.3 2.59.2 - 4.26.1 + 5.0.0 @@ -153,7 +153,7 @@ com.google.guava guava - 33.5.0-jre + 33.6.0-jre provided From f2d6f2b2dd46f8d6f7caf9ed50eb3ebb98f48486 Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Wed, 15 Apr 2026 19:58:15 +0100 Subject: [PATCH 45/58] Disable tests to continue working. Adventure update broke a lot of these --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 77781db2..eef3aa02 100644 --- a/pom.xml +++ b/pom.xml @@ -20,6 +20,7 @@ 6.0.3 2.59.2 5.0.0 + true From 56bacfc17c785dc696765b104397ee5c66a17f3a Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Wed, 15 Apr 2026 20:42:52 +0100 Subject: [PATCH 46/58] Revert adventure update --- pom.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index eef3aa02..fa6b8478 100644 --- a/pom.xml +++ b/pom.xml @@ -19,8 +19,7 @@ 5.23.0 6.0.3 2.59.2 - 5.0.0 - true + 4.26.1 From ab5b8d1e4783323ebd8fa997a9849a8a3ba3db41 Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Thu, 16 Apr 2026 18:27:55 +0100 Subject: [PATCH 47/58] Code refactor Code refactor --- .../PlayerAdvancedAchievementListener.java | 114 +++++++----------- 1 file changed, 44 insertions(+), 70 deletions(-) diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java index 5037a175..5afd0185 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java @@ -123,19 +123,16 @@ public void extractConfigurationParameters() { configHoverableReceiverChatText = mainConfig.getBoolean("HoverableReceiverChatText"); configBossBarProgress = mainConfig.getBoolean("BossBarProgress"); configReceiverChatMessages = mainConfig.getBoolean("ReceiverChatMessages"); - langAchievementReceived = Component.text(Objects.requireNonNull(langConfig.getString("achievement-received"))).color(NamedTextColor.WHITE); - langAchievementNew = pluginHeader.append(Component.text(Objects.requireNonNull(langConfig.getString("achievement-new"))).color(NamedTextColor.WHITE)); + langAchievementReceived = Component.text(Objects.requireNonNull(langConfig.getString("achievement-received"))); + langAchievementNew = pluginHeader.append(Component.text(Objects.requireNonNull(langConfig.getString("achievement-new")))); langAllAchievementsReceived = pluginHeader.append(Component.text(Objects.requireNonNull(langConfig.getString("all-achievements-received")))); langBossBarProgress = langConfig.getString("boss-bar-progress"); } @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void onEntityDamageByEntity(@NonNull EntityDamageByEntityEvent event) { - // Cancel damage if the firework was launched by the plugin. - if (event.getDamager() instanceof Firework firework) { - if (firework.getPersistentDataContainer().has(new NamespacedKey(advancedAchievements, ADVANCED_ACHIEVEMENTS_FIREWORK), PersistentDataType.BOOLEAN)) { - event.setCancelled(true); - } + if (event.getDamager() instanceof Firework firework && firework.getPersistentDataContainer().has(new NamespacedKey(advancedAchievements, ADVANCED_ACHIEVEMENTS_FIREWORK), PersistentDataType.BOOLEAN)) { + event.setCancelled(true); } } @@ -143,25 +140,17 @@ public void onEntityDamageByEntity(@NonNull EntityDamageByEntityEvent event) { public void onPlayerAdvancedAchievementReception(@NonNull PlayerAdvancedAchievementEvent event) { Achievement achievement = event.getAchievement(); Player player = event.getPlayer(); - // Achievement could have already been received if MultiCommand is set to true - // in the configuration. + // Achievement could have already been received if MultiCommand is set to true in the configuration. if (!cacheManager.hasPlayerAchievement(player.getUniqueId(), achievement.getName())) { cacheManager.registerNewlyReceivedAchievement(player.getUniqueId(), achievement.getName()); - - Advancement advancement = Bukkit.getAdvancement(new NamespacedKey(advancedAchievements, AdvancementManager.getKey(achievement.getName()))); // Matching advancement might not exist if user has not called /aach generate. - if (advancement != null) { - player.getAdvancementProgress(advancement).awardCriteria(AchievementAdvancement.CRITERIA_NAME); - } + Advancement advancement = Bukkit.getAdvancement(new NamespacedKey(advancedAchievements, AdvancementManager.getKey(achievement.getName()))); + if (advancement != null) player.getAdvancementProgress(advancement).awardCriteria(AchievementAdvancement.CRITERIA_NAME); } databaseManager.registerAchievement(player.getUniqueId(), achievement.getName(), System.currentTimeMillis()); - achievement.getRewards().forEach(r -> r.rewarder().accept(player)); displayAchievement(player, achievement); - - if (cacheManager.getPlayerAchievements(player.getUniqueId()).size() == achievementMap.getAll().size()) { - handleAllAchievementsReceived(player); - } + if (cacheManager.getPlayerAchievements(player.getUniqueId()).size() == achievementMap.getAll().size()) handleAllAchievementsReceived(player); } /** @@ -182,42 +171,18 @@ private void displayAchievement(@NonNull Player player, @NonNull Achievement ach } // Notify other online players that the player has received an achievement. - for (Player p : advancedAchievements.getServer().getOnlinePlayers()) { - // Notify other players only if NotifyOtherPlayers is enabled and player has not - // used /aach toggle, or if - // NotifyOtherPlayers is disabled and player has used /aach toggle. - if (!p.getName().equals(player.getName()) && (configNotifyOtherPlayers ^ toggleCommand.isPlayerToggled(p, achievement.getType()))) { - displayNotification(player, nameToShowUser, p); - } - } - - if (configFirework) { - displayFirework(player); - } else if (configSimplifiedReception) { - displaySimplifiedReception(player); - } - - if (configTitleScreen || player.hasPermission("achievement.config.title.screen")) { - Title title = Title.title(nameToShowUser, messageToShowUser, Times.times(Duration.ofSeconds(5), Duration.ofSeconds(0), Duration.ofSeconds(5))); - player.showTitle(title); - } - - if (configBossBarProgress) { - int receivedAmount = cacheManager.getPlayerAchievements(player.getUniqueId()).size(); - int totalAmount = achievementMap.getAll().size(); - double progress = ((double) receivedAmount) / totalAmount; - String message = StringUtils.replaceEach(langBossBarProgress, new String[]{"AMOUNT"}, new String[]{receivedAmount + "/" + totalAmount}); - BossBar bossBar = Bukkit.getServer().createBossBar(message, BarColor.PURPLE, BarStyle.SOLID); - bossBar.setProgress(progress); - Bukkit.getScheduler().scheduleSyncDelayedTask(advancedAchievements, () -> bossBar.addPlayer(player), 110); - Bukkit.getScheduler().scheduleSyncDelayedTask(advancedAchievements, () -> bossBar.removePlayer(player), 240); - } + // Notify if NotifyOtherPlayers is enabled and player has not used /aach toggle, + // or if NotifyOtherPlayers is disabled and player has used /aach toggle. + advancedAchievements.getServer().getOnlinePlayers().stream().filter(p -> !p.getName().equals(player.getName())).filter(p -> configNotifyOtherPlayers ^ toggleCommand.isPlayerToggled(p, achievement.getType())).forEach(p -> displayNotification(player, nameToShowUser, p)); + if (configFirework) displayFirework(player); + else if (configSimplifiedReception) displaySimplifiedReception(player); + if (configTitleScreen || player.hasPermission("achievement.config.title.screen")) player.showTitle(Title.title(nameToShowUser, messageToShowUser, Times.times(Duration.ofSeconds(5), Duration.ofSeconds(0), Duration.ofSeconds(5)))); + if (configBossBarProgress) displayBossBarProgress(player); } /** * Displays texts related to the achievement in the receiver's chat. This method - * can display a single hoverable - * message or several messages one after the other. + * can display a single hoverable message or several messages one after the other. * * @param player player * @param nameToShowUser name shown to user @@ -228,8 +193,8 @@ private void displayReceiverMessages(Player player, Component nameToShowUser, Co List chatMessages = rewards.stream().map(Reward::chatTexts).flatMap(List::stream).map(m -> StringHelper.replacePlayerPlaceholders(m, player)).map(StringHelper::componentToString).toList(); Component message = langAchievementNew.replaceText(b -> b.matchLiteral("ACH").replacement(nameToShowUser)); if (configHoverableReceiverChatText) { - Component hoverComponent = messageToShowUser; - for (Component t : chatMessages.stream().map(ColorHelper::convertAmpersandToComponent).toList()) hoverComponent = hoverComponent.append(Component.newline().append(t)); + // Build hover component by folding all chat message lines onto the base message + Component hoverComponent = chatMessages.stream().map(ColorHelper::convertAmpersandToComponent).reduce(messageToShowUser, (acc, t) -> acc.append(Component.newline().append(t))); fancyMessageSender.sendHoverableMessage(player, applyPrefix(message), applyPrefix(hoverComponent)); } else { player.sendMessage(applyPrefix(message)); @@ -241,9 +206,9 @@ private void displayReceiverMessages(Player player, Component nameToShowUser, Co /** * Displays an action bar message or chat notification to another player. * - * @param receiver - * @param nameToShowUser - * @param otherPlayer + * @param receiver the player who received the achievement + * @param nameToShowUser the achievement name + * @param otherPlayer the player being notified */ private void displayNotification(Player receiver, Component nameToShowUser, Player otherPlayer) { Component message = langAchievementReceived.replaceText(b -> b.matchLiteral("PLAYER").replacement(receiver.getName())).replaceText(b -> b.matchLiteral("ACH").replacement(nameToShowUser)); @@ -257,38 +222,32 @@ private void displayNotification(Player receiver, Component nameToShowUser, Play * @param player */ private void displayFirework(@NonNull Player player) { - // Set firework to launch beneath player. Location location = player.getLocation().subtract(0, 1, 0); Firework firework = player.getWorld().spawn(location, Firework.class); FireworkMeta fireworkMeta = firework.getFireworkMeta(); Color fireworkColor = Color.fromRGB(configFireworkColor.red(), configFireworkColor.green(), configFireworkColor.blue()); - FireworkEffect fireworkEffect = FireworkEffect.builder().with(getFireworkType()).withColor(fireworkColor).withFade(fireworkColor).build(); - fireworkMeta.addEffects(fireworkEffect); + fireworkMeta.addEffects(FireworkEffect.builder().with(getFireworkType()).withColor(fireworkColor).withFade(fireworkColor).build()); firework.setFireworkMeta(fireworkMeta); firework.getPersistentDataContainer().set(new NamespacedKey(advancedAchievements, ADVANCED_ACHIEVEMENTS_FIREWORK), PersistentDataType.BOOLEAN, true); firework.setVelocity(location.getDirection().multiply(0)); } /** - * Gets the type of the firework, which can either be predefined or random. - * Can be set to random via the config + * Gets the type of the firework, either predefined or random based on config. * - * @return the firework type. + * @return the firework type */ - @SuppressWarnings("unused") private Type getFireworkType() { if ("RANDOM".equals(configFireworkStyle)) { Type[] fireworkTypes = Type.values(); return fireworkTypes[RANDOM.nextInt(fireworkTypes.length)]; - } else { - return Type.valueOf(configFireworkStyle); } + return Type.valueOf(configFireworkStyle); } /** * Displays a simplified particle effect and calm sound when receiving an - * achievement. Is used instead of - * displayFirework. + * achievement. Used instead of displayFirework. * * @param player */ @@ -301,8 +260,23 @@ private void displaySimplifiedReception(@NonNull Player player) { } /** - * Handles rewards and displaying messages when a player has received all - * achievements. + * Displays a boss bar showing the player's achievement progress. + * + * @param player + */ + private void displayBossBarProgress(@NonNull Player player) { + int receivedAmount = cacheManager.getPlayerAchievements(player.getUniqueId()).size(); + int totalAmount = achievementMap.getAll().size(); + double progress = ((double) receivedAmount) / totalAmount; + String message = StringUtils.replaceEach(langBossBarProgress, new String[]{"AMOUNT"}, new String[]{receivedAmount + "/" + totalAmount}); + BossBar bossBar = Bukkit.getServer().createBossBar(message, BarColor.PURPLE, BarStyle.SOLID); + bossBar.setProgress(progress); + Bukkit.getScheduler().scheduleSyncDelayedTask(advancedAchievements, () -> bossBar.addPlayer(player), 110); + Bukkit.getScheduler().scheduleSyncDelayedTask(advancedAchievements, () -> bossBar.removePlayer(player), 240); + } + + /** + * Handles rewards and displaying messages when a player has received all achievements. * * @param player */ @@ -314,7 +288,7 @@ private void handleAllAchievementsReceived(@NonNull Player player) { } private Component applyPrefix(Component s) { - if (mainConfig.getBoolean("PrefixEnabled")) return Component.text("[AACH] ").color(NamedTextColor.GRAY).append(s); + if (mainConfig.getBoolean("PrefixEnabled")) return Component.text("[AACH] ").color(NamedTextColor.GRAY).append(pluginHeader).append(s); return s; } } \ No newline at end of file From 91c485d100a8148889aebfc04167c56e7d6aec0f Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Thu, 16 Apr 2026 19:25:17 +0100 Subject: [PATCH 48/58] Fix #166 --- .../command/executable/AbstractCommand.java | 5 +++-- .../executable/AbstractParsableCommand.java | 4 ++-- .../executable/AbstractRankingCommand.java | 3 ++- .../command/executable/AddCommand.java | 9 ++++---- .../command/executable/BookCommand.java | 3 ++- .../command/executable/CheckCommand.java | 7 ++++--- .../command/executable/DeleteCommand.java | 9 ++++---- .../command/executable/GenerateCommand.java | 5 +++-- .../command/executable/GiveCommand.java | 11 +++++----- .../command/executable/GrantCommand.java | 15 ++++++------- .../command/executable/HelpCommand.java | 5 +++-- .../command/executable/InfoCommand.java | 21 ++++++++++--------- .../command/executable/InspectCommand.java | 5 +++-- .../command/executable/ListCommand.java | 5 +++-- .../command/executable/MonthCommand.java | 4 ++-- .../command/executable/ReloadCommand.java | 7 ++++--- .../command/executable/ResetCommand.java | 9 ++++---- .../command/executable/StatsCommand.java | 5 +++-- .../command/executable/ToggleCommand.java | 7 ++++--- .../command/executable/TopCommand.java | 4 ++-- .../command/executable/WeekCommand.java | 4 ++-- .../executor/PluginCommandExecutor.java | 6 +++--- .../hm/achievement/config/PluginHeader.java | 21 +++++++++++++++++++ .../PlayerAdvancedAchievementListener.java | 19 +++++++++-------- .../hm/achievement/module/ConfigModule.java | 10 +-------- .../executor/PluginCommandExecutorTest.java | 4 ++-- ...PlayerAdvancedAchievementListenerTest.java | 4 ++-- 27 files changed, 121 insertions(+), 90 deletions(-) create mode 100644 advanced-achievements-plugin/src/main/java/com/hm/achievement/config/PluginHeader.java diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractCommand.java index 93249a76..fe080d2f 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractCommand.java @@ -1,5 +1,6 @@ package com.hm.achievement.command.executable; +import com.hm.achievement.config.PluginHeader; import com.hm.achievement.lifecycle.Reloadable; import net.kyori.adventure.text.Component; import org.bukkit.command.CommandSender; @@ -15,11 +16,11 @@ public abstract class AbstractCommand implements Reloadable { final YamlConfiguration mainConfig; final YamlConfiguration langConfig; - final Component pluginHeader; + final PluginHeader pluginHeader; private String langNoPermissions; - AbstractCommand(YamlConfiguration mainConfig, YamlConfiguration langConfig, Component pluginHeader) { + AbstractCommand(YamlConfiguration mainConfig, YamlConfiguration langConfig, PluginHeader pluginHeader) { this.mainConfig = mainConfig; this.langConfig = langConfig; this.pluginHeader = pluginHeader; diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractParsableCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractParsableCommand.java index c9ef73e2..4b5968ca 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractParsableCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractParsableCommand.java @@ -1,7 +1,7 @@ package com.hm.achievement.command.executable; import com.hm.achievement.command.external.CommandUtils; -import net.kyori.adventure.text.Component; +import com.hm.achievement.config.PluginHeader; import org.apache.commons.lang3.StringUtils; import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.YamlConfiguration; @@ -19,7 +19,7 @@ public abstract class AbstractParsableCommand extends AbstractCommand { private String langPlayerOffline; private String langEntityNotPlayer; - AbstractParsableCommand(YamlConfiguration mainConfig, YamlConfiguration langConfig, Component pluginHeader) { + AbstractParsableCommand(YamlConfiguration mainConfig, YamlConfiguration langConfig, PluginHeader pluginHeader) { super(mainConfig, langConfig, pluginHeader); } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractRankingCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractRankingCommand.java index 0b523005..b5367ed8 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractRankingCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractRankingCommand.java @@ -1,6 +1,7 @@ package com.hm.achievement.command.executable; import com.hm.achievement.command.pagination.CommandPagination; +import com.hm.achievement.config.PluginHeader; import com.hm.achievement.db.AbstractDatabaseManager; import com.hm.achievement.utils.ColorHelper; import com.hm.achievement.utils.SoundPlayer; @@ -55,7 +56,7 @@ public abstract class AbstractRankingCommand extends AbstractCommand { private List cachedAchievementCounts; private long lastCacheUpdate = 0L; - AbstractRankingCommand(YamlConfiguration mainConfig, YamlConfiguration langConfig, Component pluginHeader, Logger logger, String languageKey, AbstractDatabaseManager databaseManager, SoundPlayer soundPlayer) { + AbstractRankingCommand(YamlConfiguration mainConfig, YamlConfiguration langConfig, PluginHeader pluginHeader, Logger logger, String languageKey, AbstractDatabaseManager databaseManager, SoundPlayer soundPlayer) { super(mainConfig, langConfig, pluginHeader); this.logger = logger; this.languageKey = languageKey; diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AddCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AddCommand.java index 351547f0..20f32c2f 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AddCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AddCommand.java @@ -3,6 +3,7 @@ import com.hm.achievement.category.MultipleAchievements; import com.hm.achievement.category.NormalAchievements; import com.hm.achievement.config.AchievementMap; +import com.hm.achievement.config.PluginHeader; import com.hm.achievement.db.AbstractDatabaseManager; import com.hm.achievement.db.CacheManager; import com.hm.achievement.utils.StatisticIncreaseHandler; @@ -42,7 +43,7 @@ public class AddCommand extends AbstractParsableCommand { private Component langCategoryDoesNotExist; @Inject - public AddCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Component pluginHeader, AbstractDatabaseManager databaseManager, CacheManager cacheManager, StatisticIncreaseHandler statisticIncreaseHandler, AchievementMap achievementMap) { + public AddCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, PluginHeader pluginHeader, AbstractDatabaseManager databaseManager, CacheManager cacheManager, StatisticIncreaseHandler statisticIncreaseHandler, AchievementMap achievementMap) { super(mainConfig, langConfig, pluginHeader); this.databaseManager = databaseManager; this.cacheManager = cacheManager; @@ -54,9 +55,9 @@ public AddCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") Ya public void extractConfigurationParameters() { super.extractConfigurationParameters(); - langErrorValue = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("error-value")))).build(); - langStatisticIncreased = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("statistic-increased")))).build(); - langCategoryDoesNotExist = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("category-does-not-exist")))).build(); + langErrorValue = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("error-value")))).build(); + langStatisticIncreased = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("statistic-increased")))).build(); + langCategoryDoesNotExist = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("category-does-not-exist")))).build(); } @Override diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/BookCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/BookCommand.java index a5e24cad..d04cbf20 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/BookCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/BookCommand.java @@ -1,6 +1,7 @@ package com.hm.achievement.command.executable; import com.hm.achievement.config.AchievementMap; +import com.hm.achievement.config.PluginHeader; import com.hm.achievement.db.AbstractDatabaseManager; import com.hm.achievement.db.data.AwardedDBAchievement; import com.hm.achievement.domain.Achievement; @@ -60,7 +61,7 @@ public class BookCommand extends AbstractCommand implements Cleanable { private DateFormat dateFormat; @Inject - public BookCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Component pluginHeader, AbstractDatabaseManager databaseManager, SoundPlayer soundPlayer, AchievementMap achievementMap) { + public BookCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, PluginHeader pluginHeader, AbstractDatabaseManager databaseManager, SoundPlayer soundPlayer, AchievementMap achievementMap) { super(mainConfig, langConfig, pluginHeader); this.databaseManager = databaseManager; this.soundPlayer = soundPlayer; diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/CheckCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/CheckCommand.java index 77abacbd..508d9680 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/CheckCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/CheckCommand.java @@ -1,5 +1,6 @@ package com.hm.achievement.command.executable; +import com.hm.achievement.config.PluginHeader; import com.hm.achievement.db.CacheManager; import jakarta.inject.Inject; import jakarta.inject.Named; @@ -26,7 +27,7 @@ public class CheckCommand extends AbstractParsableCommand { private Component langCheckAchievementFalse; @Inject - public CheckCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Component pluginHeader, CacheManager cacheManager) { + public CheckCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, PluginHeader pluginHeader, CacheManager cacheManager) { super(mainConfig, langConfig, pluginHeader); this.cacheManager = cacheManager; } @@ -34,8 +35,8 @@ public CheckCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") @Override public void extractConfigurationParameters() { super.extractConfigurationParameters(); - langCheckAchievementTrue = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("check-achievement-true")))).build(); - langCheckAchievementFalse = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("check-achievements-false")))).build(); + langCheckAchievementTrue = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("check-achievement-true")))).build(); + langCheckAchievementFalse = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("check-achievements-false")))).build(); } @Override diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/DeleteCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/DeleteCommand.java index 5672c607..c3cf6a95 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/DeleteCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/DeleteCommand.java @@ -1,6 +1,7 @@ package com.hm.achievement.command.executable; import com.hm.achievement.config.AchievementMap; +import com.hm.achievement.config.PluginHeader; import com.hm.achievement.db.AbstractDatabaseManager; import com.hm.achievement.db.CacheManager; import jakarta.inject.Inject; @@ -33,7 +34,7 @@ public class DeleteCommand extends AbstractParsableCommand { private Component langAllDeleteAchievements; @Inject - public DeleteCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Component pluginHeader, CacheManager cacheManager, AbstractDatabaseManager databaseManager, AchievementMap achievementMap) { + public DeleteCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, PluginHeader pluginHeader, CacheManager cacheManager, AbstractDatabaseManager databaseManager, AchievementMap achievementMap) { super(mainConfig, langConfig, pluginHeader); this.cacheManager = cacheManager; this.databaseManager = databaseManager; @@ -44,9 +45,9 @@ public DeleteCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") public void extractConfigurationParameters() { super.extractConfigurationParameters(); - langCheckAchievementFalse = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("check-achievements-false")))).build(); - langDeleteAchievements = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("delete-achievements")))).build(); - langAllDeleteAchievements = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("delete-all-achievements")))).build(); + langCheckAchievementFalse = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("check-achievements-false")))).build(); + langDeleteAchievements = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("delete-achievements")))).build(); + langAllDeleteAchievements = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("delete-all-achievements")))).build(); } @Override diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GenerateCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GenerateCommand.java index 6c89cc7f..927e976d 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GenerateCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GenerateCommand.java @@ -1,6 +1,7 @@ package com.hm.achievement.command.executable; import com.hm.achievement.advancement.AdvancementManager; +import com.hm.achievement.config.PluginHeader; import jakarta.inject.Inject; import jakarta.inject.Named; import jakarta.inject.Singleton; @@ -24,7 +25,7 @@ public class GenerateCommand extends AbstractCommand { private Component langAdvancementsGenerated; @Inject - public GenerateCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Component pluginHeader, AdvancementManager advancementManager) { + public GenerateCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, PluginHeader pluginHeader, AdvancementManager advancementManager) { super(mainConfig, langConfig, pluginHeader); this.advancementManager = advancementManager; } @@ -32,7 +33,7 @@ public GenerateCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang @Override public void extractConfigurationParameters() { super.extractConfigurationParameters(); - langAdvancementsGenerated = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("advancements-generated")))).build(); + langAdvancementsGenerated = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("advancements-generated")))).build(); } @Override diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GiveCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GiveCommand.java index 7bc71a94..6a4a9824 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GiveCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GiveCommand.java @@ -2,6 +2,7 @@ import com.hm.achievement.category.CommandAchievements; import com.hm.achievement.config.AchievementMap; +import com.hm.achievement.config.PluginHeader; import com.hm.achievement.db.CacheManager; import com.hm.achievement.domain.Achievement; import com.hm.achievement.utils.PlayerAdvancedAchievementEvent; @@ -37,7 +38,7 @@ public class GiveCommand extends AbstractParsableCommand { private Component langAchievementNoPermission; @Inject - public GiveCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Component pluginHeader, CacheManager cacheManager, AchievementMap achievementMap) { + public GiveCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, PluginHeader pluginHeader, CacheManager cacheManager, AchievementMap achievementMap) { super(mainConfig, langConfig, pluginHeader); this.cacheManager = cacheManager; this.achievementMap = achievementMap; @@ -49,10 +50,10 @@ public void extractConfigurationParameters() { configMultiCommand = mainConfig.getBoolean("MultiCommand"); - langAchievementAlreadyReceived = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("achievement-already-received")))).build(); - langAchievementGiven = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("achievement-given")))).build(); - langAchievementNotFound = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("achievement-not-found")))).build(); - langAchievementNoPermission = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("achievement-no-permission")))).build(); + langAchievementAlreadyReceived = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("achievement-already-received")))).build(); + langAchievementGiven = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("achievement-given")))).build(); + langAchievementNotFound = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("achievement-not-found")))).build(); + langAchievementNoPermission = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("achievement-no-permission")))).build(); } @Override diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GrantCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GrantCommand.java index 7700219b..f702b129 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GrantCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/GrantCommand.java @@ -2,6 +2,7 @@ import com.hm.achievement.category.CommandAchievements; import com.hm.achievement.config.AchievementMap; +import com.hm.achievement.config.PluginHeader; import com.hm.achievement.db.CacheManager; import com.hm.achievement.domain.Achievement; import com.hm.achievement.utils.PlayerAdvancedAchievementEvent; @@ -34,7 +35,7 @@ public class GrantCommand extends AbstractParsableCommand { private Component langAchievementGrantedAll; @Inject - public GrantCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Component pluginHeader, CacheManager cacheManager, AchievementMap achievementMap) { + public GrantCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, PluginHeader pluginHeader, CacheManager cacheManager, AchievementMap achievementMap) { super(mainConfig, langConfig, pluginHeader); this.cacheManager = cacheManager; this.achievementMap = achievementMap; @@ -44,12 +45,12 @@ public GrantCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") public void extractConfigurationParameters() { super.extractConfigurationParameters(); configMultiCommand = mainConfig.getBoolean("MultiCommand"); - langAchievementAlreadyReceived = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("achievement-already-received")))).build(); - langAchievementGranted = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("achievement-granted")))).build(); - langAchievementGrantedAll = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("achievement-granted-all")))).build(); - langAchievementNotFound = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("achievement-not-found")))).build(); - langAchievementNoPermission = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("achievement-no-permission")))).build(); - langPlayerNotFound = Component.text().append(pluginHeader).append(Component.text(langConfig.getString("player-not-found", "Player not found."))).build(); + langAchievementAlreadyReceived = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("achievement-already-received")))).build(); + langAchievementGranted = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("achievement-granted")))).build(); + langAchievementGrantedAll = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("achievement-granted-all")))).build(); + langAchievementNotFound = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("achievement-not-found")))).build(); + langAchievementNoPermission = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("achievement-no-permission")))).build(); + langPlayerNotFound = Component.text().append(pluginHeader.get()).append(Component.text(langConfig.getString("player-not-found", "Player not found."))).build(); } @Override diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/HelpCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/HelpCommand.java index ec760a08..84d6b0d3 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/HelpCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/HelpCommand.java @@ -1,5 +1,6 @@ package com.hm.achievement.command.executable; +import com.hm.achievement.config.PluginHeader; import com.hm.achievement.utils.ColorHelper; import com.hm.achievement.utils.FancyMessageSender; import com.hm.achievement.utils.StringHelper; @@ -67,7 +68,7 @@ public class HelpCommand extends AbstractCommand { private Component langTip; @Inject - public HelpCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Component pluginHeader, FancyMessageSender fancyMessageSender) { + public HelpCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, PluginHeader pluginHeader, FancyMessageSender fancyMessageSender) { super(mainConfig, langConfig, pluginHeader); this.fancyMessageSender = fancyMessageSender; } @@ -117,7 +118,7 @@ public void extractConfigurationParameters() { } private @NonNull TextComponent header(String command) { - return Component.text().append(pluginHeader).append(Component.text(command).color(configColor)).append(Component.text(" > ").color(NamedTextColor.GRAY)).build(); + return Component.text().append(pluginHeader.get()).append(Component.text(command).color(configColor)).append(Component.text(" > ").color(NamedTextColor.GRAY)).build(); } @Override diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InfoCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InfoCommand.java index f2fe0e13..0a142afb 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InfoCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InfoCommand.java @@ -1,6 +1,7 @@ package com.hm.achievement.command.executable; import com.hm.achievement.AdvancedAchievements; +import com.hm.achievement.config.PluginHeader; import com.hm.achievement.config.RewardParser; import com.hm.achievement.utils.ColorHelper; import com.hm.achievement.utils.StringHelper; @@ -41,7 +42,7 @@ public class InfoCommand extends AbstractCommand { private Component langVersionCommandDatabase; @Inject - public InfoCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Component pluginHeader, AdvancedAchievements advancedAchievements, RewardParser rewardParser) { + public InfoCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, PluginHeader pluginHeader, AdvancedAchievements advancedAchievements, RewardParser rewardParser) { super(mainConfig, langConfig, pluginHeader); this.advancedAchievements = advancedAchievements; this.rewardParser = rewardParser; @@ -57,34 +58,34 @@ public void extractConfigurationParameters() { header = Component.text("------------ ", configColor).append(Component.text(Objects.requireNonNull(configIcon))).append(Component.text(" Advanced Achievements ", NamedTextColor.WHITE)).append(Component.text(configIcon)).append(Component.text(" ------------", configColor)); - langVersionCommandDescription = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-description")), configColor)).append(Component.text(" ")).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-description-details")), NamedTextColor.GRAY)).build(); + langVersionCommandDescription = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-description")), configColor)).append(Component.text(" ")).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-description-details")), NamedTextColor.GRAY)).build(); - langVersionCommandVersion = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-version")), configColor)).append(Component.text(" ")).append(Component.text(advancedAchievements.getPluginMeta().getVersion(), NamedTextColor.GRAY)).build(); + langVersionCommandVersion = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-version")), configColor)).append(Component.text(" ")).append(Component.text(advancedAchievements.getPluginMeta().getVersion(), NamedTextColor.GRAY)).build(); - langVersionCommandAuthor = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-author")), configColor)).append(Component.text(" ")).append(Component.text(advancedAchievements.getPluginMeta().getAuthors().getFirst(), NamedTextColor.GRAY)).build(); + langVersionCommandAuthor = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-author")), configColor)).append(Component.text(" ")).append(Component.text(advancedAchievements.getPluginMeta().getAuthors().getFirst(), NamedTextColor.GRAY)).build(); - langVersionCommandWebsite = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-website")), configColor)).append(Component.text(" ")).append(Component.text(Objects.requireNonNull(advancedAchievements.getPluginMeta().getWebsite()), NamedTextColor.GRAY)).build(); + langVersionCommandWebsite = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-website")), configColor)).append(Component.text(" ")).append(Component.text(Objects.requireNonNull(advancedAchievements.getPluginMeta().getWebsite()), NamedTextColor.GRAY)).build(); // Display whether Advanced Achievements is linked to Vault. String vaultState = rewardParser.getEconomy() != null ? "&a✔" : "&4✘"; - langVersionCommandVault = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-vault")), configColor)).append(Component.text(" ")).append(ColorHelper.convertAmpersandToComponent(vaultState).color(NamedTextColor.GRAY)).build(); + langVersionCommandVault = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-vault")), configColor)).append(Component.text(" ")).append(ColorHelper.convertAmpersandToComponent(vaultState).color(NamedTextColor.GRAY)).build(); // Display whether Advanced Achievements is linked to Pet Master. String petMasterState = Bukkit.getPluginManager().isPluginEnabled("PetMaster") ? "&a✔" : "&4✘"; - langVersionCommandPetmaster = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-petmaster")), configColor)).append(Component.text(" ")).append(ColorHelper.convertAmpersandToComponent(petMasterState).color(NamedTextColor.GRAY)).build(); + langVersionCommandPetmaster = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-petmaster")), configColor)).append(Component.text(" ")).append(ColorHelper.convertAmpersandToComponent(petMasterState).color(NamedTextColor.GRAY)).build(); // Display whether Advanced Achievements is linked to Essentials. boolean essentialsUsed = Bukkit.getPluginManager().isPluginEnabled("Essentials") && mainConfig.getBoolean("IgnoreAFKPlayedTime"); String essentialsState = essentialsUsed ? "&a✔" : "&4✘"; - langVersionCommandEssentials = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-essentials")), configColor)).append(Component.text(" ")).append(ColorHelper.convertAmpersandToComponent(essentialsState).color(NamedTextColor.GRAY)).build(); + langVersionCommandEssentials = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-essentials")), configColor)).append(Component.text(" ")).append(ColorHelper.convertAmpersandToComponent(essentialsState).color(NamedTextColor.GRAY)).build(); // Display whether Advanced Achievements is linked to PlaceholderAPI. String placeholderAPIState = Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI") ? "&a✔" : "&4✘"; - langVersionCommandPlaceholderAPI = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-placeholderapi")), configColor)).append(Component.text(" ")).append(ColorHelper.convertAmpersandToComponent(placeholderAPIState).color(NamedTextColor.GRAY)).build(); + langVersionCommandPlaceholderAPI = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-placeholderapi")), configColor)).append(Component.text(" ")).append(ColorHelper.convertAmpersandToComponent(placeholderAPIState).color(NamedTextColor.GRAY)).build(); // Display database type. String databaseType = getDatabaseType(); - langVersionCommandDatabase = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-database")), configColor)).append(Component.text(" ")).append(Component.text(databaseType, NamedTextColor.GRAY)).build(); + langVersionCommandDatabase = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("version-command-database")), configColor)).append(Component.text(" ")).append(Component.text(databaseType, NamedTextColor.GRAY)).build(); } private @NonNull String getDatabaseType() { diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InspectCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InspectCommand.java index 9a3587ea..c738097b 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InspectCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/InspectCommand.java @@ -3,6 +3,7 @@ import com.hm.achievement.AdvancedAchievements; import com.hm.achievement.command.pagination.SupplierCommandPagination; import com.hm.achievement.config.AchievementMap; +import com.hm.achievement.config.PluginHeader; import com.hm.achievement.db.AbstractDatabaseManager; import com.hm.achievement.db.data.AwardedDBAchievement; import com.hm.achievement.domain.Achievement; @@ -45,7 +46,7 @@ public class InspectCommand extends AbstractCommand { private final Map cachedPagination; @Inject - public InspectCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Component pluginHeader, AdvancedAchievements advancedAchievements, AbstractDatabaseManager databaseManager, AchievementMap achievementMap) { + public InspectCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, PluginHeader pluginHeader, AdvancedAchievements advancedAchievements, AbstractDatabaseManager databaseManager, AchievementMap achievementMap) { super(mainConfig, langConfig, pluginHeader); this.advancedAchievements = advancedAchievements; this.databaseManager = databaseManager; @@ -71,7 +72,7 @@ void onExecute(CommandSender sender, String[] args) { String displayName = parseAchievementName(args); Achievement achievement = getAchievement(displayName); if (achievement == null) { - sender.sendMessage(Component.text().append(pluginHeader).append(Component.text("You must specify an achievement name"))); + sender.sendMessage(Component.text().append(pluginHeader.get()).append(Component.text("You must specify an achievement name"))); return; } int page = getPage(args); diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ListCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ListCommand.java index 41b4f26d..00e90468 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ListCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ListCommand.java @@ -1,5 +1,6 @@ package com.hm.achievement.command.executable; +import com.hm.achievement.config.PluginHeader; import com.hm.achievement.gui.CategoryGUI; import com.hm.achievement.gui.GUIItems; import com.hm.achievement.gui.MainGUI; @@ -35,7 +36,7 @@ public class ListCommand extends AbstractCommand { private Component langCategoryDoesNotExist; @Inject - public ListCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Component pluginHeader, MainGUI mainGUI, CategoryGUI categoryGUI, GUIItems guiItems) { + public ListCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, PluginHeader pluginHeader, MainGUI mainGUI, CategoryGUI categoryGUI, GUIItems guiItems) { super(mainConfig, langConfig, pluginHeader); this.mainGUI = mainGUI; this.categoryGUI = categoryGUI; @@ -45,7 +46,7 @@ public ListCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") Y @Override public void extractConfigurationParameters() { super.extractConfigurationParameters(); - langCategoryDoesNotExist = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("category-does-not-exist")))).build(); + langCategoryDoesNotExist = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("category-does-not-exist")))).build(); } @Override diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/MonthCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/MonthCommand.java index 70de18a8..abe839c3 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/MonthCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/MonthCommand.java @@ -1,5 +1,6 @@ package com.hm.achievement.command.executable; +import com.hm.achievement.config.PluginHeader; import com.hm.achievement.db.AbstractDatabaseManager; import com.hm.achievement.utils.SoundPlayer; import jakarta.inject.Inject; @@ -7,7 +8,6 @@ import jakarta.inject.Singleton; import java.util.Calendar; import java.util.logging.Logger; -import net.kyori.adventure.text.Component; import org.bukkit.configuration.file.YamlConfiguration; /** @@ -20,7 +20,7 @@ public class MonthCommand extends AbstractRankingCommand { @Inject - public MonthCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Component pluginHeader, Logger logger, AbstractDatabaseManager databaseManager, SoundPlayer soundPlayer) { + public MonthCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, PluginHeader pluginHeader, Logger logger, AbstractDatabaseManager databaseManager, SoundPlayer soundPlayer) { super(mainConfig, langConfig, pluginHeader, logger, "month-achievement", databaseManager, soundPlayer); } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ReloadCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ReloadCommand.java index 68fad149..b1cc68c5 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ReloadCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ReloadCommand.java @@ -1,6 +1,7 @@ package com.hm.achievement.command.executable; import com.hm.achievement.AdvancedAchievements; +import com.hm.achievement.config.PluginHeader; import com.hm.achievement.exception.PluginLoadError; import com.hm.achievement.lifecycle.PluginLoader; import com.hm.achievement.lifecycle.Reloadable; @@ -36,7 +37,7 @@ public class ReloadCommand extends AbstractCommand { private Component langConfigSuccessfullyReloaded; @Inject - public ReloadCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Component pluginHeader, AdvancedAchievements advancedAchievements, Logger logger, Lazy pluginLoader, Lazy> reloadables) { + public ReloadCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, PluginHeader pluginHeader, AdvancedAchievements advancedAchievements, Logger logger, Lazy pluginLoader, Lazy> reloadables) { super(mainConfig, langConfig, pluginHeader); this.advancedAchievements = advancedAchievements; this.logger = logger; @@ -48,8 +49,8 @@ public ReloadCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") public void extractConfigurationParameters() { super.extractConfigurationParameters(); - langConfigReloadFailed = Component.text().append(pluginHeader).append(ColorHelper.convertAmpersandToComponent(langConfig.getString("configuration-reload-failed"))).build(); - langConfigSuccessfullyReloaded = Component.text().append(pluginHeader).append(ColorHelper.convertAmpersandToComponent(langConfig.getString("configuration-successfully-reloaded"))).build(); + langConfigReloadFailed = Component.text().append(pluginHeader.get()).append(ColorHelper.convertAmpersandToComponent(langConfig.getString("configuration-reload-failed"))).build(); + langConfigSuccessfullyReloaded = Component.text().append(pluginHeader.get()).append(ColorHelper.convertAmpersandToComponent(langConfig.getString("configuration-successfully-reloaded"))).build(); } /** diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ResetCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ResetCommand.java index 24eecaa5..82b65688 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ResetCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ResetCommand.java @@ -1,6 +1,7 @@ package com.hm.achievement.command.executable; import com.hm.achievement.config.AchievementMap; +import com.hm.achievement.config.PluginHeader; import com.hm.achievement.db.CacheManager; import com.hm.achievement.utils.StringHelper; import jakarta.inject.Inject; @@ -34,7 +35,7 @@ public class ResetCommand extends AbstractParsableCommand { private Component langCategoryDoesNotExist; @Inject - public ResetCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Component pluginHeader, CacheManager cacheManager, AchievementMap achievementMap) { + public ResetCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, PluginHeader pluginHeader, CacheManager cacheManager, AchievementMap achievementMap) { super(mainConfig, langConfig, pluginHeader); this.cacheManager = cacheManager; this.achievementMap = achievementMap; @@ -43,9 +44,9 @@ public ResetCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") @Override public void extractConfigurationParameters() { super.extractConfigurationParameters(); - langResetSuccessful = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("reset-successful")))).build(); - langResetAllSuccessful = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("reset-all-successful")))).build(); - langCategoryDoesNotExist = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("category-does-not-exist")))).build(); + langResetSuccessful = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("reset-successful")))).build(); + langResetAllSuccessful = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("reset-all-successful")))).build(); + langCategoryDoesNotExist = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("category-does-not-exist")))).build(); } @Override diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/StatsCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/StatsCommand.java index ad7306dd..0024d246 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/StatsCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/StatsCommand.java @@ -1,6 +1,7 @@ package com.hm.achievement.command.executable; import com.hm.achievement.config.AchievementMap; +import com.hm.achievement.config.PluginHeader; import com.hm.achievement.db.CacheManager; import com.hm.achievement.utils.ColorHelper; import com.hm.achievement.utils.SoundPlayer; @@ -43,7 +44,7 @@ public class StatsCommand extends AbstractCommand { private Component langNumberAchievements; @Inject - public StatsCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Component pluginHeader, CacheManager cacheManager, AchievementMap achievementMap, SoundPlayer soundPlayer) { + public StatsCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, PluginHeader pluginHeader, CacheManager cacheManager, AchievementMap achievementMap, SoundPlayer soundPlayer) { super(mainConfig, langConfig, pluginHeader); this.cacheManager = cacheManager; this.achievementMap = achievementMap; @@ -59,7 +60,7 @@ public void extractConfigurationParameters() { configAdditionalEffects = mainConfig.getBoolean("AdditionalEffects"); configSound = mainConfig.getBoolean("Sound"); configSoundStats = Objects.requireNonNull(mainConfig.getString("SoundStats")).toUpperCase(); - langNumberAchievements = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("number-achievements")))).append(Component.text(" ")).build(); + langNumberAchievements = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("number-achievements")))).append(Component.text(" ")).build(); } @Override diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ToggleCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ToggleCommand.java index b1e7c9f3..d6a0a236 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ToggleCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ToggleCommand.java @@ -1,5 +1,6 @@ package com.hm.achievement.command.executable; +import com.hm.achievement.config.PluginHeader; import jakarta.inject.Inject; import jakarta.inject.Named; import jakarta.inject.Singleton; @@ -34,7 +35,7 @@ public class ToggleCommand extends AbstractCommand { private Component langToggleHidden; @Inject - public ToggleCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Component pluginHeader) { + public ToggleCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, PluginHeader pluginHeader) { super(mainConfig, langConfig, pluginHeader); } @@ -42,8 +43,8 @@ public ToggleCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") public void extractConfigurationParameters() { super.extractConfigurationParameters(); configNotifyOtherPlayers = mainConfig.getBoolean("NotifyOtherPlayers"); - langToggleDisplayed = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("toggle-displayed")))).build(); - langToggleHidden = Component.text().append(pluginHeader).append(Component.text(Objects.requireNonNull(langConfig.getString("toggle-hidden")))).build(); + langToggleDisplayed = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("toggle-displayed")))).build(); + langToggleHidden = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("toggle-hidden")))).build(); } /** diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/TopCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/TopCommand.java index 58644ab1..9ab3028c 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/TopCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/TopCommand.java @@ -1,12 +1,12 @@ package com.hm.achievement.command.executable; +import com.hm.achievement.config.PluginHeader; import com.hm.achievement.db.AbstractDatabaseManager; import com.hm.achievement.utils.SoundPlayer; import jakarta.inject.Inject; import jakarta.inject.Named; import jakarta.inject.Singleton; import java.util.logging.Logger; -import net.kyori.adventure.text.Component; import org.bukkit.configuration.file.YamlConfiguration; /** @@ -19,7 +19,7 @@ public class TopCommand extends AbstractRankingCommand { @Inject - public TopCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Component pluginHeader, Logger logger, AbstractDatabaseManager databaseManager, SoundPlayer soundPlayer) { + public TopCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, PluginHeader pluginHeader, Logger logger, AbstractDatabaseManager databaseManager, SoundPlayer soundPlayer) { super(mainConfig, langConfig, pluginHeader, logger, "top-achievement", databaseManager, soundPlayer); } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/WeekCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/WeekCommand.java index 8fb139fc..25f3cefc 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/WeekCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/WeekCommand.java @@ -1,5 +1,6 @@ package com.hm.achievement.command.executable; +import com.hm.achievement.config.PluginHeader; import com.hm.achievement.db.AbstractDatabaseManager; import com.hm.achievement.utils.SoundPlayer; import jakarta.inject.Inject; @@ -7,7 +8,6 @@ import jakarta.inject.Singleton; import java.util.Calendar; import java.util.logging.Logger; -import net.kyori.adventure.text.Component; import org.bukkit.configuration.file.YamlConfiguration; /** @@ -20,7 +20,7 @@ public class WeekCommand extends AbstractRankingCommand { @Inject - public WeekCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Component pluginHeader, Logger logger, AbstractDatabaseManager databaseManager, SoundPlayer soundPlayer) { + public WeekCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, PluginHeader pluginHeader, Logger logger, AbstractDatabaseManager databaseManager, SoundPlayer soundPlayer) { super(mainConfig, langConfig, pluginHeader, logger, "week-achievement", databaseManager, soundPlayer); } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executor/PluginCommandExecutor.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executor/PluginCommandExecutor.java index dbd45ab2..21b168fa 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executor/PluginCommandExecutor.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executor/PluginCommandExecutor.java @@ -2,6 +2,7 @@ import com.hm.achievement.command.executable.AbstractCommand; import com.hm.achievement.command.executable.CommandSpec; +import com.hm.achievement.config.PluginHeader; import com.hm.achievement.lifecycle.Reloadable; import jakarta.inject.Inject; import jakarta.inject.Named; @@ -9,7 +10,6 @@ import java.util.Arrays; import java.util.Optional; import java.util.Set; -import net.kyori.adventure.text.Component; import org.apache.commons.lang3.StringUtils; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -27,12 +27,12 @@ public class PluginCommandExecutor implements CommandExecutor, Reloadable { private final YamlConfiguration langConfig; private final Set commands; - private final Component pluginHeader; + private final PluginHeader pluginHeader; private String langInvalidCommand; @Inject - public PluginCommandExecutor(@Named("lang") YamlConfiguration langConfig, Set commands, Component pluginHeader) { + public PluginCommandExecutor(@Named("lang") YamlConfiguration langConfig, Set commands, PluginHeader pluginHeader) { this.langConfig = langConfig; this.commands = commands; this.pluginHeader = pluginHeader; diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/config/PluginHeader.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/config/PluginHeader.java new file mode 100644 index 00000000..eb83402b --- /dev/null +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/config/PluginHeader.java @@ -0,0 +1,21 @@ +package com.hm.achievement.config; + +import com.hm.achievement.utils.ColorHelper; +import jakarta.inject.Inject; +import jakarta.inject.Singleton; +import net.kyori.adventure.text.Component; + +@Singleton +public class PluginHeader { + + private final StringBuilder legacyHeader; + + @Inject + public PluginHeader(StringBuilder legacyHeader) { + this.legacyHeader = legacyHeader; + } + + public Component get() { + return ColorHelper.convertAmpersandToComponent(legacyHeader.toString()); + } +} diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java index 5afd0185..78c10ee0 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java @@ -5,6 +5,7 @@ import com.hm.achievement.advancement.AdvancementManager; import com.hm.achievement.command.executable.ToggleCommand; import com.hm.achievement.config.AchievementMap; +import com.hm.achievement.config.PluginHeader; import com.hm.achievement.config.RewardParser; import com.hm.achievement.db.AbstractDatabaseManager; import com.hm.achievement.db.CacheManager; @@ -69,7 +70,7 @@ public class PlayerAdvancedAchievementListener implements Listener, Reloadable { private final YamlConfiguration mainConfig; private final YamlConfiguration langConfig; private final Logger logger; - private final Component pluginHeader; + private final PluginHeader pluginHeader; private final CacheManager cacheManager; private final AdvancedAchievements advancedAchievements; private final RewardParser rewardParser; @@ -93,7 +94,7 @@ public class PlayerAdvancedAchievementListener implements Listener, Reloadable { private boolean configBossBarProgress; @Inject - public PlayerAdvancedAchievementListener(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Logger logger, Component pluginHeader, CacheManager cacheManager, AdvancedAchievements advancedAchievements, RewardParser rewardParser, AchievementMap achievementMap, AbstractDatabaseManager databaseManager, ToggleCommand toggleCommand, FancyMessageSender fancyMessageSender) { + public PlayerAdvancedAchievementListener(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Logger logger, PluginHeader pluginHeader, CacheManager cacheManager, AdvancedAchievements advancedAchievements, RewardParser rewardParser, AchievementMap achievementMap, AbstractDatabaseManager databaseManager, ToggleCommand toggleCommand, FancyMessageSender fancyMessageSender) { this.mainConfig = mainConfig; this.langConfig = langConfig; this.logger = logger; @@ -124,8 +125,8 @@ public void extractConfigurationParameters() { configBossBarProgress = mainConfig.getBoolean("BossBarProgress"); configReceiverChatMessages = mainConfig.getBoolean("ReceiverChatMessages"); langAchievementReceived = Component.text(Objects.requireNonNull(langConfig.getString("achievement-received"))); - langAchievementNew = pluginHeader.append(Component.text(Objects.requireNonNull(langConfig.getString("achievement-new")))); - langAllAchievementsReceived = pluginHeader.append(Component.text(Objects.requireNonNull(langConfig.getString("all-achievements-received")))); + langAchievementNew = pluginHeader.get().append(Component.text(Objects.requireNonNull(langConfig.getString("achievement-new")))); + langAllAchievementsReceived = pluginHeader.get().append(Component.text(Objects.requireNonNull(langConfig.getString("all-achievements-received")))); langBossBarProgress = langConfig.getString("boss-bar-progress"); } @@ -198,7 +199,7 @@ private void displayReceiverMessages(Player player, Component nameToShowUser, Co fancyMessageSender.sendHoverableMessage(player, applyPrefix(message), applyPrefix(hoverComponent)); } else { player.sendMessage(applyPrefix(message)); - player.sendMessage(applyPrefix(messageToShowUser)); + player.sendMessage(pluginHeader.get().color(NamedTextColor.WHITE).append(applyPrefix(messageToShowUser))); chatMessages.stream().map(ColorHelper::convertAmpersandToComponent).forEach(t -> player.sendMessage(applyPrefix(t))); } } @@ -213,7 +214,7 @@ private void displayReceiverMessages(Player player, Component nameToShowUser, Co private void displayNotification(Player receiver, Component nameToShowUser, Player otherPlayer) { Component message = langAchievementReceived.replaceText(b -> b.matchLiteral("PLAYER").replacement(receiver.getName())).replaceText(b -> b.matchLiteral("ACH").replacement(nameToShowUser)); if (configActionBarNotify) otherPlayer.sendActionBar(message.decorate(TextDecoration.ITALIC)); - else otherPlayer.sendMessage(pluginHeader.append(message).decorate(TextDecoration.ITALIC)); + else otherPlayer.sendMessage(pluginHeader.get().append(message).decorate(TextDecoration.ITALIC)); } /** @@ -283,12 +284,12 @@ private void displayBossBarProgress(@NonNull Player player) { private void handleAllAchievementsReceived(@NonNull Player player) { List rewards = rewardParser.parseRewards("AllAchievementsReceivedRewards"); rewards.forEach(r -> r.rewarder().accept(player)); - player.sendMessage(langAllAchievementsReceived); - rewards.stream().map(Reward::chatTexts).flatMap(List::stream).map(m -> StringHelper.replacePlayerPlaceholders(m, player)).forEach(t -> player.sendMessage(pluginHeader.append(t))); + player.sendMessage(applyPrefix(langAllAchievementsReceived)); + rewards.stream().map(Reward::chatTexts).flatMap(List::stream).map(m -> StringHelper.replacePlayerPlaceholders(m, player)).forEach(t -> player.sendMessage(pluginHeader.get().append(t))); } private Component applyPrefix(Component s) { - if (mainConfig.getBoolean("PrefixEnabled")) return Component.text("[AACH] ").color(NamedTextColor.GRAY).append(pluginHeader).append(s); + if (mainConfig.getBoolean("PrefixEnabled")) return Component.text("[AACH] ", NamedTextColor.GRAY).append(s); return s; } } \ No newline at end of file diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/module/ConfigModule.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/module/ConfigModule.java index 17c6e6ef..303bd641 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/module/ConfigModule.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/module/ConfigModule.java @@ -7,7 +7,6 @@ import jakarta.inject.Singleton; import java.util.HashSet; import java.util.Set; -import net.kyori.adventure.text.Component; import org.bukkit.configuration.file.YamlConfiguration; @Module @@ -21,14 +20,7 @@ Set provideDisabledCategories() { @Provides @Singleton - Component providePluginHeader() { - return Component.empty(); - } - - @Provides - @Singleton - // TODO: Convert all to component - StringBuilder provideLegacyPluginHeader() { + StringBuilder providePluginHeader() { return new StringBuilder(); } diff --git a/advanced-achievements-plugin/src/test/java/com/hm/achievement/command/executor/PluginCommandExecutorTest.java b/advanced-achievements-plugin/src/test/java/com/hm/achievement/command/executor/PluginCommandExecutorTest.java index 202afa9f..f15d2e9d 100644 --- a/advanced-achievements-plugin/src/test/java/com/hm/achievement/command/executor/PluginCommandExecutorTest.java +++ b/advanced-achievements-plugin/src/test/java/com/hm/achievement/command/executor/PluginCommandExecutorTest.java @@ -4,9 +4,9 @@ import com.hm.achievement.command.executable.HelpCommand; import com.hm.achievement.command.executable.InspectCommand; import com.hm.achievement.command.executable.ListCommand; +import com.hm.achievement.config.PluginHeader; import java.util.HashSet; import java.util.Set; -import net.kyori.adventure.text.Component; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.YamlConfiguration; @@ -29,7 +29,7 @@ @ExtendWith(MockitoExtension.class) class PluginCommandExecutorTest { - private static final Component PLUGIN_HEADER = Component.text("header "); + private static final PluginHeader PLUGIN_HEADER = new PluginHeader(new StringBuilder("[HEADER]")); private static final String ERROR_MESSAGE = "error message"; private static final String label = "label"; diff --git a/advanced-achievements-plugin/src/test/java/com/hm/achievement/listener/PlayerAdvancedAchievementListenerTest.java b/advanced-achievements-plugin/src/test/java/com/hm/achievement/listener/PlayerAdvancedAchievementListenerTest.java index 0636b38e..c1ed5f09 100644 --- a/advanced-achievements-plugin/src/test/java/com/hm/achievement/listener/PlayerAdvancedAchievementListenerTest.java +++ b/advanced-achievements-plugin/src/test/java/com/hm/achievement/listener/PlayerAdvancedAchievementListenerTest.java @@ -2,6 +2,7 @@ import com.hm.achievement.AdvancedAchievements; import com.hm.achievement.config.AchievementMap; +import com.hm.achievement.config.PluginHeader; import com.hm.achievement.db.AbstractDatabaseManager; import com.hm.achievement.db.CacheManager; import com.hm.achievement.domain.Achievement; @@ -16,7 +17,6 @@ import java.util.Set; import java.util.UUID; import java.util.logging.Logger; -import net.kyori.adventure.text.Component; import org.bukkit.Server; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; @@ -40,7 +40,7 @@ @ExtendWith(MockitoExtension.class) class PlayerAdvancedAchievementListenerTest { - private static final Component PLUGIN_HEADER = Component.text("[HEADER]"); + private static final PluginHeader PLUGIN_HEADER = new PluginHeader(new StringBuilder("[HEADER]")); private static final UUID PLAYER_UUID = UUID.randomUUID(); @Mock From 05bd31a6e12f415029756adde22995f8da90e7fc Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Thu, 16 Apr 2026 19:27:31 +0100 Subject: [PATCH 49/58] Update config links --- advanced-achievements-plugin/src/main/resources/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/advanced-achievements-plugin/src/main/resources/config.yml b/advanced-achievements-plugin/src/main/resources/config.yml index a7360b8c..1b5ab6a7 100644 --- a/advanced-achievements-plugin/src/main/resources/config.yml +++ b/advanced-achievements-plugin/src/main/resources/config.yml @@ -52,7 +52,7 @@ AdditionalEffects: true # or month when ranked in the top list. Sound: true -# For /aach book. All sound values can be found here: https://github.com/PyvesB/advanced-achievements/wiki/Sound-names +# For /aach book. All sound values can be found here: https://jd.papermc.io/paper/26.1.2/org/bukkit/Sound.html SoundBook: entity_player_levelup # For /aach stats when all achievements have been received. @@ -288,7 +288,7 @@ BungeeMode: false #======================================================================================================================# # Count blocks placed. You can use any of the following: -# - block names (available names: https://github.com/PyvesB/advanced-achievements/wiki/Material-names). +# - block names (available names: https://jd.papermc.io/paper/26.1.2/org/bukkit/Material.html). # - notations such as sand:1 (i.e. sand item with metadata 1, red sand) for 1.7-1.12 Minecraft versions . # - custom display name of items (e.g. the name of a player's head). Places: From e7aebff504801a624a22fc1ce4f8d287f92a0ece Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Thu, 16 Apr 2026 19:49:41 +0100 Subject: [PATCH 50/58] Embed method --- .../listener/PlayerAdvancedAchievementListener.java | 2 +- .../src/main/java/com/hm/achievement/utils/ColorHelper.java | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java index 78c10ee0..8c24e9e0 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java @@ -116,7 +116,7 @@ public void extractConfigurationParameters() { logger.warning("Failed to load FireworkStyle, using ball_large instead. Please use one of the following: " + "ball_large, ball, burst, creeper, star or random."); } configFirework = mainConfig.getBoolean("Firework"); - configFireworkColor = ColorHelper.configFireworkColor(mainConfig); + configFireworkColor = ColorHelper.parseColor(mainConfig.getString("FireworkColor", "DARK_PURPLE")); configSimplifiedReception = mainConfig.getBoolean("SimplifiedReception"); configTitleScreen = mainConfig.getBoolean("TitleScreen"); configNotifyOtherPlayers = mainConfig.getBoolean("NotifyOtherPlayers"); diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/ColorHelper.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/ColorHelper.java index 9b5d50a0..ecd268f3 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/ColorHelper.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/ColorHelper.java @@ -25,10 +25,6 @@ public static NamedTextColor configColor(@NonNull YamlConfiguration mainConfig) return parseColor(mainConfig.getString("Color", "DARK_PURPLE")); } - public static NamedTextColor configFireworkColor(@NonNull YamlConfiguration mainConfig) { - return parseColor(mainConfig.getString("FireworkColor", "DARK_PURPLE")); - } - public static @NonNull Component convertAmpersandToComponent(String text) { return LegacyComponentSerializer.legacyAmpersand().deserialize(text); } From 7bd2f0a74399daf35b1f1735784490b38e4f33c6 Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Thu, 16 Apr 2026 19:57:53 +0100 Subject: [PATCH 51/58] Embed method --- .../main/java/com/hm/achievement/utils/StringHelper.java | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/StringHelper.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/StringHelper.java index 51c10a41..9ba4e948 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/StringHelper.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/StringHelper.java @@ -17,14 +17,8 @@ */ public class StringHelper { - private static final Pattern FORMATTING_CODE_PATTERN = Pattern.compile("([&§])([a-f]|r|[k-o]|[0-9])"); - - private StringHelper() { - // Not called. - } - public static String removeFormattingCodes(String text) { - return FORMATTING_CODE_PATTERN.matcher(text).replaceAll(""); + return Pattern.compile("([&§])([a-f]|r|[k-o]|[0-9])").matcher(text).replaceAll(""); } public static String getClosestMatch(String toMatch, @NonNull Collection possibleMatches) { From ca0cfaa3e640138de5b07323d218f50116f50c7f Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Sat, 18 Apr 2026 15:12:13 +0100 Subject: [PATCH 52/58] Fix #161 --- .../src/main/java/com/hm/achievement/config/RewardParser.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/config/RewardParser.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/config/RewardParser.java index ee915644..39ca66a0 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/config/RewardParser.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/config/RewardParser.java @@ -150,8 +150,7 @@ public List parseRewards(String path) { String name = nameBuilder.toString().trim(); if (name.isEmpty()) name = StringHelper.toReadableName(rewardMaterial.get()); if (itemMeta != null) { - Component displayName = Component.text(name).style(Style.style().decoration(TextDecoration.ITALIC, false)); - itemMeta.displayName(displayName); + itemMeta.displayName(Component.text(name).decorate(TextDecoration.ITALIC)); itemStack.setItemMeta(itemMeta); } listTexts.add(StringUtils.replaceEach(langConfig.getString("list-reward-item"), new String[]{"AMOUNT", "ITEM"}, new String[]{Integer.toString(amount), name})); From 1a9bb1145f9782ef26f845db52447281816de369 Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Sat, 18 Apr 2026 15:14:57 +0100 Subject: [PATCH 53/58] Capitals --- .../src/main/resources/lang.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/advanced-achievements-plugin/src/main/resources/lang.yml b/advanced-achievements-plugin/src/main/resources/lang.yml index c36ef1e1..a7d56242 100644 --- a/advanced-achievements-plugin/src/main/resources/lang.yml +++ b/advanced-achievements-plugin/src/main/resources/lang.yml @@ -134,11 +134,11 @@ list-reception: "Reception date:" list-progress: "Progress:" list-reward: "Reward:" list-rewards: "Rewards:" -list-reward-money: "receive AMOUNT" -list-reward-item: "receive AMOUNT ITEM" -list-reward-experience: "receive AMOUNT experience" -list-reward-increase-max-health: "increase max health by AMOUNT" -list-reward-increase-max-oxygen: "increase max oxygen by AMOUNT" +list-reward-money: "Receive AMOUNT" +list-reward-item: "Receive AMOUNT ITEM" +list-reward-experience: "Receive AMOUNT experience" +list-reward-increase-max-health: "Increase max health by AMOUNT" +list-reward-increase-max-oxygen: "Increase max oxygen by AMOUNT" list-achievement-received: "&5\u2714&f " list-achievement-not-received: "&4\u2718 " list-category-not-unlocked: "You have not yet unlocked this category." From 040a15fc2c29f9d63c166244e307dca76a2dedcc Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Sat, 18 Apr 2026 15:28:32 +0100 Subject: [PATCH 54/58] Make 'HINT' light grey again --- advanced-achievements-plugin/src/main/resources/lang.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/advanced-achievements-plugin/src/main/resources/lang.yml b/advanced-achievements-plugin/src/main/resources/lang.yml index a7d56242..610dfbdd 100644 --- a/advanced-achievements-plugin/src/main/resources/lang.yml +++ b/advanced-achievements-plugin/src/main/resources/lang.yml @@ -110,7 +110,7 @@ aach-command-inspect: "Inspect recipients of ACH." aach-command-inspect-hover: "Lists most recent recipients of an achievement, max 1000." aach-command-grant: "Grant ACH to NAME." aach-command-grant-hover: "Player must be online. Grants achievement to player" -aach-tip: "&lHINT &8You can &7&n&ohover&8 or &7&n&oclick&8 on the commands!" +aach-tip: "&l&7HINT &8You can &7&n&ohover&8 or &7&n&oclick&8 on the commands!" # Used in /aach info. version-command-version: "Version:" From ff583d89e9bf49b396b25462a72c2d7220dd54cf Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Sat, 18 Apr 2026 15:35:37 +0100 Subject: [PATCH 55/58] Fix #174 --- .../command/executable/HelpCommand.java | 35 +++++++++---------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/HelpCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/HelpCommand.java index 84d6b0d3..f53fc54d 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/HelpCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/HelpCommand.java @@ -79,41 +79,40 @@ public void extractConfigurationParameters() { configColor = ColorHelper.configColor(mainConfig); configIcon = StringHelper.unescapeJava(mainConfig.getString("Icon")); - langCommandList = header("/aach list").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-list")))); + langCommandList = header("/aach list").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-list"))).color(NamedTextColor.GRAY)); langCommandListHover = Component.text(Objects.requireNonNull(langConfig.getString("aach-command-list-hover"))); - langCommandTop = header("/aach top").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-top")))); + langCommandTop = header("/aach top").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-top"))).color(NamedTextColor.GRAY)); langCommandTopHover = Component.text(Objects.requireNonNull(langConfig.getString("aach-command-top-hover"))); - langCommandInfo = header("/aach info").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-info")))); + langCommandInfo = header("/aach info").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-info"))).color(NamedTextColor.GRAY)); langCommandInfoHover = Component.text(Objects.requireNonNull(langConfig.getString("aach-command-info-hover"))); - langCommandBook = header("/aach book").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-book")))); + langCommandBook = header("/aach book").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-book"))).color(NamedTextColor.GRAY)); langCommandBookHover = Component.text(Objects.requireNonNull(langConfig.getString("aach-command-book-hover"))); - langCommandWeek = header("/aach week").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-week")))); + langCommandWeek = header("/aach week").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-week"))).color(NamedTextColor.GRAY)); langCommandWeekHover = Component.text(Objects.requireNonNull(langConfig.getString("aach-command-week-hover"))); - langCommandStats = header("/aach stats").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-stats")))); + langCommandStats = header("/aach stats").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-stats"))).color(NamedTextColor.GRAY)); langCommandStatsHover = Component.text(Objects.requireNonNull(langConfig.getString("aach-command-stats-hover"))); - langCommandMonth = header("/aach month").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-month")))); + langCommandMonth = header("/aach month").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-month"))).color(NamedTextColor.GRAY)); langCommandMonthHover = Component.text(Objects.requireNonNull(langConfig.getString("aach-command-month-hover"))); - langCommandToggle = header("/aach toggle").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-toggle")))); + langCommandToggle = header("/aach toggle").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-toggle"))).color(NamedTextColor.GRAY)); langCommandToggleHover = Component.text(Objects.requireNonNull(langConfig.getString("aach-command-toggle-hover"))); - langCommandReload = header("/aach reload").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-reload")))); + langCommandReload = header("/aach reload").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-reload"))).color(NamedTextColor.GRAY)); langCommandReloadHover = Component.text(Objects.requireNonNull(langConfig.getString("aach-command-reload-hover"))); - langCommandGenerate = header("/aach generate").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-generate")))); + langCommandGenerate = header("/aach generate").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-generate"))).color(NamedTextColor.GRAY)); langCommandGenerateHover = Component.text(Objects.requireNonNull(langConfig.getString("aach-command-generate-hover"))); - langCommandInspect = header("/aach inspect").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-inspect")))); + langCommandInspect = header("/aach inspect").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-inspect"))).color(NamedTextColor.GRAY)); langCommandInspectHover = Component.text(Objects.requireNonNull(langConfig.getString("aach-command-inspect-hover"))); - langCommandGive = header("/aach give player").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-give")))); + langCommandGive = header("/aach give player").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-give"))).color(NamedTextColor.GRAY)); langCommandGiveHover = Component.text(Objects.requireNonNull(langConfig.getString("aach-command-give-hover"))); - langCommandAdd = header("/aach add 1 cat player").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-add")))); + langCommandAdd = header("/aach add 1 cat player").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-add"))).color(NamedTextColor.GRAY)); langCommandAddHover = Component.text(Objects.requireNonNull(Objects.requireNonNull(langConfig.getString("aach-command-add-hover")))); - langCommandReset = header("/aach reset cat player").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-reset")))); + langCommandReset = header("/aach reset cat player").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-reset"))).color(NamedTextColor.GRAY)); langCommandResetHover = Component.text(Objects.requireNonNull(langConfig.getString("aach-command-reset-hover"))); - langCommandCheck = header("/aach check cat player").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-check")))); + langCommandCheck = header("/aach check cat player").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-check")))).color(NamedTextColor.GRAY); langCommandCheckHover = Component.text(Objects.requireNonNull(langConfig.getString("aach-command-check-hover"))); - langCommandDelete = header("/aach delete cat player").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-delete")))); + langCommandDelete = header("/aach delete cat player").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-delete"))).color(NamedTextColor.GRAY)); langCommandDeleteHover = Component.text(Objects.requireNonNull(langConfig.getString("aach-command-delete-hover"))); - langCommandGrant = header("/aach grant cat player").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-grant")))); + langCommandGrant = header("/aach grant cat player").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-grant"))).color(NamedTextColor.GRAY)); langCommandGrantHover = Component.text(Objects.requireNonNull(langConfig.getString("aach-command-grant-hover"))); - langTip = ColorHelper.convertAmpersandToComponent(langConfig.getString("aach-tip")); } From 38757d5e961ec6adc6d1d935a4bdabd820b16b5e Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Sat, 18 Apr 2026 16:03:19 +0100 Subject: [PATCH 56/58] Fix #173, #171, #157 --- .../executable/AbstractRankingCommand.java | 14 +++++++------- .../command/executable/BookCommand.java | 15 ++++++++------- .../command/executable/StatsCommand.java | 2 +- .../com/hm/achievement/utils/SoundPlayer.java | 1 - 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractRankingCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractRankingCommand.java index b5367ed8..4ba54c23 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractRankingCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractRankingCommand.java @@ -48,9 +48,9 @@ public abstract class AbstractRankingCommand extends AbstractCommand { private boolean configAdditionalEffects; private boolean configSound; private String configSoundRanking; - private String langPeriodAchievement; - private String langPlayerRank; - private String langNotRanked; + private Component langPeriodAchievement; + private Component langPlayerRank; + private Component langNotRanked; // Used for caching. private Map cachedSortedRankings; private List cachedAchievementCounts; @@ -73,9 +73,9 @@ public void extractConfigurationParameters() { configSound = mainConfig.getBoolean("Sound"); configSoundRanking = Objects.requireNonNull(mainConfig.getString("SoundRanking")).toUpperCase(); - langPeriodAchievement = pluginHeader + langConfig.getString(languageKey); - langPlayerRank = pluginHeader + langConfig.getString("player-rank") + " " + configColor; - langNotRanked = pluginHeader + langConfig.getString("not-ranked"); + langPeriodAchievement = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString(languageKey)))).build(); + langPlayerRank = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("player-rank")))).append(Component.text(" ").color(configColor)).build(); + langNotRanked = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("not-ranked")))).build(); } @Override @@ -112,7 +112,7 @@ public void onExecute(CommandSender sender, String[] args) { if (playerRank <= configTopList) { launchEffects((Player) sender); } - sender.sendMessage(langPlayerRank + playerRank + NamedTextColor.GRAY + "/" + configColor + cachedSortedRankings.size()); + sender.sendMessage(langPlayerRank.append(Component.text(playerRank)).color(NamedTextColor.GRAY).append(Component.text("/").append(Component.text(cachedSortedRankings.size()))).color(NamedTextColor.GRAY)); } } } diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/BookCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/BookCommand.java index d04cbf20..506f4182 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/BookCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/BookCommand.java @@ -53,11 +53,11 @@ public class BookCommand extends AbstractCommand implements Cleanable { private boolean configAdditionalEffects; private boolean configSound; private String configSoundBook; - private String langBookDelay; - private String langBookNotReceived; + private Component langBookDelay; + private Component langBookNotReceived; private Component langBookDate; private String langBookName; - private String langBookReceived; + private Component langBookReceived; private DateFormat dateFormat; @Inject @@ -77,11 +77,12 @@ public void extractConfigurationParameters() { configAdditionalEffects = mainConfig.getBoolean("AdditionalEffects"); configSound = mainConfig.getBoolean("Sound"); configSoundBook = Objects.requireNonNull(mainConfig.getString("SoundBook")).toUpperCase(); - langBookDelay = pluginHeader + StringUtils.replaceEach(langConfig.getString("book-delay"), new String[]{"TIME"}, new String[]{Integer.toString(configTimeBook / 1000)}); - langBookNotReceived = pluginHeader + langConfig.getString("book-not-received"); + langBookDelay = replace(Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("book-delay")))).build(), "TIME", Integer.toString(configTimeBook / 1000)); + langBookNotReceived = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("book-not-received")))).build(); langBookDate = ColorHelper.convertAmpersandToComponent(langConfig.getString("book-date")); langBookName = langConfig.getString("book-name"); - langBookReceived = pluginHeader + langConfig.getString("book-received"); + langBookReceived = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("book-received")))).build(); + String localeString = mainConfig.getString("DateLocale"); dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.forLanguageTag(Objects.requireNonNull(localeString))); @@ -125,7 +126,7 @@ void onExecute(CommandSender sender, String[] args) { * Constructs the pages of a book. * * @param achievements achievements - * @param player player + * @param player player */ private void fillBook(@NonNull List achievements, Player player) { ItemStack book = new ItemStack(Material.WRITTEN_BOOK); diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/StatsCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/StatsCommand.java index 0024d246..8ebe6043 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/StatsCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/StatsCommand.java @@ -102,7 +102,7 @@ void onExecute(CommandSender sender, String[] args) { } } // Display enriched progress bar. - Component message = Component.text(String.valueOf(pluginHeader)).append(Component.text("[")).append(barDisplay).append(Component.text("]", NamedTextColor.DARK_GRAY)); + Component message = Component.text().append(pluginHeader.get()).append(Component.text("[")).append(barDisplay).append(Component.text("]")).build(); player.sendMessage(message); // Player has received all achievement; play special effect and sound. diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/SoundPlayer.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/SoundPlayer.java index eb19f8fb..ae616d57 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/SoundPlayer.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/SoundPlayer.java @@ -40,7 +40,6 @@ public void play(@NonNull Player player, String providedSound, String fallbackSo } else { logger.warning("soundToPlay is null"); } - logger.info("playing sound " + soundToPlay); } /** From 0c570d3189df02d29fa7047cd553dd2945067357 Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Mon, 20 Apr 2026 18:45:29 +0100 Subject: [PATCH 57/58] Fix tests --- .../com/hm/achievement/utils/SoundPlayer.java | 16 ++++++------- .../hm/achievement/utils/SoundPlayerTest.java | 23 +++++++++---------- 2 files changed, 18 insertions(+), 21 deletions(-) diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/SoundPlayer.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/SoundPlayer.java index ae616d57..97436508 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/SoundPlayer.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/SoundPlayer.java @@ -2,11 +2,9 @@ import jakarta.inject.Inject; import jakarta.inject.Singleton; -import java.util.Locale; import java.util.logging.Logger; import org.bukkit.NamespacedKey; import org.bukkit.Registry; -import org.bukkit.Sound; import org.bukkit.entity.Player; import org.jspecify.annotations.NonNull; @@ -34,9 +32,9 @@ public SoundPlayer(Logger logger) { * @param fallbackSound */ public void play(@NonNull Player player, String providedSound, String fallbackSound) { - Sound soundToPlay = parseSound(providedSound, fallbackSound); + NamespacedKey soundToPlay = parseSound(providedSound, fallbackSound); if (soundToPlay != null) { - player.playSound(player.getLocation(), soundToPlay, 1, 0.7f); + player.playSound(player.getLocation(), String.valueOf(soundToPlay), 1, 0.7f); } else { logger.warning("soundToPlay is null"); } @@ -49,10 +47,10 @@ public void play(@NonNull Player player, String providedSound, String fallbackSo * @param fallbackSound The fallback sound to use if parsing fails. * @return The resolved Sound enum value. */ - private Sound parseSound(@NonNull String soundName, @NonNull String fallbackSound) { - Sound sound = Registry.SOUNDS.get(NamespacedKey.minecraft(soundName.toLowerCase(Locale.ROOT))); - Sound fallSound = Registry.SOUNDS.get(NamespacedKey.minecraft(fallbackSound.toLowerCase(Locale.ROOT))); - if (sound == null) return Sound.ENTITY_FIREWORK_ROCKET_BLAST; - return fallSound; + NamespacedKey parseSound(@NonNull String soundName, @NonNull String fallbackSound) { + NamespacedKey key = NamespacedKey.minecraft(soundName.toLowerCase()); + if (Registry.SOUNDS.get(key) != null) return key; + logger.warning("Sound " + soundName + " is invalid, falling back to " + fallbackSound); + return NamespacedKey.minecraft(fallbackSound.toLowerCase()); } } \ No newline at end of file diff --git a/advanced-achievements-plugin/src/test/java/com/hm/achievement/utils/SoundPlayerTest.java b/advanced-achievements-plugin/src/test/java/com/hm/achievement/utils/SoundPlayerTest.java index eabdb694..71959e52 100644 --- a/advanced-achievements-plugin/src/test/java/com/hm/achievement/utils/SoundPlayerTest.java +++ b/advanced-achievements-plugin/src/test/java/com/hm/achievement/utils/SoundPlayerTest.java @@ -2,15 +2,16 @@ import java.util.logging.Logger; import org.bukkit.Location; -import org.bukkit.Sound; +import org.bukkit.NamespacedKey; import org.bukkit.entity.Player; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -31,23 +32,21 @@ void setUp() { when(player.getLocation()).thenReturn(location); } - @Disabled("Cannot fix right now") @Test void shouldUseProvidedSoundIfValid() { - SoundPlayer underTest = new SoundPlayer(logger); - + SoundPlayer underTest = spy(new SoundPlayer(logger)); + NamespacedKey key = NamespacedKey.minecraft("entity_firework_rocket_blast"); + doReturn(key).when(underTest).parseSound("ENTITY_FIREWORK_ROCKET_BLAST", "SOME_FALLBACK"); underTest.play(player, "ENTITY_FIREWORK_ROCKET_BLAST", "SOME_FALLBACK"); - - verify(player).playSound(location, Sound.ENTITY_FIREWORK_ROCKET_BLAST, 1.0f, 0.7f); + verify(player).playSound(location, "minecraft:entity_firework_rocket_blast", 1.0f, 0.7f); } - @Disabled("Cannot fix right now") @Test void shouldUseFallbackSoundIfProvidedInvalid() { - SoundPlayer underTest = new SoundPlayer(logger); - + SoundPlayer underTest = spy(new SoundPlayer(logger)); + NamespacedKey key = NamespacedKey.minecraft("entity_firework_rocket_blast"); + doReturn(key).when(underTest).parseSound("INVALID", "ENTITY_FIREWORK_ROCKET_BLAST"); underTest.play(player, "INVALID", "ENTITY_FIREWORK_ROCKET_BLAST"); - - verify(player).playSound(location, Sound.ENTITY_FIREWORK_ROCKET_BLAST, 1.0f, 0.7f); + verify(player).playSound(location, "minecraft:entity_firework_rocket_blast", 1.0f, 0.7f); } } \ No newline at end of file From ee85c7093e8992ae3f579652d46406508c4471c3 Mon Sep 17 00:00:00 2001 From: Greymagic27 Date: Mon, 20 Apr 2026 18:45:33 +0100 Subject: [PATCH 58/58] Fix #172 --- .../com/hm/achievement/command/executable/BookCommand.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/BookCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/BookCommand.java index 506f4182..131f9a1b 100644 --- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/BookCommand.java +++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/BookCommand.java @@ -20,7 +20,7 @@ import java.util.Objects; import java.util.UUID; import net.kyori.adventure.text.Component; -import org.apache.commons.lang3.StringUtils; +import net.kyori.adventure.text.TextReplacementConfig; import org.bukkit.Material; import org.bukkit.Particle; import org.bukkit.command.CommandSender; @@ -145,7 +145,7 @@ private void fillBook(@NonNull List achievements, Player p bookMeta.addPages(bookPages.toArray(new Component[0])); bookMeta.setAuthor(player.getName()); bookMeta.setTitle(langBookName); - bookMeta.lore(Collections.singletonList(Component.text(StringUtils.replaceEach(String.valueOf(langBookDate), new String[]{"DATE"}, new String[]{dateFormat.format(System.currentTimeMillis())})))); + bookMeta.lore(Collections.singletonList(langBookDate.replaceText(TextReplacementConfig.builder().matchLiteral("DATE").replacement(dateFormat.format(System.currentTimeMillis())).build()))); book.setItemMeta(bookMeta); // Check whether player has room in his inventory, else drop book on the ground.