From ab94e7f557ac24de2df5be0dac00f866e9a20b5c Mon Sep 17 00:00:00 2001 From: 2vb <2vb@protonmail.com> Date: Thu, 4 Jul 2024 19:57:48 -0700 Subject: [PATCH 1/5] Dedicated messages file. --- .../java/xyz/twovb/sgm/games/Minigame.java | 3 ++- .../sgm/games/impl/capturethebrick/CTB.java | 26 ++++++++----------- .../xyz/twovb/sgm/levels/LevelManager.java | 1 + .../games/capturethebrick/messages.yml | 7 +++++ src/main/resources/messages.yml | 2 -- 5 files changed, 21 insertions(+), 18 deletions(-) create mode 100644 src/main/resources/games/capturethebrick/messages.yml diff --git a/src/main/java/xyz/twovb/sgm/games/Minigame.java b/src/main/java/xyz/twovb/sgm/games/Minigame.java index 3359636..d4b6cf4 100644 --- a/src/main/java/xyz/twovb/sgm/games/Minigame.java +++ b/src/main/java/xyz/twovb/sgm/games/Minigame.java @@ -9,7 +9,7 @@ import org.bukkit.NamespacedKey; import org.bukkit.World; import org.bukkit.WorldCreator; import org.bukkit.command.CommandSender; -import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; import org.bukkit.event.Listener; import xyz.twovb.sgm.SGM; @@ -63,6 +63,7 @@ public interface Minigame extends Listener { } } + enum GameState { PRESTART, READY, STARTED, ENDING } 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 cf4db34..3a0a2a5 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 @@ -11,6 +11,7 @@ import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.command.CommandSender; import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -21,6 +22,7 @@ import xyz.twovb.sgm.SGM; import xyz.twovb.sgm.games.GameManager; import xyz.twovb.sgm.games.Minigame; import xyz.twovb.sgm.levels.LevelManager; +import xyz.twovb.toolbox.utils.ChatUtils; import java.io.File; import java.io.IOException; @@ -31,6 +33,8 @@ public class CTB implements Minigame { final static String name = "CaptureTheBrick"; private final UUID uuid; private final List players; + private List redTeam; + private List blueTeam; private final ArrayList redBrickSpawns = new ArrayList(); private final ArrayList blueBrickSpawns = new ArrayList(); private final ArrayList redSpawnArea = new ArrayList(); @@ -41,12 +45,14 @@ public class CTB implements Minigame { private int territoryLevel; private int boundsLevel; private Location spawnLoc; + private FileConfiguration messages; 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"); } public void init(CommandSender owner, String world) throws IOException { @@ -56,12 +62,11 @@ public class CTB implements Minigame { if (applyOptions(world)) { Bukkit.getPluginManager().registerEvents(this, SGM.getInstance()); state = GameState.READY; - owner.sendMessage("A new " + name + " instance with ID " + uuid + " has been created and is now ready!"); + owner.sendMessage(ChatUtils.translate(messages.getString("system.game.ready").replace("%game%", name))); } else { - owner.sendMessage("a"); -// owner.sendMessage(ChatUtils.translate(SGM.getInstance().getMessages().getString("sgm.game.cant-start"))); + owner.sendMessage(ChatUtils.translate(messages.getString("system.game.failed").replace("%cause%", "to load options."))); + Bukkit.getServer().unloadWorld(gameWorld, false); } - } private Location parseString(String string) { @@ -172,6 +177,7 @@ public class CTB implements Minigame { @Override public void stop() { + // TODO: make it wait before unloading world // Stop game logic state = GameState.ENDING; Player winner; @@ -192,7 +198,7 @@ public class CTB implements Minigame { public void addPlayer(Player player) { players.add(player); player.teleport(this.spawnLoc); - sendMessageToAllPlayers(player.getName() + " has joined the game!"); + sendMessageToAllPlayers(messages.getString("system.player.join").replace("%player%", player.getName())); } @Override @@ -238,16 +244,6 @@ public class CTB implements Minigame { return state; } -// @EventHandler -// void onPlayerMove(PlayerMoveEvent event) { -// Player player = event.getPlayer(); -// CustomPlayer cPlayer = new CustomPlayer(player); -// cPlayer.sendMessage("move"); -// if (event.getFrom().getX() != event.getTo().getX() || event.getFrom().getZ() != event.getTo().getZ()) { -// cPlayer.sendMessage("move full block"); -// } -// } - @Override public void onTick() { if (state == GameState.STARTED && players.size() <= 1) { diff --git a/src/main/java/xyz/twovb/sgm/levels/LevelManager.java b/src/main/java/xyz/twovb/sgm/levels/LevelManager.java index 33d39b3..1eb845b 100644 --- a/src/main/java/xyz/twovb/sgm/levels/LevelManager.java +++ b/src/main/java/xyz/twovb/sgm/levels/LevelManager.java @@ -130,6 +130,7 @@ public class LevelManager { // This is probably gonna be funny later player.teleport(Bukkit.getServer().getWorlds().get(0).getSpawnLocation()); } + // TODO: make better if (!Bukkit.isTickingWorlds() && Bukkit.getServer().unloadWorld(world, true)) { if (mapDir.exists()) { FileUtils.deleteDirectory(mapDir); diff --git a/src/main/resources/games/capturethebrick/messages.yml b/src/main/resources/games/capturethebrick/messages.yml new file mode 100644 index 0000000..0a60f14 --- /dev/null +++ b/src/main/resources/games/capturethebrick/messages.yml @@ -0,0 +1,7 @@ +system: + game: + ready: "&7A new %game% game has started and can now be joined!" + failed: "&7%game% failed %cause%" + player: + join: "&7%player% has joined the game!" + left: "&7%player% has left the game." diff --git a/src/main/resources/messages.yml b/src/main/resources/messages.yml index 5c8ec1c..e4375e9 100644 --- a/src/main/resources/messages.yml +++ b/src/main/resources/messages.yml @@ -16,8 +16,6 @@ sgm: cant-start: "&7Game couldn't be started!" cant-join: "&7Could not join this game!" started: "&7Game has started!" - joined: "&7%player% has joined the game!" - left: "&7%player% has left the game." win: "&7Congratulations to %winner% for winning!" level: new: "&7A level with the name %level% has been created." From 9938367f72b86ba2f2ace857b43c290f7247f2de Mon Sep 17 00:00:00 2001 From: 2vb <2vb@protonmail.com> Date: Thu, 4 Jul 2024 22:51:31 -0700 Subject: [PATCH 2/5] Guis --- pom.xml | 11 ++- src/main/java/xyz/twovb/sgm/SGM.java | 7 +- .../twovb/sgm/commands/impl/GameCommand.java | 14 +++- .../java/xyz/twovb/sgm/guis/InitGameGui.java | 55 +++++++++++++ src/main/java/xyz/twovb/sgm/guis/MapGui.java | 77 +++++++++++++++++++ .../xyz/twovb/sgm/levels/LevelManager.java | 6 ++ src/main/resources/guis/initgame.xml | 19 +++++ src/main/resources/guis/mapgui.xml | 9 +++ 8 files changed, 194 insertions(+), 4 deletions(-) create mode 100644 src/main/java/xyz/twovb/sgm/guis/InitGameGui.java create mode 100644 src/main/java/xyz/twovb/sgm/guis/MapGui.java create mode 100644 src/main/resources/guis/initgame.xml create mode 100644 src/main/resources/guis/mapgui.xml diff --git a/pom.xml b/pom.xml index 0ce1bf7..34d32e6 100644 --- a/pom.xml +++ b/pom.xml @@ -67,11 +67,16 @@ + ${project.build.directory}/dependency-reduced-pom.xml xyz.twovb.toolbox ${project.groupId}.${project.artifactId}.toolbox + + com.github.stefvanschie.inventoryframework + ${project.groupId}.${project.artifactId}.inventoryframework + @@ -159,7 +164,11 @@ commons-io 2.16.1 - + + com.github.stefvanschie.inventoryframework + IF + 0.10.15 + diff --git a/src/main/java/xyz/twovb/sgm/SGM.java b/src/main/java/xyz/twovb/sgm/SGM.java index c07d7d6..b2b21cc 100644 --- a/src/main/java/xyz/twovb/sgm/SGM.java +++ b/src/main/java/xyz/twovb/sgm/SGM.java @@ -40,7 +40,6 @@ public final class SGM extends JavaPlugin { @Getter private LevelManager levelManager; - @Override public void onEnable() { instance = this; @@ -55,12 +54,18 @@ public final class SGM extends JavaPlugin { BuildInfo.load(Objects.requireNonNull(this.getTextResource("build-info.yml"))); } catch (IOException | InvalidConfigurationException ignored) { } + loadGuis(); registerCommands(); registerGames(); registerPlaceholders(); levelManager.loadLevels(); } + private void loadGuis() { + saveResource("guis/initgame.xml", false); + saveResource("guis/mapgui.xml", false); + } + private void registerPlaceholders() { PlaceholderManager pm = new PlaceholderManager(); pm.registerPlaceholder("%commit.id%", BuildInfo.getString("commit.id")); diff --git a/src/main/java/xyz/twovb/sgm/commands/impl/GameCommand.java b/src/main/java/xyz/twovb/sgm/commands/impl/GameCommand.java index d9a9b60..15af353 100644 --- a/src/main/java/xyz/twovb/sgm/commands/impl/GameCommand.java +++ b/src/main/java/xyz/twovb/sgm/commands/impl/GameCommand.java @@ -4,6 +4,7 @@ package xyz.twovb.sgm.commands.impl; * Created by 2vb - 2/7/2024 */ +import com.github.stefvanschie.inventoryframework.gui.type.ChestGui; import dev.rollczi.litecommands.annotations.argument.Arg; import dev.rollczi.litecommands.annotations.command.Command; import dev.rollczi.litecommands.annotations.context.Context; @@ -11,13 +12,16 @@ import dev.rollczi.litecommands.annotations.execute.Execute; import dev.rollczi.litecommands.annotations.permission.Permission; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; import xyz.twovb.sgm.SGM; import xyz.twovb.sgm.games.Minigame; import xyz.twovb.sgm.games.impl.TestGame; import xyz.twovb.sgm.games.impl.capturethebrick.CTB; +import xyz.twovb.sgm.guis.InitGameGui; import xyz.twovb.toolbox.api.CustomPlayer; import xyz.twovb.toolbox.utils.ChatUtils; +import java.util.Optional; import java.util.UUID; @Command(name = "game") @@ -40,9 +44,10 @@ public class GameCommand { @Execute(name = "init") @Permission("sgm.games.init") - void init(@Context Player player, @Arg("name") String name) { + void init(@Context Player player, @Arg("name") Optional map) { CustomPlayer cPlayer = new CustomPlayer(player); - SGM.getInstance().getGameManager().initGame(new CTB(), player, name); + new InitGameGui().getGui().show(player); +// SGM.getInstance().getGameManager().initGame(new CTB(), player, name); } @Execute(name = "start") @@ -53,6 +58,11 @@ public class GameCommand { game.start(); } +// @Execute(name = "join") +// void join(@Context Player player) { +// +// } + @Execute(name = "join") void join(@Context Player player, @Arg("id") String id) { CustomPlayer cPlayer = new CustomPlayer(player); diff --git a/src/main/java/xyz/twovb/sgm/guis/InitGameGui.java b/src/main/java/xyz/twovb/sgm/guis/InitGameGui.java new file mode 100644 index 0000000..460389e --- /dev/null +++ b/src/main/java/xyz/twovb/sgm/guis/InitGameGui.java @@ -0,0 +1,55 @@ +package xyz.twovb.sgm.guis; +/* + * Created by 2vb - 4/7/2024 + */ + +import com.github.stefvanschie.inventoryframework.gui.type.ChestGui; +import lombok.Getter; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; +import xyz.twovb.sgm.SGM; +import xyz.twovb.sgm.games.impl.capturethebrick.CTB; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.InputStream; +import java.nio.file.Files; +import java.util.logging.Level; + +public class InitGameGui { + + @Getter + private final ChestGui gui; + + public InitGameGui() { + ChestGui loadedGui = null; + try { + File guiFile = new File(SGM.getInstance().getDataFolder(), "guis/initgame.xml"); + if (guiFile.exists()) { + byte[] fileContent = Files.readAllBytes(guiFile.toPath()); + InputStream inputStream = new ByteArrayInputStream(fileContent); + loadedGui = ChestGui.load(this, inputStream); + } else { + SGM.getInstance().getLogger().log(Level.WARNING, "Could not find initgame.xml file."); + } + } catch (Exception e) { + SGM.getInstance().getLogger().log(Level.SEVERE, "Error loading initgame.xml", e); + } + gui = loadedGui; + } + + public void globalClick(InventoryClickEvent event) { + event.setCancelled(true); + } + + public void initGame(InventoryClickEvent event) { + Player player = (Player) event.getWhoClicked(); + String itemName = event.getCurrentItem().getItemMeta().getDisplayName().replaceAll("\\W+", ""); + player.closeInventory(); + if (SGM.getInstance().getGameManager().getRegisteredGames().contains(itemName.toLowerCase())) { + new MapGui(itemName.toLowerCase()).getGui().show(player); + } else { + player.sendMessage("Please check xml"); + } + } +} diff --git a/src/main/java/xyz/twovb/sgm/guis/MapGui.java b/src/main/java/xyz/twovb/sgm/guis/MapGui.java new file mode 100644 index 0000000..19705ad --- /dev/null +++ b/src/main/java/xyz/twovb/sgm/guis/MapGui.java @@ -0,0 +1,77 @@ +package xyz.twovb.sgm.guis; + +import com.github.stefvanschie.inventoryframework.gui.GuiItem; +import com.github.stefvanschie.inventoryframework.gui.type.ChestGui; +import com.github.stefvanschie.inventoryframework.pane.OutlinePane; +import lombok.Getter; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import xyz.twovb.sgm.SGM; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.InputStream; +import java.nio.file.Files; +import java.util.List; +import java.util.logging.Level; + +public class MapGui { + + @Getter + private final ChestGui gui; + + private final String game; + private OutlinePane mapPane; + + public MapGui(String game) { + this.game = game; + ChestGui loadedGui = null; + try { + File guiFile = new File(SGM.getInstance().getDataFolder(), "guis/mapgui.xml"); + if (guiFile.exists()) { + byte[] fileContent = Files.readAllBytes(guiFile.toPath()); + InputStream inputStream = new ByteArrayInputStream(fileContent); + loadedGui = ChestGui.load(this, inputStream); + mapPane = new OutlinePane(1, 1, 7, 1); // Define your pane layout + loadedGui.addPane(mapPane); + addMaps(); + } else { + SGM.getInstance().getLogger().log(Level.WARNING, "Could not find mapgui.xml file."); + } + } catch (Exception e) { + SGM.getInstance().getLogger().log(Level.SEVERE, "Error loading mapgui.xml", e); + } + gui = loadedGui; + } + + public void globalClick(InventoryClickEvent event) { + event.setCancelled(true); +// event.getWhoClicked().sendMessage(this.game); +// gui.getInventory().clear(); + } + + public void addMaps() { + List enabledMaps = SGM.getInstance().getLevelManager().enabledMaps.get(this.game); + if (enabledMaps != null) { + for (String mapName : enabledMaps) { + // Create button for each map + ItemStack mapItem = new ItemStack(Material.MAP); + ItemMeta mapMeta = mapItem.getItemMeta(); + mapMeta.setDisplayName(mapName); + mapItem.setItemMeta(mapMeta); + + mapPane.addItem(new GuiItem(mapItem, event -> { + // Handle click event if needed + // Example: navigate to the map or show map details + Player player = (Player) event.getWhoClicked(); + player.sendMessage("Clicked on map: " + mapName); + })); + } + } else { + SGM.getInstance().getLogger().log(Level.WARNING, "No maps found for game: " + game); + } + } +} diff --git a/src/main/java/xyz/twovb/sgm/levels/LevelManager.java b/src/main/java/xyz/twovb/sgm/levels/LevelManager.java index 1eb845b..8ccaee1 100644 --- a/src/main/java/xyz/twovb/sgm/levels/LevelManager.java +++ b/src/main/java/xyz/twovb/sgm/levels/LevelManager.java @@ -135,6 +135,12 @@ public class LevelManager { if (mapDir.exists()) { FileUtils.deleteDirectory(mapDir); } + File configFile = new File(levelDir + "/sgm.yml"); + YamlConfiguration config = YamlConfiguration.loadConfiguration(configFile); + String gameIntName = config.getString("game"); + if (SGM.getInstance().getGameManager().getRegisteredGames().contains(gameIntName)) { + enabledMaps.get(gameIntName).add(name); + } FileUtils.copyDirectory(levelDir, mapDir); FileUtils.delete(new File(mapDir + "/uid.dat")); loadWorld(name, LevelType.LEVEL); diff --git a/src/main/resources/guis/initgame.xml b/src/main/resources/guis/initgame.xml new file mode 100644 index 0000000..f6ff7ed --- /dev/null +++ b/src/main/resources/guis/initgame.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + Capture The Brick + + + TestGame + + + \ No newline at end of file diff --git a/src/main/resources/guis/mapgui.xml b/src/main/resources/guis/mapgui.xml new file mode 100644 index 0000000..8374ed4 --- /dev/null +++ b/src/main/resources/guis/mapgui.xml @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file From 27c61fa74b21164b3a30c8237e09e7d8a9ed357a Mon Sep 17 00:00:00 2001 From: 2vb <2vb@protonmail.com> Date: Fri, 5 Jul 2024 00:02:24 -0700 Subject: [PATCH 3/5] Map gui works --- .../twovb/sgm/commands/impl/GameCommand.java | 9 +-- .../java/xyz/twovb/sgm/games/GameManager.java | 58 ++++++++++++++----- .../sgm/games/impl/capturethebrick/CTB.java | 7 ++- src/main/java/xyz/twovb/sgm/guis/MapGui.java | 11 +++- .../xyz/twovb/sgm/levels/LevelManager.java | 7 ++- 5 files changed, 68 insertions(+), 24 deletions(-) diff --git a/src/main/java/xyz/twovb/sgm/commands/impl/GameCommand.java b/src/main/java/xyz/twovb/sgm/commands/impl/GameCommand.java index 15af353..d4658f7 100644 --- a/src/main/java/xyz/twovb/sgm/commands/impl/GameCommand.java +++ b/src/main/java/xyz/twovb/sgm/commands/impl/GameCommand.java @@ -1,10 +1,14 @@ package xyz.twovb.sgm.commands.impl; + +/* + * Created by 2vb - 5/7/2024 + */ + /* * Created by 2vb - 2/7/2024 */ -import com.github.stefvanschie.inventoryframework.gui.type.ChestGui; import dev.rollczi.litecommands.annotations.argument.Arg; import dev.rollczi.litecommands.annotations.command.Command; import dev.rollczi.litecommands.annotations.context.Context; @@ -12,11 +16,8 @@ import dev.rollczi.litecommands.annotations.execute.Execute; import dev.rollczi.litecommands.annotations.permission.Permission; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import org.bukkit.event.inventory.InventoryClickEvent; import xyz.twovb.sgm.SGM; import xyz.twovb.sgm.games.Minigame; -import xyz.twovb.sgm.games.impl.TestGame; -import xyz.twovb.sgm.games.impl.capturethebrick.CTB; import xyz.twovb.sgm.guis.InitGameGui; import xyz.twovb.toolbox.api.CustomPlayer; import xyz.twovb.toolbox.utils.ChatUtils; diff --git a/src/main/java/xyz/twovb/sgm/games/GameManager.java b/src/main/java/xyz/twovb/sgm/games/GameManager.java index e5643b8..f68771c 100644 --- a/src/main/java/xyz/twovb/sgm/games/GameManager.java +++ b/src/main/java/xyz/twovb/sgm/games/GameManager.java @@ -1,5 +1,10 @@ package xyz.twovb.sgm.games; + +/* + * Created by 2vb - 5/7/2024 + */ + /* * Created by 2vb - 4/6/2024 */ @@ -11,8 +16,8 @@ import xyz.twovb.sgm.SGM; import xyz.twovb.toolbox.managers.PlaceholderManager; import xyz.twovb.toolbox.utils.ChatUtils; -import java.io.File; import java.io.IOException; +import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; @@ -25,19 +30,12 @@ public class GameManager { @Getter private final ArrayList registeredGames = new ArrayList(); + private final Map> gameMappings = new HashMap<>(); + public static Minigame findGame(UUID gameId) { return activeGames.get(gameId); } - public Minigame findGame(Player player) { - for (Minigame game : activeGames.values()) { - if (game.getPlayers().contains(player)) { - return game; - } - } - return null; - } - public static boolean isInGame(Player player) { for (Minigame game : activeGames.values()) { if (game.getPlayers().contains(player)) { @@ -47,16 +45,37 @@ public class GameManager { return false; } - public void initGame(Minigame game, CommandSender owner, String level) { + public Minigame findGame(Player player) { + for (Minigame game : activeGames.values()) { + if (game.getPlayers().contains(player)) { + return game; + } + } + return null; + } + + public void initGame(String internalName, CommandSender owner, String level) { try { + Minigame game = createGameInstance(internalName); game.init(owner, level); - } catch (IOException e) { + activeGames.put(game.getGameId(), game); + } catch (InstantiationException | IllegalAccessException | IOException | NoSuchMethodException | + InvocationTargetException 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 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)) { @@ -69,17 +88,28 @@ public class GameManager { game.removePlayer(player); } + public Minigame createGameInstance(String internalName) throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException { + Class gameClass = gameMappings.get(internalName); + if (gameClass != null) { + return gameClass.getDeclaredConstructor().newInstance(); + } else { + throw new IllegalArgumentException("No game registered with internal name: " + internalName); + } + } + public void registerGame(Minigame game) { String intName = game.getName().toLowerCase(); try { SGM.getInstance().getConfigManager().loadConfig("games/" + intName + "/options.yml"); registeredGames.add(intName); + gameMappings.put(intName, game.getClass()); SGM.getInstance().getCLogger().log("Registered game " + game.getName()); - } catch(IllegalArgumentException error) { + } catch (IllegalArgumentException error) { String errMsg = error.getMessage(); if (errMsg.contains("The embedded resource") && errMsg.contains("cannot be found")) { SGM.getInstance().getCLogger().log(game.getName() + "'s game options are nowhere to be found. Please ensure this is intended behaviour."); registeredGames.add(intName); + gameMappings.put(intName, game.getClass()); } else { SGM.getInstance().getCLogger().error("Failed to register game " + game.getName() + ". Reason: " + errMsg); } 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 3a0a2a5..0f7b701 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 @@ -1,5 +1,10 @@ package xyz.twovb.sgm.games.impl.capturethebrick; + +/* + * Created by 2vb - 5/7/2024 + */ + /* * Created by 2vb - 3/7/2024 */ @@ -152,7 +157,7 @@ public class CTB implements Minigame { for (Player player : players) { player.teleport(this.spawnLoc); } - for (int i = 0; i < bricks; i++) { + for (int i = 0; i <= bricks; i++) { for (Location brickLoc : redBrickSpawns) { placeBrick(brickLoc, "red"); } diff --git a/src/main/java/xyz/twovb/sgm/guis/MapGui.java b/src/main/java/xyz/twovb/sgm/guis/MapGui.java index 19705ad..ca58d86 100644 --- a/src/main/java/xyz/twovb/sgm/guis/MapGui.java +++ b/src/main/java/xyz/twovb/sgm/guis/MapGui.java @@ -1,5 +1,10 @@ package xyz.twovb.sgm.guis; + +/* + * Created by 2vb - 5/7/2024 + */ + import com.github.stefvanschie.inventoryframework.gui.GuiItem; import com.github.stefvanschie.inventoryframework.gui.type.ChestGui; import com.github.stefvanschie.inventoryframework.pane.OutlinePane; @@ -49,8 +54,6 @@ public class MapGui { public void globalClick(InventoryClickEvent event) { event.setCancelled(true); -// event.getWhoClicked().sendMessage(this.game); -// gui.getInventory().clear(); } public void addMaps() { @@ -67,7 +70,9 @@ public class MapGui { // Handle click event if needed // Example: navigate to the map or show map details Player player = (Player) event.getWhoClicked(); - player.sendMessage("Clicked on map: " + mapName); + SGM.getInstance().getGameManager().initGame(this.game, player, mapName); + player.closeInventory(); +// player.sendMessage("Clicked on map: " + mapName); })); } } else { diff --git a/src/main/java/xyz/twovb/sgm/levels/LevelManager.java b/src/main/java/xyz/twovb/sgm/levels/LevelManager.java index 8ccaee1..f1340a1 100644 --- a/src/main/java/xyz/twovb/sgm/levels/LevelManager.java +++ b/src/main/java/xyz/twovb/sgm/levels/LevelManager.java @@ -1,5 +1,10 @@ package xyz.twovb.sgm.levels; + +/* + * Created by 2vb - 5/7/2024 + */ + /* * Created by 2vb - 4/6/2024 */ @@ -177,8 +182,6 @@ public class LevelManager { block.setType(Material.STONE); } } -// Block block = location.subtract(0, 2, 0).getBlock(); -// block.setType(Material.STONE); world.setSpawnLocation(location); world.setSpawnFlags(false, false); world.setGameRule(GameRule.KEEP_INVENTORY, true); From 31eb8e1ccbafddc0d5049f158fc712826e262e85 Mon Sep 17 00:00:00 2001 From: 2vb <2vb@protonmail.com> Date: Fri, 5 Jul 2024 15:51:56 -0700 Subject: [PATCH 4/5] Scoreboards --- pom.xml | 23 ++++ src/main/java/xyz/twovb/sgm/SGM.java | 21 ++++ .../twovb/sgm/commands/impl/GameCommand.java | 11 ++ .../java/xyz/twovb/sgm/games/Minigame.java | 1 - .../sgm/games/impl/capturethebrick/CTB.java | 108 ++++++++++++++++-- .../impl/capturethebrick/guis/TeamGui.java | 57 +++++++++ .../scoreboards/CTBSidebar.java | 70 ++++++++++++ .../xyz/twovb/sgm/levels/LevelManager.java | 7 +- src/main/resources/guis/teampicker.xml | 17 +++ 9 files changed, 305 insertions(+), 10 deletions(-) create mode 100644 src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/guis/TeamGui.java create mode 100644 src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/scoreboards/CTBSidebar.java create mode 100644 src/main/resources/guis/teampicker.xml diff --git a/pom.xml b/pom.xml index 34d32e6..7022d61 100644 --- a/pom.xml +++ b/pom.xml @@ -77,6 +77,10 @@ com.github.stefvanschie.inventoryframework ${project.groupId}.${project.artifactId}.inventoryframework + + net.megavex.scoreboardlibrary + ${project.groupId}.${project.artifactId}.scoreboardlibrary + @@ -169,6 +173,25 @@ IF 0.10.15 + + net.megavex + scoreboard-library-api + 2.1.10 + + + net.megavex + scoreboard-library-implementation + 2.1.10 + runtime + + + net.megavex + scoreboard-library-modern + 2.1.10 + runtime + + + diff --git a/src/main/java/xyz/twovb/sgm/SGM.java b/src/main/java/xyz/twovb/sgm/SGM.java index b2b21cc..46bcbee 100644 --- a/src/main/java/xyz/twovb/sgm/SGM.java +++ b/src/main/java/xyz/twovb/sgm/SGM.java @@ -3,6 +3,10 @@ package xyz.twovb.sgm; import dev.rollczi.litecommands.bukkit.LiteBukkitMessages; import dev.rollczi.litecommands.bukkit.LiteCommandsBukkit; import lombok.Getter; +import net.megavex.scoreboardlibrary.api.ScoreboardLibrary; +import net.megavex.scoreboardlibrary.api.exception.NoPacketAdapterAvailableException; +import net.megavex.scoreboardlibrary.api.noop.NoopScoreboardLibrary; +import net.megavex.scoreboardlibrary.api.team.TeamManager; import org.bukkit.configuration.InvalidConfigurationException; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; @@ -40,6 +44,11 @@ public final class SGM extends JavaPlugin { @Getter private LevelManager levelManager; + @Getter + private ScoreboardLibrary scoreboardLibrary; + @Getter + private TeamManager teamManager; + @Override public void onEnable() { instance = this; @@ -54,6 +63,7 @@ public final class SGM extends JavaPlugin { BuildInfo.load(Objects.requireNonNull(this.getTextResource("build-info.yml"))); } catch (IOException | InvalidConfigurationException ignored) { } + loadScoreboard(); loadGuis(); registerCommands(); registerGames(); @@ -61,9 +71,20 @@ public final class SGM extends JavaPlugin { levelManager.loadLevels(); } + private void loadScoreboard() { + try { + scoreboardLibrary = ScoreboardLibrary.loadScoreboardLibrary(this); + } catch (NoPacketAdapterAvailableException e) { + // If no packet adapter was found, you can fallback to the no-op implementation: + scoreboardLibrary = new NoopScoreboardLibrary(); + this.getCLogger().error("No scoreboard packet adapter found."); + } + } + private void loadGuis() { saveResource("guis/initgame.xml", false); saveResource("guis/mapgui.xml", false); + saveResource("guis/teampicker.xml", false); } private void registerPlaceholders() { diff --git a/src/main/java/xyz/twovb/sgm/commands/impl/GameCommand.java b/src/main/java/xyz/twovb/sgm/commands/impl/GameCommand.java index d4658f7..d707f3c 100644 --- a/src/main/java/xyz/twovb/sgm/commands/impl/GameCommand.java +++ b/src/main/java/xyz/twovb/sgm/commands/impl/GameCommand.java @@ -16,8 +16,11 @@ import dev.rollczi.litecommands.annotations.execute.Execute; import dev.rollczi.litecommands.annotations.permission.Permission; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.scoreboard.Team; import xyz.twovb.sgm.SGM; import xyz.twovb.sgm.games.Minigame; +import xyz.twovb.sgm.games.impl.capturethebrick.guis.TeamGui; import xyz.twovb.sgm.guis.InitGameGui; import xyz.twovb.toolbox.api.CustomPlayer; import xyz.twovb.toolbox.utils.ChatUtils; @@ -59,6 +62,14 @@ public class GameCommand { game.start(); } + @Execute(name = "team join") + @Permission("sgm.games.team") + void teamJoin(@Context Player player, @Arg("player") Optional target) { +// String name = LevelName.orElse(UUID.randomUUID().toString()); + Player targetPlayer = target.orElse(player); + new TeamGui(targetPlayer).getGui().show(player); + } + // @Execute(name = "join") // void join(@Context Player player) { // diff --git a/src/main/java/xyz/twovb/sgm/games/Minigame.java b/src/main/java/xyz/twovb/sgm/games/Minigame.java index d4b6cf4..a767969 100644 --- a/src/main/java/xyz/twovb/sgm/games/Minigame.java +++ b/src/main/java/xyz/twovb/sgm/games/Minigame.java @@ -63,7 +63,6 @@ public interface Minigame extends Listener { } } - enum GameState { PRESTART, READY, STARTED, ENDING } 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 0f7b701..6eda805 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 @@ -5,10 +5,21 @@ package xyz.twovb.sgm.games.impl.capturethebrick; * Created by 2vb - 5/7/2024 */ -/* - * Created by 2vb - 3/7/2024 - */ - +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.Style; +import net.kyori.adventure.text.format.TextDecoration; +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import net.megavex.scoreboardlibrary.api.sidebar.Sidebar; +import net.megavex.scoreboardlibrary.api.sidebar.component.ComponentSidebarLayout; +import net.megavex.scoreboardlibrary.api.sidebar.component.SidebarComponent; +import net.megavex.scoreboardlibrary.api.sidebar.component.animation.CollectionSidebarAnimation; +import net.megavex.scoreboardlibrary.api.sidebar.component.animation.SidebarAnimation; +import net.megavex.scoreboardlibrary.api.team.TeamDisplay; +import net.megavex.scoreboardlibrary.api.team.TeamManager; +import net.megavex.scoreboardlibrary.api.team.ScoreboardTeam; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; @@ -23,6 +34,8 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.HandlerList; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.scoreboard.Team; +import org.jetbrains.annotations.NotNull; import xyz.twovb.sgm.SGM; import xyz.twovb.sgm.games.GameManager; import xyz.twovb.sgm.games.Minigame; @@ -38,8 +51,6 @@ public class CTB implements Minigame { final static String name = "CaptureTheBrick"; private final UUID uuid; private final List players; - private List redTeam; - private List blueTeam; private final ArrayList redBrickSpawns = new ArrayList(); private final ArrayList blueBrickSpawns = new ArrayList(); private final ArrayList redSpawnArea = new ArrayList(); @@ -51,6 +62,15 @@ public class CTB implements Minigame { private int boundsLevel; private Location spawnLoc; private FileConfiguration messages; + private TeamManager teamManager; + private ScoreboardTeam redTeam; + private ScoreboardTeam blueTeam; + private Sidebar sb; + + +// private List redTeam = new ArrayList(); +// private List blueTeam = new ArrayList(); +// private Sidebar sb; public CTB() { @@ -65,15 +85,56 @@ public class CTB implements Minigame { gameWorld = createGameWorld(world, uuid); gameWorld.setAutoSave(false); if (applyOptions(world)) { + teamManager = SGM.getInstance().getScoreboardLibrary().createTeamManager(); + sb = SGM.getInstance().getScoreboardLibrary().createSidebar(); Bukkit.getPluginManager().registerEvents(this, SGM.getInstance()); + + this.redTeam = teamManager.createIfAbsent("red_team"); + this.blueTeam = teamManager.createIfAbsent("blue_team"); + + setupTeamDisplay(redTeam, "Red Team", NamedTextColor.RED); + setupTeamDisplay(blueTeam, "Blue Team", NamedTextColor.BLUE); + + buildScoreboard(); + // Ready state = GameState.READY; owner.sendMessage(ChatUtils.translate(messages.getString("system.game.ready").replace("%game%", name))); } else { owner.sendMessage(ChatUtils.translate(messages.getString("system.game.failed").replace("%cause%", "to load options."))); - Bukkit.getServer().unloadWorld(gameWorld, false); + this.stop(); } } + private void setupTeamDisplay(ScoreboardTeam team, String displayName, NamedTextColor color) { + TeamDisplay display = team.defaultDisplay(); + display.displayName(Component.text(displayName)); + display.playerColor(color); + } + + private void buildScoreboard() { + @NotNull SidebarAnimation titleAnimation = createGradientAnimation(Component.text("Capture The Brick", Style.style(TextDecoration.BOLD))); + var 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(); + ComponentSidebarLayout 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; + while (phase < 1) { + frames.add(MiniMessage.miniMessage().deserialize("", textPlaceholder)); + phase += step; + } + return new CollectionSidebarAnimation<>(frames); + } + private Location parseString(String string) { String[] coords = string.trim().split(","); if (coords.length == 3) { @@ -169,6 +230,29 @@ public class CTB implements Minigame { } } + public void addPlayerToTeam(Player player, boolean isRedTeam) { + 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")) { @@ -197,11 +281,16 @@ public class CTB implements Minigame { player.teleport(Bukkit.getServer().getWorlds().get(0).getSpawnLocation()); } Bukkit.unloadWorld(gameWorld, false); + if (teamManager != null) { + teamManager.close(); + } + sb.close();; } @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())); } @@ -244,6 +333,10 @@ public class CTB implements Minigame { return uuid; } + public ScoreboardTeam getRedTeam() { + return redTeam; + } + @Override public GameState getState() { return state; @@ -251,6 +344,7 @@ public class CTB implements Minigame { @Override public void onTick() { + buildScoreboard(); if (state == GameState.STARTED && players.size() <= 1) { this.stop(); } diff --git a/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/guis/TeamGui.java b/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/guis/TeamGui.java new file mode 100644 index 0000000..fdad501 --- /dev/null +++ b/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/guis/TeamGui.java @@ -0,0 +1,57 @@ +package xyz.twovb.sgm.games.impl.capturethebrick.guis; + +import com.github.stefvanschie.inventoryframework.gui.type.ChestGui; +import lombok.Getter; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.ItemStack; +import xyz.twovb.sgm.SGM; +import xyz.twovb.sgm.games.Minigame; +import xyz.twovb.sgm.guis.MapGui; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.InputStream; +import java.nio.file.Files; +import java.util.logging.Level; + +public class TeamGui { + @Getter + private final ChestGui gui; + + private Player target; + + public TeamGui(Player player) { + ChestGui loadedGui = null; + try { + File guiFile = new File(SGM.getInstance().getDataFolder(), "guis/teampicker.xml"); + if (guiFile.exists()) { + byte[] fileContent = Files.readAllBytes(guiFile.toPath()); + InputStream inputStream = new ByteArrayInputStream(fileContent); + loadedGui = ChestGui.load(this, inputStream); + } else { + SGM.getInstance().getLogger().log(Level.WARNING, "Could not find teampicker.xml file."); + } + } catch (Exception e) { + SGM.getInstance().getLogger().log(Level.SEVERE, "Error loading teampicker.xml", e); + } + gui = loadedGui; + target = player; + } + + public void globalClick(InventoryClickEvent event) { + event.setCancelled(true); + } + + public void pickTeam(InventoryClickEvent event) { + Player player = (Player) event.getWhoClicked(); + ItemStack clickedItem = event.getCurrentItem(); + Minigame game = SGM.getInstance().getGameManager().findGame(player); + if (clickedItem.getType().equals(Material.RED_WOOL)) { + game.sendMessageToAllPlayers(target.getName() + " RED"); + } else if (clickedItem.getType().equals(Material.BLUE_WOOL)) { + game.sendMessageToAllPlayers(target.getName() + " BLUE"); + } + } +} diff --git a/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/scoreboards/CTBSidebar.java b/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/scoreboards/CTBSidebar.java new file mode 100644 index 0000000..b07dca1 --- /dev/null +++ b/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/scoreboards/CTBSidebar.java @@ -0,0 +1,70 @@ +//package xyz.twovb.sgm.games.impl.capturethebrick.scoreboards; +// +//import net.kyori.adventure.text.Component; +//import net.kyori.adventure.text.format.NamedTextColor; +//import net.kyori.adventure.text.format.Style; +//import net.kyori.adventure.text.format.TextDecoration; +//import net.kyori.adventure.text.minimessage.MiniMessage; +//import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; +//import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +//import net.megavex.scoreboardlibrary.api.sidebar.Sidebar; +//import net.megavex.scoreboardlibrary.api.sidebar.component.ComponentSidebarLayout; +//import net.megavex.scoreboardlibrary.api.sidebar.component.SidebarComponent; +//import net.megavex.scoreboardlibrary.api.sidebar.component.animation.CollectionSidebarAnimation; +//import net.megavex.scoreboardlibrary.api.sidebar.component.animation.SidebarAnimation; +//import org.bukkit.plugin.Plugin; +//import org.jetbrains.annotations.NotNull; +//import xyz.twovb.sgm.games.impl.capturethebrick.CTB; +// +//import java.util.ArrayList; +//import java.util.List; +// +//public class CTBSidebar { +// private final Sidebar sidebar; +// private final ComponentSidebarLayout componentSidebar; +// private final SidebarAnimation titleAnimation; +// private final CTB minigame; +// +// public CTBSidebar(@NotNull Plugin plugin, @NotNull Sidebar sidebar, @NotNull CTB minigame) { +// this.sidebar = sidebar; +// this.minigame = 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(minigame.g), NamedTextColor.RED)) +// .addDynamicLine(() -> Component.text("Blue Team: " + getTeamSize(minigame.blueTeam), NamedTextColor.BLUE)) +// .addDynamicLine(() -> Component.text("Bricks Remaining: " + minigame.bricks, NamedTextColor.GREEN)) +// .build(); +// +// this.componentSidebar = new ComponentSidebarLayout(title, gameInfo); +// } +// +// public void onTick() { +// titleAnimation.nextFrame(); +// componentSidebar.apply(sidebar); +// } +// +// private int getAlivePlayersCount() { +// return (int) minigame.players.stream().filter(Player::isOnline).count(); +// } +// +// private int getTeamSize(ScoreboardTeam team) { +// return team.defaultDisplay().entries().size(); +// } +// +// 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; +// while (phase < 1) { +// frames.add(MiniMessage.miniMessage().deserialize("", textPlaceholder)); +// phase += step; +// } +// return new CollectionSidebarAnimation<>(frames); +// } +//} +// diff --git a/src/main/java/xyz/twovb/sgm/levels/LevelManager.java b/src/main/java/xyz/twovb/sgm/levels/LevelManager.java index f1340a1..669575e 100644 --- a/src/main/java/xyz/twovb/sgm/levels/LevelManager.java +++ b/src/main/java/xyz/twovb/sgm/levels/LevelManager.java @@ -200,6 +200,7 @@ public class LevelManager { // Load levels from levelPath loadWorldDir(levelPath, LevelType.LEVEL); + loadWorldDir(mapPath, LevelType.MAP); } private void loadWorldDir(String path, LevelType levelType) { @@ -218,8 +219,10 @@ public class LevelManager { if (enabledMaps.containsKey(game) && levelType == LevelType.MAP) { enabledMaps.get(game).add(name); } - // Load the world if sgm.yml exists - loadWorld(file.getName(), levelType); + if (levelType == LevelType.LEVEL) { + // Load the world if sgm.yml exists + loadWorld(file.getName(), levelType); + } } else { SGM.getInstance().getCLogger().log("Skipping directory " + file.getName() + ": sgm.yml not found."); } diff --git a/src/main/resources/guis/teampicker.xml b/src/main/resources/guis/teampicker.xml new file mode 100644 index 0000000..dbb4207 --- /dev/null +++ b/src/main/resources/guis/teampicker.xml @@ -0,0 +1,17 @@ + + + + + + + + + Red Team + + + Blue Team + + + \ No newline at end of file From 11d883ac65abf6f8cf845abbde65137ade02b00c Mon Sep 17 00:00:00 2001 From: 2vb <2vb@protonmail.com> Date: Fri, 5 Jul 2024 19:07:50 -0700 Subject: [PATCH 5/5] can i finally start working on the actual game T-T --- src/main/java/xyz/twovb/sgm/SGM.java | 7 ++ .../twovb/sgm/commands/impl/GameCommand.java | 17 ++- .../java/xyz/twovb/sgm/games/Minigame.java | 8 +- .../xyz/twovb/sgm/games/impl/TestGame.java | 11 ++ .../sgm/games/impl/capturethebrick/CTB.java | 104 ++++++++++++----- .../impl/capturethebrick/guis/TeamGui.java | 12 +- .../scoreboards/CTBSidebar.java | 70 ----------- .../xyz/twovb/sgm/guis/ActiveGamesGui.java | 110 ++++++++++++++++++ .../java/xyz/twovb/sgm/guis/JoinGameGui.java | 59 ++++++++++ .../xyz/twovb/sgm/levels/LevelManager.java | 12 +- src/main/resources/guis/activegames.xml | 13 +++ src/main/resources/guis/joingame.xml | 23 ++++ 12 files changed, 337 insertions(+), 109 deletions(-) delete mode 100644 src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/scoreboards/CTBSidebar.java create mode 100644 src/main/java/xyz/twovb/sgm/guis/ActiveGamesGui.java create mode 100644 src/main/java/xyz/twovb/sgm/guis/JoinGameGui.java create mode 100644 src/main/resources/guis/activegames.xml create mode 100644 src/main/resources/guis/joingame.xml diff --git a/src/main/java/xyz/twovb/sgm/SGM.java b/src/main/java/xyz/twovb/sgm/SGM.java index 46bcbee..efa2116 100644 --- a/src/main/java/xyz/twovb/sgm/SGM.java +++ b/src/main/java/xyz/twovb/sgm/SGM.java @@ -1,5 +1,10 @@ package xyz.twovb.sgm; + +/* + * Created by 2vb - 5/7/2024 + */ + import dev.rollczi.litecommands.bukkit.LiteBukkitMessages; import dev.rollczi.litecommands.bukkit.LiteCommandsBukkit; import lombok.Getter; @@ -85,6 +90,8 @@ public final class SGM extends JavaPlugin { saveResource("guis/initgame.xml", false); saveResource("guis/mapgui.xml", false); saveResource("guis/teampicker.xml", false); + saveResource("guis/activegames.xml", false); + saveResource("guis/joingame.xml", false); } private void registerPlaceholders() { diff --git a/src/main/java/xyz/twovb/sgm/commands/impl/GameCommand.java b/src/main/java/xyz/twovb/sgm/commands/impl/GameCommand.java index d707f3c..d303336 100644 --- a/src/main/java/xyz/twovb/sgm/commands/impl/GameCommand.java +++ b/src/main/java/xyz/twovb/sgm/commands/impl/GameCommand.java @@ -1,6 +1,12 @@ package xyz.twovb.sgm.commands.impl; + +/* + * Created by 2vb - 5/7/2024 + */ + + /* * Created by 2vb - 5/7/2024 */ @@ -16,12 +22,11 @@ import dev.rollczi.litecommands.annotations.execute.Execute; import dev.rollczi.litecommands.annotations.permission.Permission; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import org.bukkit.scoreboard.Scoreboard; -import org.bukkit.scoreboard.Team; import xyz.twovb.sgm.SGM; import xyz.twovb.sgm.games.Minigame; import xyz.twovb.sgm.games.impl.capturethebrick.guis.TeamGui; import xyz.twovb.sgm.guis.InitGameGui; +import xyz.twovb.sgm.guis.JoinGameGui; import xyz.twovb.toolbox.api.CustomPlayer; import xyz.twovb.toolbox.utils.ChatUtils; @@ -70,10 +75,10 @@ public class GameCommand { new TeamGui(targetPlayer).getGui().show(player); } -// @Execute(name = "join") -// void join(@Context Player player) { -// -// } + @Execute(name = "testjoin") + void testjoin(@Context Player player) { + new JoinGameGui().getGui().show(player); + } @Execute(name = "join") void join(@Context Player player, @Arg("id") String id) { diff --git a/src/main/java/xyz/twovb/sgm/games/Minigame.java b/src/main/java/xyz/twovb/sgm/games/Minigame.java index a767969..a03b945 100644 --- a/src/main/java/xyz/twovb/sgm/games/Minigame.java +++ b/src/main/java/xyz/twovb/sgm/games/Minigame.java @@ -1,5 +1,10 @@ package xyz.twovb.sgm.games; + +/* + * Created by 2vb - 5/7/2024 + */ + /* * Created by 2vb - 4/6/2024 */ @@ -9,7 +14,6 @@ import org.bukkit.NamespacedKey; import org.bukkit.World; import org.bukkit.WorldCreator; import org.bukkit.command.CommandSender; -import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; import org.bukkit.event.Listener; import xyz.twovb.sgm.SGM; @@ -43,6 +47,8 @@ public interface Minigame extends Listener { GameState getState(); + World getWorld(); + default void sendMessageToAllPlayers(String message) { for (Player player : getPlayers()) { CustomPlayer cPlayer = new CustomPlayer(player); diff --git a/src/main/java/xyz/twovb/sgm/games/impl/TestGame.java b/src/main/java/xyz/twovb/sgm/games/impl/TestGame.java index b1f47bf..235f062 100644 --- a/src/main/java/xyz/twovb/sgm/games/impl/TestGame.java +++ b/src/main/java/xyz/twovb/sgm/games/impl/TestGame.java @@ -1,5 +1,10 @@ package xyz.twovb.sgm.games.impl; + +/* + * Created by 2vb - 5/7/2024 + */ + /* * Created by 2vb - 26/6/2024 */ @@ -117,6 +122,12 @@ public class TestGame implements Minigame { return state; } + + @Override + public World getWorld() { + return gameWorld; + } + @Override public void onTick() { if (state == GameState.STARTED && players.size() <= 1) { 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 6eda805..35013ff 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 @@ -1,6 +1,12 @@ package xyz.twovb.sgm.games.impl.capturethebrick; + +/* + * Created by 2vb - 5/7/2024 + */ + + /* * Created by 2vb - 5/7/2024 */ @@ -17,9 +23,9 @@ import net.megavex.scoreboardlibrary.api.sidebar.component.ComponentSidebarLayou import net.megavex.scoreboardlibrary.api.sidebar.component.SidebarComponent; import net.megavex.scoreboardlibrary.api.sidebar.component.animation.CollectionSidebarAnimation; import net.megavex.scoreboardlibrary.api.sidebar.component.animation.SidebarAnimation; +import net.megavex.scoreboardlibrary.api.team.ScoreboardTeam; import net.megavex.scoreboardlibrary.api.team.TeamDisplay; import net.megavex.scoreboardlibrary.api.team.TeamManager; -import net.megavex.scoreboardlibrary.api.team.ScoreboardTeam; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; @@ -33,8 +39,9 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.HandlerList; import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.scoreboard.Team; +import org.bukkit.scheduler.BukkitTask; import org.jetbrains.annotations.NotNull; import xyz.twovb.sgm.SGM; import xyz.twovb.sgm.games.GameManager; @@ -55,18 +62,22 @@ public class CTB implements Minigame { private final ArrayList blueBrickSpawns = new ArrayList(); private final ArrayList redSpawnArea = new ArrayList(); private final ArrayList blueSpawnArea = new ArrayList(); + private final FileConfiguration messages; private World gameWorld; private GameState state; private int bricks; private int territoryLevel; private int boundsLevel; private Location spawnLoc; - private FileConfiguration messages; private TeamManager teamManager; private ScoreboardTeam redTeam; private ScoreboardTeam blueTeam; private Sidebar sb; + private SidebarAnimation titleAnimation; + // private @NotNull SidebarComponent title; + private ComponentSidebarLayout layout; + private int taskId; // private List redTeam = new ArrayList(); // private List blueTeam = new ArrayList(); @@ -86,16 +97,23 @@ public class CTB implements Minigame { gameWorld.setAutoSave(false); if (applyOptions(world)) { teamManager = SGM.getInstance().getScoreboardLibrary().createTeamManager(); - sb = SGM.getInstance().getScoreboardLibrary().createSidebar(); - Bukkit.getPluginManager().registerEvents(this, SGM.getInstance()); - this.redTeam = teamManager.createIfAbsent("red_team"); this.blueTeam = teamManager.createIfAbsent("blue_team"); + Bukkit.getPluginManager().registerEvents(this, SGM.getInstance()); setupTeamDisplay(redTeam, "Red Team", NamedTextColor.RED); setupTeamDisplay(blueTeam, "Blue Team", NamedTextColor.BLUE); - buildScoreboard(); + this.sb = SGM.getInstance().getScoreboardLibrary().createSidebar(); + 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(); + + 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))); @@ -111,27 +129,31 @@ public class CTB implements Minigame { display.playerColor(color); } - private void buildScoreboard() { - @NotNull SidebarAnimation titleAnimation = createGradientAnimation(Component.text("Capture The Brick", Style.style(TextDecoration.BOLD))); - var 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(); - ComponentSidebarLayout layout = new ComponentSidebarLayout(title, lines); - layout.apply(sb); - } +// 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; - while (phase < 1) { - frames.add(MiniMessage.miniMessage().deserialize("", textPlaceholder)); + + SGM.getInstance().getCLogger().log("Creating gradient animation"); + + while (phase <= 1) { + 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); } @@ -217,6 +239,7 @@ public class CTB implements Minigame { 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) { @@ -226,11 +249,13 @@ public class CTB implements Minigame { placeBrick(brickLoc, "blue"); } } - Bukkit.getScheduler().runTaskTimer(SGM.getInstance(), this::onTick, 0L, 1L); + 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 { @@ -284,13 +309,16 @@ public class CTB implements Minigame { if (teamManager != null) { teamManager.close(); } - sb.close();; + if (sb != null) { + sb.close(); + } + Bukkit.getScheduler().cancelTask(this.taskId); } @Override public void addPlayer(Player player) { players.add(player); - sb.addPlayer(player); +// sb.addPlayer(player); player.teleport(this.spawnLoc); sendMessageToAllPlayers(messages.getString("system.player.join").replace("%player%", player.getName())); } @@ -298,6 +326,8 @@ public class CTB implements Minigame { @Override public void removePlayer(Player player) { players.remove(player); + sb.removePlayer(player); + sendMessageToAllPlayers(messages.getString("system.player.left").replace("%player%", player.getName())); } @EventHandler @@ -308,6 +338,14 @@ public class CTB implements Minigame { } } + @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(); @@ -333,21 +371,31 @@ public class CTB implements Minigame { return uuid; } - public ScoreboardTeam getRedTeam() { - return redTeam; - } - @Override public GameState getState() { return state; } + @Override + public World getWorld() { + return gameWorld; + } + @Override public void onTick() { - buildScoreboard(); + 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/games/impl/capturethebrick/guis/TeamGui.java b/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/guis/TeamGui.java index fdad501..faedbc7 100644 --- a/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/guis/TeamGui.java +++ b/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/guis/TeamGui.java @@ -1,5 +1,10 @@ package xyz.twovb.sgm.games.impl.capturethebrick.guis; + +/* + * Created by 2vb - 5/7/2024 + */ + import com.github.stefvanschie.inventoryframework.gui.type.ChestGui; import lombok.Getter; import org.bukkit.Material; @@ -7,8 +12,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.ItemStack; import xyz.twovb.sgm.SGM; -import xyz.twovb.sgm.games.Minigame; -import xyz.twovb.sgm.guis.MapGui; +import xyz.twovb.sgm.games.impl.capturethebrick.CTB; import java.io.ByteArrayInputStream; import java.io.File; @@ -47,10 +51,12 @@ public class TeamGui { public void pickTeam(InventoryClickEvent event) { Player player = (Player) event.getWhoClicked(); ItemStack clickedItem = event.getCurrentItem(); - Minigame game = SGM.getInstance().getGameManager().findGame(player); + CTB game = (CTB) SGM.getInstance().getGameManager().findGame(player); if (clickedItem.getType().equals(Material.RED_WOOL)) { + game.addPlayerToTeam(target, true); game.sendMessageToAllPlayers(target.getName() + " RED"); } else if (clickedItem.getType().equals(Material.BLUE_WOOL)) { + game.addPlayerToTeam(target, false); game.sendMessageToAllPlayers(target.getName() + " BLUE"); } } diff --git a/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/scoreboards/CTBSidebar.java b/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/scoreboards/CTBSidebar.java deleted file mode 100644 index b07dca1..0000000 --- a/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/scoreboards/CTBSidebar.java +++ /dev/null @@ -1,70 +0,0 @@ -//package xyz.twovb.sgm.games.impl.capturethebrick.scoreboards; -// -//import net.kyori.adventure.text.Component; -//import net.kyori.adventure.text.format.NamedTextColor; -//import net.kyori.adventure.text.format.Style; -//import net.kyori.adventure.text.format.TextDecoration; -//import net.kyori.adventure.text.minimessage.MiniMessage; -//import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; -//import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; -//import net.megavex.scoreboardlibrary.api.sidebar.Sidebar; -//import net.megavex.scoreboardlibrary.api.sidebar.component.ComponentSidebarLayout; -//import net.megavex.scoreboardlibrary.api.sidebar.component.SidebarComponent; -//import net.megavex.scoreboardlibrary.api.sidebar.component.animation.CollectionSidebarAnimation; -//import net.megavex.scoreboardlibrary.api.sidebar.component.animation.SidebarAnimation; -//import org.bukkit.plugin.Plugin; -//import org.jetbrains.annotations.NotNull; -//import xyz.twovb.sgm.games.impl.capturethebrick.CTB; -// -//import java.util.ArrayList; -//import java.util.List; -// -//public class CTBSidebar { -// private final Sidebar sidebar; -// private final ComponentSidebarLayout componentSidebar; -// private final SidebarAnimation titleAnimation; -// private final CTB minigame; -// -// public CTBSidebar(@NotNull Plugin plugin, @NotNull Sidebar sidebar, @NotNull CTB minigame) { -// this.sidebar = sidebar; -// this.minigame = 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(minigame.g), NamedTextColor.RED)) -// .addDynamicLine(() -> Component.text("Blue Team: " + getTeamSize(minigame.blueTeam), NamedTextColor.BLUE)) -// .addDynamicLine(() -> Component.text("Bricks Remaining: " + minigame.bricks, NamedTextColor.GREEN)) -// .build(); -// -// this.componentSidebar = new ComponentSidebarLayout(title, gameInfo); -// } -// -// public void onTick() { -// titleAnimation.nextFrame(); -// componentSidebar.apply(sidebar); -// } -// -// private int getAlivePlayersCount() { -// return (int) minigame.players.stream().filter(Player::isOnline).count(); -// } -// -// private int getTeamSize(ScoreboardTeam team) { -// return team.defaultDisplay().entries().size(); -// } -// -// 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; -// while (phase < 1) { -// frames.add(MiniMessage.miniMessage().deserialize("", textPlaceholder)); -// phase += step; -// } -// return new CollectionSidebarAnimation<>(frames); -// } -//} -// diff --git a/src/main/java/xyz/twovb/sgm/guis/ActiveGamesGui.java b/src/main/java/xyz/twovb/sgm/guis/ActiveGamesGui.java new file mode 100644 index 0000000..55d4502 --- /dev/null +++ b/src/main/java/xyz/twovb/sgm/guis/ActiveGamesGui.java @@ -0,0 +1,110 @@ +package xyz.twovb.sgm.guis; + +/* + * Created by 2vb - 5/7/2024 + */ + +/* + * Created by 2vb - 5/7/2024 + */ + +import com.github.stefvanschie.inventoryframework.gui.GuiItem; +import com.github.stefvanschie.inventoryframework.gui.type.ChestGui; +import com.github.stefvanschie.inventoryframework.pane.OutlinePane; +import lombok.Getter; +import net.kyori.adventure.text.Component; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import xyz.twovb.sgm.SGM; +import xyz.twovb.sgm.games.GameManager; +import xyz.twovb.sgm.games.Minigame; +import xyz.twovb.toolbox.utils.ChatUtils; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.InputStream; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Level; + +public class ActiveGamesGui { + + @Getter + private final ChestGui gui; + + private final String game; + private OutlinePane mapPane; + + public ActiveGamesGui(String game) { + this.game = game; + ChestGui loadedGui = null; + try { + File guiFile = new File(SGM.getInstance().getDataFolder(), "guis/activegames.xml"); + if (guiFile.exists()) { + byte[] fileContent = Files.readAllBytes(guiFile.toPath()); + InputStream inputStream = new ByteArrayInputStream(fileContent); + loadedGui = ChestGui.load(this, inputStream); + mapPane = new OutlinePane(1, 1, 7, 1); // Define your pane layout + loadedGui.addPane(mapPane); + addMaps(); + } else { + SGM.getInstance().getLogger().log(Level.WARNING, "Could not find activegames.xml file."); + } + } catch (Exception e) { + SGM.getInstance().getLogger().log(Level.SEVERE, "Error loading activegames.xml", e); + } + gui = loadedGui; + } + + public void globalClick(InventoryClickEvent event) { + event.setCancelled(true); + } + + 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())); + } + } + 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()); + } + player.closeInventory(); + })); + } + } +} diff --git a/src/main/java/xyz/twovb/sgm/guis/JoinGameGui.java b/src/main/java/xyz/twovb/sgm/guis/JoinGameGui.java new file mode 100644 index 0000000..1a5ef6b --- /dev/null +++ b/src/main/java/xyz/twovb/sgm/guis/JoinGameGui.java @@ -0,0 +1,59 @@ +package xyz.twovb.sgm.guis; + +/* + * Created by 2vb - 5/7/2024 + */ + +/* + * Created by 2vb - 5/7/2024 + */ + +import com.github.stefvanschie.inventoryframework.gui.type.ChestGui; +import lombok.Getter; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; +import xyz.twovb.sgm.SGM; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.InputStream; +import java.nio.file.Files; +import java.util.logging.Level; + +public class JoinGameGui { + + @Getter + private final ChestGui gui; + + public JoinGameGui() { + ChestGui loadedGui = null; + try { + File guiFile = new File(SGM.getInstance().getDataFolder(), "guis/joingame.xml"); + if (guiFile.exists()) { + byte[] fileContent = Files.readAllBytes(guiFile.toPath()); + InputStream inputStream = new ByteArrayInputStream(fileContent); + loadedGui = ChestGui.load(this, inputStream); + } else { + SGM.getInstance().getLogger().log(Level.WARNING, "Could not find joingame.xml file."); + } + } catch (Exception e) { + SGM.getInstance().getLogger().log(Level.SEVERE, "Error loading joingame.xml", e); + } + gui = loadedGui; + } + + public void globalClick(InventoryClickEvent event) { + event.setCancelled(true); + } + + public void joinGame(InventoryClickEvent event) { + Player player = (Player) event.getWhoClicked(); + String itemName = event.getCurrentItem().getItemMeta().getDisplayName().replaceAll("\\W+", ""); + player.closeInventory(); + if (SGM.getInstance().getGameManager().getRegisteredGames().contains(itemName.toLowerCase())) { + new ActiveGamesGui(itemName).getGui().show(player); + } else { + player.sendMessage("Please check xml"); + } + } +} diff --git a/src/main/java/xyz/twovb/sgm/levels/LevelManager.java b/src/main/java/xyz/twovb/sgm/levels/LevelManager.java index 669575e..e60893c 100644 --- a/src/main/java/xyz/twovb/sgm/levels/LevelManager.java +++ b/src/main/java/xyz/twovb/sgm/levels/LevelManager.java @@ -1,6 +1,12 @@ package xyz.twovb.sgm.levels; + +/* + * Created by 2vb - 5/7/2024 + */ + + /* * Created by 2vb - 5/7/2024 */ @@ -113,6 +119,7 @@ public class LevelManager { File yamlFile = new File(path, "sgm.yml"); try (FileWriter writer = new FileWriter(yamlFile)) { yaml.dump(data, writer); + this.cancel(); } catch (IOException e) { SGM.getInstance().getCLogger().error("Error writing data file: " + e.getMessage()); } @@ -144,7 +151,10 @@ public class LevelManager { YamlConfiguration config = YamlConfiguration.loadConfiguration(configFile); String gameIntName = config.getString("game"); if (SGM.getInstance().getGameManager().getRegisteredGames().contains(gameIntName)) { - enabledMaps.get(gameIntName).add(name); + List maps = enabledMaps.get(gameIntName); + if (!maps.contains(name)) { + enabledMaps.get(gameIntName).add(name); + } } FileUtils.copyDirectory(levelDir, mapDir); FileUtils.delete(new File(mapDir + "/uid.dat")); diff --git a/src/main/resources/guis/activegames.xml b/src/main/resources/guis/activegames.xml new file mode 100644 index 0000000..2c3d4f7 --- /dev/null +++ b/src/main/resources/guis/activegames.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/guis/joingame.xml b/src/main/resources/guis/joingame.xml new file mode 100644 index 0000000..2332b4a --- /dev/null +++ b/src/main/resources/guis/joingame.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + Capture The Brick + + + TestGame + + + \ No newline at end of file