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
-## :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.