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
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/README.md b/README.md
index 091bd679..76e562fd 100644
--- a/README.md
+++ b/README.md
@@ -10,7 +10,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.2, and removing deprecated ChatColor methods in favour of Adventure Components.
**Advanced Achievements enables unique and challenging achievements on Minecraft servers. Collect as many as you can,
earn rewards, climb the rankings and receive RP books! The plugin supports SQLite, MySQL, H2 and PostgreSQL, manages an
@@ -26,23 +26,22 @@ releases page here on GitHub by the way, but here it is.)
-## :star: Support and feedback
+## ⭐ Support and feedback
-Thought of a cool idea? Found a problem or need some help? Simply open an [**issue
-**](https://github.com/mrfdev/advanced-achievements/issues)!
+Thought of a cool idea? Found a problem or need some help? Simply open an [**issue**](https://github.com/mrfdev/advanced-achievements/issues)!
Find the project useful, fun or interesting? **Star** the repository by clicking on the icon on the top right of this
page!
-## :computer: Code contributions
+## 🖥️ Code contributions
Want to make Advanced Achievements better, faster, stronger? Contributions are welcome, open a **pull request** and
share your code! Simply **fork** the repository by clicking on the icon on the top right of this page to get started.
-## :balance_scale: License
+## ⚖️ License
GNU General Public License v3.0
-## Special credits
+## 📜 Special credits
Pierre-Yves Bigourdan, [@PyvesB](https://github.com/PyvesB/)
diff --git a/advanced-achievements-api/src/main/java/com/hm/achievement/domain/Reward.java b/advanced-achievements-api/src/main/java/com/hm/achievement/domain/Reward.java
index 3ec4c4fd..98bc6f39 100644
--- a/advanced-achievements-api/src/main/java/com/hm/achievement/domain/Reward.java
+++ b/advanced-achievements-api/src/main/java/com/hm/achievement/domain/Reward.java
@@ -2,9 +2,8 @@
import java.util.List;
import java.util.function.Consumer;
+import net.kyori.adventure.text.Component;
import org.bukkit.entity.Player;
-public record Reward(List listTexts, List chatTexts, Consumer rewarder) {
-
-
+public record Reward(List listTexts, List chatTexts, Consumer rewarder) {
}
diff --git a/advanced-achievements-plugin/pom.xml b/advanced-achievements-plugin/pom.xml
index 60fd3a1c..78abc183 100644
--- a/advanced-achievements-plugin/pom.xml
+++ b/advanced-achievements-plugin/pom.xml
@@ -52,7 +52,6 @@
petmaster
provided
-
com.github.Zrips
CMI-API
@@ -163,7 +162,7 @@
- advanced-achievements-plugin-${project.version}
+ advanced-achievements-${project.version}
true
false
${project.build.directory}/${project.build.finalName}.jar
@@ -197,6 +196,10 @@
com.hm.fasterxml.jackson
+
+
+
+
package
diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/AdvancedAchievements.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/AdvancedAchievements.java
index b2dba459..0bd33e9d 100644
--- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/AdvancedAchievements.java
+++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/AdvancedAchievements.java
@@ -19,14 +19,7 @@
import org.bukkit.plugin.java.JavaPlugin;
@Singleton
-@Component(modules = {
- CleanableModule.class,
- CommandModule.class,
- ConfigModule.class,
- DatabaseModule.class,
- ReloadableModule.class,
- ServerVersionModule.class
-})
+@Component(modules = {CleanableModule.class, CommandModule.class, ConfigModule.class, DatabaseModule.class, ReloadableModule.class, ServerVersionModule.class})
interface AdvancedAchievementsComponent {
PluginLoader pluginLoader();
@@ -64,8 +57,7 @@ public void onEnable() {
long startTime = System.currentTimeMillis();
// DaggerAdvancedAchievementsComponent is generated by Dagger. Add target/generated-sources/annotations to your
// build path if the IDE complains here. In any case this will not actually prevent you from compiling.
- AdvancedAchievementsComponent advancedAchievementsComponent = DaggerAdvancedAchievementsComponent.builder()
- .advancedAchievements(this).logger(getLogger()).build();
+ AdvancedAchievementsComponent advancedAchievementsComponent = DaggerAdvancedAchievementsComponent.builder().advancedAchievements(this).logger(getLogger()).build();
pluginLoader = advancedAchievementsComponent.pluginLoader();
advancedAchievementsAPI = advancedAchievementsComponent.advancedAchievementsBukkitAPI();
@@ -73,14 +65,11 @@ public void onEnable() {
try {
pluginLoader.loadAdvancedAchievements();
} catch (PluginLoadError e) {
- getLogger().log(Level.SEVERE,
- "A non recoverable error was encountered while loading the plugin, disabling it:", e);
+ getLogger().log(Level.SEVERE, "A non recoverable error was encountered while loading the plugin, disabling it:", e);
Bukkit.getPluginManager().disablePlugin(this);
return;
}
-
- getLogger().info(
- "Plugin has finished loading and is ready to run! Took " + (System.currentTimeMillis() - startTime) + "ms.");
+ getLogger().info("Plugin has finished loading and is ready to run! Took " + (System.currentTimeMillis() - startTime) + "ms.");
}
@Override
@@ -88,6 +77,7 @@ public void onDisable() {
pluginLoader.disableAdvancedAchievements();
}
+ @SuppressWarnings("unused")
public AdvancedAchievementsAPI getAdvancedAchievementsAPI() {
return advancedAchievementsAPI;
}
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..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,9 +1,11 @@
package com.hm.achievement.command.executable;
+import com.hm.achievement.config.PluginHeader;
import com.hm.achievement.lifecycle.Reloadable;
-import org.bukkit.ChatColor;
+import net.kyori.adventure.text.Component;
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.
@@ -14,11 +16,11 @@ public abstract class AbstractCommand implements Reloadable {
final YamlConfiguration mainConfig;
final YamlConfiguration langConfig;
- final StringBuilder pluginHeader;
+ final PluginHeader pluginHeader;
private String langNoPermissions;
- AbstractCommand(YamlConfiguration mainConfig, YamlConfiguration langConfig, StringBuilder pluginHeader) {
+ AbstractCommand(YamlConfiguration mainConfig, YamlConfiguration langConfig, PluginHeader pluginHeader) {
this.mainConfig = mainConfig;
this.langConfig = langConfig;
this.pluginHeader = pluginHeader;
@@ -53,7 +55,12 @@ public void execute(CommandSender sender, String[] args) {
*/
abstract void onExecute(CommandSender sender, String[] args);
- String translateColorCodes(String translate) {
- return ChatColor.translateAlternateColorCodes('&', 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/AbstractParsableCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractParsableCommand.java
index 05af0862..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,6 +1,7 @@
package com.hm.achievement.command.executable;
import com.hm.achievement.command.external.CommandUtils;
+import com.hm.achievement.config.PluginHeader;
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, 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 c28bf8c7..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
@@ -1,7 +1,9 @@
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;
import com.hm.achievement.utils.StringHelper;
import java.util.ArrayList;
@@ -11,13 +13,15 @@
import java.util.Objects;
import java.util.UUID;
import java.util.logging.Logger;
+import net.kyori.adventure.text.Component;
+import net.kyori.adventure.text.format.NamedTextColor;
import org.apache.commons.lang3.math.NumberUtils;
import org.bukkit.Bukkit;
-import org.bukkit.ChatColor;
import org.bukkit.Particle;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
+import org.jspecify.annotations.NonNull;
/**
* Abstract class in charge of factoring out common functionality for /aach top, week and month commands.
@@ -39,21 +43,20 @@ 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;
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;
private long lastCacheUpdate = 0L;
- AbstractRankingCommand(YamlConfiguration mainConfig, YamlConfiguration langConfig, StringBuilder 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;
@@ -64,16 +67,15 @@ public abstract class AbstractRankingCommand extends AbstractCommand {
@Override
public void extractConfigurationParameters() {
super.extractConfigurationParameters();
-
- configColor = ChatColor.getByChar(Objects.requireNonNull(mainConfig.getString("Color")));
+ configColor = ColorHelper.configColor(mainConfig);
configTopList = mainConfig.getInt("TopList");
configAdditionalEffects = mainConfig.getBoolean("AdditionalEffects");
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
@@ -87,7 +89,7 @@ public void onExecute(CommandSender sender, String[] args) {
sender.sendMessage(langPeriodAchievement);
- List rankingMessages = getRankingMessages(sender);
+ List rankingMessages = getRankingMessages(sender);
// If config has top set at less than one page, don't use pagination.
if (configTopList < PER_PAGE) {
@@ -110,34 +112,27 @@ 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.append(Component.text(playerRank)).color(NamedTextColor.GRAY).append(Component.text("/").append(Component.text(cachedSortedRankings.size()))).color(NamedTextColor.GRAY));
}
}
}
- private int getPage(String[] args) {
+ private int getPage(String @NonNull [] args) {
return args.length > 1 && NumberUtils.isDigits(args[1]) ? Integer.parseInt(args[1]) : 1;
}
- private List getRankingMessages(CommandSender sender) {
- List rankingMessages = new ArrayList<>();
+ private @NonNull List getRankingMessages(CommandSender sender) {
+ List rankingMessages = new ArrayList<>();
int currentRank = 1;
for (Entry ranking : cachedSortedRankings.entrySet()) {
String playerName = Bukkit.getOfflinePlayer(UUID.fromString(ranking.getKey())).getName();
if (playerName != null) {
- // Color the name of the player if he is in the top list.
- ChatColor color = playerName.equals(sender.getName()) ? configColor : ChatColor.GRAY;
- rankingMessages.add(color + " " + getRankingSymbol(currentRank) + " " + playerName + " - "
- + ranking.getValue());
- } else {
- logger.warning("Ranking command: could not find player's name using a database UUID.");
- }
-
+ // Colour the name of the player if he is in the top list.
+ NamedTextColor color = playerName.equals(sender.getName()) ? configColor : NamedTextColor.GRAY;
+ rankingMessages.add(Component.text(" " + getRankingSymbol(currentRank) + " " + playerName + " - " + ranking.getValue()).color(color));
+ } else logger.warning("Ranking command: could not find player's name using a database UUID.");
++currentRank;
- if (currentRank > configTopList) {
- break;
- }
+ if (currentRank > configTopList) break;
}
return rankingMessages;
}
@@ -145,8 +140,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,15 +167,10 @@ 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) {
- player.spawnParticle(Particle.PORTAL, player.getLocation(), 100, 0, 1, 0, 0.5f);
- }
-
- if (configSound) {
- soundPlayer.play(player, configSoundRanking, "ENTITY_FIREWORK_ROCKET_BLAST");
- }
+ if (configAdditionalEffects) player.spawnParticle(Particle.PORTAL, player.getLocation(), 100, 0, 1, 0, 0.5f);
+ if (configSound) soundPlayer.play(player, configSoundRanking, "ENTITY_FIREWORK_ROCKET_BLAST");
}
}
diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AddCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AddCommand.java
index 591fd547..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;
@@ -10,14 +11,17 @@
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;
+import net.kyori.adventure.text.Component;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
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.
@@ -34,14 +38,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,
- StringBuilder 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;
@@ -53,15 +55,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.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
- 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;
}
@@ -89,11 +91,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 11134734..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
@@ -1,16 +1,16 @@
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;
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;
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 +19,8 @@
import java.util.Locale;
import java.util.Objects;
import java.util.UUID;
-import java.util.logging.Logger;
import net.kyori.adventure.text.Component;
-import org.apache.commons.lang3.StringUtils;
-import org.bukkit.Bukkit;
+import net.kyori.adventure.text.TextReplacementConfig;
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;
@@ -64,18 +53,16 @@ public class BookCommand extends AbstractCommand implements Cleanable {
private boolean configAdditionalEffects;
private boolean configSound;
private String configSoundBook;
- private String langBookDelay;
- private String langBookNotReceived;
- private String langBookDate;
+ private Component langBookDelay;
+ private Component langBookNotReceived;
+ private Component langBookDate;
private String langBookName;
- private String langBookReceived;
+ private Component 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, PluginHeader 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;
@@ -90,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");
- langBookDate = translateColorCodes("&8" + langConfig.getString("book-date"));
+ 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)));
@@ -137,29 +125,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(ColorHelper.convertAmpersandToComponent(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(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.
@@ -175,10 +161,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 +177,4 @@ private boolean isInCooldownPeriod(Player player) {
}
return true;
}
-
- /**
- * Adds pages to the BookMeta. A Spigot commit in the late days of Minecraft
- * 1.11.2 started enforcing extremely low
- * limits (why? If it's not broken, don't fix it.), with books limited in page
- * size and total number of pages, as
- * well as title length. This function bypasses such limits and restores the
- * original CraftBukkit behaviour. See
- * ...
- * for more information.
- *
- * @param bookPages
- * @param bookMeta
- */
- @SuppressWarnings({"unchecked", "deprecation"})
- private void setBookPages(List bookPages, BookMeta bookMeta) {
- if (serverVersion <= 15) {
- try {
- // Code we're trying to execute:
- // this.pages.add(CraftChatMessage.fromString(page, true)[0]); in
- // CraftMetaBook.java.
- String versionIdentifier = Bukkit.getServer().getClass().getPackage().getName().substring(23);
- Class> craftMetaBookClass = Class.forName("org.bukkit.craftbukkit." + versionIdentifier + "." + PACKAGE_INVENTORY + "." + CLASS_CRAFT_META_BOOK);
- List pages = (List) craftMetaBookClass.getField(FIELD_PAGES).get(craftMetaBookClass.cast(bookMeta));
- Method fromStringMethod = Class.forName("org.bukkit.craftbukkit." + versionIdentifier + "." + PACKAGE_UTIL + "." + CLASS_CRAFT_CHAT_MESSAGE).getMethod(METHOD_FROM_STRING, String.class, boolean.class);
- for (String bookPage : bookPages) {
- pages.add(((Object[]) fromStringMethod.invoke(null, bookPage, true))[0]);
- }
- } catch (ClassNotFoundException | InvocationTargetException | SecurityException | NoSuchMethodException |
- NoSuchFieldException | IllegalArgumentException | IllegalAccessException e) {
- logger.warning("Error while creating book pages. Your achievements book may be trimmed down to 50 pages.");
- bookMeta.setPages(bookPages);
- }
- } else {
- bookMeta.setPages(bookPages);
- }
- }
-}
+}
\ No newline at end of file
diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/CheckCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/CheckCommand.java
index 8cf25e15..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,13 +1,16 @@
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;
import jakarta.inject.Singleton;
-import org.apache.commons.lang3.StringUtils;
+import java.util.Objects;
+import net.kyori.adventure.text.Component;
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.
@@ -20,12 +23,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,
- StringBuilder pluginHeader, CacheManager cacheManager) {
+ public CheckCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, PluginHeader pluginHeader, CacheManager cacheManager) {
super(mainConfig, langConfig, pluginHeader);
this.cacheManager = cacheManager;
}
@@ -33,22 +35,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.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
- 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 a4c73688..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,14 +1,15 @@
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;
import jakarta.inject.Named;
import jakarta.inject.Singleton;
import java.util.Collections;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.Strings;
+import java.util.Objects;
+import net.kyori.adventure.text.Component;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
@@ -28,14 +29,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,
- StringBuilder 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;
@@ -46,9 +45,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.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
@@ -58,16 +57,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 19bc3e3c..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,9 +1,12 @@
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;
+import java.util.Objects;
+import net.kyori.adventure.text.Component;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.YamlConfiguration;
@@ -19,11 +22,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,
- StringBuilder pluginHeader, AdvancementManager advancementManager) {
+ public GenerateCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, PluginHeader pluginHeader, AdvancementManager advancementManager) {
super(mainConfig, langConfig, pluginHeader);
this.advancementManager = advancementManager;
}
@@ -31,14 +33,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.get()).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 af5ede4d..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;
@@ -9,9 +10,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 org.apache.commons.lang3.StringUtils;
+import net.kyori.adventure.text.Component;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.YamlConfiguration;
@@ -30,14 +32,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,
- StringBuilder 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,26 +50,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.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
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;
}
@@ -77,9 +75,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 83db9437..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;
@@ -9,10 +10,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 org.apache.commons.lang3.StringUtils;
+import net.kyori.adventure.text.Component;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.YamlConfiguration;
@@ -25,15 +27,15 @@ 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, StringBuilder 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;
@@ -43,12 +45,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.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
@@ -75,9 +77,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;
}
@@ -86,18 +88,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 85f779b1..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
@@ -1,12 +1,17 @@
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;
import jakarta.inject.Inject;
import jakarta.inject.Named;
import jakarta.inject.Singleton;
import java.util.Objects;
-import org.bukkit.ChatColor;
+import net.kyori.adventure.text.Component;
+import net.kyori.adventure.text.TextComponent;
+import net.kyori.adventure.text.format.NamedTextColor;
+import net.kyori.adventure.text.format.TextDecoration;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
@@ -23,47 +28,47 @@ public class HelpCommand extends AbstractCommand {
private final FancyMessageSender fancyMessageSender;
- private ChatColor configColor;
+ private NamedTextColor configColor;
private String configIcon;
- private String langCommandList;
- private String langCommandListHover;
- private String langCommandTop;
- private String langCommandTopHover;
- private String langCommandInfo;
- private String langCommandInfoHover;
- private String langCommandBook;
- private String langCommandBookHover;
- private String langCommandWeek;
- private String langCommandWeekHover;
- private String langCommandStats;
- private String langCommandStatsHover;
- private String langCommandMonth;
- private String langCommandMonthHover;
- private String langCommandToggleHover;
- private String langCommandToggle;
- private String langCommandReload;
- private String langCommandReloadHover;
- private String langCommandGenerate;
- private String langCommandGenerateHover;
- private String langCommandInspect;
- private String langCommandInspectHover;
- private String langCommandGive;
- private String langCommandGiveHover;
- private String langCommandAdd;
- private String langCommandAddHover;
- private String langCommandReset;
- private String langCommandResetHover;
- private String langCommandCheck;
- private String langCommandCheckHover;
- private String langCommandDelete;
- private String langCommandDeleteHover;
- private String langCommandGrant;
- private String langCommandGrantHover;
- private String langTip;
+ private 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, StringBuilder pluginHeader, FancyMessageSender fancyMessageSender) {
+ public HelpCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, PluginHeader pluginHeader, FancyMessageSender fancyMessageSender) {
super(mainConfig, langConfig, pluginHeader);
this.fancyMessageSender = fancyMessageSender;
}
@@ -71,126 +76,105 @@ public HelpCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") Y
@Override
public void extractConfigurationParameters() {
super.extractConfigurationParameters();
-
- configColor = ChatColor.getByChar(Objects.requireNonNull(mainConfig.getString("Color")));
+ configColor = ColorHelper.configColor(mainConfig);
configIcon = StringHelper.unescapeJava(mainConfig.getString("Icon"));
- langCommandList = header("/aach list") + langConfig.getString("aach-command-list");
- langCommandListHover = langConfig.getString("aach-command-list-hover");
- langCommandTop = header("/aach top") + langConfig.getString("aach-command-top");
- langCommandTopHover = langConfig.getString("aach-command-top-hover");
- langCommandInfo = header("/aach info") + langConfig.getString("aach-command-info");
- langCommandInfoHover = langConfig.getString("aach-command-info-hover");
- langCommandBook = header("/aach book") + langConfig.getString("aach-command-book");
- langCommandBookHover = langConfig.getString("aach-command-book-hover");
- langCommandWeek = header("/aach week") + langConfig.getString("aach-command-week");
- langCommandWeekHover = langConfig.getString("aach-command-week-hover");
- langCommandStats = header("/aach stats") + langConfig.getString("aach-command-stats");
- langCommandStatsHover = langConfig.getString("aach-command-stats-hover");
- langCommandMonth = header("/aach month") + langConfig.getString("aach-command-month");
- langCommandMonthHover = langConfig.getString("aach-command-month-hover");
- langCommandToggle = header("/aach toggle") + langConfig.getString("aach-command-toggle");
- langCommandToggleHover = langConfig.getString("aach-command-toggle-hover");
- langCommandReload = header("/aach reload") + langConfig.getString("aach-command-reload");
- langCommandReloadHover = langConfig.getString("aach-command-reload-hover");
- langCommandGenerate = header("/aach generate") + langConfig.getString("aach-command-generate");
- langCommandGenerateHover = langConfig.getString("aach-command-generate-hover");
- langCommandGive = header("/aach give player") + langConfig.getString("aach-command-give");
- langCommandInspect = header("/aach inspect") + langConfig.getString("aach-command-inspect");
- langCommandInspectHover = langConfig.getString("aach-command-inspect-hover");
- langCommandGiveHover = langConfig.getString("aach-command-give-hover");
- langCommandAdd = header("/aach add 1 cat player") + langConfig.getString("aach-command-add");
- langCommandAddHover = langConfig.getString("aach-command-add-hover");
- langCommandReset = header("/aach reset cat player") + langConfig.getString("aach-command-reset");
- langCommandResetHover = langConfig.getString("aach-command-reset-hover");
- langCommandCheck = header("/aach check cat player") + langConfig.getString("aach-command-check");
- langCommandCheckHover = langConfig.getString("aach-command-check-hover");
- langCommandDelete = header("/aach delete cat player") + langConfig.getString("aach-command-delete");
- langCommandDeleteHover = langConfig.getString("aach-command-delete-hover");
- langCommandGrant = header("/aach grant cat player") + langConfig.getString("aach-command-grant");
- langCommandGrantHover = langConfig.getString("aach-command-grant-hover");
-
- langTip = ChatColor.GRAY + translateColorCodes(langConfig.getString("aach-tip"));
+ langCommandList = header("/aach list").append(Component.text(Objects.requireNonNull(langConfig.getString("aach-command-list"))).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"))).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"))).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"))).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"))).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"))).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"))).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"))).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"))).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"))).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"))).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"))).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"))).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"))).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")))).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"))).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"))).color(NamedTextColor.GRAY));
+ langCommandGrantHover = Component.text(Objects.requireNonNull(langConfig.getString("aach-command-grant-hover")));
+ langTip = ColorHelper.convertAmpersandToComponent(langConfig.getString("aach-tip"));
}
- private @NonNull String header(String command) {
- return pluginHeader.toString() + configColor + command + ChatColor.GRAY + " > ";
+ private @NonNull TextComponent header(String command) {
+ return Component.text().append(pluginHeader.get()).append(Component.text(command).color(configColor)).append(Component.text(" > ").color(NamedTextColor.GRAY)).build();
}
@Override
void onExecute(@NonNull CommandSender sender, String[] args) {
- // Header.
- sender.sendMessage(configColor + "------------ " + configIcon + translateColorCodes(" &lAdvanced Achievements ") + configColor + configIcon + configColor + " ------------");
+ sender.sendMessage(Component.text().append(Component.text("------------ " + configIcon + " ", configColor)).append(Component.text("Advanced Achievements", configColor).decorate(TextDecoration.BOLD)).append(Component.text(" " + configIcon + " ------------", configColor)).build());
if (sender.hasPermission("achievement.list")) {
sendJsonClickableHoverableMessage(sender, langCommandList, "/aach list", langCommandListHover);
}
-
if (sender.hasPermission("achievement.top")) {
sendJsonClickableHoverableMessage(sender, langCommandTop, "/aach top", langCommandTopHover);
}
-
sendJsonClickableHoverableMessage(sender, langCommandInfo, "/aach info", langCommandInfoHover);
-
if (sender.hasPermission("achievement.book")) {
sendJsonClickableHoverableMessage(sender, langCommandBook, "/aach book", langCommandBookHover);
}
-
if (sender.hasPermission("achievement.week")) {
sendJsonClickableHoverableMessage(sender, langCommandWeek, "/aach week", langCommandWeekHover);
}
-
if (sender.hasPermission("achievement.stats")) {
sendJsonClickableHoverableMessage(sender, langCommandStats, "/aach stats", langCommandStatsHover);
}
-
if (sender.hasPermission("achievement.month")) {
sendJsonClickableHoverableMessage(sender, langCommandMonth, "/aach month", langCommandMonthHover);
}
-
if (sender.hasPermission("achievement.toggle")) {
sendJsonClickableHoverableMessage(sender, langCommandToggle, "/aach toggle", langCommandToggleHover);
}
-
if (sender.hasPermission("achievement.reload")) {
sendJsonClickableHoverableMessage(sender, langCommandReload, "/aach reload", langCommandReloadHover);
}
-
if (sender.hasPermission("achievement.generate")) {
sendJsonClickableHoverableMessage(sender, langCommandGenerate, "/aach generate", langCommandGenerateHover);
}
-
if (sender.hasPermission("achievement.inspect")) {
sendJsonClickableHoverableMessage(sender, langCommandInspect, "/aach inspect ach", langCommandInspectHover);
}
-
if (sender.hasPermission("achievement.give")) {
sendJsonClickableHoverableMessage(sender, langCommandGive, "/aach give ach name", langCommandGiveHover);
}
-
if (sender.hasPermission("achievement.add")) {
sendJsonClickableHoverableMessage(sender, langCommandAdd, "/aach add x cat name", langCommandAddHover);
}
-
if (sender.hasPermission("achievement.reset")) {
sendJsonClickableHoverableMessage(sender, langCommandReset, "/aach reset cat name", langCommandResetHover);
}
-
if (sender.hasPermission("achievement.check")) {
sendJsonClickableHoverableMessage(sender, langCommandCheck, "/aach check ach name", langCommandCheckHover);
}
-
if (sender.hasPermission("achievement.delete")) {
sendJsonClickableHoverableMessage(sender, langCommandDelete, "/aach delete ach name", langCommandDeleteHover);
}
-
if (sender.hasPermission("achievement.grant")) {
sendJsonClickableHoverableMessage(sender, langCommandGrant, "/aach grant ach name", langCommandGrantHover);
}
- // Empty line.
- sender.sendMessage(configColor + " ");
-
+ sender.sendMessage(Component.text(" "));
sender.sendMessage(langTip);
}
@@ -198,17 +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
- * @param message
- * @param command
- * @param hover
+ * @param sender sender
+ * @param message message
+ * @param command command
+ * @param hover hover
*/
- private void sendJsonClickableHoverableMessage(CommandSender sender, String message, String command, String hover) {
- // Send clickable and hoverable message if sender is a player.
- if (sender instanceof Player) {
- fancyMessageSender.sendHoverableCommandMessage((Player) sender, message, command, hover, configColor.name().toLowerCase());
- } 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 96f39ecd..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;
@@ -10,7 +11,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;
@@ -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, PluginHeader pluginHeader, AdvancedAchievements advancedAchievements, RewardParser rewardParser) {
super(mainConfig, langConfig, pluginHeader);
this.advancedAchievements = advancedAchievements;
this.rewardParser = rewardParser;
@@ -52,52 +52,47 @@ public InfoCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") Y
public void extractConfigurationParameters() {
super.extractConfigurationParameters();
- NamedTextColor configColor = ColorHelper.parseColor(Objects.requireNonNull(mainConfig.getString("Color")));
+ NamedTextColor configColor = ColorHelper.configColor(mainConfig);
String configIcon = StringHelper.unescapeJava(mainConfig.getString("Icon"));
configDatabaseType = mainConfig.getString("DatabaseType");
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.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(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.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(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.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(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.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(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.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(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.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(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.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(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.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(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.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() {
- 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 +110,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 d251c843..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,10 +3,10 @@
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;
-import com.hm.achievement.utils.StringHelper;
import jakarta.inject.Inject;
import jakarta.inject.Named;
import jakarta.inject.Singleton;
@@ -19,7 +19,7 @@
import java.util.UUID;
import java.util.function.Supplier;
import java.util.stream.Collectors;
-import org.apache.commons.lang3.StringUtils;
+import net.kyori.adventure.text.Component;
import org.apache.commons.lang3.math.NumberUtils;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
@@ -43,17 +43,16 @@ public class InspectCommand extends AbstractCommand {
private final AchievementMap achievementMap;
private final Map lastCached;
- private final Map cachedPaginations;
+ private final Map cachedPagination;
@Inject
- public InspectCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, StringBuilder pluginHeader, AdvancedAchievements advancedAchievements, AbstractDatabaseManager databaseManager, AchievementMap achievementMap) {
+ 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;
this.achievementMap = achievementMap;
-
this.lastCached = new HashMap<>();
- this.cachedPaginations = new HashMap<>();
+ this.cachedPagination = new HashMap<>();
}
@SuppressWarnings("EmptyMethod")
@@ -73,7 +72,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.get()).append(Component.text("You must specify an achievement name")));
return;
}
int page = getPage(args);
@@ -84,7 +83,7 @@ void onExecute(CommandSender sender, String[] args) {
checkAndCache(achievement.getName());
// Send pagination
- SupplierCommandPagination pagination = cachedPaginations.get(achievement.getName());
+ SupplierCommandPagination pagination = cachedPagination.get(achievement.getName());
pagination.sendPage(page, sender);
});
}
@@ -115,7 +114,7 @@ private void cleanUpCache() {
}
}
for (String achievementName : toRemove) {
- cachedPaginations.remove(achievementName);
+ cachedPagination.remove(achievementName);
lastCached.remove(achievementName);
}
@@ -124,18 +123,18 @@ private void cleanUpCache() {
private void checkAndCache(String achievementName) {
if (System.currentTimeMillis() - CACHE_EXPIRATION_DELAY > lastCached.getOrDefault(achievementName, 0L)) {
List recipientList = databaseManager.getAchievementsRecipientList(achievementName);
- List> messages;
- if (recipientList.isEmpty()) messages = List.of(() -> "No one has this achievement yet");
+ List> messages;
+ if (recipientList.isEmpty()) messages = List.of(() -> Component.text("No one has this achievement yet"));
else {
- messages = recipientList.stream().map(achievement -> (Supplier) () -> {
+ messages = recipientList.stream().map(achievement -> (Supplier) () -> {
UUID uuid = achievement.awardedTo();
OfflinePlayer player = advancedAchievements.getServer().getOfflinePlayer(uuid);
String identifier = player.hasPlayedBefore() ? player.getName() : uuid.toString();
- return " " + identifier + " (" + achievement.formattedDate() + ")";
+ return Component.text(" " + identifier + " (" + achievement.formattedDate() + ")");
}).collect(Collectors.toList());
}
SupplierCommandPagination pagination = new SupplierCommandPagination(messages, PER_PAGE, langConfig);
- cachedPaginations.put(achievementName, pagination);
+ cachedPagination.put(achievementName, pagination);
lastCached.put(achievementName, System.currentTimeMillis());
}
}
diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ListCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/ListCommand.java
index a6fae6cd..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;
@@ -13,7 +14,7 @@
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
-import org.apache.commons.lang3.StringUtils;
+import net.kyori.adventure.text.Component;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
@@ -32,11 +33,10 @@ 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,
- StringBuilder 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;
@@ -46,39 +46,27 @@ 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.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("category-does-not-exist")))).build();
}
@Override
void onExecute(CommandSender sender, String[] args) {
- if (!(sender instanceof Player player)) {
- return;
- }
-
+ if (!(sender instanceof Player player)) return;
if (player.isSleeping()) {
sender.sendMessage(Objects.requireNonNull(langConfig.getString("list-unavailable-whilst-sleeping")));
return;
}
-
if (args.length == 1) {
mainGUI.displayMainGUI(player);
} else {
String categoryName = args[1];
- Optional> matchingCategory = guiItems.getOrderedAchievementItems().entrySet()
- .stream()
- .filter(e -> e.getKey().category().toString().equals(categoryName))
- .findFirst();
+ Optional> matchingCategory = guiItems.getOrderedAchievementItems().entrySet().stream().filter(e -> e.getKey().category().toString().equals(categoryName)).findFirst();
if (matchingCategory.isPresent()) {
categoryGUI.displayCategoryGUI(matchingCategory.get().getValue(), player, 0);
} else {
- List allGUICategoryNames = guiItems.getOrderedAchievementItems().keySet()
- .stream()
- .map(c -> c.category().toString())
- .collect(Collectors.toList());
- sender.sendMessage(StringUtils.replaceEach(langCategoryDoesNotExist, new String[]{"CAT", "CLOSEST_MATCH"},
- new String[]{categoryName, StringHelper.getClosestMatch(categoryName, allGUICategoryNames)}));
+ List allGUICategoryNames = guiItems.getOrderedAchievementItems().keySet().stream().map(c -> c.category().toString()).collect(Collectors.toList());
+ sender.sendMessage(replace(langCategoryDoesNotExist, new String[]{"CAT", "CLOSEST_MATCH"}, new String[]{categoryName, StringHelper.getClosestMatch(categoryName, allGUICategoryNames)}));
}
}
}
-}
+}
\ No newline at end of file
diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/MonthCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/MonthCommand.java
index b1cd6f9e..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;
@@ -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, 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 16f3f553..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,9 +1,11 @@
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;
+import com.hm.achievement.utils.ColorHelper;
import dagger.Lazy;
import jakarta.inject.Inject;
import jakarta.inject.Named;
@@ -11,6 +13,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;
@@ -30,13 +33,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,
- StringBuilder 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 = pluginHeader + langConfig.getString("configuration-reload-failed");
- langConfigSuccessfullyReloaded = pluginHeader + langConfig.getString("configuration-successfully-reloaded");
+ 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 c710d51f..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,15 +1,16 @@
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;
import jakarta.inject.Named;
import jakarta.inject.Singleton;
import java.util.Collections;
+import java.util.Objects;
import java.util.Set;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.Strings;
+import net.kyori.adventure.text.Component;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
@@ -29,13 +30,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,
- StringBuilder 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;
@@ -44,10 +44,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.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
@@ -56,15 +55,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 c5068aa7..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
@@ -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, StringBuilder 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;
@@ -53,14 +54,13 @@ public StatsCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang")
@Override
public void extractConfigurationParameters() {
super.extractConfigurationParameters();
-
// Load configuration parameters.
- configColor = ColorHelper.parseColor(mainConfig.getString("Color"));
+ configColor = ColorHelper.configColor(mainConfig);
configIcon = StringHelper.unescapeJava(mainConfig.getString("Icon"));
configAdditionalEffects = mainConfig.getBoolean("AdditionalEffects");
configSound = mainConfig.getBoolean("Sound");
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.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("number-achievements")))).append(Component.text(" ")).build();
}
@Override
@@ -102,18 +102,13 @@ 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.
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 7b4dd789..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;
@@ -7,8 +8,10 @@
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;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
@@ -28,23 +31,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,
- StringBuilder pluginHeader) {
+ public ToggleCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, PluginHeader 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.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();
}
/**
@@ -55,20 +55,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());
@@ -80,10 +74,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/command/executable/TopCommand.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/TopCommand.java
index dd5be739..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,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;
@@ -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, 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 4d3729cc..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;
@@ -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, 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 7fe3a7e5..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;
@@ -26,12 +27,12 @@ public class PluginCommandExecutor implements CommandExecutor, Reloadable {
private final YamlConfiguration langConfig;
private final Set commands;
- private final StringBuilder pluginHeader;
+ private final PluginHeader pluginHeader;
private String langInvalidCommand;
@Inject
- public PluginCommandExecutor(@Named("lang") YamlConfiguration langConfig, Set commands, StringBuilder 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/command/external/CommandUtils.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/external/CommandUtils.java
index 494dde80..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) {
@@ -526,7 +525,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/command/pagination/CommandPagination.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/pagination/CommandPagination.java
index 290f3fac..32ca8cc0 100644
--- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/pagination/CommandPagination.java
+++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/pagination/CommandPagination.java
@@ -1,10 +1,10 @@
package com.hm.achievement.command.pagination;
+import com.hm.achievement.utils.ColorHelper;
import java.util.List;
-import java.util.Objects;
import java.util.function.Consumer;
+import net.kyori.adventure.text.Component;
import org.apache.commons.lang3.StringUtils;
-import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.YamlConfiguration;
import org.jetbrains.annotations.Contract;
@@ -23,14 +23,14 @@
*/
public class CommandPagination {
- private final List toPaginate;
+ private final List toPaginate;
private final YamlConfiguration langConfig;
private final int perPage;
private final int size;
private final int maxPage;
@Contract(pure = true)
- public CommandPagination(@NonNull List toPaginate, int perPage, YamlConfiguration langConfig) {
+ public CommandPagination(@NonNull List toPaginate, int perPage, YamlConfiguration langConfig) {
this.toPaginate = toPaginate;
size = toPaginate.size();
this.perPage = perPage;
@@ -44,16 +44,11 @@ public void sendPage(int page, @NonNull CommandSender to) {
sendPage(page, to::sendMessage);
}
- public void sendPage(int page, @NonNull Consumer to) {
+ public void sendPage(int page, @NonNull Consumer to) {
int pageToSend = Math.min(page, maxPage);
-
- String header = ChatColor.translateAlternateColorCodes('&',
- Objects.requireNonNull(StringUtils.replaceEach(langConfig.getString("pagination-header"), new String[]{"PAGE", "MAX"},
- new String[]{Integer.toString(pageToSend), Integer.toString(maxPage)})));
- String footer = ChatColor.translateAlternateColorCodes('&', Objects.requireNonNull(langConfig.getString("pagination-footer")));
-
+ Component header = ColorHelper.convertAmpersandToComponent(StringUtils.replaceEach(langConfig.getString("pagination-header"), new String[]{"PAGE", "MAX"}, new String[]{Integer.toString(pageToSend), Integer.toString(maxPage)}));
+ Component footer = ColorHelper.convertAmpersandToComponent(langConfig.getString("pagination-footer"));
to.accept(header);
-
int index = pageToSend - 1;
// Handling case where empty list is given to CommandPagination
int pageStart = index > 0 ? (index * perPage) : 0;
@@ -62,7 +57,6 @@ public void sendPage(int page, @NonNull Consumer to) {
for (int i = pageStart; i < Math.min(nextPageStart, size); i++) {
to.accept(toPaginate.get(i));
}
-
to.accept(footer);
}
}
diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/pagination/SupplierCommandPagination.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/pagination/SupplierCommandPagination.java
index 9be4884b..90281c59 100644
--- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/pagination/SupplierCommandPagination.java
+++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/command/pagination/SupplierCommandPagination.java
@@ -1,12 +1,12 @@
package com.hm.achievement.command.pagination;
+import com.hm.achievement.utils.ColorHelper;
import java.util.ArrayList;
import java.util.List;
-import java.util.Objects;
import java.util.function.Consumer;
import java.util.function.Supplier;
+import net.kyori.adventure.text.Component;
import org.apache.commons.lang3.StringUtils;
-import org.bukkit.ChatColor;
import org.bukkit.configuration.file.YamlConfiguration;
import org.jspecify.annotations.NonNull;
@@ -23,13 +23,13 @@
*/
public class SupplierCommandPagination extends CommandPagination {
- private final List> toPaginate;
+ private final List> toPaginate;
private final YamlConfiguration langConfig;
private final int perPage;
private final int size;
private final int maxPage;
- public SupplierCommandPagination(@NonNull List> toPaginate, int perPage, YamlConfiguration langConfig) {
+ public SupplierCommandPagination(@NonNull List> toPaginate, int perPage, YamlConfiguration langConfig) {
super(new ArrayList<>(), perPage, langConfig);
this.toPaginate = toPaginate;
size = toPaginate.size();
@@ -45,23 +45,16 @@ public boolean isEmpty() {
}
@Override
- public void sendPage(int page, @NonNull Consumer to) {
+ public void sendPage(int page, @NonNull Consumer to) {
int pageToSend = Math.min(page, maxPage);
-
- String header = ChatColor.translateAlternateColorCodes('&', Objects.requireNonNull(StringUtils.replaceEach(langConfig.getString("pagination-header"), new String[]{"PAGE", "MAX"}, new String[]{Integer.toString(pageToSend), Integer.toString(maxPage)})));
- String footer = ChatColor.translateAlternateColorCodes('&', Objects.requireNonNull(langConfig.getString("pagination-footer")));
-
+ Component header = ColorHelper.convertAmpersandToComponent(StringUtils.replaceEach(langConfig.getString("pagination-header"), new String[]{"PAGE", "MAX"}, new String[]{Integer.toString(pageToSend), Integer.toString(maxPage)}));
+ Component footer = ColorHelper.convertAmpersandToComponent(langConfig.getString("pagination-footer"));
to.accept(header);
-
int index = pageToSend - 1;
// Handling case where empty list is given to CommandPagination
int pageStart = index > 0 ? (index * perPage) : 0;
int nextPageStart = pageToSend * perPage;
-
- for (int i = pageStart; i < Math.min(nextPageStart, size); i++) {
- to.accept(toPaginate.get(i).get());
- }
-
+ for (int i = pageStart; i < Math.min(nextPageStart, size); i++) to.accept(toPaginate.get(i).get());
to.accept(footer);
}
}
diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/config/ConfigurationParser.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/config/ConfigurationParser.java
index 4ccfe69a..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
@@ -8,6 +8,7 @@
import com.hm.achievement.domain.Achievement;
import com.hm.achievement.domain.Achievement.AchievementBuilder;
import com.hm.achievement.exception.PluginLoadError;
+import com.hm.achievement.utils.ColorHelper;
import com.hm.achievement.utils.StringHelper;
import jakarta.inject.Inject;
import jakarta.inject.Named;
@@ -25,10 +26,10 @@
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
+import net.kyori.adventure.text.Component;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.Strings;
import org.bukkit.Bukkit;
-import org.bukkit.ChatColor;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.YamlConfiguration;
@@ -141,8 +142,10 @@ private void parseHeader() {
pluginHeader.setLength(0);
String icon = StringHelper.unescapeJava(mainConfig.getString("Icon"));
if (StringUtils.isNotBlank(icon)) {
- String coloredIcon = ChatColor.getByChar(Objects.requireNonNull(mainConfig.getString("Color"))) + icon;
- pluginHeader.append(ChatColor.translateAlternateColorCodes('&', Objects.requireNonNull(Strings.CS.replace(mainConfig.getString("ChatHeader"), "%ICON%", coloredIcon)))).append(" ");
+ String coloredIcon = StringHelper.componentToLegacySection(Component.text(icon, ColorHelper.configColor(mainConfig)));
+ String rawHeader = Strings.CS.replace(mainConfig.getString("ChatHeader"), "%ICON%", coloredIcon);
+ 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/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/config/RewardParser.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/config/RewardParser.java
index 0bd9c0a2..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
@@ -22,11 +22,9 @@
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;
-import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.Registry;
@@ -110,7 +108,7 @@ public List parseRewards(String path) {
int amount = configSection.getInt("Money");
String currencyName = amount > 1 ? economy.currencyNamePlural() : economy.currencyNameSingular();
String listText = StringUtils.replaceEach(langConfig.getString("list-reward-money"), new String[]{"AMOUNT"}, new String[]{amount + " " + currencyName});
- String chatText = ChatColor.translateAlternateColorCodes('&', Objects.requireNonNull(StringUtils.replaceEach(langConfig.getString("money-reward-received"), new String[]{"AMOUNT"}, new String[]{amount + " " + currencyName})));
+ Component chatText = Component.text(Objects.requireNonNull(StringUtils.replaceEach(langConfig.getString("money-reward-received"), new String[]{"AMOUNT"}, new String[]{amount + " " + currencyName})));
Consumer rewarder = player -> economy.depositPlayer(player, amount);
return new Reward(Collections.singletonList(listText), Collections.singletonList(chatText), rewarder);
}
@@ -118,7 +116,7 @@ public List parseRewards(String path) {
@Contract("_ -> new")
private @NonNull Reward parseItemReward(@NonNull ConfigurationSection configSection) {
List listTexts = new ArrayList<>();
- List chatTexts = new ArrayList<>();
+ List chatTexts = new ArrayList<>();
List itemStacks = new ArrayList<>();
String itemPath = configSection.contains("Item") ? "Item" : "Items";
for (String item : getOneOrManyConfigStrings(configSection, itemPath)) {
@@ -152,12 +150,11 @@ 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}));
- chatTexts.add(StringUtils.replaceEach(langConfig.getString("item-reward-received"), new String[]{"AMOUNT", "ITEM"}, new String[]{Integer.toString(amount), name}));
+ chatTexts.add(Component.text(Objects.requireNonNull(StringUtils.replaceEach(langConfig.getString("item-reward-received"), new String[]{"AMOUNT", "ITEM"}, new String[]{Integer.toString(amount), name}))));
itemStacks.add(itemStack);
}
}
@@ -166,8 +163,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);
@@ -179,7 +175,7 @@ public List parseRewards(String path) {
private @NonNull Reward parseExperienceReward(@NonNull ConfigurationSection configSection) {
int amount = configSection.getInt("Experience");
String listText = StringUtils.replaceEach(langConfig.getString("list-reward-experience"), new String[]{"AMOUNT"}, new String[]{Integer.toString(amount)});
- String chatText = ChatColor.translateAlternateColorCodes('&', Objects.requireNonNull(StringUtils.replaceEach(langConfig.getString("experience-reward-received"), new String[]{"AMOUNT"}, new String[]{Integer.toString(amount)})));
+ Component chatText = Component.text(Objects.requireNonNull(StringUtils.replaceEach(langConfig.getString("experience-reward-received"), new String[]{"AMOUNT"}, new String[]{Integer.toString(amount)})));
Consumer rewarder = player -> player.giveExp(amount);
return new Reward(Collections.singletonList(listText), Collections.singletonList(chatText), rewarder);
}
@@ -187,7 +183,7 @@ public List parseRewards(String path) {
private @NonNull Reward parseIncreaseMaxHealthReward(@NonNull ConfigurationSection configSection) {
int amount = configSection.getInt("IncreaseMaxHealth");
String listText = StringUtils.replaceEach(langConfig.getString("list-reward-increase-max-health"), new String[]{"AMOUNT"}, new String[]{Integer.toString(amount)});
- String chatText = ChatColor.translateAlternateColorCodes('&', Objects.requireNonNull(StringUtils.replaceEach(langConfig.getString("increase-max-health-reward-received"), new String[]{"AMOUNT"}, new String[]{Integer.toString(amount)})));
+ Component chatText = Component.text(Objects.requireNonNull(StringUtils.replaceEach(langConfig.getString("increase-max-health-reward-received"), new String[]{"AMOUNT"}, new String[]{Integer.toString(amount)})));
Consumer rewarder = player -> {
AttributeInstance playerAttribute = player.getAttribute(Attribute.MAX_HEALTH);
Objects.requireNonNull(playerAttribute).setBaseValue(playerAttribute.getBaseValue() + amount);
@@ -198,7 +194,7 @@ public List parseRewards(String path) {
private @NonNull Reward parseIncreaseMaxOxygenReward(@NonNull ConfigurationSection configSection) {
int amount = configSection.getInt("IncreaseMaxOxygen");
String listText = StringUtils.replaceEach(langConfig.getString("list-reward-increase-max-oxygen"), new String[]{"AMOUNT"}, new String[]{Integer.toString(amount)});
- String chatText = ChatColor.translateAlternateColorCodes('&', Objects.requireNonNull(StringUtils.replaceEach(langConfig.getString("increase-max-oxygen-reward-received"), new String[]{"AMOUNT"}, new String[]{Integer.toString(amount)})));
+ Component chatText = Component.text(Objects.requireNonNull(StringUtils.replaceEach(langConfig.getString("increase-max-oxygen-reward-received"), new String[]{"AMOUNT"}, new String[]{Integer.toString(amount)})));
Consumer rewarder = player -> player.setMaximumAir(player.getMaximumAir() + amount);
return new Reward(Collections.singletonList(listText), Collections.singletonList(chatText), rewarder);
}
@@ -206,27 +202,19 @@ public List parseRewards(String path) {
private @NonNull Reward parseCommandReward(@NonNull ConfigurationSection configSection) {
String displayPath = configSection.contains("Command") ? "Command.Display" : "Commands.Display";
List listTexts = getOneOrManyConfigStrings(configSection, displayPath);
- List chatTexts = listTexts.stream().map(message -> StringUtils.replaceEach(langConfig.getString("custom-command-reward"), new String[]{"MESSAGE"}, new String[]{message})).collect(Collectors.toList());
+ List chatTexts = listTexts.stream().map(message -> Component.text(Objects.requireNonNull(StringUtils.replaceEach(langConfig.getString("custom-command-reward"), new String[]{"MESSAGE"}, new String[]{message})))).collect(Collectors.toList());
String executePath = configSection.contains("Command") ? "Command.Execute" : "Commands.Execute";
Consumer rewarder = player -> getOneOrManyConfigStrings(configSection, executePath).forEach(command -> {
- Component component = StringHelper.replacePlayerPlaceholders(command, player);
- 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);
}
private List getOneOrManyConfigStrings(@NonNull ConfigurationSection configSection, String path) {
- if (configSection.isList(path)) {
- // Real YAML list.
- return configSection.getStringList(path);
- }
+ if (configSection.isList(path)) return configSection.getStringList(path);
String configString = configSection.getString(path);
- if (configString != null) {
- // Either a list of strings separate by "; " (old configuration style), or a single string.
- return Arrays.asList(MULTIPLE_REWARDS_SPLITTER.split(StringUtils.normalizeSpace(configString)));
- }
+ if (configString != null) return Arrays.asList(MULTIPLE_REWARDS_SPLITTER.split(StringUtils.normalizeSpace(configString)));
return Collections.emptyList();
}
-
-}
+}
\ No newline at end of file
diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/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/gui/CategoryGUI.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/CategoryGUI.java
index 58180a16..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
@@ -9,7 +9,7 @@
import com.hm.achievement.domain.Achievement;
import com.hm.achievement.domain.Reward;
import com.hm.achievement.lifecycle.Reloadable;
-import com.hm.achievement.utils.NumberHelper;
+import com.hm.achievement.utils.ColorHelper;
import com.hm.achievement.utils.StringHelper;
import jakarta.inject.Inject;
import jakarta.inject.Named;
@@ -28,10 +28,8 @@
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import net.kyori.adventure.text.Component;
-import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import org.apache.commons.lang3.StringUtils;
import org.bukkit.Bukkit;
-import org.bukkit.ChatColor;
import org.bukkit.NamespacedKey;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
@@ -39,7 +37,6 @@
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.persistence.PersistentDataType;
-import org.jetbrains.annotations.Contract;
import org.jspecify.annotations.NonNull;
/**
@@ -77,19 +74,19 @@ public class CategoryGUI implements Reloadable {
private boolean configNumberedItemsInList;
private boolean configBackButtonIsCategoryItem;
private String configFormatNotReceived;
- private String langListBackMessage;
- private String langListBackLore;
- private String langListGUITitle;
+ private String configColorCode;
+ private String configListColorNotReceivedCode;
private String langListAchievementReceived;
private String langListAchievementNotReceived;
- private String langListDescription;
- private String langListReception;
- private String langListGoal;
- private String langListProgress;
- private String langListReward;
- private String langListRewards;
- private ChatColor configColor;
- private ChatColor configListColorNotReceived;
+ private Component langListBackMessage;
+ private Component langListBackLore;
+ private Component langListGUITitle;
+ private Component langListDescription;
+ private Component langListReception;
+ private Component langListGoal;
+ private Component langListProgress;
+ private Component langListReward;
+ private Component langListRewards;
@Inject
public CategoryGUI(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, CacheManager cacheManager, AbstractDatabaseManager databaseManager, GUIItems guiItems, AchievementMap achievementMap) {
@@ -109,27 +106,27 @@ public void extractConfigurationParameters() {
configHideRewardDisplayInList = mainConfig.getBoolean("HideRewardDisplayInList");
configEnrichedProgressBars = mainConfig.getBoolean("EnrichedListProgressBars");
configNumberedItemsInList = mainConfig.getBoolean("NumberedItemsInList");
- configColor = ChatColor.getByChar(Objects.requireNonNull(mainConfig.getString("Color")));
- configListColorNotReceived = ChatColor.getByChar(Objects.requireNonNull(mainConfig.getString("ListColorNotReceived")));
+ configColorCode = ColorHelper.namedTextColorToLegacyAmpersand(ColorHelper.configColor(mainConfig));
+ configListColorNotReceivedCode = ColorHelper.namedTextColorToLegacyAmpersand(ColorHelper.parseColor(mainConfig.getString("ListColorNotReceived")));
configFormatNotReceived = mainConfig.getBoolean("ListItaliciseNotReceived") ? "&o" : "";
configBackButtonIsCategoryItem = mainConfig.getBoolean("BackButtonIsCategoryItem");
- langListBackMessage = translateColorCodes(langConfig.getString("list-back-message"));
- langListBackLore = translateColorCodes(langConfig.getString("list-back-lore"));
- langListGUITitle = translateColorCodes(langConfig.getString("list-gui-title"));
+ langListBackMessage = ColorHelper.convertAmpersandToComponent(langConfig.getString("list-back-message"));
+ langListBackLore = Component.text(Objects.requireNonNull(langConfig.getString("list-back-lore")));
+ langListGUITitle = ColorHelper.convertAmpersandToComponent(langConfig.getString("list-gui-title"));
langListAchievementReceived = StringHelper.unescapeJava(langConfig.getString("list-achievement-received"));
- langListAchievementNotReceived = StringHelper.unescapeJava(langConfig.getString("list-achievement-not-received")) + configListColorNotReceived;
+ langListAchievementNotReceived = StringHelper.unescapeJava(langConfig.getString("list-achievement-not-received")) + configListColorNotReceivedCode;
String description = langConfig.getString("list-description");
- langListDescription = Objects.requireNonNull(description).isEmpty() ? "" : translateColorCodes("&7&l" + description);
+ langListDescription = Objects.requireNonNull(description).isEmpty() ? Component.empty() : ColorHelper.convertAmpersandToComponent("&7&l" + description);
String reception = langConfig.getString("list-reception");
- langListReception = Objects.requireNonNull(reception).isEmpty() ? "" : translateColorCodes("&7&l" + reception);
+ langListReception = Objects.requireNonNull(reception).isEmpty() ? Component.empty() : ColorHelper.convertAmpersandToComponent("&7&l" + reception);
String goal = langConfig.getString("list-goal");
- langListGoal = Objects.requireNonNull(goal).isEmpty() ? "" : translateColorCodes("&7&l" + goal);
+ langListGoal = Objects.requireNonNull(goal).isEmpty() ? Component.empty() : ColorHelper.convertAmpersandToComponent("&7&l" + goal);
String progress = langConfig.getString("list-progress");
- langListProgress = Objects.requireNonNull(progress).isEmpty() ? "" : translateColorCodes("&7&l" + progress);
+ langListProgress = Objects.requireNonNull(progress).isEmpty() ? Component.empty() : ColorHelper.convertAmpersandToComponent("&7&l" + progress);
String reward = langConfig.getString("list-reward");
- langListReward = Objects.requireNonNull(reward).isEmpty() ? "" : translateColorCodes("&7&l" + reward);
+ langListReward = Objects.requireNonNull(reward).isEmpty() ? Component.empty() : ColorHelper.convertAmpersandToComponent("&7&l" + reward);
String rewards = langConfig.getString("list-rewards");
- langListRewards = Objects.requireNonNull(rewards).isEmpty() ? "" : translateColorCodes("&7&l" + rewards);
+ langListRewards = Objects.requireNonNull(rewards).isEmpty() ? Component.empty() : ColorHelper.convertAmpersandToComponent("&7&l" + rewards);
}
/**
@@ -151,7 +148,7 @@ public void displayCategoryGUI(ItemStack item, Player player, int requestedPage)
long statistic = getNormalStatistic((NormalAchievements) category, player);
subcategoriesToStatistics = Collections.singletonMap(NO_SUBCATEGORY, statistic);
} else {
- subcategoriesToStatistics = achievements.stream().collect(Collectors.toMap(Achievement::getSubcategory, a -> NO_STAT));
+ subcategoriesToStatistics = achievements.stream().collect(Collectors.toMap(Achievement::getSubcategory, _ -> NO_STAT));
}
displayPage(player, subcategoriesToStatistics, requestedPage, item, achievements);
return;
@@ -174,9 +171,9 @@ 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, Component.text(langListGUITitle));
+ Inventory inventory = Bukkit.createInventory(inventoryHolder, guiSize, langListGUITitle);
inventoryHolder.setInventory(inventory);
String previousItemDate = null;
@@ -212,7 +209,7 @@ private void displayPage(Player player, Map subcategoriesToStatist
if (configHideProgressiveAchievements && ineligibleSeriesItem) {
inventory.setItem(index - pageStart, guiItems.getAchievementLock());
} else {
- List lore = buildLore(achievement, receptionDate, statistic, ineligibleSeriesItem, player);
+ List lore = buildLore(achievement, receptionDate, statistic, ineligibleSeriesItem, player);
insertAchievement(inventory, index - pageStart, statistic, achievement.getDisplayName(), receptionDate, ineligibleSeriesItem, index - seriesStart, lore, achievement.getType());
}
@@ -221,29 +218,29 @@ private void displayPage(Player player, Map subcategoriesToStatist
}
// Add navigation items.
+ ItemStack backButton;
if (configBackButtonIsCategoryItem) {
- ItemStack backButton = clickedItem.clone();
+ backButton = clickedItem.clone();
ItemMeta backMeta = backButton.getItemMeta();
if (backMeta != null) {
- backMeta.displayName(Component.text(langListBackMessage));
- if (StringUtils.isNotBlank(langListBackLore)) {
- backMeta.lore(Collections.singletonList(Component.text(langListBackLore)));
+ backMeta.displayName(langListBackMessage);
+ if (langListBackLore != Component.empty()) {
+ backMeta.lore(Collections.singletonList(langListBackLore));
} else {
backMeta.lore(Collections.emptyList());
}
backMeta.getPersistentDataContainer().set(BACK_BUTTON_KEY, PersistentDataType.BYTE, (byte) 1);
backButton.setItemMeta(backMeta);
}
- inventory.setItem(guiSize - (ROW_SIZE + 1) / 2, backButton);
} else {
- ItemStack backButton = guiItems.getBackButton().clone();
+ backButton = guiItems.getBackButton().clone();
ItemMeta backMeta = backButton.getItemMeta();
if (backMeta != null) {
backMeta.getPersistentDataContainer().set(BACK_BUTTON_KEY, PersistentDataType.BYTE, (byte) 1);
backButton.setItemMeta(backMeta);
}
- inventory.setItem(guiSize - (ROW_SIZE + 1) / 2, backButton);
}
+ inventory.setItem(guiSize - (ROW_SIZE + 1) / 2, backButton);
if (pageIndex > 0) {
inventory.setItem(guiSize - ROW_SIZE, guiItems.getPreviousButton());
}
@@ -266,7 +263,7 @@ private void displayPage(Player player, Map subcategoriesToStatist
* @param lore
* @param type
*/
- private void insertAchievement(Inventory gui, int position, long statistic, String name, String date, boolean ineligibleSeriesItem, int seriesIndex, List lore, String type) {
+ private void insertAchievement(Inventory gui, int position, long statistic, String name, String date, boolean ineligibleSeriesItem, int seriesIndex, List lore, String type) {
// Display an item depending on whether the achievement was received or not, or whether progress was started.
// Clone in order to work with an independent set of metadata.
ItemStack achItem;
@@ -280,9 +277,8 @@ private void insertAchievement(Inventory gui, int position, long statistic, Stri
String displayName = date == null ? langListAchievementNotReceived + notReceivedStyle(name, ineligibleSeriesItem) : langListAchievementReceived + name;
ItemMeta itemMeta = achItem.getItemMeta();
- itemMeta.displayName(Component.text(translateColorCodes(displayName)));
- List loreComponents = lore.stream().map(this::translateColorCodes).map(Component::text).collect(Collectors.toList());
- itemMeta.lore(loreComponents);
+ itemMeta.displayName(ColorHelper.convertAmpersandToComponent(displayName));
+ itemMeta.lore(lore);
achItem.setItemMeta(itemMeta);
if (configNumberedItemsInList) {
achItem.setAmount(seriesIndex + 1);
@@ -355,50 +351,42 @@ private int getPageIndex(int requestedPage, int totalAchievements) {
* @param player
* @return the list representing the lore of a category item
*/
- private @NonNull List buildLore(Achievement achievement, String date, long statistic, boolean ineligibleSeriesItem, Player player) {
+ private @NonNull List buildLore(Achievement achievement, String date, long statistic, boolean ineligibleSeriesItem, Player player) {
List descriptions = getDescriptionsToDisplay(achievement, date != null);
- List lore = new ArrayList<>();
- lore.add("");
+ List lore = new ArrayList<>();
+ lore.add(Component.empty());
if (date != null) {
- if (!langListDescription.isEmpty()) {
- lore.add(langListDescription);
- }
- descriptions.forEach(d -> lore.add(translateColorCodes("&r&f" + d)));
- lore.add("");
- if (!langListReception.isEmpty()) {
- lore.add(langListReception);
- }
- lore.add(translateColorCodes("&r&f" + date));
+ if (langListDescription != Component.empty()) lore.add(langListDescription);
+ descriptions.forEach(d -> lore.add(ColorHelper.convertAmpersandToComponent("&r&f" + d)));
+ lore.add(Component.empty());
+ if (langListReception != Component.empty()) lore.add(langListReception);
+ lore.add(ColorHelper.convertAmpersandToComponent("&r&f" + date));
} else {
- if (!langListGoal.isEmpty()) {
- lore.add(langListGoal);
- }
- descriptions.forEach(d -> lore.add(translateColorCodes(notReceivedStyle(d, ineligibleSeriesItem))));
+ if (langListGoal != Component.empty()) lore.add(langListGoal);
+ descriptions.forEach(d -> lore.add(ColorHelper.convertAmpersandToComponent(notReceivedStyle(d, ineligibleSeriesItem))));
// Display progress if not Commands category.
if (!configObfuscateNotReceived && statistic != NO_STAT) {
- lore.add("");
+ lore.add(Component.empty());
boolean timeStat = NormalAchievements.PLAYEDTIME == achievement.getCategory();
- if (!langListProgress.isEmpty()) {
- lore.add(langListProgress);
- }
- lore.add(translateColorCodes(constructProgressBar(achievement.getThreshold(), statistic, timeStat)));
+ if (langListProgress != Component.empty()) lore.add(langListProgress);
+ lore.add(ColorHelper.convertAmpersandToComponent(constructProgressBar(achievement.getThreshold(), statistic, timeStat)));
}
}
List rewards = achievement.getRewards();
// Add the rewards' information.
if (!rewards.isEmpty() && !configHideRewardDisplayInList) {
- lore.add("");
- if (rewards.size() == 1 && !langListReward.isEmpty()) {
+ lore.add(Component.empty());
+ if (rewards.size() == 1 && langListReward != Component.empty()) {
lore.add(langListReward);
- } else if (rewards.size() > 1 && !langListRewards.isEmpty()) {
+ } else if (rewards.size() > 1 && langListReward != Component.empty()) {
lore.add(langListRewards);
}
- String dot = StringHelper.unescapeJava(date == null ? configListColorNotReceived + "● " + configFormatNotReceived : "&r&f● ");
+ String dot = StringHelper.unescapeJava(date == null ? configListColorNotReceivedCode + "● " + configFormatNotReceived : "&r&f● ");
for (Reward reward : rewards) {
for (String listText : reward.listTexts()) {
- lore.add(LegacyComponentSerializer.legacyAmpersand().serialize(StringHelper.replacePlayerPlaceholders(translateColorCodes(dot + listText), player)));
+ lore.add(StringHelper.replacePlayerPlaceholders(ColorHelper.convertAmpersandToComponent(dot + listText), player));
}
}
}
@@ -425,9 +413,9 @@ private int getPageIndex(int requestedPage, int totalAchievements) {
statisticDouble = statistic; // Cast to double.
statisticString = Long.toString(statistic);
}
- String middleText = " " + configListColorNotReceived + configFormatNotReceived + statisticString + "/" + threshold + " ";
+ String middleText = " " + configListColorNotReceivedCode + configFormatNotReceived + statisticString + "/" + threshold + " ";
- StringBuilder barDisplay = new StringBuilder().append(configListColorNotReceived).append("[").append(configColor);
+ StringBuilder barDisplay = new StringBuilder().append(configListColorNotReceivedCode).append("[").append(configColorCode);
// Approximation: colours chars account for no size, spaces ~2 vertical bars, other chars ~3 vertical bars.
int middleTextSize = configEnrichedProgressBars ? (middleText.length() - 6) * 3 + 4 : 0;
boolean hasDisplayedMiddleText = false;
@@ -438,7 +426,7 @@ private int getPageIndex(int requestedPage, int totalAchievements) {
// Middle reached: append enriched statistic information.
barDisplay.append(middleText);
if (!hasDisplayedNotReceivedColor) {
- barDisplay.append(configColor);
+ barDisplay.append(configColorCode);
}
// Do not display middleText again.
hasDisplayedMiddleText = true;
@@ -448,14 +436,14 @@ private int getPageIndex(int requestedPage, int totalAchievements) {
i = PROGRESS_BAR_SIZE - i;
} else {
if (i >= PROGRESS_BAR_SIZE * statisticDouble / threshold && !hasDisplayedNotReceivedColor) {
- // Not received color: amount not yet reached by user.
+ // Not received colour: amount not yet reached by user.
hasDisplayedNotReceivedColor = true;
- barDisplay.append(configListColorNotReceived);
+ barDisplay.append(configListColorNotReceivedCode);
}
barDisplay.append("|");
}
}
- return barDisplay.append(configListColorNotReceived).append("]").toString();
+ return barDisplay.append(configListColorNotReceivedCode).append("]").toString();
}
/**
@@ -483,14 +471,9 @@ private int getPageIndex(int requestedPage, int totalAchievements) {
private @NonNull String notReceivedStyle(String input, boolean ineligibleSeriesItem) {
if (configObfuscateNotReceived || (configObfuscateProgressiveAchievements && ineligibleSeriesItem)) {
- return configListColorNotReceived + "&k" + randomiseParts(StringHelper.removeFormattingCodes(input));
+ return configListColorNotReceivedCode + "&k" + randomiseParts(StringHelper.removeFormattingCodes(input));
} else {
- return configListColorNotReceived + configFormatNotReceived + StringHelper.removeFormattingCodes(input);
+ return configListColorNotReceivedCode + configFormatNotReceived + StringHelper.removeFormattingCodes(input);
}
}
-
- @Contract("_ -> new")
- private @NonNull String translateColorCodes(String translate) {
- return ChatColor.translateAlternateColorCodes('&', translate);
- }
-}
+}
\ No newline at end of file
diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/GUIItems.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/GUIItems.java
index 3a1f734f..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);
}
@@ -204,5 +204,4 @@ public ItemStack getAchievementLock() {
public ItemStack getCategoryLock() {
return categoryLock;
}
-
-}
+}
\ No newline at end of file
diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/MainGUI.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/MainGUI.java
index e9356fe3..2d4335ff 100644
--- a/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/MainGUI.java
+++ b/advanced-achievements-plugin/src/main/java/com/hm/achievement/gui/MainGUI.java
@@ -6,6 +6,7 @@
import com.hm.achievement.config.AchievementMap;
import com.hm.achievement.db.CacheManager;
import com.hm.achievement.lifecycle.Reloadable;
+import com.hm.achievement.utils.ColorHelper;
import jakarta.inject.Inject;
import jakarta.inject.Named;
import jakarta.inject.Singleton;
@@ -16,7 +17,6 @@
import net.kyori.adventure.text.Component;
import org.apache.commons.lang3.StringUtils;
import org.bukkit.Bukkit;
-import org.bukkit.ChatColor;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
@@ -37,18 +37,14 @@ public class MainGUI implements Reloadable {
private final Set disabledCategories;
private final GUIItems guiItems;
private final AchievementMap achievementMap;
-
private boolean configHideNotReceivedCategories;
private boolean configHideNoPermissionCategories;
-
private String langListAchievementsInCategoryPlural;
private String langListAchievementInCategorySingular;
-
private Component langListGUITitle;
@Inject
- public MainGUI(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig,
- CacheManager cacheManager, Set disabledCategories, GUIItems guiItems, AchievementMap achievementMap) {
+ public MainGUI(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, CacheManager cacheManager, Set disabledCategories, GUIItems guiItems, AchievementMap achievementMap) {
this.mainConfig = mainConfig;
this.langConfig = langConfig;
this.cacheManager = cacheManager;
@@ -61,8 +57,7 @@ public MainGUI(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlC
public void extractConfigurationParameters() {
configHideNotReceivedCategories = mainConfig.getBoolean("HideNotReceivedCategories");
configHideNoPermissionCategories = mainConfig.getBoolean("HideNoPermissionCategories");
-
- langListGUITitle = Component.text(ChatColor.translateAlternateColorCodes('&', Objects.requireNonNull(langConfig.getString("list-gui-title"))));
+ langListGUITitle = ColorHelper.convertAmpersandToComponent(langConfig.getString("list-gui-title"));
langListAchievementsInCategoryPlural = langConfig.getString("list-achievements-in-category-plural");
langListAchievementInCategorySingular = langConfig.getString("list-achievements-in-category-singular");
}
@@ -79,7 +74,6 @@ public void displayMainGUI(Player player) {
int guiSize = ((totalEnabledCategories - 1) / 9 + 1) * 9; // Round up to multiple of 9
Inventory mainGUI = Bukkit.createInventory(inventoryHolder, guiSize, langListGUITitle);
inventoryHolder.setInventory(mainGUI);
-
int displayedSoFar = 0;
for (Entry achievementItem : guiItems.getOrderedAchievementItems().entrySet()) {
Category category = achievementItem.getKey().category();
@@ -89,7 +83,6 @@ public void displayMainGUI(Player player) {
++displayedSoFar;
}
}
-
// Display the main GUI to the player.
player.openInventory(mainGUI);
}
@@ -104,9 +97,7 @@ public void displayMainGUI(Player player) {
*/
private boolean shouldDisplayCategory(ItemStack item, Player player, Category category) {
// Hide category if an empty name is defined for it, if it's disabled or if the player is missing permissions.
- return item.getItemMeta().hasCustomName() && !Objects.requireNonNull(item.getItemMeta().customName()).equals(Component.empty()) &&
- !disabledCategories.contains(category)
- && (!configHideNoPermissionCategories || player.hasPermission(category.toPermName()));
+ return item.getItemMeta().hasCustomName() && !Objects.requireNonNull(item.getItemMeta().customName()).equals(Component.empty()) && !disabledCategories.contains(category) && (!configHideNoPermissionCategories || player.hasPermission(category.toPermName()));
}
/**
@@ -119,9 +110,7 @@ private boolean shouldDisplayCategory(ItemStack item, Player player, Category ca
* @param position
*/
private void displayCategory(ItemStack item, Inventory gui, Player player, Category category, int position) {
- long receivedAmount = achievementMap.getForCategory(category).stream()
- .filter(a -> cacheManager.hasPlayerAchievement(player.getUniqueId(), a.getName()))
- .count();
+ long receivedAmount = achievementMap.getForCategory(category).stream().filter(a -> cacheManager.hasPlayerAchievement(player.getUniqueId(), a.getName())).count();
if (!configHideNotReceivedCategories || receivedAmount > 0) {
int totalAmount = achievementMap.getForCategory(category).size();
String message = totalAmount > 1 ? langListAchievementsInCategoryPlural : langListAchievementInCategorySingular;
@@ -131,7 +120,7 @@ private void displayCategory(ItemStack item, Inventory gui, Player player, Categ
ItemStack itemWithLore = item.clone();
ItemMeta itemMetaWithLore = itemWithLore.getItemMeta();
String amountMessage = StringUtils.replaceEach(message, new String[]{"AMOUNT"}, new String[]{receivedAmount + "/" + totalAmount});
- List loreComponents = List.of(Component.text(ChatColor.translateAlternateColorCodes('&', "&8" + amountMessage)));
+ List loreComponents = List.of(Component.text(amountMessage));
itemMetaWithLore.lore(loreComponents);
itemWithLore.setItemMeta(itemMetaWithLore);
gui.setItem(position, itemWithLore);
diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/PlayerAdvancedAchievementListener.java
index 68bce30b..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
@@ -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;
@@ -20,21 +21,18 @@
import jakarta.inject.Named;
import jakarta.inject.Singleton;
import java.time.Duration;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
import java.util.Objects;
import java.util.Random;
import java.util.logging.Logger;
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;
import org.apache.commons.lang3.StringUtils;
import org.bukkit.Bukkit;
-import org.bukkit.ChatColor;
import org.bukkit.Color;
import org.bukkit.FireworkEffect;
import org.bukkit.FireworkEffect.Type;
@@ -55,7 +53,7 @@
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.inventory.meta.FireworkMeta;
-import org.bukkit.metadata.FixedMetadataValue;
+import org.bukkit.persistence.PersistentDataType;
import org.jspecify.annotations.NonNull;
/**
@@ -64,37 +62,15 @@
*
* @author Pyves
*/
-@SuppressWarnings("deprecation")
@Singleton
public class PlayerAdvancedAchievementListener implements Listener, Reloadable {
private static final Random RANDOM = new Random();
private static final String ADVANCED_ACHIEVEMENTS_FIREWORK = "advanced_achievements_firework";
- private static final Map FIREWORK_COLOR_MIX = new HashMap<>();
-
- static {
- FIREWORK_COLOR_MIX.put(NamedTextColor.AQUA, NamedTextColor.DARK_AQUA);
- FIREWORK_COLOR_MIX.put(NamedTextColor.BLACK, NamedTextColor.GRAY);
- FIREWORK_COLOR_MIX.put(NamedTextColor.BLUE, NamedTextColor.DARK_BLUE);
- FIREWORK_COLOR_MIX.put(NamedTextColor.GRAY, NamedTextColor.DARK_GRAY);
- FIREWORK_COLOR_MIX.put(NamedTextColor.DARK_AQUA, NamedTextColor.AQUA);
- FIREWORK_COLOR_MIX.put(NamedTextColor.DARK_BLUE, NamedTextColor.BLUE);
- FIREWORK_COLOR_MIX.put(NamedTextColor.DARK_GRAY, NamedTextColor.GRAY);
- FIREWORK_COLOR_MIX.put(NamedTextColor.DARK_GREEN, NamedTextColor.GREEN);
- FIREWORK_COLOR_MIX.put(NamedTextColor.DARK_PURPLE, NamedTextColor.LIGHT_PURPLE);
- FIREWORK_COLOR_MIX.put(NamedTextColor.DARK_RED, NamedTextColor.RED);
- FIREWORK_COLOR_MIX.put(NamedTextColor.GOLD, NamedTextColor.YELLOW);
- FIREWORK_COLOR_MIX.put(NamedTextColor.GREEN, NamedTextColor.DARK_GREEN);
- FIREWORK_COLOR_MIX.put(NamedTextColor.LIGHT_PURPLE, NamedTextColor.DARK_PURPLE);
- FIREWORK_COLOR_MIX.put(NamedTextColor.RED, NamedTextColor.DARK_RED);
- FIREWORK_COLOR_MIX.put(NamedTextColor.WHITE, NamedTextColor.GRAY);
- FIREWORK_COLOR_MIX.put(NamedTextColor.YELLOW, NamedTextColor.GOLD);
- }
-
private final YamlConfiguration mainConfig;
private final YamlConfiguration langConfig;
private final Logger logger;
- private final StringBuilder pluginHeader;
+ private final PluginHeader pluginHeader;
private final CacheManager cacheManager;
private final AdvancedAchievements advancedAchievements;
private final RewardParser rewardParser;
@@ -102,12 +78,13 @@ public class PlayerAdvancedAchievementListener implements Listener, Reloadable {
private final AbstractDatabaseManager databaseManager;
private final ToggleCommand toggleCommand;
private final FancyMessageSender fancyMessageSender;
-
private String configFireworkStyle;
+ private String langBossBarProgress;
+ private Component langAchievementReceived;
+ private Component langAchievementNew;
+ private Component langAllAchievementsReceived;
+ private NamedTextColor configFireworkColor;
private boolean configFirework;
- private Color configColor;
- private Color mixColor;
- private BarColor barColor;
private boolean configSimplifiedReception;
private boolean configTitleScreen;
private boolean configNotifyOtherPlayers;
@@ -116,13 +93,8 @@ public class PlayerAdvancedAchievementListener implements Listener, Reloadable {
private boolean configReceiverChatMessages;
private boolean configBossBarProgress;
- private String langAchievementReceived;
- private String langAchievementNew;
- private String langAllAchievementsReceived;
- private String langBossBarProgress;
-
@Inject
- public PlayerAdvancedAchievementListener(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig, Logger logger, StringBuilder pluginHeader, CacheManager cacheManager, AdvancedAchievements advancedAchievements, RewardParser rewardParser, AchievementMap achievementMap, AbstractDatabaseManager databaseManager, ToggleCommand toggleCommand, FancyMessageSender fancyMessageSender) {
+ 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;
@@ -144,6 +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.parseColor(mainConfig.getString("FireworkColor", "DARK_PURPLE"));
configSimplifiedReception = mainConfig.getBoolean("SimplifiedReception");
configTitleScreen = mainConfig.getBoolean("TitleScreen");
configNotifyOtherPlayers = mainConfig.getBoolean("NotifyOtherPlayers");
@@ -151,138 +124,97 @@ public void extractConfigurationParameters() {
configHoverableReceiverChatText = mainConfig.getBoolean("HoverableReceiverChatText");
configBossBarProgress = mainConfig.getBoolean("BossBarProgress");
configReceiverChatMessages = mainConfig.getBoolean("ReceiverChatMessages");
- NamedTextColor chatColor = ColorHelper.parseColor(Objects.requireNonNull(mainConfig.getString("Color")));
- configColor = ColorHelper.convertChatColorToColor(Objects.requireNonNull(chatColor));
- mixColor = Color.WHITE.mixColors(ColorHelper.convertChatColorToColor(FIREWORK_COLOR_MIX.get(chatColor)));
- barColor = ColorHelper.convertChatColorToBarColor(chatColor);
-
- langAchievementReceived = langConfig.getString("achievement-received") + " " + ChatColor.WHITE;
- langAchievementNew = pluginHeader + langConfig.getString("achievement-new") + " " + ChatColor.WHITE;
- langAllAchievementsReceived = pluginHeader + langConfig.getString("all-achievements-received");
+ langAchievementReceived = Component.text(Objects.requireNonNull(langConfig.getString("achievement-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");
}
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onEntityDamageByEntity(@NonNull EntityDamageByEntityEvent event) {
- // Cancel damage if the firework was launched by the plugin.
- event.setCancelled(event.getEntity().hasMetadata(ADVANCED_ACHIEVEMENTS_FIREWORK));
+ if (event.getDamager() instanceof Firework firework && firework.getPersistentDataContainer().has(new NamespacedKey(advancedAchievements, ADVANCED_ACHIEVEMENTS_FIREWORK), PersistentDataType.BOOLEAN)) {
+ event.setCancelled(true);
+ }
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
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);
}
/**
* Displays chat messages, screen title and launches a firework when a player
* receives an achievement.
*
- * @param player
- * @param achievement
+ * @param player player
+ * @param achievement achievement
*/
private void displayAchievement(@NonNull Player player, @NonNull Achievement achievement) {
logger.info("Player " + player.getName() + " received the achievement: " + achievement.getDisplayName());
- String nameToShowUser = ChatColor.translateAlternateColorCodes('&', achievement.getDisplayName());
- String messageToShowUser = ChatColor.translateAlternateColorCodes('&', achievement.getMessage());
+ Component nameToShowUser = Component.text(achievement.getDisplayName());
+ Component messageToShowUser = Component.text(achievement.getMessage());
if (configReceiverChatMessages || player.hasPermission("achievement.config.receiver.chat.messages")) {
displayReceiverMessages(player, nameToShowUser, messageToShowUser, achievement.getRewards());
}
// 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(Component.text(nameToShowUser), Component.text(messageToShowUser), Title.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, 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
- * @param nameToShowUser
- * @param messageToShowUser
- * @param rewards
+ * @param player player
+ * @param nameToShowUser name shown to user
+ * @param messageToShowUser message shown to user
+ * @param rewards rewards
*/
- private void displayReceiverMessages(Player player, String nameToShowUser, String messageToShowUser, @NonNull List rewards) {
- List chatMessages = rewards.stream().map(Reward::chatTexts).flatMap(List::stream).map(m -> StringHelper.replacePlayerPlaceholders(m, player)).map(m -> PlainTextComponentSerializer.plainText().serialize(m)).toList();
- String message = langAchievementNew.contains("ACH") ? StringUtils.replaceEach(langAchievementNew, new String[]{"ACH"}, new String[]{nameToShowUser}) : langAchievementNew + nameToShowUser;
+ 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(StringHelper::componentToString).toList();
+ Component message = langAchievementNew.replaceText(b -> b.matchLiteral("ACH").replacement(nameToShowUser));
if (configHoverableReceiverChatText) {
- StringBuilder hover = new StringBuilder(applyPrefix(messageToShowUser + "\n"));
- chatMessages.forEach(t -> hover.append(applyPrefix(ChatColor.translateAlternateColorCodes('&', t))).append("\n"));
- fancyMessageSender.sendHoverableMessage(player, applyPrefix(message), hover.substring(0, hover.length() - 1), "white");
- return;
+ // 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));
+ player.sendMessage(pluginHeader.get().color(NamedTextColor.WHITE).append(applyPrefix(messageToShowUser)));
+ chatMessages.stream().map(ColorHelper::convertAmpersandToComponent).forEach(t -> player.sendMessage(applyPrefix(t)));
}
- player.sendMessage(applyPrefix(message));
- player.sendMessage(pluginHeader.toString() + ChatColor.WHITE + applyPrefix(messageToShowUser));
- chatMessages.forEach(t -> player.sendMessage(pluginHeader + ChatColor.translateAlternateColorCodes('&', t)));
}
/**
* 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, String nameToShowUser, Player otherPlayer) {
- String message = langAchievementReceived.contains("ACH") ? StringUtils.replaceEach(langAchievementReceived, new String[]{"PLAYER", "ACH"}, new String[]{receiver.getName(), nameToShowUser}) : StringUtils.replaceEach(langAchievementReceived, new String[]{"PLAYER"}, new String[]{receiver.getName()}) + nameToShowUser;
- if (configActionBarNotify) {
- Component actionBarMessage = Component.text(message).decorate(TextDecoration.ITALIC);
- otherPlayer.sendActionBar(actionBarMessage);
- } else {
- Component regularMessage = Component.text(pluginHeader + message).decorate(TextDecoration.ITALIC);
- otherPlayer.sendMessage(regularMessage);
- }
+ private void displayNotification(Player receiver, Component nameToShowUser, Player otherPlayer) {
+ Component message = langAchievementReceived.replaceText(b -> b.matchLiteral("PLAYER").replacement(receiver.getName())).replaceText(b -> b.matchLiteral("ACH").replacement(nameToShowUser));
+ if (configActionBarNotify) otherPlayer.sendActionBar(message.decorate(TextDecoration.ITALIC));
+ else otherPlayer.sendMessage(pluginHeader.get().append(message).decorate(TextDecoration.ITALIC));
}
/**
@@ -291,35 +223,32 @@ private void displayNotification(Player receiver, String nameToShowUser, Player
* @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();
- FireworkEffect fireworkEffect = FireworkEffect.builder().withColor(configColor).withFade(mixColor).with(getFireworkType()).build();
- fireworkMeta.addEffects(fireworkEffect);
+ Color fireworkColor = Color.fromRGB(configFireworkColor.red(), configFireworkColor.green(), configFireworkColor.blue());
+ fireworkMeta.addEffects(FireworkEffect.builder().with(getFireworkType()).withColor(fireworkColor).withFade(fireworkColor).build());
firework.setFireworkMeta(fireworkMeta);
- firework.setMetadata(ADVANCED_ACHIEVEMENTS_FIREWORK, new FixedMetadataValue(advancedAchievements, true));
+ firework.getPersistentDataContainer().set(new NamespacedKey(advancedAchievements, ADVANCED_ACHIEVEMENTS_FIREWORK), PersistentDataType.BOOLEAN, true);
firework.setVelocity(location.getDirection().multiply(0));
}
/**
- * Gets the type of the firework, which can either be predefined or random.
+ * Gets the type of the firework, either predefined or random based on config.
*
- * @return the firework type.
+ * @return the firework type
*/
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
*/
@@ -332,20 +261,35 @@ 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
*/
private void handleAllAchievementsReceived(@NonNull Player player) {
List rewards = rewardParser.parseRewards("AllAchievementsReceivedRewards");
rewards.forEach(r -> r.rewarder().accept(player));
- player.sendMessage(langAllAchievementsReceived);
- rewards.stream().map(Reward::chatTexts).flatMap(List::stream).map(m -> StringHelper.replacePlayerPlaceholders(m, player)).map(m -> PlainTextComponentSerializer.plainText().serialize(m)).forEach(t -> player.sendMessage(pluginHeader + ChatColor.translateAlternateColorCodes('&', t)));
+ 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 String applyPrefix(String s) {
- if (mainConfig.getBoolean("PrefixEnabled")) return "[AACH] " + s;
+ private Component applyPrefix(Component 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/listener/statistics/CraftsListener.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/listener/statistics/CraftsListener.java
index 1744f9c0..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
@@ -64,16 +78,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) {
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/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/ColorHelper.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/ColorHelper.java
index 3d0c986d..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
@@ -1,75 +1,35 @@
package com.hm.achievement.utils;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.stream.Collectors;
+import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.format.TextColor;
-import org.bukkit.Color;
-import org.bukkit.boss.BarColor;
+import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
+import org.bukkit.configuration.file.YamlConfiguration;
import org.jspecify.annotations.NonNull;
-import static net.kyori.adventure.text.format.NamedTextColor.AQUA;
-import static net.kyori.adventure.text.format.NamedTextColor.BLACK;
-import static net.kyori.adventure.text.format.NamedTextColor.BLUE;
-import static net.kyori.adventure.text.format.NamedTextColor.DARK_AQUA;
-import static net.kyori.adventure.text.format.NamedTextColor.DARK_BLUE;
-import static net.kyori.adventure.text.format.NamedTextColor.DARK_GRAY;
-import static net.kyori.adventure.text.format.NamedTextColor.DARK_GREEN;
-import static net.kyori.adventure.text.format.NamedTextColor.DARK_PURPLE;
-import static net.kyori.adventure.text.format.NamedTextColor.DARK_RED;
-import static net.kyori.adventure.text.format.NamedTextColor.GOLD;
-import static net.kyori.adventure.text.format.NamedTextColor.GRAY;
-import static net.kyori.adventure.text.format.NamedTextColor.GREEN;
-import static net.kyori.adventure.text.format.NamedTextColor.LIGHT_PURPLE;
-import static net.kyori.adventure.text.format.NamedTextColor.NAMES;
-import static net.kyori.adventure.text.format.NamedTextColor.RED;
-import static net.kyori.adventure.text.format.NamedTextColor.WHITE;
-import static net.kyori.adventure.text.format.NamedTextColor.YELLOW;
-
public class ColorHelper {
- protected static final List ALL_NAMED_COLORS = List.of(BLACK, DARK_BLUE, DARK_GREEN, DARK_AQUA, DARK_RED, DARK_PURPLE, GOLD, GRAY, DARK_GRAY, BLUE, GREEN, AQUA, RED, LIGHT_PURPLE, YELLOW, WHITE);
- private static final Map COLOR_MAP = Map.ofEntries(Map.entry(AQUA, Color.fromRGB(0x55, 0xFF, 0xFF)), Map.entry(BLACK, Color.BLACK), Map.entry(BLUE, Color.fromRGB(0x55, 0x55, 0xFF)), Map.entry(GRAY, Color.fromRGB(0xAA, 0xAA, 0xAA)), Map.entry(DARK_AQUA, Color.fromRGB(0x00, 0xAA, 0xAA)), Map.entry(DARK_BLUE, Color.fromRGB(0x00, 0x00, 0xAA)), Map.entry(DARK_GRAY, Color.fromRGB(0x55, 0x55, 0x55)), Map.entry(DARK_GREEN, Color.fromRGB(0x00, 0xAA, 0x00)), Map.entry(DARK_PURPLE, Color.fromRGB(0xAA, 0x00, 0xAA)), Map.entry(DARK_RED, Color.fromRGB(0xAA, 0x00, 0x00)), Map.entry(GOLD, Color.fromRGB(0xFF, 0xAA, 0x00)), Map.entry(GREEN, Color.fromRGB(0x55, 0xFF, 0x55)), Map.entry(LIGHT_PURPLE, Color.fromRGB(0xFF, 0x55, 0xFF)), Map.entry(RED, Color.fromRGB(0xFF, 0x55, 0x55)), Map.entry(WHITE, Color.WHITE), Map.entry(YELLOW, Color.fromRGB(0xFF, 0xFF, 0x55)));
- private static final Map BAR_COLOR_MAP = Map.ofEntries(Map.entry(AQUA, BarColor.GREEN), Map.entry(BLACK, BarColor.PURPLE), Map.entry(BLUE, BarColor.BLUE), Map.entry(GRAY, BarColor.WHITE), Map.entry(DARK_AQUA, BarColor.BLUE), Map.entry(DARK_BLUE, BarColor.BLUE), Map.entry(DARK_GRAY, BarColor.PURPLE), Map.entry(DARK_GREEN, BarColor.GREEN), Map.entry(DARK_PURPLE, BarColor.PURPLE), Map.entry(DARK_RED, BarColor.RED), Map.entry(GOLD, BarColor.YELLOW), Map.entry(GREEN, BarColor.GREEN), Map.entry(LIGHT_PURPLE, BarColor.PURPLE), Map.entry(RED, BarColor.RED), Map.entry(WHITE, BarColor.WHITE), Map.entry(YELLOW, BarColor.YELLOW));
- private static final Map EXACT_RGB_MAP = ALL_NAMED_COLORS.stream().collect(Collectors.toMap(c -> (c.red() << 16) | (c.green() << 8) | c.blue(), c -> c));
-
- private ColorHelper() {
- // Not called.
- }
-
- public static Color convertChatColorToColor(NamedTextColor chatColor) {
- return COLOR_MAP.getOrDefault(chatColor, Color.WHITE);
- }
-
- public static BarColor convertChatColorToBarColor(NamedTextColor chatColor) {
- return BAR_COLOR_MAP.getOrDefault(chatColor, BarColor.WHITE);
- }
-
- public static NamedTextColor parseColor(String nameorHex) {
- if (nameorHex == null) return WHITE;
- try { // TODO: Forcing 5 to be dark_purple for config as that uses numbers. Remove at some point
- int index = Integer.parseInt(nameorHex);
- if (index == 5) {
- return DARK_PURPLE;
- }
- } catch (NumberFormatException ignored) {
- }
- NamedTextColor named = NAMES.value(nameorHex.toLowerCase(Locale.ROOT));
+ public static NamedTextColor parseColor(String color) {
+ if (color == null) return NamedTextColor.WHITE;
+ NamedTextColor named = NamedTextColor.NAMES.value(color.toLowerCase());
if (named != null) return named;
try {
- int rgb = Integer.parseInt(nameorHex.replace("#", ""), 16);
- NamedTextColor exact = EXACT_RGB_MAP.get(rgb);
- if (exact != null) return exact;
- return nearestTo(Color.fromRGB(rgb));
+ int rgb = Integer.parseInt(color.replace("#", ""), 16);
+ return NamedTextColor.nearestTo(TextColor.color(rgb));
} catch (IllegalArgumentException e) {
- throw new RuntimeException("Invalid color: " + nameorHex, e);
+ throw new RuntimeException("Invalid color: " + color, e);
}
}
- private static @NonNull NamedTextColor nearestTo(@NonNull Color color) {
- TextColor advColor = TextColor.color(color.getRed(), color.getGreen(), color.getBlue());
- return NamedTextColor.nearestTo(advColor);
+ public static NamedTextColor configColor(@NonNull YamlConfiguration mainConfig) {
+ return parseColor(mainConfig.getString("Color", "DARK_PURPLE"));
+ }
+
+ public static @NonNull Component convertAmpersandToComponent(String text) {
+ return LegacyComponentSerializer.legacyAmpersand().deserialize(text);
+ }
+
+ public static @NonNull String namedTextColorToLegacyAmpersand(NamedTextColor color) {
+ return LegacyComponentSerializer.legacyAmpersand().serialize(Component.empty().color(color)).replace("%r", "");
}
}
\ No newline at end of file
diff --git a/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/FancyMessageSender.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/FancyMessageSender.java
index 4e864f51..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,18 +3,14 @@
import jakarta.inject.Inject;
import jakarta.inject.Singleton;
import net.kyori.adventure.text.Component;
-import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.event.ClickEvent;
import net.kyori.adventure.text.event.HoverEvent;
-import net.kyori.adventure.text.format.TextColor;
-import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
-import org.jetbrains.annotations.Contract;
import org.jspecify.annotations.NonNull;
/**
* Class used to send fancy messages to the player; can be titles, hoverable chat messages or action bar messages. All
- * methods are static and this class cannot be instanciated.
+ * methods are static and this class cannot be instantiated.
*
* @author Pyves
*/
@@ -35,14 +31,9 @@ public FancyMessageSender(int serverVersion) {
* @param player Online player to send the message to.
* @param message The text to display in the chat.
* @param hover The text to display in the hover.
- * @param color The color of the hover text.
*/
- public void sendHoverableMessage(@NonNull Player player, String message, String hover, @NonNull String color) {
- String hexColor = chatColorToHex(ChatColor.valueOf(color.toUpperCase()));
- net.kyori.adventure.text.TextComponent textComponent = Component.text(message).color(TextColor.fromHexString(hexColor));
- net.kyori.adventure.text.event.HoverEvent hoverEvent = net.kyori.adventure.text.event.HoverEvent.showText(Component.text(hover));
- textComponent = textComponent.hoverEvent(hoverEvent);
- player.sendMessage(textComponent);
+ public void sendHoverableMessage(@NonNull Player player, @NonNull Component message, Component hover) {
+ player.sendMessage(message.hoverEvent(HoverEvent.showText(hover)));
}
/**
@@ -52,37 +43,9 @@ public void sendHoverableMessage(@NonNull Player player, String message, String
* @param message The text to display in the chat.
* @param command The command that is entered when clicking on the message.
* @param hover The text to display in the hover.
- * @param color The color of the hover text.
*/
- public void sendHoverableCommandMessage(@NonNull Player player, String message, String command, String hover, @NonNull String color) {
- String hexColor = chatColorToHex(ChatColor.valueOf(color.toUpperCase()));
- TextComponent textComponent = Component.text(message).color(TextColor.fromHexString(hexColor)).clickEvent(ClickEvent.runCommand(command));
- HoverEvent hoverEvent = HoverEvent.showText(Component.text(hover));
- textComponent = textComponent.hoverEvent(hoverEvent);
- player.sendMessage(textComponent);
-
- }
-
- @Contract(pure = true)
- private @NonNull String chatColorToHex(@NonNull ChatColor chatColor) {
- return switch (chatColor) {
- case DARK_BLUE -> "#0000AA";
- case GREEN -> "#00AA00";
- case AQUA -> "#00AAAA";
- case RED -> "#AA0000";
- case LIGHT_PURPLE -> "#AA00AA";
- case YELLOW -> "#AAAA00";
- case WHITE, GRAY -> "#AAAAAA";
- case DARK_GRAY -> "#555555";
- case DARK_RED -> "#550000";
- case DARK_GREEN -> "#005500";
- case DARK_AQUA -> "#005555";
- case DARK_PURPLE -> "#550055";
- case GOLD -> "#FFAA00";
- case BLUE -> "#5555FF";
- case BLACK -> "#000000";
- default -> "#FFFFFF";
- };
+ public void sendHoverableCommandMessage(@NonNull Player player, @NonNull Component message, String command, Component hover) {
+ player.sendMessage(message.clickEvent(ClickEvent.runCommand(command)).hoverEvent(HoverEvent.showText(hover)));
}
}
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/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/main/java/com/hm/achievement/utils/SoundPlayer.java b/advanced-achievements-plugin/src/main/java/com/hm/achievement/utils/SoundPlayer.java
index 81522c17..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,13 +32,12 @@ 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");
}
- logger.info("playing sound " + soundToPlay);
}
/**
@@ -50,12 +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/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 7e8e2929..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
@@ -3,7 +3,8 @@
import java.util.Collection;
import java.util.regex.Pattern;
import net.kyori.adventure.text.Component;
-import org.apache.commons.lang3.StringUtils;
+import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
+import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.Contract;
@@ -16,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) {
@@ -39,17 +34,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) {
@@ -139,4 +125,12 @@ public static int levenshteinDistance(@NonNull CharSequence lhs, @NonNull CharSe
}
return prev[m];
}
+
+ 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/main/resources/config.yml b/advanced-achievements-plugin/src/main/resources/config.yml
index ca9a2056..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.
@@ -64,8 +64,15 @@ SoundRanking: entity_firework_rocket_blast
# Icon of the plugin (default: shamrock, \u2618).
Icon: \u2618
-# Main color of the plugin (default: 5, dark purple).
-Color: 5
+# Main color of the plugin for chat messages and information (default: DARK_PURPLE).
+# https://jd.advntr.dev/api/4.26.1/net/kyori/adventure/text/format/NamedTextColor.html
+Color: DARK_PURPLE
+
+# Color used for not yet received achievements in /aach list (default: DARK_GRAY).
+ListColorNotReceived: DARK_GRAY
+
+# Color used for the firework and fade when you get an achievement (default: DARK_PURPLE).
+FireworkColor: DARK_PURPLE
# Notify other connected players when an achievement is received. This defines the default behaviour, players can
# override what they see by using /aach toggle.
@@ -218,9 +225,6 @@ EnrichedListProgressBars: true
# Annotate each achievement displayed in a /aach list category with a number.
NumberedItemsInList: false
-# Color used for not yet received achievements in /aach list.
-ListColorNotReceived: 8
-
# Italicise not yet received achievements in /aach list. Obfuscated achievements are not affected.
ListItaliciseNotReceived: true
@@ -284,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:
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 b8ddc610..610dfbdd 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:"
@@ -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:"
@@ -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."
@@ -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 #
# #
diff --git a/advanced-achievements-plugin/src/main/resources/plugin.yml b/advanced-achievements-plugin/src/main/resources/plugin.yml
index 79310d0d..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: 1.21.11
+api-version: 26.1.2
commands:
aach:
description: Main Advanced Achievements command, use it to list sub-commands.
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..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,6 +4,7 @@
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 org.bukkit.command.Command;
@@ -28,7 +29,7 @@
@ExtendWith(MockitoExtension.class)
class PluginCommandExecutorTest {
- private static final String PLUGIN_HEADER = "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";
@@ -59,8 +60,7 @@ void setUp() {
commands.add(helpCommand);
commands.add(listCommand);
commands.add(argsCommand);
- StringBuilder pluginHeader = new StringBuilder(PLUGIN_HEADER);
- underTest = new PluginCommandExecutor(langConfig, commands, pluginHeader);
+ underTest = new PluginCommandExecutor(langConfig, commands, PLUGIN_HEADER);
underTest.extractConfigurationParameters();
}
diff --git a/advanced-achievements-plugin/src/test/java/com/hm/achievement/command/pagination/CommandPaginationTest.java b/advanced-achievements-plugin/src/test/java/com/hm/achievement/command/pagination/CommandPaginationTest.java
index c976d76c..c847db47 100644
--- a/advanced-achievements-plugin/src/test/java/com/hm/achievement/command/pagination/CommandPaginationTest.java
+++ b/advanced-achievements-plugin/src/test/java/com/hm/achievement/command/pagination/CommandPaginationTest.java
@@ -1,15 +1,15 @@
package com.hm.achievement.command.pagination;
+import com.hm.achievement.utils.ColorHelper;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
+import net.kyori.adventure.text.Component;
import org.apache.commons.lang3.StringUtils;
-import org.bukkit.ChatColor;
import org.bukkit.configuration.file.YamlConfiguration;
-import org.jetbrains.annotations.Contract;
import org.jspecify.annotations.NonNull;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -23,13 +23,7 @@
*/
class CommandPaginationTest {
- private final List toPaginate = Arrays.asList(
- "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
- "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
- "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
- "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
- "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
- "1", "2", "3", "4", "5", "6", "7", "8", "9", "10");
+ private final List toPaginate = Arrays.asList(Component.text("1"), Component.text("2"), Component.text("3"), Component.text("4"), Component.text("5"), Component.text("6"), Component.text("7"), Component.text("8"), Component.text("9"), Component.text("10"), Component.text("1"), Component.text("2"), Component.text("3"), Component.text("4"), Component.text("5"), Component.text("6"), Component.text("7"), Component.text("8"), Component.text("9"), Component.text("10"), Component.text("1"), Component.text("2"), Component.text("3"), Component.text("4"), Component.text("5"), Component.text("6"), Component.text("7"), Component.text("8"), Component.text("9"), Component.text("10"), Component.text("1"), Component.text("2"), Component.text("3"), Component.text("4"), Component.text("5"), Component.text("6"), Component.text("7"), Component.text("8"), Component.text("9"), Component.text("10"), Component.text("1"), Component.text("2"), Component.text("3"), Component.text("4"), Component.text("5"), Component.text("6"), Component.text("7"), Component.text("8"), Component.text("9"), Component.text("10"), Component.text("1"), Component.text("2"), Component.text("3"), Component.text("4"), Component.text("5"), Component.text("6"), Component.text("7"), Component.text("8"), Component.text("9"), Component.text("10"));
private YamlConfiguration langConfig;
@@ -38,123 +32,60 @@ void setUp() {
langConfig = YamlConfiguration.loadConfiguration(new InputStreamReader(Objects.requireNonNull(getClass().getResourceAsStream("/lang.yml"))));
}
- @Test
- void testPagination() {
- CommandPagination pagination = new CommandPagination(toPaginate, 18, langConfig);
-
- List expected = Arrays.asList(
- getPaginationHeader(1, 4),
- "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
- "1", "2", "3", "4", "5", "6", "7", "8",
- getPaginationFooter());
+ private @NonNull List paginate(List items, int page) {
+ List result = new ArrayList<>();
+ new CommandPagination(items, 18, langConfig).sendPage(page, result::add);
+ return result;
+ }
- List result = new ArrayList<>();
- pagination.sendPage(1, result::add);
- assertEquals(expected, result);
+ @Test
+ void testPagination() {
+ List expected = Arrays.asList(getPaginationHeader(1, 4), Component.text("1"), Component.text("2"), Component.text("3"), Component.text("4"), Component.text("5"), Component.text("6"), Component.text("7"), Component.text("8"), Component.text("9"), Component.text("10"), Component.text("1"), Component.text("2"), Component.text("3"), Component.text("4"), Component.text("5"), Component.text("6"), Component.text("7"), Component.text("8"), getPaginationFooter());
+ assertEquals(expected, paginate(toPaginate, 1));
}
@Test
void testPaginationPage2() {
- CommandPagination pagination = new CommandPagination(toPaginate, 18, langConfig);
-
- List expected = Arrays.asList(
- getPaginationHeader(2, 4),
- "9", "10", "1", "2", "3", "4", "5", "6", "7", "8",
- "9", "10", "1", "2", "3", "4", "5", "6",
- getPaginationFooter());
-
- List result = new ArrayList<>();
- pagination.sendPage(2, result::add);
-
- assertEquals(expected, result);
+ List expected = Arrays.asList(getPaginationHeader(2, 4), Component.text("9"), Component.text("10"), Component.text("1"), Component.text("2"), Component.text("3"), Component.text("4"), Component.text("5"), Component.text("6"), Component.text("7"), Component.text("8"), Component.text("9"), Component.text("10"), Component.text("1"), Component.text("2"), Component.text("3"), Component.text("4"), Component.text("5"), Component.text("6"), getPaginationFooter());
+ assertEquals(expected, paginate(toPaginate, 2));
}
@Test
void testPaginationPage3() {
- CommandPagination pagination = new CommandPagination(toPaginate, 18, langConfig);
-
- List expected = Arrays.asList(
- getPaginationHeader(3, 4),
- "7", "8", "9", "10", "1", "2", "3", "4", "5", "6",
- "7", "8", "9", "10", "1", "2", "3", "4",
- getPaginationFooter());
-
- List result = new ArrayList<>();
- pagination.sendPage(3, result::add);
-
- assertEquals(expected, result);
+ List expected = Arrays.asList(getPaginationHeader(3, 4), Component.text("7"), Component.text("8"), Component.text("9"), Component.text("10"), Component.text("1"), Component.text("2"), Component.text("3"), Component.text("4"), Component.text("5"), Component.text("6"), Component.text("7"), Component.text("8"), Component.text("9"), Component.text("10"), Component.text("1"), Component.text("2"), Component.text("3"), Component.text("4"), getPaginationFooter());
+ assertEquals(expected, paginate(toPaginate, 3));
}
@Test
void testPaginationPage4() {
- CommandPagination pagination = new CommandPagination(toPaginate, 18, langConfig);
-
- List expected = Arrays.asList(
- getPaginationHeader(4, 4),
- "5", "6", "7", "8", "9", "10",
- getPaginationFooter());
-
- List result = new ArrayList<>();
- pagination.sendPage(4, result::add);
-
- assertEquals(expected, result);
+ List expected = Arrays.asList(getPaginationHeader(4, 4), Component.text("5"), Component.text("6"), Component.text("7"), Component.text("8"), Component.text("9"), Component.text("10"), getPaginationFooter());
+ assertEquals(expected, paginate(toPaginate, 4));
}
@Test
void testPaginationPage5WhenOnly4Pages() {
- CommandPagination pagination = new CommandPagination(toPaginate, 18, langConfig);
-
- List expected = Arrays.asList(
- getPaginationHeader(4, 4),
- "5", "6", "7", "8", "9", "10",
- getPaginationFooter());
-
- List result = new ArrayList<>();
- pagination.sendPage(5, result::add);
-
- assertEquals(expected, result);
+ List expected = Arrays.asList(getPaginationHeader(4, 4), Component.text("5"), Component.text("6"), Component.text("7"), Component.text("8"), Component.text("9"), Component.text("10"), getPaginationFooter());
+ assertEquals(expected, paginate(toPaginate, 5));
}
@Test
void testPaginationPageSinglePage() {
- CommandPagination pagination = new CommandPagination(Collections.singletonList("1"), 18, langConfig);
-
- List expected = Arrays.asList(
- getPaginationHeader(1, 1),
- "1",
- getPaginationFooter());
-
- List result = new ArrayList<>();
- pagination.sendPage(5, result::add);
-
- assertEquals(expected, result);
+ List expected = Arrays.asList(getPaginationHeader(1, 1), Component.text("1"), getPaginationFooter());
+ assertEquals(expected, paginate(Collections.singletonList(Component.text("1")), 5));
}
@Test
void testEmptyPagination() {
- CommandPagination pagination = new CommandPagination(Collections.emptyList(), 18, langConfig);
-
- List expected = Arrays.asList(
- getPaginationHeader(0, 0),
- getPaginationFooter());
-
- List result = new ArrayList<>();
- pagination.sendPage(1, result::add);
-
- assertEquals(expected, result);
+ List expected = Arrays.asList(getPaginationHeader(0, 0), getPaginationFooter());
+ assertEquals(expected, paginate(Collections.emptyList(), 1));
}
- @Contract("_, _ -> new")
- private @NonNull String getPaginationHeader(int page, int max) {
- return ChatColor.translateAlternateColorCodes('&',
- Objects.requireNonNull(StringUtils.replaceEach(langConfig.getString("pagination-header"), new String[]{"PAGE", "MAX"},
- new String[]{Integer.toString(page), Integer.toString(max)})));
+ private @NonNull Component getPaginationHeader(int page, int max) {
+ return ColorHelper.convertAmpersandToComponent(StringUtils.replaceEach(langConfig.getString("pagination-header"), new String[]{"PAGE", "MAX"}, new String[]{Integer.toString(page), Integer.toString(max)}));
}
- @Contract(" -> new")
- private @NonNull String getPaginationFooter() {
- return ChatColor.translateAlternateColorCodes('&', Objects.requireNonNull(langConfig.getString("pagination-footer")));
+ private @NonNull Component getPaginationFooter() {
+ return ColorHelper.convertAmpersandToComponent(langConfig.getString("pagination-footer"));
}
-
-}
+}
\ No newline at end of file
diff --git a/advanced-achievements-plugin/src/test/java/com/hm/achievement/config/RewardParserTest.java b/advanced-achievements-plugin/src/test/java/com/hm/achievement/config/RewardParserTest.java
index fd972081..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;
@@ -10,9 +11,9 @@
import java.util.List;
import java.util.Objects;
import java.util.logging.Logger;
+import java.util.stream.Collectors;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent;
-import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
import net.milkbowl.vault.economy.Economy;
import org.bukkit.Location;
import org.bukkit.Server;
@@ -67,13 +68,11 @@ void setUp() throws URISyntaxException, IOException, InvalidConfigurationExcepti
void shouldParseMoneyRewardSingular() throws URISyntaxException, IOException, InvalidConfigurationException {
mainConfig.load(Paths.get(Objects.requireNonNull(getClass().getClassLoader().getResource("reward-parser/money-1.yml")).toURI()).toFile());
when(economy.currencyNameSingular()).thenReturn("coin");
-
List rewards = underTest.parseRewards("Reward");
-
assertEquals(1, rewards.size());
Reward reward = rewards.getFirst();
assertEquals(List.of("receive 1 coin"), reward.listTexts());
- assertEquals(List.of("You received: 1 coin!"), reward.chatTexts());
+ assertEquals(List.of("You received: 1 coin!"), reward.chatTexts().stream().map(StringHelper::componentToString).collect(Collectors.toList()));
reward.rewarder().accept(player);
verify(economy).depositPlayer(player, 1);
}
@@ -82,13 +81,11 @@ void shouldParseMoneyRewardSingular() throws URISyntaxException, IOException, In
void shouldParseMoneyRewardPlural() throws URISyntaxException, IOException, InvalidConfigurationException {
mainConfig.load(Paths.get(Objects.requireNonNull(getClass().getClassLoader().getResource("reward-parser/money-2.yml")).toURI()).toFile());
when(economy.currencyNamePlural()).thenReturn("coins");
-
List rewards = underTest.parseRewards("Reward");
-
assertEquals(1, rewards.size());
Reward reward = rewards.getFirst();
assertEquals(List.of("receive 2 coins"), reward.listTexts());
- assertEquals(List.of("You received: 2 coins!"), reward.chatTexts());
+ assertEquals(List.of("You received: 2 coins!"), reward.chatTexts().stream().map(StringHelper::componentToString).collect(Collectors.toList()));
reward.rewarder().accept(player);
verify(economy).depositPlayer(player, 2);
}
@@ -101,17 +98,14 @@ void shouldParseSingleCommandReward() throws URISyntaxException, IOException, In
when(player.getLocation()).thenReturn(new Location(world, 1, 5, 8));
when(player.getWorld()).thenReturn(world);
when(world.getName()).thenReturn("Nether");
-
List rewards = underTest.parseRewards("Reward");
-
assertEquals(1, rewards.size());
Reward reward = rewards.getFirst();
assertEquals(List.of("teleportation to somewhere special!"), reward.listTexts());
- assertEquals(List.of("You received your reward: teleportation to somewhere special!"), reward.chatTexts());
+ assertEquals(List.of("You received your reward: teleportation to somewhere special!"), reward.chatTexts().stream().map(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
@@ -122,33 +116,26 @@ void shouldParseMultipleCommandRewards() throws URISyntaxException, IOException,
when(player.getLocation()).thenReturn(new Location(world, 1, 5, 8));
when(player.getWorld()).thenReturn(world);
when(world.getName()).thenReturn("Nether");
-
List rewards = underTest.parseRewards("Reward");
-
assertEquals(1, rewards.size());
Reward reward = rewards.getFirst();
assertEquals(Arrays.asList("display 1", "display 2"), reward.listTexts());
- assertEquals(Arrays.asList("You received your reward: display 1", "You received your reward: display 2"),
- reward.chatTexts());
+ assertEquals(Arrays.asList("You received your reward: display 1", "You received your reward: display 2"), reward.chatTexts().stream().map(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
void shouldParseExperienceReward() throws URISyntaxException, IOException, InvalidConfigurationException {
mainConfig.load(Paths.get(Objects.requireNonNull(getClass().getClassLoader().getResource("reward-parser/experience.yml")).toURI()).toFile());
-
List rewards = underTest.parseRewards("Reward");
-
assertEquals(1, rewards.size());
Reward reward = rewards.getFirst();
assertEquals(List.of("receive 500 experience"), reward.listTexts());
- assertEquals(List.of("You received: 500 experience!"), reward.chatTexts());
+ assertEquals(List.of("You received: 500 experience!"), reward.chatTexts().stream().map(StringHelper::componentToString).collect(Collectors.toList()));
reward.rewarder().accept(player);
verify(player).giveExp(500);
}
@@ -160,13 +147,11 @@ void shouldParseMaxHealthReward() throws URISyntaxException, IOException, Invali
AttributeInstance healthAttribute = Mockito.mock(AttributeInstance.class);
when(player.getAttribute(any())).thenReturn(healthAttribute);
when(healthAttribute.getBaseValue()).thenReturn(1.0);
-
List rewards = underTest.parseRewards("Reward");
-
assertEquals(1, rewards.size());
Reward reward = rewards.getFirst();
assertEquals(List.of("increase max health by 2"), reward.listTexts());
- assertEquals(List.of("Your max health has increased by 2!"), reward.chatTexts());
+ assertEquals(List.of("Your max health has increased by 2!"), reward.chatTexts().stream().map(StringHelper::componentToString).collect(Collectors.toList()));
reward.rewarder().accept(player);
verify(player).getAttribute(Attribute.MAX_HEALTH);
verify(healthAttribute).setBaseValue(3.0);
@@ -176,15 +161,12 @@ void shouldParseMaxHealthReward() throws URISyntaxException, IOException, Invali
void shouldParseMaxOxygenReward() throws URISyntaxException, IOException, InvalidConfigurationException {
mainConfig.load(Paths.get(Objects.requireNonNull(getClass().getClassLoader().getResource("reward-parser/max-oxygen.yml")).toURI()).toFile());
when(player.getMaximumAir()).thenReturn(5);
-
List rewards = underTest.parseRewards("Reward");
-
assertEquals(1, rewards.size());
Reward reward = rewards.getFirst();
assertEquals(List.of("increase max oxygen by 10"), reward.listTexts());
- assertEquals(List.of("Your max oxygen has increased by 10!"), reward.chatTexts());
+ assertEquals(List.of("Your max oxygen has increased by 10!"), reward.chatTexts().stream().map(StringHelper::componentToString).collect(Collectors.toList()));
reward.rewarder().accept(player);
verify(player).setMaximumAir(15);
}
-
-}
+}
\ No newline at end of file
diff --git a/advanced-achievements-plugin/src/test/java/com/hm/achievement/listener/PlayerAdvancedAchievementListenerTest.java b/advanced-achievements-plugin/src/test/java/com/hm/achievement/listener/PlayerAdvancedAchievementListenerTest.java
index e6bfd2d8..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,12 +2,14 @@
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;
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;
@@ -38,7 +40,7 @@
@ExtendWith(MockitoExtension.class)
class PlayerAdvancedAchievementListenerTest {
- private static final String PLUGIN_HEADER = "[HEADER]";
+ private static final PluginHeader PLUGIN_HEADER = new PluginHeader(new StringBuilder("[HEADER]"));
private static final UUID PLAYER_UUID = UUID.randomUUID();
@Mock
@@ -51,17 +53,19 @@ 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"))));
- PlayerAdvancedAchievementListener underTest = new PlayerAdvancedAchievementListener(mainConfig, langConfig, mock(Logger.class),
- new StringBuilder(PLUGIN_HEADER), new CacheManager(plugin, abstractDatabaseManager), plugin, null,
- achievementMap, abstractDatabaseManager, null, new FancyMessageSender(16));
+ YamlConfiguration mainConfig;
+ 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);
when(player.getName()).thenReturn("DarkPyves");
@@ -70,15 +74,8 @@ void itShouldRegisterNewAchievementInDatabase() {
Set receivedAchievements = new HashSet<>();
receivedAchievements.add("connect_1");
when(abstractDatabaseManager.getPlayerAchievementNames(PLAYER_UUID)).thenReturn(receivedAchievements);
- Achievement achievement = new AchievementBuilder()
- .name("connect_1")
- .displayName("Good Choice")
- .message("Connected for the first time!")
- .build();
-
+ Achievement achievement = new AchievementBuilder().name("connect_1").displayName("Good Choice").message("Connected for the first time!").build();
underTest.onPlayerAdvancedAchievementReception(new PlayerAdvancedAchievementEvent(player, achievement));
-
verify(abstractDatabaseManager).registerAchievement(eq(PLAYER_UUID), eq("connect_1"), anyLong());
}
-
}
\ No newline at end of file
diff --git a/advanced-achievements-plugin/src/test/java/com/hm/achievement/utils/ColorHelperTest.java b/advanced-achievements-plugin/src/test/java/com/hm/achievement/utils/ColorHelperTest.java
index 52f856bb..f131d5fd 100644
--- a/advanced-achievements-plugin/src/test/java/com/hm/achievement/utils/ColorHelperTest.java
+++ b/advanced-achievements-plugin/src/test/java/com/hm/achievement/utils/ColorHelperTest.java
@@ -2,19 +2,16 @@
import java.util.Locale;
import java.util.Set;
-import java.util.stream.Collectors;
import java.util.stream.Stream;
import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.util.Index;
-import org.bukkit.Color;
-import org.bukkit.boss.BarColor;
+import org.bukkit.configuration.file.YamlConfiguration;
import org.jspecify.annotations.NonNull;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
-import org.mockito.Mockito;
import static net.kyori.adventure.text.format.NamedTextColor.AQUA;
import static net.kyori.adventure.text.format.NamedTextColor.BLACK;
@@ -35,10 +32,6 @@
class ColorHelperTest {
- static @NonNull Stream namedAndBarColors() {
- return Stream.of(Arguments.of(BLACK, BarColor.PURPLE), Arguments.of(DARK_BLUE, BarColor.BLUE), Arguments.of(DARK_GREEN, BarColor.GREEN), Arguments.of(DARK_AQUA, BarColor.BLUE), Arguments.of(DARK_RED, BarColor.RED), Arguments.of(DARK_PURPLE, BarColor.PURPLE), Arguments.of(GOLD, BarColor.YELLOW), Arguments.of(GRAY, BarColor.WHITE), Arguments.of(DARK_GRAY, BarColor.PURPLE), Arguments.of(BLUE, BarColor.BLUE), Arguments.of(GREEN, BarColor.GREEN), Arguments.of(AQUA, BarColor.GREEN), Arguments.of(RED, BarColor.RED), Arguments.of(LIGHT_PURPLE, BarColor.PURPLE), Arguments.of(YELLOW, BarColor.YELLOW), Arguments.of(WHITE, BarColor.WHITE));
- }
-
static @NonNull Stream namedColors() {
return Stream.of(Arguments.of(BLACK), Arguments.of(DARK_BLUE), Arguments.of(DARK_GREEN), Arguments.of(DARK_AQUA), Arguments.of(DARK_RED), Arguments.of(DARK_PURPLE), Arguments.of(GOLD), Arguments.of(GRAY), Arguments.of(DARK_GRAY), Arguments.of(BLUE), Arguments.of(GREEN), Arguments.of(AQUA), Arguments.of(RED), Arguments.of(LIGHT_PURPLE), Arguments.of(YELLOW), Arguments.of(WHITE));
}
@@ -47,65 +40,57 @@ class ColorHelperTest {
return Stream.of(Arguments.of("not_a_color"), Arguments.of("#GGGGGG"), Arguments.of(""));
}
- @ParameterizedTest
- @MethodSource("namedAndBarColors")
- void shouldConvertNamedTextColorToBarColor(NamedTextColor namedTextColor, BarColor expectedBarColor) {
- BarColor actualBarColor = ColorHelper.convertChatColorToBarColor(namedTextColor);
- Assertions.assertEquals(expectedBarColor, actualBarColor);
- }
-
- @ParameterizedTest
- @MethodSource("namedColors")
- void shouldConvertNamedTextColorToBukkitCOlor(@NonNull NamedTextColor namedTextColor) {
- Color expectedColor = Color.fromRGB(namedTextColor.red(), namedTextColor.green(), namedTextColor.blue());
- Color actualColor = ColorHelper.convertChatColorToColor(namedTextColor);
- Assertions.assertEquals(expectedColor, actualColor);
- }
-
@ParameterizedTest
@MethodSource("invalidColorInputs")
- void shouldThrowOnInvalidColor(String input) {
+ void throwOnInvalidColor(String input) {
Assertions.assertThrows(RuntimeException.class, () -> ColorHelper.parseColor(input));
}
@ParameterizedTest
@MethodSource("namedColors")
- void shouldParseNamedTextColorCaseInsensitive(@NonNull NamedTextColor namedTextColor) {
+ void parseNamedTextColorCaseInsensitive(@NonNull NamedTextColor namedTextColor) {
String mixedCase = namedTextColor.toString().substring(0, 1).toUpperCase(Locale.ROOT) + namedTextColor.toString().substring(1).toLowerCase(Locale.ROOT);
NamedTextColor actual = ColorHelper.parseColor(mixedCase);
Assertions.assertEquals(namedTextColor, actual);
}
@Test
- void shouldReturnWhiteForUnknownNamedTextColor() {
- NamedTextColor namedTextColor = Mockito.mock(NamedTextColor.class);
- Mockito.when(namedTextColor.red()).thenReturn(123);
- Mockito.when(namedTextColor.green()).thenReturn(123);
- Mockito.when(namedTextColor.blue()).thenReturn(123);
- Color color = ColorHelper.convertChatColorToColor(namedTextColor);
- Assertions.assertEquals(Color.WHITE, color);
+ void returnWhiteWhenParsingNull() {
+ Assertions.assertEquals(WHITE, ColorHelper.parseColor(null));
+ }
+
+ @Test
+ void namedTextColorsArePresentInIndex() {
+ Index namesIndex = NamedTextColor.NAMES;
+ Set keys = namesIndex.keys();
+ Assertions.assertFalse(keys.isEmpty(), "NAMES index should contain all expected colors");
}
@Test
- void shouldReturnWhiteBarColorForUnknownNamedTextColor() {
- NamedTextColor namedTextColor = Mockito.mock(NamedTextColor.class);
- Mockito.when(namedTextColor.red()).thenReturn(123);
- Mockito.when(namedTextColor.green()).thenReturn(123);
- Mockito.when(namedTextColor.blue()).thenReturn(123);
- BarColor barColor = ColorHelper.convertChatColorToBarColor(namedTextColor);
- Assertions.assertEquals(BarColor.WHITE, barColor);
+ void parseHexColor() {
+ Assertions.assertEquals(AQUA, ColorHelper.parseColor("#55FFFF"));
}
@Test
- void shouldReturnWhiteWhenParsingNull() {
- Assertions.assertEquals(WHITE, ColorHelper.parseColor(null));
+ void parseHexColorWithoutHash() {
+ Assertions.assertEquals(AQUA, ColorHelper.parseColor("55FFFF"));
}
@Test
- void namedTextColorsArePresentinIndex() {
- Index namesIndex = NamedTextColor.NAMES;
- Set keys = namesIndex.keys();
- Set expectedNames = ColorHelper.ALL_NAMED_COLORS.stream().map(c -> c.toString().toLowerCase()).collect(Collectors.toSet());
- Assertions.assertTrue(keys.containsAll(expectedNames), "NAMES index should contain all expected colors");
+ void returnNearestNamedColorForApproximateHex() {
+ Assertions.assertEquals(RED, ColorHelper.parseColor("#FF5556"));
+ }
+
+ @Test
+ void returnConfiguredColor() {
+ YamlConfiguration config = new YamlConfiguration();
+ config.set("Color", "RED");
+ Assertions.assertEquals(RED, ColorHelper.configColor(config));
+ }
+
+ @Test
+ void returnsDarkPurpleAsDefaultConfigColor() {
+ YamlConfiguration config = new YamlConfiguration();
+ Assertions.assertEquals(DARK_PURPLE, ColorHelper.configColor(config));
}
}
\ No newline at end of file
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 0cf93095..00000000
--- a/advanced-achievements-plugin/src/test/java/com/hm/achievement/utils/NumberHelperTest.java
+++ /dev/null
@@ -1,16 +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(18, NumberHelper.nextMultipleOf9(17));
- assertEquals(18, NumberHelper.nextMultipleOf9(18));
- assertEquals(27, NumberHelper.nextMultipleOf9(19));
- }
-
-}
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
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
diff --git a/pom.xml b/pom.xml
index b6f39cb4..fa6b8478 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.2.build,)
provided
@@ -84,7 +84,6 @@
v5.2.6.2
provided
-
com.github.Zrips
CMI-API
@@ -154,7 +153,7 @@
com.google.guava
guava
- 33.5.0-jre
+ 33.6.0-jre
provided
@@ -228,6 +227,11 @@
McTestServer
1.0.6
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+ 3.10.0
+
\ No newline at end of file