From 8718ca091875f0c1e658d86cc14ca5e51b42f206 Mon Sep 17 00:00:00 2001 From: Teriuihi Date: Sat, 8 Feb 2025 23:06:10 +0100 Subject: [PATCH] Refactor world border handling for game phases. Removed world border size from `GamePhase` and centralized configuration in `GameConfig`. Updated logic to use `WorldBorderSettings` dynamically, ensuring all phases define valid world border behavior. Adjusted related methods to improve maintainability and clarity. --- src/main/java/com/alttd/ctf/config/GameConfig.java | 1 + src/main/java/com/alttd/ctf/game/GamePhase.java | 12 +++++------- .../alttd/ctf/game/phases/ClassSelectionPhase.java | 9 +++++++++ src/main/java/com/alttd/ctf/team/TeamPlayer.java | 12 +++++++++--- 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/alttd/ctf/config/GameConfig.java b/src/main/java/com/alttd/ctf/config/GameConfig.java index 2510246..459e9b9 100644 --- a/src/main/java/com/alttd/ctf/config/GameConfig.java +++ b/src/main/java/com/alttd/ctf/config/GameConfig.java @@ -49,6 +49,7 @@ public class GameConfig extends AbstractConfig { public static class WORLD_BORDER { private static final String prefix = "world-border."; + public static final double DEFAULT_SIZE = 140; private static final HashMap GAME_PHASE_WORLD_BORDER = new HashMap<>(); public static HashMap getGAME_PHASE_WORLD_BORDER() { diff --git a/src/main/java/com/alttd/ctf/game/GamePhase.java b/src/main/java/com/alttd/ctf/game/GamePhase.java index 53da727..dae37d1 100644 --- a/src/main/java/com/alttd/ctf/game/GamePhase.java +++ b/src/main/java/com/alttd/ctf/game/GamePhase.java @@ -6,16 +6,14 @@ import net.kyori.adventure.text.minimessage.MiniMessage; @Getter public enum GamePhase { - CLASS_SELECTION(MiniMessage.miniMessage().deserialize("Class selection phase"), 25), - GATHERING(MiniMessage.miniMessage().deserialize("Gathering phase"), 50), - COMBAT(MiniMessage.miniMessage().deserialize("Combat phase"), 0), - ENDED(MiniMessage.miniMessage().deserialize("Game end phase"), 0); + CLASS_SELECTION(MiniMessage.miniMessage().deserialize("Class selection phase")), + GATHERING(MiniMessage.miniMessage().deserialize("Gathering phase")), + COMBAT(MiniMessage.miniMessage().deserialize("Combat phase")), + ENDED(MiniMessage.miniMessage().deserialize("Game end phase")); private final Component displayName; - private final double worldBorderSize; - GamePhase(Component displayName, double worldBorderSize) { + GamePhase(Component displayName) { this.displayName = displayName; - this.worldBorderSize = worldBorderSize; } } diff --git a/src/main/java/com/alttd/ctf/game/phases/ClassSelectionPhase.java b/src/main/java/com/alttd/ctf/game/phases/ClassSelectionPhase.java index 57df59a..1337abb 100644 --- a/src/main/java/com/alttd/ctf/game/phases/ClassSelectionPhase.java +++ b/src/main/java/com/alttd/ctf/game/phases/ClassSelectionPhase.java @@ -1,5 +1,6 @@ package com.alttd.ctf.game.phases; +import com.alttd.ctf.config.GameConfig; import com.alttd.ctf.flag.Flag; import com.alttd.ctf.game.GameManager; import com.alttd.ctf.game.GamePhase; @@ -9,11 +10,14 @@ import com.alttd.ctf.team.Team; import com.alttd.ctf.team.TeamColor; import com.alttd.ctf.team.TeamPlayer; import com.alttd.ctf.util.CircularIterator; +import com.github.yannicklamprecht.worldborder.api.IWorldBorder; +import com.github.yannicklamprecht.worldborder.api.Position; import com.github.yannicklamprecht.worldborder.api.WorldBorderApi; 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.Location; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; @@ -40,6 +44,11 @@ public class ClassSelectionPhase implements GamePhaseExecutor { @Override public void start(Flag flag) { + Location flagLocation = flag.getFlagLocation(); + IWorldBorder worldBorder = worldBorderApi.getWorldBorder(flagLocation.getWorld()); + worldBorder.setCenter(Position.of(flagLocation)); + worldBorder.setSize(GameConfig.WORLD_BORDER.DEFAULT_SIZE); + Bukkit.broadcast(MiniMessage.miniMessage().deserialize("Select your class with /ctf selectclass")); CircularIterator teamCircularIterator = new CircularIterator<>(gameManager.getTeams()); if (teamCircularIterator.hasNext()) { diff --git a/src/main/java/com/alttd/ctf/team/TeamPlayer.java b/src/main/java/com/alttd/ctf/team/TeamPlayer.java index ece541f..529e243 100644 --- a/src/main/java/com/alttd/ctf/team/TeamPlayer.java +++ b/src/main/java/com/alttd/ctf/team/TeamPlayer.java @@ -1,5 +1,8 @@ package com.alttd.ctf.team; +import com.alttd.ctf.config.GameConfig; +import com.alttd.ctf.config.WorldBorderSettings; +import com.alttd.ctf.config.WorldBorderType; import com.alttd.ctf.game.GamePhase; import com.alttd.ctf.game_class.GameClass; import com.alttd.ctf.game_class.GameClassRetrieval; @@ -48,12 +51,15 @@ public class TeamPlayer { } public void resetWorldBorder(Player player, WorldBorderApi worldBorderApi, GamePhase gamePhase, Location worldBorderCenter) { - double worldBorderSize = gamePhase.getWorldBorderSize(); - if (worldBorderSize <= 0) { + WorldBorderSettings worldBorderSettings = GameConfig.WORLD_BORDER.getGAME_PHASE_WORLD_BORDER().get(gamePhase); + if (worldBorderSettings == null) { + throw new IllegalStateException("All phases need to have world border settings"); + } + if (worldBorderSettings.type().equals(WorldBorderType.FLAG)) { worldBorderApi.resetWorldBorderToGlobal(player); return; } - worldBorderApi.setBorder(player, worldBorderSize, worldBorderCenter); + worldBorderApi.setBorder(player, worldBorderSettings.size(), worldBorderCenter); } @Override