From e39f1b400df999f024e2c139f39a2b092d3b0519 Mon Sep 17 00:00:00 2001 From: skbeh <60107333+skbeh@users.noreply.github.com> Date: Mon, 15 Jan 2024 13:05:39 +0000 Subject: [PATCH] Massive refactors and fixes * Fix sign text corrupts. Do not pass `org.bukkit.block.Sign` around since there is no guaranty that it is valid after `org.bukkit.block.Sign#update()`. * Fix thread-safety issue with `onPlayerChat`. * Fix gun fires when repairing barrier via sign. * Fix player was able to change text on sign. * Fix zombie spawnpoint selection logic. * Add barrier break and repair progress display. * Use barrier block count - 1 as max break/fix level. * Replace RNG with the more modern one. * And many other low-level fixes, refactors and improvements. Resolve #97. --- API/build.gradle | 1 + Core/build.gradle | 13 +- .../theprogrammingturkey/comz/COMZombies.java | 62 +++++-- .../comz/commands/ArenaListCommand.java | 4 +- .../comz/commands/CommandManager.java | 119 ++++++------- .../comz/commands/EnableCommand.java | 1 - .../comz/commands/InfoCommand.java | 29 ++- .../comz/commands/JoinCommand.java | 19 +- .../comz/commands/LeaderboardsCommand.java | 9 +- .../comz/commands/RejoinCommand.java | 5 +- .../comz/config/COMZConfig.java | 12 +- .../comz/config/CustomConfig.java | 83 ++++----- .../comz/config/LegacyConfig.java | 6 +- .../theprogrammingturkey/comz/game/Arena.java | 68 ++----- .../comz/game/AutoStart.java | 19 +- .../comz/game/CachedPlayerInfo.java | 17 +- .../theprogrammingturkey/comz/game/Game.java | 153 ++++++++++------ .../comz/game/GameManager.java | 30 ++-- .../comz/game/GameScoreboard.java | 24 +-- .../comz/game/actions/ArenaSetupAction.java | 10 +- .../game/actions/BarrierRemoveAction.java | 4 +- .../comz/game/actions/BarrierSetupAction.java | 2 +- .../comz/game/actions/DoorRemoveAction.java | 21 ++- .../comz/game/actions/DoorSetupAction.java | 8 +- .../comz/game/features/Barrier.java | 168 ++++++++++-------- .../comz/game/features/Door.java | 62 ++++--- .../comz/game/features/DownedPlayer.java | 35 ++-- .../comz/game/features/PerkType.java | 12 +- .../comz/game/managers/BarrierManager.java | 44 ++--- .../comz/game/managers/BoxManager.java | 4 +- .../comz/game/managers/DoorManager.java | 20 +-- .../game/managers/DownedPlayerManager.java | 6 +- .../comz/game/managers/PerkManager.java | 8 +- .../game/managers/PlayerWeaponManager.java | 6 +- .../comz/game/managers/PowerUpManager.java | 18 +- .../comz/game/managers/SignManager.java | 89 +++++----- .../comz/game/managers/TeleporterManager.java | 7 +- .../comz/game/managers/WeaponManager.java | 6 +- .../comz/game/signs/AmmoCrateSign.java | 7 +- .../comz/game/signs/DoorSign.java | 9 +- .../comz/game/signs/GrenadeSign.java | 56 +++--- .../comz/game/signs/GunSign.java | 6 +- .../comz/game/signs/IGameSign.java | 6 +- .../comz/game/signs/JoinSign.java | 18 +- .../comz/game/signs/KitSign.java | 7 +- .../comz/game/signs/MysteryBoxSign.java | 11 +- .../comz/game/signs/PackAPunchSign.java | 7 +- .../comz/game/signs/PerkMachineSign.java | 11 +- .../comz/game/signs/PowerSign.java | 6 +- .../comz/game/signs/SpectateSign.java | 7 +- .../comz/game/signs/TeleporterSign.java | 18 +- .../comz/game/weapons/GunInstance.java | 20 ++- .../comz/game/weapons/WeaponType.java | 2 +- .../theprogrammingturkey/comz/kits/Kit.java | 8 +- .../comz/kits/RoundReward.java | 36 +--- .../comz/leaderboards/PlayerStats.java | 29 ++- .../comz/listeners/BarrierRepairListener.java | 99 +++++++++++ .../comz/listeners/EntityListener.java | 5 + .../comz/listeners/OnPreCommandEvent.java | 3 +- .../comz/listeners/PlayerChatListener.java | 74 ++++---- .../comz/listeners/PlayerListener.java | 96 ++++++---- .../comz/listeners/SignListener.java | 123 ++++++------- .../comz/listeners/WeaponListener.java | 51 ++++-- .../customEvents/GameStartEvent.java | 3 +- .../comz/spawning/RoundSpawner.java | 3 - .../comz/spawning/SpawnManager.java | 99 +++-------- .../comz/spawning/ZombieSpawner.java | 10 +- .../comz/util/BlockUtils.java | 66 +++++-- .../comz/util/PlaceholderHook.java | 60 +++---- Core/src/main/resources/paper-plugin.yml | 13 ++ Core/src/main/resources/plugin.yml | 6 +- .../support_1_20_R2/NMSUtil_1_20_R2.java | 25 +-- .../support_1_20_R3/NMSUtil_1_20_R3.java | 25 +-- build.gradle | 4 +- 74 files changed, 1178 insertions(+), 1055 deletions(-) create mode 100644 Core/src/main/java/com/theprogrammingturkey/comz/listeners/BarrierRepairListener.java create mode 100644 Core/src/main/resources/paper-plugin.yml diff --git a/API/build.gradle b/API/build.gradle index dcdfce9..1738dce 100644 --- a/API/build.gradle +++ b/API/build.gradle @@ -4,5 +4,6 @@ repositories { } dependencies { + implementation 'org.jetbrains:annotations:24.1.0' implementation group: 'org.spigotmc', name: 'spigot-api', version: '1.16.4-R0.1-SNAPSHOT' } diff --git a/Core/build.gradle b/Core/build.gradle index 0ef6888..a3d3186 100644 --- a/Core/build.gradle +++ b/Core/build.gradle @@ -7,9 +7,7 @@ archivesBaseName = "comzombies-Universal" repositories { mavenCentral() - maven { url 'https://hub.spigotmc.org/nexus/content/repositories/snapshots/' } - maven { url 'https://oss.sonatype.org/content/repositories/snapshots' } - maven { url 'https://oss.sonatype.org/content/repositories/central' } + maven { url 'https://repo.papermc.io/repository/maven-public/' } maven { url 'https://repo.extendedclip.com/content/repositories/placeholderapi/' } maven { url 'https://jitpack.io' } } @@ -31,11 +29,10 @@ dependencies { implementation project(':NMS:1_16_R1') implementation project(':NMS:1_15_R1') implementation project(':NMS:1_14_R1') + implementation 'org.jetbrains:annotations:24.1.0' + implementation 'io.papermc.paper:paper-api:1.20.4-R0.1-SNAPSHOT' compileOnly 'com.github.MilkBowl:VaultAPI:1.7' - implementation group: 'org.spigotmc', name: 'spigot-api', version: '1.16.4-R0.1-SNAPSHOT' - implementation group: 'org.spigotmc', name: 'spigot', version: '1.16.4-R0.1-SNAPSHOT' - implementation 'me.clip:placeholderapi:2.11.1' - + implementation 'me.clip:placeholderapi:2.11.5' } jar { @@ -64,4 +61,4 @@ processResources { ] duplicatesStrategy = 'INCLUDE' } -} \ No newline at end of file +} diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/COMZombies.java b/Core/src/main/java/com/theprogrammingturkey/comz/COMZombies.java index 84f52ff..7fa45f7 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/COMZombies.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/COMZombies.java @@ -28,12 +28,15 @@ import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.block.Sign; +import org.bukkit.command.CommandMap; import org.bukkit.entity.Player; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; -import java.util.HashMap; -import java.util.Random; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.util.concurrent.ConcurrentHashMap; +import java.util.random.RandomGenerator; import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -45,7 +48,10 @@ */ public class COMZombies extends JavaPlugin { - public static final Random rand = new Random(); + /** + * Not thread-safe. + */ + public static final RandomGenerator rand; /** * Default plugin logger. */ @@ -53,7 +59,7 @@ public class COMZombies extends JavaPlugin /** * Players currently performing some sort of action or maintenance */ - public HashMap activeActions = new HashMap<>(); + public final ConcurrentHashMap activeActions = new ConcurrentHashMap<>(); /** @@ -61,7 +67,7 @@ public class COMZombies extends JavaPlugin * sign, the value that corresponds to the player is the sign that the * player is editing. */ - public HashMap isEditingASign = new HashMap<>(); + public final ConcurrentHashMap isEditingASign = new ConcurrentHashMap<>(); /** * Called when the plugin is reloading to cancel every remove spawn, create @@ -73,12 +79,29 @@ public void clearAllSetup() } public static final String CONSOLE_PREFIX = "[COM_Zombies] "; - public static final String PREFIX = ChatColor.RED + "[ " + ChatColor.GOLD + ChatColor.ITALIC + "CoM: Zombies" + ChatColor.RED + " ]" + ChatColor.GRAY + " "; + public static final String PREFIX = ChatColor.RED + "[" + ChatColor.GOLD + ChatColor.ITALIC + "CoM: Zombies" + ChatColor.RED + "]" + ChatColor.GRAY + " "; public static INMSUtil nmsUtil; public Vault vault; + static { + RandomGenerator rng; + try { + rng = RandomGenerator.of("L64X1024MixRandom"); + } catch (IllegalArgumentException e) { + try { + rng = (RandomGenerator) Class.forName("jdk.random.L64X1024MixRandom") + .getDeclaredConstructor().newInstance(); + } catch (InstantiationException | IllegalAccessException | InvocationTargetException | + NoSuchMethodException | ClassNotFoundException ignored) { + e.printStackTrace(); + rng = RandomGenerator.of("SplittableRandom"); + } + } + rand = rng; + } + public void onEnable() { loadVersionSpecificCode(); @@ -97,11 +120,29 @@ public void onEnable() registerEvents(); - getCommand("zombies").setExecutor(CommandManager.INSTANCE); - - log.info(COMZombies.CONSOLE_PREFIX + "has been enabled!"); + CommandMap commandMap; + try { + commandMap = Bukkit.getServer().getCommandMap(); + } catch (NoSuchMethodError e) { + final Field commandMapField; + try { + commandMapField = Bukkit.getServer().getClass().getDeclaredField("commandMap"); + } catch (NoSuchFieldException ex) { + throw new RuntimeException(ex); + } + commandMapField.setAccessible(true); + try { + commandMap = (CommandMap) commandMapField.get(Bukkit.getServer()); + } catch (IllegalAccessException ex) { + throw new RuntimeException(ex); + } + } + commandMap.register("zombies", CommandManager.INSTANCE); - GameManager.INSTANCE.loadAllGames(); + scheduleTask(() -> { + GameManager.INSTANCE.loadAllGames(); + log.info(COMZombies.CONSOLE_PREFIX + "has been enabled!"); + }); } private void loadVersionSpecificCode() @@ -196,6 +237,7 @@ public void registerEvents() m.registerEvents(new PlayerListener(), this); m.registerEvents(new OnInventoryChangeEvent(), this); m.registerEvents(new ScopeListener(), this); + m.registerEvents(new BarrierRepairListener(), this); } /** diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/commands/ArenaListCommand.java b/Core/src/main/java/com/theprogrammingturkey/comz/commands/ArenaListCommand.java index e225f18..bcf2f0a 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/commands/ArenaListCommand.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/commands/ArenaListCommand.java @@ -4,6 +4,7 @@ import com.theprogrammingturkey.comz.game.GameManager; import com.theprogrammingturkey.comz.util.COMZPermission; import com.theprogrammingturkey.comz.util.CommandUtil; +import java.util.Locale; import org.bukkit.ChatColor; import org.bukkit.entity.Player; @@ -20,7 +21,8 @@ public boolean onCommand(Player player, String[] args) CommandUtil.sendMessageToPlayer(player, ChatColor.RED + "" + ChatColor.STRIKETHROUGH + "---------------" + ChatColor.DARK_RED + "Arenas" + ChatColor.RED + "" + ChatColor.STRIKETHROUGH + "---------------"); for(Game game : GameManager.INSTANCE.getGames()) - CommandUtil.sendMessageToPlayer(player, ChatColor.RED + game.getName() + ": " + ChatColor.GREEN + "Players: " + game.getPlayersInGame().size() + ", Status: " + game.getMode().toString().toLowerCase()); + CommandUtil.sendMessageToPlayer(player, ChatColor.RED + game.getName() + ": " + ChatColor.GREEN + "Players: " + game.getPlayersInGame().size() + ", Status: " + game.getMode().toString().toLowerCase( + Locale.ROOT)); return true; } diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/commands/CommandManager.java b/Core/src/main/java/com/theprogrammingturkey/comz/commands/CommandManager.java index 68bd0f5..a35bc8e 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/commands/CommandManager.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/commands/CommandManager.java @@ -4,23 +4,24 @@ import com.theprogrammingturkey.comz.game.Game; import com.theprogrammingturkey.comz.game.GameManager; import com.theprogrammingturkey.comz.util.CommandUtil; +import java.util.List; +import java.util.Locale; import org.bukkit.ChatColor; import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import javax.annotation.Nonnull; import java.util.HashMap; -public class CommandManager implements CommandExecutor -{ +public class CommandManager extends Command { + public static final CommandManager INSTANCE = new CommandManager(); private final HashMap commandList = new HashMap<>(); private final HashMap helpCommand = new HashMap<>(); - public CommandManager() - { + public CommandManager() { + super("zombies", "Type /zombies help for more info!", "", List.of("z", "zo", "zom")); load(); } @@ -211,73 +212,59 @@ public void onRemoteCommand(Player player, String[] args) this.commandList.get(args[0]).onCommand(player, args); } - @Override - public boolean onCommand(@Nonnull CommandSender sender, Command cmd, @Nonnull String label, @Nonnull String[] args) - { - Player player; - String command = cmd.getName(); - if(command.equalsIgnoreCase("zombies")) - { - if(sender instanceof Player) - { - player = (Player) sender; - } - else - { - COMZombies.log.info("You must be in game to issue this command!"); - return true; - } - if(args.length <= 0) - { - CommandUtil.sendMessageToPlayer(player, ChatColor.RED + "" + ChatColor.BOLD + "Call of Minecraft: Zombies, By : " + ChatColor.GOLD + "IModZombies4Fun, turkey2349 and smeths!"); - CommandUtil.sendMessageToPlayer(player, ChatColor.RED + "" + ChatColor.BOLD + "Call of Minecraft: Zombies, By : " + ChatColor.GOLD + "Turkey2349, IModZombies4Fun and Smeths!"); - CommandUtil.sendMessageToPlayer(player, ChatColor.RED + "" + ChatColor.BOLD + " Type /zombies help for a list of commands!"); + public boolean execute(@Nonnull CommandSender sender, @Nonnull String label, + @Nonnull String[] args) { + final Player player; + if (sender instanceof Player) { + player = (Player) sender; + } else { + COMZombies.log.info("You must be in game to issue this command!"); + return true; + } + if (args.length == 0) { + CommandUtil.sendMessageToPlayer(player, + ChatColor.RED + "" + ChatColor.BOLD + "Call of Minecraft: Zombies, By : " + ChatColor.GOLD + + "Turkey2349, IModZombies4Fun and Smeths!"); + CommandUtil.sendMessageToPlayer(player, + ChatColor.RED + "" + ChatColor.BOLD + " Type /zombies help for a list of commands!"); + return true; + } else if (args[0].equalsIgnoreCase("setround")) { + if (!player.isOp()) { return true; } - else if(args[0].equalsIgnoreCase("setround")) - { - if(!player.isOp()) - return true; - Game arena = GameManager.INSTANCE.getGame(args[1]); - if(arena == null) - return true; - else - { - for(int i = 0; i < Integer.parseInt(args[2]); i++) - arena.nextWave(); - CommandUtil.sendMessageToPlayer(player, ChatColor.RED + "Setting wave to: " + ChatColor.GOLD + args[2]); - } - } - else if(args[0].equalsIgnoreCase("version")) - { - CommandUtil.sendMessageToPlayer(player, COMZombies.getPlugin().getDescription().getVersion()); + Game arena = GameManager.INSTANCE.getGame(args[1]); + if (arena == null) { return true; - } - if(args[0].equalsIgnoreCase("help") || args[0].equalsIgnoreCase("h")) - { - ZombiesHelpCommand help; - if(helpCommand.get(player) == null) - { - help = new ZombiesHelpCommand(this, player); - helpCommand.put(player, help); - help.commandIssued(args); + } else { + for (int i = 0; i < Integer.parseInt(args[2]); i++) { + arena.nextWave(); } - else - { - help = helpCommand.get(player); - help.commandIssued(args); - } - return true; + CommandUtil.sendMessageToPlayer(player, + ChatColor.RED + "Setting wave to: " + ChatColor.GOLD + args[2]); } - if(commandList.containsKey(args[0].toLowerCase())) - { - this.commandList.get(args[0].toLowerCase()).onCommand(player, args); - } - else - { - CommandUtil.sendMessageToPlayer(player, ChatColor.RED + "No such command! Type /zombies help for a list of commands!"); + } else if (args[0].equalsIgnoreCase("version")) { + CommandUtil.sendMessageToPlayer(player, COMZombies.getPlugin().getDescription().getVersion()); + return true; + } + if (args[0].equalsIgnoreCase("help") || args[0].equalsIgnoreCase("h")) { + ZombiesHelpCommand help; + if (helpCommand.get(player) == null) { + help = new ZombiesHelpCommand(this, player); + helpCommand.put(player, help); + help.commandIssued(args); + } else { + help = helpCommand.get(player); + help.commandIssued(args); } + return true; } - return false; + if (commandList.containsKey(args[0].toLowerCase(Locale.ROOT))) { + this.commandList.get(args[0].toLowerCase(Locale.ROOT)).onCommand(player, args); + } else { + CommandUtil.sendMessageToPlayer(player, + ChatColor.RED + "No such command! Type /zombies help for a list of commands!"); + } + + return true; } } diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/commands/EnableCommand.java b/Core/src/main/java/com/theprogrammingturkey/comz/commands/EnableCommand.java index 4c672ba..79822bb 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/commands/EnableCommand.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/commands/EnableCommand.java @@ -41,7 +41,6 @@ public boolean onCommand(Player player, String[] args) action.cancelAction(); game.setEnabled(); - game.signManager.updateGame(); CommandUtil.sendMessageToPlayer(player, ChatColor.GREEN + "Arena " + game.getName() + " has been enabled!"); return true; } diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/commands/InfoCommand.java b/Core/src/main/java/com/theprogrammingturkey/comz/commands/InfoCommand.java index 679bd9c..30b46e1 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/commands/InfoCommand.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/commands/InfoCommand.java @@ -37,10 +37,9 @@ else if(GameManager.INSTANCE.isValidArena(args[1])) { if(mode.equalsIgnoreCase("info")) { - CommandUtil.sendMessageToPlayer(player, ChatColor.RED + "" + ChatColor.STRIKETHROUGH + "----------" + ChatColor.GOLD + game.getName() + ChatColor.RED + "" + ChatColor.STRIKETHROUGH + "----------"); + CommandUtil.sendMessageToPlayer(player, ChatColor.RED + "" + ChatColor.STRIKETHROUGH + "----------" + ChatColor.GOLD + game.getName() + ChatColor.RED + ChatColor.STRIKETHROUGH + "----------"); CommandUtil.sendMessageToPlayer(player, ChatColor.GREEN + "World: " + ChatColor.BLUE + game.arena.getWorld()); - CommandUtil.sendMessageToPlayer(player, ChatColor.GREEN + "Point One: x:" + ChatColor.BLUE + game.arena.getMin().getBlockX() + ChatColor.GREEN + ", y:" + ChatColor.BLUE + game.arena.getMin().getBlockY() + ChatColor.GREEN + ", z:" + ChatColor.BLUE + game.arena.getMin().getBlockZ()); - CommandUtil.sendMessageToPlayer(player, ChatColor.GREEN + "Point Two: x:" + ChatColor.BLUE + game.arena.getMax().getBlockX() + ChatColor.GREEN + ", y:" + ChatColor.BLUE + game.arena.getMax().getBlockY() + ChatColor.GREEN + ", z:" + ChatColor.BLUE + game.arena.getMax().getBlockZ()); + CommandUtil.sendMessageToPlayer(player, ChatColor.GREEN + "Bounding Box: " + ChatColor.BLUE + game.arena.getBoundingBox()); CommandUtil.sendMessageToPlayer(player, ChatColor.GREEN + "Player Spawn: x:" + ChatColor.BLUE + game.getPlayerSpawn().getBlockX() + ChatColor.GREEN + ", y:" + ChatColor.BLUE + game.getPlayerSpawn().getBlockY() + ChatColor.GREEN + ", z:" + ChatColor.BLUE + game.getPlayerSpawn().getBlockZ()); CommandUtil.sendMessageToPlayer(player, ChatColor.GREEN + "Lobby Spawn: x:" + ChatColor.BLUE + game.getLobbyLocation().getBlockX() + ChatColor.GREEN + ", y:" + ChatColor.BLUE + game.getLobbyLocation().getBlockY() + ChatColor.GREEN + ", z:" + ChatColor.BLUE + game.getLobbyLocation().getBlockZ()); CommandUtil.sendMessageToPlayer(player, ChatColor.GREEN + "Spectator Spawn: x:" + ChatColor.BLUE + game.getSpectateLocation().getBlockX() + ChatColor.GREEN + ", y:" + ChatColor.BLUE + game.getSpectateLocation().getBlockY() + ChatColor.GREEN + ", z:" + ChatColor.BLUE + game.getSpectateLocation().getBlockZ()); @@ -59,7 +58,7 @@ else if(GameManager.INSTANCE.isValidArena(args[1])) } else if(mode.equalsIgnoreCase("spawns") || mode.equalsIgnoreCase("spawn")) { - CommandUtil.sendMessageToPlayer(player, ChatColor.RED + "" + ChatColor.STRIKETHROUGH + "----------" + ChatColor.GOLD + "Spawn Points" + ChatColor.RED + "" + ChatColor.STRIKETHROUGH + "----------"); + CommandUtil.sendMessageToPlayer(player, ChatColor.RED + "" + ChatColor.STRIKETHROUGH + "----------" + ChatColor.GOLD + "Spawn Points" + ChatColor.RED + ChatColor.STRIKETHROUGH + "----------"); CommandUtil.sendMessageToPlayer(player, ChatColor.GREEN + "Total spawns: " + game.spawnManager.getTotalSpawns()); for(int i = 0; i < game.spawnManager.getTotalSpawns(); i++) { @@ -72,11 +71,10 @@ else if(mode.equalsIgnoreCase("spawns") || mode.equalsIgnoreCase("spawn")) } else if(mode.equalsIgnoreCase("doors") || mode.equalsIgnoreCase("door")) { - CommandUtil.sendMessageToPlayer(player, ChatColor.RED + "" + ChatColor.STRIKETHROUGH + "----------" + ChatColor.GOLD + "Spawn Points" + ChatColor.RED + "" + ChatColor.STRIKETHROUGH + "----------"); + CommandUtil.sendMessageToPlayer(player, ChatColor.RED + "" + ChatColor.STRIKETHROUGH + "----------" + ChatColor.GOLD + "Spawn Points" + ChatColor.RED + ChatColor.STRIKETHROUGH + "----------"); CommandUtil.sendMessageToPlayer(player, ChatColor.GREEN + "Total doors: " + game.doorManager.getDoors().size()); - for(int i = 0; i < game.doorManager.getDoors().size(); i++) + for (Door door: game.doorManager.getDoors()) { - Door door = game.doorManager.getDoors().get(i); CommandUtil.sendMessageToPlayer(player, ChatColor.GREEN + "Door " + door.doorID); CommandUtil.sendMessageToPlayer(player, " " + ChatColor.GREEN + "Blocks: " + ChatColor.BLUE + door.getBlocks().size()); CommandUtil.sendMessageToPlayer(player, " " + ChatColor.GREEN + "Signs: " + ChatColor.BLUE + door.getSigns().size()); @@ -86,18 +84,17 @@ else if(mode.equalsIgnoreCase("doors") || mode.equalsIgnoreCase("door")) } else if(mode.equalsIgnoreCase("zombies") || mode.equalsIgnoreCase("zombie")) { - CommandUtil.sendMessageToPlayer(player, ChatColor.RED + "" + ChatColor.STRIKETHROUGH + "----------" + ChatColor.GOLD + "Zombies" + ChatColor.RED + "" + ChatColor.STRIKETHROUGH + "----------"); + CommandUtil.sendMessageToPlayer(player, ChatColor.RED + "" + ChatColor.STRIKETHROUGH + "----------" + ChatColor.GOLD + "Zombies" + ChatColor.RED + ChatColor.STRIKETHROUGH + "----------"); CommandUtil.sendMessageToPlayer(player, ChatColor.GREEN + "Total Zombies Alive: " + game.spawnManager.getEntities().size()); - for(int i = 1; i <= game.spawnManager.getEntities().size(); i++) + for(int i = 0, size = game.spawnManager.getEntities().size(); i < size; i++) { - int acc = i - 1; - CommandUtil.sendMessageToPlayer(player, ChatColor.GREEN + "Zombie " + i); - CommandUtil.sendMessageToPlayer(player, " " + ChatColor.GREEN + "Is Dead: " + ChatColor.BLUE + game.spawnManager.getEntities().get(acc).isDead()); + CommandUtil.sendMessageToPlayer(player, ChatColor.GREEN + "Zombie " + (i + 1)); + CommandUtil.sendMessageToPlayer(player, " " + ChatColor.GREEN + "Is Dead: " + ChatColor.BLUE + game.spawnManager.getEntities().get(i).isDead()); CommandUtil.sendMessageToPlayer(player, " " + ChatColor.GREEN + "Location: "); - CommandUtil.sendMessageToPlayer(player, " " + ChatColor.GREEN + "X: " + ChatColor.BLUE + game.spawnManager.getEntities().get(acc).getLocation().getBlockX()); - CommandUtil.sendMessageToPlayer(player, " " + ChatColor.GREEN + "Y: " + ChatColor.BLUE + game.spawnManager.getEntities().get(acc).getLocation().getBlockY()); - CommandUtil.sendMessageToPlayer(player, " " + ChatColor.GREEN + "Z: " + ChatColor.BLUE + game.spawnManager.getEntities().get(acc).getLocation().getBlockZ()); - CommandUtil.sendMessageToPlayer(player, " " + ChatColor.GREEN + "Health: " + ChatColor.BLUE + (game.spawnManager.getEntities().get(acc))); + CommandUtil.sendMessageToPlayer(player, " " + ChatColor.GREEN + "X: " + ChatColor.BLUE + game.spawnManager.getEntities().get(i).getLocation().getBlockX()); + CommandUtil.sendMessageToPlayer(player, " " + ChatColor.GREEN + "Y: " + ChatColor.BLUE + game.spawnManager.getEntities().get(i).getLocation().getBlockY()); + CommandUtil.sendMessageToPlayer(player, " " + ChatColor.GREEN + "Z: " + ChatColor.BLUE + game.spawnManager.getEntities().get(i).getLocation().getBlockZ()); + CommandUtil.sendMessageToPlayer(player, " " + ChatColor.GREEN + "Health: " + ChatColor.BLUE + (game.spawnManager.getEntities().get(i))); } } diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/commands/JoinCommand.java b/Core/src/main/java/com/theprogrammingturkey/comz/commands/JoinCommand.java index 9fdbed8..ca5db05 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/commands/JoinCommand.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/commands/JoinCommand.java @@ -6,6 +6,7 @@ import com.theprogrammingturkey.comz.game.GamePlayer; import com.theprogrammingturkey.comz.util.COMZPermission; import com.theprogrammingturkey.comz.util.CommandUtil; +import java.util.Objects; import org.bukkit.ChatColor; import org.bukkit.entity.Player; @@ -16,15 +17,19 @@ public class JoinCommand implements SubCommand @Override public boolean onCommand(Player player, String[] args) { - if(GameManager.INSTANCE.isPlayerInGame(player)) { - Map gamePlayers = GameManager.INSTANCE.getGame(player).gamePlayers; - if(gamePlayers.get(player).hasLeftGame()) - gamePlayers.remove(player); - else - CommandUtil.sendMessageToPlayer(player, ChatColor.RED + "" + ChatColor.BOLD + "You must leave your current game first!"); - return true; + final Game playerGame = GameManager.INSTANCE.getGame(player); + if (playerGame != null) { + if (Objects.requireNonNull(playerGame.getGamePlayer(player)).hasLeftGame()) { + playerGame.removePlayerFromGamePlayers(player); + } else { + CommandUtil.sendMessageToPlayer(player, + ChatColor.RED + "" + ChatColor.BOLD + "You must leave your current game first!"); + } + return true; + } } + if(GameManager.INSTANCE.getGames().isEmpty()) { CommandUtil.sendMessageToPlayer(player, ChatColor.RED + "" + ChatColor.BOLD + "There are no arenas!"); diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/commands/LeaderboardsCommand.java b/Core/src/main/java/com/theprogrammingturkey/comz/commands/LeaderboardsCommand.java index 6dca473..451e01d 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/commands/LeaderboardsCommand.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/commands/LeaderboardsCommand.java @@ -4,6 +4,7 @@ import com.theprogrammingturkey.comz.leaderboards.StatsCategory; import com.theprogrammingturkey.comz.util.COMZPermission; import com.theprogrammingturkey.comz.util.CommandUtil; +import java.util.Locale; import org.bukkit.ChatColor; import org.bukkit.entity.Player; @@ -23,17 +24,17 @@ public boolean onCommand(Player player, String[] args) CommandUtil.sendMessageToPlayer(player, ChatColor.DARK_RED + "Try /z leaderboard "); StringBuilder cats = new StringBuilder(); for(StatsCategory cat : StatsCategory.values()) - cats.append(cat.name().toLowerCase()).append(", "); + cats.append(cat.name().toLowerCase(Locale.ROOT)).append(", "); cats.delete(cats.length() - 2, cats.length()); CommandUtil.sendMessageToPlayer(player, ChatColor.DARK_RED + "Categories: " + cats); } else if(args.length == 2) { //TODO: dynamic length - String catName = args[1].toLowerCase(); + String catName = args[1].toLowerCase(Locale.ROOT); for(StatsCategory cat : StatsCategory.values()) { - if(cat.name().toLowerCase().equals(catName)) + if(cat.name().toLowerCase(Locale.ROOT).equals(catName)) { Leaderboard.getTopX(cat, 15, player); return true; @@ -42,7 +43,7 @@ else if(args.length == 2) CommandUtil.sendMessageToPlayer(player, ChatColor.DARK_RED + catName + " is not a valid category! "); StringBuilder cats = new StringBuilder(); for(StatsCategory cat : StatsCategory.values()) - cats.append(cat.name().toLowerCase()).append(", "); + cats.append(cat.name().toLowerCase(Locale.ROOT)).append(", "); cats.delete(cats.length() - 2, cats.length()); CommandUtil.sendMessageToPlayer(player, ChatColor.DARK_RED + "Categories: " + cats); } diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/commands/RejoinCommand.java b/Core/src/main/java/com/theprogrammingturkey/comz/commands/RejoinCommand.java index 5e724e2..65f48a0 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/commands/RejoinCommand.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/commands/RejoinCommand.java @@ -24,10 +24,11 @@ public boolean onCommand(Player player, String[] args) CommandUtil.noPermission(player, "rejoin the game"); return true; } - if(game.wasDisconnected(player)) + if(game.isDisconnectedPlayer(player)) { game.addPlayer(player); - else + } else { CommandUtil.sendMessageToPlayer(player, ChatColor.RED + "You are already in the game!"); + } return false; } diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/config/COMZConfig.java b/Core/src/main/java/com/theprogrammingturkey/comz/config/COMZConfig.java index 69e66b4..2a4f804 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/config/COMZConfig.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/config/COMZConfig.java @@ -1,5 +1,7 @@ package com.theprogrammingturkey.comz.config; +import org.jetbrains.annotations.NotNull; + public enum COMZConfig { ARENAS("arenas"), @@ -8,24 +10,24 @@ public enum COMZConfig STATS("stats"), SIGNS("signs"); - private final String name; + private final @NotNull String name; - COMZConfig(String name) + COMZConfig(@NotNull String name) { this.name = name; } - public String getName() + public @NotNull String getName() { return name; } - public String getLegacyFileName() + public @NotNull String getLegacyFileName() { return name + ".yml"; } - public String getFileName() + public @NotNull String getFileName() { return name + ".json"; } diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/config/CustomConfig.java b/Core/src/main/java/com/theprogrammingturkey/comz/config/CustomConfig.java index 47a6fce..8897475 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/config/CustomConfig.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/config/CustomConfig.java @@ -7,6 +7,7 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.theprogrammingturkey.comz.COMZombies; +import java.util.Objects; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; @@ -24,10 +25,11 @@ import java.nio.file.Files; import java.nio.file.Paths; import java.util.logging.Level; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public class CustomConfig { - private static final JsonParser JSON_PARSER = new JsonParser(); private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); private File file; @@ -71,16 +73,17 @@ private void loadConfigFromExisting() { try { - file.createNewFile(); - Reader defConfigStream = new InputStreamReader(plugin.getResource(config.getFileName()), StandardCharsets.UTF_8); - BufferedWriter writter = new BufferedWriter(new FileWriter(file.getAbsolutePath())); + Reader defConfigStream = new InputStreamReader( + Objects.requireNonNull(plugin.getResource(config.getFileName())), + StandardCharsets.UTF_8); + BufferedWriter writer = new BufferedWriter(new FileWriter(file.getAbsolutePath())); BufferedReader reader = new BufferedReader(defConfigStream); String line; while((line = reader.readLine()) != null) - writter.write(line + "\n"); + writer.write(line + "\n"); reader.close(); - writter.close(); + writer.close(); } catch(IOException e) { COMZombies.log.log(Level.SEVERE, COMZombies.CONSOLE_PREFIX + "Unable to load the COM:Z default guns config! THIS IS BAD!!!"); @@ -93,7 +96,7 @@ public JsonElement getJson() { try { - return JSON_PARSER.parse(new FileReader(file)); + return JsonParser.parseReader(new FileReader(file)); } catch(IOException e) { e.printStackTrace(); @@ -118,12 +121,11 @@ public COMZConfig getConfig() } /*** - * * Custom FileConfig calls * */ - public static int getInt(JsonObject json, String key, int defaultVal) + public static int getInt(@NotNull JsonObject json, @Nullable String key, int defaultVal) { if(json.has(key)) { @@ -134,7 +136,7 @@ public static int getInt(JsonObject json, String key, int defaultVal) return defaultVal; } - public static double getDouble(JsonObject json, String key, double defaultVal) + public static double getDouble(@NotNull JsonObject json, @Nullable String key, double defaultVal) { if(json.has(key)) { @@ -145,7 +147,7 @@ public static double getDouble(JsonObject json, String key, double defaultVal) return defaultVal; } - public static String getString(JsonObject json, String key, String defaultVal) + public static @Nullable String getString(@NotNull JsonObject json, @Nullable String key, @Nullable String defaultVal) { if(json.has(key)) { @@ -156,7 +158,7 @@ public static String getString(JsonObject json, String key, String defaultVal) return defaultVal; } - public static boolean getBoolean(JsonObject json, String key, boolean defaultVal) + public static boolean getBoolean(@NotNull JsonObject json, @Nullable String key, boolean defaultVal) { if(json.has(key)) { @@ -167,57 +169,40 @@ public static boolean getBoolean(JsonObject json, String key, boolean defaultVal return defaultVal; } - public static Location getLocation(JsonObject json, String key) + public static @Nullable Location getLocation(@NotNull JsonObject json, @Nullable String key) { JsonObject locationJson; - if(key.isEmpty()) - { + if (key == null || key.isEmpty()) { locationJson = json; - } - else - { - if(!json.has(key)) + } else { + if (!json.has(key)) { return null; + } locationJson = json.get(key).getAsJsonObject(); } int x = getInt(locationJson, "x", 0); int y = getInt(locationJson, "y", 0); int z = getInt(locationJson, "z", 0); - String worldName = getString(locationJson, "world", "Undefined"); - World world = Bukkit.getWorld(worldName); - if(world == null) - { - COMZombies.log.log(Level.CONFIG, "Failed to find world: " + worldName + "! And thus could not get the location!"); - return null; - } - return new Location(world, x, y, z); - } + String worldName = getString(locationJson, "world", null); + World world = null; - public static Location getLocationNoWorld(JsonObject json, String key) - { - JsonObject locationJson; - if(key.isEmpty()) - { - locationJson = json; - } - else - { - if(!json.has(key)) - return null; - locationJson = json.get(key).getAsJsonObject(); + if (worldName != null) { + world = Bukkit.getWorld(worldName); } - int x = getInt(locationJson, "x", 0); - int y = getInt(locationJson, "y", 0); - int z = getInt(locationJson, "z", 0); - return new Location(null, x, y, z); + if (world == null) { + COMZombies.log.log(Level.CONFIG, + "Failed to find world: " + worldName + "! And thus could not get the location!"); + return null; + } + return new Location(world, x, y, z); } - public static Location getLocationAddWorld(JsonObject json, String key, World world) + public static @Nullable Location getLocationWithWorld(@NotNull JsonObject json, @Nullable String key, @NotNull World world) { JsonObject locationJson; - if(key.isEmpty()) + if(key == null || key.isEmpty()) { locationJson = json; } @@ -234,14 +219,14 @@ public static Location getLocationAddWorld(JsonObject json, String key, World wo return new Location(world, x, y, z); } - public static JsonObject locationToJson(Location loc) + public static @NotNull JsonObject locationToJson(@NotNull Location loc) { JsonObject locJson = locationToJsonNoWorld(loc); - locJson.addProperty("world", loc.getWorld() != null ? loc.getWorld().getName() : "NULL"); + locJson.addProperty("world", loc.getWorld() != null ? loc.getWorld().getName() : null); return locJson; } - public static JsonObject locationToJsonNoWorld(Location loc) + public static @NotNull JsonObject locationToJsonNoWorld(@NotNull Location loc) { JsonObject locJson = new JsonObject(); locJson.addProperty("x", loc.getX()); diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/config/LegacyConfig.java b/Core/src/main/java/com/theprogrammingturkey/comz/config/LegacyConfig.java index c468b04..6d257ef 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/config/LegacyConfig.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/config/LegacyConfig.java @@ -5,6 +5,7 @@ import com.google.gson.JsonObject; import com.theprogrammingturkey.comz.COMZombies; import com.theprogrammingturkey.comz.game.features.PowerUp; +import java.util.Locale; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; @@ -114,7 +115,8 @@ public static void convertArenasConfig(File oldFile, CustomConfig config) JsonObject powerupsStatusJson = new JsonObject(); for(PowerUp powerUp : PowerUp.values()) if(powerUp != PowerUp.NONE) - powerupsStatusJson.addProperty(powerUp.name(), oldConfig.getBoolean(key + ".powerups." + powerUp.name().toLowerCase(), true)); + powerupsStatusJson.addProperty(powerUp.name(), oldConfig.getBoolean(key + ".powerups." + powerUp.name().toLowerCase( + Locale.ROOT), true)); powerupsJson.add("powerups", powerupsStatusJson); arenaSettingsJson.add("powerup_settings", powerupsJson); @@ -284,7 +286,7 @@ public static void convertArenasConfig(File oldFile, CustomConfig config) JsonArray spawns = new JsonArray(); String location = key + ".Doors.door" + doorID; - List oldSpawns = oldConfig.getStringList(location + ".SpawnPoints").stream().map(Integer::parseInt).collect(Collectors.toList()); + List oldSpawns = oldConfig.getStringList(location + ".SpawnPoints").stream().map(Integer::parseInt).toList(); for(int spawn : oldSpawns) spawns.add(spawn); diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/Arena.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/Arena.java index 4cbf3c7..b91da63 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/Arena.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/Arena.java @@ -2,6 +2,7 @@ import org.bukkit.Location; import org.bukkit.World; +import org.bukkit.util.BoundingBox; /** * Arena contained in every game. @@ -12,12 +13,7 @@ public class Arena /** * Location min, order in 3d world does not matter */ - private Location min; - - /** - * Location max, order in 3d world does not matter - */ - private Location max; + private BoundingBox arenaBox; /** * World in which min / max are contained, and the world the game is in. @@ -27,35 +23,24 @@ public class Arena /** * Constructs a new arena for a given game. * - * @param minZone to be assigned to max - * @param maxZone to be assigned to min + * @param corner1 to be used to construct arenaBox + * @param corner2 to be used to construct arenaBox * @param world in which the game is contained in */ - public Arena(Location minZone, Location maxZone, World world) + public Arena(Location corner1, Location corner2, World world) { - min = minZone; - max = maxZone; + arenaBox = BoundingBox.of(corner1, corner2); this.world = world; } /** - * Sets the min to loc. - * - * @param loc to be assigned to min - */ - public void setMin(Location loc) - { - min = loc; - } - - /** - * Sets the max to loc. + * Sets the arenaBox to a bounding box. * - * @param loc to be assigned to max + * @param box to be assigned to arenaBox */ - public void setMax(Location loc) + public void setBoundingBox(BoundingBox box) { - max = loc; + arenaBox = box; } /** @@ -78,21 +63,10 @@ public void setWorld(World world) */ public boolean containsBlock(Location currentLoc) { - // Short circut eval. - if(currentLoc == null || currentLoc.getWorld() == null) + if(currentLoc == null || currentLoc.getWorld() != world) return false; - if(currentLoc.getWorld() != world) - return false; - - double x = currentLoc.getX(); - double y = currentLoc.getY(); - double z = currentLoc.getZ(); - - if(x <= Math.max(max.getBlockX(), min.getBlockX()) && x >= Math.min(max.getBlockX(), min.getBlockX())) - if(y <= Math.max(max.getBlockY(), min.getBlockY()) && y >= Math.min(max.getBlockY(), min.getBlockY())) - return z <= Math.max(max.getBlockZ(), min.getBlockZ()) && z >= Math.min(max.getBlockZ(), min.getBlockZ()); - return false; + return arenaBox.contains(currentLoc.toVector()); } /** @@ -106,22 +80,12 @@ public String getWorld() } /** - * Get the max location. - * - * @return max - */ - public Location getMax() - { - return max; - } - - /** - * Get the min location. + * Get the bounding box of the arena. * - * @return min + * @return arenaBox */ - public Location getMin() + public BoundingBox getBoundingBox() { - return min; + return arenaBox.clone(); } } diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/AutoStart.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/AutoStart.java index 51c275e..e9e781f 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/AutoStart.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/AutoStart.java @@ -22,6 +22,10 @@ public class AutoStart * Seconds until game starts. */ private int seconds; + /** + * ID of the countdown task. + */ + private int countdownTaskId = -1; /** * If the timer is started, value is true. */ @@ -66,12 +70,13 @@ public void startTimer() public void endTimer() { stopped = true; + Bukkit.getScheduler().cancelTask(countdownTaskId); } - public class Countdown implements Runnable + private class Countdown implements Runnable { - public int remain; + private int remain; private int index; private Countdown(int seconds) @@ -85,6 +90,9 @@ private Countdown(int seconds) @Override public void run() { + if(stopped) + return; + if(game.getMode() == Game.ArenaStatus.INGAME || game.getPlayersInGame().isEmpty()) return; @@ -93,13 +101,9 @@ public void run() if(remain <= 0) { game.startArena(); - Bukkit.getPluginManager().callEvent(new GameStartEvent(game)); } else { - if(stopped) - return; - if(remain == WARNINGS[index]) { game.sendMessageToPlayers(WARNINGS[index] + " seconds!"); @@ -109,8 +113,7 @@ public void run() for(Player player : game.getPlayersInGame()) COMZombies.nmsUtil.sendActionBarMessage(player, ChatColor.RED + "Starting In: " + remain); - game.signManager.updateGame(); - COMZombies.scheduleTask(20, this); + countdownTaskId = COMZombies.scheduleTask(20, this); } } } diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/CachedPlayerInfo.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/CachedPlayerInfo.java index a114bda..96dd514 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/CachedPlayerInfo.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/CachedPlayerInfo.java @@ -9,10 +9,11 @@ import java.util.HashMap; import java.util.Map; import java.util.UUID; +import org.jetbrains.annotations.NotNull; public class CachedPlayerInfo { - public static Map savedPlayerInfo = new HashMap<>(); + public static Map savedPlayerInfo = new HashMap<>(); private Location oldLoc; private GameMode gameMode; @@ -21,7 +22,7 @@ public class CachedPlayerInfo private ItemStack[] invContents; private ItemStack[] armorContents; - public static void savePlayerInfo(Player player) + public static void savePlayerInfo(@NotNull Player player) { CachedPlayerInfo info = new CachedPlayerInfo(); info.oldLoc = player.getLocation().clone(); @@ -31,15 +32,15 @@ public static void savePlayerInfo(Player player) info.invContents = player.getInventory().getContents().clone(); info.armorContents = player.getInventory().getArmorContents().clone(); //don't overwrite existing info - if(!savedPlayerInfo.containsKey(player)) - savedPlayerInfo.put(player, info); + if(!savedPlayerInfo.containsKey(player.getUniqueId())) + savedPlayerInfo.put(player.getUniqueId(), info); } - public static void restorePlayerInfo(Player player) + public static void restorePlayerInfo(@NotNull Player player) { - if(savedPlayerInfo.containsKey(player)) + if(savedPlayerInfo.containsKey(player.getUniqueId())) { - CachedPlayerInfo info = savedPlayerInfo.get(player); + CachedPlayerInfo info = savedPlayerInfo.get(player.getUniqueId()); COMZombies.scheduleTask(() -> player.teleport(info.oldLoc)); player.setGameMode(info.gameMode); if(player.getAllowFlight()) @@ -47,7 +48,7 @@ public static void restorePlayerInfo(Player player) player.setTotalExperience(info.totalExp); player.getInventory().setContents(info.invContents); player.getInventory().setArmorContents(info.armorContents); - savedPlayerInfo.remove(player); + savedPlayerInfo.remove(player.getUniqueId()); } } } diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/Game.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/Game.java index 22c3822..e1ba5ba 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/Game.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/Game.java @@ -13,7 +13,6 @@ import com.theprogrammingturkey.comz.config.ConfigManager; import com.theprogrammingturkey.comz.config.CustomConfig; import com.theprogrammingturkey.comz.economy.PointManager; -import com.theprogrammingturkey.comz.game.features.Barrier; import com.theprogrammingturkey.comz.game.features.Door; import com.theprogrammingturkey.comz.game.features.DownedPlayer; import com.theprogrammingturkey.comz.game.features.PowerUp; @@ -23,6 +22,7 @@ import com.theprogrammingturkey.comz.kits.KitManager; import com.theprogrammingturkey.comz.leaderboards.Leaderboard; import com.theprogrammingturkey.comz.leaderboards.PlayerStats; +import com.theprogrammingturkey.comz.listeners.customEvents.GameStartEvent; import com.theprogrammingturkey.comz.spawning.RoundSpawnType; import com.theprogrammingturkey.comz.spawning.SpawnManager; import com.theprogrammingturkey.comz.spawning.SpawnPoint; @@ -30,8 +30,8 @@ import com.theprogrammingturkey.comz.util.CommandUtil; import org.bukkit.Bukkit; import org.bukkit.ChatColor; -import org.bukkit.EntityEffect; import org.bukkit.GameMode; +import org.bukkit.GameRule; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Sound; @@ -49,7 +49,9 @@ import java.util.List; import java.util.Map; import java.util.logging.Level; -import java.util.stream.Collectors; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.UnmodifiableView; /** * Main game class. @@ -60,7 +62,9 @@ public class Game /** * List of every player contained in game. */ - public Map gamePlayers = new LinkedHashMap<>(); + private final Map gamePlayers = new LinkedHashMap<>(); + + private final Map disconnectedPlayers = new LinkedHashMap<>(); private boolean debugMode = false; @@ -115,6 +119,8 @@ public class Game private boolean maxAmmoReplishClip; + private boolean forceNight; + private String startingGun = "M1911"; /** @@ -123,7 +129,7 @@ public class Game private int waveNumber = 0; /** - * World name for the game. + * World for the game. */ public World world; @@ -170,7 +176,7 @@ public class Game /** * Auto start timer, constructed upon join. */ - public AutoStart starter; + private AutoStart starter; /** * contains all of the Mysteryboxes in the game @@ -266,14 +272,26 @@ public PlayerWeaponManager getPlayersWeapons(Player player) return null; } - public List getPlayersInGame() + public @UnmodifiableView List getPlayersInGame() { + return gamePlayers.values().stream().filter(gp -> gp.isInGame() || gp.isDead()) + .map(GamePlayer::getPlayer).toList(); + } + + public boolean isDisconnectedPlayer(Player player) { - return gamePlayers.values().stream().filter(gp -> gp.isInGame() || gp.isDead()).map(GamePlayer::getPlayer).collect(Collectors.toList()); + return disconnectedPlayers.containsKey(player); } - public boolean wasDisconnected(Player player) + public void addDisconnected(Player player) { - return gamePlayers.containsKey(player); + GamePlayer gamePlayer = gamePlayers.get(player); + if (gamePlayer != null) { + disconnectedPlayers.put(player, gamePlayer); + } + } + + public void removeDisconnectedPlayer(Player player) { + disconnectedPlayers.remove(player); } /** @@ -428,13 +446,19 @@ public void setStarting(boolean forced) if(mode == ArenaStatus.STARTING && !forced) return; - if(forced && mode == ArenaStatus.STARTING && !starter.forced) + if(forced && mode == ArenaStatus.STARTING) { + boolean lastForced = starter.forced; starter.endTimer(); - + starter = null; + if(lastForced) { + startArena(); + return; + } + } int delay = ConfigManager.getMainConfig().arenaStartTime + 1; - if(forced) + if(forced && delay > 6) delay = 6; starter = new AutoStart(this, delay); @@ -455,6 +479,8 @@ public void startArena() if(mode == ArenaStatus.INGAME) return; + Bukkit.getPluginManager().callEvent(new GameStartEvent(this)); + waveNumber = 0; changingRound = false; mode = ArenaStatus.INGAME; @@ -465,6 +491,7 @@ public void startArena() player.setFlying(false); player.setHealth(20D); player.setFoodLevel(20); + player.setExp(0); player.setLevel(0); PointManager.INSTANCE.setPoints(player, 500); Leaderboard.getPlayerStatFromPlayer(player).incGamesPlayed(); @@ -545,8 +572,12 @@ public void nextWave() for(Player player : getDeathPlayers()) addPlayer(player); - for(DownedPlayer player : downedPlayerManager.getDownedPlayers()) - player.revivePlayer(); +// for(DownedPlayer player : downedPlayerManager.getDownedPlayers()) +// player.revivePlayer(); + List downedPlayers = downedPlayerManager.getDownedPlayers(); + while (!downedPlayers.isEmpty()) { + downedPlayers.get(downedPlayers.size() - 1).revivePlayer(); + } int delay = 0; if(waveNumber != 1) @@ -582,8 +613,6 @@ public void nextWave() signManager.updateGame(); changingRound = false; scoreboard.update(); - for(Barrier b : barrierManager.getBarriers()) - b.resetEarnedPoints(); }); } @@ -597,8 +626,8 @@ private void internalAddPlayer(Player player, int points) player.setFoodLevel(20); player.getInventory().clear(); player.getInventory().setArmorContents(null); - player.setLevel(0); player.setExp(0); + player.setLevel(0); player.teleport(lobbyLocation); PointManager.INSTANCE.setPoints(player, points); assignPlayerInventory(player); @@ -645,14 +674,14 @@ public void addPlayer(Player player) if(getPlayersInGame().size() >= minPlayers) { setStarting(false); - signManager.updateGame(); } } else if(mode == ArenaStatus.INGAME) { - if(wasDisconnected(player)) + if(isDisconnectedPlayer(player)) { removePlayer(player); + removeDisconnectedPlayer(player); gamePlayers.put(player, new GamePlayer(player)); setDead(player); @@ -694,7 +723,7 @@ public void addSpectator(Player player) public void setDead(Player player) { - gamePlayers.computeIfAbsent(player, GamePlayer::new).setState(PlayerState.DEAD); + gamePlayers.get(player).setState(PlayerState.DEAD); setPlayerSpectatorMode(player); } @@ -713,15 +742,14 @@ public void setPlayerSpectatorMode(Player player) */ public void removePlayer(Player player) { - if(downedPlayerManager.isDownedPlayer(player)) - { - //removePlayerActions(player); - // gamePlayers.remove(player); + if (downedPlayerManager.isDownedPlayer(player)) { setDead(player); - } - else if(gamePlayers.containsKey(player)) - { - gamePlayers.get(player).setState(PlayerState.LEFT_GAME); + } else if (gamePlayers.containsKey(player)) { + if (mode == ArenaStatus.WAITING) { + gamePlayers.remove(player); + } else { + gamePlayers.get(player).setState(PlayerState.LEFT_GAME); + } } resetPlayer(player); @@ -732,6 +760,10 @@ else if(gamePlayers.containsKey(player)) endGame(); } + public void removePlayerFromGamePlayers(Player player) { + gamePlayers.remove(player); + } + private void removePlayerActions(Player player) { double points = waveNumber; @@ -764,7 +796,7 @@ public void removeSpectator(Player player) } } - private void resetPlayer(Player player) + private void resetPlayer(final @NotNull Player player) { for(PotionEffectType t : PotionEffectType.values()) player.removePotionEffect(t); @@ -777,15 +809,17 @@ private void resetPlayer(Player player) scoreboard.removePlayer(player); player.updateInventory(); COMZombies plugin = COMZombies.getPlugin(); - for(Player pl : Bukkit.getOnlinePlayers()) - { - if(!gamePlayers.containsKey(pl)) - player.showPlayer(plugin, pl); - else + for (final Player pl : Bukkit.getOnlinePlayers()) { + if (pl == player) { + continue; + } + if (gamePlayers.containsKey(pl)) { pl.hidePlayer(plugin, player); + } else { + player.showPlayer(plugin, pl); + } } - signManager.updateGame(); } @@ -795,7 +829,8 @@ private void resetPlayer(Player player) */ public void forceNight() { - COMZombies.scheduleTask(5, 1200, () -> getWorld().setTime(14000L)); + getWorld().setGameRule(GameRule.DO_DAYLIGHT_CYCLE, false); + getWorld().setTime(18000L); } /** @@ -937,6 +972,7 @@ public void endGame() turnOffPower(); boxManager.loadAllBoxes(); barrierManager.unloadAllBarriers(); + disconnectedPlayers.clear(); gamePlayers.clear(); scoreboard = new GameScoreboard(this); instaKill = false; @@ -995,6 +1031,9 @@ public boolean loadGame(JsonElement arenaJsonElem) return false; } + getWorld().setGameRule(GameRule.DO_TILE_DROPS, false); + getWorld().setGameRule(GameRule.DO_ENTITY_DROPS, false); + powerSetup = CustomConfig.getBoolean(arenaSaveJson, "power_setup", false); minPlayers = CustomConfig.getInt(arenaSettingsJson, "min_players", 1); maxPlayers = CustomConfig.getInt(arenaSettingsJson, "max_players", 8); @@ -1002,15 +1041,16 @@ public boolean loadGame(JsonElement arenaJsonElem) startingGun = CustomConfig.getString(arenaSettingsJson, "StartingGun", "M1911"); dogRoundEveryX = CustomConfig.getInt(arenaSettingsJson, "dog_round_every_x", 5); maxAmmoReplishClip = CustomConfig.getBoolean(arenaSettingsJson, "max_ammo_replenish_clip", false); - - if(CustomConfig.getBoolean(arenaSettingsJson, "force_night", false)) + forceNight = CustomConfig.getBoolean(arenaSettingsJson, "force_night", false); + if (forceNight) { forceNight(); + } - min = CustomConfig.getLocationAddWorld(arenaSaveJson, "p1", world); - max = CustomConfig.getLocationAddWorld(arenaSaveJson, "p2", world); - playerTPLocation = CustomConfig.getLocationAddWorld(arenaSaveJson, "player_spawn", world); - spectateLocation = CustomConfig.getLocationAddWorld(arenaSaveJson, "spectator_spawn", world); - lobbyLocation = CustomConfig.getLocationAddWorld(arenaSaveJson, "lobby_spawn", world); + min = CustomConfig.getLocationWithWorld(arenaSaveJson, "p1", world); + max = CustomConfig.getLocationWithWorld(arenaSaveJson, "p2", world); + playerTPLocation = CustomConfig.getLocationWithWorld(arenaSaveJson, "player_spawn", world); + spectateLocation = CustomConfig.getLocationWithWorld(arenaSaveJson, "spectator_spawn", world); + lobbyLocation = CustomConfig.getLocationWithWorld(arenaSaveJson, "lobby_spawn", world); arena = new Arena(min, max, world); mode = ArenaStatus.WAITING; @@ -1036,6 +1076,8 @@ public boolean loadGame(JsonElement arenaJsonElem) hasWarps = true; hasPoints = true; + signManager.updateGame(); + return true; } @@ -1053,6 +1095,7 @@ public JsonObject saveGame() arenaSettingsJson.addProperty("StartingGun", startingGun); arenaSettingsJson.addProperty("dog_round_every_x", dogRoundEveryX); arenaSettingsJson.addProperty("max_ammo_replenish_clip", maxAmmoReplishClip); + arenaSettingsJson.addProperty("force_night", forceNight); arenaSaveJson.addProperty("world_name", world.getName()); @@ -1250,7 +1293,9 @@ public boolean isFireSale() public void damageMob(Mob mob, Player player, float damageAmount) { double mobHealth = mob.getHealth() - damageAmount; - mob.playEffect(EntityEffect.HURT); + + mob.playHurtAnimation(player.getLocation() + .setDirection(mob.getLocation().subtract(player.getLocation()).toVector()).getYaw()); if(isInstaKill()) { @@ -1299,7 +1344,7 @@ else if(mobHealth < 1) if(mob instanceof Zombie) zombieKilled(player); - if(spawnManager.getEntities().size() <= 0 && spawnManager.getMobsSpawned() == spawnManager.getMobsToSpawn()) + if(spawnManager.getEntities().isEmpty() && spawnManager.getMobsSpawned() == spawnManager.getMobsToSpawn()) { if(mob instanceof Wolf) powerUpManager.dropPowerUp(mob, PowerUp.MAX_AMMO); @@ -1421,20 +1466,28 @@ public boolean isPlayerSpectating(Player player) return gamePlayers.containsKey(player) && gamePlayers.get(player).isSpectating(); } - public List getPlayersAndSpectators() + public @Nullable GamePlayer getGamePlayer(@NotNull Player player) { + return gamePlayers.get(player); + } + + public @UnmodifiableView List getPlayersAndSpectators() { return gamePlayers.values().stream() .filter(v -> v.isInGame() || v.isSpectating()) .map(GamePlayer::getPlayer) - .collect(Collectors.toList()); + .toList(); } - public List getDeathPlayers() + public @UnmodifiableView List getDeathPlayers() { return gamePlayers.values().stream() .filter(GamePlayer::isDead) .map(GamePlayer::getPlayer) - .collect(Collectors.toList()); + .toList(); + } + + public @NotNull Arena getArena() { + return arena; } public void sendMessageToPlayers(String message) diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/GameManager.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/GameManager.java index 7b47ba3..a05516e 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/GameManager.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/GameManager.java @@ -7,6 +7,7 @@ import com.theprogrammingturkey.comz.config.COMZConfig; import com.theprogrammingturkey.comz.config.ConfigManager; import com.theprogrammingturkey.comz.game.Game.ArenaStatus; +import java.util.Collections; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; @@ -18,6 +19,9 @@ import java.util.List; import java.util.Map; import java.util.logging.Level; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.UnmodifiableView; public class GameManager { @@ -25,12 +29,12 @@ public class GameManager private final List games = new ArrayList<>(); - public List getGames() + public @UnmodifiableView List getGames() { - return games; + return Collections.unmodifiableList(games); } - public void removeGame(Game game) + public void removeGame(@NotNull Game game) { this.games.remove(game); } @@ -41,7 +45,7 @@ public void endAll() game.endGame(); } - public Game getGame(Entity entity) + public @Nullable Game getGame(@NotNull Entity entity) { for(Game game : games) for(Entity ent : game.spawnManager.getEntities()) @@ -68,7 +72,7 @@ public void loadAllGames() else COMZombies.log.log(Level.SEVERE, COMZombies.CONSOLE_PREFIX + "Failed to load arena " + arena.getKey() + "!"); } - Bukkit.broadcastMessage(COMZombies.PREFIX + ChatColor.RED + ChatColor.BOLD + " Done loading arenas!"); + Bukkit.broadcastMessage(COMZombies.PREFIX + ChatColor.RED + ChatColor.BOLD + "Done loading arenas!"); } public void saveAllGames() @@ -84,19 +88,19 @@ public void disableAllArenas() for(Game gl : games) { for(Game game : games) - for(int q = 0; q < game.doorManager.getDoors().size(); q++) - game.doorManager.getDoors().get(q).closeDoor(); + for(Door door: game.doorManager.getDoors()) + door.closeDoor(); gl.endGame(); gl.resetSpawnLocationBlocks(); } } - public void addArena(Game game) + public void addArena(@NotNull Game game) { games.add(game); } - public Game getGame(Door door) + public @Nullable Game getGame(@NotNull Door door) { for(Game gl : games) if(gl.doorManager.getDoors().contains(door)) @@ -104,10 +108,10 @@ public Game getGame(Door door) return null; } - public Game getGame(Player player) + public @Nullable Game getGame(@NotNull Player player) { for(Game game : games) - if(game.isPlayerPlaying(player) || game.isPlayerSpectating(player) || game.wasDisconnected(player)) + if(game.isPlayerPlaying(player) || game.isPlayerSpectating(player) || game.isDisconnectedPlayer(player)) return game; return null; } @@ -120,7 +124,7 @@ public boolean isPlayerInGame(Player player) return false; } - public Game getGame(String name) + public @Nullable Game getGame(@NotNull String name) { for(Game gl : games) if(name.equalsIgnoreCase(gl.getName())) @@ -174,7 +178,7 @@ public boolean isValidArena(String name) return false; } - public Game getGame(Location loc) + public @Nullable Game getGame(@NotNull Location loc) { for(Game gl : games) if(gl.arena != null && gl.arena.containsBlock(loc)) diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/GameScoreboard.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/GameScoreboard.java index 055bc2a..1c89b20 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/GameScoreboard.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/GameScoreboard.java @@ -1,9 +1,11 @@ package com.theprogrammingturkey.comz.game; import com.theprogrammingturkey.comz.economy.PointManager; +import java.util.Objects; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.entity.Player; +import org.bukkit.scoreboard.Criteria; import org.bukkit.scoreboard.DisplaySlot; import org.bukkit.scoreboard.Objective; import org.bukkit.scoreboard.Score; @@ -12,17 +14,19 @@ import org.bukkit.scoreboard.Team; import java.util.HashMap; +import org.jetbrains.annotations.NotNull; public class GameScoreboard { - private final Game game; - private final ScoreboardManager manager = Bukkit.getScoreboardManager(); - private final Scoreboard board; - private final Team team; - private final Objective objective; - private final Score round; - private final Score zombiesLeft; + private final @NotNull Game game; + private final @NotNull ScoreboardManager manager = Objects.requireNonNull( + Bukkit.getScoreboardManager()); + private final @NotNull Scoreboard board; + private final @NotNull Team team; + private final @NotNull Objective objective; + private final @NotNull Score round; + private final @NotNull Score zombiesLeft; private final HashMap playerScores = new HashMap<>(); public GameScoreboard(Game game) @@ -33,7 +37,7 @@ public GameScoreboard(Game game) team.setDisplayName(ChatColor.RED + game.getName()); team.setCanSeeFriendlyInvisibles(true); team.setAllowFriendlyFire(false); - objective = board.registerNewObjective(this.game.getName(), "dummy", ChatColor.RED + this.game.getName()); + objective = board.registerNewObjective(this.game.getName(), Criteria.DUMMY, ChatColor.RED + this.game.getName()); objective.setDisplaySlot(DisplaySlot.SIDEBAR); round = objective.getScore(ChatColor.RED + "Round"); round.setScore(0); @@ -55,7 +59,6 @@ public void addPlayer(Player player) playerScores.get(player).setScore(500); } } - game.signManager.updateGame(); } public void removePlayer(Player player) @@ -64,7 +67,6 @@ public void removePlayer(Player player) board.resetScores(player.getName()); player.setScoreboard(manager.getNewScoreboard()); playerScores.remove(player); - game.signManager.updateGame(); } public void update() @@ -74,7 +76,5 @@ public void update() for(Player player : playerScores.keySet()) playerScores.get(player).setScore(PointManager.INSTANCE.getPlayersPoints(player)); - - game.signManager.updateGame(); } } diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/actions/ArenaSetupAction.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/actions/ArenaSetupAction.java index 3957e61..fc269d9 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/actions/ArenaSetupAction.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/actions/ArenaSetupAction.java @@ -14,7 +14,7 @@ public class ArenaSetupAction extends BaseAction { - private int particleBoxID; + private int particleBoxId = -1; private boolean runOnce = false; private boolean setup = false; @@ -38,7 +38,7 @@ public ArenaSetupAction(Player player, Game game) public void cancelAction() { if(runOnce) - Bukkit.getScheduler().cancelTask(particleBoxID); + Bukkit.getScheduler().cancelTask(particleBoxId); if(!setup) GameManager.INSTANCE.removeGame(game); @@ -84,7 +84,7 @@ else if(message.equalsIgnoreCase("done")) if(game.gameSetupComplete(player)) { if(runOnce) - Bukkit.getScheduler().cancelTask(particleBoxID); + Bukkit.getScheduler().cancelTask(particleBoxId); COMZombies.getPlugin().activeActions.remove(player); if(!setup) @@ -105,11 +105,11 @@ public void updateBoxParticles() return; if(runOnce) - Bukkit.getScheduler().cancelTask(particleBoxID); + Bukkit.getScheduler().cancelTask(particleBoxId); else runOnce = true; - particleBoxID = COMZombies.scheduleTask(0, 5, () -> + particleBoxId = COMZombies.scheduleTask(0, 5, () -> { Location min = new Location(world, Math.min(p1.getBlockX(), p2.getBlockX()), Math.min(p1.getBlockY(), p2.getBlockY()), Math.min(p1.getBlockZ(), p2.getBlockZ())); Location max = new Location(world, Math.max(p1.getBlockX(), p2.getBlockX()), Math.max(p1.getBlockY(), p2.getBlockY()), Math.max(p1.getBlockZ(), p2.getBlockZ())); diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/actions/BarrierRemoveAction.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/actions/BarrierRemoveAction.java index 011677f..d33e566 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/actions/BarrierRemoveAction.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/actions/BarrierRemoveAction.java @@ -27,12 +27,12 @@ public BarrierRemoveAction(Player player, Game game) BlockData blockData = block.getBlockData(); ((Directional) blockData).setFacing(barrier.getSignFacing()); block.setBlockData(blockData); - Sign sign = (Sign) block.getState(); + final Sign sign = (Sign) block.getState(); sign.setLine(0, "[BarrierRemove]"); sign.setLine(1, "Break this to"); sign.setLine(2, "remove the"); sign.setLine(3, "barrier"); - sign.update(true); + sign.update(); } CommandUtil.sendMessageToPlayer(player, ChatColor.RED + "" + ChatColor.BOLD + "" + ChatColor.STRIKETHROUGH + "---------------" + ChatColor.DARK_RED + "Barrier Removal" + ChatColor.RED + "" + ChatColor.BOLD + "" + ChatColor.STRIKETHROUGH + "---------------"); diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/actions/BarrierSetupAction.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/actions/BarrierSetupAction.java index 7132c49..de06304 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/actions/BarrierSetupAction.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/actions/BarrierSetupAction.java @@ -30,7 +30,7 @@ public BarrierSetupAction(Player player, Game game, Barrier barrier) if(!player.getInventory().contains(Material.WOODEN_SWORD)) player.getInventory().addItem(new ItemStack(Material.WOODEN_SWORD)); - CommandUtil.sendMessageToPlayer(player, ChatColor.RED + "" + ChatColor.BOLD + "" + ChatColor.STRIKETHROUGH + "------" + ChatColor.DARK_RED + "Barrier Setup" + ChatColor.RED + "" + ChatColor.BOLD + "" + ChatColor.STRIKETHROUGH + "-----"); + CommandUtil.sendMessageToPlayer(player, ChatColor.RED + "" + ChatColor.BOLD + ChatColor.STRIKETHROUGH + "------" + ChatColor.DARK_RED + "Barrier Setup" + ChatColor.RED + "" + ChatColor.BOLD + "" + ChatColor.STRIKETHROUGH + "-----"); CommandUtil.sendMessageToPlayer(player, ChatColor.GOLD + "Select each block individually to be the barrier using the wooden sword."); CommandUtil.sendMessageToPlayer(player, ChatColor.GOLD + "Once you have this complete, type done, go into the room the barrier blocks to and click on any ender portal frames (spawn points) that is in there with the sword."); CommandUtil.sendMessageToPlayer(player, ChatColor.GOLD + "Lastly! In chat, type a price for the each repairation stage of the barrier"); diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/actions/DoorRemoveAction.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/actions/DoorRemoveAction.java index 84e49a5..ec1febb 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/actions/DoorRemoveAction.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/actions/DoorRemoveAction.java @@ -9,6 +9,7 @@ import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.block.Block; import org.bukkit.block.Sign; import org.bukkit.entity.Player; import org.bukkit.event.block.BlockBreakEvent; @@ -19,20 +20,18 @@ public DoorRemoveAction(Player player, Game game) { super(player, game); - for(Door door : game.doorManager.getDoors()) - { - for(Sign sign : door.getSigns()) - { - if(!(sign.getBlock().getState() instanceof Sign)) - { - sign.getBlock().setType(Material.OAK_WALL_SIGN); + for (final Door door : game.doorManager.getDoors()) { + for (final Location location : door.getSigns()) { + final Block block = location.getBlock(); + if (!(block.getState() instanceof Sign)) { + location.getBlock().setType(Material.OAK_WALL_SIGN); } + final Sign sign = (Sign) block.getState(); sign.setLine(0, ChatColor.RED + "Break a sign"); sign.setLine(1, ChatColor.RED + "to remove the"); sign.setLine(2, ChatColor.RED + "door that the"); sign.setLine(3, ChatColor.RED + "sign is for!"); sign.update(); - sign.update(true); } } CommandUtil.sendMessageToPlayer(player, ChatColor.RED + "" + ChatColor.BOLD + "" + ChatColor.STRIKETHROUGH + "-------" + ChatColor.DARK_RED + "Door Removal" + ChatColor.RED + "" + ChatColor.BOLD + "" + ChatColor.STRIKETHROUGH + "-------"); @@ -49,12 +48,12 @@ public void onBlockBreakevent(BlockBreakEvent event) return; event.setCancelled(true); - for(Sign sign : door.getSigns()) - BlockUtils.setBlockToAir(sign.getBlock()); + + door.getSigns().forEach(BlockUtils::setBlockToAir); CommandUtil.sendMessageToPlayer(player, ChatColor.GREEN + "" + ChatColor.BOLD + "Door removed!"); game.doorManager.removeDoor(door); - if(game.doorManager.getDoors().size() == 0) + if(game.doorManager.getDoors().isEmpty()) { CommandUtil.sendMessageToPlayer(player, ChatColor.RED + "No doors left!"); cancelAction(); diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/actions/DoorSetupAction.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/actions/DoorSetupAction.java index 9cc046f..d81278b 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/actions/DoorSetupAction.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/actions/DoorSetupAction.java @@ -10,7 +10,6 @@ import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.block.Block; -import org.bukkit.block.Sign; import org.bukkit.entity.Player; import org.bukkit.event.block.Action; import org.bukkit.event.player.PlayerInteractEvent; @@ -32,7 +31,7 @@ public DoorSetupAction(Player player, Game game, Door door) if(!player.getInventory().contains(Material.WOODEN_SWORD)) player.getInventory().addItem(new ItemStack(Material.WOODEN_SWORD)); - CommandUtil.sendMessageToPlayer(player, ChatColor.RED + "" + ChatColor.BOLD + "" + ChatColor.STRIKETHROUGH + "-------" + ChatColor.DARK_RED + "Door Setup" + ChatColor.RED + "" + ChatColor.BOLD + "" + ChatColor.STRIKETHROUGH + "-------"); + CommandUtil.sendMessageToPlayer(player, ChatColor.RED + "" + ChatColor.BOLD + ChatColor.STRIKETHROUGH + "-------" + ChatColor.DARK_RED + "Door Setup" + ChatColor.RED + ChatColor.BOLD + ChatColor.STRIKETHROUGH + "-------"); CommandUtil.sendMessageToPlayer(player, ChatColor.GOLD + "Select each block individually to be the door using the wooden sword."); CommandUtil.sendMessageToPlayer(player, ChatColor.GOLD + "Once you have this complete, type done, go into the room the door opens to and click on any ender portal frame (spawn point) that is in there with the sword."); CommandUtil.sendMessageToPlayer(player, ChatColor.GOLD + "Once you have this complete, type done, find any signs that open this door and click them with the sword."); @@ -69,10 +68,9 @@ public void onPlayerInteractEvent(PlayerInteractEvent event) if(state == 2 && (event.getAction().equals(Action.LEFT_CLICK_BLOCK) || event.getAction().equals(Action.RIGHT_CLICK_BLOCK))) { Block block = event.getClickedBlock(); - if(BlockUtils.isSign(block.getType())) + if(BlockUtils.isSign(block.getBlockData())) { - Sign sign = (Sign) event.getClickedBlock().getState(); - door.addSign(sign); + door.addSign(block.getLocation()); event.setCancelled(true); CommandUtil.sendMessageToPlayer(player, ChatColor.GREEN + "Sign selected!"); } diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/features/Barrier.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/features/Barrier.java index 13efa8b..eee8ecf 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/features/Barrier.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/features/Barrier.java @@ -5,8 +5,15 @@ import com.theprogrammingturkey.comz.game.Game; import com.theprogrammingturkey.comz.spawning.SpawnPoint; import com.theprogrammingturkey.comz.util.BlockUtils; +import java.util.Collections; +import java.util.Map.Entry; +import java.util.NavigableSet; +import java.util.Objects; +import java.util.TreeMap; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.Sound; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.Sign; @@ -18,16 +25,16 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import java.util.Map; +import org.jetbrains.annotations.UnmodifiableView; public class Barrier implements Runnable { - private final Map blocks = new HashMap<>(); + private final TreeMap blocks = new TreeMap<>(BlockUtils::compareBlockLocation); private Location repairLoc; private BlockFace signFacing; private final List spawns = new ArrayList<>(); - private int stage; + private int stage = -1; private boolean breaking = false; private final String id; @@ -37,74 +44,91 @@ public class Barrier implements Runnable private int reward; private final List ents = new ArrayList<>(); - private final HashMap earnedPoints = new HashMap<>(); + + private int taskId = -1; public Barrier(String id, Game game) { - stage = 0; - this.id = id; + this.id = id; this.game = game; } + public void putSign() { + Block block = repairLoc.getBlock(); + block.setType(Material.OAK_WALL_SIGN); + BlockData blockData = block.getBlockData(); + ((Directional) blockData).setFacing(signFacing); + block.setBlockData(blockData); + final Sign sign = (Sign) block.getState(); + sign.setLine(0, "[BarrierRepair]"); + sign.setLine(1, "Break this to"); + sign.setLine(2, "repair the"); + sign.setLine(3, "barrier"); + sign.update(); + } + public boolean damage() { - stage++; + int maxStage = blocks.size() - 1; + + if (stage > maxStage) { + throw new IllegalStateException( + "stage (" + stage + ") must be equal or less than maxStage (" + maxStage + ")"); + } + if (stage == maxStage) { + return true; + } - if(stage > 5) - stage = 5; + stage++; game.updateBarrierDamage(stage, blocks.keySet()); - if(stage >= 5) - { - for(Block b : blocks.keySet()) - BlockUtils.setBlockToAir(b); - return true; + if (stage == 0) { + putSign(); } - else - { - if(stage > -1) - { - Block block = repairLoc.getBlock(); - block.setType(Material.OAK_WALL_SIGN); - BlockData blockData = block.getBlockData(); - ((Directional) blockData).setFacing(signFacing); - block.setBlockData(blockData); - Sign sign = (Sign) block.getState(); - sign.setLine(0, "[BarrierRepair]"); - sign.setLine(1, "Break this to"); - sign.setLine(2, "repair the"); - sign.setLine(3, "barrier"); - sign.update(true); - } - return false; + + if (stage == maxStage) { + blocks.keySet().forEach(BlockUtils::setBlockToAir); + } else { + blocks.keySet().stream().filter(block -> block.getType() != Material.BARRIER).findFirst() + .orElseThrow().setType(Material.BARRIER); } + + return stage == maxStage; } public boolean repair(Player player) { - stage--; + if (stage < -1) { + throw new IllegalStateException("stage (" + stage + ") must be equal or larger than -1"); + } - if(stage < -1) - stage = -1; + if (stage == -1) { + return true; + } + + boolean wasMaxStage = stage == (blocks.size() - 1); + + stage--; game.updateBarrierDamage(stage, blocks.keySet()); - int pointsEarned = earnedPoints.getOrDefault(player, 0); - //TODO: Make configurable - if(pointsEarned < reward * 6) - { - earnedPoints.put(player, pointsEarned + reward); - PointManager.INSTANCE.addPoints(player, reward); - PointManager.INSTANCE.notifyPlayer(player); - } + + PointManager.INSTANCE.addPoints(player, reward); + PointManager.INSTANCE.notifyPlayer(player); if(stage == -1) BlockUtils.setBlockToAir(repairLoc); - for(Block b : blocks.keySet()) - if(game.getWorld().getBlockAt(b.getLocation()).getType().equals(Material.AIR)) - BlockUtils.setBlockTypeHelper(game.getWorld().getBlockAt(b.getLocation()), blocks.get(b)); - return stage <= -1; + if (wasMaxStage) { + blocks.keySet().forEach(block -> block.setType(Material.BARRIER)); + } + + Entry blockMaterialEntry = blocks.entrySet().stream() + .filter(entry -> entry.getKey().getType() == Material.BARRIER || entry.getKey().isEmpty()) + .findFirst().orElseThrow(); + BlockUtils.setBlockTypeHelper(blockMaterialEntry.getKey(), blockMaterialEntry.getValue()); + + return stage == -1; } public void repairFull() @@ -113,20 +137,15 @@ public void repairFull() game.updateBarrierDamage(-1, blocks.keySet()); - for(Block b : blocks.keySet()) - if(b.getType().equals(Material.AIR)) - BlockUtils.setBlockTypeHelper(b, blocks.get(b)); + blocks.entrySet().stream() + .filter(entry -> entry.getKey().isEmpty() || entry.getKey().getType() == Material.BARRIER) + .forEach(entry -> BlockUtils.setBlockTypeHelper(entry.getKey(), entry.getValue())); BlockUtils.setBlockToAir(repairLoc); this.breaking = false; } - public void resetEarnedPoints() - { - earnedPoints.replaceAll((p, v) -> 0); - } - public void addBarrierBlock(Location loc) { Block block = loc.getBlock(); @@ -138,9 +157,9 @@ public void addBarrierBlock(Block block, Material mat) blocks.put(block, mat); } - public List getBlocks() + public NavigableSet getBlocks() { - return new ArrayList<>(blocks.keySet()); + return Collections.unmodifiableNavigableSet(blocks.navigableKeySet()); } public boolean hasBarrierLoc(Block b) @@ -173,9 +192,9 @@ public boolean hasSpawnPoint(SpawnPoint sp) return spawns.contains(sp); } - public List getSpawnPoints() + public @UnmodifiableView List getSpawnPoints() { - return spawns; + return Collections.unmodifiableList(spawns); } public String getID() @@ -220,31 +239,32 @@ public Game getGame() return game; } - public void update() - { - for(int i = 0; i < ents.size(); i++) - { - Entity ent = ents.get(i); - if(ent.isDead()) - { - ents.remove(ent); - i--; - } - } + public void update() { + ents.removeIf(Entity::isDead); - if(ents.size() > 0 && !this.damage()) - COMZombies.scheduleTask(60, this); - else + if (ents.isEmpty()) { this.breaking = false; + taskId = -1; + } else { + boolean fullyDamaged = this.damage(); + Objects.requireNonNull(repairLoc.getWorld()) + .playSound(repairLoc, Sound.ENTITY_WITHER_SHOOT, 1, 1); + if (fullyDamaged) { + this.breaking = false; + taskId = -1; + } else { + taskId = COMZombies.scheduleTask(60, this); + } + } } public void initBarrier(Entity ent) { ents.add(ent); - if(this.stage < 6 && !breaking) + if(!breaking && !Bukkit.getScheduler().isQueued(taskId)) { this.breaking = true; - COMZombies.scheduleTask(60, this); + taskId = COMZombies.scheduleTask(60, this); } } diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/features/Door.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/features/Door.java index d729373..6425132 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/features/Door.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/features/Door.java @@ -9,6 +9,10 @@ import com.theprogrammingturkey.comz.game.GameManager; import com.theprogrammingturkey.comz.spawning.SpawnPoint; import com.theprogrammingturkey.comz.util.BlockUtils; +import java.util.Collections; +import java.util.NavigableSet; +import java.util.Objects; +import java.util.TreeMap; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; @@ -18,18 +22,19 @@ import org.bukkit.block.Sign; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.logging.Level; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.UnmodifiableView; public class Door { public String doorID; private final Game game; private int price = 0; - private final Map blocks = new HashMap<>(); - private final List signs = new ArrayList<>(); + private final TreeMap blocks = new TreeMap<>(BlockUtils::compareBlockLocation); + private final List signs = new ArrayList<>(); private List spawnsInRoomDoorLeadsTo = new ArrayList<>(); private boolean isOpened = false; @@ -75,8 +80,8 @@ public JsonObject save() JsonArray signsJson = new JsonArray(); saveJson.add("signs", signsJson); - for(Sign sign : signs) - signsJson.add(CustomConfig.locationToJsonNoWorld(sign.getLocation())); + for(Location sign : signs) + signsJson.add(CustomConfig.locationToJsonNoWorld(sign)); JsonArray spawnsJson = new JsonArray(); @@ -123,21 +128,21 @@ private void loadSigns(JsonArray signs) if(!signElem.isJsonObject()) continue; JsonObject signJson = signElem.getAsJsonObject(); - Location loc = CustomConfig.getLocationAddWorld(signJson, "", game.getWorld()); + Location loc = CustomConfig.getLocationWithWorld(signJson, "", game.getWorld()); if(loc != null) { Block block = loc.getBlock(); - if(BlockUtils.isSign(block.getType())) + if(BlockUtils.isSign(block.getBlockData())) { Sign sign = (Sign) block.getState(); String costLine = sign.getLine(3); price = costLine.matches("[0-9]{1,9}") ? Integer.parseInt(costLine) : 750; - this.signs.add(sign); + this.signs.add(loc); } } else { - COMZombies.log.log(Level.WARNING, COMZombies.CONSOLE_PREFIX + "Failed to load in location for door sign! Json: " + signJson.toString()); + COMZombies.log.log(Level.WARNING, COMZombies.CONSOLE_PREFIX + "Failed to load in location for door sign! Json: " + signJson); } } @@ -152,7 +157,7 @@ public void addSpawnPoint(SpawnPoint point) public boolean hasDoorBlocks() { - return blocks.size() >= 2; + return !blocks.isEmpty(); } public void openDoor() @@ -164,7 +169,7 @@ public void openDoor() continue; COMZombies.scheduleTask(interval, () -> BlockUtils.setBlockToAir(block)); - interval += 1; + interval++; } isOpened = true; } @@ -176,34 +181,34 @@ public boolean isOpened() public void closeDoor() { - for(Block block : blocks.keySet()) - BlockUtils.setBlockTypeHelper(block, blocks.get(block)); + blocks.forEach(BlockUtils::setBlockTypeHelper); - for(Sign sign : signs) + for(Location location : signs) { + final Sign sign = (Sign) location.getBlock().getState(); sign.setLine(0, ChatColor.RED + "[Zombies]"); sign.setLine(1, ChatColor.AQUA + "Door"); sign.setLine(2, ChatColor.GOLD + "Price:"); sign.setLine(3, Integer.toString(price)); - sign.update(true); + sign.update(); } isOpened = false; } - public List getSpawnsInRoomDoorLeadsTo() + public @UnmodifiableView List getSpawnsInRoomDoorLeadsTo() { - return spawnsInRoomDoorLeadsTo; + return Collections.unmodifiableList(spawnsInRoomDoorLeadsTo); } - public void addSign(Sign sign) + public void addSign(Location sign) { signs.add(sign); GameManager.INSTANCE.saveAllGames(); } - public List getSigns() + public @UnmodifiableView List getSigns() { - return signs; + return Collections.unmodifiableList(signs); } /** @@ -220,17 +225,18 @@ private void loadBlocks(JsonArray blocks) continue; JsonObject blockJson = blockElem.getAsJsonObject(); - Location loc = CustomConfig.getLocationAddWorld(blockJson, "", game.getWorld()); + Location loc = CustomConfig.getLocationWithWorld(blockJson, "", game.getWorld()); if(loc != null) { - Material mat = BlockUtils.getMaterialFromKey(CustomConfig.getString(blockJson, "material", "")); + Material mat = BlockUtils.getMaterialFromKey( + Objects.requireNonNull(CustomConfig.getString(blockJson, "material", null))); BlockUtils.setBlockTypeHelper(loc.getBlock(), mat); this.blocks.put(loc.getBlock(), mat); } else { - COMZombies.log.log(Level.WARNING, COMZombies.CONSOLE_PREFIX + "Failed to load in location for door block! Json: " + blockJson.toString()); + COMZombies.log.log(Level.WARNING, COMZombies.CONSOLE_PREFIX + "Failed to load in location for door block! Json: " + blockJson); } } } @@ -267,26 +273,26 @@ public void saveBlocks(Location p1, Location p2) GameManager.INSTANCE.saveAllGames(); } - public void addDoorBlock(Location loc) + public void addDoorBlock(@NotNull Location loc) { Block block = loc.getBlock(); this.addDoorBlock(block, block.getType()); } - public void addDoorBlock(Block block, Material mat) + public void addDoorBlock(@NotNull Block block, @NotNull Material mat) { blocks.put(block, mat); } - public void removeDoorBlock(Location loc) + public void removeDoorBlock(@NotNull Location loc) { Block block = loc.getBlock(); blocks.remove(block); } - public List getBlocks() + public NavigableSet getBlocks() { - return new ArrayList<>(blocks.keySet()); + return Collections.unmodifiableNavigableSet(blocks.navigableKeySet()); } public boolean hasDoorLoc(Block b) diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/features/DownedPlayer.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/features/DownedPlayer.java index bd10da5..40ae1a7 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/features/DownedPlayer.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/features/DownedPlayer.java @@ -9,6 +9,7 @@ import com.theprogrammingturkey.comz.game.weapons.WeaponInstance; import com.theprogrammingturkey.comz.leaderboards.Leaderboard; import com.theprogrammingturkey.comz.leaderboards.PlayerStats; +import java.util.random.RandomGenerator; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Color; @@ -53,8 +54,7 @@ public void setPlayerDown() guns[1] = manager.removeWeapon(2); manager.removeWeapon(3); manager.addWeapon(WeaponManager.getGun(game.getStartingGun()).getNewInstance(player, 1)); - player.setGameMode(GameMode.CREATIVE); - player.setAllowFlight(false); + player.setInvulnerable(true); player.setWalkSpeed(0.02f); scheduleTask(); } @@ -65,6 +65,7 @@ public void clearDownedState() isBeingRevived = false; Bukkit.getScheduler().cancelTask(fireWorksTask); player.setGameMode(GameMode.SURVIVAL); + player.setInvulnerable(false); player.setWalkSpeed(0.2F); player.setHealth(20); reviver = null; @@ -101,6 +102,9 @@ public void startRevive(Player reviver) this.isBeingRevived = true; this.reviver = reviver; int reviveTime = ConfigManager.getMainConfig().reviveTimer * 20; + if (game.perkManager.hasPerk(reviver, PerkType.QUICK_REVIVE)) { + reviveTime /= 5; + } reviveTask = COMZombies.scheduleTask(reviveTime, this::revivePlayer); } @@ -135,26 +139,13 @@ private void displayDown() private FireworkEffect getRandomFireworkEffect() { - boolean trail = Math.random() * 100 > 50; - - boolean flickr = Math.random() * 100 > 50; - - int r = (int) (Math.random() * 255); - int g = (int) (Math.random() * 255); - int b = (int) (Math.random() * 255); - Color color = Color.fromRGB(r, g, b); - int rand = (int) (Math.random() * 5); - Type type; - if(rand == 0) - type = Type.BALL; - else if(rand == 1) - type = Type.BALL_LARGE; - else if(rand == 2) - type = Type.BURST; - else if(rand == 3) - type = Type.CREEPER; - else - type = Type.STAR; + RandomGenerator rand = COMZombies.rand; + + boolean trail = rand.nextBoolean(); + boolean flickr = rand.nextBoolean(); + + Color color = Color.fromRGB(rand.nextInt(256), rand.nextInt(256), rand.nextInt(256)); + Type type = Type.values()[rand.nextInt(Type.values().length)]; return FireworkEffect.builder().trail(trail).flicker(flickr).withColor(color).with(type).build(); } diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/features/PerkType.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/features/PerkType.java index ce27d21..6c5b8dd 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/features/PerkType.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/features/PerkType.java @@ -1,6 +1,7 @@ package com.theprogrammingturkey.comz.game.features; import com.theprogrammingturkey.comz.COMZombies; +import java.util.Locale; import org.bukkit.ChatColor; import org.bukkit.Effect; import org.bukkit.Material; @@ -12,7 +13,6 @@ import java.util.Arrays; import java.util.List; -import java.util.stream.Collectors; public enum PerkType { @@ -30,7 +30,8 @@ public enum PerkType public static PerkType getPerkType(String name) { for(PerkType pt : values()) - if((ChatColor.GOLD + pt.toString()).equalsIgnoreCase(name) || (pt.toString().toLowerCase().equalsIgnoreCase(name))) + if((ChatColor.GOLD + pt.toString()).equalsIgnoreCase(name) || (pt.toString().toLowerCase( + Locale.ROOT).equalsIgnoreCase(name))) return pt; if(name.equalsIgnoreCase("der wunderfizz") || name.equalsIgnoreCase("wunderfizz") || name.equalsIgnoreCase("random")) return DER_WUNDERFIZZ; @@ -147,12 +148,11 @@ public ItemStack getPerkItem(PerkType type) public static PerkType getRandomPerk(List exclude) { - List availablePerks = Arrays.stream(PerkType.values()).filter(pt -> !exclude.contains(pt) && pt != PerkType.DER_WUNDERFIZZ).collect(Collectors.toList()); + List availablePerks = Arrays.stream(PerkType.values()).filter(pt -> !exclude.contains(pt) && pt != PerkType.DER_WUNDERFIZZ).toList(); if(availablePerks.isEmpty()) return null; - //get random perk from list of available perks - int rand = (int) (Math.random() * availablePerks.size()); - return availablePerks.get(rand); + // get random perk from list of available perks + return availablePerks.get(COMZombies.rand.nextInt(availablePerks.size())); } } \ No newline at end of file diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/BarrierManager.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/BarrierManager.java index ee9e5e7..abecb1c 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/BarrierManager.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/BarrierManager.java @@ -3,7 +3,6 @@ import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import com.theprogrammingturkey.comz.COMZombies; import com.theprogrammingturkey.comz.config.CustomConfig; import com.theprogrammingturkey.comz.game.Game; import com.theprogrammingturkey.comz.game.GameManager; @@ -11,6 +10,7 @@ import com.theprogrammingturkey.comz.spawning.SpawnPoint; import com.theprogrammingturkey.comz.util.BlockUtils; import com.theprogrammingturkey.comz.util.Util; +import java.util.Collections; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; @@ -21,9 +21,8 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; -import java.util.logging.Level; -import java.util.stream.Collectors; import java.util.stream.StreamSupport; +import org.jetbrains.annotations.UnmodifiableView; public class BarrierManager { @@ -48,29 +47,24 @@ public void loadAllBarriersToGame(JsonArray barriersJson) String barrierID = CustomConfig.getString(barrierJson, "id", "MISSING"); Barrier barrier = new Barrier(barrierID, game); - barrier.setRepairLoc(CustomConfig.getLocationAddWorld(barrierJson, "repair_loc", game.getWorld())); + barrier.setRepairLoc(CustomConfig.getLocationWithWorld(barrierJson, "repair_loc", game.getWorld())); barrier.setSignFacing(BlockFace.valueOf(CustomConfig.getString(barrierJson, "repair_facing", "NORTH"))); JsonArray barrierBlocks = barrierJson.get("blocks").getAsJsonArray(); - for(JsonElement blockElem : barrierBlocks) - { - if(!blockElem.isJsonObject()) - continue; - JsonObject blockJson = blockElem.getAsJsonObject(); - - Location loc = CustomConfig.getLocationAddWorld(blockJson, "", game.getWorld()); - if(loc != null) - { - Material mat = BlockUtils.getMaterialFromKey(CustomConfig.getString(blockJson, "material", "")); - barrier.addBarrierBlock(game.world.getBlockAt(loc), mat); - } - else - { - COMZombies.log.log(Level.WARNING, COMZombies.CONSOLE_PREFIX + "Failed to load a block location for Barrier: " + barrierID + ", Json: " + barrierJson); - } - } - - barrier.addSpawnPoints(StreamSupport.stream(barrierJson.get("spawns").getAsJsonArray().spliterator(), false).map(sp -> game.spawnManager.getSpawnPoint(sp.getAsString())).filter(Objects::nonNull).collect(Collectors.toList())); + barrierBlocks.asList().stream().filter(JsonElement::isJsonObject) + .map(JsonElement::getAsJsonObject).forEach(blockJson -> { + Location blockLocation = Objects.requireNonNull( + CustomConfig.getLocationWithWorld(blockJson, "", game.getWorld()), + "Failed to load a block location for Barrier: " + barrierID + ", Json: " + barrierJson); + Material blockMaterial = BlockUtils.getMaterialFromKey( + Objects.requireNonNull(CustomConfig.getString(blockJson, "material", null))); + barrier.addBarrierBlock(game.world.getBlockAt(blockLocation), blockMaterial); + }); + + barrier.addSpawnPoints( + StreamSupport.stream(barrierJson.get("spawns").getAsJsonArray().spliterator(), false) + .map(sp -> game.spawnManager.getSpawnPoint(sp.getAsString())).filter(Objects::nonNull) + .toList()); barrier.setReward(CustomConfig.getInt(barrierJson, "reward", 1)); @@ -177,9 +171,9 @@ public void addBarrier(Barrier barrier) } } - public List getBarriers() + public @UnmodifiableView List getBarriers() { - return barriers; + return Collections.unmodifiableList(barriers); } public int getTotalBarriers() diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/BoxManager.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/BoxManager.java index 085bd5c..d55a90a 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/BoxManager.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/BoxManager.java @@ -39,7 +39,7 @@ public void loadAllBoxesToGame(JsonArray mystery_boxes, JsonObject arenaSettings if(!boxElem.isJsonObject()) continue; JsonObject boxJson = boxElem.getAsJsonObject(); - Location loc = CustomConfig.getLocationAddWorld(boxJson, "", game.getWorld()); + Location loc = CustomConfig.getLocationWithWorld(boxJson, "", game.getWorld()); String facing = CustomConfig.getString(boxJson, "facing", ""); int cost = CustomConfig.getInt(boxJson, "cost", 2000); String boxId = CustomConfig.getString(boxJson, "id", "MISSING"); @@ -86,7 +86,7 @@ public RandomBox getBox(Location loc) public RandomBox getRandomBox(RandomBox exclude) { - if(boxes.size() == 0) + if(boxes.isEmpty()) return null; // Just to prevent infinite loop below diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/DoorManager.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/DoorManager.java index bdd2816..1a2141d 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/DoorManager.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/DoorManager.java @@ -7,11 +7,15 @@ import com.theprogrammingturkey.comz.game.Game; import com.theprogrammingturkey.comz.game.features.Door; import com.theprogrammingturkey.comz.spawning.SpawnPoint; +import java.util.Collections; import org.bukkit.Location; import org.bukkit.block.Sign; import java.util.ArrayList; import java.util.List; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.UnmodifiableView; public class DoorManager { @@ -23,14 +27,10 @@ public DoorManager(Game game) this.game = game; } - public Door getDoorFromSign(Location location) - { - for(Door door : doors) - { - for(Sign sign : door.getSigns()) - { - if(sign.getLocation().equals(location)) - { + public @Nullable Door getDoorFromSign(@NotNull Location location) { + for (Door door : doors) { + for (Location sign : door.getSigns()) { + if (sign.equals(location)) { return door; } } @@ -71,9 +71,9 @@ public JsonArray save() return saveJson; } - public List getDoors() + public @UnmodifiableView List getDoors() { - return doors; + return Collections.unmodifiableList(doors); } public boolean canSpawnZombieAtPoint(SpawnPoint point) diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/DownedPlayerManager.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/DownedPlayerManager.java index 498db68..0e6f5a6 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/DownedPlayerManager.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/DownedPlayerManager.java @@ -2,10 +2,12 @@ import com.theprogrammingturkey.comz.game.Game; import com.theprogrammingturkey.comz.game.features.DownedPlayer; +import java.util.Collections; import org.bukkit.entity.Player; import java.util.ArrayList; import java.util.List; +import org.jetbrains.annotations.UnmodifiableView; public class DownedPlayerManager { @@ -73,8 +75,8 @@ public void downedPlayerRevived(DownedPlayer dp) downedPlayers.remove(dp); } - public List getDownedPlayers() + public @UnmodifiableView List getDownedPlayers() { - return downedPlayers; + return Collections.unmodifiableList(downedPlayers); } } diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/PerkManager.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/PerkManager.java index 6dfca52..31af431 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/PerkManager.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/PerkManager.java @@ -5,6 +5,7 @@ import com.theprogrammingturkey.comz.game.features.PerkType; import com.theprogrammingturkey.comz.util.CommandUtil; +import java.util.Collections; import org.bukkit.ChatColor; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -15,6 +16,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import org.jetbrains.annotations.UnmodifiableView; public class PerkManager { @@ -31,9 +33,9 @@ public void removePerkEffect(Player player, PerkType effect) } } - public List getPlayersPerks(Player player) + public @UnmodifiableView List getPlayersPerks(Player player) { - return playersPerks.computeIfAbsent(player, k -> new ArrayList<>()); + return Collections.unmodifiableList(playersPerks.computeIfAbsent(player, k -> new ArrayList<>())); } public boolean hasPerk(Player player, PerkType type) @@ -43,7 +45,7 @@ public boolean hasPerk(Player player, PerkType type) public boolean addPerk(Player player, PerkType type) { - List playerPerks = getPlayersPerks(player); + List playerPerks = playersPerks.computeIfAbsent(player, k -> new ArrayList<>()); if(playerPerks.contains(type)) { diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/PlayerWeaponManager.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/PlayerWeaponManager.java index 043b532..1cc0c5f 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/PlayerWeaponManager.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/PlayerWeaponManager.java @@ -9,12 +9,14 @@ import com.theprogrammingturkey.comz.game.weapons.WeaponInstance; import com.theprogrammingturkey.comz.game.weapons.WeaponType; +import java.util.Collections; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import java.util.ArrayList; import java.util.List; +import org.jetbrains.annotations.UnmodifiableView; public class PlayerWeaponManager { @@ -29,9 +31,9 @@ public PlayerWeaponManager(Player player) /** * @return List of guns in the manager */ - public List getWeapons() + public @UnmodifiableView List getWeapons() { - return weapons; + return Collections.unmodifiableList(weapons); } /** diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/PowerUpManager.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/PowerUpManager.java index 4811f3e..5086e3f 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/PowerUpManager.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/PowerUpManager.java @@ -6,6 +6,7 @@ import com.theprogrammingturkey.comz.game.Game; import com.theprogrammingturkey.comz.game.GameManager; import com.theprogrammingturkey.comz.game.features.PowerUp; +import java.util.Locale; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.ArmorStand; @@ -37,7 +38,8 @@ public void loadAllPowerUps(JsonObject powerUpSettings) JsonObject powerUpsJson = powerUpSettings.get("powerups").getAsJsonObject(); for(PowerUp powerUp : PowerUp.values()) if(powerUp != PowerUp.NONE) - powerups.put(powerUp, CustomConfig.getBoolean(powerUpsJson, powerUp.name().toLowerCase(), true)); + powerups.put(powerUp, CustomConfig.getBoolean(powerUpsJson, powerUp.name().toLowerCase( + Locale.ROOT), true)); } public JsonObject save() @@ -48,7 +50,7 @@ public JsonObject save() JsonObject powerUpsJson = new JsonObject(); for(PowerUp powerUp : PowerUp.values()) if(powerUp != PowerUp.NONE) - powerUpsJson.addProperty(powerUp.name().toLowerCase(), powerups.get(powerUp)); + powerUpsJson.addProperty(powerUp.name().toLowerCase(Locale.ROOT), powerups.get(powerUp)); saveJson.add("powerups", powerUpsJson); @@ -110,17 +112,15 @@ public void powerUpDrop(Entity mob, Entity entPlayer) if(game == null || game.getMode() != Game.ArenaStatus.INGAME) return; - int chance = (int) (Math.random() * 100); - if(chance <= dropChance) + int chance = COMZombies.rand.nextInt(100); + if(chance < dropChance) { - List availableRewards = powerups.keySet().stream().filter(powerups::get).collect(Collectors.toList()); + List availableRewards = powerups.keySet().stream().filter(powerups::get) + .filter(powerUp -> !(powerUp == PowerUp.FIRE_SALE && game.boxManager.isMultiBox())) + .toList(); if(availableRewards.isEmpty()) return; - if(availableRewards.contains(PowerUp.FIRE_SALE)) - if(game.boxManager.isMultiBox()) - availableRewards.remove(PowerUp.FIRE_SALE); - this.dropPowerUp(mob, availableRewards.get(COMZombies.rand.nextInt(availableRewards.size()))); } } diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/SignManager.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/SignManager.java index 1337680..5e02e25 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/SignManager.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/SignManager.java @@ -4,26 +4,27 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.theprogrammingturkey.comz.COMZombies; +import com.theprogrammingturkey.comz.config.COMZConfig; import com.theprogrammingturkey.comz.config.ConfigManager; import com.theprogrammingturkey.comz.config.CustomConfig; import com.theprogrammingturkey.comz.game.Game; -import com.theprogrammingturkey.comz.config.COMZConfig; +import com.theprogrammingturkey.comz.game.Game.ArenaStatus; +import java.util.HashSet; +import java.util.logging.Level; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.block.Block; import org.bukkit.block.Sign; - -import java.util.ArrayList; -import java.util.List; -import java.util.logging.Level; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public class SignManager { - public List gameSigns = new ArrayList<>(); + private final HashSet<@NotNull Location> gameSigns = new HashSet<>(); - private final Game game; + private final @NotNull Game game; - public SignManager(Game game) + public SignManager(@NotNull Game game) { this.game = game; @@ -38,7 +39,7 @@ public SignManager(Game game) load(jsonObject.getAsJsonArray(game.getName())); } - private void load(JsonArray signsJson) + private void load(@NotNull JsonArray signsJson) { for(JsonElement signElem : signsJson) { @@ -49,17 +50,16 @@ private void load(JsonArray signsJson) if(loc == null) { - COMZombies.log.log(Level.SEVERE, COMZombies.CONSOLE_PREFIX + "Could not load the sign with json: " + signJson.toString()); + COMZombies.log.log(Level.SEVERE, COMZombies.CONSOLE_PREFIX + "Could not load the sign with json: " + signJson); continue; } Block block = loc.getBlock(); if(block.getState() instanceof Sign) { - Sign sB = (Sign) block.getState(); - gameSigns.add(sB); + gameSigns.add(loc); } } - enable(); + updateGame(); } private void save() @@ -83,70 +83,63 @@ private void save() jsonObject.add(game.getName(), signsArray); } - for(Sign sign : gameSigns) - signsArray.add(CustomConfig.locationToJson(sign.getLocation())); + gameSigns.forEach(sign -> signsArray.add(CustomConfig.locationToJson(sign))); config.saveConfig(jsonObject); } public void updateGame() { - COMZombies.scheduleTask(20, () -> - { - for(Sign s : gameSigns) - { - if(game.getMode().equals(Game.ArenaStatus.DISABLED)) - { - s.setLine(0, ChatColor.DARK_RED + "[maintenance]".toUpperCase()); - s.setLine(1, game.getName()); - s.setLine(2, "Game will be"); - s.setLine(3, "available soon!"); + final ArenaStatus gameMode = game.getMode(); + for (final Location location : gameSigns) { + final Sign sign = (Sign) location.getBlock().getState(); + switch (gameMode) { + case DISABLED -> { + sign.setLine(0, ChatColor.DARK_RED + "[MAINTENANCE]"); + sign.setLine(1, game.getName()); + sign.setLine(2, "Game will be"); + sign.setLine(3, "available soon!"); } - else if(game.getMode().equals(Game.ArenaStatus.WAITING) || game.getMode().equals(Game.ArenaStatus.STARTING)) - { - s.setLine(0, ChatColor.RED + "[Zombies]"); - s.setLine(1, ChatColor.AQUA + "Join"); - s.setLine(2, game.getName()); - s.setLine(3, ChatColor.GREEN + "Players: " + game.getPlayersInGame().size() + "/" + game.maxPlayers); + case WAITING, STARTING -> { + sign.setLine(0, ChatColor.RED + "[Zombies]"); + sign.setLine(1, ChatColor.AQUA + "Join"); + sign.setLine(2, game.getName()); + sign.setLine(3, ChatColor.GREEN + "Players: " + game.getPlayersInGame().size() + "/" + + game.maxPlayers); } - else if(game.getMode().equals(Game.ArenaStatus.INGAME)) - { - s.setLine(0, ChatColor.GREEN + game.getName()); - s.setLine(1, ChatColor.RED + "InProgress"); - s.setLine(2, ChatColor.RED + "Wave: " + game.getWave()); - s.setLine(3, ChatColor.DARK_RED + "Alive: " + game.getPlayersInGame().size()); + case INGAME -> { + sign.setLine(0, ChatColor.GREEN + game.getName()); + sign.setLine(1, ChatColor.RED + "InProgress"); + sign.setLine(2, ChatColor.RED + "Wave: " + game.getWave()); + sign.setLine(3, ChatColor.DARK_RED + "Alive: " + game.getPlayersInGame().size()); } - s.update(); } - }); - } - - public void enable() - { - updateGame(); + sign.update(); + } } - public void addSign(Sign sign) + public void addSign(@NotNull Location sign) { gameSigns.add(sign); save(); } - public void removeSign(Sign sign) + public void removeSign(@NotNull Location sign) { gameSigns.remove(sign); save(); } - public boolean isSign(Sign sign) + public boolean isGameSign(@Nullable Location sign) { return gameSigns.contains(sign); } public void removeAllSigns() { - for(Sign sign : gameSigns) + for(Location location : gameSigns) { + Sign sign = (Sign) location.getBlock().getState(); sign.setLine(0, ""); sign.setLine(1, ""); sign.setLine(2, ""); diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/TeleporterManager.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/TeleporterManager.java index c3a6c60..b94d3f5 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/TeleporterManager.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/TeleporterManager.java @@ -6,6 +6,7 @@ import com.theprogrammingturkey.comz.config.CustomConfig; import com.theprogrammingturkey.comz.game.Game; import com.theprogrammingturkey.comz.game.GameManager; +import java.util.Locale; import org.bukkit.Location; import org.bukkit.entity.Player; @@ -31,7 +32,7 @@ public void loadAllTeleportersToGame(JsonArray teleporters) continue; JsonObject teleporterJson = teleporterElem.getAsJsonObject(); - Location loc = CustomConfig.getLocationAddWorld(teleporterJson, "", game.getWorld()); + Location loc = CustomConfig.getLocationWithWorld(teleporterJson, "", game.getWorld()); String teleporterID = CustomConfig.getString(teleporterJson, "id", "missing"); this.teleporters.put(teleporterID, loc); } @@ -52,14 +53,14 @@ public JsonArray save() public void saveTeleporterSpot(String teleName, Location to) { - teleName = teleName.toLowerCase(); + teleName = teleName.toLowerCase(Locale.ROOT); teleporters.put(teleName, to); GameManager.INSTANCE.saveAllGames(); } public void removedTeleporter(String teleName, Player player) { - teleName = teleName.toLowerCase(); + teleName = teleName.toLowerCase(Locale.ROOT); if(teleporters.containsKey(teleName)) { teleporters.remove(teleName); diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/WeaponManager.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/WeaponManager.java index 7219913..13f0791 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/WeaponManager.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/managers/WeaponManager.java @@ -63,15 +63,15 @@ public static Weapon getRandomWeapon(boolean includePackaPunch, PlayerWeaponMana if(weapon instanceof BaseGun && playerWeaponManager.hasGun((BaseGun) weapon)) return false; return includePackaPunch || !(weapon instanceof PackAPunchGun); - }).collect(Collectors.toList()); + }).toList(); return weaponsToChoose.get(COMZombies.rand.nextInt(weaponsToChoose.size())); } public static void listGuns(Player player) { - List guns = weapons.stream().filter(weapon -> weapon instanceof BaseGun).map(weapon -> (BaseGun) weapon).collect(Collectors.toList()); + List guns = weapons.stream().filter(weapon -> weapon instanceof BaseGun).map(weapon -> (BaseGun) weapon).toList(); CommandUtil.sendMessageToPlayer(player, ChatColor.RED + "---------" + ChatColor.GOLD + "Guns" + ChatColor.RED + "----------"); - if(guns.size() == 0) + if(guns.isEmpty()) CommandUtil.sendMessageToPlayer(player, ChatColor.RED + "You have no guns! Make sure COM: Z can read from your " + ChatColor.GOLD + "guns.json"); WeaponType gunClass = guns.get(0).getWeaponType(); diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/AmmoCrateSign.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/AmmoCrateSign.java index ef32b76..460f321 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/AmmoCrateSign.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/AmmoCrateSign.java @@ -6,6 +6,7 @@ import com.theprogrammingturkey.comz.game.weapons.GunInstance; import com.theprogrammingturkey.comz.util.CommandUtil; import org.bukkit.ChatColor; +import org.bukkit.block.Block; import org.bukkit.block.Sign; import org.bukkit.entity.Player; import org.bukkit.event.block.SignChangeEvent; @@ -13,15 +14,15 @@ public class AmmoCrateSign implements IGameSign { @Override - public void onBreak(Game game, Player player, Sign sign) + public void onBreak(Game game, Player player, Block signBlock) { } @Override - public void onInteract(Game game, Player player, Sign sign) + public void onInteract(Game game, Player player, Block signBlock) { - int buyPoints = Integer.parseInt(sign.getLine(2).trim()); + int buyPoints = Integer.parseInt(((Sign) signBlock.getState()).getLine(2).trim()); PlayerWeaponManager manager = game.getPlayersWeapons(player); if(manager.isHeldItemWeapon()) diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/DoorSign.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/DoorSign.java index 835fb41..7c2fd11 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/DoorSign.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/DoorSign.java @@ -5,6 +5,7 @@ import com.theprogrammingturkey.comz.game.Game; import com.theprogrammingturkey.comz.util.CommandUtil; import org.bukkit.ChatColor; +import org.bukkit.block.Block; import org.bukkit.block.Sign; import org.bukkit.entity.Player; import org.bukkit.event.block.SignChangeEvent; @@ -12,14 +13,14 @@ public class DoorSign implements IGameSign { @Override - public void onBreak(Game game, Player player, Sign sign) + public void onBreak(Game game, Player player, Block signBlock) { } @Override - public void onInteract(Game game, Player player, Sign sign) + public void onInteract(Game game, Player player, Block signBlock) { - Door door = game.doorManager.getDoorFromSign(sign.getLocation()); + Door door = game.doorManager.getDoorFromSign(signBlock.getLocation()); if(door == null) { CommandUtil.sendMessageToPlayer(player, ChatColor.RED + "An error occured when trying to open this door! Leave the game an contact an admin please."); @@ -28,7 +29,7 @@ else if(door.isOpened()) { CommandUtil.sendMessageToPlayer(player, ChatColor.RED + "This door is already open!"); } - else if(PointManager.INSTANCE.getPlayerPoints(player).getPoints() < door.getCost()) + else if(!door.canOpen(PointManager.INSTANCE.getPlayerPoints(player).getPoints())) { CommandUtil.sendMessageToPlayer(player, ChatColor.RED + "You don't have enough points!"); } diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/GrenadeSign.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/GrenadeSign.java index 8907143..73d8d80 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/GrenadeSign.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/GrenadeSign.java @@ -1,15 +1,13 @@ package com.theprogrammingturkey.comz.game.signs; -import com.theprogrammingturkey.comz.COMZombies; import com.theprogrammingturkey.comz.economy.PointManager; import com.theprogrammingturkey.comz.game.Game; import com.theprogrammingturkey.comz.game.managers.PlayerWeaponManager; import com.theprogrammingturkey.comz.game.managers.WeaponManager; -import com.theprogrammingturkey.comz.game.weapons.BaseGun; import com.theprogrammingturkey.comz.game.weapons.Weapon; import com.theprogrammingturkey.comz.util.CommandUtil; import org.bukkit.ChatColor; -import org.bukkit.Sound; +import org.bukkit.block.Block; import org.bukkit.block.Sign; import org.bukkit.entity.Player; import org.bukkit.event.block.SignChangeEvent; @@ -17,40 +15,33 @@ public class GrenadeSign implements IGameSign { @Override - public void onBreak(Game game, Player player, Sign sign) + public void onBreak(Game game, Player player, Block signBlock) { } @Override - public void onInteract(Game game, Player player, Sign sign) - { - String line2 = sign.getLine(2); + public void onInteract(Game game, Player player, Block signBlock) { + String line2 = ((Sign) signBlock.getState()).getLine(2); int buyPoints = Integer.parseInt(line2); Weapon w = WeaponManager.getWeapon("grenade"); PlayerWeaponManager manager = game.getPlayersWeapons(player); - - - if(PointManager.INSTANCE.canBuy(player, buyPoints)) - { - if(manager.hasFullGrenades()) - { - CommandUtil.sendMessageToPlayer(player, ChatColor.RED + "" + ChatColor.BOLD + "You already have grenades!"); - return; - } else { - manager.addWeapon(w); - CommandUtil.sendMessageToPlayer(player, ChatColor.RED + "" + ChatColor.BOLD + "Bought grenades!"); - PointManager.INSTANCE.takePoints(player, buyPoints); - PointManager.INSTANCE.notifyPlayer(player); - } - } - else - { - CommandUtil.sendMessageToPlayer(player, ChatColor.RED + "You don't have enough points!"); - } - + if (PointManager.INSTANCE.canBuy(player, buyPoints)) { + if (manager.hasFullGrenades()) { + CommandUtil.sendMessageToPlayer(player, + ChatColor.RED + "" + ChatColor.BOLD + "You already have grenades!"); + } else { + manager.addWeapon(w); + CommandUtil.sendMessageToPlayer(player, + ChatColor.RED + "" + ChatColor.BOLD + "Bought grenades!"); + PointManager.INSTANCE.takePoints(player, buyPoints); + PointManager.INSTANCE.notifyPlayer(player); + } + } else { + CommandUtil.sendMessageToPlayer(player, ChatColor.RED + "You don't have enough points!"); + } } @Override @@ -61,11 +52,12 @@ public void onChange(Game game, Player player, SignChangeEvent event) event.setLine(0, ChatColor.RED + "[Zombies]"); event.setLine(1, ChatColor.AQUA + "Grenade"); - String price = thirdLine; - if(thirdLine == null || !thirdLine.matches("[0-9]+")) - price = "250"; - else - price = thirdLine; + String price; + if (thirdLine == null || !thirdLine.matches("[0-9]+")) { + price = "250"; + } else { + price = thirdLine; + } event.setLine(2, price); } diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/GunSign.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/GunSign.java index bb4feef..cb2a9b4 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/GunSign.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/GunSign.java @@ -9,6 +9,7 @@ import com.theprogrammingturkey.comz.util.CommandUtil; import org.bukkit.ChatColor; import org.bukkit.Sound; +import org.bukkit.block.Block; import org.bukkit.block.Sign; import org.bukkit.entity.Player; import org.bukkit.event.block.SignChangeEvent; @@ -16,14 +17,15 @@ public class GunSign implements IGameSign { @Override - public void onBreak(Game game, Player player, Sign sign) + public void onBreak(Game game, Player player, Block signBlock) { } @Override - public void onInteract(Game game, Player player, Sign sign) + public void onInteract(Game game, Player player, Block signBlock) { + final Sign sign = (Sign) signBlock.getState(); String line3 = sign.getLine(3); int buyPoints = Integer.parseInt(line3.substring(0, line3.indexOf("/") - 1).trim()); int refillPoints = Integer.parseInt(line3.substring(line3.indexOf("/") + 2).trim()); diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/IGameSign.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/IGameSign.java index 87dc114..ccb30a4 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/IGameSign.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/IGameSign.java @@ -1,15 +1,15 @@ package com.theprogrammingturkey.comz.game.signs; import com.theprogrammingturkey.comz.game.Game; -import org.bukkit.block.Sign; +import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.event.block.SignChangeEvent; public interface IGameSign { - void onBreak(Game game, Player player, Sign sign); + void onBreak(Game game, Player player, Block signBlock); - void onInteract(Game game, Player player, Sign sign); + void onInteract(Game game, Player player, Block signBlock); void onChange(Game game, Player player, SignChangeEvent event); diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/JoinSign.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/JoinSign.java index 8dfdfc9..6635e01 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/JoinSign.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/JoinSign.java @@ -4,8 +4,10 @@ import com.theprogrammingturkey.comz.game.Game; import com.theprogrammingturkey.comz.game.GameManager; import com.theprogrammingturkey.comz.util.CommandUtil; +import java.util.Objects; import org.bukkit.ChatColor; import org.bukkit.Sound; +import org.bukkit.block.Block; import org.bukkit.block.Sign; import org.bukkit.entity.Player; import org.bukkit.event.block.SignChangeEvent; @@ -13,26 +15,26 @@ public class JoinSign implements IGameSign { @Override - public void onBreak(Game game, Player player, Sign sign) + public void onBreak(Game game, Player player, Block signBlock) { - game.signManager.removeSign(sign); + game.signManager.removeSign(signBlock.getLocation()); } @Override - public void onInteract(Game game, Player player, Sign sign) + public void onInteract(Game game, Player player, Block signBlock) { + final Sign sign = (Sign) signBlock.getState(); game = GameManager.INSTANCE.getGame(sign.getLine(2)); if(game != null) { - if(!game.signManager.isSign(sign)) - game.signManager.addSign(sign); + if(!game.signManager.isGameSign(sign.getLocation())) + game.signManager.addSign(sign.getLocation()); String[] args = new String[2]; args[0] = "join"; args[1] = game.getName(); player.getLocation().getWorld().playSound(player.getLocation(), Sound.ENTITY_ZOMBIE_AMBIENT, 1, 1); CommandManager.INSTANCE.onRemoteCommand(player, args); - game.signManager.updateGame(); } else { @@ -53,8 +55,8 @@ public void onChange(Game game, Player player, SignChangeEvent event) event.setLine(3, ""); return; } - game = GameManager.INSTANCE.getGame(thirdLine); - game.signManager.addSign((Sign) event.getBlock().getState()); + game = Objects.requireNonNull(GameManager.INSTANCE.getGame(thirdLine)); + game.signManager.addSign(event.getBlock().getLocation()); } @Override diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/KitSign.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/KitSign.java index 840a1d9..0df9ffc 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/KitSign.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/KitSign.java @@ -6,6 +6,7 @@ import com.theprogrammingturkey.comz.util.COMZPermission; import com.theprogrammingturkey.comz.util.CommandUtil; import org.bukkit.ChatColor; +import org.bukkit.block.Block; import org.bukkit.block.Sign; import org.bukkit.entity.Player; import org.bukkit.event.block.SignChangeEvent; @@ -13,15 +14,15 @@ public class KitSign implements IGameSign { @Override - public void onBreak(Game game, Player player, Sign sign) + public void onBreak(Game game, Player player, Block signBlock) { } @Override - public void onInteract(Game game, Player player, Sign sign) + public void onInteract(Game game, Player player, Block signBlock) { - Kit kit = KitManager.getKit(ChatColor.stripColor(sign.getLine(2))); + Kit kit = KitManager.getKit(ChatColor.stripColor(((Sign) signBlock.getState()).getLine(2))); if(COMZPermission.KIT.hasPerm(player, kit.getName())) { KitManager.addPlayersSelectedKit(player, kit); diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/MysteryBoxSign.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/MysteryBoxSign.java index 0ebc46b..9deddde 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/MysteryBoxSign.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/MysteryBoxSign.java @@ -6,6 +6,7 @@ import com.theprogrammingturkey.comz.game.features.RandomBox; import org.bukkit.ChatColor; import org.bukkit.Sound; +import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.Sign; import org.bukkit.block.data.Directional; @@ -14,23 +15,23 @@ public class MysteryBoxSign implements IGameSign { - public void onBreak(Game game, Player player, Sign sign) + public void onBreak(Game game, Player player, Block signBlock) { - RandomBox box = game.boxManager.getBox(sign.getLocation()); + RandomBox box = game.boxManager.getBox(signBlock.getLocation()); if(box != null) game.boxManager.removeBox(player, box); } @Override - public void onInteract(Game game, Player player, Sign sign) + public void onInteract(Game game, Player player, Block signBlock) { - RandomBox box = game.boxManager.getBox(sign.getLocation()); + RandomBox box = game.boxManager.getBox(signBlock.getLocation()); if(box == null) return; if(box.canActivate()) { - int points = Integer.parseInt(sign.getLine(2)); + int points = Integer.parseInt(((Sign) signBlock.getState()).getLine(2)); if(game.isFireSale()) points = 10; diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/PackAPunchSign.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/PackAPunchSign.java index c93c4c7..047c8f0 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/PackAPunchSign.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/PackAPunchSign.java @@ -8,6 +8,7 @@ import com.theprogrammingturkey.comz.util.CommandUtil; import org.bukkit.ChatColor; import org.bukkit.Sound; +import org.bukkit.block.Block; import org.bukkit.block.Sign; import org.bukkit.entity.Player; import org.bukkit.event.block.SignChangeEvent; @@ -15,13 +16,13 @@ public class PackAPunchSign implements IGameSign { @Override - public void onBreak(Game game, Player player, Sign sign) + public void onBreak(Game game, Player player, Block signBlock) { } @Override - public void onInteract(Game game, Player player, Sign sign) + public void onInteract(Game game, Player player, Block signBlock) { if(game.hasPower() && !game.isPowered()) { @@ -39,7 +40,7 @@ public void onInteract(Game game, Player player, Sign sign) GunInstance gun = manager.getGun(player.getInventory().getHeldItemSlot()); - int cost = Integer.parseInt(sign.getLine(2)); + int cost = Integer.parseInt(((Sign) signBlock.getState()).getLine(2)); if(PointManager.INSTANCE.canBuy(player, cost)) { if(gun.isPackOfPunched()) diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/PerkMachineSign.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/PerkMachineSign.java index 391c838..ff7e4c7 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/PerkMachineSign.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/PerkMachineSign.java @@ -5,8 +5,10 @@ import com.theprogrammingturkey.comz.game.features.PerkType; import com.theprogrammingturkey.comz.util.CommandUtil; import com.theprogrammingturkey.comz.listeners.customEvents.PlayerPerkPurchaseEvent; +import java.util.Locale; import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.block.Block; import org.bukkit.block.Sign; import org.bukkit.entity.Player; import org.bukkit.event.block.SignChangeEvent; @@ -16,14 +18,15 @@ public class PerkMachineSign implements IGameSign { @Override - public void onBreak(Game game, Player player, Sign sign) + public void onBreak(Game game, Player player, Block signBlock) { } @Override - public void onInteract(Game game, Player player, Sign sign) + public void onInteract(Game game, Player player, Block signBlock) { + final Sign sign = (Sign) signBlock.getState(); String perkName = sign.getLine(2); PerkType perk = PerkType.getPerkType(perkName); if(game.hasPower() && !game.isPowered()) @@ -73,7 +76,7 @@ public void onInteract(Game game, Player player, Sign sign) return; Bukkit.getPluginManager().callEvent(new PlayerPerkPurchaseEvent(player, perk)); - CommandUtil.sendMessageToPlayer(player, ChatColor.RED + "" + ChatColor.BOLD + "You now have " + perk.toString().toLowerCase() + "!"); + CommandUtil.sendMessageToPlayer(player, ChatColor.RED + "" + ChatColor.BOLD + "You now have " + perk.toString().toLowerCase(Locale.ROOT) + "!"); int slot = game.perkManager.getAvailablePerkSlot(player); perk.initialEffect(player, perk, slot); if(perk.equals(PerkType.STAMIN_UP)) @@ -112,7 +115,7 @@ public void onChange(Game game, Player player, SignChangeEvent sign) sign.setLine(0, ChatColor.RED + "[Zombies]"); sign.setLine(1, ChatColor.AQUA + "Perk Machine"); - sign.setLine(2, type.toString().toLowerCase()); + sign.setLine(2, type.toString().toLowerCase(Locale.ROOT)); sign.setLine(3, Integer.toString(cost)); } } diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/PowerSign.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/PowerSign.java index 7de458d..db3f877 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/PowerSign.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/PowerSign.java @@ -3,20 +3,20 @@ import com.theprogrammingturkey.comz.game.Game; import com.theprogrammingturkey.comz.util.CommandUtil; import org.bukkit.ChatColor; -import org.bukkit.block.Sign; +import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.event.block.SignChangeEvent; public class PowerSign implements IGameSign { @Override - public void onBreak(Game game, Player player, Sign sign) + public void onBreak(Game game, Player player, Block signBlock) { } @Override - public void onInteract(Game game, Player player, Sign sign) + public void onInteract(Game game, Player player, Block signBlock) { if(game.hasPower()) { diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/SpectateSign.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/SpectateSign.java index 959bdbf..09f4e2c 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/SpectateSign.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/SpectateSign.java @@ -4,6 +4,7 @@ import com.theprogrammingturkey.comz.game.GameManager; import com.theprogrammingturkey.comz.util.CommandUtil; import org.bukkit.ChatColor; +import org.bukkit.block.Block; import org.bukkit.block.Sign; import org.bukkit.entity.Player; import org.bukkit.event.block.SignChangeEvent; @@ -11,15 +12,15 @@ public class SpectateSign implements IGameSign { @Override - public void onBreak(Game game, Player player, Sign sign) + public void onBreak(Game game, Player player, Block signBlock) { } @Override - public void onInteract(Game game, Player player, Sign sign) + public void onInteract(Game game, Player player, Block signBlock) { - game = GameManager.INSTANCE.getGame(sign.getLine(3)); + game = GameManager.INSTANCE.getGame(((Sign) signBlock.getState()).getLine(3)); if(game == null) { CommandUtil.sendMessageToPlayer(player, ChatColor.DARK_RED + "Invalid Arena!"); diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/TeleporterSign.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/TeleporterSign.java index 6edf154..e3bafdb 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/TeleporterSign.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/signs/TeleporterSign.java @@ -7,8 +7,10 @@ import com.theprogrammingturkey.comz.game.GameManager; import com.theprogrammingturkey.comz.game.features.PerkType; import com.theprogrammingturkey.comz.util.CommandUtil; +import java.util.Locale; import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.block.Block; import org.bukkit.block.Sign; import org.bukkit.entity.Player; import org.bukkit.event.block.SignChangeEvent; @@ -18,17 +20,18 @@ public class TeleporterSign implements IGameSign { @Override - public void onBreak(Game game, Player player, Sign sign) + public void onBreak(Game game, Player player, Block signBlock) { } @Override - public void onInteract(Game game, Player player, Sign sign) + public void onInteract(Game game, Player player, Block signBlock) { + final Sign sign = (Sign) signBlock.getState(); if(GameManager.INSTANCE.isPlayerInGame(player)) { - String teleporterName = sign.getLine(2).toLowerCase(); + String teleporterName = sign.getLine(2).toLowerCase(Locale.ROOT); if(game.teleporterManager.getTeleporters().containsKey(teleporterName)) { if(game.hasPower() && !game.isPowered()) @@ -45,8 +48,11 @@ public void onInteract(Game game, Player player, Sign sign) player.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, 30, 30)); for(int i = 0; i < 50; i++) - for(Player pl : Bukkit.getOnlinePlayers()) - COMZombies.nmsUtil.sendParticleToPlayer(NMSParticleType.WITCH, pl, player.getLocation(), (float) (Math.random()), (float) (Math.random()), (float) (Math.random()), 1, 1); + for (Player pl : Bukkit.getOnlinePlayers()) { + COMZombies.nmsUtil.sendParticleToPlayer(NMSParticleType.WITCH, pl, + player.getLocation(), COMZombies.rand.nextFloat(), COMZombies.rand.nextFloat(), + COMZombies.rand.nextFloat(), 1, 1); + } PointManager.INSTANCE.takePoints(player, points); PointManager.INSTANCE.notifyPlayer(player); @@ -70,7 +76,7 @@ public void onChange(Game game, Player player, SignChangeEvent sign) if(game.teleporterManager.getTeleporters().containsKey(thirdLine)) { String line3 = sign.getLine(3); - if(line3 == null || line3.equals("")) + if(line3 == null || line3.isEmpty()) { sign.setLine(0, ChatColor.RED + "[Zombies]"); sign.setLine(1, ChatColor.AQUA + "Teleporter"); diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/weapons/GunInstance.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/weapons/GunInstance.java index e3cadfe..60ee9a6 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/weapons/GunInstance.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/weapons/GunInstance.java @@ -6,6 +6,7 @@ import com.theprogrammingturkey.comz.config.ConfigManager; import com.theprogrammingturkey.comz.game.Game; import com.theprogrammingturkey.comz.game.GameManager; +import java.util.Objects; import org.bukkit.ChatColor; import org.bukkit.Sound; import org.bukkit.World; @@ -103,8 +104,7 @@ public boolean isReloading() } /** - * Used to reload this current weapon. If the player contained in this gun - * has speed cola, reload times speed up. + * Used to reload this current weapon. */ public void reload() { @@ -117,10 +117,7 @@ public void reload() isReloading = true; Game game = GameManager.INSTANCE.getGame(player); - final int reloadTime; - if(game.perkManager.hasPerk(player, PerkType.SPEED_COLA)) - reloadTime = (ConfigManager.getMainConfig().reloadTime) / 2; - else reloadTime = ConfigManager.getMainConfig().reloadTime; + final int reloadTime = ConfigManager.getMainConfig().reloadTime; COMZombies.scheduleTask(reloadTime * 20L, () -> { @@ -184,7 +181,8 @@ public BaseGun getType() /** * Called when the gun was shot, decrements total ammo count and reloads if - * the bullet shot was the last in the clip. + * the bullet shot was the last in the clip. If the player contained in this gun + * has speed cola, fire delay speeds up. */ public boolean wasShot() { @@ -213,13 +211,17 @@ public boolean wasShot() updateWeapon(); canFire = false; - COMZombies.scheduleTask(this.gun.fireDelay, () -> canFire = true); + Game game = Objects.requireNonNull(GameManager.INSTANCE.getGame(player)); + + COMZombies.scheduleTask( + game.perkManager.hasPerk(player, PerkType.SPEED_COLA) ? (long) (this.gun.fireDelay / 1.25) + : this.gun.fireDelay, () -> canFire = true); return true; } public double getAdjust() { - return (Math.random() - 0.5) * 1.5; + return COMZombies.rand.nextDouble(1.5) - 0.75; } /** diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/game/weapons/WeaponType.java b/Core/src/main/java/com/theprogrammingturkey/comz/game/weapons/WeaponType.java index 299276c..a3bdcae 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/game/weapons/WeaponType.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/game/weapons/WeaponType.java @@ -29,7 +29,7 @@ public Material getMaterial() public static WeaponType getWeapon(String name) { for(WeaponType type : values()) - if(type.toString().toLowerCase().equalsIgnoreCase(name)) + if(type.toString().equalsIgnoreCase(name)) return type; return SPECIAL; } diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/kits/Kit.java b/Core/src/main/java/com/theprogrammingturkey/comz/kits/Kit.java index 6e33535..9817c94 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/kits/Kit.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/kits/Kit.java @@ -146,7 +146,7 @@ public void handOutRoundRewards(int roundEnd, Player player) { for(RoundReward roundReward : roundRewards) { - if(roundReward.getRoundEnd() == roundEnd) + if(roundReward.roundEnd() == roundEnd) { if(!GameManager.INSTANCE.isPlayerInGame(player) && !COMZPermission.KIT.hasPerm(player, name)) return; @@ -156,13 +156,13 @@ public void handOutRoundRewards(int roundEnd, Player player) PlayerWeaponManager manager = game.getPlayersWeapons(player); - for(Weapon weapon : roundReward.getWeapons()) + for(Weapon weapon : roundReward.weapons()) manager.addWeapon(weapon); - for(PerkType perk : roundReward.getPerks()) + for(PerkType perk : roundReward.perks()) PerkManager.givePerk(game, player, perk); - PointManager.INSTANCE.addPoints(player, roundReward.getPoints() - 500); + PointManager.INSTANCE.addPoints(player, roundReward.points() - 500); game.scoreboard.update(); player.updateInventory(); } diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/kits/RoundReward.java b/Core/src/main/java/com/theprogrammingturkey/comz/kits/RoundReward.java index 26e7bbe..f3057d4 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/kits/RoundReward.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/kits/RoundReward.java @@ -4,39 +4,9 @@ import com.theprogrammingturkey.comz.game.weapons.Weapon; import java.util.List; +import org.jetbrains.annotations.UnmodifiableView; -public class RoundReward -{ - private final int roundEnd; - private final int points; - private final List weapons; - private final List perks; +public record RoundReward(int roundEnd, int points, @UnmodifiableView List weapons, + @UnmodifiableView List perks) { - public RoundReward(int roundEnd, int points, List weapons, List perks) - { - this.roundEnd = roundEnd; - this.points = points; - this.weapons = weapons; - this.perks = perks; - } - - public int getRoundEnd() - { - return roundEnd; - } - - public int getPoints() - { - return points; - } - - public List getWeapons() - { - return weapons; - } - - public List getPerks() - { - return perks; - } } diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/leaderboards/PlayerStats.java b/Core/src/main/java/com/theprogrammingturkey/comz/leaderboards/PlayerStats.java index ee8fd5c..b0f243c 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/leaderboards/PlayerStats.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/leaderboards/PlayerStats.java @@ -51,25 +51,16 @@ public String getPlayerDisplay() public int getStat(StatsCategory cat) { - switch(cat) - { - case KILLS: - return kills; - case REVIVES: - return revives; - case DEATHS: - return deaths; - case DOWNS: - return downs; - case GAMES_PLAYED: - return gamesPlayed; - case HIGHEST_ROUND: - return highestRound; - case MOST_POINTS: - return mostPoints; - default: - return 0; - } + return switch (cat) { + case KILLS -> kills; + case REVIVES -> revives; + case DEATHS -> deaths; + case DOWNS -> downs; + case GAMES_PLAYED -> gamesPlayed; + case HIGHEST_ROUND -> highestRound; + case MOST_POINTS -> mostPoints; + default -> 0; + }; } public int getKills() diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/listeners/BarrierRepairListener.java b/Core/src/main/java/com/theprogrammingturkey/comz/listeners/BarrierRepairListener.java new file mode 100644 index 0000000..50eba74 --- /dev/null +++ b/Core/src/main/java/com/theprogrammingturkey/comz/listeners/BarrierRepairListener.java @@ -0,0 +1,99 @@ +package com.theprogrammingturkey.comz.listeners; + +import com.theprogrammingturkey.comz.COMZombies; +import com.theprogrammingturkey.comz.game.Game; +import com.theprogrammingturkey.comz.game.GameManager; +import com.theprogrammingturkey.comz.game.features.Barrier; +import com.theprogrammingturkey.comz.util.BlockUtils; +import com.theprogrammingturkey.comz.util.CommandUtil; +import java.util.HashMap; +import java.util.Objects; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Sound; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Sign; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.player.PlayerToggleSneakEvent; +import org.bukkit.util.BoundingBox; + +public class BarrierRepairListener implements Listener { + + private final HashMap repairTaskIds = new HashMap<>(); + + @EventHandler + public void onPlayerToggleSneak(PlayerToggleSneakEvent event) { + Player player = event.getPlayer(); + if (event.isSneaking()) { + if (repairTaskIds.containsKey(player)) { + return; + } + + Game game = GameManager.INSTANCE.getGame(player); + if (game == null) { + return; + } + for (Barrier barrier : game.barrierManager.getBarriers()) { + BlockFace face = barrier.getSignFacing(); + Location signLocation = barrier.getRepairLoc(); + Location boundLocation1 = signLocation.clone() + .add(face.getModZ(), 2, face.getModX()) // add a vector perpendicular to the sign face + .add(Math.abs(face.getModX()), 0, Math.abs(face.getModZ())); // compensate length of one block on the direction of sign block face + Location boundLocation2 = signLocation.clone() + .subtract(face.getModZ(), 3, face.getModX()); // TODO: incorrect subtract + + if (BoundingBox.of(boundLocation1, boundLocation2).overlaps(player.getBoundingBox())) { + repairTaskIds.put(player, COMZombies.scheduleTask(30, 30, () -> { + if (barrier.getStage() != -1) { + boolean repaired = barrier.repair(player); + + if (repaired) { + Objects.requireNonNull(signLocation.getWorld()) + .playSound(signLocation, Sound.BLOCK_ANVIL_LAND, 1, 4); + } else { + Objects.requireNonNull(signLocation.getWorld()) + .playSound(signLocation, Sound.ENTITY_ZOMBIE_ATTACK_WOODEN_DOOR, 1, 1.5f); + } + } + })); + + break; + } + } + } else { + Integer taskId = repairTaskIds.get(player); + if (taskId != null) { + repairTaskIds.remove(player); + Bukkit.getScheduler().cancelTask(taskId); + } + } + } + + @EventHandler(priority = EventPriority.HIGH) + public void onBlockBreakEvent(BlockBreakEvent event) { + if (BlockUtils.isBarrierRepairSign(event.getBlock())) { + Player player = event.getPlayer(); + if (GameManager.INSTANCE.isPlayerInGame(player)) { + Game game = GameManager.INSTANCE.getGame(player); + Sign sign = (Sign) event.getBlock().getState(); + Barrier b = game.barrierManager.getBarrierFromRepair(sign.getLocation()); + if (b != null) { + boolean repaired = b.repair(player); + if (repaired) { + Objects.requireNonNull(event.getBlock().getWorld()) + .playSound(event.getBlock().getLocation(), Sound.BLOCK_ANVIL_LAND, 1, 4); + } + event.setCancelled(true); + } else { + CommandUtil.sendMessageToPlayer(player, + "Congrats! You broke the plugin! JK its all fixed now."); + BlockUtils.setBlockToAir(event.getBlock()); + } + } + } + } +} diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/listeners/EntityListener.java b/Core/src/main/java/com/theprogrammingturkey/comz/listeners/EntityListener.java index 6cc77e0..1d5d1e6 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/listeners/EntityListener.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/listeners/EntityListener.java @@ -12,6 +12,7 @@ import org.bukkit.entity.Entity; import org.bukkit.entity.Mob; import org.bukkit.entity.Player; +import org.bukkit.entity.Zombie; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; @@ -71,6 +72,10 @@ public void damage(EntityDamageByEntityEvent e) float damage = (float) ConfigManager.getMainConfig().zombieDamage; + if (e.getEntity() instanceof Zombie && ((Zombie) e.getEntity()).isAdult()) { + damage /= 3.5f; + } + if(game.perkManager.getPlayersPerks(player).contains(PerkType.JUGGERNOG)) damage = damage / (float) ConfigManager.getMainConfig().juggernogHealth; diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/listeners/OnPreCommandEvent.java b/Core/src/main/java/com/theprogrammingturkey/comz/listeners/OnPreCommandEvent.java index 1359db0..a3b37d9 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/listeners/OnPreCommandEvent.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/listeners/OnPreCommandEvent.java @@ -1,5 +1,6 @@ package com.theprogrammingturkey.comz.listeners; +import com.theprogrammingturkey.comz.util.COMZPermission; import com.theprogrammingturkey.comz.util.CommandUtil; import com.theprogrammingturkey.comz.game.GameManager; import org.bukkit.ChatColor; @@ -24,7 +25,7 @@ public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) { return; } - if(GameManager.INSTANCE.isPlayerInGame(player)) + if(GameManager.INSTANCE.isPlayerInGame(player) && !COMZPermission.doesPlayerHaveAdminPerms(player)) { CommandUtil.sendMessageToPlayer(player, ChatColor.RED + "" + ChatColor.BOLD + "You are not allowed to use commands in game!"); event.setCancelled(true); diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/listeners/PlayerChatListener.java b/Core/src/main/java/com/theprogrammingturkey/comz/listeners/PlayerChatListener.java index 6281877..f2de665 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/listeners/PlayerChatListener.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/listeners/PlayerChatListener.java @@ -11,47 +11,45 @@ import org.bukkit.event.Listener; import org.bukkit.event.block.SignChangeEvent; import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.jetbrains.annotations.NotNull; -public class PlayerChatListener implements Listener -{ +public class PlayerChatListener implements Listener { - @EventHandler(priority = EventPriority.HIGHEST) - public void onPlayerChat(AsyncPlayerChatEvent playerChat) - { - COMZombies plugin = COMZombies.getPlugin(); - Player player = playerChat.getPlayer(); - String message = playerChat.getMessage().replaceFirst(" ", "").trim(); + @EventHandler(ignoreCancelled = true) + public void onPlayerChat(final @NotNull AsyncPlayerChatEvent playerChat) { + final COMZombies plugin = COMZombies.getPlugin(); + final Player player = playerChat.getPlayer(); + final String message = playerChat.getMessage().replaceFirst(" ", "").trim(); - if(plugin.activeActions.containsKey(player)) - { - BaseAction action = plugin.activeActions.get(player); + if (message.equalsIgnoreCase("cancel")) { + final BaseAction action = plugin.activeActions.remove(player); + if (action != null) { + if (playerChat.isAsynchronous()) { + COMZombies.scheduleTask(action::cancelAction); + } else { + action.cancelAction(); + } + playerChat.setCancelled(true); + } + return; + } - if(message.equalsIgnoreCase("cancel")) - { - COMZombies.scheduleTask(1, () -> - { - plugin.activeActions.remove(player); - action.cancelAction(); - }); - } - else - { - COMZombies.scheduleTask(1, () -> action.onChatMessage(message)); - } - playerChat.setCancelled(true); - } + final BaseAction action = plugin.activeActions.get(player); + if (action != null) { + if (playerChat.isAsynchronous()) { + COMZombies.scheduleTask(() -> action.onChatMessage(message)); + } else { + action.onChatMessage(message); + } + playerChat.setCancelled(true); + } - if(plugin.isEditingASign.containsKey(player)) - { - if(message.equalsIgnoreCase("done")) - { - Sign sign = plugin.isEditingASign.get(player); - plugin.isEditingASign.remove(player); - Bukkit.getServer().getPluginManager().callEvent(new SignChangeEvent(sign.getBlock(), player, sign.getLines())); - CommandUtil.sendMessageToPlayer(player, "You are No longer editing a sign"); - playerChat.setCancelled(true); - sign.update(); - } - } - } + if (message.equalsIgnoreCase("done")) { + final Sign sign = plugin.isEditingASign.remove(player); + if (sign != null) { + CommandUtil.sendMessageToPlayer(player, "You are No longer editing a sign"); + playerChat.setCancelled(true); + } + } + } } diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/listeners/PlayerListener.java b/Core/src/main/java/com/theprogrammingturkey/comz/listeners/PlayerListener.java index ece3a0d..9f0a9db 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/listeners/PlayerListener.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/listeners/PlayerListener.java @@ -11,6 +11,7 @@ import com.theprogrammingturkey.comz.util.CommandUtil; import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.Sound; import org.bukkit.block.Block; @@ -20,43 +21,62 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.FoodLevelChangeEvent; import org.bukkit.event.player.PlayerExpChangeEvent; import org.bukkit.event.player.PlayerInteractAtEntityEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.potion.PotionEffectType; +import org.jetbrains.annotations.NotNull; public class PlayerListener implements Listener { @EventHandler - public void onPlayerJoin(PlayerJoinEvent event) + public static void onPlayerJoin(@NotNull PlayerJoinEvent event) { Player player = event.getPlayer(); - for(Player pl : Bukkit.getOnlinePlayers()) - { - if(GameManager.INSTANCE.isPlayerInGame(pl)) + for (Player pl : Bukkit.getOnlinePlayers()) { + if (pl == player) { + continue; + } + if (GameManager.INSTANCE.isPlayerInGame(pl)) { pl.hidePlayer(COMZombies.getPlugin(), player); - else + } else { pl.showPlayer(COMZombies.getPlugin(), player); + } player.showPlayer(COMZombies.getPlugin(), pl); } - Game game = GameManager.INSTANCE.getGame(player); - if(game == null) + Game playerGame = GameManager.INSTANCE.getGame(player); + if (playerGame == null) { + Game locationGame = GameManager.INSTANCE.getGame(player.getLocation()); + if (locationGame != null) { + player.teleport(locationGame.getPlayerSpawn()); + } return; - if(game.wasDisconnected(player)) - CommandUtil.sendClickableMessageToPlayer(player, ChatColor.RED + "You can reconnect to your last game with /z rejoin or ", "CLICK HERE", "/z rejoin"); + } + + if (!playerGame.getArena().getBoundingBox().contains(player.getBoundingBox())) { + player.teleport(playerGame.getPlayerSpawn()); + } + + if (playerGame.isDisconnectedPlayer(player)) { + CommandUtil.sendClickableMessageToPlayer(player, + ChatColor.RED + "You can reconnect to your last game with /z rejoin or ", "CLICK HERE", + "/z rejoin"); + } } @EventHandler - public void onPlayerLeave(PlayerQuitEvent event) + public static void onPlayerLeave(@NotNull PlayerQuitEvent event) { Player player = event.getPlayer(); if(GameManager.INSTANCE.isPlayerInGame(player)) { Game game = GameManager.INSTANCE.getGame(player); game.removePlayer(player); + game.addDisconnected(player); player.removePotionEffect(PotionEffectType.BLINDNESS); player.removePotionEffect(PotionEffectType.SLOW); } @@ -70,8 +90,8 @@ public void onPlayerLeave(PlayerQuitEvent event) /** * Checks if the player is leaving the arena and takes care of his action. */ - @EventHandler - public void onPlayerMove(PlayerMoveEvent event) + @EventHandler(ignoreCancelled = true) + public static void onPlayerMove(@NotNull PlayerMoveEvent event) { Player player = event.getPlayer(); Game game = GameManager.INSTANCE.getGame(player); @@ -91,8 +111,10 @@ public void onPlayerMove(PlayerMoveEvent event) // Reviving move check Location change = toLoc.clone().subtract(event.getFrom().clone()); - if(game.downedPlayerManager.isDownedPlayer(player) && change.getY() != 0) + if (player.getGameMode() != GameMode.SPECTATOR && game.downedPlayerManager.isDownedPlayer( + player) && change.getY() != 0) { event.setCancelled(true); + } float DEAD_ZONE = 0.001f; @@ -122,12 +144,11 @@ public void onPlayerMove(PlayerMoveEvent event) } @EventHandler - public void OnPlayerVelocityEvent(PlayerMoveEvent event) + public static void OnPlayerVelocityEvent(@NotNull PlayerMoveEvent event) { Player player = event.getPlayer(); if(GameManager.INSTANCE.isPlayerInGame(player)) { - player.setFoodLevel(20); int fallDistance = (int) player.getFallDistance(); if(fallDistance > 2) { @@ -141,9 +162,9 @@ public void OnPlayerVelocityEvent(PlayerMoveEvent event) { for(Player pl : game.getPlayersInGame()) { - float x = (float) (Math.random() * 2); - float y = (float) (Math.random() * 2); - float z = (float) (Math.random() * 2); + float x = COMZombies.rand.nextFloat(2f); + float y = COMZombies.rand.nextFloat(2f); + float z = COMZombies.rand.nextFloat(2f); COMZombies.nmsUtil.sendParticleToPlayer(NMSParticleType.LAVA, pl, player.getLocation(), x, y, z, 1, 1); COMZombies.nmsUtil.sendParticleToPlayer(NMSParticleType.FIREWORK, pl, player.getLocation(), x, y, z, 1, 1); } @@ -159,48 +180,43 @@ public void OnPlayerVelocityEvent(PlayerMoveEvent event) } } - @EventHandler - public void ProjectileHit(EntityDamageEvent event) + @EventHandler(ignoreCancelled = true) + public static void ProjectileHit(@NotNull EntityDamageEvent event) { if(event.getCause() == EntityDamageEvent.DamageCause.BLOCK_EXPLOSION || event.getCause() == EntityDamageEvent.DamageCause.ENTITY_EXPLOSION) { - if(event.getEntity() instanceof Player) + if(event.getEntity() instanceof Player player) { - Player player = (Player) event.getEntity(); - if(GameManager.INSTANCE.isPlayerInGame(player)) + if(GameManager.INSTANCE.isPlayerInGame(player)) event.setCancelled(true); } } else if(event.getCause() == EntityDamageEvent.DamageCause.FALL) { - if(event.getEntity() instanceof Player) + if(event.getEntity() instanceof Player player) { - Player player = (Player) event.getEntity(); - if(GameManager.INSTANCE.isPlayerInGame(player)) - if(GameManager.INSTANCE.getGame(player).perkManager.hasPerk(player, PerkType.PHD_FLOPPER)) + if(GameManager.INSTANCE.isPlayerInGame(player)) event.setCancelled(true); } } } @EventHandler - public void playerExp(PlayerExpChangeEvent event) - { - Player player = event.getPlayer(); - if(GameManager.INSTANCE.isPlayerInGame(player)) - player.setExp(0); + public static void playerExp(@NotNull PlayerExpChangeEvent event) { + if (GameManager.INSTANCE.isPlayerInGame(event.getPlayer())) { + event.setAmount(0); + } } @EventHandler - public void interact(PlayerInteractAtEntityEvent event) + public static void interact(@NotNull PlayerInteractAtEntityEvent event) { - if(!(event.getRightClicked() instanceof Player)) + if(!(event.getRightClicked() instanceof Player clickedPlayer)) return; Player reviver = event.getPlayer(); - Player clickedPlayer = (Player) event.getRightClicked(); - Game game = GameManager.INSTANCE.getGame(reviver); + Game game = GameManager.INSTANCE.getGame(reviver); if(game == null || !game.isPlayerPlaying(clickedPlayer)) return; @@ -233,4 +249,12 @@ public void interact(PlayerInteractAtEntityEvent event) event.setCancelled(true); } } + + @EventHandler(ignoreCancelled = true) + public static void preventFoodLevelChange(@NotNull FoodLevelChangeEvent event) { + if (event.getEntity() instanceof Player && GameManager.INSTANCE.isPlayerInGame( + (Player) event.getEntity())) { + event.setCancelled(true); + } + } } diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/listeners/SignListener.java b/Core/src/main/java/com/theprogrammingturkey/comz/listeners/SignListener.java index cb88517..dd01f47 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/listeners/SignListener.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/listeners/SignListener.java @@ -3,10 +3,11 @@ import com.theprogrammingturkey.comz.COMZombies; import com.theprogrammingturkey.comz.game.Game; import com.theprogrammingturkey.comz.game.GameManager; -import com.theprogrammingturkey.comz.game.features.Barrier; import com.theprogrammingturkey.comz.game.signs.*; import com.theprogrammingturkey.comz.util.BlockUtils; +import com.theprogrammingturkey.comz.util.COMZPermission; import com.theprogrammingturkey.comz.util.CommandUtil; +import java.util.Locale; import org.bukkit.ChatColor; import org.bukkit.block.Sign; import org.bukkit.entity.Player; @@ -20,6 +21,7 @@ import java.util.HashMap; import java.util.Map; +import org.jetbrains.annotations.NotNull; public class SignListener implements Listener { @@ -72,18 +74,12 @@ public class SignListener implements Listener GAME_SIGNS.put("grenade", grenade); } - @EventHandler(priority = EventPriority.HIGHEST) + @EventHandler(priority = EventPriority.HIGH) public void onBlockBreakEvent(BlockBreakEvent event) { - if(!BlockUtils.isSign(event.getBlock().getType())) - return; - - Sign sign = (Sign) event.getBlock().getState(); - - String lineOne = ChatColor.stripColor(sign.getLine(0)); - String lineTwo = ChatColor.stripColor(sign.getLine(1)); - if(lineOne.equalsIgnoreCase("[Zombies]")) + if(BlockUtils.isZombiesSign(event.getBlock())) { + final Sign sign = (Sign) event.getBlock().getState(); Game game = GameManager.INSTANCE.getGame(sign.getLocation()); if(game != null && game.getMode() != Game.ArenaStatus.DISABLED) { @@ -91,60 +87,37 @@ public void onBlockBreakEvent(BlockBreakEvent event) return; } - IGameSign signLogic = GAME_SIGNS.get(lineTwo.toLowerCase()); + String lineTwo = ChatColor.stripColor(sign.getLine(1)); + IGameSign signLogic = GAME_SIGNS.get(lineTwo.toLowerCase(Locale.ROOT)); if(signLogic != null && (game != null || !signLogic.requiresGame())) - signLogic.onBreak(game, event.getPlayer(), sign); - } - else if(lineOne.equalsIgnoreCase("[BarrierRepair]")) - { - Player player = event.getPlayer(); - if(GameManager.INSTANCE.isPlayerInGame(player)) - { - Game game = GameManager.INSTANCE.getGame(player); - Barrier b = game.barrierManager.getBarrierFromRepair(sign.getLocation()); - if(b != null) - { - b.repair(player); - event.setCancelled(true); - sign.update(); - } - else - { - CommandUtil.sendMessageToPlayer(player, "Congrats! You broke the plugin! JK its all fixed now."); - BlockUtils.setBlockToAir(event.getBlock()); - } - } + signLogic.onBreak(game, event.getPlayer(), event.getBlock()); } } @EventHandler - public void RightClickSign(PlayerInteractEvent event) + public void onPlayerInteractWithBlock(@NotNull PlayerInteractEvent event) { if(event.getClickedBlock() == null) return; COMZombies plugin = COMZombies.getPlugin(); - if(BlockUtils.isSign(event.getClickedBlock().getType())) + if(BlockUtils.isSign(event.getClickedBlock().getBlockData())) { - Sign sign = (Sign) event.getClickedBlock().getState(); - Player player = event.getPlayer(); + final Sign sign = (Sign) event.getClickedBlock().getState(); + final Player player = event.getPlayer(); if (GameManager.INSTANCE.isPlayerInGame(player)) { - String lineOne = ChatColor.stripColor(sign.getLine(0)); - // We don't want to cancel the event if this case so that barrier signs can work - if(event.getAction() != Action.LEFT_CLICK_BLOCK || !lineOne.equalsIgnoreCase("[BarrierRepair]")) - { - sign.setEditable(false); - sign.update(); + sign.setEditable(false); + sign.update(); + if (!BlockUtils.isBarrierRepairSign(event.getClickedBlock())) { event.setCancelled(true); } } if(event.getAction() == Action.RIGHT_CLICK_BLOCK && player.isSneaking() && player.isOp()) { - String Line1 = ChatColor.stripColor(sign.getLine(0)); - if(!plugin.isEditingASign.containsKey(player) && Line1.equalsIgnoreCase("[Zombies]") && !GameManager.INSTANCE.isPlayerInGame(player)) + if(!plugin.isEditingASign.containsKey(player) && BlockUtils.isZombiesSign(event.getClickedBlock()) && !GameManager.INSTANCE.isPlayerInGame(player)) { plugin.isEditingASign.put(player, sign); CommandUtil.sendMessageToPlayer(player, "You are now editing a sign!"); @@ -152,18 +125,17 @@ public void RightClickSign(PlayerInteractEvent event) } } - String lineOne = ChatColor.stripColor(sign.getLine(0)); - String lineTwo = ChatColor.stripColor(sign.getLine(1)); - if(lineOne.equalsIgnoreCase("[Zombies]")) + if(BlockUtils.isZombiesSign(event.getClickedBlock())) { Game game = GameManager.INSTANCE.getGame(sign.getLocation()); - IGameSign signLogic = GAME_SIGNS.get(lineTwo.toLowerCase()); + String lineTwo = ChatColor.stripColor(sign.getLine(1)); + IGameSign signLogic = GAME_SIGNS.get(lineTwo.toLowerCase(Locale.ROOT)); if(signLogic != null && (game != null || !signLogic.requiresGame())) { if(game != null && signLogic.requiresGame() && game.getMode() != Game.ArenaStatus.INGAME) return; - signLogic.onInteract(game, player, sign); + signLogic.onInteract(game, player, event.getClickedBlock()); event.setCancelled(true); } } @@ -171,34 +143,43 @@ public void RightClickSign(PlayerInteractEvent event) } @EventHandler - public void eventSignChanged(SignChangeEvent event) - { - if(!BlockUtils.isSign(event.getBlock().getType())) + public void eventSignChanged(@NotNull SignChangeEvent event) { + if (!BlockUtils.isSign(event.getBlock())) { + throw new IllegalStateException("eventSignChanged is invoked with a non-sign block"); + } + + if (GameManager.INSTANCE.isPlayerInGame(event.getPlayer()) || ( + GameManager.INSTANCE.isLocationInGame(event.getBlock().getLocation()) + && !COMZPermission.doesPlayerHaveAdminPerms(event.getPlayer()))) { + event.setCancelled(true); return; - String lineOne = ChatColor.stripColor(event.getLine(0)); - String lineTwo = ChatColor.stripColor(event.getLine(1)); - if(lineOne != null && lineOne.equalsIgnoreCase("[Zombies]") && lineTwo != null) - { - Game game = GameManager.INSTANCE.getGame(event.getBlock().getLocation()); - IGameSign signLogic = GAME_SIGNS.get(lineTwo.toLowerCase()); - if(signLogic != null && (game != null || !signLogic.requiresGame())) - { - signLogic.onChange(game, event.getPlayer(), event); + } + + if (BlockUtils.isZombiesSign(event.getBlock())) { + String lineTwo = ChatColor.stripColor(event.getLine(1)); + if (lineTwo == null) { + return; } - else if(signLogic == null) - { + + IGameSign signLogic = GAME_SIGNS.get(lineTwo.toLowerCase(Locale.ROOT)); + if (signLogic != null) { + Game game = null; + if (signLogic.requiresGame()) { + game = GameManager.INSTANCE.getGame(event.getBlock().getLocation()); + } + if (game == null) { + event.setLine(0, ChatColor.RED + String.valueOf(ChatColor.BOLD) + "Sign is"); + event.setLine(1, ChatColor.RED + String.valueOf(ChatColor.BOLD) + "not in"); + event.setLine(2, ChatColor.RED + String.valueOf(ChatColor.BOLD) + "an arena!"); + event.setLine(3, ""); + return; + } + signLogic.onChange(game, event.getPlayer(), event); + } else { event.setLine(0, ChatColor.RED + String.valueOf(ChatColor.BOLD) + lineTwo); event.setLine(1, ChatColor.RED + String.valueOf(ChatColor.BOLD) + "is not a"); event.setLine(2, ChatColor.RED + String.valueOf(ChatColor.BOLD) + "valid sign"); event.setLine(3, ""); - - } - else - { - event.setLine(0, ChatColor.RED + String.valueOf(ChatColor.BOLD) + "Sign is"); - event.setLine(1, ChatColor.RED + String.valueOf(ChatColor.BOLD) + "not in"); - event.setLine(2, ChatColor.RED + String.valueOf(ChatColor.BOLD) + "an arena!"); - event.setLine(3, ""); } } } diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/listeners/WeaponListener.java b/Core/src/main/java/com/theprogrammingturkey/comz/listeners/WeaponListener.java index 1482368..1580942 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/listeners/WeaponListener.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/listeners/WeaponListener.java @@ -10,6 +10,7 @@ import com.theprogrammingturkey.comz.game.weapons.WeaponType; import com.theprogrammingturkey.comz.util.BlockUtils; import com.theprogrammingturkey.comz.util.RayTrace; +import java.util.random.RandomGenerator; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; @@ -34,13 +35,17 @@ public class WeaponListener implements Listener { - @EventHandler(priority = EventPriority.HIGHEST) - public void onPlayerInteractEvent(PlayerInteractEvent event) + @EventHandler(priority = EventPriority.HIGH) + public void onPlayerInteract(PlayerInteractEvent event) { - if(event.getAction().equals(Action.RIGHT_CLICK_BLOCK) && BlockUtils.isSign(event.getClickedBlock().getType())) + if (event.getAction().equals(Action.RIGHT_CLICK_BLOCK) && BlockUtils.isSign( + event.getClickedBlock()) && !BlockUtils.isBarrierRepairSign(event.getClickedBlock())) return; - if(event.getAction().equals(Action.PHYSICAL)) + if (event.getAction().equals(Action.PHYSICAL)) + return; + + if (event.getAction().equals(Action.LEFT_CLICK_BLOCK) && BlockUtils.isBarrierRepairSign(event.getClickedBlock())) return; Player player = event.getPlayer(); @@ -70,14 +75,17 @@ else if(gun.wasShot()) { Vector dirVec = event.getPlayer().getEyeLocation().getDirection(); - if(shots > 1) - dirVec.add(new Vector((Math.random() - 0.5) / 2.0, (Math.random() - 0.5) / 2.0, (Math.random() - 0.5) / 2.0)); + if (shots > 1) { + RandomGenerator rand = COMZombies.rand; + dirVec.add(new Vector(rand.nextDouble(0.5) - 0.25, rand.nextDouble(0.5) - 0.25, + rand.nextDouble(0.5) - 0.25)); + } RayTrace rayTrace = new RayTrace(event.getPlayer().getEyeLocation().toVector(), dirVec); double distance = gun.getType().distance; List hitEnts = rayTrace.getZombieIntersects(event.getPlayer().getWorld(), game.spawnManager.getEntities(), distance, game); - if(hitEnts.size() == 0) + if(hitEnts.isEmpty()) { rayTrace.showParticles(event.getPlayer().getWorld(), distance, 0.5f, gun.getType().particleColor); continue; @@ -121,10 +129,9 @@ else if(gun.wasShot()) { for(int i = 0; i < 30; i++) { - float x = (float) (Math.random()); - float y = (float) (Math.random()); - float z = (float) (Math.random()); - COMZombies.nmsUtil.sendParticleToPlayer(NMSParticleType.HEART, player, mob.getLocation(), x, y, z, 1, 1); + COMZombies.nmsUtil.sendParticleToPlayer(NMSParticleType.HEART, player, + mob.getLocation(), COMZombies.rand.nextFloat(), + COMZombies.rand.nextFloat(), COMZombies.rand.nextFloat(), 1, 1); } } for(Player pl : game.getPlayersInGame()) @@ -135,8 +142,15 @@ else if(gun.wasShot()) if(zombieHitLocY > eyeHeight - (entToDamage.getHeight() - eyeHeight)) { damage *= 1.5f; - for(int i = 0; i < 20; i++) - event.getPlayer().getWorld().spawnParticle(Particle.CRIT_MAGIC, entToDamage.getLocation().getX(), entToDamage.getLocation().getY() + eyeHeight, entToDamage.getLocation().getZ(), 0, (Math.random() - 0.5) * 2, (Math.random() - 0.5) * 2, (Math.random() - 0.5) * 2, 1); + for (int i = 0; i < 20; i++) { + event.getPlayer().getWorld() + .spawnParticle(Particle.CRIT_MAGIC, entToDamage.getLocation().getX(), + entToDamage.getLocation().getY() + eyeHeight, + entToDamage.getLocation().getZ(), 0, + COMZombies.rand.nextDouble(2d) - 1d, + COMZombies.rand.nextDouble(2d) - 1d, + COMZombies.rand.nextDouble(2d) - 1d, 1); + } } game.damageMob(mob, player, damage); @@ -181,7 +195,7 @@ public void onGrenade(PlayerInteractEvent event) if(!event.getAction().equals(Action.RIGHT_CLICK_AIR)) return; - if(event.getAction().equals(Action.RIGHT_CLICK_BLOCK) && BlockUtils.isSign(event.getClickedBlock().getType())) + if(event.getAction().equals(Action.RIGHT_CLICK_BLOCK) && BlockUtils.isSign(event.getClickedBlock().getBlockData())) return; final Player player = event.getPlayer(); @@ -204,8 +218,10 @@ public void onGrenade(PlayerInteractEvent event) Location loc = item.getLocation(); player.getWorld().createExplosion(loc.getX(), loc.getY(), loc.getZ(), 0.0F, false, false); List ents = game.spawnManager.getEntities(); - int ticker = COMZombies.scheduleTask(0, 5, () -> - item.getWorld().spawnParticle(Particle.SMOKE_NORMAL, item.getLocation().clone(), 0, Math.random() - 0.5, 0.5, Math.random() - 0.5, 0.05)); + int ticker = COMZombies.scheduleTask(0, 5, () -> item.getWorld() + .spawnParticle(Particle.SMOKE_NORMAL, item.getLocation().clone(), 0, + COMZombies.rand.nextDouble() - 0.5, 0.5, COMZombies.rand.nextDouble() - 0.5, + 0.05)); for(int i = ents.size() - 1; i >= 0; i--) { @@ -237,7 +253,8 @@ else if(handStack.getType().equals(Material.MAGMA_CREAM)) int ticker = COMZombies.scheduleTask(0, 5, () -> { - item.getWorld().spawnParticle(Particle.SMOKE_NORMAL, item.getLocation().clone(), 0, Math.random() - 0.5, 0.5, Math.random() - 0.5, 0.05); + item.getWorld().spawnParticle(Particle.SMOKE_NORMAL, item.getLocation().clone(), 0, + COMZombies.rand.nextDouble() - 0.5, 0.5, COMZombies.rand.nextDouble() - 0.5, 0.05); for(Mob e : game.spawnManager.getEntities()) e.setTarget(attackEnt); }); diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/listeners/customEvents/GameStartEvent.java b/Core/src/main/java/com/theprogrammingturkey/comz/listeners/customEvents/GameStartEvent.java index e0ca65b..72c55a1 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/listeners/customEvents/GameStartEvent.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/listeners/customEvents/GameStartEvent.java @@ -8,6 +8,7 @@ import org.bukkit.event.HandlerList; import javax.annotation.Nonnull; +import org.jetbrains.annotations.UnmodifiableView; public class GameStartEvent extends Event { @@ -20,7 +21,7 @@ public GameStartEvent(Game game) this.game = game; } - public List getInGamePlayers() + public @UnmodifiableView List getInGamePlayers() { return game.getPlayersInGame(); } diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/spawning/RoundSpawner.java b/Core/src/main/java/com/theprogrammingturkey/comz/spawning/RoundSpawner.java index 0518f3f..b77414d 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/spawning/RoundSpawner.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/spawning/RoundSpawner.java @@ -4,9 +4,6 @@ import org.bukkit.attribute.Attribute; import org.bukkit.attribute.AttributeInstance; import org.bukkit.entity.Mob; -import org.bukkit.entity.Player; - -import java.util.List; public abstract class RoundSpawner { diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/spawning/SpawnManager.java b/Core/src/main/java/com/theprogrammingturkey/comz/spawning/SpawnManager.java index b936475..f676650 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/spawning/SpawnManager.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/spawning/SpawnManager.java @@ -12,8 +12,10 @@ import com.theprogrammingturkey.comz.game.features.Door; import com.theprogrammingturkey.comz.util.BlockUtils; import com.theprogrammingturkey.comz.util.Util; +import java.util.AbstractMap.SimpleImmutableEntry; +import java.util.Collections; +import java.util.Comparator; import org.bukkit.Bukkit; -import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.entity.Entity; import org.bukkit.entity.Mob; @@ -24,6 +26,8 @@ import java.util.List; import java.util.Map; import java.util.logging.Level; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.UnmodifiableView; public class SpawnManager { @@ -60,7 +64,7 @@ public void loadAllSpawnsToGame(JsonArray spawnsSaveJson) { if(!spawnElem.isJsonObject()) continue; - Location loc = CustomConfig.getLocationAddWorld(spawnElem.getAsJsonObject(), "", game.getWorld()); + Location loc = CustomConfig.getLocationWithWorld(spawnElem.getAsJsonObject(), "", game.getWorld()); String id = CustomConfig.getString(spawnElem.getAsJsonObject(), "id", "MISSING"); if(loc != null && !id.equals("MISSING")) points.add(new SpawnPoint(loc, game, loc.getBlock().getType(), id)); @@ -108,9 +112,9 @@ public void removePoint(SpawnPoint point) GameManager.INSTANCE.saveAllGames(); } - public List getPoints() + public @UnmodifiableView List getPoints() { - return points; + return Collections.unmodifiableList(points); } public void killMob(Entity entity) @@ -139,9 +143,9 @@ public void killAll(boolean nextWave) mobs.clear(); } - public List getEntities() + public @UnmodifiableView List getEntities() { - return mobs; + return Collections.unmodifiableList(mobs); } public void removeEntity(Entity entity) @@ -151,7 +155,7 @@ public void removeEntity(Entity entity) mobs.remove(entity); - if((mobs.size() == 0) && (mobsSpawned >= mobsToSpawn)) + if((mobs.isEmpty()) && (mobsSpawned >= mobsToSpawn)) game.nextWave(); game.scoreboard.update(); @@ -177,42 +181,19 @@ public Game getGame() return game; } - private List getNearestPoints(Location loc, int numToGet) - { + private @NotNull List getNearestPoints(@NotNull Location loc, int numToGet) { List points = game.spawnManager.getPoints(); - if(numToGet <= 0 || points.size() == 0) + if (numToGet < 0) { + throw new IllegalArgumentException("numToGet should not be less than zero"); + } + if (numToGet == 0) { return new ArrayList<>(); - - int numPoints = Math.min(numToGet, points.size()); - List results = new ArrayList<>(numPoints); - for(int i = 0; i < numPoints; i++) - results.add(points.get(i)); - - List distances = new ArrayList<>(); - for(int i = 0; i < numToGet; i++) - distances.add(Double.POSITIVE_INFINITY); - - - for(SpawnPoint point : points) - { - Location spawnLoc = point.getLocation(); - double dx = spawnLoc.getBlockX() - loc.getBlockX(); - double dy = spawnLoc.getBlockY() - loc.getBlockY(); - double dz = spawnLoc.getBlockZ() - loc.getBlockZ(); - double dist2 = (dx * dx) + (dy * dy) + (dz * dz); - for(int resultIndex = 0; resultIndex < results.size(); resultIndex++) - { - if(dist2 >= distances.get(resultIndex)) - continue; - - distances.add(resultIndex, dist2); - results.add(resultIndex, point); - results.remove(numPoints); - distances.remove(numPoints); - break; - } } - return results; + + return points.stream().filter(this::canSpawn) + .map(point -> new SimpleImmutableEntry<>(point, point.getLocation().distanceSquared(loc))) + .sorted(Comparator.comparingDouble(SimpleImmutableEntry::getValue)) + .limit(Math.min(numToGet, points.size())).map(SimpleImmutableEntry::getKey).toList(); } private void smartSpawn(final int wave) @@ -230,33 +211,11 @@ private void smartSpawn(final int wave) return; } - int playersSize = game.getPlayersInGame().size(); - - SpawnPoint selectPoint = null; - Player player = game.getPlayersInGame().get(COMZombies.rand.nextInt(playersSize)); + Player player = game.getPlayersInGame().get(COMZombies.rand.nextInt(game.getPlayersInGame().size())); List points = getNearestPoints(player.getLocation(), mobsToSpawn); - int totalRetries = 0; - int curr = 0; - while(selectPoint == null) - { - if(curr == points.size()) - { - player = game.getPlayersInGame().get(COMZombies.rand.nextInt(playersSize)); - points = getNearestPoints(player.getLocation(), mobsToSpawn / playersSize); - curr = 0; - continue; - } - selectPoint = points.get(COMZombies.rand.nextInt(points.size())); - if(!(canSpawn(selectPoint))) - selectPoint = null; - curr++; - if(totalRetries > 1000) - oopsWeHadAnError(); - totalRetries++; - } - final SpawnPoint finalPoint = selectPoint; + final SpawnPoint finalPoint = points.get(COMZombies.rand.nextInt(points.size())); COMZombies.scheduleTask((int) spawnInterval * 20L, () -> { if(!this.canSpawn || wave != game.getWave()) @@ -339,16 +298,6 @@ private boolean canSpawn(SpawnPoint point) return maySpawn; } - private void oopsWeHadAnError() - { - if(game.getMode() != ArenaStatus.INGAME) - return; - - for(Player pl : game.getPlayersInGame()) - pl.sendMessage(ChatColor.RED + "Well.. I guess we had an error trying to pick a spawn point out of the many we had! We'll have to end your game because of our lack of skillez."); - game.endGame(); - } - public RoundSpawnType nextWave(int wave, final List players) { canSpawn = false; @@ -378,7 +327,7 @@ public void startWave(int wave) { canSpawn = true; - if(game.getPlayersInGame().size() == 0 && game.getMode() == ArenaStatus.INGAME) + if(game.getPlayersInGame().isEmpty() && game.getMode() == ArenaStatus.INGAME) { this.game.endGame(); Bukkit.broadcastMessage(COMZombies.PREFIX + "SmartSpawn was sent a players list with no players in it! Game was ended"); diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/spawning/ZombieSpawner.java b/Core/src/main/java/com/theprogrammingturkey/comz/spawning/ZombieSpawner.java index 9f26a97..cbc920c 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/spawning/ZombieSpawner.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/spawning/ZombieSpawner.java @@ -21,14 +21,20 @@ public Mob spawnEntity(Game game, SpawnPoint loc, int wave) if(zomb.getEquipment() != null) zomb.getEquipment().clear(); }); - zomb.setBaby(false); + if (!zomb.isAdult()) { + if (COMZombies.rand.nextInt(4) != 0) { + zomb.setAdult(); + } else { + setSpeed(zomb, (float) 2 / 3); + } + } setFollowDistance(zomb, 512); float strength = ((wave * 100f) + 50) / 50f; setMaxHealth(zomb, strength); zomb.setHealth(strength); - if(game.getWave() > 4 && COMZombies.rand.nextInt(100) < 20 + (15 * (game.getWave() - 5))) + if(game.getWave() > 4 && COMZombies.rand.nextInt(10) < 2 + (15 * (game.getWave() - 5))) setSpeed(zomb, 1.25f); Barrier b = game.barrierManager.getBarrier(loc); diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/util/BlockUtils.java b/Core/src/main/java/com/theprogrammingturkey/comz/util/BlockUtils.java index bd2f0f3..1de9d46 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/util/BlockUtils.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/util/BlockUtils.java @@ -1,5 +1,7 @@ package com.theprogrammingturkey.comz.util; +import java.util.List; +import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.NamespacedKey; @@ -7,32 +9,51 @@ import org.bukkit.block.BlockFace; import org.bukkit.block.data.BlockData; import org.bukkit.block.data.MultipleFacing; -import org.bukkit.block.data.type.Sign; import org.bukkit.block.data.type.WallSign; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public class BlockUtils { - public static boolean isWallSign(Material mat) + public static boolean isWallSign(@Nullable BlockData data) { - return mat.data == WallSign.class; + return data instanceof WallSign; } - public static boolean isStandingSign(Material mat) + public static boolean isStandingSign(@Nullable BlockData data) { - return mat.data == Sign.class; + return data instanceof org.bukkit.block.data.type.Sign; } - public static boolean isSign(Material mat) + public static boolean isSign(@Nullable BlockData data) { - return isStandingSign(mat) || isWallSign(mat); + return isStandingSign(data) || isWallSign(data); } - public static Material getMaterialFromKey(String key) + public static boolean isSign(@Nullable Block block) + { + return block != null && isSign(block.getBlockData()); + } + + public static boolean isZombiesSign(@Nullable Block block) { + return block != null && isSign(block.getBlockData()) && + ChatColor.stripColor( + ((org.bukkit.block.Sign) block.getState()).getLine(0) + ).equalsIgnoreCase("[Zombies]"); + } + + public static boolean isBarrierRepairSign(@Nullable Block block) { + return block != null && isSign(block.getBlockData()) && ChatColor.stripColor( + ((org.bukkit.block.Sign) block.getState()).getLine(0) + ).equalsIgnoreCase("[BarrierRepair]"); + } + + public static Material getMaterialFromKey(@NotNull String key) { return getMaterialFromKey(NamespacedKey.minecraft(key)); } - public static Material getMaterialFromKey(NamespacedKey key) + public static Material getMaterialFromKey(@NotNull NamespacedKey key) { for(Material mat : Material.values()) if(mat.getKey().equals(key)) @@ -40,7 +61,7 @@ public static Material getMaterialFromKey(NamespacedKey key) return Material.IRON_BARS; } - public static void setBlockTypeHelper(Block block, Material type) + public static void setBlockTypeHelper(@NotNull Block block, @NotNull Material type) { block.setType(type); BlockData data = block.getBlockData(); @@ -56,13 +77,34 @@ public static void setBlockTypeHelper(Block block, Material type) } } - public static void setBlockToAir(Location location) + public static void setBlockToAir(@NotNull Location location) { setBlockToAir(location.getBlock()); } - public static void setBlockToAir(Block block) + public static void setBlockToAir(@NotNull Block block) { block.setType(Material.AIR); } + + public static int compareBlockLocation(@NotNull Block block1, @NotNull Block block2) { + return compareLocation(block1.getLocation(), block2.getLocation()); + } + + public static int compareLocation(@NotNull Location location1, @NotNull Location location2) { + location1.checkFinite(); + location2.checkFinite(); + + if (location1.getY() != location2.getY()) { + return Double.compare(location1.getY(), location2.getY()); + } else if (location1.getZ() != location2.getZ()) { + return Double.compare(location1.getZ(), location2.getZ()); + } else { + return Double.compare(location1.getX(), location2.getX()); + } + } + + public static @NotNull List sortAndDistinctLocations(@NotNull List locations) { + return locations.stream().sorted(BlockUtils::compareLocation).distinct().toList(); + } } diff --git a/Core/src/main/java/com/theprogrammingturkey/comz/util/PlaceholderHook.java b/Core/src/main/java/com/theprogrammingturkey/comz/util/PlaceholderHook.java index 58f8c0d..72fcff8 100644 --- a/Core/src/main/java/com/theprogrammingturkey/comz/util/PlaceholderHook.java +++ b/Core/src/main/java/com/theprogrammingturkey/comz/util/PlaceholderHook.java @@ -137,45 +137,29 @@ else if(parts[0].equals("arena")) private String getStatFromString(String toGet, PlayerStats stats) { - switch(toGet) - { - case "kills": - return String.valueOf(stats.getKills()); - case "revives": - return String.valueOf(stats.getRevives()); - case "deaths": - return String.valueOf(stats.getDeaths()); - case "downs": - return String.valueOf(stats.getDowns()); - case "gamesPlayed": - return String.valueOf(stats.getGamesPlayed()); - case "highestRound": - return String.valueOf(stats.getHighestRound()); - case "mostPoints": - return String.valueOf(stats.getMostPoints()); - } - return ""; - } + return switch (toGet) { + case "kills" -> String.valueOf(stats.getKills()); + case "revives" -> String.valueOf(stats.getRevives()); + case "deaths" -> String.valueOf(stats.getDeaths()); + case "downs" -> String.valueOf(stats.getDowns()); + case "gamesPlayed" -> String.valueOf(stats.getGamesPlayed()); + case "highestRound" -> String.valueOf(stats.getHighestRound()); + case "mostPoints" -> String.valueOf(stats.getMostPoints()); + default -> ""; + }; + } private StatsCategory getStatEnumFromString(String toGet) { - switch(toGet) - { - case "kills": - return StatsCategory.KILLS; - case "revives": - return StatsCategory.REVIVES; - case "deaths": - return StatsCategory.DEATHS; - case "downs": - return StatsCategory.DOWNS; - case "gamesPlayed": - return StatsCategory.GAMES_PLAYED; - case "highestRound": - return StatsCategory.HIGHEST_ROUND; - case "mostPoints": - return StatsCategory.MOST_POINTS; - } - return null; - } + return switch (toGet) { + case "kills" -> StatsCategory.KILLS; + case "revives" -> StatsCategory.REVIVES; + case "deaths" -> StatsCategory.DEATHS; + case "downs" -> StatsCategory.DOWNS; + case "gamesPlayed" -> StatsCategory.GAMES_PLAYED; + case "highestRound" -> StatsCategory.HIGHEST_ROUND; + case "mostPoints" -> StatsCategory.MOST_POINTS; + default -> null; + }; + } } diff --git a/Core/src/main/resources/paper-plugin.yml b/Core/src/main/resources/paper-plugin.yml new file mode 100644 index 0000000..d7d07a6 --- /dev/null +++ b/Core/src/main/resources/paper-plugin.yml @@ -0,0 +1,13 @@ +name: COM_Zombies +version: @version@ +main: com.theprogrammingturkey.comz.COMZombies +description: 'Call of Minecraft: Zombies' +api-version: '1.19' +dependencies: + server: + Vault: + load: BEFORE + required: false + PlaceholderAPI: + load: BEFORE + required: false diff --git a/Core/src/main/resources/plugin.yml b/Core/src/main/resources/plugin.yml index 8900183..31a9009 100644 --- a/Core/src/main/resources/plugin.yml +++ b/Core/src/main/resources/plugin.yml @@ -5,8 +5,4 @@ version: @version@ authors: [TurkeyDev] api-version: '1.14' load: POSTWORLD -softdepend: [Multiverse-Core, Vault, PlaceholderAPI, My_Worlds] -commands: - zombies: - description: Type /zombies help for more info! - aliases: [z, zo, zom] +softdepend: [Vault, PlaceholderAPI] diff --git a/NMS/1_20_R2/src/main/java/com/theprogrammingturkey/comz/support/support_1_20_R2/NMSUtil_1_20_R2.java b/NMS/1_20_R2/src/main/java/com/theprogrammingturkey/comz/support/support_1_20_R2/NMSUtil_1_20_R2.java index fa36924..24df6cb 100644 --- a/NMS/1_20_R2/src/main/java/com/theprogrammingturkey/comz/support/support_1_20_R2/NMSUtil_1_20_R2.java +++ b/NMS/1_20_R2/src/main/java/com/theprogrammingturkey/comz/support/support_1_20_R2/NMSUtil_1_20_R2.java @@ -72,23 +72,14 @@ public void sendActionBarMessage(Player player, String message) public void sendParticleToPlayer(NMSParticleType particleType, Player player, Location location, float offsetX, float offsetY, float offsetZ, float speed, int count) { - ParticleType particle = Particles.a; - switch(particleType) - { - case WITCH: - particle = Particles.ad; // Witch - break; - case LAVA: - particle = Particles.N; - break; - case FIREWORK: - particle = Particles.A; - break; - case HEART: - particle = Particles.G; - break; - } - PacketPlayOutWorldParticles packet = new PacketPlayOutWorldParticles(particle, true, location.getX(), location.getY(), location.getZ(), offsetX, offsetY, offsetZ, speed, count); + ParticleType particle = switch (particleType) { + case WITCH -> Particles.ad; // Witch + case LAVA -> Particles.N; + case FIREWORK -> Particles.A; + case HEART -> Particles.G; + default -> Particles.a; + }; + PacketPlayOutWorldParticles packet = new PacketPlayOutWorldParticles(particle, true, location.getX(), location.getY(), location.getZ(), offsetX, offsetY, offsetZ, speed, count); sendPacket(player, packet); } diff --git a/NMS/1_20_R3/src/main/java/com/theprogrammingturkey/comz/support/support_1_20_R3/NMSUtil_1_20_R3.java b/NMS/1_20_R3/src/main/java/com/theprogrammingturkey/comz/support/support_1_20_R3/NMSUtil_1_20_R3.java index 1284f22..41c94f8 100644 --- a/NMS/1_20_R3/src/main/java/com/theprogrammingturkey/comz/support/support_1_20_R3/NMSUtil_1_20_R3.java +++ b/NMS/1_20_R3/src/main/java/com/theprogrammingturkey/comz/support/support_1_20_R3/NMSUtil_1_20_R3.java @@ -72,23 +72,14 @@ public void sendActionBarMessage(Player player, String message) public void sendParticleToPlayer(NMSParticleType particleType, Player player, Location location, float offsetX, float offsetY, float offsetZ, float speed, int count) { - ParticleType particle = Particles.a; - switch(particleType) - { - case WITCH: - particle = Particles.ad; // Witch - break; - case LAVA: - particle = Particles.N; - break; - case FIREWORK: - particle = Particles.A; - break; - case HEART: - particle = Particles.G; - break; - } - PacketPlayOutWorldParticles packet = new PacketPlayOutWorldParticles(particle, true, location.getX(), location.getY(), location.getZ(), offsetX, offsetY, offsetZ, speed, count); + ParticleType particle = switch (particleType) { + case WITCH -> Particles.ad; // Witch + case LAVA -> Particles.N; + case FIREWORK -> Particles.A; + case HEART -> Particles.G; + default -> Particles.a; + }; + PacketPlayOutWorldParticles packet = new PacketPlayOutWorldParticles(particle, true, location.getX(), location.getY(), location.getZ(), offsetX, offsetY, offsetZ, speed, count); sendPacket(player, packet); } diff --git a/build.gradle b/build.gradle index 2707628..2e5f000 100644 --- a/build.gradle +++ b/build.gradle @@ -15,9 +15,9 @@ allprojects { subprojects { apply plugin: 'java' - sourceCompatibility = targetCompatibility = '1.8' + sourceCompatibility = targetCompatibility = '17' repositories { mavenLocal() } -} \ No newline at end of file +}