aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsowgro <tpoke.ferrari@gmail.com>2024-07-03 01:34:15 -0400
committersowgro <tpoke.ferrari@gmail.com>2024-07-03 01:34:15 -0400
commit8493680d8b53604acf3775ae8176ea6b8a9751a6 (patch)
tree5f2a1600ddab3e38d52d2244f4a2377073031c7d /src
parenteb36fc31873f1b2479b11d9f2612c15df4082d1b (diff)
downloadTumble-8493680d8b53604acf3775ae8176ea6b8a9751a6.tar.gz
Tumble-8493680d8b53604acf3775ae8176ea6b8a9751a6.tar.bz2
Tumble-8493680d8b53604acf3775ae8176ea6b8a9751a6.zip
More code clean up and comments
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/MylesAndMore/Tumble/Main.java11
-rw-r--r--src/main/java/com/MylesAndMore/Tumble/commands/ForceStart.java5
-rw-r--r--src/main/java/com/MylesAndMore/Tumble/commands/Join.java9
-rw-r--r--src/main/java/com/MylesAndMore/Tumble/game/EventListener.java135
-rw-r--r--src/main/java/com/MylesAndMore/Tumble/game/Game.java4
-rw-r--r--src/main/java/com/MylesAndMore/Tumble/game/Layers.java4
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);