diff --git a/src/main/java/net/fameless/forcebattle/bossbar/BossbarManager.java b/src/main/java/net/fameless/forcebattle/bossbar/BossbarManager.java index 75bb358..492df64 100644 --- a/src/main/java/net/fameless/forcebattle/bossbar/BossbarManager.java +++ b/src/main/java/net/fameless/forcebattle/bossbar/BossbarManager.java @@ -3,6 +3,8 @@ import net.fameless.forcebattle.ForceBattle; import net.fameless.forcebattle.caption.Caption; import net.fameless.forcebattle.configuration.SettingsManager; +import net.fameless.forcebattle.game.Objective; +import net.fameless.forcebattle.game.Team; import net.fameless.forcebattle.player.BattlePlayer; import net.fameless.forcebattle.util.Format; import net.kyori.adventure.bossbar.BossBar; @@ -17,66 +19,122 @@ public class BossbarManager { - private static final HashMap lastBossbarMap = new HashMap<>(); + private static final HashMap lastPlayerBarMap = new HashMap<>(); + private static final HashMap lastTeamBarMap = new HashMap<>(); public static void runTask() { TimerTask task = new TimerTask() { @Override public void run() { + boolean timerRunning = ForceBattle.getTimer().isRunning(); + for (BattlePlayer battlePlayer : BattlePlayer.getOnlinePlayers()) { if (battlePlayer.isExcluded()) { - hideBossBar(battlePlayer); + hideBossBars(battlePlayer); + continue; + } + + BossBar playerBar = BossBar.bossBar( + getPlayerObjectiveTitle(battlePlayer), + 1, + BossBar.Color.BLUE, + BossBar.Overlay.PROGRESS + ); + updateBossBar(battlePlayer, playerBar, lastPlayerBarMap); + + if (!timerRunning) { + hideBossBar(battlePlayer, lastTeamBarMap); continue; } - Component bossbarTitle = getBossbarTitle(battlePlayer); - BossBar bossBar = BossBar.bossBar(bossbarTitle, 1, BossBar.Color.BLUE, BossBar.Overlay.PROGRESS); + if (battlePlayer.isInTeam()) { + Team team = battlePlayer.getTeam(); + Objective teamObjective = team.getObjective(); - updateBossBar(battlePlayer, bossBar); + if (teamObjective != null) { + BossBar teamBar = BossBar.bossBar( + getTeamObjectiveTitle(team), + 1, + BossBar.Color.PURPLE, + BossBar.Overlay.PROGRESS + ); + updateBossBar(battlePlayer, teamBar, lastTeamBarMap); + } else { + hideBossBar(battlePlayer, lastTeamBarMap); + } + } else { + hideBossBar(battlePlayer, lastTeamBarMap); + } } } }; new Timer("forcebattle/bossbar").scheduleAtFixedRate(task, 150, 150); } - private static void hideBossBar(BattlePlayer battlePlayer) { - if (lastBossbarMap.containsKey(battlePlayer)) { - battlePlayer.getAudience().hideBossBar(lastBossbarMap.get(battlePlayer)); - lastBossbarMap.remove(battlePlayer); + private static void hideBossBars(BattlePlayer battlePlayer) { + hideBossBar(battlePlayer, lastPlayerBarMap); + hideBossBar(battlePlayer, lastTeamBarMap); + } + + private static void hideBossBar(BattlePlayer battlePlayer, HashMap map) { + if (map.containsKey(battlePlayer)) { + battlePlayer.getAudience().hideBossBar(map.get(battlePlayer)); + map.remove(battlePlayer); } } - private static @NotNull Component getBossbarTitle(BattlePlayer battlePlayer) { - if (ForceBattle.getTimer().isRunning()) { - boolean isPlayerInTeam = battlePlayer.isInTeam(); - int points = isPlayerInTeam ? battlePlayer.getTeam().getPoints() : battlePlayer.getPoints(); - - if (SettingsManager.isEnabled(SettingsManager.Setting.HIDE_POINTS)) { - return Caption.of( - "bossbar.format_hide_points", - TagResolver.resolver("battletype", Tag.inserting(Component.text(battlePlayer.getObjective().getBattleType().getPrefix()))), - TagResolver.resolver("objective", Tag.inserting(Component.text(Format.formatName(battlePlayer.getObjective().getObjectiveString())))) - ); - } + private static @NotNull Component getPlayerObjectiveTitle(BattlePlayer battlePlayer) { + if (!ForceBattle.getTimer().isRunning()) return Caption.of("waiting"); + + Objective playerObjective = battlePlayer.getObjective(); + if (playerObjective == null) return Caption.of("waiting"); + boolean isPlayerInTeam = battlePlayer.isInTeam(); + int points = isPlayerInTeam ? battlePlayer.getTeam().getPoints() : battlePlayer.getPoints(); + + if (SettingsManager.isEnabled(SettingsManager.Setting.HIDE_POINTS)) { + return Caption.of( + "bossbar.format_hide_points", + TagResolver.resolver("battletype", Tag.inserting(Component.text(playerObjective.getBattleType().getPrefix()))), + TagResolver.resolver("objective", Tag.inserting(Component.text(Format.formatName(playerObjective.getObjectiveString())))) + ); + } + + return Caption.of( + "bossbar.format", + TagResolver.resolver("battletype", Tag.inserting(Component.text(playerObjective.getBattleType().getPrefix()))), + TagResolver.resolver("objective", Tag.inserting(Component.text(Format.formatName(playerObjective.getObjectiveString())))), + TagResolver.resolver("pointstype", Tag.inserting(Component.text(isPlayerInTeam ? "Team-Points" : "Points"))), + TagResolver.resolver("points", Tag.inserting(Component.text(points))) + ); + } + + private static @NotNull Component getTeamObjectiveTitle(Team team) { + Objective teamObjective = team.getObjective(); + if (teamObjective == null) return Component.empty(); + + if (SettingsManager.isEnabled(SettingsManager.Setting.HIDE_POINTS)) { return Caption.of( - "bossbar.format", - TagResolver.resolver("battletype", Tag.inserting(Component.text(battlePlayer.getObjective().getBattleType().getPrefix()))), - TagResolver.resolver("objective", Tag.inserting(Component.text(Format.formatName(battlePlayer.getObjective().getObjectiveString())))), - TagResolver.resolver("pointstype", Tag.inserting(Component.text(isPlayerInTeam ? "Team-Points" : "Points"))), - TagResolver.resolver("points", Tag.inserting(Component.text(points))) + "bossbar.team_format_hide_points", + TagResolver.resolver("battletype", Tag.inserting(Component.text(teamObjective.getBattleType().getPrefix()))), + TagResolver.resolver("objective", Tag.inserting(Component.text(Format.formatName(teamObjective.getObjectiveString())))) ); - } else { - return Caption.of("waiting"); } + + return Caption.of( + "bossbar.team_format", + TagResolver.resolver("battletype", Tag.inserting(Component.text(teamObjective.getBattleType().getPrefix()))), + TagResolver.resolver("objective", Tag.inserting(Component.text(Format.formatName(teamObjective.getObjectiveString())))), + TagResolver.resolver("pointstype", Tag.inserting(Component.text("Team-Points"))), + TagResolver.resolver("points", Tag.inserting(Component.text(team.getPoints()))) + ); } - private static void updateBossBar(BattlePlayer battlePlayer, BossBar bossBar) { - if (lastBossbarMap.containsKey(battlePlayer)) { - battlePlayer.getAudience().hideBossBar(lastBossbarMap.get(battlePlayer)); + private static void updateBossBar(BattlePlayer battlePlayer, BossBar bossBar, HashMap map) { + if (map.containsKey(battlePlayer)) { + battlePlayer.getAudience().hideBossBar(map.get(battlePlayer)); } battlePlayer.getAudience().showBossBar(bossBar); - lastBossbarMap.put(battlePlayer, bossBar); + map.put(battlePlayer, bossBar); } - } diff --git a/src/main/java/net/fameless/forcebattle/caption/Caption.java b/src/main/java/net/fameless/forcebattle/caption/Caption.java index 44e73c0..34f00b3 100644 --- a/src/main/java/net/fameless/forcebattle/caption/Caption.java +++ b/src/main/java/net/fameless/forcebattle/caption/Caption.java @@ -3,7 +3,6 @@ import com.google.gson.JsonObject; import lombok.Getter; import net.fameless.forcebattle.ForceBattle; -import net.fameless.forcebattle.configuration.SettingsManager; import net.fameless.forcebattle.event.LanguageChangeEvent; import net.fameless.forcebattle.util.Format; import net.kyori.adventure.text.Component; @@ -47,21 +46,6 @@ private Caption() { private static @NotNull String replaceDefaults(String input) { input = input.replace("", getString("prefix")) .replace("