From da1639f2fad323ec9d3e60b7620f64f8a5764ed5 Mon Sep 17 00:00:00 2001 From: lokspel <208148594+lokspel@users.noreply.github.com> Date: Mon, 18 May 2026 10:49:34 +0400 Subject: [PATCH 1/4] fix: fix profile worldtime default value and handle offline players in leaderboards --- .../gui/guis/leaderboard/LbGuiUtil.java | 30 ++++++++++++------- .../manager/gui/guis/queue/QueueGuiUtil.java | 8 ++--- .../leaderboard/hologram/Hologram.java | 1 + .../practice/manager/profile/Profile.java | 2 +- .../practice/manager/profile/ProfileFile.java | 14 +++++++-- 5 files changed, 37 insertions(+), 18 deletions(-) diff --git a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/leaderboard/LbGuiUtil.java b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/leaderboard/LbGuiUtil.java index 2ab5400c1..de84498eb 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/leaderboard/LbGuiUtil.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/leaderboard/LbGuiUtil.java @@ -158,8 +158,10 @@ public static ItemStack createEloLbItem(NormalLadder ladder) { List topPlayers = new ArrayList<>(); Map list = leaderboard.getList(); for (OfflinePlayer player : list.keySet()) { - if (topPlayers.size() < showPlayers) topPlayers.add(player); - else break; + if (player.getName() != null && ProfileManager.getInstance().getProfile(player) != null) { + topPlayers.add(player); + } + if (topPlayers.size() >= showPlayers) break; } List topStrings = new ArrayList<>(); @@ -171,7 +173,7 @@ public static ItemStack createEloLbItem(NormalLadder ladder) { int stat = list.get(target); topStrings.add(GUIFile.getString("GUIS.STATISTICS.ELO-LEADERBOARD.ICONS.LADDER-LEADERBOARD.LORE.FORMAT") .replace("%number%", String.valueOf(i)) - .replace("%player%", Objects.requireNonNull(target.getName())) + .replace("%player%", target.getName()) .replace("%ladder_elo%", String.valueOf(stat)) .replace("%division%", division != null ? Common.mmToNormal(division.getFullName()) : "") .replace("%division_short%", division != null ? Common.mmToNormal(division.getShortName()) : "")); @@ -204,8 +206,10 @@ public static ItemStack createGlobalEloLb() { List topPlayers = new ArrayList<>(); Map list = leaderboard.getList(); for (OfflinePlayer player : list.keySet()) { - if (topPlayers.size() < showPlayers) topPlayers.add(player); - else break; + if (player.getName() != null && ProfileManager.getInstance().getProfile(player) != null) { + topPlayers.add(player); + } + if (topPlayers.size() >= showPlayers) break; } List topStrings = new ArrayList<>(); @@ -219,7 +223,7 @@ public static ItemStack createGlobalEloLb() { .replace("%number%", String.valueOf(i)) .replace("%division%", division != null ? Common.mmToNormal(division.getFullName()) : "") .replace("%division_short%", division != null ? Common.mmToNormal(division.getShortName()) : "") - .replace("%player%", Objects.requireNonNull(target.getName())) + .replace("%player%", target.getName()) .replace("%global_elo%", String.valueOf(stat))); } else { topStrings.add(GUIFile.getString("GUIS.STATISTICS.ELO-LEADERBOARD.ICONS.GLOBAL-LEADERBOARD.LORE.FORMAT-NULL") @@ -250,8 +254,10 @@ public static ItemStack createWinLbItem(NormalLadder ladder) { List topPlayers = new ArrayList<>(); Map list = leaderboard.getList(); for (OfflinePlayer player : list.keySet()) { - if (topPlayers.size() < showPlayers) topPlayers.add(player); - else break; + if (player.getName() != null && ProfileManager.getInstance().getProfile(player) != null) { + topPlayers.add(player); + } + if (topPlayers.size() >= showPlayers) break; } List topStrings = new ArrayList<>(); @@ -296,8 +302,10 @@ public static ItemStack createGlobalWinLb() { List topPlayers = new ArrayList<>(); Map list = leaderboard.getList(); for (OfflinePlayer player : list.keySet()) { - if (topPlayers.size() < showPlayers) topPlayers.add(player); - else break; + if (player.getName() != null && ProfileManager.getInstance().getProfile(player) != null) { + topPlayers.add(player); + } + if (topPlayers.size() >= showPlayers) break; } List topStrings = new ArrayList<>(); @@ -311,7 +319,7 @@ public static ItemStack createGlobalWinLb() { .replace("%number%", String.valueOf(i)) .replace("%division%", division != null ? Common.mmToNormal(division.getFullName()) : "") .replace("%division_short%", division != null ? Common.mmToNormal(division.getShortName()) : "") - .replace("%player%", Objects.requireNonNull(target.getName())) + .replace("%player%", target.getName()) .replace("%global_win%", String.valueOf(stat))); } else { topStrings.add(GUIFile.getString("GUIS.STATISTICS.WIN-LEADERBOARD.ICONS.GLOBAL-LEADERBOARD.LORE.FORMAT-NULL") diff --git a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/queue/QueueGuiUtil.java b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/queue/QueueGuiUtil.java index 24ee8647e..b6ebcb8db 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/queue/QueueGuiUtil.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/queue/QueueGuiUtil.java @@ -63,11 +63,11 @@ static String getLbString(String format, String s, Ladder ladder) { OfflinePlayer player = players.get(placement - 1); Profile profile = ProfileManager.getInstance().getProfile(player); - Division division = null; - if (profile != null) { - division = profile.getStats().getDivision(); + if (profile == null || player.getName() == null) { + return "&cNo player found!"; } - + + Division division = profile.getStats().getDivision(); int score = leaderboard.getList().get(player); return format diff --git a/core/src/main/java/dev/nandi0813/practice/manager/leaderboard/hologram/Hologram.java b/core/src/main/java/dev/nandi0813/practice/manager/leaderboard/hologram/Hologram.java index 88817f66a..817e7d1a7 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/leaderboard/hologram/Hologram.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/leaderboard/hologram/Hologram.java @@ -347,6 +347,7 @@ private List buildSpacings(int lineCount, Leaderboard leaderboard) { private List buildPlacementStrings(Leaderboard leaderboard) { Map playerStats = leaderboard.getList(); List topPlayers = playerStats.keySet().stream() + .filter(p -> p.getName() != null && ProfileManager.getInstance().getProfile(p) != null) .limit(showStat) .collect(Collectors.toList()); diff --git a/core/src/main/java/dev/nandi0813/practice/manager/profile/Profile.java b/core/src/main/java/dev/nandi0813/practice/manager/profile/Profile.java index 51fe053ba..72a8c9325 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/profile/Profile.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/profile/Profile.java @@ -62,7 +62,7 @@ public class Profile { private boolean partyInvites; private boolean allowSpectate; private boolean privateMessages; - private ProfileWorldTime worldTime; + private ProfileWorldTime worldTime = ProfileWorldTime.DAY; private boolean flying; private ProfilePrefixVisibility prefixVisibility = ProfilePrefixVisibility.PREFIX_AND_SUFFIX; diff --git a/core/src/main/java/dev/nandi0813/practice/manager/profile/ProfileFile.java b/core/src/main/java/dev/nandi0813/practice/manager/profile/ProfileFile.java index 8d24d6f93..aa4e98c4c 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/profile/ProfileFile.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/profile/ProfileFile.java @@ -161,7 +161,12 @@ public void setDefaultData() { config.set("settings.allowspectate", ConfigManager.getBoolean("PLAYER.DEFAULT-SETTINGS.ALLOWSPECTATE")); config.set("settings.flying", ConfigManager.getBoolean("PLAYER.DEFAULT-SETTINGS.FLYING")); config.set("settings.messages", ConfigManager.getBoolean("PLAYER.DEFAULT-SETTINGS.PRIVATEMESSAGE")); - config.set("settings.worldtime", ProfileWorldTime.valueOf(ConfigManager.getString("PLAYER.DEFAULT-SETTINGS.WORLD-TIME")).toString()); + String defaultWorldTime = ConfigManager.getString("PLAYER.DEFAULT-SETTINGS.WORLD-TIME"); + try { + config.set("settings.worldtime", ProfileWorldTime.valueOf(defaultWorldTime.toUpperCase(Locale.ROOT)).toString()); + } catch (Exception ignored) { + config.set("settings.worldtime", ProfileWorldTime.DAY.toString()); + } String defaultPrefixVisibility = ConfigManager.getString("PLAYER.DEFAULT-SETTINGS.PREFIX-VISIBILITY"); try { @@ -214,7 +219,12 @@ public void getData() { profile.setAllowSpectate(config.getBoolean("settings.allowspectate")); profile.setFlying(config.getBoolean("settings.flying")); profile.setPrivateMessages(config.getBoolean("settings.messages")); - profile.setWorldTime(ProfileWorldTime.valueOf(config.getString("settings.worldtime"))); + String rawWorldTime = config.getString("settings.worldtime", ProfileWorldTime.DAY.toString()); + try { + profile.setWorldTime(ProfileWorldTime.valueOf(rawWorldTime.toUpperCase(Locale.ROOT))); + } catch (IllegalArgumentException ignored) { + profile.setWorldTime(ProfileWorldTime.DAY); + } String rawPrefixVisibility = config.getString("settings.prefix-visibility", ProfilePrefixVisibility.PREFIX_AND_SUFFIX.toString()); try { From 6dcf467a7b37f9ac419b97c44b70e5ae22df4b00 Mon Sep 17 00:00:00 2001 From: lokspel <208148594+lokspel@users.noreply.github.com> Date: Mon, 18 May 2026 10:57:52 +0400 Subject: [PATCH 2/4] fix: resolve party chat permission error caused by missing break --- .../practice/manager/gui/guis/party/PartySettingsGui.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/party/PartySettingsGui.java b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/party/PartySettingsGui.java index 434850485..b50e46299 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/party/PartySettingsGui.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/party/PartySettingsGui.java @@ -96,6 +96,7 @@ public void handleClickEvent(InventoryClickEvent e) { update(); } else Common.sendMMMessage(player, LanguageManager.getString("PARTY.NO-PERMISSION")); + break; case 11: if (player.hasPermission("zpp.party.changelimit")) { int groupPartyLimit = PartyManager.getInstance().resolvePartyMemberLimit(party.getLeader()); @@ -118,12 +119,14 @@ public void handleClickEvent(InventoryClickEvent e) { update(); } else Common.sendMMMessage(player, LanguageManager.getString("PARTY.NO-PERMISSION")); + break; case 14: if (player.hasPermission("zpp.party.allinvite")) { party.setAllInvite(!party.isAllInvite()); update(); } else Common.sendMMMessage(player, LanguageManager.getString("PARTY.NO-PERMISSION")); + break; case 15: if (player.hasPermission("zpp.party.public")) { if (PlayerCooldown.isActive(player, CooldownObject.PUBLIC_PARTY_CHANGE)) { From 1fa95c3d9dc2b08b32b173abe4c6d79c758fca26 Mon Sep 17 00:00:00 2001 From: lokspel <208148594+lokspel@users.noreply.github.com> Date: Mon, 18 May 2026 13:42:28 +0400 Subject: [PATCH 3/4] fix: not-won round symbols rendering as filled on scoreboard --- .../practice/manager/fight/match/type/duel/Duel.java | 5 ++++- .../practice/manager/sidebar/adapter/AdapterUtil.java | 7 ++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/match/type/duel/Duel.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/match/type/duel/Duel.java index 9b226554c..18ad4659a 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/match/type/duel/Duel.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/match/type/duel/Duel.java @@ -29,6 +29,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.UUID; @Getter public class Duel extends Match implements Team { @@ -108,9 +109,11 @@ public DuelRound getCurrentRound() { @Override public int getWonRounds(Player player) { + UUID playerUuid = player.getUniqueId(); int wonRounds = 0; for (Round round : this.rounds.values()) { - if (((DuelRound) round).getRoundWinner() == player) + Player winner = ((DuelRound) round).getRoundWinner(); + if (winner != null && winner.getUniqueId().equals(playerUuid)) wonRounds++; } return wonRounds; diff --git a/core/src/main/java/dev/nandi0813/practice/manager/sidebar/adapter/AdapterUtil.java b/core/src/main/java/dev/nandi0813/practice/manager/sidebar/adapter/AdapterUtil.java index ed0af6cd8..6b56bb533 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/sidebar/adapter/AdapterUtil.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/sidebar/adapter/AdapterUtil.java @@ -154,20 +154,17 @@ public static Component getRoundString(int rounds, int wonRounds, Component wonC } Component component = Component.empty(); - boolean firstNotWon = true; String roundSymbol = getRoundSymbol(); Component wonSymbol = wonColor == null ? Component.text(roundSymbol) : wonColor.append(Component.text(roundSymbol)); + Component notWonSymbol = Component.text(roundSymbol, NamedTextColor.GRAY); for (int i = 1; i <= rounds; i++) { if (i <= clampedWonRounds) { component = component.append(wonSymbol); - } else if (firstNotWon) { - component = component.append(Component.text(roundSymbol, NamedTextColor.GRAY)); - firstNotWon = false; } else { - component = component.append(Component.text(roundSymbol)); + component = component.append(notWonSymbol); } } From 2ccbd300e1a41da9bd48119cd2d5dce5d3ce2272 Mon Sep 17 00:00:00 2001 From: lokspel <208148594+lokspel@users.noreply.github.com> Date: Mon, 18 May 2026 13:50:47 +0400 Subject: [PATCH 4/4] Prevent throwing ender peal if cooldown is 0.0 in the start of the match --- .../manager/fight/listener/EPCountdownListener.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/listener/EPCountdownListener.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/listener/EPCountdownListener.java index 34d4ab44a..a39dfe041 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/listener/EPCountdownListener.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/listener/EPCountdownListener.java @@ -102,13 +102,13 @@ public void onProjectileShoot(ProjectileLaunchEvent e) { Match match = MatchManager.getInstance().getLiveMatchByPlayer(player); if (match != null) { - double duration = match.getLadder().getEnderPearlCooldown(); - if (duration <= 0) { + if (!match.getCurrentRound().getRoundStatus().equals(RoundStatus.LIVE)) { + e.setCancelled(true); return; } - if (!match.getCurrentRound().getRoundStatus().equals(RoundStatus.LIVE)) { - e.setCancelled(true); + double duration = match.getLadder().getEnderPearlCooldown(); + if (duration <= 0) { return; }