diff options
7 files changed, 53 insertions, 46 deletions
diff --git a/src/main/java/com/MylesAndMore/Tumble/commands/ForceStart.java b/src/main/java/com/MylesAndMore/Tumble/commands/ForceStart.java index a862268..bdead44 100644 --- a/src/main/java/com/MylesAndMore/Tumble/commands/ForceStart.java +++ b/src/main/java/com/MylesAndMore/Tumble/commands/ForceStart.java @@ -34,7 +34,7 @@ public class ForceStart implements CommandExecutor, TabCompleter { game = ConfigManager.arenas.get(args[0]).game; } - game.startGame(); + game.gameStart(); sender.sendMessage(ChatColor.GREEN + "Starting game"); return true; } diff --git a/src/main/java/com/MylesAndMore/Tumble/commands/ForceStop.java b/src/main/java/com/MylesAndMore/Tumble/commands/ForceStop.java index d862586..ddd5826 100644 --- a/src/main/java/com/MylesAndMore/Tumble/commands/ForceStop.java +++ b/src/main/java/com/MylesAndMore/Tumble/commands/ForceStop.java @@ -39,7 +39,7 @@ public class ForceStop implements CommandExecutor, TabCompleter { return false; } - game.killGame(); + game.gameEnd(); sender.sendMessage(ChatColor.GREEN + "Game stopped."); return true; } diff --git a/src/main/java/com/MylesAndMore/Tumble/commands/Join.java b/src/main/java/com/MylesAndMore/Tumble/commands/Join.java index 4dd4ef8..de44da1 100644 --- a/src/main/java/com/MylesAndMore/Tumble/commands/Join.java +++ b/src/main/java/com/MylesAndMore/Tumble/commands/Join.java @@ -74,9 +74,15 @@ public class Join implements CommandExecutor, TabCompleter { if (arena.game == null) { game = arena.game = new Game(arena, type); } - else { - sender.sendMessage(ChatColor.RED + "A game of "+type+" is currently taking place in this arena, choose another arena or join it with /tumble:join "+arena.name+" "+type); - return false; + else + { + if (arena.game.type == type) { + game = arena.game; + } + else { + sender.sendMessage(ChatColor.RED + "A game of "+type+" is currently taking place in this arena, choose another arena or join it with /tumble:join "+arena.name+" "+type); + return false; + } } } diff --git a/src/main/java/com/MylesAndMore/Tumble/commands/Reload.java b/src/main/java/com/MylesAndMore/Tumble/commands/Reload.java index a19b04b..ca67a2e 100644 --- a/src/main/java/com/MylesAndMore/Tumble/commands/Reload.java +++ b/src/main/java/com/MylesAndMore/Tumble/commands/Reload.java @@ -25,7 +25,7 @@ public class Reload implements CommandExecutor, TabCompleter { for (Arena a : ConfigManager.arenas.values()) { if (a.game != null) { - a.game.killGame(); + a.game.gameEnd(); } } diff --git a/src/main/java/com/MylesAndMore/Tumble/game/Game.java b/src/main/java/com/MylesAndMore/Tumble/game/Game.java index 9bb2bc8..113a5cd 100644 --- a/src/main/java/com/MylesAndMore/Tumble/game/Game.java +++ b/src/main/java/com/MylesAndMore/Tumble/game/Game.java @@ -26,9 +26,10 @@ public class Game { public final GameType type; public final Arena arena; public final World gameWorld; - public final List<Player> gamePlayers = new ArrayList<>(); private final Location gameSpawn; + public final List<Player> gamePlayers = new ArrayList<>(); private final HashMap<Player, Integer> gameWins = new HashMap<>(); + private final HashMap<Player, ItemStack[]> inventories = new HashMap<>(); public GameState gameState = GameState.WAITING; public GameType roundType; private int gameID = -1; @@ -47,7 +48,7 @@ public class Game { /** * Creates a new Game */ - public void startGame() { + public void gameStart() { // Check if the game is starting or running if (gameState != GameState.WAITING) { @@ -72,6 +73,7 @@ public class Game { scatterPlayers(gamePlayers); // Put all players in spectator to prevent them from getting kicked for flying setGamemode(gamePlayers, GameMode.SPECTATOR); + Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(plugin, () -> setGamemode(gamePlayers, GameMode.SPECTATOR), 10); clearInventories(gamePlayers); clearArena(); prepareGameType(type); @@ -126,7 +128,7 @@ public class Game { } /** - * Round end stuff: Finds and displays winner, starts next round if necessary + * Ends round: Finds and displays winner, starts next round if necessary */ private void roundEnd() { // Cancel the tasks that auto-end the round @@ -159,60 +161,51 @@ public class Game { } /** - * Game end stuff: Displays overall winner and teleports players to lobby + * Ends game: Displays overall winner and teleports players to lobby */ - private void gameEnd() { + public void gameEnd() { if (!gamePlayers.isEmpty()) { - Bukkit.getServer().getScheduler().cancelTask(gameID); - gameID = -1; - Bukkit.getServer().getScheduler().cancelTask(autoStartID); - autoStartID = -1; - Player winner = getPlayerWithMostWins(gameWins); + setGamemode(gamePlayers, GameMode.SPECTATOR); clearInventories(gamePlayers); + + Player winner = getPlayerWithMostWins(gameWins); if (winner != null) { displayTitles(gamePlayers, ChatColor.RED + "Game over!", ChatColor.GOLD + winner.getName() + " has won the game!", 5, 60, 5); } displayActionbar(gamePlayers, ChatColor.BLUE + "Returning to lobby in ten seconds..."); + // Wait 10s (200t), then Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(plugin, () -> { - // First, check to see if there is a separate location to tp the winner to + clearArena(); - if (ConfigManager.winnerLobby != null && winner != null) { - winner.teleport(ConfigManager.winnerLobby); - // Remove the winner from the game so they don't get double-tp'd - gamePlayers.remove(winner); - } - // Send all players back to lobby (spawn) - for (Player aPlayer : gamePlayers) { - aPlayer.teleport(Objects.requireNonNull(ConfigManager.lobby)); + + for (Player p : gamePlayers) { + // Restore inventories + if (inventories.containsKey(p)) { + p.getInventory().setContents(inventories.get(p)); + } + + if (p == winner && ConfigManager.winnerLobby != null) { + p.teleport(ConfigManager.winnerLobby); + } + else { + p.teleport(Objects.requireNonNull(ConfigManager.lobby)); + } } + }, 200); } - HandlerList.unregisterAll(eventListener); - arena.game = null; - } - - /** - * Force stops a game - */ - public void killGame() { Bukkit.getServer().getScheduler().cancelTask(gameID); gameID = -1; Bukkit.getServer().getScheduler().cancelTask(autoStartID); autoStartID = -1; HandlerList.unregisterAll(eventListener); - clearInventories(gamePlayers); - for (Player aPlayer : gamePlayers) { - if (aPlayer.getWorld().equals(arena.world)) { - aPlayer.teleport(Objects.requireNonNull(ConfigManager.lobby)); - } - } arena.game = null; } /** - * Removes a player from the game + * Removes a player from the game. * Called when a player leaves the server, or if they issue the leave command * @param p Player to remove */ @@ -222,13 +215,24 @@ public class Game { gameEnd(); } p.getInventory().clear(); + if (inventories.containsKey(p)) { + p.getInventory().setContents(inventories.get(p)); + } p.teleport(ConfigManager.lobby); } + /** + * Adds a player to the wait area. Called from /tumble-join + * Precondition: the game is in state WAITING + * @param p Player to add + */ public void addPlayer(Player p) { gamePlayers.add(p); + // save inventory + inventories.put(p, p.getInventory().getContents()); if (ConfigManager.waitArea != null) { p.teleport(ConfigManager.waitArea); + p.getInventory().clear(); } if (gamePlayers.size() >= 2 && gameState == GameState.WAITING) { autoStart(); @@ -248,7 +252,7 @@ public class Game { displayActionbar(gamePlayers, ChatColor.GREEN + "Game will begin in "+waitDuration+" seconds!"); playSound(gamePlayers, 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(plugin, this::startGame, waitDuration * 20L); + autoStartID = Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(plugin, this::gameStart, waitDuration * 20L); }, 50); } @@ -288,9 +292,7 @@ public class Game { new Location(gameWorld, (x + 11.5), y, (z + 11.5), 135, 0))); Collections.shuffle(scatterLocations); for (Player aPlayer : players) { - if (!aPlayer.teleport(scatterLocations.get(0))) { - plugin.getLogger().info("dbg: FAILED TELEPORT"); - } + aPlayer.teleport(scatterLocations.get(0)); scatterLocations.remove(0); // Remove that location so multiple players won't get the same one } } diff --git a/src/main/java/com/MylesAndMore/Tumble/game/Layers.java b/src/main/java/com/MylesAndMore/Tumble/game/Layers.java index 9c60393..05e289a 100644 --- a/src/main/java/com/MylesAndMore/Tumble/game/Layers.java +++ b/src/main/java/com/MylesAndMore/Tumble/game/Layers.java @@ -190,7 +190,6 @@ public class Layers { add(Material.REDSTONE_BLOCK); add(Material.REDSTONE_LAMP); add(Material.TARGET); - add(Material.PISTON); add(Material.SLIME_BLOCK); add(Material.OBSERVER); }}; diff --git a/src/main/java/com/MylesAndMore/Tumble/plugin/ConfigManager.java b/src/main/java/com/MylesAndMore/Tumble/plugin/ConfigManager.java index 855e755..c4c1943 100644 --- a/src/main/java/com/MylesAndMore/Tumble/plugin/ConfigManager.java +++ b/src/main/java/com/MylesAndMore/Tumble/plugin/ConfigManager.java @@ -120,7 +120,7 @@ public class ConfigManager { double x = section.getDouble("x"); double y = section.getDouble("y"); - double z = section.getDouble("x"); + double z = section.getDouble("z"); if (x == 0 || y == 0 || z == 0) { return new Result<>("Arena coordinates are missing or are zero. Coordinates cannot be zero."); } |