From 9b00f32c5fab9c820c8a6e55dc42a6ee2285ceab Mon Sep 17 00:00:00 2001 From: lokspel <208148594+lokspel@users.noreply.github.com> Date: Tue, 19 May 2026 15:43:24 +0400 Subject: [PATCH 1/2] Fix sidebar --- .../practice/manager/fight/match/enums/WeightClass.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/match/enums/WeightClass.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/match/enums/WeightClass.java index f88f9e65d..f09bb8794 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/match/enums/WeightClass.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/match/enums/WeightClass.java @@ -2,7 +2,6 @@ import dev.nandi0813.practice.manager.backend.ConfigManager; import dev.nandi0813.practice.util.Common; -import dev.nandi0813.practice.util.StringUtil; public enum WeightClass { @@ -16,7 +15,7 @@ public enum WeightClass { } public String getName() { - return StringUtil.CC(this.name); + return Common.mmToNormal(this.name); } public String getMMName() { From fcbf0ef6108042e56836e302ee3cfe48a8186ef0 Mon Sep 17 00:00:00 2001 From: lokspel <208148594+lokspel@users.noreply.github.com> Date: Tue, 19 May 2026 16:43:13 +0400 Subject: [PATCH 2/2] Hearts are customizable now and UGLY text --- .../manager/gui/guis/MatchHistoryGui.java | 32 ++++++++----------- .../gui/guis/cosmetics/CosmeticsHubGui.java | 6 ++-- .../cosmetics/shield/ShieldEditorGui.java | 9 ++---- .../cosmetics/shield/ShieldLayoutListGui.java | 3 +- .../shield/ShieldPatternPickerGui.java | 3 +- .../gui/guis/leaderboard/LbGuiUtil.java | 3 +- .../manager/nametag/NametagManager.java | 19 +++-------- .../guis/itemeditors/ItemCategory.java | 8 ++--- .../cosmetics/shield/ShieldLayout.java | 6 ++-- .../practice/util/NameFormatUtil.java | 12 +++---- core/src/main/resources/config.yml | 3 +- 11 files changed, 37 insertions(+), 67 deletions(-) diff --git a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/MatchHistoryGui.java b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/MatchHistoryGui.java index ada0677fb..c1c37aa6d 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/MatchHistoryGui.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/MatchHistoryGui.java @@ -61,7 +61,7 @@ public void build() { @Override public void update() { - // ── Read config ──────────────────────────────────────── + // Read config String rawTitle = GUIFile.getString("GUIS.MATCH-HISTORY.TITLE"); if (rawTitle == null || rawTitle.isEmpty()) rawTitle = "Match History - %player%"; @@ -73,14 +73,14 @@ public void update() { boolean centerItems = getBooleanOrDefault("GUIS.MATCH-HISTORY.CENTER-ITEMS", true); int configuredStart = GUIFile.getInt("GUIS.MATCH-HISTORY.START-SLOT"); // -1 means auto - // ── Build inventory ──────────────────────────────────── + // Build inventory Inventory inventory = InventoryUtil.createInventory(rawTitle, size / 9); // Fill with configurable glass pane ItemStack filler = buildFillerItem(); for (int i = 0; i < size; i++) inventory.setItem(i, filler); - // ── Determine where to place the match items ─────────── + // Determine where to place the match items int startSlot; if (configuredStart >= 0) { startSlot = configuredStart; @@ -90,7 +90,7 @@ public void update() { startSlot = 0; } - // ── Place match items ────────────────────────────────── + // Place match items String materialStr = GUIFile.getString("GUIS.MATCH-HISTORY.MATCH-ITEM.MATERIAL"); Material material = Material.PAPER; if (materialStr != null && !materialStr.isBlank()) { @@ -110,8 +110,7 @@ public void update() { gui.put(1, inventory); } - // ── Item builders ──────────────────────────────────────────── - + // Item builders private ItemStack buildMatchItem(MatchHistoryEntry entry, Material fallbackMaterial, boolean usePlayerHead) { @@ -138,14 +137,14 @@ private ItemStack buildMatchItem(MatchHistoryEntry entry, int myScore = getMyScore(entry); int oppScore = getOpponentScore(entry); - // ── Name ────────────────────────────────────────────── + // Name String rawName = GUIFile.getString("GUIS.MATCH-HISTORY.MATCH-ITEM.NAME"); if (rawName == null || rawName.isBlank()) rawName = "Match vs %opponent%"; String displayName = applyPlaceholders(rawName, entry, oppName, result, myScore, oppScore, myHealth, oppHealth, won, draw); - // ── Lore ────────────────────────────────────────────── + // Lore List loreCfg = GUIFile.getStringList("GUIS.MATCH-HISTORY.MATCH-ITEM.LORE"); if (loreCfg == null || loreCfg.isEmpty()) { loreCfg = defaultLore(); @@ -156,7 +155,7 @@ private ItemStack buildMatchItem(MatchHistoryEntry entry, .map(line -> Common.legacyToComponent(StringUtil.CC(line))) .collect(Collectors.toList()); - // ── ItemStack ───────────────────────────────────────── + // ItemStack ItemStack item; if (usePlayerHead) { item = buildSkull(oppUuid, oppName); @@ -218,8 +217,7 @@ private ItemStack buildFillerItem() { return item; } - // ── Centering logic ────────────────────────────────────────── - + // Centering logic /** * Computes the first slot so that {@code count} items are centred * inside the inventory. Works row-by-row: @@ -242,8 +240,7 @@ private int computeCenterStart(int size, int count) { return startRow * 9 + startCol; } - // ── Placeholder helpers ────────────────────────────────────── - + // Placeholder helpers private String applyPlaceholders(String text, MatchHistoryEntry entry, String oppName, String result, int myScore, int oppScore, @@ -266,8 +263,7 @@ private String formatHealth(double raw) { return String.format("%.1f❤", raw / 2.0); } - // ── Perspective helpers ────────────────────────────────────── - + // Perspective helpers private boolean isViewer(MatchHistoryEntry e) { return viewerUuid != null && e.getPlayerUuid().equals(viewerUuid); } @@ -296,8 +292,7 @@ private int getOpponentScore(MatchHistoryEntry e) { return isViewer(e) ? e.getOpponentScore() : e.getPlayerScore(); } - // ── Default lore ───────────────────────────────────────────── - + // Default lore private List defaultLore() { List lore = new ArrayList<>(); lore.add("--------------------"); @@ -313,8 +308,7 @@ private List defaultLore() { return lore; } - // ── Utility ───────────────────────────────────────────────── - + // Utility private boolean getBooleanOrDefault(String path, boolean def) { if (GUIFile.getConfig().isSet(path.toUpperCase())) return GUIFile.getConfig().getBoolean(path.toUpperCase()); diff --git a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/cosmetics/CosmeticsHubGui.java b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/cosmetics/CosmeticsHubGui.java index 7c7a57a04..e658913da 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/cosmetics/CosmeticsHubGui.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/cosmetics/CosmeticsHubGui.java @@ -82,8 +82,7 @@ public void handleClickEvent(InventoryClickEvent e) { } } - // ── Button builders ────────────────────────────────────────────── - + // Button builders private ItemStack buildTrimsButton() { String name = GUIFile.getConfig().getString( "GUIS.COSMETICS.HUB.BUTTONS.ARMOR-TRIMS.NAME", "✦ Armor Trims"); @@ -161,8 +160,7 @@ private ItemStack buildLobbyItemsButton() { return item.get(); } - // ── Helpers ────────────────────────────────────────────────────── - + // Helpers private List getOrDefaultLore(String key, List defaults) { List lore = GUIFile.getConfig().getStringList(key); return lore.isEmpty() ? defaults : lore; diff --git a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/cosmetics/shield/ShieldEditorGui.java b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/cosmetics/shield/ShieldEditorGui.java index 1482c29f4..e1e6c1f65 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/cosmetics/shield/ShieldEditorGui.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/cosmetics/shield/ShieldEditorGui.java @@ -183,8 +183,7 @@ public void handleClickEvent(InventoryClickEvent e) { } } - // ── Apply / unapply ────────────────────────────────────────────── - + // Apply / unapply private void handleApply(Player player) { int current = profile.getCosmeticsData().getActiveShieldLayoutIndex(); if (current == layoutIndex) { @@ -204,8 +203,7 @@ private void handleApply(Player player) { update(true); } - // ── Item builders ──────────────────────────────────────────────── - + // Item builders private ItemStack buildPreviewShield(ShieldLayout layout) { ItemStack shield = new ItemStack(Material.SHIELD); ShieldCosmeticsUtil.applyLayoutToItem(shield, layout); @@ -272,8 +270,7 @@ private ItemStack buildLayerItem(ShieldLayout.PatternLayer layer, int index) { return stack; } - // ── Helpers ────────────────────────────────────────────────────── - + // Helpers private ShieldLayout getLayout() { List layouts = profile.getCosmeticsData().getShieldLayouts(); if (layoutIndex < 0 || layoutIndex >= layouts.size()) return null; diff --git a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/cosmetics/shield/ShieldLayoutListGui.java b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/cosmetics/shield/ShieldLayoutListGui.java index 5f9e53709..92d9a2028 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/cosmetics/shield/ShieldLayoutListGui.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/cosmetics/shield/ShieldLayoutListGui.java @@ -215,8 +215,7 @@ private void handleRename(Player player, int index) { .open(player); } - // ── Builders ───────────────────────────────────────────────────── - + // Builders private ItemStack buildLayoutItem(ShieldLayout layout, int index, boolean active) { ItemStack shield = new ItemStack(Material.SHIELD); ShieldCosmeticsUtil.applyLayoutToItem(shield, layout); diff --git a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/cosmetics/shield/ShieldPatternPickerGui.java b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/cosmetics/shield/ShieldPatternPickerGui.java index ddf6ea38a..16a4c426f 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/cosmetics/shield/ShieldPatternPickerGui.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/cosmetics/shield/ShieldPatternPickerGui.java @@ -170,8 +170,7 @@ private void handlePatternPick(Player player, PatternType pattern) { backToGui.open(player); } - // ── Item builder ───────────────────────────────────────────────── - + // Item builder private ItemStack buildPatternItem(PatternType pattern) { // Material already encodes the base colour (e.g. RED_BANNER for RED). // In 1.21.1 BannerMeta no longer has setBaseColor(); the colour is the Material. 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 6147f63db..445d04918 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 @@ -346,8 +346,7 @@ public static ItemStack getCacheInfoItem() { return buildItem(Material.CLOCK, "Auto-Update Info", lore); } - // ── Item building helpers ──────────────────────────────────────────────── - + // Item building helpers /** Builds an ItemStack from an existing icon with a parsed name and lore. */ private static ItemStack buildItem(ItemStack icon, String name, List lore) { ItemStack item = icon != null ? icon.clone() : new ItemStack(Material.BARRIER); diff --git a/core/src/main/java/dev/nandi0813/practice/manager/nametag/NametagManager.java b/core/src/main/java/dev/nandi0813/practice/manager/nametag/NametagManager.java index a47781e04..1ba068eff 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/nametag/NametagManager.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/nametag/NametagManager.java @@ -31,6 +31,7 @@ public class NametagManager { private static final boolean LOW_HEALTH_RATIO = dev.nandi0813.practice.manager.backend.ConfigManager.getBoolean("MATCH-SETTINGS.HEALTH-BELOW-NAME.DECIMAL-HEART-INDICATOR.LOW-HEALTH-DECIMAL-RATIO"); private static final double LOW_HEALTH_THRESHOLD = dev.nandi0813.practice.manager.backend.ConfigManager.getDouble("MATCH-SETTINGS.HEALTH-BELOW-NAME.LOW-HEALTH-THRESHOLD") * 2.0; private static final double CONFIG_SCALE = dev.nandi0813.practice.manager.backend.ConfigManager.getDouble("MATCH-SETTINGS.HEALTH-BELOW-NAME.SCALE"); + private static final String HEALTH_SYMBOL = dev.nandi0813.practice.manager.backend.ConfigManager.getString("MATCH-SETTINGS.HEALTH-BELOW-NAME.SYMBOL"); private static final String BELOW_NAME_OBJECTIVE = "ZPP_BELOW"; @@ -485,11 +486,11 @@ private Component formatHealth(Player player, double health) { if (DECIMAL_ALWAYS_SHOW || (LOW_HEALTH_RATIO && health < LOW_HEALTH_THRESHOLD)) { return Component.text(String.format(java.util.Locale.US, "%.1f", displayHealth), NamedTextColor.WHITE) - .append(Component.text("♥", heartColor)); + .append(Component.text(HEALTH_SYMBOL, heartColor)); } - return Component.text((int) Math.ceil(displayHealth) + " ", NamedTextColor.WHITE) - .append(Component.text("♥", heartColor)); + return Component.text((int) Math.ceil(displayHealth), NamedTextColor.WHITE) + .append(Component.text(HEALTH_SYMBOL, heartColor)); } private boolean isSaturated(Player player) { @@ -609,18 +610,6 @@ private void stopBelowNameRefreshTask() { } } - private void reapplyHideTeamLater(Player player) { - if (player == null) { - return; - } - - Bukkit.getScheduler().runTaskLater(ZonePractice.getInstance(), () -> { - if (player.isOnline()) { - hideVanillaNametag(player); - } - }, 1L); - } - private void hideVanillaNametag(Player player) { if (!PermanentConfig.NAMETAG_MANAGEMENT_ENABLED) { return; diff --git a/core/src/main/java/dev/nandi0813/practice/manager/playerkit/guis/itemeditors/ItemCategory.java b/core/src/main/java/dev/nandi0813/practice/manager/playerkit/guis/itemeditors/ItemCategory.java index 18adb0d2d..470162d5a 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/playerkit/guis/itemeditors/ItemCategory.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/playerkit/guis/itemeditors/ItemCategory.java @@ -108,7 +108,7 @@ public void handleClickEvent(InventoryClickEvent e) { KitItem kitItem = editing.getKitItem(); GUI mainGUI = editing.getCustomLadder().getMainGUI(); - // ── Back ────────────────────────────────────────────────────── + // Back if (icon.equals(StaticItems.CATEGORY_GUI_BACK_ICON)) { if (editing.isEditingShulker()) { dev.nandi0813.practice.manager.playerkit.guis.ShulkerBoxEditorGUI editor = editing.getShulkerEditor(); @@ -120,7 +120,7 @@ public void handleClickEvent(InventoryClickEvent e) { return; } - // ── None ───────────────────────────────────────────────────── + // None if (icon.equals(StaticItems.CATEGORY_GUI_NONE_ICON)) { kitItem.reset(); if (editing.isEditingShulker()) { @@ -137,7 +137,7 @@ public void handleClickEvent(InventoryClickEvent e) { return; } - // ── Fixed categories ───────────────────────────────────────── + // Fixed categories if (icon.equals(StaticItems.CATEGORY_GUI_ARMOR_ICON)) { GUIManager.getInstance().searchGUI(GUIType.PlayerCustom_Armor).open(player); return; @@ -159,7 +159,7 @@ public void handleClickEvent(InventoryClickEvent e) { return; } - // ── Dynamic categories ─────────────────────────────────────── + // Dynamic categories for (DynamicCategory cat : PlayerKitManager.getInstance().getDynamicCategories()) { if (icon.equals(cat.getIcon())) { cat.getGui().open(player); diff --git a/core/src/main/java/dev/nandi0813/practice/manager/profile/cosmetics/shield/ShieldLayout.java b/core/src/main/java/dev/nandi0813/practice/manager/profile/cosmetics/shield/ShieldLayout.java index 79f082fea..a30fe6865 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/profile/cosmetics/shield/ShieldLayout.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/profile/cosmetics/shield/ShieldLayout.java @@ -52,8 +52,7 @@ public boolean removeTopLayer() { return true; } - // ── Serialisation helpers ──────────────────────────────────────── - + // Serialisation helpers /** Serialise to a single string for YAML storage: "name|BASE_COLOR|COLOR:PATTERN,COLOR:PATTERN,..." */ public String serialise() { var bannerPatternRegistry = RegistryAccess.registryAccess().getRegistry(RegistryKey.BANNER_PATTERN); @@ -112,8 +111,7 @@ private static PatternType parsePatternType(String raw) { private static String escapePipe(String s) { return s.replace("|", "\\|"); } private static String unescapePipe(String s) { return s.replace("\\|", "|"); } - // ── PatternLayer record ────────────────────────────────────────── - + // PatternLayer record public record PatternLayer(DyeColor color, PatternType pattern) { @Override public boolean equals(Object obj) { diff --git a/core/src/main/java/dev/nandi0813/practice/util/NameFormatUtil.java b/core/src/main/java/dev/nandi0813/practice/util/NameFormatUtil.java index c811bd04e..6dff51fe0 100644 --- a/core/src/main/java/dev/nandi0813/practice/util/NameFormatUtil.java +++ b/core/src/main/java/dev/nandi0813/practice/util/NameFormatUtil.java @@ -17,8 +17,7 @@ public enum NameFormatUtil { private static final PlainTextComponentSerializer PLAIN_TEXT_SERIALIZER = PlainTextComponentSerializer.plainText(); - // ── Color helpers ──────────────────────────────────────────────────────── - + // Color helpers private static TextColor findFirstExplicitColor(Component component) { if (component == null) return null; if (component.color() != null) return component.color(); @@ -51,8 +50,7 @@ public static TextColor extractTrailingColor(Component component) { return findLastExplicitColor(component); } - // ── Template / placeholder helpers ────────────────────────────────────── - + // Template / placeholder helpers public static Component parseConfiguredComponent(String raw) { if (raw == null || raw.isEmpty()) return Component.empty(); return ZonePractice.getMiniMessage().deserialize(StringUtil.legacyToMiniMessage(raw)); @@ -102,8 +100,7 @@ public static String normalizePlayerNameTemplate(String rawTemplate) { return rawTemplate + "%player%"; } - // ── Internal rendering ─────────────────────────────────────────────────── - + // Internal rendering private static Component renderTemplate(String rawTemplate, Profile profile, String playerName) { return renderTemplate(rawTemplate, profile, playerName, null); } @@ -146,8 +143,7 @@ private static Component renderTemplate(String rawTemplate, Profile profile, Str return ZonePractice.getMiniMessage().deserialize(normalized); } - // ── Public resolution API ──────────────────────────────────────────────── - + // Public resolution API public static Component resolvePrefix(Profile profile) { return resolvePrefix(profile, null); } diff --git a/core/src/main/resources/config.yml b/core/src/main/resources/config.yml index b4b819640..d368a2118 100644 --- a/core/src/main/resources/config.yml +++ b/core/src/main/resources/config.yml @@ -1,4 +1,4 @@ -VERSION: 58 +VERSION: 59 # Mysql database setup. MYSQL-DATABASE: @@ -265,6 +265,7 @@ MATCH-SETTINGS: LOW-HEALTH-DECIMAL-RATIO: true # If true, health below 2 hearts is shown as a decimal ratio (current/max). LOW-HEALTH-THRESHOLD: 4.0 SCALE: 20 # The scale setting defines the health display range between 10 and 100 with a default value of 20. + SYMBOL: "♥" # The symbol displayed after the health value in the below-name display. BUILD-LIMIT-DEFAULT: 4 # Counts from the first players positions Y level. You can set a unique number for this for every arena, then it will consider where you are standing. AFTER-COUNTDOWN: 3 # After the match is over this countdown start, and when it's over, the players teleport back to the lobby. ROLLBACK: