diff --git a/pom.xml b/pom.xml index 8afb07a..3f330b7 100644 --- a/pom.xml +++ b/pom.xml @@ -145,7 +145,7 @@ xyz.twovb Toolbox - 0.2-FIX + 0.3 @@ -153,7 +153,6 @@ snakeyaml 2.2 - diff --git a/src/main/java/xyz/twovb/sgm/SGM.java b/src/main/java/xyz/twovb/sgm/SGM.java index 471a950..5a72828 100644 --- a/src/main/java/xyz/twovb/sgm/SGM.java +++ b/src/main/java/xyz/twovb/sgm/SGM.java @@ -12,7 +12,9 @@ import xyz.twovb.sgm.commands.handlers.NoPermissionsHandler; import xyz.twovb.sgm.commands.impl.LevelCommand; import xyz.twovb.sgm.commands.impl.SGMCommand; import xyz.twovb.sgm.games.GameManager; -import xyz.twovb.sgm.games.impl.TestGame; +//import xyz.twovb.sgm.games.impl.TestGame; +import xyz.twovb.sgm.games.impl.*; +import xyz.twovb.sgm.levels.LevelManager; import xyz.twovb.toolbox.managers.ConfigManager; import xyz.twovb.toolbox.managers.PlaceholderManager; import xyz.twovb.toolbox.utils.CustomLogger; @@ -25,14 +27,12 @@ public final class SGM extends JavaPlugin { @Getter private static SGM instance; private FileConfiguration BuildInfo; - @Getter private FileConfiguration Messages; @Getter private CustomLogger cLogger; + @Getter private ConfigManager configManager; -// @Getter -// private DatabaseManager databaseManager; @Getter private GameManager gameManager; @@ -45,7 +45,6 @@ public final class SGM extends JavaPlugin { configManager = new ConfigManager(this); gameManager = new GameManager(); Messages = configManager.loadConfig("messages.yml"); -// this.saveDefaultConfig(); BuildInfo = new YamlConfiguration(); try { BuildInfo.load(Objects.requireNonNull(this.getTextResource("build-info.yml"))); @@ -54,6 +53,7 @@ public final class SGM extends JavaPlugin { registerCommands(); registerGames(); registerPlaceholders(); + LevelManager.loadLevels(); } private void registerPlaceholders() { @@ -70,26 +70,14 @@ public final class SGM extends JavaPlugin { private void registerGames() { gameManager.registerGame(new TestGame()); + gameManager.registerGame(new TestGame1()); + gameManager.registerGame(new TestGame2()); + gameManager.registerGame(new TestGame3()); } -// private void connectToDatabase() { -// databaseManager = new DatabaseManager(); -// try { -// databaseManager.connect(DatabaseManager.DatabaseType.SQLITE, this, "sgm"); -// cLogger.log("Connected to database!"); -// } catch (SQLException | ClassNotFoundException e) { -// throw new RuntimeException(e); -// } -// } - -// @Override -// public void onDisable() { -// try { -// databaseManager.close(); -// } catch (SQLException e) { -// cLogger.error(e); -// } -// } + @Override + public void onDisable() { + } } diff --git a/src/main/java/xyz/twovb/sgm/commands/impl/SGMCommand.java b/src/main/java/xyz/twovb/sgm/commands/impl/SGMCommand.java index bfe5437..6348676 100644 --- a/src/main/java/xyz/twovb/sgm/commands/impl/SGMCommand.java +++ b/src/main/java/xyz/twovb/sgm/commands/impl/SGMCommand.java @@ -15,11 +15,20 @@ public class SGMCommand { @Execute void command(@Context CommandSender sender) { StringBuilder builder = new StringBuilder(); + StringBuilder gameBuilder = new StringBuilder(); builder.insert(0, SGM.getInstance().getMessages().getString("main-command.lines.1")); builder.append("\n"); builder.append(SGM.getInstance().getMessages().getString("main-command.lines.2")); builder.append("\n"); builder.append(SGM.getInstance().getMessages().getString("main-command.lines.3")); + builder.append("\n"); + builder.append("Enabled games:"); + builder.append("\n"); + for (String game : SGM.getInstance().getGameManager().getRegisteredGames()) { + gameBuilder.append(game); + gameBuilder.append(", "); + } + builder.append(gameBuilder.toString()); String string = builder.toString(); sender.sendMessage(ChatUtils.translate(PlaceholderManager.setPlaceholders(string, sender))); } diff --git a/src/main/java/xyz/twovb/sgm/games/GameManager.java b/src/main/java/xyz/twovb/sgm/games/GameManager.java index 17b8fd4..4b30445 100644 --- a/src/main/java/xyz/twovb/sgm/games/GameManager.java +++ b/src/main/java/xyz/twovb/sgm/games/GameManager.java @@ -20,7 +20,10 @@ public class GameManager { private static Map activeGames = new HashMap(); @Getter - private ArrayList registeredGames = new ArrayList<>(); + private ArrayList registeredGames = new ArrayList(); + + @Getter + public Map enabledLevels = new HashMap(); public static Minigame findGame(UUID gameId) { return activeGames.get(gameId); diff --git a/src/main/java/xyz/twovb/sgm/games/impl/TestGame1.java b/src/main/java/xyz/twovb/sgm/games/impl/TestGame1.java new file mode 100644 index 0000000..51c5019 --- /dev/null +++ b/src/main/java/xyz/twovb/sgm/games/impl/TestGame1.java @@ -0,0 +1,129 @@ +package xyz.twovb.sgm.games.impl; + +/* + * Created by 2vb - 26/6/2024 + */ + +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import xyz.twovb.sgm.SGM; +import xyz.twovb.sgm.games.GameManager; +import xyz.twovb.sgm.games.Minigame; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class TestGame1 implements Minigame { + + final static String name = "TestGame1"; + private final UUID uuid; + private CommandSender owner; + private GameState state; + private final List players; + + public TestGame1() { + this.uuid = UUID.randomUUID(); + this.state = GameState.PRESTART; + this.players = new ArrayList<>(); + } + + public void init(CommandSender owner) { + // Perform initialization logic here + Bukkit.getPluginManager().registerEvents(this, SGM.getInstance()); + this.owner = owner; + state = GameState.READY; + owner.sendMessage("A new " + name + " instance with ID " + uuid + " has been created and is now ready!"); + } + + @Override + public void start() { + if (state == GameState.PRESTART) { + state = GameState.STARTED; + sendMessageToAllPlayers("The game has started!"); + for (Player player : players) { + player.teleport(player.getWorld().getSpawnLocation()); + } + Bukkit.getScheduler().runTaskTimer(SGM.getInstance(), this::onTick, 0L, 1L); + } + } + + @Override + public void stop() { + // 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); + } + + @Override + public void addPlayer(Player player) { + players.add(player); + sendMessageToAllPlayers(player.getName() + " has joined the game!"); + } + + @Override + public void removePlayer(Player player) { + players.remove(player); + } + + @EventHandler + void onPlayerQuit(PlayerQuitEvent 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)) { + 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 CommandSender getOwner() { + return owner; + } + + @Override + public void onTick() { + if (state == GameState.STARTED && players.size() <= 1) { + this.stop(); + } + } + +} \ No newline at end of file diff --git a/src/main/java/xyz/twovb/sgm/games/impl/TestGame2.java b/src/main/java/xyz/twovb/sgm/games/impl/TestGame2.java new file mode 100644 index 0000000..a7445c2 --- /dev/null +++ b/src/main/java/xyz/twovb/sgm/games/impl/TestGame2.java @@ -0,0 +1,129 @@ +package xyz.twovb.sgm.games.impl; + +/* + * Created by 2vb - 26/6/2024 + */ + +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import xyz.twovb.sgm.SGM; +import xyz.twovb.sgm.games.GameManager; +import xyz.twovb.sgm.games.Minigame; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class TestGame2 implements Minigame { + + final static String name = "TestGame2"; + private final UUID uuid; + private CommandSender owner; + private GameState state; + private final List players; + + public TestGame2() { + this.uuid = UUID.randomUUID(); + this.state = GameState.PRESTART; + this.players = new ArrayList<>(); + } + + public void init(CommandSender owner) { + // Perform initialization logic here + Bukkit.getPluginManager().registerEvents(this, SGM.getInstance()); + this.owner = owner; + state = GameState.READY; + owner.sendMessage("A new " + name + " instance with ID " + uuid + " has been created and is now ready!"); + } + + @Override + public void start() { + if (state == GameState.PRESTART) { + state = GameState.STARTED; + sendMessageToAllPlayers("The game has started!"); + for (Player player : players) { + player.teleport(player.getWorld().getSpawnLocation()); + } + Bukkit.getScheduler().runTaskTimer(SGM.getInstance(), this::onTick, 0L, 1L); + } + } + + @Override + public void stop() { + // 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); + } + + @Override + public void addPlayer(Player player) { + players.add(player); + sendMessageToAllPlayers(player.getName() + " has joined the game!"); + } + + @Override + public void removePlayer(Player player) { + players.remove(player); + } + + @EventHandler + void onPlayerQuit(PlayerQuitEvent 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)) { + 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 CommandSender getOwner() { + return owner; + } + + @Override + public void onTick() { + if (state == GameState.STARTED && players.size() <= 1) { + this.stop(); + } + } + +} \ No newline at end of file diff --git a/src/main/java/xyz/twovb/sgm/games/impl/TestGame3.java b/src/main/java/xyz/twovb/sgm/games/impl/TestGame3.java new file mode 100644 index 0000000..7ceda78 --- /dev/null +++ b/src/main/java/xyz/twovb/sgm/games/impl/TestGame3.java @@ -0,0 +1,129 @@ +package xyz.twovb.sgm.games.impl; + +/* + * Created by 2vb - 26/6/2024 + */ + +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import xyz.twovb.sgm.SGM; +import xyz.twovb.sgm.games.GameManager; +import xyz.twovb.sgm.games.Minigame; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class TestGame3 implements Minigame { + + final static String name = "TestGame3"; + private final UUID uuid; + private CommandSender owner; + private GameState state; + private final List players; + + public TestGame3() { + this.uuid = UUID.randomUUID(); + this.state = GameState.PRESTART; + this.players = new ArrayList<>(); + } + + public void init(CommandSender owner) { + // Perform initialization logic here + Bukkit.getPluginManager().registerEvents(this, SGM.getInstance()); + this.owner = owner; + state = GameState.READY; + owner.sendMessage("A new " + name + " instance with ID " + uuid + " has been created and is now ready!"); + } + + @Override + public void start() { + if (state == GameState.PRESTART) { + state = GameState.STARTED; + sendMessageToAllPlayers("The game has started!"); + for (Player player : players) { + player.teleport(player.getWorld().getSpawnLocation()); + } + Bukkit.getScheduler().runTaskTimer(SGM.getInstance(), this::onTick, 0L, 1L); + } + } + + @Override + public void stop() { + // 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); + } + + @Override + public void addPlayer(Player player) { + players.add(player); + sendMessageToAllPlayers(player.getName() + " has joined the game!"); + } + + @Override + public void removePlayer(Player player) { + players.remove(player); + } + + @EventHandler + void onPlayerQuit(PlayerQuitEvent 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)) { + 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 CommandSender getOwner() { + return owner; + } + + @Override + public void onTick() { + if (state == GameState.STARTED && players.size() <= 1) { + this.stop(); + } + } + +} \ No newline at end of file diff --git a/src/main/java/xyz/twovb/sgm/levels/LevelManager.java b/src/main/java/xyz/twovb/sgm/levels/LevelManager.java index 2fefda6..fa79d03 100644 --- a/src/main/java/xyz/twovb/sgm/levels/LevelManager.java +++ b/src/main/java/xyz/twovb/sgm/levels/LevelManager.java @@ -6,6 +6,7 @@ package xyz.twovb.sgm.levels; import org.bukkit.*; import org.bukkit.block.Block; +import org.bukkit.configuration.file.YamlConfiguration; import org.yaml.snakeyaml.DumperOptions; import org.yaml.snakeyaml.Yaml; import xyz.twovb.sgm.SGM; @@ -20,6 +21,45 @@ public class LevelManager { public static final String path = SGM.getInstance().getDataFolder().getPath() + "/levels/"; + public static void loadLevels() { + // List all files (worlds) in the folder + File folder = new File(path); + File[] files = folder.listFiles(); + if (files != null) { + for (File file : files) { + if (file.isDirectory()) { + // Check if sgm.yml exists in the world directory + File configFile = new File(file, "sgm.yml"); + if (configFile.exists()) { + YamlConfiguration config = YamlConfiguration.loadConfiguration(configFile); + SGM.getInstance().getGameManager().enabledLevels.put(config.getString("game"), config.getString("name")); + // Load the world if sgm.yml exists + loadWorld(file.getName()); + } else { + SGM.getInstance().getCLogger().log("Skipping directory " + file.getName() + ": sgm.yml not found."); + } + } + } + } + } + + private static void loadWorld(String worldName) { + // Check if the world is already loaded + if (Bukkit.getWorld(worldName) != null) { + SGM.getInstance().getCLogger().log("World " + worldName + " is already loaded."); + return; + } + + // Load the world + WorldCreator wc = new WorldCreator(path + worldName, new NamespacedKey(SGM.getInstance(), "level_" + worldName)); + World world = wc.createWorld(); + if (world != null) { + SGM.getInstance().getCLogger().log("Loaded world: " + worldName); + } else { + SGM.getInstance().getCLogger().error("Failed to load world: " + worldName); + } + } + public static CreationResult createLevel(String name, String game) { File level = new File(path + name); if (!SGM.getInstance().getGameManager().getRegisteredGames().contains(game.toLowerCase())) { diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml deleted file mode 100644 index e69de29..0000000