diff --git a/src/main/java/xyz/twovb/sgm/games/GameManager.java b/src/main/java/xyz/twovb/sgm/games/GameManager.java index 27f4e5f..10b8f7a 100644 --- a/src/main/java/xyz/twovb/sgm/games/GameManager.java +++ b/src/main/java/xyz/twovb/sgm/games/GameManager.java @@ -61,20 +61,16 @@ public class GameManager { } } -// public void initGame(Minigame game, CommandSender owner, String level) { -// try { -// game.init(owner, level); -// } catch (IOException e) { -// SGM.getInstance().getCLogger().error(e.getMessage()); -// owner.sendMessage(ChatUtils.translate(PlaceholderManager.setPlaceholders(SGM.getInstance().getMessages().getString("sgm.game.cant-start"), owner))); -// } -// activeGames.put(game.getGameId(), game); -// } - public void addPlayerToGame(Player player, UUID gameId) { Minigame game = findGame(gameId); - if (game.getState() == Minigame.GameState.READY && !game.getPlayers().contains(player) && !isInGame(player)) { + if (game.getState() == Minigame.GameState.READY && !game.getPlayers().contains(player)) { + if (isInGame(player)) { + findGame(player).removePlayer(player); + } game.addPlayer(player); + } else { + + SGM.getInstance().getCLogger().log(game.getState().toString()); } } diff --git a/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/CTB.java b/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/CTB.java index dbb09cc..025d491 100644 --- a/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/CTB.java +++ b/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/CTB.java @@ -44,13 +44,14 @@ import xyz.twovb.toolbox.utils.ChatUtils; import java.io.File; import java.io.IOException; +import java.text.SimpleDateFormat; import java.util.*; public class CTB implements Minigame { final static String name = "CaptureTheBrick"; private final UUID uuid; - private final List players; + private ArrayList players = new ArrayList(); private final ArrayList redBrickSpawns = new ArrayList(); private final ArrayList blueBrickSpawns = new ArrayList(); private final ArrayList redSpawnArea = new ArrayList(); @@ -67,20 +68,14 @@ public class CTB implements Minigame { private ScoreboardTeam blueTeam; private Sidebar sb; private SidebarAnimation titleAnimation; - // private @NotNull SidebarComponent title; private ComponentSidebarLayout layout; + private CommandSender owner; private int taskId; -// private List redTeam = new ArrayList(); -// private List blueTeam = new ArrayList(); -// private Sidebar sb; - - public CTB() { this.uuid = UUID.randomUUID(); this.state = GameState.PRESTART; - this.players = new ArrayList<>(); this.messages = SGM.getInstance().getConfigManager().loadConfig("games/" + name.toLowerCase() + "/messages.yml"); } @@ -89,6 +84,7 @@ public class CTB implements Minigame { gameWorld = createGameWorld(world, uuid); gameWorld.setAutoSave(false); if (applyOptions(world)) { + this.owner = owner; teamManager = SGM.getInstance().getScoreboardLibrary().createTeamManager(); this.redTeam = teamManager.createIfAbsent("red_team"); this.blueTeam = teamManager.createIfAbsent("blue_team"); @@ -101,12 +97,21 @@ public class CTB implements Minigame { this.titleAnimation = createGradientAnimation(Component.text("Capture The Brick", Style.style(TextDecoration.BOLD))); var title = SidebarComponent.animatedLine(titleAnimation); - SidebarComponent gameInfo = SidebarComponent.builder().addDynamicLine(() -> Component.text("Players Alive: " + getAlivePlayersCount(), NamedTextColor.YELLOW)).addDynamicLine(() -> Component.text("Red Team: " + getTeamSize(redTeam), NamedTextColor.RED)).addDynamicLine(() -> Component.text("Blue Team: " + getTeamSize(blueTeam), NamedTextColor.BLUE)).addDynamicLine(() -> Component.text("Bricks Remaining: " + bricks, NamedTextColor.GREEN)).build(); + SimpleDateFormat dtf = new SimpleDateFormat("dd/MM/yy | HH:mm:ss"); + + SidebarComponent gameInfo = SidebarComponent.builder() + .addDynamicLine(() -> { + var time = dtf.format(new Date()); + return Component.text(time, NamedTextColor.DARK_GRAY); + }) + .addBlankLine() + .addDynamicLine(() -> Component.text("Red Team: " + getBrickCount(redTeam), NamedTextColor.RED)) + .addDynamicLine(() -> Component.text("Blue Team: " + getBrickCount(blueTeam), NamedTextColor.BLUE)) + .build(); this.layout = new ComponentSidebarLayout(title, gameInfo); layout.apply(sb); -// buildScoreboard(); // Ready state = GameState.READY; owner.sendMessage(ChatUtils.translate(messages.getString("system.game.ready").replace("%game%", name))); @@ -116,37 +121,199 @@ public class CTB implements Minigame { } } + private String getBrickCount(ScoreboardTeam team) { + String icon = "\uD83E\uDDF1"; + return icon; + } + + @Override + public void start() { + if (checkStart()) { + state = GameState.STARTED; + sendMessageToAllPlayers("The game has started!"); + for (Player player : players) { + player.teleport(this.spawnLoc); + sb.addPlayer(player); + } + for (int i = 0; i <= bricks; i++) { + for (Location brickLoc : redBrickSpawns) { + placeBrick(brickLoc, redTeam); + } + for (Location brickLoc : blueBrickSpawns) { + placeBrick(brickLoc, blueTeam); + } + } + BukkitTask task = Bukkit.getScheduler().runTaskTimer(SGM.getInstance(), this::onTick, 0L, 1L); + this.taskId = task.getTaskId(); + } + } + + // Check if we should be starting rn + private boolean checkStart() { + if (state != GameState.READY) return false; + for (Player player : players) { + if (!redTeam.teamManager().players().contains(player) && !blueTeam.teamManager().players().contains(player)) { + this.owner.sendMessage("All players need to be on a team!"); + return false; + } + } + return true; + } + + @Override + public void stop() { + // TODO: make it wait before unloading world + // Stop game logic + state = GameState.ENDING; + Player winner; + if (players.size() <= 1) { + winner = players.get(0); + winner.sendMessage("Congratulations on winning the game!"); + } + players.clear(); // Clear player list + GameManager.getActiveGames().remove(uuid); + HandlerList.unregisterAll(this); + for (Player player : gameWorld.getPlayers()) { + player.teleport(Bukkit.getServer().getWorlds().get(0).getSpawnLocation()); + } + Bukkit.unloadWorld(gameWorld, false); + if (teamManager != null) { + teamManager.close(); + } + if (sb != null) { + sb.close(); + } + Bukkit.getScheduler().cancelTask(this.taskId); + } + + @Override + public void onTick() { + for (Player player : gameWorld.getPlayers()) { + if (!players.contains(player)) { + sendMessageToAllPlayers(player.getName() + " IS A IMPOSTER"); + } + } + if (state == GameState.STARTED && players.size() <= 1) { + this.stop(); + } + try { + titleAnimation.nextFrame(); + layout.apply(sb); + } catch (IllegalStateException ignored) { + } + } + + @Override + public void addPlayer(Player player) { + player.teleport(this.spawnLoc); + players.add(player); + sendMessageToAllPlayers(messages.getString("system.player.join").replace("%player%", player.getName())); + } + + @Override + public void removePlayer(Player player) { + players.remove(player); + sb.removePlayer(player); + sendMessageToAllPlayers(messages.getString("system.player.left").replace("%player%", player.getName())); + } + + @EventHandler + void onPlayerQuit(PlayerQuitEvent event) { + Player player = event.getPlayer(); + if (players.contains(player)) { + removePlayer(event.getPlayer()); + } + } + + @EventHandler + void onWorldChange(PlayerChangedWorldEvent event) { + Player player = event.getPlayer(); + if (players.contains(player) && event.getFrom().equals(gameWorld)) { + removePlayer(event.getPlayer()); + } + } + + @EventHandler + void onPlayerDeath(PlayerDeathEvent event) { + Player player = event.getPlayer(); + if (players.contains(player) && state == GameState.STARTED) { + sendMessageToAllPlayers(player.getName() + " was eliminated!"); + event.setDeathMessage(""); + removePlayer(player); + } + } + + @Override + public List getPlayers() { + return players; + } + + @Override + public String getName() { + return name; + } + + @Override + public UUID getGameId() { + return uuid; + } + + @Override + public GameState getState() { + return state; + } + + @Override + public World getWorld() { + return gameWorld; + } + + + public void addPlayerToTeam(Player player, boolean isRedTeam) { + //TODO: make this shit fuckin better bor + if (isRedTeam) { + redTeam.defaultDisplay().addEntry(player.getName()); + } else { + blueTeam.defaultDisplay().addEntry(player.getName()); + } + teamManager.addPlayer(player); + } + + public void removePlayerFromTeams(Player player) { + redTeam.defaultDisplay().removeEntry(player.getName()); + blueTeam.defaultDisplay().removeEntry(player.getName()); + teamManager.removePlayer(player); + } + + private void placeBrick(Location location, ScoreboardTeam team) { + Block brick = location.getBlock(); + if (team.equals(redTeam)) { + brick.setType(Material.RED_WOOL); + } + if (team.equals(blueTeam)) { + brick.setType(Material.BLUE_WOOL); + } + SGM.getInstance().getCLogger().log("Placed " + brick.getType() + " at " + location); + } + private void setupTeamDisplay(ScoreboardTeam team, String displayName, NamedTextColor color) { TeamDisplay display = team.defaultDisplay(); display.displayName(Component.text(displayName)); display.playerColor(color); } -// private void buildScoreboard() { -// titleAnimation = createGradientAnimation(Component.text("Capture The Brick", Style.style(TextDecoration.BOLD))); -// title = SidebarComponent.animatedLine(titleAnimation); -// SidebarComponent lines = SidebarComponent.builder().addDynamicLine(() -> Component.text("Red Team: " + redTeam.teamManager().players().size(), NamedTextColor.RED)).addDynamicLine(() -> Component.text("Blue Team: " + blueTeam.teamManager().players().size(), NamedTextColor.BLUE)).addDynamicLine(() -> Component.text("Bricks Remaining: " + bricks, NamedTextColor.GREEN)).build(); -// layout = new ComponentSidebarLayout(title, lines); -// layout.apply(sb); -// } - private @NotNull SidebarAnimation createGradientAnimation(@NotNull Component text) { float step = 1f / 8f; TagResolver.Single textPlaceholder = Placeholder.component("text", text); List frames = new ArrayList<>((int) (2f / step)); float phase = -1f; - SGM.getInstance().getCLogger().log("Creating gradient animation"); - while (phase <= 1) { - String gradientTag = String.format("", phase); + String gradientTag = String.format("", phase); Component frame = MiniMessage.miniMessage().deserialize(gradientTag + "", textPlaceholder); frames.add(frame); - SGM.getInstance().getCLogger().log("Phase: " + phase + ", Tag: " + gradientTag); phase += step; } - - SGM.getInstance().getCLogger().log("Total frames: " + frames.size()); return new CollectionSidebarAnimation<>(frames); } @@ -225,170 +392,4 @@ public class CTB implements Minigame { return true; } - @Override - public void start() { - if (state == GameState.READY) { - state = GameState.STARTED; - sendMessageToAllPlayers("The game has started!"); - for (Player player : players) { - player.teleport(this.spawnLoc); - sb.addPlayer(player); - } - for (int i = 0; i <= bricks; i++) { - for (Location brickLoc : redBrickSpawns) { - placeBrick(brickLoc, "red"); - } - for (Location brickLoc : blueBrickSpawns) { - placeBrick(brickLoc, "blue"); - } - } - BukkitTask task = Bukkit.getScheduler().runTaskTimer(SGM.getInstance(), this::onTick, 0L, 1L); - this.taskId = task.getTaskId(); - } - } - - public void addPlayerToTeam(Player player, boolean isRedTeam) { - //TODO: make this shit fuckin better bor - if (isRedTeam) { - redTeam.defaultDisplay().addEntry(player.getName()); - } else { - blueTeam.defaultDisplay().addEntry(player.getName()); - } - teamManager.addPlayer(player); - } - - public void removePlayerFromTeams(Player player) { - redTeam.defaultDisplay().removeEntry(player.getName()); - blueTeam.defaultDisplay().removeEntry(player.getName()); - teamManager.removePlayer(player); - } - - public int getAlivePlayersCount() { - return (int) players.stream().filter(Player::isOnline).count(); - } - - public int getTeamSize(ScoreboardTeam team) { - return team.defaultDisplay().entries().size(); - } - - private void placeBrick(Location location, String team) { - Block brick = location.getBlock(); - if (Objects.equals(team, "red")) { - brick.setType(Material.RED_WOOL); - } - if (Objects.equals(team, "blue")) { - brick.setType(Material.BLUE_WOOL); - } - SGM.getInstance().getCLogger().log("Placed " + brick.getType() + " at " + location); - } - - @Override - public void stop() { - // TODO: make it wait before unloading world - // Stop game logic - state = GameState.ENDING; - Player winner; - if (players.size() <= 1) { - winner = players.get(0); - winner.sendMessage("Congratulations on winning the game!"); - } - players.clear(); // Clear player list - GameManager.getActiveGames().remove(uuid); - HandlerList.unregisterAll(this); - for (Player player : gameWorld.getPlayers()) { - player.teleport(Bukkit.getServer().getWorlds().get(0).getSpawnLocation()); - } - Bukkit.unloadWorld(gameWorld, false); - if (teamManager != null) { - teamManager.close(); - } - if (sb != null) { - sb.close(); - } - Bukkit.getScheduler().cancelTask(this.taskId); - } - - @Override - public void addPlayer(Player player) { - players.add(player); -// sb.addPlayer(player); - player.teleport(this.spawnLoc); - sendMessageToAllPlayers(messages.getString("system.player.join").replace("%player%", player.getName())); - } - - @Override - public void removePlayer(Player player) { - players.remove(player); - sb.removePlayer(player); - sendMessageToAllPlayers(messages.getString("system.player.left").replace("%player%", player.getName())); - } - - @EventHandler - void onPlayerQuit(PlayerQuitEvent event) { - Player player = event.getPlayer(); - if (players.contains(player)) { - removePlayer(event.getPlayer()); - } - } - - @EventHandler - void onWorldChange(PlayerChangedWorldEvent event) { - Player player = event.getPlayer(); - if (players.contains(player)) { - removePlayer(event.getPlayer()); - } - } - - @EventHandler - void onPlayerDeath(PlayerDeathEvent event) { - Player player = event.getPlayer(); - if (players.contains(player) && state == GameState.STARTED) { - sendMessageToAllPlayers(player.getName() + " was eliminated!"); - event.setDeathMessage(""); - removePlayer(player); - } - } - - @Override - public List getPlayers() { - return players; - } - - @Override - public String getName() { - return name; - } - - @Override - public UUID getGameId() { - return uuid; - } - - @Override - public GameState getState() { - return state; - } - - @Override - public World getWorld() { - return gameWorld; - } - - @Override - public void onTick() { - for (Player player : gameWorld.getPlayers()) { - if (!players.contains(player)) { - sendMessageToAllPlayers(player.getName() + " IS A IMPOSTER"); - } - } - if (state == GameState.STARTED && players.size() <= 1) { - this.stop(); - } - try { - titleAnimation.nextFrame(); - layout.apply(sb); - } catch (IllegalStateException ignored) { - } - } - } \ No newline at end of file diff --git a/src/main/java/xyz/twovb/sgm/guis/ActiveGamesGui.java b/src/main/java/xyz/twovb/sgm/guis/ActiveGamesGui.java index 9ca01f8..1e80bba 100644 --- a/src/main/java/xyz/twovb/sgm/guis/ActiveGamesGui.java +++ b/src/main/java/xyz/twovb/sgm/guis/ActiveGamesGui.java @@ -61,46 +61,41 @@ public class ActiveGamesGui { } public void addMaps() { - for (Minigame game : GameManager.getActiveGames().values()) { -// SGM.getInstance().getCLogger().log(game.getName()); -// SGM.getInstance().getCLogger().log(this.game); - Material itemType; - switch (game.getState()) { - case PRESTART: -// mapItem.setType(Material.YELLOW_WOOL); - itemType = Material.YELLOW_WOOL; - break; - case READY: -// mapItem.setType(Material.LIME_WOOL); - itemType = Material.LIME_WOOL; - break; - case STARTED: - case ENDING: - default: -// mapItem.setType(Material.RED_WOOL); - itemType = Material.RED_WOOL; - break; - } - ItemStack joinItem = new ItemStack(itemType); - ItemMeta meta = joinItem.getItemMeta(); - meta.displayName(ChatUtils.translate(game.getName())); - List lore = new ArrayList(); - lore.add(0, ChatUtils.translate("&r&7" + game.getGameId().toString())); - if (!game.getPlayers().isEmpty()) { - lore.add(ChatUtils.translate("&r&7Players:")); - for (Player player : game.getPlayers()) { - lore.add(ChatUtils.translate("&r&a" + player.getName())); + for (Minigame minigame : GameManager.getActiveGames().values()) { + if (minigame.getName().equalsIgnoreCase(game)) { + Material itemType; + switch (minigame.getState()) { + case PRESTART: + itemType = Material.YELLOW_WOOL; + break; + case READY: + itemType = Material.LIME_WOOL; + break; + case STARTED: + case ENDING: + default: + itemType = Material.RED_WOOL; + break; } - } - meta.lore(lore); - joinItem.setItemMeta(meta); - mapPane.addItem(new GuiItem(joinItem, event -> { - Player player = (Player) event.getWhoClicked(); - if (game.getState() == Minigame.GameState.READY) { - SGM.getInstance().getGameManager().addPlayerToGame(player, game.getGameId()); + ItemStack joinItem = new ItemStack(itemType); + ItemMeta meta = joinItem.getItemMeta(); + meta.displayName(ChatUtils.translate(minigame.getName())); + List lore = new ArrayList(); + lore.add(0, ChatUtils.translate("&r&7" + minigame.getGameId().toString())); + if (!minigame.getPlayers().isEmpty()) { + lore.add(ChatUtils.translate("&r&7Players:")); + for (Player player : minigame.getPlayers()) { + lore.add(ChatUtils.translate("&r&a" + player.getName())); + } } - player.closeInventory(); - })); + meta.lore(lore); + joinItem.setItemMeta(meta); + mapPane.addItem(new GuiItem(joinItem, event -> { + Player player = (Player) event.getWhoClicked(); + SGM.getInstance().getGameManager().addPlayerToGame(player, minigame.getGameId()); + player.closeInventory(); + })); + } } } } diff --git a/src/main/java/xyz/twovb/sgm/guis/JoinGameGui.java b/src/main/java/xyz/twovb/sgm/guis/JoinGameGui.java index 30b8bf9..dc15fa3 100644 --- a/src/main/java/xyz/twovb/sgm/guis/JoinGameGui.java +++ b/src/main/java/xyz/twovb/sgm/guis/JoinGameGui.java @@ -1,6 +1,5 @@ package xyz.twovb.sgm.guis; - /* * Created by 2vb - 5/7/2024 */ @@ -48,7 +47,7 @@ public class JoinGameGui { String itemName = event.getCurrentItem().getItemMeta().getDisplayName().replaceAll("\\W+", ""); player.closeInventory(); if (SGM.getInstance().getGameManager().getRegisteredGames().contains(itemName.toLowerCase())) { - new ActiveGamesGui(itemName).getGui().show(player); + new ActiveGamesGui(itemName.toLowerCase()).getGui().show(player); } else { player.sendMessage("Please check xml"); }