From d3946bc16aea639bea6ddcc949db8c86bc482db4 Mon Sep 17 00:00:00 2001 From: akastijn Date: Sat, 30 May 2026 00:10:35 +0200 Subject: [PATCH] Remove `IN_GAME` player state and related logic; integrate destination-based teleportation during round progression. --- TODO.md | 3 +-- .../java/com/alttd/hunger_games/Main.java | 5 +++- .../commands/subcommands/Register.java | 3 --- .../alttd/hunger_games/config/Messages.java | 2 -- .../data_objects/PLAYER_STATE.java | 1 - .../hunger_games/services/PlayerService.java | 25 ++++++++++++++++--- 6 files changed, 26 insertions(+), 13 deletions(-) diff --git a/TODO.md b/TODO.md index 4872505..3bb9a0f 100644 --- a/TODO.md +++ b/TODO.md @@ -101,8 +101,7 @@ A Minecraft survival/PvP plugin with configurable loot, shrinking world border, ### Player States Track each registered player in one of these states: -- [ ] `REGISTERED` — signed up, round not yet started -- [ ] `IN_GAME` — actively in the round +- [ ] `REGISTERED` — signed up or in game (depending on round state) - [ ] `DISCONNECTED` — left the server mid-round - [ ] `SPECTATING` — non-participant/dead observer diff --git a/src/main/java/com/alttd/hunger_games/Main.java b/src/main/java/com/alttd/hunger_games/Main.java index d616bc3..e7b5550 100644 --- a/src/main/java/com/alttd/hunger_games/Main.java +++ b/src/main/java/com/alttd/hunger_games/Main.java @@ -6,6 +6,7 @@ import com.alttd.hunger_games.config.Messages; import com.alttd.hunger_games.event_listeners.PlayerDisconnectListener; import com.alttd.hunger_games.event_listeners.PlayerJoinListener; import com.alttd.hunger_games.services.PlayerService; +import com.alttd.hunger_games.services.PlayerTeleporterService; import com.alttd.hunger_games.services.Round; import com.alttd.hunger_games.services.RoundService; import lombok.extern.slf4j.Slf4j; @@ -17,6 +18,7 @@ public final class Main extends JavaPlugin { private RoundService roundService; private PlayerService playerService; + private PlayerTeleporterService playerTeleporterService; @Override public void onEnable() { @@ -31,7 +33,8 @@ public final class Main extends JavaPlugin { private void registerServices() { Round round = Round.createSingletonInstance(); roundService = RoundService.createSingletonInstance(round); - playerService = new PlayerService(roundService); + playerTeleporterService = PlayerTeleporterService.createSingletonInstance(); + playerService = PlayerService.createSingletonInstance(roundService, playerTeleporterService); } @Override diff --git a/src/main/java/com/alttd/hunger_games/commands/subcommands/Register.java b/src/main/java/com/alttd/hunger_games/commands/subcommands/Register.java index 891a286..a2cdc6f 100644 --- a/src/main/java/com/alttd/hunger_games/commands/subcommands/Register.java +++ b/src/main/java/com/alttd/hunger_games/commands/subcommands/Register.java @@ -67,7 +67,6 @@ public class Register extends SubCommand { switch (nullablePlayerState) { case REGISTERED -> log.info("Registered player {} for the next round", playerToRegister.getName()); - case IN_GAME -> log.info("Player {} is already in a round", playerToRegister.getName()); case DISCONNECTED -> log.info("Player {} is disconnected (should not be possible)", playerToRegister.getName()); case SPECTATING -> log.info("Player {} is now spectating the game", playerToRegister.getName()); } @@ -83,8 +82,6 @@ public class Register extends SubCommand { switch (playerState) { case REGISTERED -> commandPlayer.sendRichMessage(Messages.REGISTER.PLAYER_REGISTERED, Placeholder.component("player", playerToRegister.name())); - case IN_GAME -> commandPlayer.sendRichMessage(Messages.REGISTER.PLAYER_ALREADY_IN_ROUND, - Placeholder.component("player", playerToRegister.name())); case DISCONNECTED -> { //should not be possible } 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 7a07c68..94f668c 100644 --- a/src/main/java/com/alttd/hunger_games/config/Messages.java +++ b/src/main/java/com/alttd/hunger_games/config/Messages.java @@ -83,7 +83,6 @@ public class Messages extends AbstractConfig { public static String FAILED_TO_REGISTER_YOU = "You were unable to join HungerGames because no HungerGames round was found"; public static String FAILED_TO_REGISTER_PLAYER = "Unable to register player "; public static String PLAYER_REGISTERED = "Registered for the game"; - public static String PLAYER_ALREADY_IN_ROUND = " is already in a round"; public static String PLAYER_SPECTATING = " is now spectating the game"; public static String SUCCESSFUL_REGISTER = "Successfully registered you for the upcoming Hunger Games round"; public static String GAME_RUNNING = "The game is currently running, you will need to spectate the current round"; @@ -93,7 +92,6 @@ public class Messages extends AbstractConfig { FAILED_TO_REGISTER_YOU = config.getString(prefix, "failed", FAILED_TO_REGISTER_YOU); FAILED_TO_REGISTER_PLAYER = config.getString(prefix, "failed-player", FAILED_TO_REGISTER_PLAYER); PLAYER_REGISTERED = config.getString(prefix, "player-registered", PLAYER_REGISTERED); - PLAYER_ALREADY_IN_ROUND = config.getString(prefix, "player-already-in-game", PLAYER_ALREADY_IN_ROUND); PLAYER_SPECTATING = config.getString(prefix, "player-spectating", PLAYER_SPECTATING); SUCCESSFUL_REGISTER = config.getString(prefix, "successful", SUCCESSFUL_REGISTER); GAME_RUNNING = config.getString(prefix, "game-running", GAME_RUNNING); diff --git a/src/main/java/com/alttd/hunger_games/data_objects/PLAYER_STATE.java b/src/main/java/com/alttd/hunger_games/data_objects/PLAYER_STATE.java index 65c3145..c90cf6f 100644 --- a/src/main/java/com/alttd/hunger_games/data_objects/PLAYER_STATE.java +++ b/src/main/java/com/alttd/hunger_games/data_objects/PLAYER_STATE.java @@ -2,7 +2,6 @@ package com.alttd.hunger_games.data_objects; public enum PLAYER_STATE { REGISTERED, - IN_GAME, DISCONNECTED, SPECTATING } diff --git a/src/main/java/com/alttd/hunger_games/services/PlayerService.java b/src/main/java/com/alttd/hunger_games/services/PlayerService.java index 6bac650..810fcd6 100644 --- a/src/main/java/com/alttd/hunger_games/services/PlayerService.java +++ b/src/main/java/com/alttd/hunger_games/services/PlayerService.java @@ -1,6 +1,7 @@ package com.alttd.hunger_games.services; import com.alttd.hunger_games.config.Messages; +import com.alttd.hunger_games.data_objects.DESTINATION; import com.alttd.hunger_games.data_objects.PLAYER_STATE; import com.alttd.hunger_games.data_objects.ROUND_STATE; import lombok.RequiredArgsConstructor; @@ -12,9 +13,20 @@ import java.util.*; @RequiredArgsConstructor public class PlayerService implements RoundListener { + private static PlayerService instance = null; + private final RoundService roundService; + private final PlayerTeleporterService playerTeleporterService; private ROUND_STATE roundState; + public static PlayerService createSingletonInstance(RoundService roundService, PlayerTeleporterService playerTeleporterService) { + if (instance != null) { + throw new IllegalStateException("PlayerService is already initialized."); + } + instance = new PlayerService(roundService, playerTeleporterService); + return instance; + } + @Override public void stateChange(ROUND_STATE roundState) { this.roundState = roundState; @@ -24,14 +36,20 @@ public class PlayerService implements RoundListener { } case COUNTDOWN -> { setNonRegisteredPlayersToSpectator(); - //TODO: teleport players to spawn location + Set players = roundService.getPlayers(PLAYER_STATE.REGISTERED); + Bukkit.getOnlinePlayers().stream() + .filter(player -> players.contains(player.getUniqueId())) + .forEach(player -> playerTeleporterService.teleportPlayer(player, DESTINATION.START_AREA)); } case FINALE -> { - //TODO: teleport players to finale location + Set players = roundService.getPlayers(PLAYER_STATE.REGISTERED); + Bukkit.getOnlinePlayers().stream() + .filter(player -> players.contains(player.getUniqueId())) + .forEach(player -> playerTeleporterService.teleportPlayer(player, DESTINATION.FINALE_AREA)); } case ENDED -> { roundService.clear(); - //TODO: teleport everyone to spawn (or spectator?) location + Bukkit.getOnlinePlayers().forEach(player -> playerTeleporterService.teleportPlayer(player, DESTINATION.START_AREA)); } } } @@ -88,7 +106,6 @@ public class PlayerService implements RoundListener { PLAYER_STATE playerState = optionalPlayerState.get(); return Optional.of(switch (playerState) { case DISCONNECTED, SPECTATING -> PLAYER_STATE.SPECTATING; - case IN_GAME -> PLAYER_STATE.IN_GAME; case REGISTERED -> PLAYER_STATE.REGISTERED; }); }