diff --git a/Changelog.txt b/Changelog.txt
index 3ed7ca030..f95617216 100644
--- a/Changelog.txt
+++ b/Changelog.txt
@@ -1,7 +1,8 @@
Version 2.2.040
+ Fixed hover component and action bar messages not working for 1.21.6 and 1.21.7
+ Fixed bug where entries of mctop could be duplicated when using FlatFile
Fixed bug where a party leader could leave a party and the party would be left without a party leader
- Fixed a bug where EcoEnchants or other similar plugins could cause an infinite loop within mcMMO
- (Codebase) Updated Adventure Libs
+ Fixed a bug where EcoEnchants and similar plugins could cause an infinite loop within mcMMO during TreeFeller and other abilities
Added 'Happy_Ghast' to experience.yml for combat XP
Added 'Ghastling' to experience.yml for combat XP
Updated Japanese (ja_JP) translation (Thanks ryota-abe)
diff --git a/pom.xml b/pom.xml
index 362d76172..7e60c4146 100644
--- a/pom.xml
+++ b/pom.xml
@@ -2,7 +2,7 @@
4.0.0
com.gmail.nossr50.mcMMO
mcMMO
- 2.2.040-SNAPSHOT
+ 2.2.040
mcMMO
https://github.com/mcMMO-Dev/mcMMO
diff --git a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java
index efc337e53..017a3b554 100644
--- a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java
+++ b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java
@@ -21,11 +21,11 @@ import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
-import java.util.Comparator;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.TreeSet;
import java.util.UUID;
import java.util.logging.Logger;
import org.bukkit.OfflinePlayer;
@@ -36,9 +36,9 @@ import org.jetbrains.annotations.Nullable;
public final class FlatFileDatabaseManager implements DatabaseManager {
public static final String IGNORED = "IGNORED";
public static final String LEGACY_INVALID_OLD_USERNAME = "_INVALID_OLD_USERNAME_'";
- private final @NotNull EnumMap> playerStatHash = new EnumMap<>(
+ private final @NotNull EnumMap> leaderboardMap = new EnumMap<>(
PrimarySkillType.class);
- private final @NotNull List powerLevels = new ArrayList<>();
+ private @NotNull List powerLevels = new ArrayList<>();
private long lastUpdate = 0;
private final @NotNull String usersFilePath;
private final @NotNull Logger logger;
@@ -562,7 +562,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager {
updateLeaderboards();
List statsList =
- primarySkillType == null ? powerLevels : playerStatHash.get(primarySkillType);
+ primarySkillType == null ? powerLevels : leaderboardMap.get(primarySkillType);
int fromIndex = (Math.max(pageNumber, 1) - 1) * statsPerPage;
return statsList.subList(Math.min(fromIndex, statsList.size()),
@@ -575,10 +575,9 @@ public final class FlatFileDatabaseManager implements DatabaseManager {
HashMap skills = new HashMap<>();
for (PrimarySkillType skill : SkillTools.NON_CHILD_SKILLS) {
- skills.put(skill, getPlayerRank(playerName, playerStatHash.get(skill)));
+ skills.put(skill, getPlayerRank(playerName, leaderboardMap.get(skill)));
}
- //TODO: Gross
skills.put(null, getPlayerRank(playerName, powerLevels));
return skills;
@@ -1039,25 +1038,24 @@ public final class FlatFileDatabaseManager implements DatabaseManager {
}
lastUpdate = System.currentTimeMillis(); // Log when the last update was run
- powerLevels.clear(); // Clear old values from the power levels
- // Initialize lists
- List mining = new ArrayList<>();
- List woodcutting = new ArrayList<>();
- List herbalism = new ArrayList<>();
- List excavation = new ArrayList<>();
- List acrobatics = new ArrayList<>();
- List repair = new ArrayList<>();
- List swords = new ArrayList<>();
- List axes = new ArrayList<>();
- List archery = new ArrayList<>();
- List unarmed = new ArrayList<>();
- List taming = new ArrayList<>();
- List fishing = new ArrayList<>();
- List alchemy = new ArrayList<>();
- List crossbows = new ArrayList<>();
- List tridents = new ArrayList<>();
- List maces = new ArrayList<>();
+ TreeSet powerLevelStats = new TreeSet<>();
+ TreeSet mining = new TreeSet<>();
+ TreeSet woodcutting = new TreeSet<>();
+ TreeSet herbalism = new TreeSet<>();
+ TreeSet excavation = new TreeSet<>();
+ TreeSet acrobatics = new TreeSet<>();
+ TreeSet repair = new TreeSet<>();
+ TreeSet swords = new TreeSet<>();
+ TreeSet axes = new TreeSet<>();
+ TreeSet archery = new TreeSet<>();
+ TreeSet unarmed = new TreeSet<>();
+ TreeSet taming = new TreeSet<>();
+ TreeSet fishing = new TreeSet<>();
+ TreeSet alchemy = new TreeSet<>();
+ TreeSet crossbows = new TreeSet<>();
+ TreeSet tridents = new TreeSet<>();
+ TreeSet maces = new TreeSet<>();
BufferedReader in = null;
String playerName = null;
@@ -1106,7 +1104,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager {
skills.get(PrimarySkillType.TRIDENTS));
powerLevel += putStat(maces, playerName, skills.get(PrimarySkillType.MACES));
- putStat(powerLevels, playerName, powerLevel);
+ putStat(powerLevelStats, playerName, powerLevel);
}
} catch (Exception e) {
logger.severe(
@@ -1125,42 +1123,23 @@ public final class FlatFileDatabaseManager implements DatabaseManager {
}
- SkillComparator c = new SkillComparator();
-
- mining.sort(c);
- woodcutting.sort(c);
- repair.sort(c);
- unarmed.sort(c);
- herbalism.sort(c);
- excavation.sort(c);
- archery.sort(c);
- swords.sort(c);
- axes.sort(c);
- acrobatics.sort(c);
- taming.sort(c);
- fishing.sort(c);
- alchemy.sort(c);
- crossbows.sort(c);
- tridents.sort(c);
- maces.sort(c);
- powerLevels.sort(c);
-
- playerStatHash.put(PrimarySkillType.MINING, mining);
- playerStatHash.put(PrimarySkillType.WOODCUTTING, woodcutting);
- playerStatHash.put(PrimarySkillType.REPAIR, repair);
- playerStatHash.put(PrimarySkillType.UNARMED, unarmed);
- playerStatHash.put(PrimarySkillType.HERBALISM, herbalism);
- playerStatHash.put(PrimarySkillType.EXCAVATION, excavation);
- playerStatHash.put(PrimarySkillType.ARCHERY, archery);
- playerStatHash.put(PrimarySkillType.SWORDS, swords);
- playerStatHash.put(PrimarySkillType.AXES, axes);
- playerStatHash.put(PrimarySkillType.ACROBATICS, acrobatics);
- playerStatHash.put(PrimarySkillType.TAMING, taming);
- playerStatHash.put(PrimarySkillType.FISHING, fishing);
- playerStatHash.put(PrimarySkillType.ALCHEMY, alchemy);
- playerStatHash.put(PrimarySkillType.CROSSBOWS, crossbows);
- playerStatHash.put(PrimarySkillType.TRIDENTS, tridents);
- playerStatHash.put(PrimarySkillType.MACES, maces);
+ powerLevels = List.copyOf(powerLevelStats);
+ leaderboardMap.put(PrimarySkillType.MINING, List.copyOf(mining));
+ leaderboardMap.put(PrimarySkillType.WOODCUTTING, List.copyOf(woodcutting));
+ leaderboardMap.put(PrimarySkillType.REPAIR, List.copyOf(repair));
+ leaderboardMap.put(PrimarySkillType.UNARMED, List.copyOf(unarmed));
+ leaderboardMap.put(PrimarySkillType.HERBALISM, List.copyOf(herbalism));
+ leaderboardMap.put(PrimarySkillType.EXCAVATION, List.copyOf(excavation));
+ leaderboardMap.put(PrimarySkillType.ARCHERY, List.copyOf(archery));
+ leaderboardMap.put(PrimarySkillType.SWORDS, List.copyOf(swords));
+ leaderboardMap.put(PrimarySkillType.AXES, List.copyOf(axes));
+ leaderboardMap.put(PrimarySkillType.ACROBATICS, List.copyOf(acrobatics));
+ leaderboardMap.put(PrimarySkillType.TAMING, List.copyOf(taming));
+ leaderboardMap.put(PrimarySkillType.FISHING, List.copyOf(fishing));
+ leaderboardMap.put(PrimarySkillType.ALCHEMY, List.copyOf(alchemy));
+ leaderboardMap.put(PrimarySkillType.CROSSBOWS, List.copyOf(crossbows));
+ leaderboardMap.put(PrimarySkillType.TRIDENTS, List.copyOf(tridents));
+ leaderboardMap.put(PrimarySkillType.MACES, List.copyOf(maces));
return LeaderboardStatus.UPDATED;
}
@@ -1280,7 +1259,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager {
int currentPos = 1;
for (PlayerStat stat : statsList) {
- if (stat.name.equalsIgnoreCase(playerName)) {
+ if (stat.playerName().equalsIgnoreCase(playerName)) {
return currentPos;
}
@@ -1290,18 +1269,11 @@ public final class FlatFileDatabaseManager implements DatabaseManager {
return null;
}
- private int putStat(List statList, String playerName, int statValue) {
+ private int putStat(TreeSet statList, String playerName, int statValue) {
statList.add(new PlayerStat(playerName, statValue));
return statValue;
}
- private static class SkillComparator implements Comparator {
- @Override
- public int compare(PlayerStat o1, PlayerStat o2) {
- return (o2.statVal - o1.statVal);
- }
- }
-
private PlayerProfile loadFromLine(@NotNull String[] character) {
Map skills = getSkillMapFromLine(character); // Skill levels
Map skillsXp = new EnumMap<>(
diff --git a/src/main/java/com/gmail/nossr50/datatypes/database/PlayerStat.java b/src/main/java/com/gmail/nossr50/datatypes/database/PlayerStat.java
index 825be52ba..a6b0e7665 100644
--- a/src/main/java/com/gmail/nossr50/datatypes/database/PlayerStat.java
+++ b/src/main/java/com/gmail/nossr50/datatypes/database/PlayerStat.java
@@ -1,11 +1,14 @@
package com.gmail.nossr50.datatypes.database;
-public class PlayerStat {
- public String name;
- public int statVal = 0;
+import org.jetbrains.annotations.NotNull;
- public PlayerStat(String name, int value) {
- this.name = name;
- this.statVal = value;
+public record PlayerStat(String playerName, int value) implements Comparable {
+ @Override
+ public int compareTo(@NotNull PlayerStat o) {
+ // Descending order
+ int cmp = Integer.compare(o.value, this.value);
+ if (cmp != 0) return cmp;
+ // Tie-breaker
+ return this.playerName.compareTo(o.playerName);
}
}
diff --git a/src/main/java/com/gmail/nossr50/runnables/commands/MctopCommandDisplayTask.java b/src/main/java/com/gmail/nossr50/runnables/commands/MctopCommandDisplayTask.java
index 8746b1b75..255d1168f 100644
--- a/src/main/java/com/gmail/nossr50/runnables/commands/MctopCommandDisplayTask.java
+++ b/src/main/java/com/gmail/nossr50/runnables/commands/MctopCommandDisplayTask.java
@@ -79,10 +79,11 @@ public class MctopCommandDisplayTask extends CancellableRunnable {
// 12. Playername - skill value
if (sender instanceof Player) {
sender.sendMessage(
- String.format("%2d. %s%s - %s%s", place, ChatColor.GREEN, stat.name,
- ChatColor.WHITE, stat.statVal));
+ String.format("%2d. %s%s - %s%s", place, ChatColor.GREEN, stat.playerName(),
+ ChatColor.WHITE, stat.value()));
} else {
- sender.sendMessage(String.format("%2d. %s - %s", place, stat.name, stat.statVal));
+ sender.sendMessage(String.format("%2d. %s - %s", place, stat.playerName(),
+ stat.value()));
}
place++;
diff --git a/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardWrapper.java b/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardWrapper.java
index 01ee569f9..7be68d8f3 100644
--- a/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardWrapper.java
+++ b/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardWrapper.java
@@ -655,13 +655,13 @@ public class ScoreboardWrapper {
public void acceptLeaderboardData(@NotNull List leaderboardData) {
for (PlayerStat stat : leaderboardData) {
- String name = stat.name;
+ String name = stat.playerName();
if (name.equals(playerName)) {
name = ChatColor.GOLD + "--You--";
}
- sidebarObjective.getScore(name).setScore(stat.statVal);
+ sidebarObjective.getScore(name).setScore(stat.value());
}
}