diff options
4 files changed, 126 insertions, 60 deletions
| diff --git a/src/main/java/com/MylesAndMore/tumble/EventListener.java b/src/main/java/com/MylesAndMore/tumble/EventListener.java index 8f9ab25..7d07ab4 100644 --- a/src/main/java/com/MylesAndMore/tumble/EventListener.java +++ b/src/main/java/com/MylesAndMore/tumble/EventListener.java @@ -12,11 +12,7 @@ import org.bukkit.event.entity.FoodLevelChangeEvent;  import org.bukkit.event.entity.PlayerDeathEvent;  import org.bukkit.event.entity.ProjectileHitEvent;  import org.bukkit.event.entity.ProjectileLaunchEvent; -import org.bukkit.event.player.PlayerDropItemEvent; -import org.bukkit.event.player.PlayerItemDamageEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerMoveEvent; -import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.*;  import org.bukkit.inventory.ItemStack;  public class EventListener implements Listener{ @@ -38,7 +34,7 @@ public class EventListener implements Listener{              // For auto-start function: check if the autoStart is enabled              if (TumbleManager.getPlugin().getConfig().getBoolean("autoStart.enabled")) {                  // If so, check if the amount of players has been reached -                if (Bukkit.getWorld(TumbleManager.getGameWorld()).getPlayers().size() == TumbleManager.getPlugin().getConfig().getInt("autoStart.players")) { +                if (TumbleManager.getPlayersInLobby().size() == TumbleManager.getPlugin().getConfig().getInt("autoStart.players")) {                      // The autoStart should begin; pass this to the Game                      Game.getGame().autoStart();                  } @@ -47,6 +43,28 @@ public class EventListener implements Listener{      }      @EventHandler +    public void PlayerChangedWorldEvent(PlayerChangedWorldEvent event) { +        // If the gameWorld and lobbyWorld is not null, then check +        if (TumbleManager.getGameWorld() != null && TumbleManager.getLobbyWorld() != null) { +            // if the player changed to the lobbyWorld, then +            if (event.getPlayer().getWorld() == Bukkit.getWorld(TumbleManager.getLobbyWorld())) { +                // run the autostart checks (from above) +                if (TumbleManager.getPlugin().getConfig().getBoolean("autoStart.enabled")) { +                    if (TumbleManager.getPlayersInLobby().size() == TumbleManager.getPlugin().getConfig().getInt("autoStart.players")) { +                        Game.getGame().autoStart(); +                    } +                } +            } +            // also check if the player left to another world +            else if (event.getFrom() == Bukkit.getWorld(TumbleManager.getLobbyWorld())) { +                if (Objects.equals(Game.getGame().getGameState(), "waiting")) { +                    Game.getGame().cancelStart(); +                } +            } +        } +    } + +    @EventHandler      public void PlayerQuitEvent(PlayerQuitEvent event) {          // On a PlayerQuitEvent, check if the config is set to hide the join/leave messages          // If true, null out the quit message (which just makes it so that there is no message) @@ -60,7 +78,7 @@ public class EventListener implements Listener{                  // Check if the game is in the process of autostarting                  if (Objects.equals(Game.getGame().getGameState(), "waiting")) {                      // Cancel the autostart -                    Bukkit.getServer().getScheduler().cancelTask(Game.getGame().getAutoStartID()); +                    Game.getGame().cancelStart();                  }              }          } diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index 8099c80..8eb9035 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -39,7 +39,7 @@ public class Game {      // Define a variable for the roundType      private String roundType;      // Define a variable for the autostart PID -    private int autoStartID; +    private int autoStartID = -1;      // Initialize a new instance of the Random class for use later      private final Random Random = new Random(); @@ -73,6 +73,7 @@ public class Game {              return false;          }          else { +            Bukkit.getServer().broadcastMessage("game starting");              // Define the gameType              if (Objects.equals(type, "shovels")) {                  gameState = "starting"; @@ -145,14 +146,36 @@ public class Game {          return true;      } +    /** +     * Initiates an automatic start of a Tumble game +     */      public void autoStart() { -        gameState = "waiting"; -        displayActionbar(lobbyPlayers, ChatColor.GREEN + "Game will begin in 15 seconds!"); -        playSound(lobbyPlayers, Sound.BLOCK_NOTE_BLOCK_CHIME, SoundCategory.BLOCKS, 1, 1); -        // Schedule a process to start the game in 300t (15s) and save the PID so we can cancel it later if needed -        autoStartID = Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { -            startGame(TumbleManager.getGameType()); -        }, 300); +        Bukkit.getServer().broadcastMessage("autoStart()"); +        // Wait for the player to load in +        Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { +            gameState = "waiting"; +            displayActionbar(lobbyPlayers, ChatColor.GREEN + "Game will begin in 15 seconds!"); +            playSound(lobbyPlayers, Sound.BLOCK_NOTE_BLOCK_CHIME, SoundCategory.BLOCKS, 1, 1); +            Bukkit.getServer().broadcastMessage("title + sound"); +            TumbleManager.getMVWorldManager().loadWorld(TumbleManager.getGameWorld()); +            // Schedule a process to start the game in 300t (15s) and save the PID so we can cancel it later if needed +            autoStartID = Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { +                Bukkit.getServer().broadcastMessage("startGame"); +                startGame(TumbleManager.getGameType()); +            }, 300); +        }, 50); +    } + +    /** +     * Cancels a "waiting" automatic start +     */ +    public void cancelStart() { +        Bukkit.getServer().getScheduler().cancelTask(Game.getGame().getAutoStartID()); +        displayActionbar(lobbyPlayers, ChatColor.RED + "Game start cancelled!"); +        playSound(lobbyPlayers, Sound.BLOCK_NOTE_BLOCK_BASS, SoundCategory.BLOCKS, 1, 1); +        Bukkit.getServer().broadcastMessage("game start cancelled"); +        gameState = null; +        autoStartID = -1;      }      /** diff --git a/src/main/java/com/MylesAndMore/tumble/commands/SetAutoStart.java b/src/main/java/com/MylesAndMore/tumble/commands/SetAutoStart.java index d64573c..0dcb4d9 100644 --- a/src/main/java/com/MylesAndMore/tumble/commands/SetAutoStart.java +++ b/src/main/java/com/MylesAndMore/tumble/commands/SetAutoStart.java @@ -1,6 +1,7 @@  package com.MylesAndMore.tumble.commands;  import com.MylesAndMore.tumble.TumbleManager; +import org.bukkit.Bukkit;  import org.bukkit.ChatColor;  import org.bukkit.command.Command;  import org.bukkit.command.CommandExecutor; @@ -16,30 +17,36 @@ public class SetAutoStart implements CommandExecutor{              // Check if game and lobby worlds are null              if (TumbleManager.getGameWorld() != null) {                  if (TumbleManager.getLobbyWorld() != null) { -                    // Check the player # argument and parse it into an int -                    int args0 = 0; -                    try { -                        args0 = Integer.parseInt(args[0]); -                    } catch (NumberFormatException nfe){ -                        sender.sendMessage(ChatColor.RED + "Player amount must be a valid number."); -                    } catch (Exception e){ -                        sender.sendMessage(ChatColor.RED + "Invalid player amount."); -                    }                      // Check the amount of args entered                      if (args.length == 2) { +                        // Check the player # argument and parse it into an int +                        int args0; +                        try { +                            args0 = Integer.parseInt(args[0]); +                        } catch (NumberFormatException nfe){ +                            sender.sendMessage(ChatColor.RED + "Player amount must be a valid number."); +                            return true; +                        } catch (Exception e){ +                            sender.sendMessage(ChatColor.RED + "Invalid player amount."); +                            return true; +                        }                          // PlayerAmount & enable/disable were entered                          // Check if a playerAmount between 2-8 was entered                          if ((args0 >= 2) && (args0 <= 8)) {                              if (Objects.equals(args[1], "enable")) {                                  // Write values to the config                                  TumbleManager.getPlugin().getConfig().set("autoStart.players", args0); -                                TumbleManager.getPlugin().getConfig().set("autoStart.enabled", args[1]); +                                TumbleManager.getPlugin().getConfig().set("autoStart.enabled", true);                                  TumbleManager.getPlugin().saveConfig(); +                                sender.sendMessage(ChatColor.GREEN + "Configuration saved!"); +                                sender.sendMessage(ChatColor.GREEN + "Run " + ChatColor.GRAY +  "/tumble:reload " + ChatColor.GREEN + "the changes to take effect.");                              }                              else if (Objects.equals(args[1], "disable")) {                                  TumbleManager.getPlugin().getConfig().set("autoStart.players", args0); -                                TumbleManager.getPlugin().getConfig().set("autoStart.enabled", args[1]); +                                TumbleManager.getPlugin().getConfig().set("autoStart.enabled", false);                                  TumbleManager.getPlugin().saveConfig(); +                                sender.sendMessage(ChatColor.GREEN + "Configuration saved!"); +                                sender.sendMessage(ChatColor.GREEN + "Run " + ChatColor.GRAY +  "/tumble:reload " + ChatColor.GREEN + "the changes to take effect.");                              }                              else {                                  return false; @@ -51,9 +58,21 @@ public class SetAutoStart implements CommandExecutor{                      }                      else if (args.length == 1) {                          // Only PlayerAmount was entered +                        int args0; +                        try { +                            args0 = Integer.parseInt(args[0]); +                        } catch (NumberFormatException nfe){ +                            sender.sendMessage(ChatColor.RED + "Player amount must be a valid number."); +                            return true; +                        } catch (Exception e){ +                            sender.sendMessage(ChatColor.RED + "Invalid player amount."); +                            return true; +                        }                          if ((args0 >= 2) && (args0 <= 8)) {                              TumbleManager.getPlugin().getConfig().set("autoStart.players", args0);                              TumbleManager.getPlugin().saveConfig(); +                            sender.sendMessage(ChatColor.GREEN + "Configuration saved!"); +                            sender.sendMessage(ChatColor.GREEN + "Run " + ChatColor.GRAY +  "/tumble:reload " + ChatColor.GREEN + "the changes to take effect.");                          }                          else {                              sender.sendMessage(ChatColor.RED + "Please enter a player amount between two and eight!"); diff --git a/src/main/java/com/MylesAndMore/tumble/commands/StartGame.java b/src/main/java/com/MylesAndMore/tumble/commands/StartGame.java index 46ca6ce..d488fec 100644 --- a/src/main/java/com/MylesAndMore/tumble/commands/StartGame.java +++ b/src/main/java/com/MylesAndMore/tumble/commands/StartGame.java @@ -20,48 +20,54 @@ public class StartGame implements CommandExecutor {                  if (TumbleManager.getPlayersInLobby().size() > 0) {                      // Check if there is a gameWorld specified in config                      if (TumbleManager.getGameWorld() != null) { -                        sender.sendMessage(ChatColor.BLUE + "Starting game, please wait."); -                        // Use multiverse to load game world -                        // If the load was successful, start game -                        if (TumbleManager.getMVWorldManager().loadWorld(TumbleManager.getGameWorld())) { -                            // If there is no starting argument, -                            if (args.length == 0) { -                                // pull which gamemode to initiate from the config file -                                if (!Game.getGame().startGame(TumbleManager.getGameType())) { -                                    // Sender feedback for if the game failed to start -                                    if (Objects.equals(Game.getGame().getGameState(), "starting")) { -                                        sender.sendMessage(ChatColor.RED + "A game is already starting!"); +                        // Check if a game is already pending to start +                        if (!Objects.equals(Game.getGame().getGameState(), "waiting")) { +                            sender.sendMessage(ChatColor.BLUE + "Starting game, please wait."); +                            // Use multiverse to load game world +                            // If the load was successful, start game +                            if (TumbleManager.getMVWorldManager().loadWorld(TumbleManager.getGameWorld())) { +                                // If there is no starting argument, +                                if (args.length == 0) { +                                    // pull which gamemode to initiate from the config file +                                    if (!Game.getGame().startGame(TumbleManager.getGameType())) { +                                        // Sender feedback for if the game failed to start +                                        if (Objects.equals(Game.getGame().getGameState(), "starting")) { +                                            sender.sendMessage(ChatColor.RED + "A game is already starting!"); +                                        } +                                        else if (Objects.equals(Game.getGame().getGameState(), "running")) { +                                            sender.sendMessage(ChatColor.RED + "A game is already running!"); +                                        } +                                        else { +                                            sender.sendMessage(ChatColor.RED + "Failed to recognize game of type " + ChatColor.GRAY + TumbleManager.getPlugin().getConfig().getString("gameMode")); +                                        }                                      } -                                    else if (Objects.equals(Game.getGame().getGameState(), "running")) { -                                        sender.sendMessage(ChatColor.RED + "A game is already running!"); -                                    } -                                    else { -                                        sender.sendMessage(ChatColor.RED + "Failed to recognize game of type " + ChatColor.GRAY + TumbleManager.getPlugin().getConfig().getString("gameMode")); +                                } +                                // If there was an argument for gameType, pass that into the startGame method +                                else { +                                    if (!Game.getGame().startGame(args[0])) { +                                        // Sender feedback for if the game failed to start +                                        if (Objects.equals(Game.getGame().getGameState(), "starting")) { +                                            sender.sendMessage(ChatColor.RED + "A game is already starting!"); +                                        } +                                        else if (Objects.equals(Game.getGame().getGameState(), "running")) { +                                            sender.sendMessage(ChatColor.RED + "A game is already running!"); +                                        } +                                        else { +                                            sender.sendMessage(ChatColor.RED + "Failed to recognize game of type " + ChatColor.GRAY + args[0]); +                                        }                                      }                                  }                              } -                            // If there was an argument for gameType, pass that into the startGame method +                            // If load was unsuccessful, give feedback +                            // Note: this should not occur unless the config file was edited externally, +                            // because the plugin prevents adding "worlds" that are not actually present to the config.                              else { -                                if (!Game.getGame().startGame(args[0])) { -                                    // Sender feedback for if the game failed to start -                                    if (Objects.equals(Game.getGame().getGameState(), "starting")) { -                                        sender.sendMessage(ChatColor.RED + "A game is already starting!"); -                                    } -                                    else if (Objects.equals(Game.getGame().getGameState(), "running")) { -                                        sender.sendMessage(ChatColor.RED + "A game is already running!"); -                                    } -                                    else { -                                        sender.sendMessage(ChatColor.RED + "Failed to recognize game of type " + ChatColor.GRAY + args[0]); -                                    } -                                } +                                sender.sendMessage(ChatColor.RED + "Failed to find a world named " + ChatColor.GRAY + TumbleManager.getGameWorld()); +                                sender.sendMessage(ChatColor.RED + "Is the configuration file correct?");                              }                          } -                        // If load was unsuccessful, give feedback -                        // Note: this should not occur unless the config file was edited externally, -                        // because the plugin prevents adding "worlds" that are not actually present to the config.                          else { -                            sender.sendMessage(ChatColor.RED + "Failed to find a world named " + ChatColor.GRAY + TumbleManager.getGameWorld()); -                            sender.sendMessage(ChatColor.RED + "Is the configuration file correct?"); +                            sender.sendMessage(ChatColor.RED + "A game is already queued to begin!");                          }                      }                      // Feedback for if there is no gameWorld in the config | 
