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();
}
}