Skip to content

Commit 7c23539

Browse files
26.1.2 (#160)
* Update for 26.1.1 * Update workflow to Java 25 * Minor updates * Bump paper version * Bump paper * Change how plugin is named * Update for 26.1.2 * Mass format * Convert to Adventure rather than ChatColor * Prefix is now in grey as well * Spacing fix * Remove message as it's clear when this is granted anyway * Remove message as it's clear when this is granted anyway * Undo last 2 commits * Minor spacing changes * Cleaning up colors further - can now specify firework color in config * Code cleanup * Fix gui elements having color codes written in * Remove all instances of ChatColor * Update readme * Format * Update ConfigModule to use Component for PluginHeader * Add legacy stringbuilder for now * Readme update * Readme update * Possibly resolve #159 * Possibly resolve #157 * Fix compile error * Readme update - Changes to support this are still in the works * Potential fix for pull request finding 'Potential input resource leak' Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com> * Github CQ suggestion * Hardcode more colours into strings * Combine lines * Revert readme * Fix commands appearing as raw strings * Fixes #159 * Closes #165 * Inline variable * Expand test suite * Inline method to remove class * Code cleanup * Fix #162 * Update paper version * Dependency update * Disable tests to continue working. Adventure update broke a lot of these * Revert adventure update * Code refactor Code refactor * Fix #166 * Update config links * Embed method * Embed method * Fix #161 * Capitals * Make 'HINT' light grey again * Fix #174 * Fix #173, #171, #157 * Fix tests * Fix #172 --------- Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>
1 parent ad158bc commit 7c23539

75 files changed

Lines changed: 794 additions & 1315 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/maven.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ jobs:
1111
runs-on: ubuntu-latest
1212
steps:
1313
- uses: actions/checkout@v6.0.2
14-
- name: Set up JDK 21
14+
- name: Set up JDK 25
1515
uses: actions/setup-java@v5.2.0
1616
with:
17-
java-version: '21'
17+
java-version: '25'
1818
distribution: 'microsoft'
1919
cache: maven
2020
- name: Build with Maven

CONTRIBUTING.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
Found a problem or need some help? The following steps may help:
44

55
1. Upgrade to the latest version of the plugin (
6-
available [here](https://www.spigotmc.org/resources/advancedachievements.121486/history)) and a recent Paper build for
6+
available [here](https://www.spigotmc.org/resources/advancedachievements.121486/history)) and a recent Paper build
7+
for
78
your Minecraft version (see [here](https://docs.papermc.io/paper/getting-started)).
89
2. Check your server's logs (including when plugins are loaded!), there may be warnings/errors/stack straces to help you
910
out with your issue.

README.md

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
Custom fork for Minecraft server 1MoreBlock.com
1212

13-
Recent changes include java 21+, 1.21.11, and legacy color code fixes.
13+
Recent changes include Java 25, 26.1.2, and removing deprecated ChatColor methods in favour of Adventure Components.
1414

1515
**Advanced Achievements enables unique and challenging achievements on Minecraft servers. Collect as many as you can,
1616
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.)
2626
<br/>
2727
</p>
2828

29-
## :star: Support and feedback
29+
## Support and feedback
3030

31-
Thought of a cool idea? Found a problem or need some help? Simply open an [**issue
32-
**](https://github.com/mrfdev/advanced-achievements/issues)!
31+
Thought of a cool idea? Found a problem or need some help? Simply open an [**issue**](https://github.com/mrfdev/advanced-achievements/issues)!
3332

3433
Find the project useful, fun or interesting? **Star** the repository by clicking on the icon on the top right of this
3534
page!
3635

37-
## :computer: Code contributions
36+
## 🖥️ Code contributions
3837

3938
Want to make Advanced Achievements better, faster, stronger? Contributions are welcome, open a **pull request** and
4039
share your code! Simply **fork** the repository by clicking on the icon on the top right of this page to get started.
4140

42-
## :balance_scale: License
41+
## ⚖️ License
4342

4443
GNU General Public License v3.0
4544

46-
## Special credits
45+
## 📜 Special credits
4746

4847
Pierre-Yves Bigourdan, [@PyvesB](https://github.com/PyvesB/)

advanced-achievements-api/src/main/java/com/hm/achievement/domain/Reward.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@
22

33
import java.util.List;
44
import java.util.function.Consumer;
5+
import net.kyori.adventure.text.Component;
56
import org.bukkit.entity.Player;
67

7-
public record Reward(List<String> listTexts, List<String> chatTexts, Consumer<Player> rewarder) {
8-
9-
8+
public record Reward(List<String> listTexts, List<Component> chatTexts, Consumer<Player> rewarder) {
109
}

advanced-achievements-plugin/pom.xml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@
5252
<artifactId>petmaster</artifactId>
5353
<scope>provided</scope>
5454
</dependency>
55-
<!--suppress VulnerableLibrariesLocal -->
5655
<dependency>
5756
<groupId>com.github.Zrips</groupId>
5857
<artifactId>CMI-API</artifactId>
@@ -163,7 +162,7 @@
163162
<executions>
164163
<execution>
165164
<configuration>
166-
<finalName>advanced-achievements-plugin-${project.version}</finalName>
165+
<finalName>advanced-achievements-${project.version}</finalName>
167166
<minimizeJar>true</minimizeJar>
168167
<createDependencyReducedPom>false</createDependencyReducedPom>
169168
<outputFile>${project.build.directory}/${project.build.finalName}.jar</outputFile>
@@ -197,6 +196,10 @@
197196
<shadedPattern>com.hm.fasterxml.jackson</shadedPattern>
198197
</relocation>
199198
</relocations>
199+
<transformers>
200+
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
201+
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"/>
202+
</transformers>
200203
</configuration>
201204
<phase>package</phase>
202205
<goals>

advanced-achievements-plugin/src/main/java/com/hm/achievement/AdvancedAchievements.java

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,7 @@
1919
import org.bukkit.plugin.java.JavaPlugin;
2020

2121
@Singleton
22-
@Component(modules = {
23-
CleanableModule.class,
24-
CommandModule.class,
25-
ConfigModule.class,
26-
DatabaseModule.class,
27-
ReloadableModule.class,
28-
ServerVersionModule.class
29-
})
22+
@Component(modules = {CleanableModule.class, CommandModule.class, ConfigModule.class, DatabaseModule.class, ReloadableModule.class, ServerVersionModule.class})
3023
interface AdvancedAchievementsComponent {
3124

3225
PluginLoader pluginLoader();
@@ -64,30 +57,27 @@ public void onEnable() {
6457
long startTime = System.currentTimeMillis();
6558
// DaggerAdvancedAchievementsComponent is generated by Dagger. Add target/generated-sources/annotations to your
6659
// build path if the IDE complains here. In any case this will not actually prevent you from compiling.
67-
AdvancedAchievementsComponent advancedAchievementsComponent = DaggerAdvancedAchievementsComponent.builder()
68-
.advancedAchievements(this).logger(getLogger()).build();
60+
AdvancedAchievementsComponent advancedAchievementsComponent = DaggerAdvancedAchievementsComponent.builder().advancedAchievements(this).logger(getLogger()).build();
6961

7062
pluginLoader = advancedAchievementsComponent.pluginLoader();
7163
advancedAchievementsAPI = advancedAchievementsComponent.advancedAchievementsBukkitAPI();
7264

7365
try {
7466
pluginLoader.loadAdvancedAchievements();
7567
} catch (PluginLoadError e) {
76-
getLogger().log(Level.SEVERE,
77-
"A non recoverable error was encountered while loading the plugin, disabling it:", e);
68+
getLogger().log(Level.SEVERE, "A non recoverable error was encountered while loading the plugin, disabling it:", e);
7869
Bukkit.getPluginManager().disablePlugin(this);
7970
return;
8071
}
81-
82-
getLogger().info(
83-
"Plugin has finished loading and is ready to run! Took " + (System.currentTimeMillis() - startTime) + "ms.");
72+
getLogger().info("Plugin has finished loading and is ready to run! Took " + (System.currentTimeMillis() - startTime) + "ms.");
8473
}
8574

8675
@Override
8776
public void onDisable() {
8877
pluginLoader.disableAdvancedAchievements();
8978
}
9079

80+
@SuppressWarnings("unused")
9181
public AdvancedAchievementsAPI getAdvancedAchievementsAPI() {
9282
return advancedAchievementsAPI;
9383
}

advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractCommand.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package com.hm.achievement.command.executable;
22

3+
import com.hm.achievement.config.PluginHeader;
34
import com.hm.achievement.lifecycle.Reloadable;
4-
import org.bukkit.ChatColor;
5+
import net.kyori.adventure.text.Component;
56
import org.bukkit.command.CommandSender;
67
import org.bukkit.configuration.file.YamlConfiguration;
8+
import org.jspecify.annotations.NonNull;
79

810
/**
911
* Abstract class in charge of factoring out common functionality for commands.
@@ -14,11 +16,11 @@ public abstract class AbstractCommand implements Reloadable {
1416

1517
final YamlConfiguration mainConfig;
1618
final YamlConfiguration langConfig;
17-
final StringBuilder pluginHeader;
19+
final PluginHeader pluginHeader;
1820

1921
private String langNoPermissions;
2022

21-
AbstractCommand(YamlConfiguration mainConfig, YamlConfiguration langConfig, StringBuilder pluginHeader) {
23+
AbstractCommand(YamlConfiguration mainConfig, YamlConfiguration langConfig, PluginHeader pluginHeader) {
2224
this.mainConfig = mainConfig;
2325
this.langConfig = langConfig;
2426
this.pluginHeader = pluginHeader;
@@ -53,7 +55,12 @@ public void execute(CommandSender sender, String[] args) {
5355
*/
5456
abstract void onExecute(CommandSender sender, String[] args);
5557

56-
String translateColorCodes(String translate) {
57-
return ChatColor.translateAlternateColorCodes('&', translate);
58+
protected Component replace(@NonNull Component component, String placeholder, String value) {
59+
return component.replaceText(b -> b.matchLiteral(placeholder).replacement(value));
60+
}
61+
62+
protected Component replace(@NonNull Component component, String @NonNull [] placeholders, String[] values) {
63+
for (int i = 0; i < placeholders.length; i++) component = replace(component, placeholders[i], values[i]);
64+
return component;
5865
}
5966
}

advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractParsableCommand.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.hm.achievement.command.executable;
22

33
import com.hm.achievement.command.external.CommandUtils;
4+
import com.hm.achievement.config.PluginHeader;
45
import org.apache.commons.lang3.StringUtils;
56
import org.bukkit.command.CommandSender;
67
import org.bukkit.configuration.file.YamlConfiguration;
@@ -18,7 +19,7 @@ public abstract class AbstractParsableCommand extends AbstractCommand {
1819
private String langPlayerOffline;
1920
private String langEntityNotPlayer;
2021

21-
AbstractParsableCommand(YamlConfiguration mainConfig, YamlConfiguration langConfig, StringBuilder pluginHeader) {
22+
AbstractParsableCommand(YamlConfiguration mainConfig, YamlConfiguration langConfig, PluginHeader pluginHeader) {
2223
super(mainConfig, langConfig, pluginHeader);
2324
}
2425

advanced-achievements-plugin/src/main/java/com/hm/achievement/command/executable/AbstractRankingCommand.java

Lines changed: 29 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package com.hm.achievement.command.executable;
22

33
import com.hm.achievement.command.pagination.CommandPagination;
4+
import com.hm.achievement.config.PluginHeader;
45
import com.hm.achievement.db.AbstractDatabaseManager;
6+
import com.hm.achievement.utils.ColorHelper;
57
import com.hm.achievement.utils.SoundPlayer;
68
import com.hm.achievement.utils.StringHelper;
79
import java.util.ArrayList;
@@ -11,13 +13,15 @@
1113
import java.util.Objects;
1214
import java.util.UUID;
1315
import java.util.logging.Logger;
16+
import net.kyori.adventure.text.Component;
17+
import net.kyori.adventure.text.format.NamedTextColor;
1418
import org.apache.commons.lang3.math.NumberUtils;
1519
import org.bukkit.Bukkit;
16-
import org.bukkit.ChatColor;
1720
import org.bukkit.Particle;
1821
import org.bukkit.command.CommandSender;
1922
import org.bukkit.configuration.file.YamlConfiguration;
2023
import org.bukkit.entity.Player;
24+
import org.jspecify.annotations.NonNull;
2125

2226
/**
2327
* 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 {
3943
private final AbstractDatabaseManager databaseManager;
4044
private final SoundPlayer soundPlayer;
4145

42-
private ChatColor configColor;
46+
private NamedTextColor configColor;
4347
private int configTopList;
4448
private boolean configAdditionalEffects;
4549
private boolean configSound;
4650
private String configSoundRanking;
47-
private String langPeriodAchievement;
48-
private String langPlayerRank;
49-
private String langNotRanked;
51+
private Component langPeriodAchievement;
52+
private Component langPlayerRank;
53+
private Component langNotRanked;
5054
// Used for caching.
5155
private Map<String, Integer> cachedSortedRankings;
5256
private List<Integer> cachedAchievementCounts;
5357
private long lastCacheUpdate = 0L;
5458

55-
AbstractRankingCommand(YamlConfiguration mainConfig, YamlConfiguration langConfig, StringBuilder pluginHeader,
56-
Logger logger, String languageKey, AbstractDatabaseManager databaseManager, SoundPlayer soundPlayer) {
59+
AbstractRankingCommand(YamlConfiguration mainConfig, YamlConfiguration langConfig, PluginHeader pluginHeader, Logger logger, String languageKey, AbstractDatabaseManager databaseManager, SoundPlayer soundPlayer) {
5760
super(mainConfig, langConfig, pluginHeader);
5861
this.logger = logger;
5962
this.languageKey = languageKey;
@@ -64,16 +67,15 @@ public abstract class AbstractRankingCommand extends AbstractCommand {
6467
@Override
6568
public void extractConfigurationParameters() {
6669
super.extractConfigurationParameters();
67-
68-
configColor = ChatColor.getByChar(Objects.requireNonNull(mainConfig.getString("Color")));
70+
configColor = ColorHelper.configColor(mainConfig);
6971
configTopList = mainConfig.getInt("TopList");
7072
configAdditionalEffects = mainConfig.getBoolean("AdditionalEffects");
7173
configSound = mainConfig.getBoolean("Sound");
7274
configSoundRanking = Objects.requireNonNull(mainConfig.getString("SoundRanking")).toUpperCase();
7375

74-
langPeriodAchievement = pluginHeader + langConfig.getString(languageKey);
75-
langPlayerRank = pluginHeader + langConfig.getString("player-rank") + " " + configColor;
76-
langNotRanked = pluginHeader + langConfig.getString("not-ranked");
76+
langPeriodAchievement = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString(languageKey)))).build();
77+
langPlayerRank = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("player-rank")))).append(Component.text(" ").color(configColor)).build();
78+
langNotRanked = Component.text().append(pluginHeader.get()).append(Component.text(Objects.requireNonNull(langConfig.getString("not-ranked")))).build();
7779
}
7880

7981
@Override
@@ -87,7 +89,7 @@ public void onExecute(CommandSender sender, String[] args) {
8789

8890
sender.sendMessage(langPeriodAchievement);
8991

90-
List<String> rankingMessages = getRankingMessages(sender);
92+
List<Component> rankingMessages = getRankingMessages(sender);
9193

9294
// If config has top set at less than one page, don't use pagination.
9395
if (configTopList < PER_PAGE) {
@@ -110,43 +112,36 @@ public void onExecute(CommandSender sender, String[] args) {
110112
if (playerRank <= configTopList) {
111113
launchEffects((Player) sender);
112114
}
113-
sender.sendMessage(
114-
langPlayerRank + playerRank + ChatColor.GRAY + "/" + configColor + cachedSortedRankings.size());
115+
sender.sendMessage(langPlayerRank.append(Component.text(playerRank)).color(NamedTextColor.GRAY).append(Component.text("/").append(Component.text(cachedSortedRankings.size()))).color(NamedTextColor.GRAY));
115116
}
116117
}
117118
}
118119

119-
private int getPage(String[] args) {
120+
private int getPage(String @NonNull [] args) {
120121
return args.length > 1 && NumberUtils.isDigits(args[1]) ? Integer.parseInt(args[1]) : 1;
121122
}
122123

123-
private List<String> getRankingMessages(CommandSender sender) {
124-
List<String> rankingMessages = new ArrayList<>();
124+
private @NonNull List<Component> getRankingMessages(CommandSender sender) {
125+
List<Component> rankingMessages = new ArrayList<>();
125126
int currentRank = 1;
126127
for (Entry<String, Integer> ranking : cachedSortedRankings.entrySet()) {
127128
String playerName = Bukkit.getOfflinePlayer(UUID.fromString(ranking.getKey())).getName();
128129
if (playerName != null) {
129-
// Color the name of the player if he is in the top list.
130-
ChatColor color = playerName.equals(sender.getName()) ? configColor : ChatColor.GRAY;
131-
rankingMessages.add(color + " " + getRankingSymbol(currentRank) + " " + playerName + " - "
132-
+ ranking.getValue());
133-
} else {
134-
logger.warning("Ranking command: could not find player's name using a database UUID.");
135-
}
136-
130+
// Colour the name of the player if he is in the top list.
131+
NamedTextColor color = playerName.equals(sender.getName()) ? configColor : NamedTextColor.GRAY;
132+
rankingMessages.add(Component.text(" " + getRankingSymbol(currentRank) + " " + playerName + " - " + ranking.getValue()).color(color));
133+
} else logger.warning("Ranking command: could not find player's name using a database UUID.");
137134
++currentRank;
138-
if (currentRank > configTopList) {
139-
break;
140-
}
135+
if (currentRank > configTopList) break;
141136
}
142137
return rankingMessages;
143138
}
144139

145140
/**
146141
* Returns a UTF-8 circled number based on the player's rank.
147142
*
148-
* @param rank
149-
* @return an UTF-8 string corresponding to the rank
143+
* @param rank rank
144+
* @return a UTF-8 string corresponding to the rank
150145
*/
151146
private String getRankingSymbol(int rank) {
152147
int decimalRankSymbol;
@@ -172,15 +167,10 @@ private String getRankingSymbol(int rank) {
172167
/**
173168
* Launches sound and particle effects if player is in a top list.
174169
*
175-
* @param player
170+
* @param player player
176171
*/
177172
private void launchEffects(Player player) {
178-
if (configAdditionalEffects) {
179-
player.spawnParticle(Particle.PORTAL, player.getLocation(), 100, 0, 1, 0, 0.5f);
180-
}
181-
182-
if (configSound) {
183-
soundPlayer.play(player, configSoundRanking, "ENTITY_FIREWORK_ROCKET_BLAST");
184-
}
173+
if (configAdditionalEffects) player.spawnParticle(Particle.PORTAL, player.getLocation(), 100, 0, 1, 0, 0.5f);
174+
if (configSound) soundPlayer.play(player, configSoundRanking, "ENTITY_FIREWORK_ROCKET_BLAST");
185175
}
186176
}

0 commit comments

Comments
 (0)