diff --git a/src/main/java/com/alttd/hunger_games/commands/subcommands/NextPhase.java b/src/main/java/com/alttd/hunger_games/commands/subcommands/NextPhase.java index cbb9ac8..fe52d9c 100644 --- a/src/main/java/com/alttd/hunger_games/commands/subcommands/NextPhase.java +++ b/src/main/java/com/alttd/hunger_games/commands/subcommands/NextPhase.java @@ -16,7 +16,7 @@ public class NextPhase extends SubCommand { @Override public boolean onCommand(CommandSender commandSender, String[] args) { round.forceNextPhase(); - commandSender.sendRichMessage("Skipping to the next phase/stage."); + commandSender.sendRichMessage(Messages.COMMANDS.NEXT_PHASE_SUCCESS); return true; } diff --git a/src/main/java/com/alttd/hunger_games/config/Config.java b/src/main/java/com/alttd/hunger_games/config/Config.java index 1a15f3a..5600844 100644 --- a/src/main/java/com/alttd/hunger_games/config/Config.java +++ b/src/main/java/com/alttd/hunger_games/config/Config.java @@ -42,6 +42,8 @@ public class Config extends AbstractConfig { private static final String prefix = "round."; public static Duration COUNTDOWN = Duration.ofSeconds(10); + public static Duration SAFE_PHASE = Duration.ofSeconds(30); + public static Duration KILL_PHASE = Duration.ofMinutes(5); public static int INITIAL_BORDER_SIZE = 5000; public static List STAGES = List.of( GameStage.builder().duration(Duration.ofMinutes(5)).worldBorderSize(1000).build(), @@ -53,6 +55,10 @@ public class Config extends AbstractConfig { private static void load() { int countdownSeconds = config.getInt(prefix, "countdown-seconds", Math.toIntExact(COUNTDOWN.toSeconds())); COUNTDOWN = Duration.ofSeconds(countdownSeconds); + int safePhaseSeconds = config.getInt(prefix, "safe-phase-seconds", Math.toIntExact(SAFE_PHASE.toSeconds())); + SAFE_PHASE = Duration.ofSeconds(safePhaseSeconds); + int killPhaseSeconds = config.getInt(prefix, "kill-phase-seconds", Math.toIntExact(KILL_PHASE.toSeconds())); + KILL_PHASE = Duration.ofSeconds(killPhaseSeconds); INITIAL_BORDER_SIZE = config.getInt(prefix, "initial-border-size", INITIAL_BORDER_SIZE); ConfigurationSection configurationSection = config.getConfigurationSection(prefix + "stages"); diff --git a/src/main/java/com/alttd/hunger_games/config/Messages.java b/src/main/java/com/alttd/hunger_games/config/Messages.java index bbd6805..6dac853 100644 --- a/src/main/java/com/alttd/hunger_games/config/Messages.java +++ b/src/main/java/com/alttd/hunger_games/config/Messages.java @@ -91,6 +91,7 @@ public class Messages extends AbstractConfig { public static String PLAYER_DEATH = " has died! players remaining."; public static String BOSSBAR_COUNTDOWN = "Loot phase in "; + public static String BOSSBAR_PVP_COUNTDOWN = "PVP starts in "; public static String BOSSBAR_SAFE_PHASE = "Border shrinking in "; public static String BOSSBAR_KILL_PHASE = "Border shrinking... "; public static String BOSSBAR_FINALE = "Remaining Players: "; @@ -107,6 +108,7 @@ public class Messages extends AbstractConfig { PLAYER_DEATH = config.getString(prefix, "player-death", PLAYER_DEATH); BOSSBAR_COUNTDOWN = config.getString(prefix, "bossbar-countdown", BOSSBAR_COUNTDOWN); + BOSSBAR_PVP_COUNTDOWN = config.getString(prefix, "bossbar-pvp-countdown", BOSSBAR_PVP_COUNTDOWN); BOSSBAR_SAFE_PHASE = config.getString(prefix, "bossbar-border-shrinking-in", BOSSBAR_SAFE_PHASE); BOSSBAR_KILL_PHASE = config.getString(prefix, "bossbar-border-shrinking", BOSSBAR_KILL_PHASE); BOSSBAR_FINALE = config.getString(prefix, "bossbar-finale", BOSSBAR_FINALE); @@ -201,4 +203,15 @@ public class Messages extends AbstractConfig { STATS_FORMAT = config.getString(prefix, "format", STATS_FORMAT); } } + + public static class COMMANDS { + private static final String prefix = "commands."; + + public static String NEXT_PHASE_SUCCESS = "Skipping to the next phase/stage."; + + @SuppressWarnings("unused") + private static void load() { + NEXT_PHASE_SUCCESS = config.getString(prefix + "next-phase", "success", NEXT_PHASE_SUCCESS); + } + } } diff --git a/src/main/java/com/alttd/hunger_games/game/GameStageHandler.java b/src/main/java/com/alttd/hunger_games/game/GameStageHandler.java index 7b8a245..7062c30 100644 --- a/src/main/java/com/alttd/hunger_games/game/GameStageHandler.java +++ b/src/main/java/com/alttd/hunger_games/game/GameStageHandler.java @@ -18,6 +18,10 @@ public class GameStageHandler { broadcast(message); } + public static void broadcastMessage(String message) { + broadcast(message); + } + public static void handleCountdownEnd() { broadcast(Messages.GAME.STARTED); } diff --git a/src/main/java/com/alttd/hunger_games/services/BossBarService.java b/src/main/java/com/alttd/hunger_games/services/BossBarService.java index 0371541..fb47ed7 100644 --- a/src/main/java/com/alttd/hunger_games/services/BossBarService.java +++ b/src/main/java/com/alttd/hunger_games/services/BossBarService.java @@ -42,9 +42,14 @@ public class BossBarService implements RoundListener { public void updateCountdown(Duration timeLeft, Duration totalTime, ROUND_STATE state) { String message = switch (state) { case COUNTDOWN -> Messages.GAME.BOSSBAR_COUNTDOWN; - case SAFE_PHASE -> Messages.GAME.BOSSBAR_SAFE_PHASE; - case KILL_PHASE -> Messages.GAME.BOSSBAR_KILL_PHASE; - default -> throw new IllegalArgumentException("Invalid round state: " + state); + case SAFE_PHASE -> Messages.GAME.BOSSBAR_PVP_COUNTDOWN; + case KILL_PHASE -> Messages.GAME.BOSSBAR_SAFE_PHASE; + default -> { + if (state.ordinal() > ROUND_STATE.KILL_PHASE.ordinal()) { + yield Messages.GAME.BOSSBAR_KILL_PHASE; + } + throw new IllegalArgumentException("Invalid round state: " + state); + } }; if (message.isEmpty()) { diff --git a/src/main/java/com/alttd/hunger_games/services/Round.java b/src/main/java/com/alttd/hunger_games/services/Round.java index 985181b..8708c81 100644 --- a/src/main/java/com/alttd/hunger_games/services/Round.java +++ b/src/main/java/com/alttd/hunger_games/services/Round.java @@ -1,8 +1,8 @@ package com.alttd.hunger_games.services; import com.alttd.hunger_games.config.Config; +import com.alttd.hunger_games.config.Messages; import com.alttd.hunger_games.data_objects.GameStage; -import com.alttd.hunger_games.data_objects.PLAYER_STATE; import com.alttd.hunger_games.data_objects.ROUND_STATE; import com.alttd.hunger_games.game.GameStageHandler; import lombok.Setter; @@ -87,8 +87,12 @@ public class Round { startCountdown(warmupDuration, () -> { GameStageHandler.handleCountdownEnd(); - nextStage(); - scheduleNextStage(0); + nextStage(); // COUNTDOWN -> SAFE_PHASE + startCountdown(Config.ROUND.SAFE_PHASE, () -> { + nextStage(); // SAFE_PHASE -> KILL_PHASE + GameStageHandler.broadcastMessage(Messages.GAME.NEXT_STATE.replace("", roundState.getHumanReadableName())); + startCountdown(Config.ROUND.KILL_PHASE, () -> scheduleNextStage(0)); + }); }); } @@ -120,13 +124,11 @@ public class Round { private void scheduleNextStage(int index) { List gameStageList = Config.ROUND.STAGES; if (gameStageList.isEmpty()) { - nextStage(); // Transition to SAFE_PHASE - nextStage(); // Transition to KILL_PHASE return; } if (gameStageList.size() <= index) { - nextStage(); + nextStage(); // Transition to FINALE return; } @@ -134,17 +136,8 @@ public class Round { Duration duration = gameStage.getDuration(); startCountdown(duration, () -> { - if (gameStageList.size() <= index + 1) { - nextStage(); - GameStageHandler.handleStageChange(gameStage.getWorldBorderSize()); - startCountdown(Duration.ofMinutes(5), this::nextStage); - } else { - if (index == 0 && roundState.equals(ROUND_STATE.SAFE_PHASE)) { - nextStage(); - } - GameStageHandler.handleStageChange(gameStage.getWorldBorderSize()); - scheduleNextStage(index + 1); - } + GameStageHandler.handleStageChange(gameStage.getWorldBorderSize()); + scheduleNextStage(index + 1); }); } @@ -153,16 +146,7 @@ public class Round { return; } countdownFuture.cancel(true); - if (roundState.equals(ROUND_STATE.KILL_PHASE)) { - onEnd.run(); - } else { - nextStage(); - if (roundState.equals(ROUND_STATE.SAFE_PHASE)) { - scheduleNextStage(0); - } else if (roundState.equals(ROUND_STATE.KILL_PHASE)) { - scheduleNextStage(0); - } - } + onEnd.run(); } }