diff --git a/pom.xml b/pom.xml index 3e59fd6..069c96d 100644 --- a/pom.xml +++ b/pom.xml @@ -12,6 +12,7 @@ org.apache.maven.plugins maven-compiler-plugin + 3.1 8 8 diff --git a/src/main/java/moe/sdg/PluginSDG/Commands/SDGCommand.java b/src/main/java/moe/sdg/PluginSDG/Commands/SDGCommand.java new file mode 100644 index 0000000..f057ddf --- /dev/null +++ b/src/main/java/moe/sdg/PluginSDG/Commands/SDGCommand.java @@ -0,0 +1,96 @@ +package moe.sdg.PluginSDG.Commands; + +import moe.sdg.PluginSDG.GameManager; +import moe.sdg.PluginSDG.GameType; +import moe.sdg.PluginSDG.MiniGame; +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; + +import java.util.ArrayList; + + +public class SDGCommand implements CommandExecutor +{ + GameManager gameManager; + + public SDGCommand(GameManager gameManager){ + this.gameManager = gameManager; + } + + public boolean onCommand(CommandSender commandSender, Command command, String s, String[] args) { + + if(args.length == 0) + { + commandSender.sendMessage(ChatColor.BLUE + "usage: /sdg "); + return true; + } + //parse sdg argument + switch (args[0]) + { + case "create": + if(args.length != 4 && args.length != 3) + { + commandSender.sendMessage(ChatColor.BLUE + "Usage /sdg create "); + break; + } + + //parse create argument + if (args[1].equals("deathmatch")) { + //TODO: check for map name + //check if a gameName was given + if (args.length == 3) { + + gameManager.createGame(GameType.DeathMatch, args[2]); + commandSender.sendMessage(ChatColor.BLUE + "Created deathmatch game with a default name since no name where precised"); + } else { + + //check if game name is already used + if (gameManager.getGamesByName(args[3]).size() != 0) { + commandSender.sendMessage(ChatColor.BLUE + "Name is already used" + args[0]); + }else { + gameManager.createGame(GameType.DeathMatch, args[2], args[3]); + commandSender.sendMessage(ChatColor.BLUE + "Created deathmatch game"); + } + } + } + commandSender.sendMessage(ChatColor.BLUE + "Unknown game type " + args[1]); + break; + + + case "remove": + //check if entered name exist + if(gameManager.getGamesByName(args[1]).size() == 0) + { + commandSender.sendMessage(ChatColor.BLUE + "Invalid game name: " + args[1]); + }else{ + gameManager.getGamesByName(args[1]).get(0).destroy(); + commandSender.sendMessage(ChatColor.BLUE + "removed game " + args[1]); + } + break; + + case "list": + + ArrayList games = gameManager.getGames(); + + commandSender.sendMessage(ChatColor.BLUE + "====="+ ChatColor.DARK_RED + "Game list" + ChatColor.BLUE + "=====" ); + + //list game name + if(games.size() == 0){ + commandSender.sendMessage("There is no game"); + }else { + for (MiniGame game : games) + { + commandSender.sendMessage(game.getType() + " " + game.getCurrentPlayers() + "/" + game.getMaxPlayers() + " " + game.getName()); + } + } + commandSender.sendMessage(ChatColor.BLUE +"==================="); + break; + } + return true; + } + + + +} diff --git a/src/main/java/moe/sdg/PluginSDG/GameManager.java b/src/main/java/moe/sdg/PluginSDG/GameManager.java index 158a715..784f192 100644 --- a/src/main/java/moe/sdg/PluginSDG/GameManager.java +++ b/src/main/java/moe/sdg/PluginSDG/GameManager.java @@ -1,5 +1,6 @@ package moe.sdg.PluginSDG; +import moe.sdg.PluginSDG.Commands.SDGCommand; import moe.sdg.PluginSDG.games.DeathMatch; import moe.sdg.PluginSDG.Commands.HubCommand; import moe.sdg.PluginSDG.Commands.SetHubCommand; @@ -27,6 +28,7 @@ public class GameManager extends JavaPlugin getCommand("hub").setExecutor(new HubCommand(config)); getCommand("sethub").setExecutor(new SetHubCommand(config)); + getCommand("sdg").setExecutor(new SDGCommand(this)); _games = new ArrayList<>(); getLogger().info("Game manager loaded."); } @@ -48,17 +50,36 @@ public class GameManager extends JavaPlugin //! @brief factory for creating new game //! @param type The type of game to create //! @param map the name of the map to use + //! @param gameName the name of the new game //! @return - public MiniGame createGame(GameType type, String map) + public MiniGame createGame(GameType type, String map, String gameName) { switch (type) { case DeathMatch: - DeathMatch match = new DeathMatch(this); + DeathMatch match = gameName == null ? new DeathMatch(this, this.generateNewName()) : + new DeathMatch(this, gameName); this._games.add(match); return match; } return null; } + public MiniGame createGame(GameType type, String map) + { + return this.createGame(type,map,null); + } + + //! @brief generate a new possible game name of the form + //! @return + private String generateNewName(){ + String name = "unnamed "; + int i = 0; + while (this.getGamesByName(name).size() != 0) + { + name += String.valueOf(i); + i++; + } + return name; + } //! @brief delete a game //! @param game the game to be deleted @@ -67,8 +88,16 @@ public class GameManager extends JavaPlugin this._games.remove(game); } - public ArrayList getByType(final GameType type) + public ArrayList getGamesByType(final GameType type) { return this._games.stream().filter(e -> e.getType() == type).collect(Collectors.toCollection(ArrayList::new)); } + + public ArrayList getGames(){ return this._games;} + + public ArrayList getGamesByName(String name) + { + return this._games.stream().filter(e -> e.getName().equals(name)).collect(Collectors.toCollection(ArrayList::new)); + } + } diff --git a/src/main/java/moe/sdg/PluginSDG/MiniGame.java b/src/main/java/moe/sdg/PluginSDG/MiniGame.java index b84522a..62f5363 100644 --- a/src/main/java/moe/sdg/PluginSDG/MiniGame.java +++ b/src/main/java/moe/sdg/PluginSDG/MiniGame.java @@ -3,21 +3,28 @@ package moe.sdg.PluginSDG; import org.bukkit.Location; import org.bukkit.entity.Player; import java.util.ArrayList; +import java.util.stream.Collectors; public abstract class MiniGame { private final ArrayList _players; private final GameManager _manager; private final Location _lobbyLocation; - - - public MiniGame(GameManager manager) + private final String gameName; + + public String getName() { + return gameName; + } + + public MiniGame(GameManager manager, String gameName) { this._manager = manager; this._lobbyLocation = null; this._players = new ArrayList(); + this.gameName = gameName; } + public abstract GameType getType(); //! @brief Return the current count of players in the game. @@ -43,14 +50,28 @@ public abstract class MiniGame //! @brief Method called when a player wants to leave the game. //! @param player The player who will leave. - public void leave(Player player) + public void removePlayer(Player player) { this._players.remove(player); player.teleport(_manager.getHubLocation()); + if(this.getCurrentPlayers() == 0) + { + + } } //! @brief Start the game. public abstract void start(); + //! @brief End the game. public abstract void end(); + + public void destroy() + { + if(this.getCurrentPlayers() == 0) + { + _manager.deleteGame(this); + } + } + } diff --git a/src/main/java/moe/sdg/PluginSDG/TeamMiniGame.java b/src/main/java/moe/sdg/PluginSDG/TeamMiniGame.java index da4aad3..5f3a04a 100644 --- a/src/main/java/moe/sdg/PluginSDG/TeamMiniGame.java +++ b/src/main/java/moe/sdg/PluginSDG/TeamMiniGame.java @@ -38,9 +38,9 @@ public abstract class TeamMiniGame extends MiniGame private final ArrayList _teams; - public TeamMiniGame(GameManager manager) + public TeamMiniGame(GameManager manager, String gameName) { - super(manager); + super(manager, gameName); this._teams = new ArrayList(); } diff --git a/src/main/java/moe/sdg/PluginSDG/games/DeathMatch.java b/src/main/java/moe/sdg/PluginSDG/games/DeathMatch.java index 8403a52..bc93624 100644 --- a/src/main/java/moe/sdg/PluginSDG/games/DeathMatch.java +++ b/src/main/java/moe/sdg/PluginSDG/games/DeathMatch.java @@ -7,11 +7,11 @@ import moe.sdg.PluginSDG.MiniGame; public class DeathMatch extends MiniGame { private int _maxPlayer = 4; - private boolean enforceMaxPlayer = false; + private boolean enforceMaxPlayer = true; - public DeathMatch(GameManager gameManager) + public DeathMatch(GameManager gameManager, String name) { - super(gameManager); + super(gameManager, name); } @Override @@ -23,7 +23,7 @@ public class DeathMatch extends MiniGame { public int getMaxPlayers() { if (enforceMaxPlayer) return _maxPlayer; - return 0; + return -1; } //! @brief Start the game. diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 7b90cf8..b8f53b4 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,10 +1,14 @@ name: PluginSDG version: 1.0 main: moe.sdg.PluginSDG.GameManager +api-version: 1.16 commands: hub: description: Return to the hub usage: / sethub: description: Set the hub location + usage: / + sdg: + description: main command for all sdg sub-command usage: / \ No newline at end of file