From c4fc5e933f3651dd4ee9431d19bb70f3eef5abb8 Mon Sep 17 00:00:00 2001 From: Myles <43725835+MylesAndMore@users.noreply.github.com> Date: Fri, 2 Dec 2022 14:37:53 -0600 Subject: begin the game object (eventual replacement for gamemanager) also added another field in the TumbleManager for getting the game type --- src/main/java/com/MylesAndMore/tumble/Game.java | 99 +++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 src/main/java/com/MylesAndMore/tumble/Game.java (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java new file mode 100644 index 0000000..dcc3a78 --- /dev/null +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -0,0 +1,99 @@ +package com.MylesAndMore.tumble; + +import com.MylesAndMore.tuble.TumbleManager; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.Location; +import org.bukkit.World; + +import Java.util.Arrays; +import Java.util.Collections; +import Java.util.List; + +public final class Game { + // Define the gameInstnace + private static Game gameInstance; + + // Private Game() constructor for singleton instance + private Game() { } + + // Other priate methods for getters and setters go here + + // Define local game vars + // The gameType keeps the current game type (shocker) + String gameType = null; + + // Creates a new Game + // This will return true if the game succeeds creation, and false if not + private static boolean createGame() { + if (Objects.equals(TumbleManager.getGameType(), "shovels")) { + // shovels logic + gameType = "shovels" + } + else if (Objects.equals(TumbleManager.getGameType(), "snowballs")) { + // snowballs + gameType = "snowballs" + } + else if (Objects.equals(TumbleManager.getGameType(), "mixed")) { + // mixed (choose random shovels or snowballs) + gameType = "mixed" + } + else { + // The game type in the config did not match a specified game type; return false to signify that + return false; + } + return true; + } + + private static boolean sendPlayers() { + World gameWorld = Bukkit.getWorld(TumbleManager.getGameWorld()); + // Define the game world's spawnpoint as a new Location + Location gameSpawn = new Location(gameWorld.getSpawnLocation()); + // Get the X, Y, and Z coords of that location + Location x = gameSpawn.getX(); + Location y = gameSpawn.getY(); + Location z = gameSpawn.getZ(); + // Create Locations to scatter players around the first layer + // These are just edited off the original spawn location; + // they assume that the first layer has a radius of 17 blocks (it always will w/ the current generator code) + List scatterLocations = Arrays.asList( + new Location(gameWorld, (x - 16), y, z); + new Location(gameWorld, x, y, (z - 16)); + new Location(gameWorld, (x + 16), y, z);; + new Location(gameWorld, x, y, (z + 16)) + ); + // Shuffle the location list so players don't always spawn in the same location (basically, actually scatter the locations) + Collections.shuffle(scatterLocations); + // While there are still players in the lobby, send them to the gameWorld + // This is just a way of sending everybody in the lobby to the game + for (List playersInLobby = TumbleManager.getPlayersInLobby(); playersInLobby.size() > 0; playersInLobby = TumbleManager.getPlayersInLobby() & scatterLoations.remove(0)) { + // Get a singular player from the player list + Player aPlayer = playersInLobby.get(0); + // Get a singular location from the scatter list + Location aLocation = scatterLoations.get(0); + // Teleport that player to that scatter location + aPlayer.teleport(aLocation); + } + + // Add a little break because it can take the clients a bit to load into the new world + // Then, transition to another method because this one is getting really long + // In that method: set a flag to monitor the playerDeathEvent so we know when all the players have died + // Also start music + } + + + + // Public method to get the game instance (singleton logic) + public static Game getGame() { + if (gameInstance == null) { + gameInstance = new Game(); + } + return gameInstance; + } + + // Public method to get the game type + // This is public because you aren't modifying the game, just getting its type, so there shouldn't be any conflicts + public static String getGameType() { + return gameType; + } +} \ No newline at end of file -- cgit v1.2.3 From fc6d55c3fcdc23c841d0e61f1e9f46b04a815c95 Mon Sep 17 00:00:00 2001 From: Myles <43725835+MylesAndMore@users.noreply.github.com> Date: Fri, 2 Dec 2022 14:48:56 -0600 Subject: VARIABLE TYPES --- src/main/java/com/MylesAndMore/tumble/Game.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index dcc3a78..6135cfd 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -50,9 +50,9 @@ public final class Game { // Define the game world's spawnpoint as a new Location Location gameSpawn = new Location(gameWorld.getSpawnLocation()); // Get the X, Y, and Z coords of that location - Location x = gameSpawn.getX(); - Location y = gameSpawn.getY(); - Location z = gameSpawn.getZ(); + int x = gameSpawn.getX(); + int y = gameSpawn.getY(); + int z = gameSpawn.getZ(); // Create Locations to scatter players around the first layer // These are just edited off the original spawn location; // they assume that the first layer has a radius of 17 blocks (it always will w/ the current generator code) -- cgit v1.2.3 From 1bd5aeeadf2449fcadcf78641f086e5d285d5bae Mon Sep 17 00:00:00 2001 From: Myles Date: Fri, 2 Dec 2022 19:27:54 -0600 Subject: I CANT DO THIS by that I mean editing without an ide seriously the chromebook is AWFUL :(((( --- src/main/java/com/MylesAndMore/tumble/Game.java | 42 ++++++++++++------------- 1 file changed, 21 insertions(+), 21 deletions(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index 6135cfd..2161e2f 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -1,17 +1,18 @@ package com.MylesAndMore.tumble; -import com.MylesAndMore.tuble.TumbleManager; +import com.MylesAndMore.tumble.TumbleManager; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.Location; import org.bukkit.World; -import Java.util.Arrays; -import Java.util.Collections; -import Java.util.List; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Objects; public final class Game { - // Define the gameInstnace + // Define the gameInstance private static Game gameInstance; // Private Game() constructor for singleton instance @@ -21,22 +22,22 @@ public final class Game { // Define local game vars // The gameType keeps the current game type (shocker) - String gameType = null; + static String gameType = null; // Creates a new Game // This will return true if the game succeeds creation, and false if not private static boolean createGame() { if (Objects.equals(TumbleManager.getGameType(), "shovels")) { // shovels logic - gameType = "shovels" + gameType = "shovels"; } else if (Objects.equals(TumbleManager.getGameType(), "snowballs")) { // snowballs - gameType = "snowballs" + gameType = "snowballs"; } else if (Objects.equals(TumbleManager.getGameType(), "mixed")) { // mixed (choose random shovels or snowballs) - gameType = "mixed" + gameType = "mixed"; } else { // The game type in the config did not match a specified game type; return false to signify that @@ -45,32 +46,31 @@ public final class Game { return true; } - private static boolean sendPlayers() { + private static void sendPlayers() { World gameWorld = Bukkit.getWorld(TumbleManager.getGameWorld()); // Define the game world's spawnpoint as a new Location - Location gameSpawn = new Location(gameWorld.getSpawnLocation()); + Location gameSpawn = gameWorld.getSpawnLocation(); // Get the X, Y, and Z coords of that location - int x = gameSpawn.getX(); - int y = gameSpawn.getY(); - int z = gameSpawn.getZ(); + double x = gameSpawn.getX(); + double y = gameSpawn.getY(); + double z = gameSpawn.getZ(); // Create Locations to scatter players around the first layer // These are just edited off the original spawn location; // they assume that the first layer has a radius of 17 blocks (it always will w/ the current generator code) List scatterLocations = Arrays.asList( - new Location(gameWorld, (x - 16), y, z); - new Location(gameWorld, x, y, (z - 16)); - new Location(gameWorld, (x + 16), y, z);; - new Location(gameWorld, x, y, (z + 16)) - ); + new Location(gameWorld, (x - 16), y, z), + new Location(gameWorld, x, y, (z - 16)), + new Location(gameWorld, (x + 16), y, z), + new Location(gameWorld, x, y, (z + 16))); // Shuffle the location list so players don't always spawn in the same location (basically, actually scatter the locations) Collections.shuffle(scatterLocations); // While there are still players in the lobby, send them to the gameWorld // This is just a way of sending everybody in the lobby to the game - for (List playersInLobby = TumbleManager.getPlayersInLobby(); playersInLobby.size() > 0; playersInLobby = TumbleManager.getPlayersInLobby() & scatterLoations.remove(0)) { + for (List playersInLobby = TumbleManager.getPlayersInLobby(); playersInLobby.size() > 0; playersInLobby = TumbleManager.getPlayersInLobby(), scatterLocations.remove(0)) { // Get a singular player from the player list Player aPlayer = playersInLobby.get(0); // Get a singular location from the scatter list - Location aLocation = scatterLoations.get(0); + Location aLocation = scatterLocations.get(0); // Teleport that player to that scatter location aPlayer.teleport(aLocation); } -- cgit v1.2.3 From 19a24e3adc4b2117b68acdf3aad006349d79542a Mon Sep 17 00:00:00 2001 From: Myles Date: Fri, 2 Dec 2022 19:28:50 -0600 Subject: imagine spelling --- src/main/java/com/MylesAndMore/tumble/Game.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index 2161e2f..0f54021 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -1,6 +1,5 @@ package com.MylesAndMore.tumble; -import com.MylesAndMore.tumble.TumbleManager; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.Location; @@ -18,7 +17,7 @@ public final class Game { // Private Game() constructor for singleton instance private Game() { } - // Other priate methods for getters and setters go here + // Other private methods for getters and setters go here // Define local game vars // The gameType keeps the current game type (shocker) @@ -82,7 +81,6 @@ public final class Game { } - // Public method to get the game instance (singleton logic) public static Game getGame() { if (gameInstance == null) { -- cgit v1.2.3 From 3a8fcb3aaec9d1c43f9d7a2f04cdbfb5b43696b3 Mon Sep 17 00:00:00 2001 From: Myles Date: Fri, 2 Dec 2022 23:29:31 -0600 Subject: new Game management GameManager.java has been superseded by Game.java this is where the game will be managed from now on; created, scores tracked, ended, etc (this was way harder than it looks to code...) AND IT STILL DOESNT WORK AOIFHJRGRI HRSDO --- src/main/java/com/MylesAndMore/tumble/Game.java | 182 ++++++++++++++++++------ 1 file changed, 142 insertions(+), 40 deletions(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index 0f54021..aa86e12 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -1,54 +1,132 @@ package com.MylesAndMore.tumble; -import org.bukkit.Bukkit; +import com.MylesAndMore.tumble.api.Generator; +import org.bukkit.*; import org.bukkit.entity.Player; -import org.bukkit.Location; -import org.bukkit.World; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Objects; +import java.util.*; -public final class Game { +public class Game { + // Singleton class logic // Define the gameInstance private static Game gameInstance; // Private Game() constructor for singleton instance private Game() { } - // Other private methods for getters and setters go here - + // ONLY Public method to get the game instance + public static Game getGame() { + if (gameInstance == null) { + gameInstance = new Game(); + } + return gameInstance; + } + + + // Define local game vars // The gameType keeps the current game type (shocker) - static String gameType = null; + private String gameType = null; + // The gameState keeps the current state of the game (I'm so creative, I know) + private String gameState = null; + + // Initialize a new instance of the Random class for use later + private Random Random = new Random(); + // Define the game world and its spawnpoint as a new Location for use later + private World gameWorld = Bukkit.getWorld(TumbleManager.getGameWorld()); + private Location gameSpawn = gameWorld.getSpawnLocation(); + + // Make a list of the game's players for later + private List gamePlayers = null; // Creates a new Game // This will return true if the game succeeds creation, and false if not - private static boolean createGame() { + public boolean startGame() { + gameState = "starting"; if (Objects.equals(TumbleManager.getGameType(), "shovels")) { - // shovels logic + // Set the correct gameType for the game we're playing, for later gameType = "shovels"; + // Generate the correct layers for a Shovels game + // The else statement is just in case the generator fails; this command will fail + if (generateLayers(gameType)) { + // If the layer generation succeeds, give players diamond shovels + // Reminder: we need a way for blocks to break instantly and for these to not lose durability! + giveItems(new ItemStack(Material.DIAMOND_SHOVEL)); + // Send players to the game + sendPlayers(); + // Keep in mind that after this runs, this command will complete and return true + } + else { + return false; + } } else if (Objects.equals(TumbleManager.getGameType(), "snowballs")) { - // snowballs gameType = "snowballs"; + if (generateLayers(gameType)) { + // Reminder: we need a way to make this snowball infinite! + giveItems(new ItemStack(Material.SNOWBALL)); + sendPlayers(); + } + else { + return false; + } } else if (Objects.equals(TumbleManager.getGameType(), "mixed")) { - // mixed (choose random shovels or snowballs) gameType = "mixed"; + // Mixed gamemode (choose random shovels or snowballs) + if (Random.nextInt(2) == 0) { + generateLayers("shovels"); + giveItems(new ItemStack(Material.DIAMOND_SHOVEL)); + sendPlayers(); + } + else { + generateLayers("snowballs"); + giveItems(new ItemStack(Material.SNOWBALL)); + sendPlayers(); + } } else { // The game type in the config did not match a specified game type; return false to signify that return false; } + // Update the game's players for later + gamePlayers = new ArrayList<>(TumbleManager.getPlayersInGame()); + gameState = "running"; return true; } - private static void sendPlayers() { - World gameWorld = Bukkit.getWorld(TumbleManager.getGameWorld()); - // Define the game world's spawnpoint as a new Location - Location gameSpawn = gameWorld.getSpawnLocation(); + private boolean generateLayers(String gameType) { + Location layer = gameSpawn; + if (Objects.equals(gameType, "shovels")) { + layer.setY(layer.getY() - 1); + Generator.generateLayer(layer, 17, 1, Material.SNOW_BLOCK); + Generator.generateLayer(layer, 13, 1, Material.AIR); + layer.setY(layer.getY() - 1); + Generator.generateLayer(layer, 13, 1, Material.GRASS_BLOCK); + layer.setY(layer.getY() - 1); + Generator.generateLayer(layer, 4, 1, Material.PODZOL); + layer.setY(layer.getY() + 1); + Generator.generateLayer(layer, 4, 2, Material.GRASS); + } + else if (Objects.equals(gameType, "snowballs")) { + layer.setY(layer.getY() - 1); + Generator.generateLayer(layer, 17, 1, Material.COAL_ORE); + Generator.generateLayer(layer, 13, 1, Material.AIR); + layer.setY(layer.getY() - 1); + Generator.generateLayer(layer, 13, 1, Material.GRANITE); + Generator.generateLayer(layer, 4, 1, Material.AIR); + layer.setY(layer.getY() - 1); + Generator.generateLayer(layer, 4, 1, Material.LIME_GLAZED_TERRACOTTA); + } + else { + return false; + } + return true; + } + + private void sendPlayers() { // Get the X, Y, and Z coords of that location double x = gameSpawn.getX(); double y = gameSpawn.getY(); @@ -56,42 +134,66 @@ public final class Game { // Create Locations to scatter players around the first layer // These are just edited off the original spawn location; // they assume that the first layer has a radius of 17 blocks (it always will w/ the current generator code) - List scatterLocations = Arrays.asList( - new Location(gameWorld, (x - 16), y, z), - new Location(gameWorld, x, y, (z - 16)), - new Location(gameWorld, (x + 16), y, z), - new Location(gameWorld, x, y, (z + 16))); + List scatterLocations = new ArrayList<>(); + scatterLocations.addAll(List.of( + new Location(gameWorld, (x - 14.5), y, (z + 0.5) , -90, 0), + new Location(gameWorld, (x + 0.5), y, (z - 14.5), 0, 0), + new Location(gameWorld, (x + 15.5), y, (z + 0.5), 90, 0), + new Location(gameWorld, (x + 0.5), y, (z + 15.5), 180, 0 ), + new Location(gameWorld, (x - 10.5), y, (z - 10.5), -45, 0), + new Location(gameWorld, (x - 10.5), y, (z + 11.5), -135, 0), + new Location(gameWorld, (x + 11.5), y, (z - 10.5), 45, 0), + new Location(gameWorld, (x + 11.5), y, (z + 11.5), 135, 0)) + ); // Shuffle the location list so players don't always spawn in the same location (basically, actually scatter the locations) Collections.shuffle(scatterLocations); // While there are still players in the lobby, send them to the gameWorld // This is just a way of sending everybody in the lobby to the game - for (List playersInLobby = TumbleManager.getPlayersInLobby(); playersInLobby.size() > 0; playersInLobby = TumbleManager.getPlayersInLobby(), scatterLocations.remove(0)) { + for (Player aPlayer : TumbleManager.getPlayersInLobby()) { + //for (List playersInLobby = TumbleManager.getPlayersInLobby(); playersInLobby.size() > 0; playersInLobby = TumbleManager.getPlayersInLobby()) { // Get a singular player from the player list - Player aPlayer = playersInLobby.get(0); + //Player aPlayer = playersInLobby.get(0); // Get a singular location from the scatter list Location aLocation = scatterLocations.get(0); // Teleport that player to that scatter location aPlayer.teleport(aLocation); + // Remove that location from the list so that it cannot be used again + scatterLocations.remove(0); } + } - // Add a little break because it can take the clients a bit to load into the new world - // Then, transition to another method because this one is getting really long - // In that method: set a flag to monitor the playerDeathEvent so we know when all the players have died - // Also start music + public void playerDeath(@NotNull Player player) { + player.setGameMode(GameMode.SPECTATOR); + // If there are more than 2 players in the game, + if (gamePlayers.size() > 2) { + // remove that player (who just died) from the gamePlayersArray, effectively eliminating them, + gamePlayers.remove(player); + } + // otherwise, the game must have two people left (and one just died), meaning it is over + // This logic is so that it will not remove the last player standing from the list, so we know who the winner is. + else { + // End the game, passing the winner to the gameEnd method + gameEnd(gamePlayers.get(0)); + } } + private void gameEnd(@NotNull Player winner) { + Bukkit.getServer().broadcastMessage(ChatColor.GREEN + winner.getName() + " has won!"); + } - // Public method to get the game instance (singleton logic) - public static Game getGame() { - if (gameInstance == null) { - gameInstance = new Game(); + private void giveItems(ItemStack itemStack) { + for (List playersWithoutItem = TumbleManager.getPlayersInLobby(); playersWithoutItem.size() > 0; playersWithoutItem.remove(0)) { + // Get a singular player from the player list + Player playerWithoutItem = playersWithoutItem.get(0); + // Give that player the specified item + playerWithoutItem.getInventory().addItem(itemStack); } - return gameInstance; } - // Public method to get the game type - // This is public because you aren't modifying the game, just getting its type, so there shouldn't be any conflicts - public static String getGameType() { - return gameType; - } + + // Methods to get the game type and game state for other classes outside the Game + private String getGameType() { return gameType; } + + private String getGameState() { return gameState; } + } \ No newline at end of file -- cgit v1.2.3 From d2c33ffb6258e3197f455035087c3bb5a1b0d662 Mon Sep 17 00:00:00 2001 From: Myles Date: Sat, 3 Dec 2022 14:13:00 -0600 Subject: AAH SPIDERS EVERYWHERE (bug fixes) --- src/main/java/com/MylesAndMore/tumble/Game.java | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index aa86e12..fd7e1a1 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -14,7 +14,10 @@ public class Game { private static Game gameInstance; // Private Game() constructor for singleton instance - private Game() { } + private Game() { + gameWorld = Bukkit.getWorld(TumbleManager.getGameWorld()); + gameSpawn = gameWorld.getSpawnLocation(); + } // ONLY Public method to get the game instance public static Game getGame() { @@ -24,19 +27,17 @@ public class Game { return gameInstance; } - - // Define local game vars // The gameType keeps the current game type (shocker) - private String gameType = null; + private String gameType; // The gameState keeps the current state of the game (I'm so creative, I know) - private String gameState = null; + private String gameState; // Initialize a new instance of the Random class for use later - private Random Random = new Random(); + private final Random Random = new Random(); // Define the game world and its spawnpoint as a new Location for use later - private World gameWorld = Bukkit.getWorld(TumbleManager.getGameWorld()); - private Location gameSpawn = gameWorld.getSpawnLocation(); + private final World gameWorld; + private final Location gameSpawn; // Make a list of the game's players for later private List gamePlayers = null; @@ -98,7 +99,8 @@ public class Game { } private boolean generateLayers(String gameType) { - Location layer = gameSpawn; + // Location layer = gameSpawn; + Location layer = new Location(gameSpawn.getWorld(), gameSpawn.getX(), gameSpawn.getY(), gameSpawn.getZ(), gameSpawn.getYaw(), gameSpawn.getPitch()); if (Objects.equals(gameType, "shovels")) { layer.setY(layer.getY() - 1); Generator.generateLayer(layer, 17, 1, Material.SNOW_BLOCK); @@ -107,7 +109,7 @@ public class Game { Generator.generateLayer(layer, 13, 1, Material.GRASS_BLOCK); layer.setY(layer.getY() - 1); Generator.generateLayer(layer, 4, 1, Material.PODZOL); - layer.setY(layer.getY() + 1); + layer.setY(layer.getY() + 2); Generator.generateLayer(layer, 4, 2, Material.GRASS); } else if (Objects.equals(gameType, "snowballs")) { @@ -123,6 +125,7 @@ public class Game { else { return false; } + layer = null; return true; } @@ -178,6 +181,7 @@ public class Game { } private void gameEnd(@NotNull Player winner) { + gameState = "complete"; Bukkit.getServer().broadcastMessage(ChatColor.GREEN + winner.getName() + " has won!"); } -- cgit v1.2.3 From 6be45c6cdfb243fc872b7073729a755f8f1ee193 Mon Sep 17 00:00:00 2001 From: Myles Date: Sat, 3 Dec 2022 16:34:13 -0600 Subject: carver is too good at bug fixing --- src/main/java/com/MylesAndMore/tumble/Game.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index fd7e1a1..ccbbc55 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -153,9 +153,6 @@ public class Game { // While there are still players in the lobby, send them to the gameWorld // This is just a way of sending everybody in the lobby to the game for (Player aPlayer : TumbleManager.getPlayersInLobby()) { - //for (List playersInLobby = TumbleManager.getPlayersInLobby(); playersInLobby.size() > 0; playersInLobby = TumbleManager.getPlayersInLobby()) { - // Get a singular player from the player list - //Player aPlayer = playersInLobby.get(0); // Get a singular location from the scatter list Location aLocation = scatterLocations.get(0); // Teleport that player to that scatter location @@ -175,6 +172,7 @@ public class Game { // otherwise, the game must have two people left (and one just died), meaning it is over // This logic is so that it will not remove the last player standing from the list, so we know who the winner is. else { + gamePlayers.remove(player); // End the game, passing the winner to the gameEnd method gameEnd(gamePlayers.get(0)); } @@ -198,6 +196,6 @@ public class Game { // Methods to get the game type and game state for other classes outside the Game private String getGameType() { return gameType; } - private String getGameState() { return gameState; } + public String getGameState() { return gameState; } } \ No newline at end of file -- cgit v1.2.3 From 3f407f0be20c1239c6f8e6ff75a06fbd2416bd02 Mon Sep 17 00:00:00 2001 From: CraivMan Date: Sat, 3 Dec 2022 23:11:17 -0600 Subject: Added round logic (PT 1) I did this all (100% without Myles) --- src/main/java/com/MylesAndMore/tumble/Game.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index ccbbc55..67eedca 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -165,9 +165,9 @@ public class Game { public void playerDeath(@NotNull Player player) { player.setGameMode(GameMode.SPECTATOR); // If there are more than 2 players in the game, - if (gamePlayers.size() > 2) { - // remove that player (who just died) from the gamePlayersArray, effectively eliminating them, - gamePlayers.remove(player); + if (roundPlayers.size() > 2) { + // remove that player (who just died) from the roundPlayersArray, effectively eliminating them, + roundPlayers.remove(player); } // otherwise, the game must have two people left (and one just died), meaning it is over // This logic is so that it will not remove the last player standing from the list, so we know who the winner is. -- cgit v1.2.3 From 001b3dc43d716443a83fab6996fe01a773b333e0 Mon Sep 17 00:00:00 2001 From: CraivMan Date: Sat, 3 Dec 2022 23:11:35 -0600 Subject: Added round logic (PT 2) I did this all (100% without myles) --- src/main/java/com/MylesAndMore/tumble/Game.java | 56 +++++++++++++++++++++---- 1 file changed, 49 insertions(+), 7 deletions(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index 67eedca..1326bd5 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -40,7 +40,11 @@ public class Game { private final Location gameSpawn; // Make a list of the game's players for later - private List gamePlayers = null; + private List gamePlayers; + // Make a list of the round's players + private List roundPlayers; + // Initialize a list to keep track of wins between rounds + private List gameWins; // Creates a new Game // This will return true if the game succeeds creation, and false if not @@ -94,6 +98,9 @@ public class Game { } // Update the game's players for later gamePlayers = new ArrayList<>(TumbleManager.getPlayersInGame()); + roundPlayers = new ArrayList<>(TumbleManager.getPlayersInGame()); + gameWins = new ArrayList<>(); + gameWins.addAll(List.of(0,0,0,0,0,0,0,0)); gameState = "running"; return true; } @@ -110,7 +117,7 @@ public class Game { layer.setY(layer.getY() - 1); Generator.generateLayer(layer, 4, 1, Material.PODZOL); layer.setY(layer.getY() + 2); - Generator.generateLayer(layer, 4, 2, Material.GRASS); + Generator.generateLayer(layer, 4, 2, Material.TALL_GRASS); } else if (Objects.equals(gameType, "snowballs")) { layer.setY(layer.getY() - 1); @@ -122,10 +129,17 @@ public class Game { layer.setY(layer.getY() - 1); Generator.generateLayer(layer, 4, 1, Material.LIME_GLAZED_TERRACOTTA); } + else if (Objects.equals(gameType, "mixed")) { + if (Random.nextInt(2) == 0) { + generateLayers("shovels"); + } else { + generateLayers("snowballs"); + } + } else { return false; } - layer = null; + // layer = null; return true; } @@ -172,15 +186,43 @@ public class Game { // otherwise, the game must have two people left (and one just died), meaning it is over // This logic is so that it will not remove the last player standing from the list, so we know who the winner is. else { - gamePlayers.remove(player); + // roundPlayers.remove(player); // End the game, passing the winner to the gameEnd method - gameEnd(gamePlayers.get(0)); + roundEnd(roundPlayers.get(0)); + } + } + + private void roundEnd(@NotNull Player winner) { + // Set the wins of the player to their current # of wins + 1 + gameWins.set(gamePlayers.indexOf(winner), (gameWins.get(gamePlayers.indexOf(winner)) + 1)); + Bukkit.getServer().broadcastMessage(ChatColor.GREEN + winner.getName() + " has won the round!"); + if (gameWins.get(gamePlayers.indexOf(winner)) == 3) { + gameEnd(winner); + } + else { + // Clear old layers + Location firstPos = new Location(gameSpawn.getWorld(), gameSpawn.getX() - 20, gameSpawn.getY() - 4, gameSpawn.getZ() - 20); + Location secondPos = new Location(gameSpawn.getWorld(), gameSpawn.getX() + 20, gameSpawn.getY(), gameSpawn.getZ() + 20); + Generator.generateCuboid(firstPos, secondPos, Material.AIR); + // Generate layers + // Debug + Bukkit.getServer().broadcastMessage(gameType); + generateLayers(gameType); + // Teleport players + // A new method will need to be written for this; current one only supports lobby + + // Set their gamemodes to survival + } } private void gameEnd(@NotNull Player winner) { - gameState = "complete"; - Bukkit.getServer().broadcastMessage(ChatColor.GREEN + winner.getName() + " has won!"); + Bukkit.getServer().broadcastMessage(ChatColor.GOLD + winner.getName() + " has won the game!"); + // Clear layers + Location firstPos = new Location(gameSpawn.getWorld(), gameSpawn.getX() - 20, gameSpawn.getY() - 4, gameSpawn.getZ() - 20); + Location secondPos = new Location(gameSpawn.getWorld(), gameSpawn.getX() + 20, gameSpawn.getY(), gameSpawn.getZ() + 20); + Generator.generateCuboid(firstPos, secondPos, Material.AIR); + // Send players back to lobby } private void giveItems(ItemStack itemStack) { -- cgit v1.2.3 From 6cd94e0cb19480bb638f8bebf602b100d81f0267 Mon Sep 17 00:00:00 2001 From: CraivMan Date: Sun, 4 Dec 2022 14:51:26 -0600 Subject: Prevented shovels from losing durability --- src/main/java/com/MylesAndMore/tumble/Game.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index 1326bd5..7a6512d 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -3,7 +3,11 @@ package com.MylesAndMore.tumble; import com.MylesAndMore.tumble.api.Generator; import org.bukkit.*; import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerItemDamageEvent; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; import org.jetbrains.annotations.NotNull; import java.util.*; @@ -29,7 +33,7 @@ public class Game { // Define local game vars // The gameType keeps the current game type (shocker) - private String gameType; + private static String gameType; // The gameState keeps the current state of the game (I'm so creative, I know) private String gameState; @@ -61,6 +65,8 @@ public class Game { giveItems(new ItemStack(Material.DIAMOND_SHOVEL)); // Send players to the game sendPlayers(); + + // Keep in mind that after this runs, this command will complete and return true } else { @@ -118,6 +124,7 @@ public class Game { Generator.generateLayer(layer, 4, 1, Material.PODZOL); layer.setY(layer.getY() + 2); Generator.generateLayer(layer, 4, 2, Material.TALL_GRASS); + roundType = "shovels"; } else if (Objects.equals(gameType, "snowballs")) { layer.setY(layer.getY() - 1); @@ -128,6 +135,7 @@ public class Game { Generator.generateLayer(layer, 4, 1, Material.AIR); layer.setY(layer.getY() - 1); Generator.generateLayer(layer, 4, 1, Material.LIME_GLAZED_TERRACOTTA); + roundType = "snowballs"; } else if (Objects.equals(gameType, "mixed")) { if (Random.nextInt(2) == 0) { @@ -176,6 +184,14 @@ public class Game { } } + public void itemDamage(PlayerItemDamageEvent event) { + // If the game type is shovels, + if (Objects.equals(roundType, "shovels")) { + // Cancel the event + event.setCancelled(true); + } + } + public void playerDeath(@NotNull Player player) { player.setGameMode(GameMode.SPECTATOR); // If there are more than 2 players in the game, -- cgit v1.2.3 From 08d5fccac27fb1cb9cca3b3c69b07d916c37c195 Mon Sep 17 00:00:00 2001 From: CraivMan Date: Sun, 4 Dec 2022 14:52:36 -0600 Subject: Prevented shovels from losing durability (PT 2) --- src/main/java/com/MylesAndMore/tumble/Game.java | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index 7a6512d..887c4ee 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -36,6 +36,8 @@ public class Game { private static String gameType; // The gameState keeps the current state of the game (I'm so creative, I know) private String gameState; + // Define a variable for the roundType + private String roundType; // Initialize a new instance of the Random class for use later private final Random Random = new Random(); @@ -140,8 +142,10 @@ public class Game { else if (Objects.equals(gameType, "mixed")) { if (Random.nextInt(2) == 0) { generateLayers("shovels"); + roundType = "shovels"; } else { generateLayers("snowballs"); + roundType = "snowballs"; } } else { -- cgit v1.2.3 From 14b9a1aec413fc0affe7de02e5d875e251bb15dd Mon Sep 17 00:00:00 2001 From: Myles <43725835+MylesAndMore@users.noreply.github.com> Date: Mon, 5 Dec 2022 19:20:54 +0000 Subject: reformatting (this may break things) removed some flagged imports and changed some of the regen code might need to revert the commit... --- src/main/java/com/MylesAndMore/tumble/Game.java | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index 887c4ee..8a81e01 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -3,11 +3,8 @@ package com.MylesAndMore.tumble; import com.MylesAndMore.tumble.api.Generator; import org.bukkit.*; import org.bukkit.entity.Player; -import org.bukkit.event.Event; -import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerItemDamageEvent; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; import org.jetbrains.annotations.NotNull; import java.util.*; @@ -67,8 +64,6 @@ public class Game { giveItems(new ItemStack(Material.DIAMOND_SHOVEL)); // Send players to the game sendPlayers(); - - // Keep in mind that after this runs, this command will complete and return true } else { @@ -78,7 +73,6 @@ public class Game { else if (Objects.equals(TumbleManager.getGameType(), "snowballs")) { gameType = "snowballs"; if (generateLayers(gameType)) { - // Reminder: we need a way to make this snowball infinite! giveItems(new ItemStack(Material.SNOWBALL)); sendPlayers(); } @@ -216,17 +210,15 @@ public class Game { // Set the wins of the player to their current # of wins + 1 gameWins.set(gamePlayers.indexOf(winner), (gameWins.get(gamePlayers.indexOf(winner)) + 1)); Bukkit.getServer().broadcastMessage(ChatColor.GREEN + winner.getName() + " has won the round!"); + // Clear old layers (as a fill command, this would be /fill ~-20 ~-4 ~-20 ~20 ~ ~20 relative to spawn) + Generator.generateCuboid(new Location(gameSpawn.getWorld(), gameSpawn.getX() - 20, gameSpawn.getY() - 4, gameSpawn.getZ() - 20), new Location(gameSpawn.getWorld(), gameSpawn.getX() + 20, gameSpawn.getY(), gameSpawn.getZ() + 20), Material.AIR); + // If the player has three wins, they won the game, so initiate the gameEnd if (gameWins.get(gamePlayers.indexOf(winner)) == 3) { gameEnd(winner); } + // If that player doesn't have three wins, nobody else does, so we need another round else { - // Clear old layers - Location firstPos = new Location(gameSpawn.getWorld(), gameSpawn.getX() - 20, gameSpawn.getY() - 4, gameSpawn.getZ() - 20); - Location secondPos = new Location(gameSpawn.getWorld(), gameSpawn.getX() + 20, gameSpawn.getY(), gameSpawn.getZ() + 20); - Generator.generateCuboid(firstPos, secondPos, Material.AIR); - // Generate layers - // Debug - Bukkit.getServer().broadcastMessage(gameType); + // Re-generate layers generateLayers(gameType); // Teleport players // A new method will need to be written for this; current one only supports lobby @@ -238,10 +230,7 @@ public class Game { private void gameEnd(@NotNull Player winner) { Bukkit.getServer().broadcastMessage(ChatColor.GOLD + winner.getName() + " has won the game!"); - // Clear layers - Location firstPos = new Location(gameSpawn.getWorld(), gameSpawn.getX() - 20, gameSpawn.getY() - 4, gameSpawn.getZ() - 20); - Location secondPos = new Location(gameSpawn.getWorld(), gameSpawn.getX() + 20, gameSpawn.getY(), gameSpawn.getZ() + 20); - Generator.generateCuboid(firstPos, secondPos, Material.AIR); + // Send players back to lobby } -- cgit v1.2.3 From f4c447ec2a39a1782b6e7aa83e8ad1ef65c85d35 Mon Sep 17 00:00:00 2001 From: Myles <43725835+MylesAndMore@users.noreply.github.com> Date: Mon, 5 Dec 2022 19:29:56 +0000 Subject: reformatting pt.2 this one *shouldn't* break everything (but that's what they all say) --- src/main/java/com/MylesAndMore/tumble/Game.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index 8a81e01..8f0af60 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -49,8 +49,10 @@ public class Game { // Initialize a list to keep track of wins between rounds private List gameWins; - // Creates a new Game - // This will return true if the game succeeds creation, and false if not + /** + * Creates a new Game + * @return true if the game succeeds creation, and false if not + */ public boolean startGame() { gameState = "starting"; if (Objects.equals(TumbleManager.getGameType(), "shovels")) { @@ -108,7 +110,6 @@ public class Game { } private boolean generateLayers(String gameType) { - // Location layer = gameSpawn; Location layer = new Location(gameSpawn.getWorld(), gameSpawn.getX(), gameSpawn.getY(), gameSpawn.getZ(), gameSpawn.getYaw(), gameSpawn.getPitch()); if (Objects.equals(gameType, "shovels")) { layer.setY(layer.getY() - 1); @@ -145,7 +146,6 @@ public class Game { else { return false; } - // layer = null; return true; } -- cgit v1.2.3 From c4375578c74f13993209d7b3673e91ab3f9b81d2 Mon Sep 17 00:00:00 2001 From: Myles <43725835+MylesAndMore@users.noreply.github.com> Date: Mon, 5 Dec 2022 21:13:53 +0000 Subject: add gamemode switching at end of round --- src/main/java/com/MylesAndMore/tumble/Game.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index 8f0af60..63c68df 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -182,6 +182,15 @@ public class Game { } } + private void setSurvival() { + for (List spectators = gamePlayers; spectators.size() > 0; spectators.remove(0)) { + // Get a singular player from the player list + Player spectatorPlayer = spectators.get(0); + // Set that player's gamemode to survival + spectatorPlayer.setGameMode(GameMode.SURVIVAL); + } + } + public void itemDamage(PlayerItemDamageEvent event) { // If the game type is shovels, if (Objects.equals(roundType, "shovels")) { @@ -224,7 +233,7 @@ public class Game { // A new method will need to be written for this; current one only supports lobby // Set their gamemodes to survival - + setSurvival(); } } -- cgit v1.2.3 From cc6e428517da5fe6acd3659bfbe4ebd4fa3ea5a5 Mon Sep 17 00:00:00 2001 From: CraivMan Date: Mon, 5 Dec 2022 21:09:50 -0600 Subject: Infinite snowballs (unfixed) --- src/main/java/com/MylesAndMore/tumble/Game.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index 887c4ee..53a167c 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -90,14 +90,17 @@ public class Game { gameType = "mixed"; // Mixed gamemode (choose random shovels or snowballs) if (Random.nextInt(2) == 0) { + roundType = "shovels"; generateLayers("shovels"); giveItems(new ItemStack(Material.DIAMOND_SHOVEL)); sendPlayers(); } else { + roundType = "snowballs"; generateLayers("snowballs"); giveItems(new ItemStack(Material.SNOWBALL)); sendPlayers(); + } } else { @@ -116,7 +119,7 @@ public class Game { private boolean generateLayers(String gameType) { // Location layer = gameSpawn; Location layer = new Location(gameSpawn.getWorld(), gameSpawn.getX(), gameSpawn.getY(), gameSpawn.getZ(), gameSpawn.getYaw(), gameSpawn.getPitch()); - if (Objects.equals(gameType, "shovels")) { + if (Objects.equals(roundType, "shovels")) { layer.setY(layer.getY() - 1); Generator.generateLayer(layer, 17, 1, Material.SNOW_BLOCK); Generator.generateLayer(layer, 13, 1, Material.AIR); @@ -128,7 +131,7 @@ public class Game { Generator.generateLayer(layer, 4, 2, Material.TALL_GRASS); roundType = "shovels"; } - else if (Objects.equals(gameType, "snowballs")) { + else if (Objects.equals(roundType, "snowballs")) { layer.setY(layer.getY() - 1); Generator.generateLayer(layer, 17, 1, Material.COAL_ORE); Generator.generateLayer(layer, 13, 1, Material.AIR); @@ -142,10 +145,8 @@ public class Game { else if (Objects.equals(gameType, "mixed")) { if (Random.nextInt(2) == 0) { generateLayers("shovels"); - roundType = "shovels"; } else { generateLayers("snowballs"); - roundType = "snowballs"; } } else { -- cgit v1.2.3 From fd2c4ff5d73894760e2dc1c7ced531f69b785c6c Mon Sep 17 00:00:00 2001 From: CraivMan Date: Mon, 5 Dec 2022 21:10:53 -0600 Subject: Infinite snowballs (unfixed) #2 --- src/main/java/com/MylesAndMore/tumble/Game.java | 1 - 1 file changed, 1 deletion(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index b08dfd3..16916ff 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -253,7 +253,6 @@ public class Game { } } - // Methods to get the game type and game state for other classes outside the Game private String getGameType() { return gameType; } -- cgit v1.2.3 From 43761076f359278756dfcddbcdeeca14b45c6f2b Mon Sep 17 00:00:00 2001 From: Myles <43725835+MylesAndMore@users.noreply.github.com> Date: Tue, 6 Dec 2022 17:15:24 +0000 Subject: new tp method and more comments --- src/main/java/com/MylesAndMore/tumble/Game.java | 72 +++++++++++++++++++------ 1 file changed, 56 insertions(+), 16 deletions(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index 16916ff..793d4dd 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -30,7 +30,7 @@ public class Game { // Define local game vars // The gameType keeps the current game type (shocker) - private static String gameType; + private static String gameType = TumbleManager.getGameType(); // The gameState keeps the current state of the game (I'm so creative, I know) private String gameState; // Define a variable for the roundType @@ -56,16 +56,15 @@ public class Game { public boolean startGame() { gameState = "starting"; if (Objects.equals(TumbleManager.getGameType(), "shovels")) { - // Set the correct gameType for the game we're playing, for later - gameType = "shovels"; + // Set the roundType to gameType since it won't change for this mode + roundType = gameType; // Generate the correct layers for a Shovels game // The else statement is just in case the generator fails; this command will fail if (generateLayers(gameType)) { // If the layer generation succeeds, give players diamond shovels - // Reminder: we need a way for blocks to break instantly and for these to not lose durability! giveItems(new ItemStack(Material.DIAMOND_SHOVEL)); - // Send players to the game - sendPlayers(); + // Send all players from lobby to the game + teleportPlayers(TumbleManager.getPlayersInLobby()); // Keep in mind that after this runs, this command will complete and return true } else { @@ -73,45 +72,51 @@ public class Game { } } else if (Objects.equals(TumbleManager.getGameType(), "snowballs")) { - gameType = "snowballs"; + roundType = gameType; if (generateLayers(gameType)) { giveItems(new ItemStack(Material.SNOWBALL)); - sendPlayers(); + teleportPlayers(TumbleManager.getPlayersInLobby()); } else { return false; } } else if (Objects.equals(TumbleManager.getGameType(), "mixed")) { - gameType = "mixed"; - // Mixed gamemode (choose random shovels or snowballs) + // Mixed gamemode (choose random shovels/0 or snowballs/1) if (Random.nextInt(2) == 0) { roundType = "shovels"; generateLayers("shovels"); giveItems(new ItemStack(Material.DIAMOND_SHOVEL)); - sendPlayers(); + teleportPlayers(TumbleManager.getPlayersInLobby()); } else { roundType = "snowballs"; generateLayers("snowballs"); giveItems(new ItemStack(Material.SNOWBALL)); - sendPlayers(); - + teleportPlayers(TumbleManager.getPlayersInLobby()); } } else { // The game type in the config did not match a specified game type; return false to signify that return false; } + // If a game creation succeeded, then, // Update the game's players for later gamePlayers = new ArrayList<>(TumbleManager.getPlayersInGame()); + // Update the round's players for later roundPlayers = new ArrayList<>(TumbleManager.getPlayersInGame()); + // Create a list that will later keep track of each player's wins gameWins = new ArrayList<>(); gameWins.addAll(List.of(0,0,0,0,0,0,0,0)); gameState = "running"; return true; } + /** + * Generates the layers in the gameWorld for a certain gameType + * @param gameType can be either "shovels", "snowballs", or "mixed", anything else will fail generation + * @return true if gameType was recognized and layers were (hopefully) generated, false if unrecognized + */ private boolean generateLayers(String gameType) { Location layer = new Location(gameSpawn.getWorld(), gameSpawn.getX(), gameSpawn.getY(), gameSpawn.getZ(), gameSpawn.getYaw(), gameSpawn.getPitch()); if (Objects.equals(roundType, "shovels")) { @@ -150,6 +155,9 @@ public class Game { return true; } + // THIS METHOD IS DEPRECATED!! + // It has been replaced by teleportPlayers(), I'm just leaving this just in case teleportPlayers() doesn't work out + /** private void sendPlayers() { // Get the X, Y, and Z coords of that location double x = gameSpawn.getX(); @@ -182,6 +190,39 @@ public class Game { scatterLocations.remove(0); } } + */ + + /** + * Teleports a list of players to the specified scatter locations in the gameWorld + * @param players a List of Players to teleport + */ + private void teleportPlayers(List players) { + // Get the coords of the game's spawn location + double x = gameSpawn.getX(); + double y = gameSpawn.getY(); + double z = gameSpawn.getZ(); + // Create the scatter locations based off the game's spawn + List scatterLocations = new ArrayList<>(); + scatterLocations.addAll(List.of( + new Location(gameWorld, (x - 14.5), y, (z + 0.5) , -90, 0), + new Location(gameWorld, (x + 0.5), y, (z - 14.5), 0, 0), + new Location(gameWorld, (x + 15.5), y, (z + 0.5), 90, 0), + new Location(gameWorld, (x + 0.5), y, (z + 15.5), 180, 0 ), + new Location(gameWorld, (x - 10.5), y, (z - 10.5), -45, 0), + new Location(gameWorld, (x - 10.5), y, (z + 11.5), -135, 0), + new Location(gameWorld, (x + 11.5), y, (z - 10.5), 45, 0), + new Location(gameWorld, (x + 11.5), y, (z + 11.5), 135, 0)) + ); + // Shuffle the list (randomize) + Collections.shuffle(scatterLocations); + // While there are still unteleported players from the list, teleport them + for (Player aPlayer : players) { + // Select a singular player and singular location from the lists and teleport that player + aPlayer.teleport(scatterLocations.get(0)); + // Remove that location so multiple players won't get the same one + scatterLocations.remove(0); + } + } private void setSurvival() { for (List spectators = gamePlayers; spectators.size() > 0; spectators.remove(0)) { @@ -230,9 +271,8 @@ public class Game { else { // Re-generate layers generateLayers(gameType); - // Teleport players - // A new method will need to be written for this; current one only supports lobby - + // Re-scatter players + teleportPlayers(gamePlayers); // Set their gamemodes to survival setSurvival(); } -- cgit v1.2.3 From 1b8759700824b2195385c68f9ed41104774180e7 Mon Sep 17 00:00:00 2001 From: Myles <43725835+MylesAndMore@users.noreply.github.com> Date: Tue, 6 Dec 2022 17:20:28 +0000 Subject: we do a little reformatting of the ItemDamage event to keep it all in one location sorry Carver, it's just easier to read :) --- src/main/java/com/MylesAndMore/tumble/Game.java | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index 793d4dd..6655081 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -233,14 +233,6 @@ public class Game { } } - public void itemDamage(PlayerItemDamageEvent event) { - // If the game type is shovels, - if (Objects.equals(roundType, "shovels")) { - // Cancel the event - event.setCancelled(true); - } - } - public void playerDeath(@NotNull Player player) { player.setGameMode(GameMode.SPECTATOR); // If there are more than 2 players in the game, @@ -294,7 +286,7 @@ public class Game { } // Methods to get the game type and game state for other classes outside the Game - private String getGameType() { return gameType; } + public String getRoundType() { return roundType; } public String getGameState() { return gameState; } -- cgit v1.2.3 From 8681c9fa319b2e13a23465aef9b13cd1255faab3 Mon Sep 17 00:00:00 2001 From: Myles <43725835+MylesAndMore@users.noreply.github.com> Date: Tue, 6 Dec 2022 17:33:31 +0000 Subject: more modularity and reformatting and performance!! --- src/main/java/com/MylesAndMore/tumble/Game.java | 98 +++++++++++++++---------- 1 file changed, 59 insertions(+), 39 deletions(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index 6655081..4142aba 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -3,7 +3,6 @@ package com.MylesAndMore.tumble; import com.MylesAndMore.tumble.api.Generator; import org.bukkit.*; import org.bukkit.entity.Player; -import org.bukkit.event.player.PlayerItemDamageEvent; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; @@ -28,6 +27,7 @@ public class Game { return gameInstance; } + // Define local game vars // The gameType keeps the current game type (shocker) private static String gameType = TumbleManager.getGameType(); @@ -42,6 +42,8 @@ public class Game { private final World gameWorld; private final Location gameSpawn; + // Make a list of the lobby's players for later + private List lobbyPlayers = TumbleManager.getPlayersInLobby(); // Make a list of the game's players for later private List gamePlayers; // Make a list of the round's players @@ -49,6 +51,9 @@ public class Game { // Initialize a list to keep track of wins between rounds private List gameWins; + + // BEGIN PUBLIC METHODS + /** * Creates a new Game * @return true if the game succeeds creation, and false if not @@ -62,9 +67,9 @@ public class Game { // The else statement is just in case the generator fails; this command will fail if (generateLayers(gameType)) { // If the layer generation succeeds, give players diamond shovels - giveItems(new ItemStack(Material.DIAMOND_SHOVEL)); + giveItems(lobbyPlayers, new ItemStack(Material.DIAMOND_SHOVEL)); // Send all players from lobby to the game - teleportPlayers(TumbleManager.getPlayersInLobby()); + teleportPlayers(lobbyPlayers); // Keep in mind that after this runs, this command will complete and return true } else { @@ -74,8 +79,8 @@ public class Game { else if (Objects.equals(TumbleManager.getGameType(), "snowballs")) { roundType = gameType; if (generateLayers(gameType)) { - giveItems(new ItemStack(Material.SNOWBALL)); - teleportPlayers(TumbleManager.getPlayersInLobby()); + giveItems(lobbyPlayers, new ItemStack(Material.SNOWBALL)); + teleportPlayers(lobbyPlayers); } else { return false; @@ -86,14 +91,14 @@ public class Game { if (Random.nextInt(2) == 0) { roundType = "shovels"; generateLayers("shovels"); - giveItems(new ItemStack(Material.DIAMOND_SHOVEL)); - teleportPlayers(TumbleManager.getPlayersInLobby()); + giveItems(lobbyPlayers, new ItemStack(Material.DIAMOND_SHOVEL)); + teleportPlayers(lobbyPlayers); } else { roundType = "snowballs"; generateLayers("snowballs"); - giveItems(new ItemStack(Material.SNOWBALL)); - teleportPlayers(TumbleManager.getPlayersInLobby()); + giveItems(lobbyPlayers, new ItemStack(Material.SNOWBALL)); + teleportPlayers(lobbyPlayers); } } else { @@ -112,12 +117,48 @@ public class Game { return true; } + /** + * This method should be called on the death of one of the Game's players + * @param player The player who died + */ + public void playerDeath(@NotNull Player player) { + player.setGameMode(GameMode.SPECTATOR); + // If there are more than 2 players in the game, + if (roundPlayers.size() > 2) { + // remove that player (who just died) from the roundPlayersArray, effectively eliminating them, + roundPlayers.remove(player); + } + // Otherwise, the game must have two people left (and one just died), meaning it is over + // This logic is so that it will not remove the last player standing from the list, so we know who the winner is. + else { + // roundPlayers.remove(player); + // End the game, passing the winner to the gameEnd method + roundEnd(roundPlayers.get(0)); + } + } + + // Methods to get the game type and game state for other classes outside the Game + + /** + * @return The round type of the current round as a String ("shovels", "snowballs") + */ + public String getRoundType() { return roundType; } + + /** + * @return The game's current state as a String ("starting", "running", "complete") + */ + public String getGameState() { return gameState; } + + + // BEGIN PRIVATE METHODS + /** * Generates the layers in the gameWorld for a certain gameType * @param gameType can be either "shovels", "snowballs", or "mixed", anything else will fail generation * @return true if gameType was recognized and layers were (hopefully) generated, false if unrecognized */ private boolean generateLayers(String gameType) { + // Create a new Location for the layers to work with--this is so that we don't modify the actual gameSpawn var Location layer = new Location(gameSpawn.getWorld(), gameSpawn.getX(), gameSpawn.getY(), gameSpawn.getZ(), gameSpawn.getYaw(), gameSpawn.getPitch()); if (Objects.equals(roundType, "shovels")) { layer.setY(layer.getY() - 1); @@ -143,18 +184,27 @@ public class Game { roundType = "snowballs"; } else if (Objects.equals(gameType, "mixed")) { + // Randomly select either shovels or snowballs and re-run the method if (Random.nextInt(2) == 0) { generateLayers("shovels"); } else { generateLayers("snowballs"); } } + // Game type was invalid else { return false; } return true; } + private void giveItems(List players, ItemStack itemStack) { + for (Player aPlayer : players) { + // Get a singular player from the player list and give that player the specified item + aPlayer.getInventory().addItem(itemStack); + } + } + // THIS METHOD IS DEPRECATED!! // It has been replaced by teleportPlayers(), I'm just leaving this just in case teleportPlayers() doesn't work out /** @@ -233,22 +283,6 @@ public class Game { } } - public void playerDeath(@NotNull Player player) { - player.setGameMode(GameMode.SPECTATOR); - // If there are more than 2 players in the game, - if (roundPlayers.size() > 2) { - // remove that player (who just died) from the roundPlayersArray, effectively eliminating them, - roundPlayers.remove(player); - } - // otherwise, the game must have two people left (and one just died), meaning it is over - // This logic is so that it will not remove the last player standing from the list, so we know who the winner is. - else { - // roundPlayers.remove(player); - // End the game, passing the winner to the gameEnd method - roundEnd(roundPlayers.get(0)); - } - } - private void roundEnd(@NotNull Player winner) { // Set the wins of the player to their current # of wins + 1 gameWins.set(gamePlayers.indexOf(winner), (gameWins.get(gamePlayers.indexOf(winner)) + 1)); @@ -272,22 +306,8 @@ public class Game { private void gameEnd(@NotNull Player winner) { Bukkit.getServer().broadcastMessage(ChatColor.GOLD + winner.getName() + " has won the game!"); - // Send players back to lobby - } - private void giveItems(ItemStack itemStack) { - for (List playersWithoutItem = TumbleManager.getPlayersInLobby(); playersWithoutItem.size() > 0; playersWithoutItem.remove(0)) { - // Get a singular player from the player list - Player playerWithoutItem = playersWithoutItem.get(0); - // Give that player the specified item - playerWithoutItem.getInventory().addItem(itemStack); - } } - // Methods to get the game type and game state for other classes outside the Game - public String getRoundType() { return roundType; } - - public String getGameState() { return gameState; } - } \ No newline at end of file -- cgit v1.2.3 From 7ae758f3cb0f129d46331e7682130b2f326c432f Mon Sep 17 00:00:00 2001 From: Myles <43725835+MylesAndMore@users.noreply.github.com> Date: Tue, 6 Dec 2022 19:11:05 +0000 Subject: roundEnd maybe works now wheeee also more reformatting because I will never be satisfied with my code --- src/main/java/com/MylesAndMore/tumble/Game.java | 49 ++++++++++++++----------- 1 file changed, 28 insertions(+), 21 deletions(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index 4142aba..470b99b 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -4,7 +4,6 @@ import com.MylesAndMore.tumble.api.Generator; import org.bukkit.*; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import org.jetbrains.annotations.NotNull; import java.util.*; @@ -69,7 +68,7 @@ public class Game { // If the layer generation succeeds, give players diamond shovels giveItems(lobbyPlayers, new ItemStack(Material.DIAMOND_SHOVEL)); // Send all players from lobby to the game - teleportPlayers(lobbyPlayers); + scatterPlayers(lobbyPlayers); // Keep in mind that after this runs, this command will complete and return true } else { @@ -80,7 +79,7 @@ public class Game { roundType = gameType; if (generateLayers(gameType)) { giveItems(lobbyPlayers, new ItemStack(Material.SNOWBALL)); - teleportPlayers(lobbyPlayers); + scatterPlayers(lobbyPlayers); } else { return false; @@ -92,13 +91,13 @@ public class Game { roundType = "shovels"; generateLayers("shovels"); giveItems(lobbyPlayers, new ItemStack(Material.DIAMOND_SHOVEL)); - teleportPlayers(lobbyPlayers); + scatterPlayers(lobbyPlayers); } else { roundType = "snowballs"; generateLayers("snowballs"); giveItems(lobbyPlayers, new ItemStack(Material.SNOWBALL)); - teleportPlayers(lobbyPlayers); + scatterPlayers(lobbyPlayers); } } else { @@ -121,7 +120,7 @@ public class Game { * This method should be called on the death of one of the Game's players * @param player The player who died */ - public void playerDeath(@NotNull Player player) { + public void playerDeath(Player player) { player.setGameMode(GameMode.SPECTATOR); // If there are more than 2 players in the game, if (roundPlayers.size() > 2) { @@ -198,6 +197,11 @@ public class Game { return true; } + /** + * Distributes items to a provided list of players + * @param players The player list for which to distribute the items to + * @param itemStack The ItemStack to be distributed + */ private void giveItems(List players, ItemStack itemStack) { for (Player aPlayer : players) { // Get a singular player from the player list and give that player the specified item @@ -205,6 +209,18 @@ public class Game { } } + /** + * Sets the gamemodes of a provided list of players + * @param players The player list for which to set the gamemodes of + * @param gameMode The GameMode to set + */ + private void setGamemode(List players, GameMode gameMode) { + for (Player aPlayer : players) { + // Get a singular player from the player list and set their gamemode to the specified gamemode + aPlayer.setGameMode(gameMode); + } + } + // THIS METHOD IS DEPRECATED!! // It has been replaced by teleportPlayers(), I'm just leaving this just in case teleportPlayers() doesn't work out /** @@ -246,7 +262,7 @@ public class Game { * Teleports a list of players to the specified scatter locations in the gameWorld * @param players a List of Players to teleport */ - private void teleportPlayers(List players) { + private void scatterPlayers(List players) { // Get the coords of the game's spawn location double x = gameSpawn.getX(); double y = gameSpawn.getY(); @@ -274,16 +290,7 @@ public class Game { } } - private void setSurvival() { - for (List spectators = gamePlayers; spectators.size() > 0; spectators.remove(0)) { - // Get a singular player from the player list - Player spectatorPlayer = spectators.get(0); - // Set that player's gamemode to survival - spectatorPlayer.setGameMode(GameMode.SURVIVAL); - } - } - - private void roundEnd(@NotNull Player winner) { + private void roundEnd(Player winner) { // Set the wins of the player to their current # of wins + 1 gameWins.set(gamePlayers.indexOf(winner), (gameWins.get(gamePlayers.indexOf(winner)) + 1)); Bukkit.getServer().broadcastMessage(ChatColor.GREEN + winner.getName() + " has won the round!"); @@ -298,16 +305,16 @@ public class Game { // Re-generate layers generateLayers(gameType); // Re-scatter players - teleportPlayers(gamePlayers); + scatterPlayers(gamePlayers); // Set their gamemodes to survival - setSurvival(); + setGamemode(gamePlayers, GameMode.SURVIVAL); } } - private void gameEnd(@NotNull Player winner) { + private void gameEnd(Player winner) { Bukkit.getServer().broadcastMessage(ChatColor.GOLD + winner.getName() + " has won the game!"); // Send players back to lobby - + } } \ No newline at end of file -- cgit v1.2.3 From 94f6bbf48b8e0daa0c01a8723dc57bec326fbdcf Mon Sep 17 00:00:00 2001 From: Myles <43725835+MylesAndMore@users.noreply.github.com> Date: Tue, 6 Dec 2022 21:44:55 +0000 Subject: finish the gameEnd method --- src/main/java/com/MylesAndMore/tumble/Game.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index 470b99b..d2097d6 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -312,9 +312,12 @@ public class Game { } private void gameEnd(Player winner) { + // Announce win Bukkit.getServer().broadcastMessage(ChatColor.GOLD + winner.getName() + " has won the game!"); - // Send players back to lobby - + // Send all players back to lobby (spawn) + for (Player aPlayer : gamePlayers) { + aPlayer.teleport(Bukkit.getWorld(TumbleManager.getLobbyWorld()).getSpawnLocation()); + } } } \ No newline at end of file -- cgit v1.2.3 From 219e94232e53dedfe1ddc45f0a7cfa94e398bfeb Mon Sep 17 00:00:00 2001 From: Myles <43725835+MylesAndMore@users.noreply.github.com> Date: Tue, 6 Dec 2022 15:50:17 -0600 Subject: Dedication is when you: Forget about ONE PART of the method so then you get on your phone in the GitHub web ui and change it (much harder than it seems!!) Added change game modes to game end --- src/main/java/com/MylesAndMore/tumble/Game.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index d2097d6..05ac05f 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -314,10 +314,12 @@ public class Game { private void gameEnd(Player winner) { // Announce win Bukkit.getServer().broadcastMessage(ChatColor.GOLD + winner.getName() + " has won the game!"); + // Set their gamemodes to survival + setGamemode(gamePlayers, GameMode.SURVIVAL); // Send all players back to lobby (spawn) for (Player aPlayer : gamePlayers) { aPlayer.teleport(Bukkit.getWorld(TumbleManager.getLobbyWorld()).getSpawnLocation()); } } -} \ No newline at end of file +} -- cgit v1.2.3 From acaca4200a8c5479fb8f7be0c06a3b0064591c43 Mon Sep 17 00:00:00 2001 From: Myles Date: Tue, 6 Dec 2022 21:22:10 -0600 Subject: add delay in gameEnd --- src/main/java/com/MylesAndMore/tumble/Game.java | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index 05ac05f..5b594fa 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -314,12 +314,19 @@ public class Game { private void gameEnd(Player winner) { // Announce win Bukkit.getServer().broadcastMessage(ChatColor.GOLD + winner.getName() + " has won the game!"); - // Set their gamemodes to survival - setGamemode(gamePlayers, GameMode.SURVIVAL); - // Send all players back to lobby (spawn) - for (Player aPlayer : gamePlayers) { - aPlayer.teleport(Bukkit.getWorld(TumbleManager.getLobbyWorld()).getSpawnLocation()); - } + Bukkit.getServer().broadcastMessage(ChatColor.GREEN + "Teleporting in five seconds..."); + // Wait 5s (100t), then + Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), new Runnable() { + @Override + public void run() { + // Set their gamemodes to survival + setGamemode(gamePlayers, GameMode.SURVIVAL); + // Send all players back to lobby (spawn) + for (Player aPlayer : gamePlayers) { + aPlayer.teleport(Bukkit.getWorld(TumbleManager.getLobbyWorld()).getSpawnLocation()); + } + } + }, 100); } } -- cgit v1.2.3 From eb95848cb47a86e8f21bdcce9afe552f8dc14707 Mon Sep 17 00:00:00 2001 From: Myles Date: Tue, 6 Dec 2022 22:09:40 -0600 Subject: look we have fancy titles now! and just a *quick* side note, everything actually works now basically: bug fixes, title, more user feedback, the usual --- src/main/java/com/MylesAndMore/tumble/Game.java | 86 +++++++++++-------------- 1 file changed, 38 insertions(+), 48 deletions(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index 5b594fa..ce27f66 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -5,6 +5,7 @@ import org.bukkit.*; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import javax.annotation.Nullable; import java.util.*; public class Game { @@ -112,7 +113,14 @@ public class Game { // Create a list that will later keep track of each player's wins gameWins = new ArrayList<>(); gameWins.addAll(List.of(0,0,0,0,0,0,0,0)); - gameState = "running"; + // Wait 5s (50t) for the clients to load in + Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { + // Display the "go!" title + displayTitles(gamePlayers, ChatColor.GREEN + "Go!", null, 1, 5, 1); + // Set gamemodes to survival + setGamemode(gamePlayers, GameMode.SURVIVAL); + gameState = "running"; + }, 50); return true; } @@ -221,42 +229,21 @@ public class Game { } } - // THIS METHOD IS DEPRECATED!! - // It has been replaced by teleportPlayers(), I'm just leaving this just in case teleportPlayers() doesn't work out /** - private void sendPlayers() { - // Get the X, Y, and Z coords of that location - double x = gameSpawn.getX(); - double y = gameSpawn.getY(); - double z = gameSpawn.getZ(); - // Create Locations to scatter players around the first layer - // These are just edited off the original spawn location; - // they assume that the first layer has a radius of 17 blocks (it always will w/ the current generator code) - List scatterLocations = new ArrayList<>(); - scatterLocations.addAll(List.of( - new Location(gameWorld, (x - 14.5), y, (z + 0.5) , -90, 0), - new Location(gameWorld, (x + 0.5), y, (z - 14.5), 0, 0), - new Location(gameWorld, (x + 15.5), y, (z + 0.5), 90, 0), - new Location(gameWorld, (x + 0.5), y, (z + 15.5), 180, 0 ), - new Location(gameWorld, (x - 10.5), y, (z - 10.5), -45, 0), - new Location(gameWorld, (x - 10.5), y, (z + 11.5), -135, 0), - new Location(gameWorld, (x + 11.5), y, (z - 10.5), 45, 0), - new Location(gameWorld, (x + 11.5), y, (z + 11.5), 135, 0)) - ); - // Shuffle the location list so players don't always spawn in the same location (basically, actually scatter the locations) - Collections.shuffle(scatterLocations); - // While there are still players in the lobby, send them to the gameWorld - // This is just a way of sending everybody in the lobby to the game - for (Player aPlayer : TumbleManager.getPlayersInLobby()) { - // Get a singular location from the scatter list - Location aLocation = scatterLocations.get(0); - // Teleport that player to that scatter location - aPlayer.teleport(aLocation); - // Remove that location from the list so that it cannot be used again - scatterLocations.remove(0); + * Displays a customized title to a provided list of players + * @param players The player list for which to show the titles to + * @param title The top title text + * @param subtitle The bottom title subtext (nullable) + * @param fadeIn The fadeIn duration (in ticks) + * @param stay The stay duration (in ticks) + * @param fadeOut The fadeOut duration (in ticks) + */ + private void displayTitles(List players, String title, @Nullable String subtitle, int fadeIn, int stay, int fadeOut) { + for (Player aPlayer : players) { + // Get a singular player from the player list and display them the specified title + aPlayer.sendTitle(title, subtitle, fadeIn, stay, fadeOut); } } - */ /** * Teleports a list of players to the specified scatter locations in the gameWorld @@ -304,29 +291,32 @@ public class Game { else { // Re-generate layers generateLayers(gameType); - // Re-scatter players - scatterPlayers(gamePlayers); - // Set their gamemodes to survival - setGamemode(gamePlayers, GameMode.SURVIVAL); + Bukkit.getServer().broadcastMessage(ChatColor.BLUE + "A new round will begin in ten seconds!"); + // Wait 10s (100t) for tp method + Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { + // Re-scatter players + scatterPlayers(gamePlayers); + displayTitles(gamePlayers, ChatColor.GREEN + "Go!", null, 1, 5, 1); + // Set their gamemodes to survival + setGamemode(gamePlayers, GameMode.SURVIVAL); + }, 200); } } private void gameEnd(Player winner) { // Announce win Bukkit.getServer().broadcastMessage(ChatColor.GOLD + winner.getName() + " has won the game!"); - Bukkit.getServer().broadcastMessage(ChatColor.GREEN + "Teleporting in five seconds..."); + Bukkit.getServer().broadcastMessage(ChatColor.BLUE + "Teleporting back in five seconds..."); // Wait 5s (100t), then - Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), new Runnable() { - @Override - public void run() { - // Set their gamemodes to survival - setGamemode(gamePlayers, GameMode.SURVIVAL); - // Send all players back to lobby (spawn) - for (Player aPlayer : gamePlayers) { - aPlayer.teleport(Bukkit.getWorld(TumbleManager.getLobbyWorld()).getSpawnLocation()); - } + Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { + // Set their gamemodes to survival + setGamemode(gamePlayers, GameMode.SURVIVAL); + // Send all players back to lobby (spawn) + for (Player aPlayer : gamePlayers) { + aPlayer.teleport(Bukkit.getWorld(TumbleManager.getLobbyWorld()).getSpawnLocation()); } }, 100); + gameState = "complete"; } } -- cgit v1.2.3 From 728cce24b86b2a90bc159bd650eb73e902071505 Mon Sep 17 00:00:00 2001 From: Myles <43725835+MylesAndMore@users.noreply.github.com> Date: Wed, 7 Dec 2022 19:17:27 +0000 Subject: parity and other gameplay changes now uses titles (mostly) instead of broadcast text when broadcast text is used, it is only sent to the game's players a few sounds have been added --- src/main/java/com/MylesAndMore/tumble/Game.java | 37 ++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 4 deletions(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index ce27f66..d3234a1 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -4,6 +4,7 @@ import com.MylesAndMore.tumble.api.Generator; import org.bukkit.*; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; import java.util.*; @@ -117,6 +118,7 @@ public class Game { Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { // Display the "go!" title displayTitles(gamePlayers, ChatColor.GREEN + "Go!", null, 1, 5, 1); + playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 1, 2); // Set gamemodes to survival setGamemode(gamePlayers, GameMode.SURVIVAL); gameState = "running"; @@ -245,6 +247,31 @@ public class Game { } } + /** + * Displays a message to a provided list of players + * @param players The player list for which to send the message to + * @param message The provided message (String format) + */ + private void displayMessage(List players, String message) { + for (Player aPlayer : players) { + aPlayer.sendMessage(message); + } + } + + /** + * Plays a sound to a provided list of players + * @param players The player list for which to play the sound to + * @param sound The sound to play + * @param category The category of the sound + * @param volume The volume of the sound + * @param pitch The pitch of the sound + */ + private void playSound(@NotNull List players, @NotNull Sound sound, @NotNull SoundCategory category, float volume, float pitch) { + for (Player aPlayer : players) { + aPlayer.playSound(aPlayer, sound, category, volume, pitch); + } + } + /** * Teleports a list of players to the specified scatter locations in the gameWorld * @param players a List of Players to teleport @@ -280,23 +307,25 @@ public class Game { private void roundEnd(Player winner) { // Set the wins of the player to their current # of wins + 1 gameWins.set(gamePlayers.indexOf(winner), (gameWins.get(gamePlayers.indexOf(winner)) + 1)); - Bukkit.getServer().broadcastMessage(ChatColor.GREEN + winner.getName() + " has won the round!"); // Clear old layers (as a fill command, this would be /fill ~-20 ~-4 ~-20 ~20 ~ ~20 relative to spawn) Generator.generateCuboid(new Location(gameSpawn.getWorld(), gameSpawn.getX() - 20, gameSpawn.getY() - 4, gameSpawn.getZ() - 20), new Location(gameSpawn.getWorld(), gameSpawn.getX() + 20, gameSpawn.getY(), gameSpawn.getZ() + 20), Material.AIR); + playSound(gamePlayers, Sound.ENTITY_ELDER_GUARDIAN_CURSE, SoundCategory.HOSTILE, 1, 1); // If the player has three wins, they won the game, so initiate the gameEnd if (gameWins.get(gamePlayers.indexOf(winner)) == 3) { gameEnd(winner); } // If that player doesn't have three wins, nobody else does, so we need another round else { + displayTitles(gamePlayers, ChatColor.RED + "Round over!", ChatColor.GOLD + winner.getName() + " has won the round!", 2, 20, 2); // Re-generate layers generateLayers(gameType); - Bukkit.getServer().broadcastMessage(ChatColor.BLUE + "A new round will begin in ten seconds!"); + displayMessage(gamePlayers, ChatColor.BLUE + "A new round will begin in ten seconds!"); // Wait 10s (100t) for tp method Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { // Re-scatter players scatterPlayers(gamePlayers); displayTitles(gamePlayers, ChatColor.GREEN + "Go!", null, 1, 5, 1); + playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 1, 2); // Set their gamemodes to survival setGamemode(gamePlayers, GameMode.SURVIVAL); }, 200); @@ -305,8 +334,8 @@ public class Game { private void gameEnd(Player winner) { // Announce win - Bukkit.getServer().broadcastMessage(ChatColor.GOLD + winner.getName() + " has won the game!"); - Bukkit.getServer().broadcastMessage(ChatColor.BLUE + "Teleporting back in five seconds..."); + displayTitles(gamePlayers, ChatColor.RED + "Game over!", ChatColor.GOLD + winner.getName() + " has won the game!", 4, 40, 2); + displayMessage(gamePlayers, ChatColor.BLUE + "Teleporting back in five seconds..."); // Wait 5s (100t), then Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { // Set their gamemodes to survival -- cgit v1.2.3 From 1e9bd767570ab714d6007daebb4ee618a5ccdf79 Mon Sep 17 00:00:00 2001 From: Myles <43725835+MylesAndMore@users.noreply.github.com> Date: Wed, 7 Dec 2022 20:00:23 +0000 Subject: prevent players from moving before game begins --- src/main/java/com/MylesAndMore/tumble/Game.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index d3234a1..1b8227e 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -114,7 +114,7 @@ public class Game { // Create a list that will later keep track of each player's wins gameWins = new ArrayList<>(); gameWins.addAll(List.of(0,0,0,0,0,0,0,0)); - // Wait 5s (50t) for the clients to load in + // Wait 5s (100t) for the clients to load in Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { // Display the "go!" title displayTitles(gamePlayers, ChatColor.GREEN + "Go!", null, 1, 5, 1); @@ -122,7 +122,7 @@ public class Game { // Set gamemodes to survival setGamemode(gamePlayers, GameMode.SURVIVAL); gameState = "running"; - }, 50); + }, 100); return true; } @@ -336,7 +336,7 @@ public class Game { // Announce win displayTitles(gamePlayers, ChatColor.RED + "Game over!", ChatColor.GOLD + winner.getName() + " has won the game!", 4, 40, 2); displayMessage(gamePlayers, ChatColor.BLUE + "Teleporting back in five seconds..."); - // Wait 5s (100t), then + // Wait 10s (200t), then Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { // Set their gamemodes to survival setGamemode(gamePlayers, GameMode.SURVIVAL); @@ -344,8 +344,7 @@ public class Game { for (Player aPlayer : gamePlayers) { aPlayer.teleport(Bukkit.getWorld(TumbleManager.getLobbyWorld()).getSpawnLocation()); } - }, 100); + }, 200); gameState = "complete"; } - } -- cgit v1.2.3 From 8a1072641f30af8c06361a03a302321822c3ce7f Mon Sep 17 00:00:00 2001 From: Myles <43725835+MylesAndMore@users.noreply.github.com> Date: Wed, 7 Dec 2022 20:14:25 +0000 Subject: prevent players from joining during a game --- src/main/java/com/MylesAndMore/tumble/Game.java | 121 +++++++++++++----------- 1 file changed, 65 insertions(+), 56 deletions(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index 1b8227e..439cbb1 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -60,69 +60,78 @@ public class Game { * @return true if the game succeeds creation, and false if not */ public boolean startGame() { - gameState = "starting"; - if (Objects.equals(TumbleManager.getGameType(), "shovels")) { - // Set the roundType to gameType since it won't change for this mode - roundType = gameType; - // Generate the correct layers for a Shovels game - // The else statement is just in case the generator fails; this command will fail - if (generateLayers(gameType)) { - // If the layer generation succeeds, give players diamond shovels - giveItems(lobbyPlayers, new ItemStack(Material.DIAMOND_SHOVEL)); - // Send all players from lobby to the game - scatterPlayers(lobbyPlayers); - // Keep in mind that after this runs, this command will complete and return true - } - else { - return false; - } + // Check if the game is starting or running, if so, do not start + if (Objects.equals(gameState, "starting")) { + return false; + } + else if (Objects.equals(gameState, "running")) { + return false; } - else if (Objects.equals(TumbleManager.getGameType(), "snowballs")) { - roundType = gameType; - if (generateLayers(gameType)) { - giveItems(lobbyPlayers, new ItemStack(Material.SNOWBALL)); - scatterPlayers(lobbyPlayers); + else { + gameState = "starting"; + if (Objects.equals(TumbleManager.getGameType(), "shovels")) { + // Set the roundType to gameType since it won't change for this mode + roundType = gameType; + // Generate the correct layers for a Shovels game + // The else statement is just in case the generator fails; this command will fail + if (generateLayers(gameType)) { + // If the layer generation succeeds, give players diamond shovels + giveItems(lobbyPlayers, new ItemStack(Material.DIAMOND_SHOVEL)); + // Send all players from lobby to the game + scatterPlayers(lobbyPlayers); + // Keep in mind that after this runs, this command will complete and return true + } + else { + return false; + } } - else { - return false; + else if (Objects.equals(TumbleManager.getGameType(), "snowballs")) { + roundType = gameType; + if (generateLayers(gameType)) { + giveItems(lobbyPlayers, new ItemStack(Material.SNOWBALL)); + scatterPlayers(lobbyPlayers); + } + else { + return false; + } } - } - else if (Objects.equals(TumbleManager.getGameType(), "mixed")) { - // Mixed gamemode (choose random shovels/0 or snowballs/1) - if (Random.nextInt(2) == 0) { - roundType = "shovels"; - generateLayers("shovels"); - giveItems(lobbyPlayers, new ItemStack(Material.DIAMOND_SHOVEL)); - scatterPlayers(lobbyPlayers); + else if (Objects.equals(TumbleManager.getGameType(), "mixed")) { + // Mixed gamemode (choose random shovels/0 or snowballs/1) + if (Random.nextInt(2) == 0) { + roundType = "shovels"; + generateLayers("shovels"); + giveItems(lobbyPlayers, new ItemStack(Material.DIAMOND_SHOVEL)); + scatterPlayers(lobbyPlayers); + } + else { + roundType = "snowballs"; + generateLayers("snowballs"); + giveItems(lobbyPlayers, new ItemStack(Material.SNOWBALL)); + scatterPlayers(lobbyPlayers); + } } else { - roundType = "snowballs"; - generateLayers("snowballs"); - giveItems(lobbyPlayers, new ItemStack(Material.SNOWBALL)); - scatterPlayers(lobbyPlayers); + // The game type in the config did not match a specified game type; return false to signify that + return false; } + // If a game creation succeeded, then, + // Update the game's players for later + gamePlayers = new ArrayList<>(TumbleManager.getPlayersInGame()); + // Update the round's players for later + roundPlayers = new ArrayList<>(TumbleManager.getPlayersInGame()); + // Create a list that will later keep track of each player's wins + gameWins = new ArrayList<>(); + gameWins.addAll(List.of(0,0,0,0,0,0,0,0)); + // Wait 5s (100t) for the clients to load in + Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { + // Display the "go!" title + displayTitles(gamePlayers, ChatColor.GREEN + "Go!", null, 1, 5, 1); + playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 1, 2); + // Set gamemodes to survival + setGamemode(gamePlayers, GameMode.SURVIVAL); + gameState = "running"; + }, 100); } - else { - // The game type in the config did not match a specified game type; return false to signify that - return false; - } - // If a game creation succeeded, then, - // Update the game's players for later - gamePlayers = new ArrayList<>(TumbleManager.getPlayersInGame()); - // Update the round's players for later - roundPlayers = new ArrayList<>(TumbleManager.getPlayersInGame()); - // Create a list that will later keep track of each player's wins - gameWins = new ArrayList<>(); - gameWins.addAll(List.of(0,0,0,0,0,0,0,0)); - // Wait 5s (100t) for the clients to load in - Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { - // Display the "go!" title - displayTitles(gamePlayers, ChatColor.GREEN + "Go!", null, 1, 5, 1); - playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 1, 2); - // Set gamemodes to survival - setGamemode(gamePlayers, GameMode.SURVIVAL); - gameState = "running"; - }, 100); return true; } -- cgit v1.2.3 From 0860c7913225943cd16f8a149ec9cf0b407ce359 Mon Sep 17 00:00:00 2001 From: Myles Date: Wed, 7 Dec 2022 19:06:55 -0600 Subject: bug fixes and duplicate game glitch fixed --- src/main/java/com/MylesAndMore/tumble/Game.java | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index 439cbb1..117faff 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -318,33 +318,38 @@ public class Game { gameWins.set(gamePlayers.indexOf(winner), (gameWins.get(gamePlayers.indexOf(winner)) + 1)); // Clear old layers (as a fill command, this would be /fill ~-20 ~-4 ~-20 ~20 ~ ~20 relative to spawn) Generator.generateCuboid(new Location(gameSpawn.getWorld(), gameSpawn.getX() - 20, gameSpawn.getY() - 4, gameSpawn.getZ() - 20), new Location(gameSpawn.getWorld(), gameSpawn.getX() + 20, gameSpawn.getY(), gameSpawn.getZ() + 20), Material.AIR); - playSound(gamePlayers, Sound.ENTITY_ELDER_GUARDIAN_CURSE, SoundCategory.HOSTILE, 1, 1); + playSound(gamePlayers, Sound.BLOCK_NOTE_BLOCK_PLING, SoundCategory.BLOCKS, 5, 0); // If the player has three wins, they won the game, so initiate the gameEnd if (gameWins.get(gamePlayers.indexOf(winner)) == 3) { gameEnd(winner); } // If that player doesn't have three wins, nobody else does, so we need another round else { - displayTitles(gamePlayers, ChatColor.RED + "Round over!", ChatColor.GOLD + winner.getName() + " has won the round!", 2, 20, 2); + displayTitles(gamePlayers, ChatColor.RED + "Round over!", ChatColor.GOLD + winner.getName() + " has won the round!", 5, 60, 5); // Re-generate layers generateLayers(gameType); displayMessage(gamePlayers, ChatColor.BLUE + "A new round will begin in ten seconds!"); - // Wait 10s (100t) for tp method + // Wait 5s (100t) for tp method Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { // Re-scatter players + gameState = "starting"; scatterPlayers(gamePlayers); - displayTitles(gamePlayers, ChatColor.GREEN + "Go!", null, 1, 5, 1); - playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 1, 2); - // Set their gamemodes to survival - setGamemode(gamePlayers, GameMode.SURVIVAL); - }, 200); + // Wait another 5s for game start + Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { + displayTitles(gamePlayers, ChatColor.GREEN + "Go!", null, 1, 5, 1); + playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 1, 2); + // Set their gamemodes to survival + setGamemode(gamePlayers, GameMode.SURVIVAL); + gameState = "running"; + }, 100); + }, 100); } } private void gameEnd(Player winner) { // Announce win - displayTitles(gamePlayers, ChatColor.RED + "Game over!", ChatColor.GOLD + winner.getName() + " has won the game!", 4, 40, 2); - displayMessage(gamePlayers, ChatColor.BLUE + "Teleporting back in five seconds..."); + displayTitles(gamePlayers, ChatColor.RED + "Game over!", ChatColor.GOLD + winner.getName() + " has won the game!", 5, 60, 5); + displayMessage(gamePlayers, ChatColor.BLUE + "Teleporting back in ten seconds..."); // Wait 10s (200t), then Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { // Set their gamemodes to survival -- cgit v1.2.3 From eec44e9903e3cb15449d9c1df41425e8063ee7f6 Mon Sep 17 00:00:00 2001 From: Myles Date: Wed, 7 Dec 2022 19:54:54 -0600 Subject: THE COUNTDOWN IS THE BEST THING I'VE ADDED --- src/main/java/com/MylesAndMore/tumble/Game.java | 48 +++++++++++++++++-------- 1 file changed, 33 insertions(+), 15 deletions(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index 117faff..cb49443 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -124,12 +124,23 @@ public class Game { gameWins.addAll(List.of(0,0,0,0,0,0,0,0)); // Wait 5s (100t) for the clients to load in Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { - // Display the "go!" title - displayTitles(gamePlayers, ChatColor.GREEN + "Go!", null, 1, 5, 1); - playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 1, 2); - // Set gamemodes to survival - setGamemode(gamePlayers, GameMode.SURVIVAL); - gameState = "running"; + // Begin the countdown sequence + playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 1, 1); + displayTitles(gamePlayers, ChatColor.DARK_GREEN + "3", null, 3, 10, 7); + Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { + playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 1, 1); + displayTitles(gamePlayers, ChatColor.YELLOW + "2", null, 3, 10, 7); + Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { + playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 1, 1); + displayTitles(gamePlayers, ChatColor.DARK_RED + "1", null, 3, 10, 7); + Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { + playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 1, 2); + displayTitles(gamePlayers, ChatColor.GREEN + "Go!", null, 1, 5, 1); + setGamemode(gamePlayers, GameMode.SURVIVAL); + gameState = "running"; + }, 20); + }, 20); + }, 20); }, 100); } return true; @@ -328,20 +339,27 @@ public class Game { displayTitles(gamePlayers, ChatColor.RED + "Round over!", ChatColor.GOLD + winner.getName() + " has won the round!", 5, 60, 5); // Re-generate layers generateLayers(gameType); - displayMessage(gamePlayers, ChatColor.BLUE + "A new round will begin in ten seconds!"); // Wait 5s (100t) for tp method Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { // Re-scatter players gameState = "starting"; scatterPlayers(gamePlayers); - // Wait another 5s for game start + playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 1, 1); + displayTitles(gamePlayers, ChatColor.DARK_GREEN + "3", null, 3, 10, 7); Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { - displayTitles(gamePlayers, ChatColor.GREEN + "Go!", null, 1, 5, 1); - playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 1, 2); - // Set their gamemodes to survival - setGamemode(gamePlayers, GameMode.SURVIVAL); - gameState = "running"; - }, 100); + playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 1, 1); + displayTitles(gamePlayers, ChatColor.YELLOW + "2", null, 3, 10, 7); + Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { + playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 1, 1); + displayTitles(gamePlayers, ChatColor.DARK_RED + "1", null, 3, 10, 7); + Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { + playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 1, 2); + displayTitles(gamePlayers, ChatColor.GREEN + "Go!", null, 1, 5, 1); + setGamemode(gamePlayers, GameMode.SURVIVAL); + gameState = "running"; + }, 20); + }, 20); + }, 20); }, 100); } } @@ -349,7 +367,7 @@ public class Game { private void gameEnd(Player winner) { // Announce win displayTitles(gamePlayers, ChatColor.RED + "Game over!", ChatColor.GOLD + winner.getName() + " has won the game!", 5, 60, 5); - displayMessage(gamePlayers, ChatColor.BLUE + "Teleporting back in ten seconds..."); + displayMessage(gamePlayers, ChatColor.BLUE + "Returning to lobby in ten seconds..."); // Wait 10s (200t), then Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { // Set their gamemodes to survival -- cgit v1.2.3 From c7d259a122ebd8300d84914032e247a5cc4a7f01 Mon Sep 17 00:00:00 2001 From: Myles Date: Wed, 7 Dec 2022 21:13:33 -0600 Subject: add feature: seperate winning player tp --- src/main/java/com/MylesAndMore/tumble/Game.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index cb49443..f3c7ef4 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -370,8 +370,13 @@ public class Game { displayMessage(gamePlayers, ChatColor.BLUE + "Returning to lobby in ten seconds..."); // Wait 10s (200t), then Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { - // Set their gamemodes to survival - setGamemode(gamePlayers, GameMode.SURVIVAL); + // First, check to see if there is a separate location to tp the winner to + if ((TumbleManager.getPlugin().getConfig().getDouble("winnerTeleport.x") != 0) && (TumbleManager.getPlugin().getConfig().getDouble("winnerTeleport.y") != 0) && (TumbleManager.getPlugin().getConfig().getDouble("winnerTeleport.z") != 0)) { + // Tp the winner to that location + winner.teleport(new Location(Bukkit.getWorld(TumbleManager.getLobbyWorld()), TumbleManager.getPlugin().getConfig().getDouble("winnerTeleport.x"), TumbleManager.getPlugin().getConfig().getDouble("winnerTeleport.y"), TumbleManager.getPlugin().getConfig().getDouble("winnerTeleport.z"))); + // Remove the winner from the gamePlayers so they don't get double-tp'd + gamePlayers.remove(winner); + } // Send all players back to lobby (spawn) for (Player aPlayer : gamePlayers) { aPlayer.teleport(Bukkit.getWorld(TumbleManager.getLobbyWorld()).getSpawnLocation()); -- cgit v1.2.3 From 102627d4b28589676ddccc359a9ecd0dffa13f85 Mon Sep 17 00:00:00 2001 From: Myles Date: Wed, 7 Dec 2022 21:54:26 -0600 Subject: rewrite basically an entire method (rip my sanity) you can now specify what type of game in the cmd and not just the config file (although the config file still works) but now testing should be easier! and also flexibility is cool I wonder how many bugs this will cause in the future... --- src/main/java/com/MylesAndMore/tumble/Game.java | 57 +++++++++++-------------- 1 file changed, 25 insertions(+), 32 deletions(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index f3c7ef4..2106e9a 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -30,8 +30,6 @@ public class Game { // Define local game vars - // The gameType keeps the current game type (shocker) - private static String gameType = TumbleManager.getGameType(); // The gameState keeps the current state of the game (I'm so creative, I know) private String gameState; // Define a variable for the roundType @@ -57,9 +55,10 @@ public class Game { /** * Creates a new Game + * @param type The type of game * @return true if the game succeeds creation, and false if not */ - public boolean startGame() { + public boolean startGame(@NotNull String type) { // Check if the game is starting or running, if so, do not start if (Objects.equals(gameState, "starting")) { return false; @@ -68,15 +67,14 @@ public class Game { return false; } else { - gameState = "starting"; - if (Objects.equals(TumbleManager.getGameType(), "shovels")) { + // Define the gameType + if (Objects.equals(type, "shovels")) { + gameState = "starting"; // Set the roundType to gameType since it won't change for this mode - roundType = gameType; + roundType = type; // Generate the correct layers for a Shovels game // The else statement is just in case the generator fails; this command will fail - if (generateLayers(gameType)) { - // If the layer generation succeeds, give players diamond shovels - giveItems(lobbyPlayers, new ItemStack(Material.DIAMOND_SHOVEL)); + if (generateLayers(type)) { // Send all players from lobby to the game scatterPlayers(lobbyPlayers); // Keep in mind that after this runs, this command will complete and return true @@ -85,29 +83,24 @@ public class Game { return false; } } - else if (Objects.equals(TumbleManager.getGameType(), "snowballs")) { - roundType = gameType; - if (generateLayers(gameType)) { - giveItems(lobbyPlayers, new ItemStack(Material.SNOWBALL)); + else if (Objects.equals(type, "snowballs")) { + gameState = "starting"; + roundType = type; + if (generateLayers(type)) { scatterPlayers(lobbyPlayers); } else { return false; } } - else if (Objects.equals(TumbleManager.getGameType(), "mixed")) { - // Mixed gamemode (choose random shovels/0 or snowballs/1) - if (Random.nextInt(2) == 0) { - roundType = "shovels"; - generateLayers("shovels"); - giveItems(lobbyPlayers, new ItemStack(Material.DIAMOND_SHOVEL)); + else if (Objects.equals(type, "mixed")) { + gameState = "starting"; + roundType = type; + if (generateLayers(type)) { scatterPlayers(lobbyPlayers); } else { - roundType = "snowballs"; - generateLayers("snowballs"); - giveItems(lobbyPlayers, new ItemStack(Material.SNOWBALL)); - scatterPlayers(lobbyPlayers); + return false; } } else { @@ -141,7 +134,7 @@ public class Game { }, 20); }, 20); }, 20); - }, 100); + }, 100); } return true; } @@ -183,13 +176,13 @@ public class Game { /** * Generates the layers in the gameWorld for a certain gameType - * @param gameType can be either "shovels", "snowballs", or "mixed", anything else will fail generation + * @param type can be either "shovels", "snowballs", or "mixed", anything else will fail generation * @return true if gameType was recognized and layers were (hopefully) generated, false if unrecognized */ - private boolean generateLayers(String gameType) { + private boolean generateLayers(String type) { // Create a new Location for the layers to work with--this is so that we don't modify the actual gameSpawn var Location layer = new Location(gameSpawn.getWorld(), gameSpawn.getX(), gameSpawn.getY(), gameSpawn.getZ(), gameSpawn.getYaw(), gameSpawn.getPitch()); - if (Objects.equals(roundType, "shovels")) { + if (Objects.equals(type, "shovels")) { layer.setY(layer.getY() - 1); Generator.generateLayer(layer, 17, 1, Material.SNOW_BLOCK); Generator.generateLayer(layer, 13, 1, Material.AIR); @@ -199,9 +192,9 @@ public class Game { Generator.generateLayer(layer, 4, 1, Material.PODZOL); layer.setY(layer.getY() + 2); Generator.generateLayer(layer, 4, 2, Material.TALL_GRASS); - roundType = "shovels"; + giveItems(lobbyPlayers, new ItemStack(Material.DIAMOND_SHOVEL)); } - else if (Objects.equals(roundType, "snowballs")) { + else if (Objects.equals(type, "snowballs")) { layer.setY(layer.getY() - 1); Generator.generateLayer(layer, 17, 1, Material.COAL_ORE); Generator.generateLayer(layer, 13, 1, Material.AIR); @@ -210,9 +203,9 @@ public class Game { Generator.generateLayer(layer, 4, 1, Material.AIR); layer.setY(layer.getY() - 1); Generator.generateLayer(layer, 4, 1, Material.LIME_GLAZED_TERRACOTTA); - roundType = "snowballs"; + giveItems(lobbyPlayers, new ItemStack(Material.SNOWBALL)); } - else if (Objects.equals(gameType, "mixed")) { + else if (Objects.equals(type, "mixed")) { // Randomly select either shovels or snowballs and re-run the method if (Random.nextInt(2) == 0) { generateLayers("shovels"); @@ -338,7 +331,7 @@ public class Game { else { displayTitles(gamePlayers, ChatColor.RED + "Round over!", ChatColor.GOLD + winner.getName() + " has won the round!", 5, 60, 5); // Re-generate layers - generateLayers(gameType); + generateLayers(roundType); // Wait 5s (100t) for tp method Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { // Re-scatter players -- cgit v1.2.3 From f53fff2ac0b4dcff796a8b2e318c1725fd298a73 Mon Sep 17 00:00:00 2001 From: Myles <43725835+MylesAndMore@users.noreply.github.com> Date: Thu, 8 Dec 2022 17:18:24 +0000 Subject: add even *more* things to do (yay!!) --- src/main/java/com/MylesAndMore/tumble/Game.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index 2106e9a..836f31a 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -192,7 +192,7 @@ public class Game { Generator.generateLayer(layer, 4, 1, Material.PODZOL); layer.setY(layer.getY() + 2); Generator.generateLayer(layer, 4, 2, Material.TALL_GRASS); - giveItems(lobbyPlayers, new ItemStack(Material.DIAMOND_SHOVEL)); + giveItems(lobbyPlayers, new ItemStack(Material.IRON_SHOVEL)); } else if (Objects.equals(type, "snowballs")) { layer.setY(layer.getY() - 1); -- cgit v1.2.3 From 2c741f101323ddadcf00a6414c0621f275866083 Mon Sep 17 00:00:00 2001 From: Myles <43725835+MylesAndMore@users.noreply.github.com> Date: Thu, 8 Dec 2022 17:25:59 +0000 Subject: convert chat message to actionbar --- src/main/java/com/MylesAndMore/tumble/Game.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index 836f31a..c4d5c1f 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -1,6 +1,10 @@ package com.MylesAndMore.tumble; import com.MylesAndMore.tumble.api.Generator; + +import net.md_5.bungee.api.ChatMessageType; +import net.md_5.bungee.api.chat.TextComponent; + import org.bukkit.*; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -261,13 +265,13 @@ public class Game { } /** - * Displays a message to a provided list of players - * @param players The player list for which to send the message to + * Displays an actionbar message to a provided list of players + * @param players The player list for which to display the actionbar to * @param message The provided message (String format) */ - private void displayMessage(List players, String message) { + private void displayActionbar(List players, String message) { for (Player aPlayer : players) { - aPlayer.sendMessage(message); + aPlayer.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(message)); } } @@ -360,7 +364,7 @@ public class Game { private void gameEnd(Player winner) { // Announce win displayTitles(gamePlayers, ChatColor.RED + "Game over!", ChatColor.GOLD + winner.getName() + " has won the game!", 5, 60, 5); - displayMessage(gamePlayers, ChatColor.BLUE + "Returning to lobby in ten seconds..."); + displayActionbar(gamePlayers, ChatColor.BLUE + "Returning to lobby in ten seconds..."); // Wait 10s (200t), then Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { // First, check to see if there is a separate location to tp the winner to -- cgit v1.2.3 From 126b83f1ca45457dc1c9e08c1d0fc30b4fc8b88d Mon Sep 17 00:00:00 2001 From: Myles <43725835+MylesAndMore@users.noreply.github.com> Date: Thu, 8 Dec 2022 20:53:57 +0000 Subject: program autostart logic --- src/main/java/com/MylesAndMore/tumble/Game.java | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index c4d5c1f..8099c80 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -38,6 +38,8 @@ public class Game { private String gameState; // Define a variable for the roundType private String roundType; + // Define a variable for the autostart PID + private int autoStartID; // Initialize a new instance of the Random class for use later private final Random Random = new Random(); @@ -143,6 +145,16 @@ public class Game { return true; } + 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); + } + /** * This method should be called on the death of one of the Game's players * @param player The player who died @@ -171,10 +183,17 @@ public class Game { public String getRoundType() { return roundType; } /** - * @return The game's current state as a String ("starting", "running", "complete") + * @return The game's current state as a String ("waiting", "starting", "running", "complete") + * Can also be null if not initialized. */ public String getGameState() { return gameState; } + /** + * @return The Bukkit process ID of the autostart process, if applicable + * Can also be null if not initialized, and -1 if the process failed to schedule. + */ + public int getAutoStartID() { return autoStartID; } + // BEGIN PRIVATE METHODS -- cgit v1.2.3 From 2d7de58b65fb7ecdd7c784707dbe2a39fa3d6e27 Mon Sep 17 00:00:00 2001 From: Myles Date: Thu, 8 Dec 2022 20:04:41 -0600 Subject: fix (most of) the bugs --- src/main/java/com/MylesAndMore/tumble/Game.java | 39 ++++++++++++++++++++----- 1 file changed, 31 insertions(+), 8 deletions(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') 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; } /** -- cgit v1.2.3 From f3ecc776931875fb36d775707d28c23ee047d188 Mon Sep 17 00:00:00 2001 From: Myles Date: Thu, 8 Dec 2022 22:06:40 -0600 Subject: LITERAL WEIRDEST BUG I HAVE EVER EXPERIENCED --- src/main/java/com/MylesAndMore/tumble/Game.java | 27 ++++++++++--------------- 1 file changed, 11 insertions(+), 16 deletions(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index 8eb9035..6d085df 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -47,8 +47,8 @@ public class Game { private final World gameWorld; private final Location gameSpawn; - // Make a list of the lobby's players for later - private List lobbyPlayers = TumbleManager.getPlayersInLobby(); +// // Make a list of the lobby's players for later +// private List lobbyPlayers = TumbleManager.getPlayersInLobby(); // Make a list of the game's players for later private List gamePlayers; // Make a list of the round's players @@ -73,7 +73,6 @@ public class Game { return false; } else { - Bukkit.getServer().broadcastMessage("game starting"); // Define the gameType if (Objects.equals(type, "shovels")) { gameState = "starting"; @@ -83,7 +82,7 @@ public class Game { // The else statement is just in case the generator fails; this command will fail if (generateLayers(type)) { // Send all players from lobby to the game - scatterPlayers(lobbyPlayers); + scatterPlayers(TumbleManager.getPlayersInLobby()); // Keep in mind that after this runs, this command will complete and return true } else { @@ -94,7 +93,7 @@ public class Game { gameState = "starting"; roundType = type; if (generateLayers(type)) { - scatterPlayers(lobbyPlayers); + scatterPlayers(TumbleManager.getPlayersInLobby()); } else { return false; @@ -104,7 +103,7 @@ public class Game { gameState = "starting"; roundType = type; if (generateLayers(type)) { - scatterPlayers(lobbyPlayers); + scatterPlayers(TumbleManager.getPlayersInLobby()); } else { return false; @@ -150,17 +149,14 @@ public class Game { * Initiates an automatic start of a Tumble game */ public void autoStart() { - 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"); + displayActionbar(TumbleManager.getPlayersInLobby(), ChatColor.GREEN + "Game will begin in 15 seconds!"); + playSound(TumbleManager.getPlayersInLobby(), Sound.BLOCK_NOTE_BLOCK_CHIME, SoundCategory.BLOCKS, 1, 1); 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); @@ -171,9 +167,8 @@ public class Game { */ 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"); + displayActionbar(TumbleManager.getPlayersInLobby(), ChatColor.RED + "Game start cancelled!"); + playSound(TumbleManager.getPlayersInLobby(), Sound.BLOCK_NOTE_BLOCK_BASS, SoundCategory.BLOCKS, 1, 1); gameState = null; autoStartID = -1; } @@ -238,7 +233,7 @@ public class Game { Generator.generateLayer(layer, 4, 1, Material.PODZOL); layer.setY(layer.getY() + 2); Generator.generateLayer(layer, 4, 2, Material.TALL_GRASS); - giveItems(lobbyPlayers, new ItemStack(Material.IRON_SHOVEL)); + giveItems(TumbleManager.getPlayersInLobby(), new ItemStack(Material.IRON_SHOVEL)); } else if (Objects.equals(type, "snowballs")) { layer.setY(layer.getY() - 1); @@ -249,7 +244,7 @@ public class Game { Generator.generateLayer(layer, 4, 1, Material.AIR); layer.setY(layer.getY() - 1); Generator.generateLayer(layer, 4, 1, Material.LIME_GLAZED_TERRACOTTA); - giveItems(lobbyPlayers, new ItemStack(Material.SNOWBALL)); + giveItems(TumbleManager.getPlayersInLobby(), new ItemStack(Material.SNOWBALL)); } else if (Objects.equals(type, "mixed")) { // Randomly select either shovels or snowballs and re-run the method -- cgit v1.2.3 From a56513d85180c699b566783d7e1ce1f12d641aa4 Mon Sep 17 00:00:00 2001 From: Myles Date: Sat, 10 Dec 2022 01:23:40 -0600 Subject: 1AM COMMIT LETS GOOOO - fixed about 20 bugs, glitches, exploits, you name it--Jacob can break anything (not even joking, did my first *real* playtest; it was...valuable...we'll leave it at that) - added some sort of block balancing (want to improve on it later maybe?) - change the prefix back to lowercase because we're emo or something (COMMONALITY SHUT UP) - game env is now more controlled (thanks Jacob) - can I go to bed now --- src/main/java/com/MylesAndMore/tumble/Game.java | 40 +++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 3 deletions(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index 6d085df..7de988a 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -6,6 +6,7 @@ import net.md_5.bungee.api.ChatMessageType; import net.md_5.bungee.api.chat.TextComponent; import org.bukkit.*; +import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; @@ -78,6 +79,8 @@ public class Game { gameState = "starting"; // Set the roundType to gameType since it won't change for this mode roundType = type; + // Clear the players' inventories so they can't bring any items into the game + clearInventories(TumbleManager.getPlayersInLobby()); // Generate the correct layers for a Shovels game // The else statement is just in case the generator fails; this command will fail if (generateLayers(type)) { @@ -92,6 +95,7 @@ public class Game { else if (Objects.equals(type, "snowballs")) { gameState = "starting"; roundType = type; + clearInventories(TumbleManager.getPlayersInLobby()); if (generateLayers(type)) { scatterPlayers(TumbleManager.getPlayersInLobby()); } @@ -102,6 +106,7 @@ public class Game { else if (Objects.equals(type, "mixed")) { gameState = "starting"; roundType = type; + clearInventories(TumbleManager.getPlayersInLobby()); if (generateLayers(type)) { scatterPlayers(TumbleManager.getPlayersInLobby()); } @@ -187,7 +192,7 @@ public class Game { // Otherwise, the game must have two people left (and one just died), meaning it is over // This logic is so that it will not remove the last player standing from the list, so we know who the winner is. else { - // roundPlayers.remove(player); + roundPlayers.remove(player); // End the game, passing the winner to the gameEnd method roundEnd(roundPlayers.get(0)); } @@ -229,11 +234,19 @@ public class Game { Generator.generateLayer(layer, 13, 1, Material.AIR); layer.setY(layer.getY() - 1); Generator.generateLayer(layer, 13, 1, Material.GRASS_BLOCK); + Generator.generateLayer(layer, 4, 1, Material.AIR); layer.setY(layer.getY() - 1); Generator.generateLayer(layer, 4, 1, Material.PODZOL); layer.setY(layer.getY() + 2); Generator.generateLayer(layer, 4, 2, Material.TALL_GRASS); - giveItems(TumbleManager.getPlayersInLobby(), new ItemStack(Material.IRON_SHOVEL)); + ItemStack shovel = new ItemStack(Material.IRON_SHOVEL); + shovel.addEnchantment(Enchantment.SILK_TOUCH, 1); + if (Objects.equals(gameState, "running")) { + giveItems(TumbleManager.getPlayersInGame(), shovel); + } + else if (Objects.equals(gameState, "starting")) { + giveItems(TumbleManager.getPlayersInLobby(), shovel); + } } else if (Objects.equals(type, "snowballs")) { layer.setY(layer.getY() - 1); @@ -244,7 +257,12 @@ public class Game { Generator.generateLayer(layer, 4, 1, Material.AIR); layer.setY(layer.getY() - 1); Generator.generateLayer(layer, 4, 1, Material.LIME_GLAZED_TERRACOTTA); - giveItems(TumbleManager.getPlayersInLobby(), new ItemStack(Material.SNOWBALL)); + if (Objects.equals(gameState, "running")) { + giveItems(TumbleManager.getPlayersInGame(), new ItemStack(Material.SNOWBALL)); + } + else if (Objects.equals(gameState, "starting")) { + giveItems(TumbleManager.getPlayersInLobby(), new ItemStack(Material.SNOWBALL)); + } } else if (Objects.equals(type, "mixed")) { // Randomly select either shovels or snowballs and re-run the method @@ -273,6 +291,16 @@ public class Game { } } + /** + * Clears the inventories of a provided player list + * @param players The player list for which to clear the inventories of + */ + private void clearInventories(List players) { + for (Player aPlayer : players) { + aPlayer.getInventory().clear(); + } + } + /** * Sets the gamemodes of a provided list of players * @param players The player list for which to set the gamemodes of @@ -370,6 +398,10 @@ public class Game { } // If that player doesn't have three wins, nobody else does, so we need another round else { + roundPlayers.get(0).setGameMode(GameMode.SPECTATOR); + roundPlayers.remove(0); + roundPlayers.addAll(gamePlayers); + clearInventories(gamePlayers); displayTitles(gamePlayers, ChatColor.RED + "Round over!", ChatColor.GOLD + winner.getName() + " has won the round!", 5, 60, 5); // Re-generate layers generateLayers(roundType); @@ -399,6 +431,8 @@ public class Game { } private void gameEnd(Player winner) { + winner.setGameMode(GameMode.SPECTATOR); + clearInventories(gamePlayers); // Announce win 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..."); -- cgit v1.2.3 From cf6bdc376b91e3c1ab5403e018470a7fee589986 Mon Sep 17 00:00:00 2001 From: Myles Date: Sat, 10 Dec 2022 14:59:58 -0600 Subject: THE CLUMPS WORK --- src/main/java/com/MylesAndMore/tumble/Game.java | 70 ++++++++++++------------- 1 file changed, 35 insertions(+), 35 deletions(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index 7de988a..789edff 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -2,6 +2,7 @@ package com.MylesAndMore.tumble; import com.MylesAndMore.tumble.api.Generator; +import com.MylesAndMore.tumble.api.Layers; import net.md_5.bungee.api.ChatMessageType; import net.md_5.bungee.api.chat.TextComponent; @@ -37,8 +38,8 @@ public class Game { // Define local game vars // The gameState keeps the current state of the game (I'm so creative, I know) private String gameState; - // Define a variable for the roundType - private String roundType; + // Define a variable for the gameType + private String gameType; // Define a variable for the autostart PID private int autoStartID = -1; @@ -77,8 +78,8 @@ public class Game { // Define the gameType if (Objects.equals(type, "shovels")) { gameState = "starting"; - // Set the roundType to gameType since it won't change for this mode - roundType = type; + // Set the type to gameType since it won't change for this mode + gameType = type; // Clear the players' inventories so they can't bring any items into the game clearInventories(TumbleManager.getPlayersInLobby()); // Generate the correct layers for a Shovels game @@ -94,7 +95,7 @@ public class Game { } else if (Objects.equals(type, "snowballs")) { gameState = "starting"; - roundType = type; + gameType = type; clearInventories(TumbleManager.getPlayersInLobby()); if (generateLayers(type)) { scatterPlayers(TumbleManager.getPlayersInLobby()); @@ -105,7 +106,7 @@ public class Game { } else if (Objects.equals(type, "mixed")) { gameState = "starting"; - roundType = type; + gameType = type; clearInventories(TumbleManager.getPlayersInLobby()); if (generateLayers(type)) { scatterPlayers(TumbleManager.getPlayersInLobby()); @@ -184,6 +185,7 @@ public class Game { */ public void playerDeath(Player player) { player.setGameMode(GameMode.SPECTATOR); + player.teleport(gameSpawn); // If there are more than 2 players in the game, if (roundPlayers.size() > 2) { // remove that player (who just died) from the roundPlayersArray, effectively eliminating them, @@ -200,11 +202,6 @@ public class Game { // Methods to get the game type and game state for other classes outside the Game - /** - * @return The round type of the current round as a String ("shovels", "snowballs") - */ - public String getRoundType() { return roundType; } - /** * @return The game's current state as a String ("waiting", "starting", "running", "complete") * Can also be null if not initialized. @@ -225,20 +222,20 @@ public class Game { * @param type can be either "shovels", "snowballs", or "mixed", anything else will fail generation * @return true if gameType was recognized and layers were (hopefully) generated, false if unrecognized */ + // Initialize Layers + private final Layers layers = new Layers(); private boolean generateLayers(String type) { // Create a new Location for the layers to work with--this is so that we don't modify the actual gameSpawn var Location layer = new Location(gameSpawn.getWorld(), gameSpawn.getX(), gameSpawn.getY(), gameSpawn.getZ(), gameSpawn.getYaw(), gameSpawn.getPitch()); if (Objects.equals(type, "shovels")) { layer.setY(layer.getY() - 1); - Generator.generateLayer(layer, 17, 1, Material.SNOW_BLOCK); + Generator.generateClumps(Generator.generateLayer(layer, 17, 1, Material.SNOW_BLOCK), layers.getMaterialList()); Generator.generateLayer(layer, 13, 1, Material.AIR); layer.setY(layer.getY() - 1); - Generator.generateLayer(layer, 13, 1, Material.GRASS_BLOCK); + Generator.generateClumps(Generator.generateLayer(layer, 13, 1, Material.GRASS_BLOCK), layers.getMaterialList()); Generator.generateLayer(layer, 4, 1, Material.AIR); layer.setY(layer.getY() - 1); - Generator.generateLayer(layer, 4, 1, Material.PODZOL); - layer.setY(layer.getY() + 2); - Generator.generateLayer(layer, 4, 2, Material.TALL_GRASS); + Generator.generateClumps(Generator.generateLayer(layer, 4, 1, Material.PODZOL), layers.getMaterialList()); ItemStack shovel = new ItemStack(Material.IRON_SHOVEL); shovel.addEnchantment(Enchantment.SILK_TOUCH, 1); if (Objects.equals(gameState, "running")) { @@ -250,13 +247,13 @@ public class Game { } else if (Objects.equals(type, "snowballs")) { layer.setY(layer.getY() - 1); - Generator.generateLayer(layer, 17, 1, Material.COAL_ORE); + Generator.generateClumps(Generator.generateLayer(layer, 17, 1, Material.STONE), layers.getMaterialList()); Generator.generateLayer(layer, 13, 1, Material.AIR); layer.setY(layer.getY() - 1); - Generator.generateLayer(layer, 13, 1, Material.GRANITE); + Generator.generateClumps(Generator.generateLayer(layer, 13, 1, Material.GRANITE), layers.getMaterialList()); Generator.generateLayer(layer, 4, 1, Material.AIR); layer.setY(layer.getY() - 1); - Generator.generateLayer(layer, 4, 1, Material.LIME_GLAZED_TERRACOTTA); + Generator.generateClumps(Generator.generateLayer(layer, 4, 1, Material.LIME_GLAZED_TERRACOTTA), layers.getMaterialList()); if (Objects.equals(gameState, "running")) { giveItems(TumbleManager.getPlayersInGame(), new ItemStack(Material.SNOWBALL)); } @@ -403,30 +400,33 @@ public class Game { roundPlayers.addAll(gamePlayers); clearInventories(gamePlayers); displayTitles(gamePlayers, ChatColor.RED + "Round over!", ChatColor.GOLD + winner.getName() + " has won the round!", 5, 60, 5); - // Re-generate layers - generateLayers(roundType); - // Wait 5s (100t) for tp method + // Wait for player to respawn before completely l a g g i n g the server ._. Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { - // Re-scatter players - gameState = "starting"; - scatterPlayers(gamePlayers); - playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 1, 1); - displayTitles(gamePlayers, ChatColor.DARK_GREEN + "3", null, 3, 10, 7); + // Re-generate layers + generateLayers(gameType); + // Wait 5s (100t) for tp method Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { + // Re-scatter players + gameState = "starting"; + scatterPlayers(gamePlayers); playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 1, 1); - displayTitles(gamePlayers, ChatColor.YELLOW + "2", null, 3, 10, 7); + displayTitles(gamePlayers, ChatColor.DARK_GREEN + "3", null, 3, 10, 7); Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 1, 1); - displayTitles(gamePlayers, ChatColor.DARK_RED + "1", null, 3, 10, 7); + displayTitles(gamePlayers, ChatColor.YELLOW + "2", null, 3, 10, 7); Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { - playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 1, 2); - displayTitles(gamePlayers, ChatColor.GREEN + "Go!", null, 1, 5, 1); - setGamemode(gamePlayers, GameMode.SURVIVAL); - gameState = "running"; + playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 1, 1); + displayTitles(gamePlayers, ChatColor.DARK_RED + "1", null, 3, 10, 7); + Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { + playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 1, 2); + displayTitles(gamePlayers, ChatColor.GREEN + "Go!", null, 1, 5, 1); + setGamemode(gamePlayers, GameMode.SURVIVAL); + gameState = "running"; + }, 20); }, 20); }, 20); - }, 20); - }, 100); + }, 100); + }, 1); } } -- cgit v1.2.3 From 6aab3dfcbb7636e1b11cd54e10bddff45f5ef8e9 Mon Sep 17 00:00:00 2001 From: Myles Date: Sat, 10 Dec 2022 17:53:00 -0600 Subject: musik --- src/main/java/com/MylesAndMore/tumble/Game.java | 47 +++++++++++++++++-------- 1 file changed, 33 insertions(+), 14 deletions(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index 789edff..b5932e3 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -130,19 +130,20 @@ public class Game { // Wait 5s (100t) for the clients to load in Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { // Begin the countdown sequence - playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 1, 1); + playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 5, 1); displayTitles(gamePlayers, ChatColor.DARK_GREEN + "3", null, 3, 10, 7); Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { - playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 1, 1); + playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 5, 1); displayTitles(gamePlayers, ChatColor.YELLOW + "2", null, 3, 10, 7); Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { - playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 1, 1); + playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 5, 1); displayTitles(gamePlayers, ChatColor.DARK_RED + "1", null, 3, 10, 7); Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { - playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 1, 2); + playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 5, 2); displayTitles(gamePlayers, ChatColor.GREEN + "Go!", null, 1, 5, 1); setGamemode(gamePlayers, GameMode.SURVIVAL); gameState = "running"; + playMusic(gamePlayers, SoundCategory.NEUTRAL, 1, 1); }, 20); }, 20); }, 20); @@ -351,6 +352,26 @@ public class Game { } } + private void playMusic(@NotNull List players, @NotNull SoundCategory category, float volume, float pitch) { + List sounds = new ArrayList<>(List.of( + "minecraft:tumble.0", + "minecraft:tumble.1", + "minecraft:tumble.2", + "minecraft:tumble.3", + "minecraft:tumble.4", + "minecraft:tumble.5", + "minecraft:tumble.6", + "minecraft:tumble.7", + "minecraft:tumble.8", + "minecraft:tumble.9")); + for (Player aPlayer : players) { + aPlayer.playSound(aPlayer.getLocation(), sounds.get(Random.nextInt(sounds.size())), category, volume, pitch); + } + Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { + playMusic(gamePlayers, SoundCategory.NEUTRAL, 1, 1); + }, 1460); + } + /** * Teleports a list of players to the specified scatter locations in the gameWorld * @param players a List of Players to teleport @@ -361,17 +382,15 @@ public class Game { double y = gameSpawn.getY(); double z = gameSpawn.getZ(); // Create the scatter locations based off the game's spawn - List scatterLocations = new ArrayList<>(); - scatterLocations.addAll(List.of( - new Location(gameWorld, (x - 14.5), y, (z + 0.5) , -90, 0), + List scatterLocations = new ArrayList<>(List.of( + new Location(gameWorld, (x - 14.5), y, (z + 0.5), -90, 0), new Location(gameWorld, (x + 0.5), y, (z - 14.5), 0, 0), new Location(gameWorld, (x + 15.5), y, (z + 0.5), 90, 0), - new Location(gameWorld, (x + 0.5), y, (z + 15.5), 180, 0 ), + new Location(gameWorld, (x + 0.5), y, (z + 15.5), 180, 0), new Location(gameWorld, (x - 10.5), y, (z - 10.5), -45, 0), new Location(gameWorld, (x - 10.5), y, (z + 11.5), -135, 0), new Location(gameWorld, (x + 11.5), y, (z - 10.5), 45, 0), - new Location(gameWorld, (x + 11.5), y, (z + 11.5), 135, 0)) - ); + new Location(gameWorld, (x + 11.5), y, (z + 11.5), 135, 0))); // Shuffle the list (randomize) Collections.shuffle(scatterLocations); // While there are still unteleported players from the list, teleport them @@ -409,16 +428,16 @@ public class Game { // Re-scatter players gameState = "starting"; scatterPlayers(gamePlayers); - playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 1, 1); + playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 5, 1); displayTitles(gamePlayers, ChatColor.DARK_GREEN + "3", null, 3, 10, 7); Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { - playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 1, 1); + playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 5, 1); displayTitles(gamePlayers, ChatColor.YELLOW + "2", null, 3, 10, 7); Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { - playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 1, 1); + playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 5, 1); displayTitles(gamePlayers, ChatColor.DARK_RED + "1", null, 3, 10, 7); Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { - playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 1, 2); + playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 5, 2); displayTitles(gamePlayers, ChatColor.GREEN + "Go!", null, 1, 5, 1); setGamemode(gamePlayers, GameMode.SURVIVAL); gameState = "running"; -- cgit v1.2.3 From bfc632c3d5d9b4419de023542c32a58869c7eb60 Mon Sep 17 00:00:00 2001 From: Myles Date: Sun, 11 Dec 2022 01:08:11 -0600 Subject: fix bugs --- src/main/java/com/MylesAndMore/tumble/Game.java | 26 ++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index b5932e3..064b5ae 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -8,6 +8,8 @@ import net.md_5.bungee.api.chat.TextComponent; import org.bukkit.*; import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Item; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; @@ -42,6 +44,8 @@ public class Game { private String gameType; // Define a variable for the autostart PID private int autoStartID = -1; + // Define a variable for music ID + private int musicID = -1; // Initialize a new instance of the Random class for use later private final Random Random = new Random(); @@ -186,7 +190,14 @@ public class Game { */ public void playerDeath(Player player) { player.setGameMode(GameMode.SPECTATOR); - player.teleport(gameSpawn); + // Add a delay to tp them to the gameWorld just in case they have a bed in another world + // Delay is needed because instant respawn takes 1t + Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { + player.teleport(gameSpawn); + Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { + player.setGameMode(GameMode.SPECTATOR); + }, 5); + }, 5); // If there are more than 2 players in the game, if (roundPlayers.size() > 2) { // remove that player (who just died) from the roundPlayersArray, effectively eliminating them, @@ -364,10 +375,11 @@ public class Game { "minecraft:tumble.7", "minecraft:tumble.8", "minecraft:tumble.9")); + String currentSong = sounds.get(Random.nextInt(sounds.size())); for (Player aPlayer : players) { - aPlayer.playSound(aPlayer.getLocation(), sounds.get(Random.nextInt(sounds.size())), category, volume, pitch); + aPlayer.playSound(aPlayer.getLocation(), currentSong, category, volume, pitch); } - Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { + musicID = Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { playMusic(gamePlayers, SoundCategory.NEUTRAL, 1, 1); }, 1460); } @@ -425,6 +437,12 @@ public class Game { generateLayers(gameType); // Wait 5s (100t) for tp method Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { + // Kill all items (pistons are weird) + for (Entity entity : gameWorld.getEntities()) { + if (entity instanceof Item) { + entity.remove(); + } + } // Re-scatter players gameState = "starting"; scatterPlayers(gamePlayers); @@ -457,6 +475,8 @@ public class Game { displayActionbar(gamePlayers, ChatColor.BLUE + "Returning to lobby in ten seconds..."); // Wait 10s (200t), then Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { + // Stop music from replaying + Bukkit.getServer().getScheduler().cancelTask(musicID); // First, check to see if there is a separate location to tp the winner to if ((TumbleManager.getPlugin().getConfig().getDouble("winnerTeleport.x") != 0) && (TumbleManager.getPlugin().getConfig().getDouble("winnerTeleport.y") != 0) && (TumbleManager.getPlugin().getConfig().getDouble("winnerTeleport.z") != 0)) { // Tp the winner to that location -- cgit v1.2.3 From b3a697e36b2f86ac215ee766c2b6f7ddf123e0fb Mon Sep 17 00:00:00 2001 From: Myles <43725835+MylesAndMore@users.noreply.github.com> Date: Sun, 11 Dec 2022 17:49:35 +0000 Subject: make rounds timed --- src/main/java/com/MylesAndMore/tumble/Game.java | 68 +++++++++++++++++++------ 1 file changed, 52 insertions(+), 16 deletions(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index 064b5ae..2b3d7b4 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -42,6 +42,8 @@ public class Game { private String gameState; // Define a variable for the gameType private String gameType; + // Define a variable for the game ID + private int gameID = -1; // Define a variable for the autostart PID private int autoStartID = -1; // Define a variable for music ID @@ -91,7 +93,6 @@ public class Game { if (generateLayers(type)) { // Send all players from lobby to the game scatterPlayers(TumbleManager.getPlayersInLobby()); - // Keep in mind that after this runs, this command will complete and return true } else { return false; @@ -256,6 +257,17 @@ public class Game { else if (Objects.equals(gameState, "starting")) { giveItems(TumbleManager.getPlayersInLobby(), shovel); } + // Schedule a process to give snowballs after 2m30s (so people can't island, the OG game had this) + // Add 160t because of the countdown + gameID = Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { + clearInventories(gamePlayers); + giveItems(gamePlayers, new ItemStack(Material.SNOWBALL)); + displayActionbar(gamePlayers, ChatColor.DARK_RED + "Showdown!"); + // End the round in another 2m30s + gameID = Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { + roundEnd(null); + }, 3000); + }, 3160); } else if (Objects.equals(type, "snowballs")) { layer.setY(layer.getY() - 1); @@ -272,6 +284,10 @@ public class Game { else if (Objects.equals(gameState, "starting")) { giveItems(TumbleManager.getPlayersInLobby(), new ItemStack(Material.SNOWBALL)); } + // End the round in 5m + gameID = Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { + roundEnd(null); + }, 6160); } else if (Objects.equals(type, "mixed")) { // Randomly select either shovels or snowballs and re-run the method @@ -364,7 +380,9 @@ public class Game { } private void playMusic(@NotNull List players, @NotNull SoundCategory category, float volume, float pitch) { - List sounds = new ArrayList<>(List.of( + List sounds = new ArrayList<>(); + if (sounds.size() == 0) { + sounds = new ArrayList<>(List.of( "minecraft:tumble.0", "minecraft:tumble.1", "minecraft:tumble.2", @@ -375,13 +393,17 @@ public class Game { "minecraft:tumble.7", "minecraft:tumble.8", "minecraft:tumble.9")); - String currentSong = sounds.get(Random.nextInt(sounds.size())); - for (Player aPlayer : players) { - aPlayer.playSound(aPlayer.getLocation(), currentSong, category, volume, pitch); } - musicID = Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { - playMusic(gamePlayers, SoundCategory.NEUTRAL, 1, 1); - }, 1460); + else { + String currentSong = sounds.get(Random.nextInt(sounds.size())); + for (Player aPlayer : players) { + aPlayer.playSound(aPlayer.getLocation(), currentSong, category, volume, pitch); + } + sounds.remove(currentSong); + musicID = Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { + playMusic(gamePlayers, SoundCategory.NEUTRAL, 1, 1); + }, 1460); + } } /** @@ -414,15 +436,23 @@ public class Game { } } - private void roundEnd(Player winner) { - // Set the wins of the player to their current # of wins + 1 - gameWins.set(gamePlayers.indexOf(winner), (gameWins.get(gamePlayers.indexOf(winner)) + 1)); + private void roundEnd(@Nullable Player winner) { + // Cancel the tasks to auto-end the round + Bukkit.getServer().getScheduler().cancelTask(gameID); + // Check if there was a winner of the round + if (winner != null) { + // Set the wins of the player to their current # of wins + 1 + gameWins.set(gamePlayers.indexOf(winner), (gameWins.get(gamePlayers.indexOf(winner)) + 1)); + } // Clear old layers (as a fill command, this would be /fill ~-20 ~-4 ~-20 ~20 ~ ~20 relative to spawn) Generator.generateCuboid(new Location(gameSpawn.getWorld(), gameSpawn.getX() - 20, gameSpawn.getY() - 4, gameSpawn.getZ() - 20), new Location(gameSpawn.getWorld(), gameSpawn.getX() + 20, gameSpawn.getY(), gameSpawn.getZ() + 20), Material.AIR); playSound(gamePlayers, Sound.BLOCK_NOTE_BLOCK_PLING, SoundCategory.BLOCKS, 5, 0); - // If the player has three wins, they won the game, so initiate the gameEnd - if (gameWins.get(gamePlayers.indexOf(winner)) == 3) { - gameEnd(winner); + // Again, check if there was a winner to...win + if (winner != null) { + // If the player has three wins, they won the game, so initiate the gameEnd + if (gameWins.get(gamePlayers.indexOf(winner)) == 3) { + gameEnd(winner); + } } // If that player doesn't have three wins, nobody else does, so we need another round else { @@ -430,8 +460,14 @@ public class Game { roundPlayers.remove(0); roundPlayers.addAll(gamePlayers); clearInventories(gamePlayers); - displayTitles(gamePlayers, ChatColor.RED + "Round over!", ChatColor.GOLD + winner.getName() + " has won the round!", 5, 60, 5); - // Wait for player to respawn before completely l a g g i n g the server ._. + // Display personalized title if someone won, generalized if not + if (winner != null) { + displayTitles(gamePlayers, ChatColor.RED + "Round over!", ChatColor.GOLD + winner.getName() + " has won the round!", 5, 60, 5); + } + else { + displayTitles(gamePlayers, ChatColor.RED + "Round over!", ChatColor.GOLD + "Draw!", 5, 60, 5); + } + // Wait for player to respawn before completely l a g g i n g the server ._. Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { // Re-generate layers generateLayers(gameType); -- cgit v1.2.3 From 143d998a9d6df2ce69594e90e88cc9e9be8c48a1 Mon Sep 17 00:00:00 2001 From: Myles Date: Sun, 11 Dec 2022 16:32:32 -0600 Subject: add new layer types and gen types --- src/main/java/com/MylesAndMore/tumble/Game.java | 232 +++++++++++++++--------- 1 file changed, 149 insertions(+), 83 deletions(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index 2b3d7b4..3d83d23 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -48,6 +48,8 @@ public class Game { private int autoStartID = -1; // Define a variable for music ID private int musicID = -1; + // Define a variable to keep the list of tracks that have already played in the game + List sounds = new ArrayList<>(); // Initialize a new instance of the Random class for use later private final Random Random = new Random(); @@ -82,47 +84,27 @@ public class Game { } else { // Define the gameType - if (Objects.equals(type, "shovels")) { - gameState = "starting"; - // Set the type to gameType since it won't change for this mode - gameType = type; - // Clear the players' inventories so they can't bring any items into the game - clearInventories(TumbleManager.getPlayersInLobby()); - // Generate the correct layers for a Shovels game - // The else statement is just in case the generator fails; this command will fail - if (generateLayers(type)) { - // Send all players from lobby to the game - scatterPlayers(TumbleManager.getPlayersInLobby()); - } - else { - return false; - } - } - else if (Objects.equals(type, "snowballs")) { - gameState = "starting"; - gameType = type; - clearInventories(TumbleManager.getPlayersInLobby()); - if (generateLayers(type)) { - scatterPlayers(TumbleManager.getPlayersInLobby()); - } - else { - return false; - } - } - else if (Objects.equals(type, "mixed")) { - gameState = "starting"; - gameType = type; - clearInventories(TumbleManager.getPlayersInLobby()); - if (generateLayers(type)) { - scatterPlayers(TumbleManager.getPlayersInLobby()); - } - else { + switch (type) { + case "shovels": + case "snowballs": + case "mixed": + gameState = "starting"; + // Set the type to gameType since it won't change for this mode + gameType = type; + // Clear the players' inventories so they can't bring any items into the game + clearInventories(TumbleManager.getPlayersInLobby()); + // Generate the correct layers for a Shovels game + // The else statement is just in case the generator fails; this command will fail + if (generateLayers(type)) { + // Send all players from lobby to the game + scatterPlayers(TumbleManager.getPlayersInLobby()); + } else { + return false; + } + break; + default: + // The game type in the config did not match a specified game type; return false to signify that return false; - } - } - else { - // The game type in the config did not match a specified game type; return false to signify that - return false; } // If a game creation succeeded, then, // Update the game's players for later @@ -230,25 +212,47 @@ public class Game { // BEGIN PRIVATE METHODS + // Initialize Layers class + private final Layers layers = new Layers(); /** * Generates the layers in the gameWorld for a certain gameType * @param type can be either "shovels", "snowballs", or "mixed", anything else will fail generation * @return true if gameType was recognized and layers were (hopefully) generated, false if unrecognized */ - // Initialize Layers - private final Layers layers = new Layers(); private boolean generateLayers(String type) { // Create a new Location for the layers to work with--this is so that we don't modify the actual gameSpawn var Location layer = new Location(gameSpawn.getWorld(), gameSpawn.getX(), gameSpawn.getY(), gameSpawn.getZ(), gameSpawn.getYaw(), gameSpawn.getPitch()); if (Objects.equals(type, "shovels")) { layer.setY(layer.getY() - 1); - Generator.generateClumps(Generator.generateLayer(layer, 17, 1, Material.SNOW_BLOCK), layers.getMaterialList()); - Generator.generateLayer(layer, 13, 1, Material.AIR); - layer.setY(layer.getY() - 1); - Generator.generateClumps(Generator.generateLayer(layer, 13, 1, Material.GRASS_BLOCK), layers.getMaterialList()); - Generator.generateLayer(layer, 4, 1, Material.AIR); - layer.setY(layer.getY() - 1); - Generator.generateClumps(Generator.generateLayer(layer, 4, 1, Material.PODZOL), layers.getMaterialList()); + // Choose a random type of generation; a circular layer, a square layer, or a multi-tiered layer of either variety + if (Random.nextInt(4) == 0) { + // Circular layer + Generator.generateClumps(Generator.generateLayer(layer, 17, 1, Material.SNOW_BLOCK), layers.getMaterialList()); + } + else if (Random.nextInt(4) == 1) { + // Square layer + Generator.generateClumps(Generator.generateCuboid(new Location(layer.getWorld(), layer.getX() - 17, layer.getY(), layer.getZ() - 17), new Location(layer.getWorld(), layer.getX() + 17, layer.getY(), layer.getZ() + 17), Material.SNOW_BLOCK), layers.getMaterialList()); + } + else if (Random.nextInt(4) == 2) { + // Multi-tiered circle + Generator.generateClumps(Generator.generateLayer(layer, 17, 1, Material.SNOW_BLOCK), layers.getMaterialList()); + Generator.generateLayer(layer, 13, 1, Material.AIR); + layer.setY(layer.getY() - 1); + Generator.generateClumps(Generator.generateLayer(layer, 13, 1, Material.GRASS_BLOCK), layers.getMaterialList()); + Generator.generateLayer(layer, 4, 1, Material.AIR); + layer.setY(layer.getY() - 1); + Generator.generateClumps(Generator.generateLayer(layer, 4, 1, Material.PODZOL), layers.getMaterialList()); + } + else { + // Multi-tiered square + Generator.generateClumps(Generator.generateCuboid(new Location(layer.getWorld(), layer.getX() - 17, layer.getY(), layer.getZ() - 17), new Location(layer.getWorld(), layer.getX() + 17, layer.getY(), layer.getZ() + 17), Material.SNOW_BLOCK), layers.getMaterialList()); + Generator.generateCuboid(new Location(layer.getWorld(), layer.getX() - 13, layer.getY(), layer.getZ() - 13), new Location(layer.getWorld(), layer.getX() + 13, layer.getY(), layer.getZ() + 13), Material.AIR); + layer.setY(layer.getY() - 1); + Generator.generateClumps(Generator.generateCuboid(new Location(layer.getWorld(), layer.getX() - 13, layer.getY(), layer.getZ() - 13), new Location(layer.getWorld(), layer.getX() + 13, layer.getY(), layer.getZ() + 13), Material.GRASS_BLOCK), layers.getMaterialList()); + Generator.generateCuboid(new Location(layer.getWorld(), layer.getX() - 7, layer.getY(), layer.getZ() - 7), new Location(layer.getWorld(), layer.getX() + 7, layer.getY(), layer.getZ() + 7), Material.AIR); + layer.setY(layer.getY() - 1); + Generator.generateClumps(Generator.generateCuboid(new Location(layer.getWorld(), layer.getX() - 7, layer.getY(), layer.getZ() - 7), new Location(layer.getWorld(), layer.getX() + 7, layer.getY(), layer.getZ() + 7), Material.PODZOL), layers.getMaterialList()); + } ItemStack shovel = new ItemStack(Material.IRON_SHOVEL); shovel.addEnchantment(Enchantment.SILK_TOUCH, 1); if (Objects.equals(gameState, "running")) { @@ -263,6 +267,7 @@ public class Game { clearInventories(gamePlayers); giveItems(gamePlayers, new ItemStack(Material.SNOWBALL)); displayActionbar(gamePlayers, ChatColor.DARK_RED + "Showdown!"); + playSound(gamePlayers, Sound.ENTITY_ELDER_GUARDIAN_CURSE, SoundCategory.HOSTILE, 1, 1); // End the round in another 2m30s gameID = Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { roundEnd(null); @@ -271,13 +276,79 @@ public class Game { } else if (Objects.equals(type, "snowballs")) { layer.setY(layer.getY() - 1); - Generator.generateClumps(Generator.generateLayer(layer, 17, 1, Material.STONE), layers.getMaterialList()); - Generator.generateLayer(layer, 13, 1, Material.AIR); - layer.setY(layer.getY() - 1); - Generator.generateClumps(Generator.generateLayer(layer, 13, 1, Material.GRANITE), layers.getMaterialList()); - Generator.generateLayer(layer, 4, 1, Material.AIR); - layer.setY(layer.getY() - 1); - Generator.generateClumps(Generator.generateLayer(layer, 4, 1, Material.LIME_GLAZED_TERRACOTTA), layers.getMaterialList()); + // Similar generation to shovels, except there are three layers + if (Random.nextInt(4) == 0) { + // Circular layer + Generator.generateClumps(Generator.generateLayer(layer, 17, 1, Material.STONE), layers.getMaterialList()); + layer.setY(layer.getY() - 6); + Generator.generateClumps(Generator.generateLayer(layer, 17, 1, Material.STONE), layers.getMaterialList()); + layer.setY(layer.getY() - 6); + Generator.generateClumps(Generator.generateLayer(layer, 17, 1, Material.STONE), layers.getMaterialList()); + } + else if (Random.nextInt(4) == 1) { + // Square layer + Generator.generateClumps(Generator.generateCuboid(new Location(layer.getWorld(), layer.getX() - 17, layer.getY(), layer.getZ() - 17), new Location(layer.getWorld(), layer.getX() + 17, layer.getY(), layer.getZ() + 17), Material.STONE), layers.getMaterialList()); + layer.setY(layer.getY() - 6); + Generator.generateClumps(Generator.generateCuboid(new Location(layer.getWorld(), layer.getX() - 17, layer.getY(), layer.getZ() - 17), new Location(layer.getWorld(), layer.getX() + 17, layer.getY(), layer.getZ() + 17), Material.STONE), layers.getMaterialList()); + layer.setY(layer.getY() - 6); + Generator.generateClumps(Generator.generateCuboid(new Location(layer.getWorld(), layer.getX() - 17, layer.getY(), layer.getZ() - 17), new Location(layer.getWorld(), layer.getX() + 17, layer.getY(), layer.getZ() + 17), Material.STONE), layers.getMaterialList()); + } + else if (Random.nextInt(4) == 2) { + // Multi-tiered circle + Generator.generateClumps(Generator.generateLayer(layer, 17, 1, Material.STONE), layers.getMaterialList()); + Generator.generateLayer(layer, 13, 1, Material.AIR); + layer.setY(layer.getY() - 1); + Generator.generateClumps(Generator.generateLayer(layer, 13, 1, Material.GRANITE), layers.getMaterialList()); + Generator.generateLayer(layer, 4, 1, Material.AIR); + layer.setY(layer.getY() - 1); + Generator.generateClumps(Generator.generateLayer(layer, 4, 1, Material.LIME_GLAZED_TERRACOTTA), layers.getMaterialList()); + layer.setY(layer.getY() - 6); + + Generator.generateClumps(Generator.generateLayer(layer, 17, 1, Material.STONE), layers.getMaterialList()); + Generator.generateLayer(layer, 13, 1, Material.AIR); + layer.setY(layer.getY() - 1); + Generator.generateClumps(Generator.generateLayer(layer, 13, 1, Material.GRANITE), layers.getMaterialList()); + Generator.generateLayer(layer, 4, 1, Material.AIR); + layer.setY(layer.getY() - 1); + Generator.generateClumps(Generator.generateLayer(layer, 4, 1, Material.LIME_GLAZED_TERRACOTTA), layers.getMaterialList()); + layer.setY(layer.getY() - 6); + + Generator.generateClumps(Generator.generateLayer(layer, 17, 1, Material.STONE), layers.getMaterialList()); + Generator.generateLayer(layer, 13, 1, Material.AIR); + layer.setY(layer.getY() - 1); + Generator.generateClumps(Generator.generateLayer(layer, 13, 1, Material.GRANITE), layers.getMaterialList()); + Generator.generateLayer(layer, 4, 1, Material.AIR); + layer.setY(layer.getY() - 1); + Generator.generateClumps(Generator.generateLayer(layer, 4, 1, Material.LIME_GLAZED_TERRACOTTA), layers.getMaterialList()); + } + else { + // Multi-tiered square + Generator.generateClumps(Generator.generateCuboid(new Location(layer.getWorld(), layer.getX() - 17, layer.getY(), layer.getZ() - 17), new Location(layer.getWorld(), layer.getX() + 17, layer.getY(), layer.getZ() + 17), Material.STONE), layers.getMaterialList()); + Generator.generateCuboid(new Location(layer.getWorld(), layer.getX() - 13, layer.getY(), layer.getZ() - 13), new Location(layer.getWorld(), layer.getX() + 13, layer.getY(), layer.getZ() + 13), Material.AIR); + layer.setY(layer.getY() - 1); + Generator.generateClumps(Generator.generateCuboid(new Location(layer.getWorld(), layer.getX() - 13, layer.getY(), layer.getZ() - 13), new Location(layer.getWorld(), layer.getX() + 13, layer.getY(), layer.getZ() + 13), Material.GRANITE), layers.getMaterialList()); + Generator.generateCuboid(new Location(layer.getWorld(), layer.getX() - 7, layer.getY(), layer.getZ() - 7), new Location(layer.getWorld(), layer.getX() + 7, layer.getY(), layer.getZ() + 7), Material.AIR); + layer.setY(layer.getY() - 1); + Generator.generateClumps(Generator.generateCuboid(new Location(layer.getWorld(), layer.getX() - 7, layer.getY(), layer.getZ() - 7), new Location(layer.getWorld(), layer.getX() + 7, layer.getY(), layer.getZ() + 7), Material.LIME_GLAZED_TERRACOTTA), layers.getMaterialList()); + layer.setY(layer.getY() - 6); + + Generator.generateClumps(Generator.generateCuboid(new Location(layer.getWorld(), layer.getX() - 17, layer.getY(), layer.getZ() - 17), new Location(layer.getWorld(), layer.getX() + 17, layer.getY(), layer.getZ() + 17), Material.STONE), layers.getMaterialList()); + Generator.generateCuboid(new Location(layer.getWorld(), layer.getX() - 13, layer.getY(), layer.getZ() - 13), new Location(layer.getWorld(), layer.getX() + 13, layer.getY(), layer.getZ() + 13), Material.AIR); + layer.setY(layer.getY() - 1); + Generator.generateClumps(Generator.generateCuboid(new Location(layer.getWorld(), layer.getX() - 13, layer.getY(), layer.getZ() - 13), new Location(layer.getWorld(), layer.getX() + 13, layer.getY(), layer.getZ() + 13), Material.GRANITE), layers.getMaterialList()); + Generator.generateCuboid(new Location(layer.getWorld(), layer.getX() - 7, layer.getY(), layer.getZ() - 7), new Location(layer.getWorld(), layer.getX() + 7, layer.getY(), layer.getZ() + 7), Material.AIR); + layer.setY(layer.getY() - 1); + Generator.generateClumps(Generator.generateCuboid(new Location(layer.getWorld(), layer.getX() - 7, layer.getY(), layer.getZ() - 7), new Location(layer.getWorld(), layer.getX() + 7, layer.getY(), layer.getZ() + 7), Material.LIME_GLAZED_TERRACOTTA), layers.getMaterialList()); + layer.setY(layer.getY() - 6); + + Generator.generateClumps(Generator.generateCuboid(new Location(layer.getWorld(), layer.getX() - 17, layer.getY(), layer.getZ() - 17), new Location(layer.getWorld(), layer.getX() + 17, layer.getY(), layer.getZ() + 17), Material.STONE), layers.getMaterialList()); + Generator.generateCuboid(new Location(layer.getWorld(), layer.getX() - 13, layer.getY(), layer.getZ() - 13), new Location(layer.getWorld(), layer.getX() + 13, layer.getY(), layer.getZ() + 13), Material.AIR); + layer.setY(layer.getY() - 1); + Generator.generateClumps(Generator.generateCuboid(new Location(layer.getWorld(), layer.getX() - 13, layer.getY(), layer.getZ() - 13), new Location(layer.getWorld(), layer.getX() + 13, layer.getY(), layer.getZ() + 13), Material.GRANITE), layers.getMaterialList()); + Generator.generateCuboid(new Location(layer.getWorld(), layer.getX() - 7, layer.getY(), layer.getZ() - 7), new Location(layer.getWorld(), layer.getX() + 7, layer.getY(), layer.getZ() + 7), Material.AIR); + layer.setY(layer.getY() - 1); + Generator.generateClumps(Generator.generateCuboid(new Location(layer.getWorld(), layer.getX() - 7, layer.getY(), layer.getZ() - 7), new Location(layer.getWorld(), layer.getX() + 7, layer.getY(), layer.getZ() + 7), Material.LIME_GLAZED_TERRACOTTA), layers.getMaterialList()); + } if (Objects.equals(gameState, "running")) { giveItems(TumbleManager.getPlayersInGame(), new ItemStack(Material.SNOWBALL)); } @@ -285,9 +356,7 @@ public class Game { giveItems(TumbleManager.getPlayersInLobby(), new ItemStack(Material.SNOWBALL)); } // End the round in 5m - gameID = Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { - roundEnd(null); - }, 6160); + gameID = Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> roundEnd(null), 6160); } else if (Objects.equals(type, "mixed")) { // Randomly select either shovels or snowballs and re-run the method @@ -380,30 +449,27 @@ public class Game { } private void playMusic(@NotNull List players, @NotNull SoundCategory category, float volume, float pitch) { - List sounds = new ArrayList<>(); if (sounds.size() == 0) { - sounds = new ArrayList<>(List.of( - "minecraft:tumble.0", - "minecraft:tumble.1", - "minecraft:tumble.2", - "minecraft:tumble.3", - "minecraft:tumble.4", - "minecraft:tumble.5", - "minecraft:tumble.6", - "minecraft:tumble.7", - "minecraft:tumble.8", - "minecraft:tumble.9")); + sounds.addAll(List.of( + "minecraft:tumble.0", + "minecraft:tumble.1", + "minecraft:tumble.2", + "minecraft:tumble.3", + "minecraft:tumble.4", + "minecraft:tumble.5", + "minecraft:tumble.6", + "minecraft:tumble.7", + "minecraft:tumble.8", + "minecraft:tumble.9")); } - else { - String currentSong = sounds.get(Random.nextInt(sounds.size())); - for (Player aPlayer : players) { - aPlayer.playSound(aPlayer.getLocation(), currentSong, category, volume, pitch); - } - sounds.remove(currentSong); - musicID = Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { - playMusic(gamePlayers, SoundCategory.NEUTRAL, 1, 1); - }, 1460); + String currentSong = sounds.get(Random.nextInt(sounds.size())); + for (Player aPlayer : players) { + aPlayer.playSound(aPlayer.getLocation(), currentSong, category, volume, pitch); } + sounds.remove(currentSong); + musicID = Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { + playMusic(gamePlayers, SoundCategory.NEUTRAL, 1, 1); + }, 1460); } /** @@ -437,15 +503,15 @@ public class Game { } private void roundEnd(@Nullable Player winner) { - // Cancel the tasks to auto-end the round + // Cancel the tasks that auto-end the round Bukkit.getServer().getScheduler().cancelTask(gameID); // Check if there was a winner of the round if (winner != null) { // Set the wins of the player to their current # of wins + 1 gameWins.set(gamePlayers.indexOf(winner), (gameWins.get(gamePlayers.indexOf(winner)) + 1)); } - // Clear old layers (as a fill command, this would be /fill ~-20 ~-4 ~-20 ~20 ~ ~20 relative to spawn) - Generator.generateCuboid(new Location(gameSpawn.getWorld(), gameSpawn.getX() - 20, gameSpawn.getY() - 4, gameSpawn.getZ() - 20), new Location(gameSpawn.getWorld(), gameSpawn.getX() + 20, gameSpawn.getY(), gameSpawn.getZ() + 20), Material.AIR); + // Clear old layers (as a fill command, this would be /fill ~-20 ~-20 ~-20 ~20 ~ ~20 relative to spawn) + Generator.generateCuboid(new Location(gameSpawn.getWorld(), gameSpawn.getX() - 20, gameSpawn.getY() - 20, gameSpawn.getZ() - 20), new Location(gameSpawn.getWorld(), gameSpawn.getX() + 20, gameSpawn.getY(), gameSpawn.getZ() + 20), Material.AIR); playSound(gamePlayers, Sound.BLOCK_NOTE_BLOCK_PLING, SoundCategory.BLOCKS, 5, 0); // Again, check if there was a winner to...win if (winner != null) { -- cgit v1.2.3 From 3a53bbe9f0b29bc5d8130cdc570f7bd40316378a Mon Sep 17 00:00:00 2001 From: Myles Date: Sun, 11 Dec 2022 20:03:18 -0600 Subject: fix (hopefully the last!) bugs --- src/main/java/com/MylesAndMore/tumble/Game.java | 76 +++++++++++++++++-------- 1 file changed, 51 insertions(+), 25 deletions(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index 3d83d23..58c42a5 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -181,15 +181,10 @@ public class Game { player.setGameMode(GameMode.SPECTATOR); }, 5); }, 5); - // If there are more than 2 players in the game, - if (roundPlayers.size() > 2) { - // remove that player (who just died) from the roundPlayersArray, effectively eliminating them, - roundPlayers.remove(player); - } - // Otherwise, the game must have two people left (and one just died), meaning it is over - // This logic is so that it will not remove the last player standing from the list, so we know who the winner is. - else { - roundPlayers.remove(player); + // remove that player (who just died) from the roundPlayersArray, effectively eliminating them, + roundPlayers.remove(player); + // If there are less than 2 players in the game (1 just died), + if (roundPlayers.size() < 2) { // End the game, passing the winner to the gameEnd method roundEnd(roundPlayers.get(0)); } @@ -505,34 +500,65 @@ public class Game { private void roundEnd(@Nullable Player winner) { // Cancel the tasks that auto-end the round Bukkit.getServer().getScheduler().cancelTask(gameID); - // Check if there was a winner of the round - if (winner != null) { - // Set the wins of the player to their current # of wins + 1 - gameWins.set(gamePlayers.indexOf(winner), (gameWins.get(gamePlayers.indexOf(winner)) + 1)); - } // Clear old layers (as a fill command, this would be /fill ~-20 ~-20 ~-20 ~20 ~ ~20 relative to spawn) Generator.generateCuboid(new Location(gameSpawn.getWorld(), gameSpawn.getX() - 20, gameSpawn.getY() - 20, gameSpawn.getZ() - 20), new Location(gameSpawn.getWorld(), gameSpawn.getX() + 20, gameSpawn.getY(), gameSpawn.getZ() + 20), Material.AIR); playSound(gamePlayers, Sound.BLOCK_NOTE_BLOCK_PLING, SoundCategory.BLOCKS, 5, 0); - // Again, check if there was a winner to...win + // Check if there was a definite winner or not if (winner != null) { + // Set the wins of the player to their current # of wins + 1 + gameWins.set(gamePlayers.indexOf(winner), (gameWins.get(gamePlayers.indexOf(winner)) + 1)); // If the player has three wins, they won the game, so initiate the gameEnd if (gameWins.get(gamePlayers.indexOf(winner)) == 3) { gameEnd(winner); } + // If that player doesn't have three wins, nobody else does, so we need another round + else { + roundPlayers.get(0).setGameMode(GameMode.SPECTATOR); + roundPlayers.remove(0); + roundPlayers.addAll(gamePlayers); + clearInventories(gamePlayers); + displayTitles(gamePlayers, ChatColor.RED + "Round over!", ChatColor.GOLD + winner.getName() + " has won the round!", 5, 60, 5); + // Wait for player to respawn before completely l a g g i n g the server ._. + Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { + // Re-generate layers + generateLayers(gameType); + // Wait 5s (100t) for tp method + Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { + // Kill all items (pistons are weird) + for (Entity entity : gameWorld.getEntities()) { + if (entity instanceof Item) { + entity.remove(); + } + } + // Re-scatter players + gameState = "starting"; + scatterPlayers(gamePlayers); + playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 5, 1); + displayTitles(gamePlayers, ChatColor.DARK_GREEN + "3", null, 3, 10, 7); + Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { + playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 5, 1); + displayTitles(gamePlayers, ChatColor.YELLOW + "2", null, 3, 10, 7); + Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { + playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 5, 1); + displayTitles(gamePlayers, ChatColor.DARK_RED + "1", null, 3, 10, 7); + Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { + playSound(gamePlayers, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.NEUTRAL, 5, 2); + displayTitles(gamePlayers, ChatColor.GREEN + "Go!", null, 1, 5, 1); + setGamemode(gamePlayers, GameMode.SURVIVAL); + gameState = "running"; + }, 20); + }, 20); + }, 20); + }, 100); + }, 1); + } } - // If that player doesn't have three wins, nobody else does, so we need another round else { - roundPlayers.get(0).setGameMode(GameMode.SPECTATOR); - roundPlayers.remove(0); + setGamemode(gamePlayers, GameMode.SPECTATOR); + roundPlayers.removeAll(roundPlayers); roundPlayers.addAll(gamePlayers); clearInventories(gamePlayers); - // Display personalized title if someone won, generalized if not - if (winner != null) { - displayTitles(gamePlayers, ChatColor.RED + "Round over!", ChatColor.GOLD + winner.getName() + " has won the round!", 5, 60, 5); - } - else { - displayTitles(gamePlayers, ChatColor.RED + "Round over!", ChatColor.GOLD + "Draw!", 5, 60, 5); - } + displayTitles(gamePlayers, ChatColor.RED + "Round over!", ChatColor.GOLD + "Draw!", 5, 60, 5); // Wait for player to respawn before completely l a g g i n g the server ._. Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { // Re-generate layers -- cgit v1.2.3 From 23429bbd3fe7e35ab9877e536f9ff9a2e71a9afc Mon Sep 17 00:00:00 2001 From: Myles <43725835+MylesAndMore@users.noreply.github.com> Date: Mon, 12 Dec 2022 19:21:09 +0000 Subject: refactoring to prep for release!! - refactor a bit of code - add a bit more documentations - remove music code--we can't redistribute the music in a pack :( - remove old readme--writing the new docs tonight or tmrw we got this! --- src/main/java/com/MylesAndMore/tumble/Game.java | 35 +++---------------------- 1 file changed, 3 insertions(+), 32 deletions(-) (limited to 'src/main/java/com/MylesAndMore/tumble/Game.java') diff --git a/src/main/java/com/MylesAndMore/tumble/Game.java b/src/main/java/com/MylesAndMore/tumble/Game.java index 58c42a5..91c2770 100644 --- a/src/main/java/com/MylesAndMore/tumble/Game.java +++ b/src/main/java/com/MylesAndMore/tumble/Game.java @@ -17,6 +17,9 @@ import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; import java.util.*; +/** + * This class holds all methods relating to the tumble Game in any way! + */ public class Game { // Singleton class logic // Define the gameInstance @@ -46,8 +49,6 @@ public class Game { private int gameID = -1; // Define a variable for the autostart PID private int autoStartID = -1; - // Define a variable for music ID - private int musicID = -1; // Define a variable to keep the list of tracks that have already played in the game List sounds = new ArrayList<>(); @@ -56,9 +57,6 @@ public class Game { // Define the game world and its spawnpoint as a new Location for use later private final World gameWorld; private final Location gameSpawn; - -// // Make a list of the lobby's players for later -// private List lobbyPlayers = TumbleManager.getPlayersInLobby(); // Make a list of the game's players for later private List gamePlayers; // Make a list of the round's players @@ -130,7 +128,6 @@ public class Game { displayTitles(gamePlayers, ChatColor.GREEN + "Go!", null, 1, 5, 1); setGamemode(gamePlayers, GameMode.SURVIVAL); gameState = "running"; - playMusic(gamePlayers, SoundCategory.NEUTRAL, 1, 1); }, 20); }, 20); }, 20); @@ -443,30 +440,6 @@ public class Game { } } - private void playMusic(@NotNull List players, @NotNull SoundCategory category, float volume, float pitch) { - if (sounds.size() == 0) { - sounds.addAll(List.of( - "minecraft:tumble.0", - "minecraft:tumble.1", - "minecraft:tumble.2", - "minecraft:tumble.3", - "minecraft:tumble.4", - "minecraft:tumble.5", - "minecraft:tumble.6", - "minecraft:tumble.7", - "minecraft:tumble.8", - "minecraft:tumble.9")); - } - String currentSong = sounds.get(Random.nextInt(sounds.size())); - for (Player aPlayer : players) { - aPlayer.playSound(aPlayer.getLocation(), currentSong, category, volume, pitch); - } - sounds.remove(currentSong); - musicID = Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { - playMusic(gamePlayers, SoundCategory.NEUTRAL, 1, 1); - }, 1460); - } - /** * Teleports a list of players to the specified scatter locations in the gameWorld * @param players a List of Players to teleport @@ -603,8 +576,6 @@ public class Game { displayActionbar(gamePlayers, ChatColor.BLUE + "Returning to lobby in ten seconds..."); // Wait 10s (200t), then Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(TumbleManager.getPlugin(), () -> { - // Stop music from replaying - Bukkit.getServer().getScheduler().cancelTask(musicID); // First, check to see if there is a separate location to tp the winner to if ((TumbleManager.getPlugin().getConfig().getDouble("winnerTeleport.x") != 0) && (TumbleManager.getPlugin().getConfig().getDouble("winnerTeleport.y") != 0) && (TumbleManager.getPlugin().getConfig().getDouble("winnerTeleport.z") != 0)) { // Tp the winner to that location -- cgit v1.2.3