From f31b87d1f310dd79eb791243662850fc3d713bc8 Mon Sep 17 00:00:00 2001 From: ItzKatze <136186750+ItzKatze@users.noreply.github.com> Date: Sat, 11 Oct 2025 10:13:09 +0200 Subject: [PATCH] feat: team objective --- .../forcebattle/bossbar/BossbarManager.java | 124 +++++++++---- .../fameless/forcebattle/caption/Caption.java | 16 -- .../forcebattle/command/JokerCommand.java | 12 +- .../forcebattle/command/SkipCommand.java | 54 ++++-- .../forcebattle/command/TimerCommand.java | 5 + .../configuration/SettingsFile.java | 16 +- .../configuration/SettingsManager.java | 138 +++++++------- .../event/ObjectiveUpdateEvent.java | 24 ++- .../forcebattle/game/GameListener.java | 170 ++++++++++++++---- .../fameless/forcebattle/game/Objective.java | 5 +- .../forcebattle/game/ObjectiveManager.java | 121 ++++++++----- .../net/fameless/forcebattle/game/Team.java | 40 +++++ .../game/data/BiomeSimplified.java | 1 - .../game/data/StructureSimplified.java | 3 +- .../game/tasks/AdvancementTask.java | 98 ++++++---- .../forcebattle/game/tasks/BiomeTask.java | 101 +++++++---- .../forcebattle/game/tasks/CoordsTask.java | 104 +++++++---- .../forcebattle/game/tasks/HeightTask.java | 84 ++++++--- .../forcebattle/game/tasks/ItemTask.java | 78 ++++++-- .../forcebattle/game/tasks/StructureTask.java | 111 +++++++----- .../fameless/forcebattle/gui/ResultGUI.java | 6 +- .../fameless/forcebattle/gui/SettingsGUI.java | 129 +++++++------ .../forcebattle/player/BattlePlayer.java | 22 ++- .../fameless/forcebattle/util/BattleType.java | 24 ++- .../fameless/forcebattle/util/BukkitUtil.java | 18 ++ .../fameless/forcebattle/util/ItemUtils.java | 45 +++-- src/main/resources/config.yml | 114 ++++++------ src/main/resources/languages/en_US.json | 81 ++++----- 28 files changed, 1149 insertions(+), 595 deletions(-) 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("