diff --git a/src/main/java/me/firephoenix/ps3minigames/PS3Minigames.java b/src/main/java/me/firephoenix/ps3minigames/PS3Minigames.java index 5273ec0..0fef608 100644 --- a/src/main/java/me/firephoenix/ps3minigames/PS3Minigames.java +++ b/src/main/java/me/firephoenix/ps3minigames/PS3Minigames.java @@ -13,16 +13,11 @@ import me.firephoenix.ps3minigames.listener.DeathListener; import me.firephoenix.ps3minigames.listener.JoinQuitListener; import me.firephoenix.ps3minigames.listener.MoveListener; import me.firephoenix.ps3minigames.listener.WorldListener; -import me.firephoenix.ps3minigames.states.GameState; import me.firephoenix.ps3minigames.states.LobbyState; import me.firephoenix.ps3minigames.util.GameUtil; -import me.firephoenix.ps3minigames.util.Timer; import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Location; import org.bukkit.World; import org.bukkit.plugin.java.JavaPlugin; -import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.HashMap; diff --git a/src/main/java/me/firephoenix/ps3minigames/commands/ForceStop.java b/src/main/java/me/firephoenix/ps3minigames/commands/ForceStop.java index c21e7f1..03f00a5 100644 --- a/src/main/java/me/firephoenix/ps3minigames/commands/ForceStop.java +++ b/src/main/java/me/firephoenix/ps3minigames/commands/ForceStop.java @@ -33,11 +33,13 @@ public class ForceStop implements CommandExecutor { sender.sendMessage(ChatColor.translateAlternateColorCodes('&', config.getString("messages.cant-find-game"))); return true; } else { - if (Objects.requireNonNull(PS3Minigames.INSTANCE.getGameUtil().getGameByID(gameID)).getGameState() != GameState.RUNNING) { - sender.sendMessage(ChatColor.translateAlternateColorCodes('&', config.getString("messages.cant-stop-game"))); + GameState state = PS3Minigames.INSTANCE.getGameUtil().getGameByID(gameID).getGameState(); + if (state == GameState.INVINCIBILITY || state == GameState.RUNNING) { + sender.sendMessage(ChatColor.translateAlternateColorCodes('&', config.getString("messages.force-stopping-game").replace("%map%", Objects.requireNonNull(PS3Minigames.INSTANCE.getGameUtil().getGameByID(gameID)).getMap().getName()))); + PS3Minigames.INSTANCE.getGameUtil().stopGame(Objects.requireNonNull(PS3Minigames.INSTANCE.getGameUtil().getGameByID(gameID))); + return true; } - sender.sendMessage(ChatColor.translateAlternateColorCodes('&', config.getString("messages.force-stopping-game").replace("%map%", Objects.requireNonNull(PS3Minigames.INSTANCE.getGameUtil().getGameByID(gameID)).getMap().getName()))); - PS3Minigames.INSTANCE.getGameUtil().stopGame(Objects.requireNonNull(PS3Minigames.INSTANCE.getGameUtil().getGameByID(gameID))); + sender.sendMessage(ChatColor.translateAlternateColorCodes('&', config.getString("messages.cant-stop-game"))); return true; } } diff --git a/src/main/java/me/firephoenix/ps3minigames/listener/DamageListener.java b/src/main/java/me/firephoenix/ps3minigames/listener/DamageListener.java new file mode 100644 index 0000000..33bf7d7 --- /dev/null +++ b/src/main/java/me/firephoenix/ps3minigames/listener/DamageListener.java @@ -0,0 +1,32 @@ +package me.firephoenix.ps3minigames.listener; + +import me.firephoenix.ps3minigames.PS3Minigames; +import me.firephoenix.ps3minigames.game.Game; +import me.firephoenix.ps3minigames.states.GameState; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageByEntityEvent; + +/** + * @author NieGestorben + * Copyright© (c) 2024, All Rights Reserved. + */ +public class DamageListener implements Listener { + + @EventHandler + public void onDamage(EntityDamageByEntityEvent e) { + if (!(e.getEntity() instanceof Player)) return; + + Player player = (Player) e.getEntity(); + + Game game = PS3Minigames.INSTANCE.getGameUtil().getGameByWorld(player.getWorld()); + + if (game == null) return; + + GameState state = game.getGameState(); + + if (state == GameState.INVINCIBILITY || state == GameState.STARTING) e.setCancelled(true); + } + +} diff --git a/src/main/java/me/firephoenix/ps3minigames/listener/JoinQuitListener.java b/src/main/java/me/firephoenix/ps3minigames/listener/JoinQuitListener.java index 9664a3d..cabaaef 100644 --- a/src/main/java/me/firephoenix/ps3minigames/listener/JoinQuitListener.java +++ b/src/main/java/me/firephoenix/ps3minigames/listener/JoinQuitListener.java @@ -5,7 +5,9 @@ import me.firephoenix.ps3minigames.game.Game; import me.firephoenix.ps3minigames.states.LobbyState; import me.firephoenix.ps3minigames.util.GameUtil; import me.firephoenix.ps3minigames.util.Timer; -import org.bukkit.*; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Location; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -14,7 +16,6 @@ import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; import java.util.ArrayList; -import java.util.Objects; import java.util.UUID; /** @@ -34,46 +35,50 @@ public class JoinQuitListener implements Listener { @EventHandler public void onJoin(PlayerJoinEvent e) { Player player = e.getPlayer(); - player.teleport(new Location(plugin.getServer().getWorld(config.getString("spawn-lobby.world")), config.getDouble("spawn-lobby.x"), config.getDouble("spawn-lobby.y"), config.getDouble("spawn-lobby.z"), (float) config.getDouble("spawn-lobby.yaw"), (float) config.getDouble("spawn-lobby.pitch"))); - player.setHealth(20); - player.setFoodLevel(20); - player.getInventory().clear(); - player.getInventory().setBoots(null); - player.getInventory().setLeggings(null); - player.getInventory().setChestplate(null); - player.getInventory().setHelmet(null); - player.setGameMode(GameMode.SURVIVAL); - // Send all players which are in the lobby the join message + player.teleport(new Location( + plugin.getServer().getWorld(config.getString("spawn-lobby.world")), + config.getDouble("spawn-lobby.x"), + config.getDouble("spawn-lobby.y"), + config.getDouble("spawn-lobby.z"), + (float) config.getDouble("spawn-lobby.yaw"), + (float) config.getDouble("spawn-lobby.pitch") + )); + + GameUtil.resetInventory(player); + + // Send all players in the lobby the join message + String joinMessage = ChatColor.translateAlternateColorCodes('&', config.getString("messages.join").replace("%player%", player.getDisplayName())); for (Player player1 : plugin.getLobby().getPlayers()) { - player1.sendMessage(ChatColor.translateAlternateColorCodes('&', config.getString("messages.join").replace("%player%", player.getDisplayName()))); + player1.sendMessage(joinMessage); } - // Send joined player the join message, because joinevent is 1 tick before the player gets added to the world player list - player.sendMessage(ChatColor.translateAlternateColorCodes('&', config.getString("messages.join").replace("%player%", player.getDisplayName()))); - if (plugin.getLobby().getPlayers().size() == 0) { - player.sendMessage(ChatColor.translateAlternateColorCodes('&', config.getString("messages.needed-players"))); + player.sendMessage(joinMessage); + + int lobbySize = plugin.getLobby().getPlayers().size(); + + if (lobbySize == 0) { + String neededPlayersMessage = ChatColor.translateAlternateColorCodes('&', config.getString("messages.needed-players")); + player.sendMessage(neededPlayersMessage); for (Player player1 : plugin.getLobby().getPlayers()) { - player1.sendMessage(ChatColor.translateAlternateColorCodes('&', config.getString("messages.needed-players"))); + player1.sendMessage(neededPlayersMessage); } } else { - if (plugin.getLobby().getPlayers().size() >= 3) { - player.sendMessage(ChatColor.translateAlternateColorCodes('&', config.getString("messages.game-start").replace("%seconds%", "10"))); - for (Player player1 : plugin.getLobby().getPlayers()) { - player1.sendMessage(ChatColor.translateAlternateColorCodes('&', config.getString("messages.game-start").replace("%seconds%", "10"))); - } - } else { - player.sendMessage(ChatColor.translateAlternateColorCodes('&', config.getString("messages.game-start").replace("%seconds%", "25"))); - for (Player player1 : plugin.getLobby().getPlayers()) { - player1.sendMessage(ChatColor.translateAlternateColorCodes('&', config.getString("messages.game-start").replace("%seconds%", "25"))); - } + String gameStartMessage; + int startSeconds = (lobbySize >= 3) ? 10 : 25; + gameStartMessage = ChatColor.translateAlternateColorCodes('&', config.getString("messages.game-start").replace("%seconds%", Integer.toString(startSeconds))); + + player.sendMessage(gameStartMessage); + for (Player player1 : plugin.getLobby().getPlayers()) { + player1.sendMessage(gameStartMessage); } + if (plugin.getLobbyState() == LobbyState.IDLE) { plugin.setLobbyState(LobbyState.STARTING); lobbyPlayers.add(player.getUniqueId()); plugin.getLobby().getPlayers().forEach(player1 -> lobbyPlayers.add(player1.getUniqueId())); gameTimer.start(); - gameTimer = new Timer(plugin.getLobby().getPlayers().size() >= 3 ? 10 : 25, plugin); + gameTimer = new Timer(startSeconds, plugin); gameTimer.whenComplete(() -> PS3Minigames.INSTANCE.getGameUtil().startNewGame(lobbyPlayers, plugin.getServer().getWorld("cavern"))); } } diff --git a/src/main/java/me/firephoenix/ps3minigames/states/GameState.java b/src/main/java/me/firephoenix/ps3minigames/states/GameState.java index 58787ea..9c3bcc6 100644 --- a/src/main/java/me/firephoenix/ps3minigames/states/GameState.java +++ b/src/main/java/me/firephoenix/ps3minigames/states/GameState.java @@ -8,5 +8,6 @@ public enum GameState { STARTING, RUNNING, + INVINCIBILITY, STOPPING } diff --git a/src/main/java/me/firephoenix/ps3minigames/util/GameUtil.java b/src/main/java/me/firephoenix/ps3minigames/util/GameUtil.java index 5318096..89513de 100644 --- a/src/main/java/me/firephoenix/ps3minigames/util/GameUtil.java +++ b/src/main/java/me/firephoenix/ps3minigames/util/GameUtil.java @@ -1,5 +1,8 @@ package me.firephoenix.ps3minigames.util; +import com.onarandombox.MultiverseCore.MultiverseCore; +import com.onarandombox.MultiverseCore.api.MVWorldManager; +import com.onarandombox.MultiverseCore.api.MultiverseWorld; import me.firephoenix.ps3minigames.PS3Minigames; import me.firephoenix.ps3minigames.game.Game; import me.firephoenix.ps3minigames.states.GameState; @@ -19,59 +22,55 @@ import java.util.*; */ public class GameUtil { - - public static int getRandomInRange(int min, int max) { - Random random = new Random(); - return random.nextInt(max - min) + min; - } - - public static float getRandomInRange(float min, float max) { - return (float) (min + Math.random() * (max - min)); - } - public void startNewGame(ArrayList players, World map) { - int ID = PS3Minigames.INSTANCE.getGames().size() + 1; - String newName = map.getName() + "game" + ID; - boolean copydone = PS3Minigames.INSTANCE.getMultiverseCore().getMVWorldManager().cloneWorld(map.getName(), newName); - if (copydone) { - boolean loadingdone = PS3Minigames.INSTANCE.getMultiverseCore().getMVWorldManager().loadWorld(newName); - if (loadingdone) { - PS3Minigames.INSTANCE.getMultiverseCore().getMVWorldManager().getMVWorld(newName).setAlias(newName); - World gameWorld = Bukkit.getWorld(newName); - Game newGame = new Game(ID, players, gameWorld, GameState.STARTING); - PS3Minigames.INSTANCE.getGames().add(newGame); - PS3Minigames.INSTANCE.getWorldToGameHashMap().put(gameWorld, newGame); - int spawnnumber = 1; - for (UUID uuid : players) { - if (PS3Minigames.INSTANCE.getServer().getPlayer(uuid) == null) return; - PS3Minigames.INSTANCE.getServer().getPlayer(uuid).sendMessage(ChatColor.translateAlternateColorCodes('&', PS3Minigames.INSTANCE.getConfig().getString("messages.teleporting"))); - String configpathtospawnloc = "maps." + map.getName() + ".spawn" + spawnnumber++; - Location location = new Location(gameWorld, PS3Minigames.INSTANCE.getConfig().getDouble(configpathtospawnloc + ".x"), PS3Minigames.INSTANCE.getConfig().getDouble(configpathtospawnloc + ".y"), PS3Minigames.INSTANCE.getConfig().getDouble(configpathtospawnloc + ".z"), (float) PS3Minigames.INSTANCE.getConfig().getDouble(configpathtospawnloc + ".yaw"), (float) PS3Minigames.INSTANCE.getConfig().getDouble(configpathtospawnloc + ".pitch")); - Bukkit.getServer().getPlayer(uuid).teleport(location); - PS3Minigames.INSTANCE.getFrozenPlayer().add(uuid); - } - Timer timer = new Timer(10, PS3Minigames.INSTANCE); - timer.start(); - fillChests(newGame); - timer.eachSecond(() -> { - for (UUID uuid : newGame.getPlayers()) { - if (Bukkit.getServer().getPlayer(uuid) == null) return; - Bukkit.getServer().getPlayer(uuid).sendTitle(ChatColor.translateAlternateColorCodes('&', "&6" + timer.getCounter()), ""); - } - }); - timer.whenComplete(() -> { - newGame.setGameState(GameState.RUNNING); - gameWorld.getPlayers().forEach(player -> { - PS3Minigames.INSTANCE.getFrozenPlayer().remove(player.getUniqueId()); - player.sendMessage(ChatColor.translateAlternateColorCodes('&', PS3Minigames.INSTANCE.getConfig().getString("messages.game-start-no-countdown"))); - }); - }); - } else { - System.out.println("error while trying to load the world!"); - } - } else { - System.out.println("error while trying to copy the world!"); + PS3Minigames plugin = PS3Minigames.INSTANCE; + MultiverseCore mvCore = plugin.getMultiverseCore(); + MVWorldManager worldManager = mvCore.getMVWorldManager(); + + int gameId = plugin.getGames().size() + 1; + String newWorldName = map.getName() + "game" + gameId; + + if (!worldManager.cloneWorld(map.getName(), newWorldName)) { + System.out.println("Error while trying to copy the world!"); + return; } + + if (!worldManager.loadWorld(newWorldName)) { + System.out.println("Error while trying to load the world!"); + return; + } + + MultiverseWorld mvWorld = worldManager.getMVWorld(newWorldName); + mvWorld.setAlias(newWorldName); + World gameWorld = Bukkit.getWorld(newWorldName); + + Game newGame = new Game(gameId, players, gameWorld, GameState.STARTING); + plugin.getGames().add(newGame); + plugin.getWorldToGameHashMap().put(gameWorld, newGame); + + int spawnNumber = 1; + for (UUID uuid : players) { + Player player = Bukkit.getPlayer(uuid); + if (player == null) return; + + player.sendMessage(ChatColor.translateAlternateColorCodes('&', plugin.getConfig().getString("messages.teleporting"))); + + String spawnPath = "maps." + map.getName() + ".spawn" + spawnNumber++; + Location spawnLocation = new Location( + gameWorld, + plugin.getConfig().getDouble(spawnPath + ".x"), + plugin.getConfig().getDouble(spawnPath + ".y"), + plugin.getConfig().getDouble(spawnPath + ".z"), + (float) plugin.getConfig().getDouble(spawnPath + ".yaw"), + (float) plugin.getConfig().getDouble(spawnPath + ".pitch") + ); + + player.teleport(spawnLocation); + plugin.getFrozenPlayer().add(uuid); + } + + startCountdown(newGame, 10, "&6"); + startInvincibilityTimer(newGame, 25, "&6Invulnerability wears off in "); } public void stopGame(Game game) { @@ -79,27 +78,45 @@ public class GameUtil { System.out.println("Someone tried to stop a game which is currently stopping, not possible, ignoring."); return; } - if (Bukkit.getServer().getPlayer(game.getPlayers().get(0)) != null) { - Player winner = Bukkit.getPlayer(game.getPlayers().get(0)); - game.getPlayers().forEach(uuid -> Bukkit.getServer().getPlayer(uuid).sendMessage(ChatColor.translateAlternateColorCodes('&', PS3Minigames.INSTANCE.getConfig().getString("messages.game-won").replace("%winner%", winner.getDisplayName())))); + + List players = game.getPlayers(); + Player winner = Bukkit.getPlayer(players.get(0)); + + if (winner != null) { + String gameWonMessage = ChatColor.translateAlternateColorCodes('&', + PS3Minigames.INSTANCE.getConfig().getString("messages.game-won").replace("%winner%", winner.getDisplayName())); + + for (UUID uuid : players) { + Player player = Bukkit.getPlayer(uuid); + if (player != null) { + player.sendMessage(gameWonMessage); + } + } } + game.setGameState(GameState.STOPPING); - // Teleport all players + Clear inv + Reset Effects + Unfreeze - game.getPlayers().forEach(uuid -> { - Bukkit.getServer().getPlayer(uuid).teleport(new Location(PS3Minigames.INSTANCE.getServer().getWorld(PS3Minigames.INSTANCE.getConfig().getString("spawn-lobby.world")), PS3Minigames.INSTANCE.getConfig().getDouble("spawn-lobby.x"), PS3Minigames.INSTANCE.getConfig().getDouble("spawn-lobby.y"), PS3Minigames.INSTANCE.getConfig().getDouble("spawn-lobby.z"), (float) PS3Minigames.INSTANCE.getConfig().getDouble("spawn-lobby.yaw"), (float) PS3Minigames.INSTANCE.getConfig().getDouble("spawn-lobby.pitch"))); - Bukkit.getServer().getPlayer(uuid).getInventory().clear(); - Bukkit.getServer().getPlayer(uuid).getActivePotionEffects().clear(); - Bukkit.getServer().getPlayer(uuid).setHealth(20); - Bukkit.getServer().getPlayer(uuid).setFoodLevel(20); - Bukkit.getServer().getPlayer(uuid).getInventory().setBoots(null); - Bukkit.getServer().getPlayer(uuid).getInventory().setLeggings(null); - Bukkit.getServer().getPlayer(uuid).getInventory().setChestplate(null); - Bukkit.getServer().getPlayer(uuid).getInventory().setHelmet(null); - PS3Minigames.INSTANCE.getFrozenPlayer().remove(uuid); - }); - if (game.getMap().getPlayers().size() == 0) { + + Location spawnLocation = new Location( + PS3Minigames.INSTANCE.getServer().getWorld(PS3Minigames.INSTANCE.getConfig().getString("spawn-lobby.world")), + PS3Minigames.INSTANCE.getConfig().getDouble("spawn-lobby.x"), + PS3Minigames.INSTANCE.getConfig().getDouble("spawn-lobby.y"), + PS3Minigames.INSTANCE.getConfig().getDouble("spawn-lobby.z"), + (float) PS3Minigames.INSTANCE.getConfig().getDouble("spawn-lobby.yaw"), + (float) PS3Minigames.INSTANCE.getConfig().getDouble("spawn-lobby.pitch") + ); + + for (UUID uuid : players) { + Player player = Bukkit.getPlayer(uuid); + if (player != null) { + player.teleport(spawnLocation); + resetInventory(player); + } + } + + if (game.getMap().getPlayers().isEmpty()) { PS3Minigames.INSTANCE.getMultiverseCore().getMVWorldManager().deleteWorld(game.getMap().getName()); } + PS3Minigames.INSTANCE.getGames().remove(game); } @@ -191,4 +208,65 @@ public class GameUtil { return bd.doubleValue(); } + private void startCountdown(Game game, int seconds, String titleColor) { + Timer timer = new Timer(seconds, PS3Minigames.INSTANCE); + timer.start(); + + timer.eachSecond(() -> { + for (UUID uuid : game.getPlayers()) { + Player player = Bukkit.getPlayer(uuid); + if (player == null) return; + player.sendTitle(ChatColor.translateAlternateColorCodes('&', titleColor + timer.getCounter()), ""); + } + }); + + timer.whenComplete(() -> { + game.setGameState(GameState.INVINCIBILITY); + game.getMap().getPlayers().forEach(player -> { + PS3Minigames.INSTANCE.getFrozenPlayer().remove(player.getUniqueId()); + player.sendMessage(ChatColor.translateAlternateColorCodes('&', PS3Minigames.INSTANCE.getConfig().getString("messages.game-start-no-countdown"))); + }); + }); + + fillChests(game); + } + + private void startInvincibilityTimer(Game game, int seconds, String messagePrefix) { + Timer invincibilityTimer = new Timer(seconds, PS3Minigames.INSTANCE); + invincibilityTimer.start(); + + invincibilityTimer.eachSecond(() -> { + for (UUID uuid : game.getPlayers()) { + Player player = Bukkit.getPlayer(uuid); + if (player == null) return; + player.sendTitle("", ChatColor.translateAlternateColorCodes('&', messagePrefix + invincibilityTimer.getCounter())); + } + }); + + invincibilityTimer.whenComplete(() -> { + game.setGameState(GameState.RUNNING); + }); + } + + public static int getRandomInRange(int min, int max) { + Random random = new Random(); + return random.nextInt(max - min) + min; + } + + public static float getRandomInRange(float min, float max) { + return (float) (min + Math.random() * (max - min)); + } + + public static void resetInventory(Player player) { + player.getActivePotionEffects().forEach(effect -> player.removePotionEffect(effect.getType())); + player.setHealth(20); + player.setFoodLevel(20); + player.getInventory().clear(); + player.getInventory().setBoots(null); + player.getInventory().setLeggings(null); + player.getInventory().setChestplate(null); + player.getInventory().setHelmet(null); + player.setGameMode(GameMode.SURVIVAL); + } + } diff --git a/src/main/java/me/firephoenix/ps3minigames/util/Timer.java b/src/main/java/me/firephoenix/ps3minigames/util/Timer.java index d73029c..e661da5 100644 --- a/src/main/java/me/firephoenix/ps3minigames/util/Timer.java +++ b/src/main/java/me/firephoenix/ps3minigames/util/Timer.java @@ -1,5 +1,6 @@ package me.firephoenix.ps3minigames.util; +import lombok.Getter; import org.bukkit.Bukkit; import org.bukkit.plugin.Plugin; import org.bukkit.scheduler.BukkitTask; @@ -12,6 +13,7 @@ import org.bukkit.scheduler.BukkitTask; public class Timer { private final int duration; private final Plugin plugin; + @Getter int counter; BukkitTask bukkitTask; private boolean running = false; @@ -63,7 +65,4 @@ public class Timer { return running; } - public int getCounter() { - return counter; - } } \ No newline at end of file