From 6acc4b1ec690f28567fce1a0c0c45e815488aa0c Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 6 Jul 2025 10:59:24 -0700 Subject: [PATCH] 2.2.040 --- Changelog.txt | 5 +- pom.xml | 2 +- .../database/FlatFileDatabaseManager.java | 112 +++++++----------- .../datatypes/database/PlayerStat.java | 15 ++- .../commands/MctopCommandDisplayTask.java | 7 +- .../util/scoreboards/ScoreboardWrapper.java | 4 +- 6 files changed, 61 insertions(+), 84 deletions(-) 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()); } }