From 33578027d3440a2f20900878854d9fccd536c36b Mon Sep 17 00:00:00 2001 From: Teriuihi Date: Sat, 8 Feb 2025 21:56:05 +0100 Subject: [PATCH] Refactor game class handling and fix GUI inventory usage. Simplified game class retrieval by removing redundant data structures and combining logic. Updated GUI inventory to ensure tasks are run on the main thread using Bukkit's scheduler. Improved code organization by centralizing class selection logic in `TeamPlayer`. --- src/main/java/com/alttd/ctf/Main.java | 4 ++++ .../ctf/game/phases/ClassSelectionPhase.java | 16 +--------------- .../alttd/ctf/game_class/GameClassRetrieval.java | 12 ++++++------ .../com/alttd/ctf/gui/ClassSelectionGUI.java | 8 +++++++- .../java/com/alttd/ctf/gui/GUIInventory.java | 9 ++++++--- src/main/java/com/alttd/ctf/team/TeamPlayer.java | 9 +++++++-- version.properties | 4 ++-- 7 files changed, 33 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/alttd/ctf/Main.java b/src/main/java/com/alttd/ctf/Main.java index f188758..d9011f5 100644 --- a/src/main/java/com/alttd/ctf/Main.java +++ b/src/main/java/com/alttd/ctf/Main.java @@ -11,6 +11,8 @@ import com.alttd.ctf.events.SnowballEvent; import com.alttd.ctf.flag.Flag; import com.alttd.ctf.flag.FlagTryCaptureEvent; import com.alttd.ctf.game.GameManager; +import com.alttd.ctf.gui.ClassSelectionGUI; +import com.alttd.ctf.gui.GUIInventory; import com.alttd.ctf.gui.GUIListener; import com.alttd.ctf.json_config.JacksonConfig; import com.alttd.ctf.json_config.JsonConfigManager; @@ -37,6 +39,8 @@ public class Main extends JavaPlugin { @Override public void onEnable() { + GUIInventory.setMain(this); // sorry + ClassSelectionGUI.setMain(this); // sorry Package pkg = Main.class.getPackage(); String version = pkg.getImplementationVersion(); log.info("Plugin enabled, version {}", version); 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 7c09024..57df59a 100644 --- a/src/main/java/com/alttd/ctf/game/phases/ClassSelectionPhase.java +++ b/src/main/java/com/alttd/ctf/game/phases/ClassSelectionPhase.java @@ -5,8 +5,6 @@ import com.alttd.ctf.game.GameManager; import com.alttd.ctf.game.GamePhase; import com.alttd.ctf.game.GamePhaseExecutor; import com.alttd.ctf.game_class.GameClass; -import com.alttd.ctf.game_class.GameClassRetrieval; -import com.alttd.ctf.gui.ClassSelectionGUI; import com.alttd.ctf.team.Team; import com.alttd.ctf.team.TeamColor; import com.alttd.ctf.team.TeamPlayer; @@ -19,8 +17,6 @@ import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import java.util.HashMap; -import java.util.List; import java.util.Optional; @Slf4j @@ -48,6 +44,7 @@ public class ClassSelectionPhase implements GamePhaseExecutor { CircularIterator teamCircularIterator = new CircularIterator<>(gameManager.getTeams()); if (teamCircularIterator.hasNext()) { Bukkit.getOnlinePlayers().stream() + .filter(player -> !player.hasPermission("ctf.bypass")) .filter(player -> gameManager.getTeamPlayer(player.getUniqueId()).isEmpty()) .forEach(player -> { Team team = teamCircularIterator.next(); @@ -58,17 +55,6 @@ public class ClassSelectionPhase implements GamePhaseExecutor { log.warn("No teams to add players to"); } teleportPlayersToStartingZone(); - HashMap> gameClassesForAllTeams = GameClassRetrieval.getGameClassesForAllTeams(gameManager); - Bukkit.getOnlinePlayers().forEach(player -> { - Optional optionalTeamPlayer = gameManager.getTeamPlayer(player.getUniqueId()); - if (optionalTeamPlayer.isEmpty()) { - return; - } - TeamPlayer teamPlayer = optionalTeamPlayer.get(); - List gameClasses = gameClassesForAllTeams.get(teamPlayer.getTeam().getId()); - new ClassSelectionGUI(gameClasses, teamPlayer, worldBorderApi, GamePhase.CLASS_SELECTION) - .open(player); - }); } private void teleportPlayersToStartingZone() { diff --git a/src/main/java/com/alttd/ctf/game_class/GameClassRetrieval.java b/src/main/java/com/alttd/ctf/game_class/GameClassRetrieval.java index 5e77365..6e66d2c 100644 --- a/src/main/java/com/alttd/ctf/game_class/GameClassRetrieval.java +++ b/src/main/java/com/alttd/ctf/game_class/GameClassRetrieval.java @@ -15,16 +15,16 @@ public class GameClassRetrieval { public static HashMap> getGameClassesForAllTeams(GameManager gameManager) { final HashMap> gameClasses = new HashMap<>(); gameManager.getTeams().forEach(team -> { - gameClasses.putAll(getGameClassesForTeam(team)); + gameClasses.put(team.getId(), getGameClassesForTeam(team)); }); return gameClasses; } - public static HashMap> getGameClassesForTeam(Team team) { - final HashMap> gameClasses = new HashMap<>(); - gameClasses.computeIfAbsent(team.getId(), teamId -> new ArrayList<>()).add(FighterCreator.createFighter(team.getColor())); - gameClasses.computeIfAbsent(team.getId(), teamId -> new ArrayList<>()).add(TankCreator.createTank(team.getColor())); - gameClasses.computeIfAbsent(team.getId(), teamId -> new ArrayList<>()).add(EngineerCreator.createEngineer(team.getColor())); + public static List getGameClassesForTeam(Team team) { + final List gameClasses = new ArrayList<>(); + gameClasses.add(FighterCreator.createFighter(team.getColor())); + gameClasses.add(TankCreator.createTank(team.getColor())); + gameClasses.add(EngineerCreator.createEngineer(team.getColor())); return gameClasses; } diff --git a/src/main/java/com/alttd/ctf/gui/ClassSelectionGUI.java b/src/main/java/com/alttd/ctf/gui/ClassSelectionGUI.java index b348930..db1aac4 100644 --- a/src/main/java/com/alttd/ctf/gui/ClassSelectionGUI.java +++ b/src/main/java/com/alttd/ctf/gui/ClassSelectionGUI.java @@ -1,10 +1,13 @@ package com.alttd.ctf.gui; +import com.alttd.ctf.Main; import com.alttd.ctf.game.GamePhase; import com.alttd.ctf.game_class.GameClass; import com.alttd.ctf.team.TeamPlayer; import com.github.yannicklamprecht.worldborder.api.WorldBorderApi; +import lombok.Setter; import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.Bukkit; import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.event.inventory.InventoryType; import org.jetbrains.annotations.NotNull; @@ -13,6 +16,9 @@ import java.util.List; public class ClassSelectionGUI extends GUIInventory { + @Setter + private static Main main; + public ClassSelectionGUI(@NotNull List gameClasses, @NotNull TeamPlayer teamPlayer, @NotNull WorldBorderApi worldBorderApi, @NotNull GamePhase gamePhase) { super(InventoryType.CHEST, teamPlayer.getTeam().getName().append(MiniMessage.miniMessage().deserialize(" - class selection"))); @@ -24,7 +30,7 @@ public class ClassSelectionGUI extends GUIInventory { for (GameClass gameClass : gameClasses) { setItem(pos++, gameClass.getDisplayItem(), player -> { gameClass.apply(teamPlayer, worldBorderApi, gamePhase, true); - player.closeInventory(InventoryCloseEvent.Reason.PLUGIN); + Bukkit.getScheduler().runTask(main, () -> player.closeInventory(InventoryCloseEvent.Reason.PLUGIN)); }); } } diff --git a/src/main/java/com/alttd/ctf/gui/GUIInventory.java b/src/main/java/com/alttd/ctf/gui/GUIInventory.java index 8cbab3a..964a3a7 100644 --- a/src/main/java/com/alttd/ctf/gui/GUIInventory.java +++ b/src/main/java/com/alttd/ctf/gui/GUIInventory.java @@ -1,19 +1,22 @@ package com.alttd.ctf.gui; +import com.alttd.ctf.Main; import lombok.Getter; +import lombok.Setter; import net.kyori.adventure.text.Component; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryType; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.Merchant; -import org.bukkit.inventory.MerchantInventory; import java.util.HashMap; public abstract class GUIInventory implements GUI { + @Setter + private static Main main; + @Getter protected final Inventory inventory; protected final HashMap guiActions; @@ -35,7 +38,7 @@ public abstract class GUIInventory implements GUI { } public void open(Player player) { - player.openInventory(inventory); + Bukkit.getScheduler().runTask(main, () -> player.openInventory(inventory)); GUIByUUID.put(player.getUniqueId(), this); } diff --git a/src/main/java/com/alttd/ctf/team/TeamPlayer.java b/src/main/java/com/alttd/ctf/team/TeamPlayer.java index ac5fc0b..ece541f 100644 --- a/src/main/java/com/alttd/ctf/team/TeamPlayer.java +++ b/src/main/java/com/alttd/ctf/team/TeamPlayer.java @@ -2,6 +2,8 @@ package com.alttd.ctf.team; import com.alttd.ctf.game.GamePhase; import com.alttd.ctf.game_class.GameClass; +import com.alttd.ctf.game_class.GameClassRetrieval; +import com.alttd.ctf.gui.ClassSelectionGUI; import com.github.yannicklamprecht.worldborder.api.WorldBorderApi; import lombok.Getter; import lombok.Setter; @@ -10,8 +12,7 @@ import org.bukkit.Location; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import java.util.Objects; -import java.util.UUID; +import java.util.*; @Slf4j @Getter @@ -34,6 +35,10 @@ public class TeamPlayer { public void respawn(Player player, WorldBorderApi worldBorderApi, GamePhase gamePhase, boolean teleport) { Location spawnLocation = team.getSpawnLocation(); Location worldBorderCenter = team.getWorldBorderCenter(); + + List gameClasses = GameClassRetrieval.getGameClassesForTeam(team); + new ClassSelectionGUI(gameClasses, this, worldBorderApi, GamePhase.CLASS_SELECTION).open(player); + if (!teleport) { resetWorldBorder(player, worldBorderApi, gamePhase, worldBorderCenter); return; diff --git a/version.properties b/version.properties index 170972b..f9b3742 100644 --- a/version.properties +++ b/version.properties @@ -1,3 +1,3 @@ -#Sat Feb 08 21:02:07 CET 2025 -buildNumber=19 +#Sat Feb 08 21:33:29 CET 2025 +buildNumber=29 version=0.1