From cf011ae72f74e1bbc62138eb8eb6d629b1b2b27b Mon Sep 17 00:00:00 2001 From: akastijn Date: Mon, 15 Jun 2026 23:17:47 +0200 Subject: [PATCH] Add winner declaration message and endRound logic with proper message broadcasting and error handling --- .../java/com/alttd/hunger_games/Main.java | 5 +++-- .../alttd/hunger_games/config/Messages.java | 2 ++ .../alttd/hunger_games/services/Round.java | 5 +++++ .../hunger_games/services/RoundService.java | 20 ++++++++++++++++--- 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/alttd/hunger_games/Main.java b/src/main/java/com/alttd/hunger_games/Main.java index c1ef04b..f16f265 100644 --- a/src/main/java/com/alttd/hunger_games/Main.java +++ b/src/main/java/com/alttd/hunger_games/Main.java @@ -12,6 +12,7 @@ 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 com.alttd.hunger_games.services.StatService; import lombok.extern.slf4j.Slf4j; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; @@ -39,9 +40,9 @@ public final class Main extends JavaPlugin { private void registerServices() { round = Round.createSingletonInstance(); lootService = new LootService(); - roundService = RoundService.createSingletonInstance(round, this, lootService); - playerTeleporterService = PlayerTeleporterService.createSingletonInstance(); statService = new StatService(this, round); + roundService = RoundService.createSingletonInstance(round, this, lootService, statService); + playerTeleporterService = PlayerTeleporterService.createSingletonInstance(); playerService = PlayerService.createSingletonInstance(round, roundService, playerTeleporterService); } 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 31ffc2d..3f6142d 100644 --- a/src/main/java/com/alttd/hunger_games/config/Messages.java +++ b/src/main/java/com/alttd/hunger_games/config/Messages.java @@ -81,6 +81,7 @@ public class Messages extends AbstractConfig { public static String STARTED = "The Hunger Games has begun! Good luck!"; public static String BORDER_SHRINK = "The border is shrinking to blocks!"; public static String CHEST_EMPTY = "This chest is empty!"; + public static String WINNER = " has won the Hunger Games!"; @SuppressWarnings("unused") private static void load() { @@ -88,6 +89,7 @@ public class Messages extends AbstractConfig { STARTED = config.getString(prefix, "started", STARTED); BORDER_SHRINK = config.getString(prefix, "border-shrink", BORDER_SHRINK); CHEST_EMPTY = config.getString(prefix, "chest-empty", CHEST_EMPTY); + WINNER = config.getString(prefix, "winner", WINNER); } } 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 c41bc94..97d392d 100644 --- a/src/main/java/com/alttd/hunger_games/services/Round.java +++ b/src/main/java/com/alttd/hunger_games/services/Round.java @@ -46,6 +46,11 @@ public class Round { listeners.forEach(roundListener -> roundListener.stateChange(roundState)); } + public void endRound() { + roundState = ROUND_STATE.ENDED; + listeners.forEach(roundListener -> roundListener.stateChange(roundState)); + } + private void nextStage() { Optional optionalNextRoundState = roundState.next(); if (optionalNextRoundState.isEmpty()) { diff --git a/src/main/java/com/alttd/hunger_games/services/RoundService.java b/src/main/java/com/alttd/hunger_games/services/RoundService.java index 7feb057..39b75fe 100644 --- a/src/main/java/com/alttd/hunger_games/services/RoundService.java +++ b/src/main/java/com/alttd/hunger_games/services/RoundService.java @@ -1,11 +1,14 @@ package com.alttd.hunger_games.services; import com.alttd.hunger_games.Main; +import com.alttd.hunger_games.config.Messages; import com.alttd.hunger_games.data_objects.PLAYER_STATE; import com.alttd.hunger_games.data_objects.ROUND_STATE; import com.alttd.hunger_games.event_listeners.PlayerMovementListener; -import com.alttd.hunger_games.services.StatService; import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; @@ -13,6 +16,7 @@ import org.bukkit.event.HandlerList; import java.util.*; import java.util.stream.Collectors; +@Slf4j public class RoundService implements RoundListener { private static RoundService instance = null; @@ -25,6 +29,8 @@ public class RoundService implements RoundListener { private ROUND_STATE roundState; private final HashMap players = new HashMap<>(); + private final Round round; + public static RoundService createSingletonInstance(Round round, Main main, LootService lootService, StatService statService) { if (instance != null) { throw new IllegalStateException("RoundService is already initialized."); @@ -34,6 +40,7 @@ public class RoundService implements RoundListener { } private RoundService(Round round, Main main, LootService lootService, StatService statService) { + this.round = round; this.roundState = round.register(this); this.main = main; this.lootService = lootService; @@ -66,10 +73,17 @@ public class RoundService implements RoundListener { private void declareWinner(UUID winnerUUID) { Player player = Bukkit.getPlayer(winnerUUID); + if (player == null) { + log.error("Winner {} not found", winnerUUID); + Bukkit.broadcast(MiniMessage.miniMessage().deserialize("Winner not found")); + return; + } + statService.setPlacement(winnerUUID, 1); statService.setWon(winnerUUID, true); - //TODO message - //TODO reset round + + Bukkit.broadcast(MiniMessage.miniMessage().deserialize(Messages.GAME.WINNER, Placeholder.component("player", player.name()))); + round.endRound(); } protected void clear() {