This commit is contained in:
nossr50
2025-07-06 10:59:24 -07:00
parent 41b5667cd4
commit 6acc4b1ec6
6 changed files with 61 additions and 84 deletions

View File

@@ -1,7 +1,8 @@
Version 2.2.040 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 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 Fixed a bug where EcoEnchants and similar plugins could cause an infinite loop within mcMMO during TreeFeller and other abilities
(Codebase) Updated Adventure Libs
Added 'Happy_Ghast' to experience.yml for combat XP Added 'Happy_Ghast' to experience.yml for combat XP
Added 'Ghastling' to experience.yml for combat XP Added 'Ghastling' to experience.yml for combat XP
Updated Japanese (ja_JP) translation (Thanks ryota-abe) Updated Japanese (ja_JP) translation (Thanks ryota-abe)

View File

@@ -2,7 +2,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>com.gmail.nossr50.mcMMO</groupId> <groupId>com.gmail.nossr50.mcMMO</groupId>
<artifactId>mcMMO</artifactId> <artifactId>mcMMO</artifactId>
<version>2.2.040-SNAPSHOT</version> <version>2.2.040</version>
<name>mcMMO</name> <name>mcMMO</name>
<url>https://github.com/mcMMO-Dev/mcMMO</url> <url>https://github.com/mcMMO-Dev/mcMMO</url>
<scm> <scm>

View File

@@ -21,11 +21,11 @@ import java.io.IOException;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Comparator;
import java.util.EnumMap; import java.util.EnumMap;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.TreeSet;
import java.util.UUID; import java.util.UUID;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
@@ -36,9 +36,9 @@ import org.jetbrains.annotations.Nullable;
public final class FlatFileDatabaseManager implements DatabaseManager { public final class FlatFileDatabaseManager implements DatabaseManager {
public static final String IGNORED = "IGNORED"; public static final String IGNORED = "IGNORED";
public static final String LEGACY_INVALID_OLD_USERNAME = "_INVALID_OLD_USERNAME_'"; public static final String LEGACY_INVALID_OLD_USERNAME = "_INVALID_OLD_USERNAME_'";
private final @NotNull EnumMap<PrimarySkillType, List<PlayerStat>> playerStatHash = new EnumMap<>( private final @NotNull EnumMap<PrimarySkillType, List<PlayerStat>> leaderboardMap = new EnumMap<>(
PrimarySkillType.class); PrimarySkillType.class);
private final @NotNull List<PlayerStat> powerLevels = new ArrayList<>(); private @NotNull List<PlayerStat> powerLevels = new ArrayList<>();
private long lastUpdate = 0; private long lastUpdate = 0;
private final @NotNull String usersFilePath; private final @NotNull String usersFilePath;
private final @NotNull Logger logger; private final @NotNull Logger logger;
@@ -562,7 +562,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager {
updateLeaderboards(); updateLeaderboards();
List<PlayerStat> statsList = List<PlayerStat> statsList =
primarySkillType == null ? powerLevels : playerStatHash.get(primarySkillType); primarySkillType == null ? powerLevels : leaderboardMap.get(primarySkillType);
int fromIndex = (Math.max(pageNumber, 1) - 1) * statsPerPage; int fromIndex = (Math.max(pageNumber, 1) - 1) * statsPerPage;
return statsList.subList(Math.min(fromIndex, statsList.size()), return statsList.subList(Math.min(fromIndex, statsList.size()),
@@ -575,10 +575,9 @@ public final class FlatFileDatabaseManager implements DatabaseManager {
HashMap<PrimarySkillType, Integer> skills = new HashMap<>(); HashMap<PrimarySkillType, Integer> skills = new HashMap<>();
for (PrimarySkillType skill : SkillTools.NON_CHILD_SKILLS) { 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)); skills.put(null, getPlayerRank(playerName, powerLevels));
return skills; return skills;
@@ -1039,25 +1038,24 @@ public final class FlatFileDatabaseManager implements DatabaseManager {
} }
lastUpdate = System.currentTimeMillis(); // Log when the last update was run lastUpdate = System.currentTimeMillis(); // Log when the last update was run
powerLevels.clear(); // Clear old values from the power levels
// Initialize lists TreeSet<PlayerStat> powerLevelStats = new TreeSet<>();
List<PlayerStat> mining = new ArrayList<>(); TreeSet<PlayerStat> mining = new TreeSet<>();
List<PlayerStat> woodcutting = new ArrayList<>(); TreeSet<PlayerStat> woodcutting = new TreeSet<>();
List<PlayerStat> herbalism = new ArrayList<>(); TreeSet<PlayerStat> herbalism = new TreeSet<>();
List<PlayerStat> excavation = new ArrayList<>(); TreeSet<PlayerStat> excavation = new TreeSet<>();
List<PlayerStat> acrobatics = new ArrayList<>(); TreeSet<PlayerStat> acrobatics = new TreeSet<>();
List<PlayerStat> repair = new ArrayList<>(); TreeSet<PlayerStat> repair = new TreeSet<>();
List<PlayerStat> swords = new ArrayList<>(); TreeSet<PlayerStat> swords = new TreeSet<>();
List<PlayerStat> axes = new ArrayList<>(); TreeSet<PlayerStat> axes = new TreeSet<>();
List<PlayerStat> archery = new ArrayList<>(); TreeSet<PlayerStat> archery = new TreeSet<>();
List<PlayerStat> unarmed = new ArrayList<>(); TreeSet<PlayerStat> unarmed = new TreeSet<>();
List<PlayerStat> taming = new ArrayList<>(); TreeSet<PlayerStat> taming = new TreeSet<>();
List<PlayerStat> fishing = new ArrayList<>(); TreeSet<PlayerStat> fishing = new TreeSet<>();
List<PlayerStat> alchemy = new ArrayList<>(); TreeSet<PlayerStat> alchemy = new TreeSet<>();
List<PlayerStat> crossbows = new ArrayList<>(); TreeSet<PlayerStat> crossbows = new TreeSet<>();
List<PlayerStat> tridents = new ArrayList<>(); TreeSet<PlayerStat> tridents = new TreeSet<>();
List<PlayerStat> maces = new ArrayList<>(); TreeSet<PlayerStat> maces = new TreeSet<>();
BufferedReader in = null; BufferedReader in = null;
String playerName = null; String playerName = null;
@@ -1106,7 +1104,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager {
skills.get(PrimarySkillType.TRIDENTS)); skills.get(PrimarySkillType.TRIDENTS));
powerLevel += putStat(maces, playerName, skills.get(PrimarySkillType.MACES)); powerLevel += putStat(maces, playerName, skills.get(PrimarySkillType.MACES));
putStat(powerLevels, playerName, powerLevel); putStat(powerLevelStats, playerName, powerLevel);
} }
} catch (Exception e) { } catch (Exception e) {
logger.severe( logger.severe(
@@ -1125,42 +1123,23 @@ public final class FlatFileDatabaseManager implements DatabaseManager {
} }
SkillComparator c = new SkillComparator(); powerLevels = List.copyOf(powerLevelStats);
leaderboardMap.put(PrimarySkillType.MINING, List.copyOf(mining));
mining.sort(c); leaderboardMap.put(PrimarySkillType.WOODCUTTING, List.copyOf(woodcutting));
woodcutting.sort(c); leaderboardMap.put(PrimarySkillType.REPAIR, List.copyOf(repair));
repair.sort(c); leaderboardMap.put(PrimarySkillType.UNARMED, List.copyOf(unarmed));
unarmed.sort(c); leaderboardMap.put(PrimarySkillType.HERBALISM, List.copyOf(herbalism));
herbalism.sort(c); leaderboardMap.put(PrimarySkillType.EXCAVATION, List.copyOf(excavation));
excavation.sort(c); leaderboardMap.put(PrimarySkillType.ARCHERY, List.copyOf(archery));
archery.sort(c); leaderboardMap.put(PrimarySkillType.SWORDS, List.copyOf(swords));
swords.sort(c); leaderboardMap.put(PrimarySkillType.AXES, List.copyOf(axes));
axes.sort(c); leaderboardMap.put(PrimarySkillType.ACROBATICS, List.copyOf(acrobatics));
acrobatics.sort(c); leaderboardMap.put(PrimarySkillType.TAMING, List.copyOf(taming));
taming.sort(c); leaderboardMap.put(PrimarySkillType.FISHING, List.copyOf(fishing));
fishing.sort(c); leaderboardMap.put(PrimarySkillType.ALCHEMY, List.copyOf(alchemy));
alchemy.sort(c); leaderboardMap.put(PrimarySkillType.CROSSBOWS, List.copyOf(crossbows));
crossbows.sort(c); leaderboardMap.put(PrimarySkillType.TRIDENTS, List.copyOf(tridents));
tridents.sort(c); leaderboardMap.put(PrimarySkillType.MACES, List.copyOf(maces));
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);
return LeaderboardStatus.UPDATED; return LeaderboardStatus.UPDATED;
} }
@@ -1280,7 +1259,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager {
int currentPos = 1; int currentPos = 1;
for (PlayerStat stat : statsList) { for (PlayerStat stat : statsList) {
if (stat.name.equalsIgnoreCase(playerName)) { if (stat.playerName().equalsIgnoreCase(playerName)) {
return currentPos; return currentPos;
} }
@@ -1290,18 +1269,11 @@ public final class FlatFileDatabaseManager implements DatabaseManager {
return null; return null;
} }
private int putStat(List<PlayerStat> statList, String playerName, int statValue) { private int putStat(TreeSet<PlayerStat> statList, String playerName, int statValue) {
statList.add(new PlayerStat(playerName, statValue)); statList.add(new PlayerStat(playerName, statValue));
return statValue; return statValue;
} }
private static class SkillComparator implements Comparator<PlayerStat> {
@Override
public int compare(PlayerStat o1, PlayerStat o2) {
return (o2.statVal - o1.statVal);
}
}
private PlayerProfile loadFromLine(@NotNull String[] character) { private PlayerProfile loadFromLine(@NotNull String[] character) {
Map<PrimarySkillType, Integer> skills = getSkillMapFromLine(character); // Skill levels Map<PrimarySkillType, Integer> skills = getSkillMapFromLine(character); // Skill levels
Map<PrimarySkillType, Float> skillsXp = new EnumMap<>( Map<PrimarySkillType, Float> skillsXp = new EnumMap<>(

View File

@@ -1,11 +1,14 @@
package com.gmail.nossr50.datatypes.database; package com.gmail.nossr50.datatypes.database;
public class PlayerStat { import org.jetbrains.annotations.NotNull;
public String name;
public int statVal = 0;
public PlayerStat(String name, int value) { public record PlayerStat(String playerName, int value) implements Comparable<PlayerStat> {
this.name = name; @Override
this.statVal = value; 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);
} }
} }

View File

@@ -79,10 +79,11 @@ public class MctopCommandDisplayTask extends CancellableRunnable {
// 12. Playername - skill value // 12. Playername - skill value
if (sender instanceof Player) { if (sender instanceof Player) {
sender.sendMessage( sender.sendMessage(
String.format("%2d. %s%s - %s%s", place, ChatColor.GREEN, stat.name, String.format("%2d. %s%s - %s%s", place, ChatColor.GREEN, stat.playerName(),
ChatColor.WHITE, stat.statVal)); ChatColor.WHITE, stat.value()));
} else { } 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++; place++;

View File

@@ -655,13 +655,13 @@ public class ScoreboardWrapper {
public void acceptLeaderboardData(@NotNull List<PlayerStat> leaderboardData) { public void acceptLeaderboardData(@NotNull List<PlayerStat> leaderboardData) {
for (PlayerStat stat : leaderboardData) { for (PlayerStat stat : leaderboardData) {
String name = stat.name; String name = stat.playerName();
if (name.equals(playerName)) { if (name.equals(playerName)) {
name = ChatColor.GOLD + "--You--"; name = ChatColor.GOLD + "--You--";
} }
sidebarObjective.getScore(name).setScore(stat.statVal); sidebarObjective.getScore(name).setScore(stat.value());
} }
} }