diff --git a/src/main/java/net/fameless/forcebattle/ForceBattle.java b/src/main/java/net/fameless/forcebattle/ForceBattle.java index d47b5ed..51b7f79 100644 --- a/src/main/java/net/fameless/forcebattle/ForceBattle.java +++ b/src/main/java/net/fameless/forcebattle/ForceBattle.java @@ -14,6 +14,7 @@ import net.fameless.forcebattle.game.ObjectiveManager; import net.fameless.forcebattle.game.Timer; import net.fameless.forcebattle.gui.GUIListener; +import net.fameless.forcebattle.scoreboard.ScoreboardManager; import net.fameless.forcebattle.tablist.TablistManager; import net.fameless.forcebattle.util.BukkitUtil; import net.fameless.forcebattle.util.ResourceUtil; @@ -93,7 +94,7 @@ private void initCore() { Command.createInstances(); BossbarManager.runTask(); TablistManager.startUpdating(); - //ScoreboardManager.startUpdater(); + ScoreboardManager.startUpdater(); PluginUpdater.checkForUpdate(); } diff --git a/src/main/java/net/fameless/forcebattle/configuration/SettingsManager.java b/src/main/java/net/fameless/forcebattle/configuration/SettingsManager.java index 7de0d77..a7cc84a 100644 --- a/src/main/java/net/fameless/forcebattle/configuration/SettingsManager.java +++ b/src/main/java/net/fameless/forcebattle/configuration/SettingsManager.java @@ -87,6 +87,7 @@ public enum Setting { NO_DUPLICATE_OBJECTIVES, SIMPLIFIED_OBJECTIVES, EXTRA_TEAM_OBJECTIVE, + SHOW_SCOREBOARD, EXCLUDE_MUSIC_DISCS, EXCLUDE_BANNER_PATTERNS, diff --git a/src/main/java/net/fameless/forcebattle/game/GameListener.java b/src/main/java/net/fameless/forcebattle/game/GameListener.java index 7e1b91a..b68ccdc 100644 --- a/src/main/java/net/fameless/forcebattle/game/GameListener.java +++ b/src/main/java/net/fameless/forcebattle/game/GameListener.java @@ -76,10 +76,8 @@ public GameListener() { } //TODO better tablist - //TODO scoreboard which shows teammate obj - //TODO click im chat fixen //TODO evtl /item => zeigt rezept an => wenn gui system done is - //TODO commands von cords ausführen + //TODO commands von cords ausführen (for spawn) @EventHandler public void onPlayerLogin(AsyncPlayerPreLoginEvent event) { diff --git a/src/main/java/net/fameless/forcebattle/game/NametagManager.java b/src/main/java/net/fameless/forcebattle/game/NametagManager.java index c83139c..3e37e66 100644 --- a/src/main/java/net/fameless/forcebattle/game/NametagManager.java +++ b/src/main/java/net/fameless/forcebattle/game/NametagManager.java @@ -5,6 +5,7 @@ import net.fameless.forcebattle.configuration.SettingsManager; import net.fameless.forcebattle.game.data.FBAdvancement; import net.fameless.forcebattle.player.BattlePlayer; +import net.fameless.forcebattle.scoreboard.ScoreboardManager; import net.fameless.forcebattle.util.BattleType; import net.fameless.forcebattle.util.BukkitUtil; import net.fameless.forcebattle.util.StringUtility; @@ -17,92 +18,75 @@ public class NametagManager { - private static Scoreboard scoreboard = null; - - private static Scoreboard getCustomScoreboard() { - if (scoreboard == null) { - scoreboard = Bukkit.getScoreboardManager().getNewScoreboard(); - } - return scoreboard; - } - public static void runTask() { - Bukkit.getScheduler().runTaskTimer(ForceBattle.get(), () -> BattlePlayer.BATTLE_PLAYERS.forEach(NametagManager::updateNametag), 0, 3); + Bukkit.getScheduler().runTaskTimer(ForceBattle.get(), () -> + BattlePlayer.BATTLE_PLAYERS.forEach(NametagManager::updateNametag), 0, 3); } private static void updateNametag(@NotNull BattlePlayer battlePlayer) { - if (battlePlayer.isOffline()) { - Team team = getCustomScoreboard().getTeam(battlePlayer.getUuid().toString()); - if (team != null) { - team.unregister(); - } - for (Player target : Bukkit.getOnlinePlayers()) { - Team targetTeam = target.getScoreboard().getTeam(battlePlayer.getUuid().toString()); - if (targetTeam != null && targetTeam.hasEntry(battlePlayer.getName())) { - targetTeam.removeEntry(battlePlayer.getName()); - } + Player player = battlePlayer.getPlayer(); + if (player == null) return; + + Scoreboard scoreboard = ScoreboardManager.getOrCreateScoreboard(battlePlayer); + + for (BattlePlayer targetPlayer : BattlePlayer.BATTLE_PLAYERS) { + Player target = targetPlayer.getPlayer(); + if (target == null) continue; + + Team team = scoreboard.getTeam(targetPlayer.getUuid().toString()); + if (team == null) { + team = scoreboard.registerNewTeam(targetPlayer.getUuid().toString()); + team.addEntry(targetPlayer.getName()); } - } - Team team = getCustomScoreboard().getTeam(battlePlayer.getUuid().toString()); - if (team == null) { - team = getCustomScoreboard().registerNewTeam(battlePlayer.getUuid().toString()); - } - if (!team.hasEntry(battlePlayer.getName())) { - team.addEntry(battlePlayer.getName()); - } - battlePlayer.setScoreboard(getCustomScoreboard()); + StringBuilder suffix = new StringBuilder(" "); - StringBuilder suffix = new StringBuilder(" "); + if (targetPlayer.isExcluded()) { + suffix.append(Caption.getAsLegacy("excluded")); + } else if (!ForceBattle.getTimer().isRunning()) { + suffix.append(Caption.getAsLegacy("waiting")); + } else { + var objective = targetPlayer.getObjective(); + String objectiveString; - if (battlePlayer.isExcluded()) { - suffix.append(Caption.getAsLegacy("excluded")); - team.setSuffix(suffix.toString()); - return; - } + if (BukkitUtil.convertObjective(BattleType.FORCE_ADVANCEMENT, objective.getObjectiveString()) instanceof FBAdvancement advancement) { + objectiveString = advancement.name; + } else { + objectiveString = StringUtility.formatName(objective.getObjectiveString()); + } - if (!ForceBattle.getTimer().isRunning()) { - suffix.append(Caption.getAsLegacy("waiting")); - team.setSuffix(suffix.toString()); - return; - } + if (!SettingsManager.isEnabled(SettingsManager.Setting.HIDE_OBJECTIVES)) { + suffix.append(" ") + .append(ChatColor.GRAY) + .append(objective.getBattleType().getPrefix()) + .append(ChatColor.DARK_GRAY) + .append(" » ") + .append(ChatColor.BLUE) + .append(objectiveString); + } - String objectiveString; - Objective objective = battlePlayer.getObjective(); - if (BukkitUtil.convertObjective(BattleType.FORCE_ADVANCEMENT, objective.getObjectiveString()) instanceof FBAdvancement advancement) { - objectiveString = advancement.name; - } else { - objectiveString = StringUtility.formatName(objective.getObjectiveString()); - } + if (!SettingsManager.isEnabled(SettingsManager.Setting.HIDE_OBJECTIVES) + && !SettingsManager.isEnabled(SettingsManager.Setting.HIDE_POINTS)) { + suffix.append(ChatColor.DARK_GRAY).append(" |"); + } - if (!SettingsManager.isEnabled(SettingsManager.Setting.HIDE_OBJECTIVES)) { - suffix - .append(" ") - .append(ChatColor.GRAY) - .append(objective.getBattleType().getPrefix()) - .append(ChatColor.DARK_GRAY) - .append(" » ") - .append(ChatColor.BLUE) - .append( - objectiveString); - } + if (!SettingsManager.isEnabled(SettingsManager.Setting.HIDE_POINTS)) { + suffix.append(" ").append(ChatColor.GRAY).append("Points") + .append(ChatColor.DARK_GRAY).append(" » ") + .append(ChatColor.BLUE).append(targetPlayer.getPoints()); + } - if (!SettingsManager.isEnabled(SettingsManager.Setting.HIDE_OBJECTIVES) && !SettingsManager.isEnabled(SettingsManager.Setting.HIDE_POINTS)) { - suffix.append(ChatColor.DARK_GRAY).append(" |"); - } + var teamData = targetPlayer.getTeam(); + if (teamData != null) { + suffix.append(ChatColor.DARK_GRAY).append(" | ").append(ChatColor.GRAY) + .append("Team").append(ChatColor.DARK_GRAY).append(" » ") + .append(ChatColor.BLUE).append(teamData.getId()); + } + } - if (!SettingsManager.isEnabled(SettingsManager.Setting.HIDE_POINTS)) { - suffix.append(" ").append(ChatColor.GRAY).append("Points").append(ChatColor.DARK_GRAY).append(" » ") - .append(ChatColor.BLUE).append(battlePlayer.getPoints()); + team.setSuffix(suffix.toString()); } - net.fameless.forcebattle.game.Team playerTeam = battlePlayer.getTeam(); - if (playerTeam != null) { - suffix.append(ChatColor.DARK_GRAY).append(" | ").append(ChatColor.GRAY).append("Team").append(ChatColor.DARK_GRAY).append(" » ") - .append(ChatColor.BLUE).append(playerTeam.getId()); - } - String formattedSuffix = suffix.toString(); - team.setSuffix(formattedSuffix); + player.setScoreboard(scoreboard); } - } diff --git a/src/main/java/net/fameless/forcebattle/gui/impl/SettingsGUI.java b/src/main/java/net/fameless/forcebattle/gui/impl/SettingsGUI.java index 4ac211e..87ced9f 100644 --- a/src/main/java/net/fameless/forcebattle/gui/impl/SettingsGUI.java +++ b/src/main/java/net/fameless/forcebattle/gui/impl/SettingsGUI.java @@ -57,6 +57,8 @@ public enum SettingButton { "gui.simplified_objectives_name", "gui.simplified_objectives_lore", "notification.simplified_objectives_changed"), EXTRA_TEAM_OBJECTIVE(33, Material.ALLAY_SPAWN_EGG, SettingsManager.Setting.EXTRA_TEAM_OBJECTIVE, false, "gui.extra_team_objective_name", "gui.extra_team_objective_lore", "notification.extra_team_objective_changed"), + SHOW_SCOREBOARD(34, Material.ARMOR_STAND, SettingsManager.Setting.SHOW_SCOREBOARD, false, + "gui.show_scoreboard_name", "gui.show_scoreboard_lore", "notification.show_scoreboard_changed"), RESET(35, Material.BARRIER, null, false, ChatColor.RED + "RESET", null, null); diff --git a/src/main/java/net/fameless/forcebattle/scoreboard/ScoreboardManager.java b/src/main/java/net/fameless/forcebattle/scoreboard/ScoreboardManager.java index 7a388b7..424a370 100644 --- a/src/main/java/net/fameless/forcebattle/scoreboard/ScoreboardManager.java +++ b/src/main/java/net/fameless/forcebattle/scoreboard/ScoreboardManager.java @@ -1,8 +1,10 @@ package net.fameless.forcebattle.scoreboard; import net.fameless.forcebattle.ForceBattle; +import net.fameless.forcebattle.configuration.SettingsManager; import net.fameless.forcebattle.game.Team; import net.fameless.forcebattle.player.BattlePlayer; +import net.fameless.forcebattle.util.BattleType; import net.fameless.forcebattle.util.StringUtility; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -13,29 +15,34 @@ import java.util.HashMap; import java.util.Map; + public class ScoreboardManager { private static final Map SCOREBOARDS = new HashMap<>(); + private static final Map> LAST_LINES = new HashMap<>(); public static void startUpdater() { - Bukkit.getLogger().info("[ForceBattle] Scoreboard updater started."); - - Bukkit.getScheduler().runTaskTimer(ForceBattle.get(), ScoreboardManager::updateAll, 1L, 1L); + Bukkit.getScheduler().runTaskTimer(ForceBattle.get(), ScoreboardManager::updateAll, 20L, 20L); } public static void updateAll() { for (BattlePlayer battlePlayer : BattlePlayer.getOnlinePlayers()) { - if (battlePlayer.isExcluded() || !ForceBattle.getTimer().isRunning()) { + boolean shouldHaveScoreboard = !battlePlayer.isExcluded() && ForceBattle.getTimer().isRunning(); + + if (shouldHaveScoreboard && SettingsManager.isEnabled(SettingsManager.Setting.SHOW_SCOREBOARD)) { + updateScoreboard(battlePlayer); + } else if (SCOREBOARDS.containsKey(battlePlayer) && !SettingsManager.isEnabled(SettingsManager.Setting.SHOW_SCOREBOARD)) { removeScoreboard(battlePlayer); - continue; } - updateScoreboard(battlePlayer); } } + public static Scoreboard getOrCreateScoreboard(BattlePlayer player) { + return SCOREBOARDS.computeIfAbsent(player, p -> Bukkit.getScoreboardManager().getNewScoreboard()); + } + public static void updateScoreboard(BattlePlayer player) { - Scoreboard scoreboard = SCOREBOARDS.computeIfAbsent(player, - p -> Bukkit.getScoreboardManager().getNewScoreboard()); + Scoreboard scoreboard = getOrCreateScoreboard(player); Objective obj = scoreboard.getObjective("fb_info"); if (obj == null) { @@ -44,48 +51,85 @@ public static void updateScoreboard(BattlePlayer player) { obj.setDisplaySlot(DisplaySlot.SIDEBAR); } - scoreboard.getEntries().forEach(scoreboard::resetScores); + Map last = LAST_LINES.computeIfAbsent(player, p -> new HashMap<>()); + Map newLines = new HashMap<>(); int line = 15; var selfObjective = player.getObjective(); if (selfObjective != null) { - obj.getScore(ChatColor.YELLOW + "Your Objective:").setScore(line--); - obj.getScore(ChatColor.WHITE + StringUtility.formatName(selfObjective.getObjectiveString())).setScore(line--); + newLines.put(line--, ChatColor.YELLOW + "Your Objective:"); + newLines.put(line--, ChatColor.WHITE + getObjectiveDisplay(selfObjective)); } else { - obj.getScore(ChatColor.GRAY + "No current objective").setScore(line--); + newLines.put(line--, ChatColor.GRAY + "No current objective"); } - obj.getScore(" ").setScore(line--); + newLines.put(line--, " "); if (player.isInTeam()) { Team team = player.getTeam(); - obj.getScore(ChatColor.AQUA + "Your Team: " + ChatColor.WHITE + team.getId()).setScore(line--); + + var teamObjective = team.getObjective(); + if (teamObjective != null && SettingsManager.isEnabled(SettingsManager.Setting.EXTRA_TEAM_OBJECTIVE)) { + newLines.put(line--, ChatColor.YELLOW + "Team Objective:"); + newLines.put(line--, ChatColor.WHITE + getObjectiveDisplay(teamObjective)); + newLines.put(line--, " "); + } + + if (team.getPlayers().size() > 1) { + newLines.put(line--, ChatColor.YELLOW + "Teammates:"); + } for (BattlePlayer teammate : team.getPlayers()) { if (teammate.equals(player)) continue; + newLines.put(line--, ChatColor.GRAY + "• " + ChatColor.AQUA + teammate.getName()); + var teammateObjective = teammate.getObjective(); String objName = teammateObjective != null - ? StringUtility.formatName(teammateObjective.getObjectiveString()) + ? getObjectiveDisplay(teammateObjective) : "None"; - String display = ChatColor.GRAY + "• " + ChatColor.YELLOW + teammate.getName() + - ChatColor.WHITE + ": " + - (objName.length() > 16 ? objName.substring(0, 13) + "..." : objName); + newLines.put(line--, ChatColor.WHITE + " " + + (objName.length() > 24 ? objName.substring(0, 21) + "..." : objName)); + } + } - obj.getScore(display).setScore(line--); + for (var entry : last.entrySet()) { + if (!newLines.containsValue(entry.getValue())) { + scoreboard.resetScores(entry.getValue()); + } + } + + for (var entry : newLines.entrySet()) { + if (!entry.getValue().equals(last.get(entry.getKey()))) { + obj.getScore(entry.getValue()).setScore(entry.getKey()); } - } else { - obj.getScore(ChatColor.GRAY + "Not in a team").setScore(line--); } - player.getPlayer().setScoreboard(scoreboard); + LAST_LINES.put(player, newLines); + + if (player.getPlayer().getScoreboard() != scoreboard) { + player.getPlayer().setScoreboard(scoreboard); + } + } + + private static String getObjectiveDisplay(net.fameless.forcebattle.game.Objective objective) { + String icon = switch (objective.getBattleType()) { + case BattleType.FORCE_ITEM -> "✦"; + case BattleType.FORCE_MOB -> "☠"; + case BattleType.FORCE_ADVANCEMENT -> "★"; + case BattleType.FORCE_HEIGHT -> "⛰"; + case BattleType.FORCE_COORDS -> "⚑"; + case BattleType.FORCE_STRUCTURE -> "⌂"; + case BattleType.FORCE_BIOME -> "☀"; + }; + return icon + " " + StringUtility.formatName(objective.getObjectiveString()); } public static void removeScoreboard(BattlePlayer player) { player.getPlayer().setScoreboard(Bukkit.getScoreboardManager().getNewScoreboard()); SCOREBOARDS.remove(player); - Bukkit.getLogger().info("[ForceBattle] Removed scoreboard for " + player.getName()); + LAST_LINES.remove(player); } } diff --git a/src/main/resources/languages/en_US.json b/src/main/resources/languages/en_US.json index daa9f19..8bc87be 100644 --- a/src/main/resources/languages/en_US.json +++ b/src/main/resources/languages/en_US.json @@ -42,6 +42,8 @@ "gui.simplified_objectives_lore" : "
Click to toggle simplified objectives.

Current Status: ", "gui.extra_team_objective_name" : "Extra Team Objective", "gui.extra_team_objective_lore" : "
Click to toggle the extra team objective.

Current Status: ", + "gui.show_scoreboard_name" : "Show Scoreboard", + "gui.show_scoreboard_lore" : "
Click to toggle the scoreboard.

Current Status: ", "gui.exclude_music_discs_name" : "Exclude Music Discs", "gui.exclude_music_discs_lore" : "
Click to toggle excluding Music Discs.

Current Status: ", "gui.exclude_banner_patterns_name" : "Exclude Banner Patterns", @@ -75,6 +77,7 @@ "notification.no_duplicate_objectives_changed" : "No duplicate objectives has been set to !", "notification.simplified_objectives_changed" : "Simplified objectives have been set to !", "notification.extra_team_objective_changed" : "Extra team objective has been set to !", + "notification.show_scoreboard_changed" : "Show scoreboard has been set to !", "notification.exclude_music_discs_changed" : "Exclude Music Discs has been set to !", "notification.exclude_banner_patterns_changed" : "Exclude Banner Patterns has been set to !", "notification.exclude_armor_templates_changed" : "Exclude Armor Templates has been set to !",