From c34a2a4d55b56fc1b5150bf9ae7ba02b7155b6fa Mon Sep 17 00:00:00 2001
From: 2vb <2vb@protonmail.com>
Date: Tue, 2 Jul 2024 19:17:45 -0700
Subject: [PATCH] levels save and load properly
---
pom.xml | 3 +-
src/main/java/xyz/twovb/sgm/SGM.java | 34 ++---
.../twovb/sgm/commands/impl/SGMCommand.java | 9 ++
.../java/xyz/twovb/sgm/games/GameManager.java | 5 +-
.../xyz/twovb/sgm/games/impl/TestGame1.java | 129 ++++++++++++++++++
.../xyz/twovb/sgm/games/impl/TestGame2.java | 129 ++++++++++++++++++
.../xyz/twovb/sgm/games/impl/TestGame3.java | 129 ++++++++++++++++++
.../xyz/twovb/sgm/levels/LevelManager.java | 40 ++++++
src/main/resources/config.yml | 0
9 files changed, 452 insertions(+), 26 deletions(-)
create mode 100644 src/main/java/xyz/twovb/sgm/games/impl/TestGame1.java
create mode 100644 src/main/java/xyz/twovb/sgm/games/impl/TestGame2.java
create mode 100644 src/main/java/xyz/twovb/sgm/games/impl/TestGame3.java
delete mode 100644 src/main/resources/config.yml
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