diff options
author | sowgro <tpoke.ferrari@gmail.com> | 2024-07-03 01:34:15 -0400 |
---|---|---|
committer | sowgro <tpoke.ferrari@gmail.com> | 2024-07-03 01:34:15 -0400 |
commit | 8493680d8b53604acf3775ae8176ea6b8a9751a6 (patch) | |
tree | 5f2a1600ddab3e38d52d2244f4a2377073031c7d /src | |
parent | eb36fc31873f1b2479b11d9f2612c15df4082d1b (diff) | |
download | Tumble-8493680d8b53604acf3775ae8176ea6b8a9751a6.tar.gz Tumble-8493680d8b53604acf3775ae8176ea6b8a9751a6.tar.bz2 Tumble-8493680d8b53604acf3775ae8176ea6b8a9751a6.zip |
More code clean up and comments
Diffstat (limited to 'src')
6 files changed, 93 insertions, 75 deletions
diff --git a/src/main/java/com/MylesAndMore/Tumble/Main.java b/src/main/java/com/MylesAndMore/Tumble/Main.java index e4c9452..ca1c4f7 100644 --- a/src/main/java/com/MylesAndMore/Tumble/Main.java +++ b/src/main/java/com/MylesAndMore/Tumble/Main.java @@ -5,6 +5,7 @@ import com.MylesAndMore.Tumble.config.ArenaManager; import com.MylesAndMore.Tumble.config.ConfigManager; import com.MylesAndMore.Tumble.config.LanguageManager; +import com.MylesAndMore.Tumble.game.Arena; import org.bstats.bukkit.Metrics; import org.bukkit.Bukkit; @@ -32,4 +33,14 @@ public class Main extends JavaPlugin{ Bukkit.getServer().getLogger().info("[Tumble] Tumble successfully enabled!"); } + + @Override + public void onDisable() { + // stop running games + for (Arena a : arenaManager.arenas.values()) { + if (a.game != null) { + a.game.stopGame(); + } + } + } }
\ No newline at end of file diff --git a/src/main/java/com/MylesAndMore/Tumble/commands/ForceStart.java b/src/main/java/com/MylesAndMore/Tumble/commands/ForceStart.java index d05155d..121b946 100644 --- a/src/main/java/com/MylesAndMore/Tumble/commands/ForceStart.java +++ b/src/main/java/com/MylesAndMore/Tumble/commands/ForceStart.java @@ -1,6 +1,7 @@ package com.MylesAndMore.Tumble.commands; import com.MylesAndMore.Tumble.game.Game; +import com.MylesAndMore.Tumble.plugin.GameState; import com.MylesAndMore.Tumble.plugin.SubCommand; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -53,6 +54,10 @@ public class ForceStart implements SubCommand, CommandExecutor, TabCompleter { return false; } + if (game.gameState != GameState.WAITING) { + return false; + } + game.gameStart(); sender.sendMessage(languageManager.fromKey("forcestart-success")); 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 3989960..6b5494d 100644 --- a/src/main/java/com/MylesAndMore/Tumble/commands/Join.java +++ b/src/main/java/com/MylesAndMore/Tumble/commands/Join.java @@ -59,16 +59,17 @@ public class Join implements SubCommand, CommandExecutor, TabCompleter { Game game; if (args.length < 2 || args[1] == null) { - // try to infer game type from game taking place in the arena + // no type specified: try to infer game type from game taking place in the arena if (arena.game == null) { + // cant infer if no game is taking place sender.sendMessage(languageManager.fromKey("specify-game-type")); return false; } - else { - game = arena.game; - } + + game = arena.game; } else { + // type specified GameType type; switch (args[1]) { case "shovels", "shovel" -> type = GameType.SHOVELS; diff --git a/src/main/java/com/MylesAndMore/Tumble/game/EventListener.java b/src/main/java/com/MylesAndMore/Tumble/game/EventListener.java index 1bc31b3..28fd314 100644 --- a/src/main/java/com/MylesAndMore/Tumble/game/EventListener.java +++ b/src/main/java/com/MylesAndMore/Tumble/game/EventListener.java @@ -27,28 +27,23 @@ import static com.MylesAndMore.Tumble.Main.plugin; * An event listener for a game of tumble. */ public class EventListener implements Listener { - World gameWorld; Game game; /** - * Create a new EventListener + * Create a new EventListener for a game. + * This should be active when the game starts (not while it is waiting) * @param game The game that the EventListener belongs to. */ public EventListener(Game game) { this.game = game; - this.gameWorld = game.arena.gameSpawn.getWorld(); } - + @EventHandler public void PlayerJoinEvent(PlayerJoinEvent event) { // Hide/show join message accordingly if (configManager.HideLeaveJoin) { event.setJoinMessage(null); } - if (event.getPlayer().getWorld() == gameWorld) { - // Send the player back to the lobby if they try to join in the middle of a game - event.getPlayer().teleport(Objects.requireNonNull(game.arena.lobby)); - } } @EventHandler @@ -57,15 +52,17 @@ public class EventListener implements Listener { if (configManager.HideLeaveJoin) { event.setQuitMessage(null); } - if (event.getPlayer().getWorld() == gameWorld) { - event.getPlayer().teleport(game.arena.lobby); + + // remove player from game if they leave during a game + if (game.gamePlayers.contains(event.getPlayer())) { game.removePlayer(event.getPlayer()); } } @EventHandler public void PlayerDeathEvent(PlayerDeathEvent event) { - if (game.gamePlayers.contains(event.getEntity())) { + // inform the game that the player died and respawn them + if (game.gamePlayers.contains(event.getEntity()) && game.gameState == GameState.RUNNING) { game.playerDeath(event.getEntity()); Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(plugin, () -> event.getEntity().spigot().respawn(), 10); } @@ -74,51 +71,47 @@ public class EventListener implements Listener { @EventHandler public void PlayerItemDamageEvent(PlayerItemDamageEvent event) { // Remove item damage within games - if (event.getPlayer().getWorld() == gameWorld) { + if (game.gamePlayers.contains(event.getPlayer()) && game.gameState == GameState.RUNNING) { event.setCancelled(true); } } @EventHandler public void ProjectileLaunchEvent(ProjectileLaunchEvent event) { - if (game.roundType != GameType.SNOWBALLS) { return; } - if (event.getEntity().getWorld() == gameWorld - && event.getEntity() instanceof Snowball - && event.getEntity().getShooter() instanceof Player player) { + if (!(event.getEntity().getShooter() instanceof Player p)) { return; } + if (!game.gamePlayers.contains(p)) { return; } - // Prevent projectiles (snowballs) from being thrown before the game starts - if (Objects.equals(game.gameState, GameState.STARTING)) { - event.setCancelled(true); - } - else { + if (game.roundType == GameType.SNOWBALLS && event.getEntity() instanceof Snowball) { + if (game.gameState == GameState.RUNNING) { // Give players a snowball when they've used one (infinite snowballs) - Bukkit.getServer().getScheduler().runTask(plugin, () -> player.getInventory().addItem(new ItemStack(Material.SNOWBALL, 1))); + Bukkit.getServer().getScheduler().runTask(plugin, () -> p.getInventory().addItem(new ItemStack(Material.SNOWBALL, 1))); + } else { + // Prevent projectiles (snowballs) from being thrown before the game starts + event.setCancelled(true); } } } @EventHandler public void ProjectileHitEvent(ProjectileHitEvent event) { - if (event.getHitBlock() == null || game.roundType != GameType.SNOWBALLS) { return; } + if (!(event.getEntity().getShooter() instanceof Player p)) { return; } + if (!game.gamePlayers.contains(p)) { return; } + // Removes blocks that snowballs thrown by players have hit in the game world - if (event.getHitBlock().getWorld() == gameWorld) { - if (event.getEntity() instanceof Snowball) { - if (event.getEntity().getShooter() instanceof Player p) { - if (event.getHitBlock() != null) { - if (event.getHitBlock().getLocation().distanceSquared(Objects.requireNonNull(game.arena.gameSpawn)) < 579) { - p.playEffect( - event.getHitBlock().getLocation(), - Effect.STEP_SOUND, - event.getHitBlock().getType()); - event.getHitBlock().setType(Material.AIR); - } - } - else if (event.getHitEntity() != null) { - if (event.getHitEntity() instanceof Player hitPlayer) { - // Also cancel any knockback - Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(plugin, () -> hitPlayer.setVelocity(new Vector())); - } - } + if (game.roundType == GameType.SNOWBALLS && event.getEntity() instanceof Snowball) { + if (event.getHitBlock() != null) { + if (event.getHitBlock().getLocation().distanceSquared(game.arena.gameSpawn) < 579) { + p.playEffect( + event.getHitBlock().getLocation(), + Effect.STEP_SOUND, + event.getHitBlock().getType()); + event.getHitBlock().setType(Material.AIR); + } + } + else if (event.getHitEntity() != null) { + if (event.getHitEntity() instanceof Player hitPlayer) { + // Also cancel any knockback + Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(plugin, () -> hitPlayer.setVelocity(new Vector())); } } } @@ -126,22 +119,21 @@ public class EventListener implements Listener { @EventHandler public void PlayerDropItemEvent(PlayerDropItemEvent event) { - // Don't allow items to drop in the game world - if (event.getPlayer().getWorld() == gameWorld) { + // Don't allow items to drop during the game + if (game.gamePlayers.contains(event.getPlayer())) { event.setCancelled(true); } } @EventHandler public void PlayerMoveEvent(PlayerMoveEvent event) { + if (!game.gamePlayers.contains(event.getPlayer())) { return; } // Cancel movement if the game is starting (so players can't move before the game starts) - if (Objects.equals(game.gameState, GameState.STARTING) - && event.getPlayer().getWorld().equals(gameWorld) - && !equalPosition(event.getFrom(),event.getTo())) { + if (Objects.equals(game.gameState, GameState.STARTING) && !equalPosition(event.getFrom(),event.getTo())) { event.setCancelled(true); } // kill player if they are below a Y level - if (event.getPlayer().getWorld().equals(gameWorld) && game.arena.killAtY != null) { + if (game.arena.killAtY != null && game.gameState == GameState.RUNNING) { if (event.getPlayer().getLocation().getY() <= game.arena.killAtY) { event.getPlayer().setHealth(0); } @@ -151,17 +143,17 @@ public class EventListener implements Listener { @EventHandler public void BlockDropItemEvent(BlockDropItemEvent event) { // If a block was going to drop an item (ex. snow dropping snowballs) in the game world, cancel it - if (event.getBlock().getWorld() == gameWorld) { + if (event.getBlock().getWorld() == game.arena.gameSpawn.getWorld()) { event.setCancelled(true); } } @EventHandler public void PlayerInteractEvent(PlayerInteractEvent event) { -// if (game.roundType != GameType.SHOVELS) {return;} - // Remove blocks when clicked in the game world (all gamemodes require this functionality) - if (event.getAction() == Action.LEFT_CLICK_BLOCK - && Objects.requireNonNull(event.getClickedBlock()).getWorld() == gameWorld) { + if (!game.gamePlayers.contains(event.getPlayer())) { return; } + + // Remove blocks when clicked in the game world (all game types require this functionality) + if (event.getAction() == Action.LEFT_CLICK_BLOCK && event.getClickedBlock() != null) { event.getPlayer().playEffect( event.getClickedBlock().getLocation(), Effect.STEP_SOUND, @@ -175,38 +167,38 @@ public class EventListener implements Listener { public void BlockBreakEvent(BlockBreakEvent event) { // This just doesn't allow blocks to break in the gameWorld; the PlayerInteractEvent will take care of everything // This prevents any weird client-server desync - if (event.getBlock().getWorld() == gameWorld) { + if (game.gamePlayers.contains(event.getPlayer())) { event.setCancelled(true); } } @EventHandler public void FoodLevelChangeEvent(FoodLevelChangeEvent event) { + if (!(event.getEntity() instanceof Player p)) { return; } + if (!game.gamePlayers.contains(p)) { return; } // INFINITE FOOD (YAY!!!!) - if (event.getEntity().getWorld() == gameWorld) { - event.setCancelled(true); - } + event.setCancelled(true); } @EventHandler public void EntityDamageEvent(EntityDamageEvent event) { + if (!(event.getEntity() instanceof Player p)) { return; } + if (!game.gamePlayers.contains(p)) { return; } + // Check to see if a player got damaged by another entity (player, snowball, etc) in the gameWorld, if so, cancel it - if (event.getEntity().getWorld() == gameWorld) { - if (event.getEntity() instanceof Player) { - if (event.getCause() == EntityDamageEvent.DamageCause.ENTITY_ATTACK - || event.getCause() == EntityDamageEvent.DamageCause.ENTITY_SWEEP_ATTACK - || event.getCause() == EntityDamageEvent.DamageCause.FALL) { - event.setCancelled(true); - } - } + if (event.getCause() == EntityDamageEvent.DamageCause.ENTITY_ATTACK + || event.getCause() == EntityDamageEvent.DamageCause.ENTITY_SWEEP_ATTACK + || event.getCause() == EntityDamageEvent.DamageCause.FALL) { + event.setCancelled(true); } } @EventHandler public void InventoryDragEvent(InventoryDragEvent event) { - if (event.getWhoClicked().getWorld() == gameWorld) { - event.setCancelled(true); - } + if (!(event.getWhoClicked() instanceof Player p)) { return; } + if (!game.gamePlayers.contains(p)) { return; } + // Disable inventory dragging + event.setCancelled(true); } @EventHandler @@ -217,8 +209,13 @@ public class EventListener implements Listener { } } - // TODO: stop tile drops for pistons, stop player from getting stuck in the waiting area after they leave - + /** + * Check to see if two locations are in the same place. + * A location also includes where the player is facing which is why this is used instead of .equals() + * @param l1 The first location + * @param l2 The second location + * @return True if they are in the same place + */ public static boolean equalPosition(Location l1, @Nullable Location l2) { if (l2 == null) { return true; diff --git a/src/main/java/com/MylesAndMore/Tumble/game/Game.java b/src/main/java/com/MylesAndMore/Tumble/game/Game.java index e32ba92..f46d907 100644 --- a/src/main/java/com/MylesAndMore/Tumble/game/Game.java +++ b/src/main/java/com/MylesAndMore/Tumble/game/Game.java @@ -226,6 +226,8 @@ public class Game { // teleport player back and restore inventory for (Player p : gamePlayers) { + p.getInventory().clear(); + p.setGameMode(GameMode.SURVIVAL); if (p == winner && arena.winnerLobby != null) { p.teleport(arena.winnerLobby); } @@ -283,6 +285,7 @@ public class Game { // teleport player back and restore inventory if (arena.waitArea != null) { p.getInventory().clear(); + p.setGameMode(GameMode.SURVIVAL); p.teleport(arena.lobby); if (inventories.containsKey(p)) { p.getInventory().setContents(inventories.get(p)); @@ -297,6 +300,7 @@ public class Game { // teleport player back and restore inventory p.getInventory().clear(); + p.setGameMode(GameMode.SURVIVAL); p.teleport(arena.lobby); if (inventories.containsKey(p)) { p.getInventory().setContents(inventories.get(p)); diff --git a/src/main/java/com/MylesAndMore/Tumble/game/Layers.java b/src/main/java/com/MylesAndMore/Tumble/game/Layers.java index 05e289a..99f3aef 100644 --- a/src/main/java/com/MylesAndMore/Tumble/game/Layers.java +++ b/src/main/java/com/MylesAndMore/Tumble/game/Layers.java @@ -146,13 +146,13 @@ public class Layers { List<Material> gen3 = new ArrayList<>() {{ add(Material.PACKED_ICE); add(Material.PACKED_ICE); - add(Material.NOTE_BLOCK); + add(Material.JUKEBOX); add(Material.TNT); add(Material.LIGHT_BLUE_CONCRETE); add(Material.GLASS); add(Material.PACKED_ICE); add(Material.PACKED_ICE); - add(Material.NOTE_BLOCK); + add(Material.JUKEBOX); add(Material.TNT); add(Material.LIGHT_BLUE_CONCRETE); add(Material.GLASS); |