diff options
Diffstat (limited to 'src/main/java/net/tylermurphy/hideAndSeek/game')
13 files changed, 716 insertions, 624 deletions
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java b/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java index 61e77e7..75d2a7d 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java @@ -19,12 +19,6 @@ package net.tylermurphy.hideAndSeek.game; -import static net.tylermurphy.hideAndSeek.configuration.Config.*; -import static net.tylermurphy.hideAndSeek.configuration.Localization.message; - -import java.util.*; -import java.util.stream.Collectors; - import net.tylermurphy.hideAndSeek.util.Status; import net.tylermurphy.hideAndSeek.util.Version; import org.bukkit.Bukkit; @@ -33,6 +27,12 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.scoreboard.*; +import java.util.*; +import java.util.stream.Collectors; + +import static net.tylermurphy.hideAndSeek.configuration.Config.*; +import static net.tylermurphy.hideAndSeek.configuration.Localization.message; + public class Board { private static final List<String> Hider = new ArrayList<>(), Seeker = new ArrayList<>(), Spectator = new ArrayList<>(); @@ -40,19 +40,19 @@ public class Board { private static final Map<String, CustomBoard> customBoards = new HashMap<>(); private static final Map<String, Integer> hider_kills = new HashMap<>(), seeker_kills = new HashMap<>(), hider_deaths = new HashMap<>(), seeker_deaths = new HashMap<>(); - public static boolean isPlayer(Player player) { + public static boolean contains(Player player) { return playerList.containsKey(player.getUniqueId().toString()); } - public static boolean isPlayer(CommandSender sender) { - return playerList.containsKey(Bukkit.getPlayer(sender.getName()).getUniqueId().toString()); + public static boolean contains(CommandSender sender) { + return contains((Player) sender); } public static boolean isHider(Player player) { return Hider.contains(player.getUniqueId().toString()); } - public static boolean isHider(UUID uuid){ + public static boolean isHider(UUID uuid) { return Hider.contains(uuid.toString()); } @@ -60,7 +60,7 @@ public class Board { return Seeker.contains(player.getUniqueId().toString()); } - public static boolean isSeeker(UUID uuid){ + public static boolean isSeeker(UUID uuid) { return Seeker.contains(uuid.toString()); } @@ -80,23 +80,23 @@ public class Board { return playerList.values().size(); } - public static List<Player> getHiders(){ + public static List<Player> getHiders() { return Hider.stream().map(playerList::get).collect(Collectors.toList()); } - public static List<Player> getSeekers(){ + public static List<Player> getSeekers() { return Seeker.stream().map(playerList::get).collect(Collectors.toList()); } - public static Player getFirstSeeker(){ + public static Player getFirstSeeker() { return playerList.get(Seeker.get(0)); } - public static List<Player> getSpectators(){ + public static List<Player> getSpectators() { return Spectator.stream().map(playerList::get).collect(Collectors.toList()); } - public static List<Player> getPlayers(){ + public static List<Player> getPlayers() { return new ArrayList<>(playerList.values()); } @@ -133,8 +133,8 @@ public class Board { } public static boolean onSameTeam(Player player1, Player player2) { - if(Hider.contains(player1.getUniqueId().toString()) && Hider.contains(player2.getUniqueId().toString())) return true; - else if(Seeker.contains(player1.getUniqueId().toString()) && Seeker.contains(player2.getUniqueId().toString())) return true; + if (Hider.contains(player1.getUniqueId().toString()) && Hider.contains(player2.getUniqueId().toString())) return true; + else if (Seeker.contains(player1.getUniqueId().toString()) && Seeker.contains(player2.getUniqueId().toString())) return true; else return Spectator.contains(player1.getUniqueId().toString()) && Spectator.contains(player2.getUniqueId().toString()); } @@ -148,15 +148,15 @@ public class Board { seeker_deaths.clear(); } - public static void addKill(UUID uuid){ - if(Hider.contains(uuid.toString())){ - if(hider_kills.containsKey(uuid.toString())){ + public static void addKill(UUID uuid) { + if (Hider.contains(uuid.toString())) { + if (hider_kills.containsKey(uuid.toString())) { hider_kills.put(uuid.toString(), hider_kills.get(uuid.toString())+1); } else { hider_kills.put(uuid.toString(), 1); } - } else if(getFirstSeeker().getUniqueId().equals(uuid)){ - if(seeker_kills.containsKey(uuid.toString())){ + } else if (getFirstSeeker().getUniqueId().equals(uuid)) { + if (seeker_kills.containsKey(uuid.toString())) { seeker_kills.put(uuid.toString(), seeker_kills.get(uuid.toString())+1); } else { seeker_kills.put(uuid.toString(), 1); @@ -164,15 +164,15 @@ public class Board { } } - public static void addDeath(UUID uuid){ - if(Hider.contains(uuid.toString())){ - if(hider_deaths.containsKey(uuid.toString())){ + public static void addDeath(UUID uuid) { + if (Hider.contains(uuid.toString())) { + if (hider_deaths.containsKey(uuid.toString())) { hider_deaths.put(uuid.toString(), hider_deaths.get(uuid.toString())+1); } else { hider_deaths.put(uuid.toString(), 1); } - } else if(getFirstSeeker().getUniqueId().equals(uuid)){ - if(seeker_deaths.containsKey(uuid.toString())){ + } else if (getFirstSeeker().getUniqueId().equals(uuid)) { + if (seeker_deaths.containsKey(uuid.toString())) { seeker_deaths.put(uuid.toString(), seeker_deaths.get(uuid.toString())+1); } else { seeker_deaths.put(uuid.toString(), 1); @@ -180,16 +180,16 @@ public class Board { } } - public static Map<String, Integer> getHiderKills(){ + public static Map<String, Integer> getHiderKills() { return new HashMap<>(hider_kills); } - public static Map<String, Integer> getSeekerKills(){ + public static Map<String, Integer> getSeekerKills() { return new HashMap<>(seeker_kills); } - public static Map<String, Integer> getHiderDeaths(){ + public static Map<String, Integer> getHiderDeaths() { return new HashMap<>(hider_deaths); } - public static Map<String, Integer> getSeekerDeaths(){ + public static Map<String, Integer> getSeekerDeaths() { return new HashMap<>(seeker_deaths); } @@ -199,27 +199,27 @@ public class Board { private static void createLobbyBoard(Player player, boolean recreate) { CustomBoard board = customBoards.get(player.getUniqueId().toString()); - if(recreate) { + if (recreate) { board = new CustomBoard(player, LOBBY_TITLE); board.updateTeams(); } int i=0; - for(String line : LOBBY_CONTENTS){ - if(line.equalsIgnoreCase("")){ + for(String line : LOBBY_CONTENTS) { + if (line.equalsIgnoreCase("")) { board.addBlank(); - } else if(line.contains("{COUNTDOWN}")){ - if(!lobbyCountdownEnabled){ + } else if (line.contains("{COUNTDOWN}")) { + if (!lobbyCountdownEnabled) { board.setLine(String.valueOf(i), line.replace("{COUNTDOWN}", COUNTDOWN_ADMINSTART)); - } else if(Game.countdownTime == -1){ + } else if (Game.countdownTime == -1) { board.setLine(String.valueOf(i), line.replace("{COUNTDOWN}", COUNTDOWN_WAITING)); } else { board.setLine(String.valueOf(i), line.replace("{COUNTDOWN}", COUNTDOWN_COUNTING.replace("{AMOUNT}",Game.countdownTime+""))); } - } else if(line.contains("{COUNT}")){ + } else if (line.contains("{COUNT}")) { board.setLine(String.valueOf(i), line.replace("{COUNT}", getPlayers().size()+"")); - } else if(line.contains("{SEEKER%}")){ + } else if (line.contains("{SEEKER%}")) { board.setLine(String.valueOf(i), line.replace("{SEEKER%}", getSeekerPercent()+"")); - } else if(line.contains("{HIDER%}")){ + } else if (line.contains("{HIDER%}")) { board.setLine(String.valueOf(i), line.replace("{HIDER%}", getHiderPercent()+"")); } else { board.setLine(String.valueOf(i), line); @@ -230,58 +230,58 @@ public class Board { customBoards.put(player.getUniqueId().toString(), board); } - public static void createGameBoard(Player player){ + public static void createGameBoard(Player player) { createGameBoard(player, true); } - private static void createGameBoard(Player player, boolean recreate){ + private static void createGameBoard(Player player, boolean recreate) { CustomBoard board = customBoards.get(player.getUniqueId().toString()); - if(recreate) { + if (recreate) { board = new CustomBoard(player, GAME_TITLE); board.updateTeams(); } int i = 0; - for(String line : GAME_CONTENTS){ - if(line.equalsIgnoreCase("")){ + for(String line : GAME_CONTENTS) { + if (line.equalsIgnoreCase("")) { board.addBlank(); } else { - if(line.contains("{TIME}")) { + if (line.contains("{TIME}")) { String value = Game.timeLeft/60 + "m" + Game.timeLeft%60 + "s"; board.setLine(String.valueOf(i), line.replace("{TIME}", value)); - } else if(line.contains("{TEAM}")) { + } else if (line.contains("{TEAM}")) { String value = getTeam(player); board.setLine(String.valueOf(i), line.replace("{TEAM}", value)); - } else if(line.contains("{BORDER}")) { - if(!worldborderEnabled) continue; - if(Game.worldBorder == null || Game.status == Status.STARTING){ + } else if (line.contains("{BORDER}")) { + if (!worldborderEnabled) continue; + if (Game.worldBorder == null || Game.status == Status.STARTING) { board.setLine(String.valueOf(i), line.replace("{BORDER}", BORDER_COUNTING.replace("{AMOUNT}", "0"))); - } else if(!Game.worldBorder.isRunning()) { + } else if (!Game.worldBorder.isRunning()) { board.setLine(String.valueOf(i), line.replace("{BORDER}", BORDER_COUNTING.replaceFirst("\\{AMOUNT}", Game.worldBorder.getDelay()/60+"").replaceFirst("\\{AMOUNT}", Game.worldBorder.getDelay()%60+""))); } else { board.setLine(String.valueOf(i), line.replace("{BORDER}", BORDER_DECREASING)); } - } else if(line.contains("{TAUNT}")){ - if(!tauntEnabled) continue; - if(Game.taunt == null || Game.status == Status.STARTING) { + } else if (line.contains("{TAUNT}")) { + if (!tauntEnabled) continue; + if (Game.taunt == null || Game.status == Status.STARTING) { board.setLine(String.valueOf(i), line.replace("{TAUNT}", TAUNT_COUNTING.replace("{AMOUNT}", "0"))); - } else if(!tauntLast && Hider.size() == 1){ + } else if (!tauntLast && Hider.size() == 1) { board.setLine(String.valueOf(i), line.replace("{TAUNT}", TAUNT_EXPIRED)); - } else if(!Game.taunt.isRunning()) { + } else if (!Game.taunt.isRunning()) { board.setLine(String.valueOf(i), line.replace("{TAUNT}", TAUNT_COUNTING.replaceFirst("\\{AMOUNT}", Game.taunt.getDelay() / 60 + "").replaceFirst("\\{AMOUNT}", Game.taunt.getDelay() % 60 + ""))); } else { board.setLine(String.valueOf(i), line.replace("{TAUNT}", TAUNT_ACTIVE)); } - } else if(line.contains("{GLOW}")){ - if(!glowEnabled) return; - if(Game.glow == null || Game.status == Status.STARTING || !Game.glow.isRunning()) { + } else if (line.contains("{GLOW}")) { + if (!glowEnabled) return; + if (Game.glow == null || Game.status == Status.STARTING || !Game.glow.isRunning()) { board.setLine(String.valueOf(i), line.replace("{GLOW}", GLOW_INACTIVE)); } else { board.setLine(String.valueOf(i), line.replace("{GLOW}", GLOW_ACTIVE)); } - } else if(line.contains("{#SEEKER}")) { + } else if (line.contains("{#SEEKER}")) { board.setLine(String.valueOf(i), line.replace("{#SEEKER}", getSeekers().size()+"")); - } else if(line.contains("{#HIDER}")) { + } else if (line.contains("{#HIDER}")) { board.setLine(String.valueOf(i), line.replace("{#HIDER}", getHiders().size()+"")); } else { board.setLine(String.valueOf(i), line); @@ -316,27 +316,27 @@ public class Board { } private static String getSeekerPercent() { - if(playerList.values().size() < 2) + if (playerList.values().size() < 2) return " --"; else return " "+(int)(100*(1.0/playerList.size())); } private static String getHiderPercent() { - if(playerList.size() < 2) + if (playerList.size() < 2) return " --"; else return " "+(int)(100-100*(1.0/playerList.size())); } private static String getTeam(Player player) { - if(isHider(player)) return message("HIDER_TEAM_NAME").toString(); - else if(isSeeker(player)) return message("SEEKER_TEAM_NAME").toString(); - else if(isSpectator(player)) return message("SPECTATOR_TEAM_NAME").toString(); + if (isHider(player)) return message("HIDER_TEAM_NAME").toString(); + else if (isSeeker(player)) return message("SEEKER_TEAM_NAME").toString(); + else if (isSpectator(player)) return message("SPECTATOR_TEAM_NAME").toString(); else return ChatColor.WHITE + "UNKNOWN"; } - public static void cleanup(){ + public static void cleanup() { playerList.clear(); Hider.clear(); Seeker.clear(); @@ -355,13 +355,13 @@ class CustomBoard { private int blanks; private boolean displayed; - public CustomBoard(Player player, String title){ + public CustomBoard(Player player, String title) { ScoreboardManager manager = Bukkit.getScoreboardManager(); assert manager != null; this.board = manager.getNewScoreboard(); this.LINES = new HashMap<>(); this.player = player; - if(Version.atLeast("1.13")){ + if (Version.atLeast("1.13")) { this.obj = board.registerNewObjective( "Scoreboard", "dummy", ChatColor.translateAlternateColorCodes('&', title)); } else { @@ -374,8 +374,8 @@ class CustomBoard { } public void updateTeams() { - try{ board.registerNewTeam("Hider"); } catch (Exception ignored){} - try{ board.registerNewTeam("Seeker"); } catch (Exception ignored){} + try{ board.registerNewTeam("Hider"); } catch (Exception ignored) {} + try{ board.registerNewTeam("Seeker"); } catch (Exception ignored) {} Team hiderTeam = board.getTeam("Hider"); assert hiderTeam != null; for(String entry : hiderTeam.getEntries()) @@ -388,8 +388,8 @@ class CustomBoard { seekerTeam.removeEntry(entry); for(Player player : Board.getSeekers()) seekerTeam.addEntry(player.getName()); - if(Version.atLeast("1.9")){ - if(nametagsVisible) { + if (Version.atLeast("1.9")) { + if (nametagsVisible) { hiderTeam.setOption(Team.Option.NAME_TAG_VISIBILITY, Team.OptionStatus.FOR_OWN_TEAM); seekerTeam.setOption(Team.Option.NAME_TAG_VISIBILITY, Team.OptionStatus.FOR_OTHER_TEAMS); } else { @@ -397,7 +397,7 @@ class CustomBoard { seekerTeam.setOption(Team.Option.NAME_TAG_VISIBILITY, Team.OptionStatus.NEVER); } } else { - if(nametagsVisible) { + if (nametagsVisible) { hiderTeam.setNameTagVisibility(NameTagVisibility.HIDE_FOR_OTHER_TEAMS); seekerTeam.setNameTagVisibility(NameTagVisibility.HIDE_FOR_OWN_TEAM); } else { @@ -405,7 +405,7 @@ class CustomBoard { seekerTeam.setNameTagVisibility(NameTagVisibility.NEVER); } } - if(Version.atLeast("1.12")){ + if (Version.atLeast("1.12")) { hiderTeam.setColor(ChatColor.GOLD); seekerTeam.setColor(ChatColor.RED); } else { @@ -414,23 +414,23 @@ class CustomBoard { } } - public void setLine(String key, String message){ + public void setLine(String key, String message) { Line line = LINES.get(key); - if(line == null) + if (line == null) addLine(key, ChatColor.translateAlternateColorCodes('&',message)); else updateLine(key, ChatColor.translateAlternateColorCodes('&',message)); } - private void addLine(String key, String message){ + private void addLine(String key, String message) { Score score = obj.getScore(message); score.setScore(LINES.values().size()+1); Line line = new Line(LINES.values().size()+1, message); LINES.put(key, line); } - public void addBlank(){ - if(displayed) return; + public void addBlank() { + if (displayed) return; StringBuilder temp = new StringBuilder(); for(int i = 0; i <= blanks; i ++) temp.append(ChatColor.RESET); @@ -438,7 +438,7 @@ class CustomBoard { addLine("blank"+blanks, temp.toString()); } - private void updateLine(String key, String message){ + private void updateLine(String key, String message) { Line line = LINES.get(key); board.resetScores(line.getMessage()); line.setMessage(message); @@ -460,7 +460,7 @@ class Line { private final int score; private String message; - public Line(int score, String message){ + public Line(int score, String message) { this.score = score; this.message = message; } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/CommandHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/CommandHandler.java index 8df3cf2..b7b2dad 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/CommandHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/CommandHandler.java @@ -19,24 +19,25 @@ package net.tylermurphy.hideAndSeek.game; -import static net.tylermurphy.hideAndSeek.configuration.Config.*; -import static net.tylermurphy.hideAndSeek.configuration.Localization.*; +import net.tylermurphy.hideAndSeek.command.*; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; import java.util.Arrays; import java.util.LinkedHashMap; import java.util.Map; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import net.tylermurphy.hideAndSeek.command.*; +import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix; +import static net.tylermurphy.hideAndSeek.configuration.Config.permissionsRequired; +import static net.tylermurphy.hideAndSeek.configuration.Localization.LOCAL; +import static net.tylermurphy.hideAndSeek.configuration.Localization.message; public class CommandHandler { - public static Map<String,ICommand> COMMAND_REGISTER = new LinkedHashMap<>(); + public static final Map<String,ICommand> COMMAND_REGISTER = new LinkedHashMap<>(); private static void registerCommand(ICommand command) { - if(!COMMAND_REGISTER.containsKey(command.getLabel())) { + if (!COMMAND_REGISTER.containsKey(command.getLabel())) { COMMAND_REGISTER.put(command.getLabel().toLowerCase(), command); } } @@ -61,18 +62,18 @@ public class CommandHandler { } public static boolean handleCommand(CommandSender sender, String[] args) { - if(!(sender instanceof Player)) { + if (!(sender instanceof Player)) { sender.sendMessage(errorPrefix + message("COMMAND_PLAYER_ONLY")); - } else if(args.length < 1 || !COMMAND_REGISTER.containsKey(args[0].toLowerCase()) ) { - if(permissionsRequired && !sender.hasPermission("hideandseek.about")) { + } else if (args.length < 1 || !COMMAND_REGISTER.containsKey(args[0].toLowerCase()) ) { + if (permissionsRequired && !sender.hasPermission("hideandseek.about")) { sender.sendMessage(errorPrefix + LOCAL.get("")); } else { COMMAND_REGISTER.get("about").execute(sender, null); } } else { - if(!args[0].equalsIgnoreCase("about") && !args[0].equalsIgnoreCase("help") && SaveMap.runningBackup) { + if (!args[0].equalsIgnoreCase("about") && !args[0].equalsIgnoreCase("help") && SaveMap.runningBackup) { sender.sendMessage(errorPrefix + message("MAPSAVE_INPROGRESS")); - } else if(permissionsRequired && !sender.hasPermission("hideandseek."+args[0].toLowerCase())) { + } else if (permissionsRequired && !sender.hasPermission("hideandseek."+args[0].toLowerCase())) { sender.sendMessage(errorPrefix + message("COMMAND_NOT_ALLOWED")); } else { try { diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/EventListener.java b/src/main/java/net/tylermurphy/hideAndSeek/game/EventListener.java deleted file mode 100644 index ac937a7..0000000 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/EventListener.java +++ /dev/null @@ -1,352 +0,0 @@ -/* - * This file is part of Kenshins Hide and Seek - * - * Copyright (c) 2021 Tyler Murphy. - * - * Kenshins Hide and Seek free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * he Free Software Foundation version 3. - * - * Kenshins Hide and Seek is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - -package net.tylermurphy.hideAndSeek.game; - -import static net.tylermurphy.hideAndSeek.configuration.Config.*; - -import com.cryptomorin.xseries.XMaterial; -import com.cryptomorin.xseries.XSound; -import net.tylermurphy.hideAndSeek.Main; -import net.tylermurphy.hideAndSeek.util.Status; -import net.tylermurphy.hideAndSeek.util.Version; -import org.bukkit.*; -import org.bukkit.attribute.Attribute; -import org.bukkit.attribute.AttributeInstance; -import org.bukkit.entity.Arrow; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; -import org.bukkit.entity.Projectile; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.block.Action; -import org.bukkit.event.entity.*; -import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.player.*; - -import org.bukkit.inventory.ItemStack; -import org.bukkit.potion.PotionEffect; -import org.bukkit.projectiles.ProjectileSource; - -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; - -import static net.tylermurphy.hideAndSeek.configuration.Localization.*; - -public class EventListener implements Listener { - - @EventHandler(priority = EventPriority.HIGHEST) - public void onPlayerJoin(PlayerJoinEvent event) { - Board.remove(event.getPlayer()); - Game.removeItems(event.getPlayer()); - if(Game.isNotSetup()) return; - if(autoJoin){ - Game.join(event.getPlayer()); - } else if(teleportToExit) { - if (event.getPlayer().getWorld().getName().equals(Game.getGameWorld()) || event.getPlayer().getWorld().getName().equals(lobbyWorld)) { - event.getPlayer().teleport(new Location(Bukkit.getWorld(exitWorld), exitPosition.getX(), exitPosition.getY(), exitPosition.getZ())); - event.getPlayer().setGameMode(GameMode.ADVENTURE); - } - } else { - if (mapSaveEnabled && event.getPlayer().getWorld().getName().equals(Game.getGameWorld())) { - if(Game.status != Status.STANDBY && Game.status != Status.ENDING){ - Game.join(event.getPlayer()); - } else { - event.getPlayer().teleport(new Location(Bukkit.getWorld(exitWorld), exitPosition.getX(), exitPosition.getY(), exitPosition.getZ())); - event.getPlayer().setGameMode(GameMode.ADVENTURE); - } - } - } - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onQuit(PlayerQuitEvent event) { - Board.remove(event.getPlayer()); - if(Game.status == Status.STANDBY) { - Board.reloadLobbyBoards(); - } else { - Board.reloadGameBoards(); - } - for(PotionEffect effect : event.getPlayer().getActivePotionEffects()){ - event.getPlayer().removePotionEffect(effect.getType()); - } - Game.removeItems(event.getPlayer()); - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onKick(PlayerKickEvent event) { - Board.remove(event.getPlayer()); - if(Game.status == Status.STANDBY) { - Board.reloadLobbyBoards(); - } else { - Board.reloadGameBoards(); - } - for(PotionEffect effect : event.getPlayer().getActivePotionEffects()){ - event.getPlayer().removePotionEffect(effect.getType()); - } - Game.removeItems(event.getPlayer()); - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onChat(AsyncPlayerChatEvent event){ - if(event.getMessage().equals("fly")){ - event.getPlayer().setAllowFlight(true); - event.getPlayer().setFlying(true); - } - if(event.getMessage().equals("no fly")){ - event.getPlayer().setAllowFlight(false); - event.getPlayer().setFlying(false); - } - if(Board.isSeeker(event.getPlayer())){ - event.setCancelled(true); - Board.getSpectators().forEach(spectator -> spectator.sendMessage(ChatColor.GRAY + "[SPECTATOR] " + event.getPlayer().getName() + ": " + event.getMessage())); - } - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onMove(PlayerMoveEvent event){ - if(!Board.isPlayer(event.getPlayer())) return; - if(!event.getPlayer().getWorld().getName().equals(Game.getGameWorld())) return; - if(event.getPlayer().hasPermission("hideandseek.leavebounds")) return; - if(event.getTo() == null || event.getTo().getWorld() == null) return; - if(!event.getTo().getWorld().getName().equals(Game.getGameWorld())) return; - if(event.getTo().getBlockX() < saveMinX || event.getTo().getBlockX() > saveMaxX || event.getTo().getBlockZ() < saveMinZ || event.getTo().getBlockZ() > saveMaxZ){ - event.setCancelled(true); - } - } - - public static final Map<UUID, Location> temp_loc = new HashMap<>(); - - @EventHandler(priority = EventPriority.HIGHEST) - public void onPlayerDeath(PlayerDeathEvent event){ - Player player = event.getEntity(); - if(!Board.isPlayer(player)) return; - event.setKeepInventory(true); - event.setDeathMessage(""); - temp_loc.put(player.getUniqueId(), player.getLocation()); - Main.plugin.getLogger().severe("Player "+player.getName() + " died when not supposed to. Attempting to roll back death."); - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onPlayerRespawn(PlayerRespawnEvent event){ - Player player = event.getPlayer(); - if(!Board.isPlayer(player)) return; - if(temp_loc.containsKey(player.getUniqueId())){ - player.teleport(temp_loc.get(player.getUniqueId())); - temp_loc.remove(player.getUniqueId()); - } - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onEntityDamage(EntityDamageEvent event) { - // If you are not a player, get out of here - if(!(event.getEntity() instanceof Player)) return; - // Define variables - Player player = (Player) event.getEntity(); - Player attacker = null; - // If player pvp is enabled, and player doesn't die, we do not care - if(pvpEnabled && player.getHealth() - event.getFinalDamage() >= 0.5){ return; } - // If no spawn position, we won't be able to manage their death :o - if(spawnPosition == null){ return; } - // If there is an attacker, find them - if (event instanceof EntityDamageByEntityEvent) { - if(((EntityDamageByEntityEvent) event).getDamager() instanceof Player) - attacker = (Player) ((EntityDamageByEntityEvent) event).getDamager(); - else if(((EntityDamageByEntityEvent) event).getDamager() instanceof Projectile) - if(((Projectile) ((EntityDamageByEntityEvent) event).getDamager()).getShooter() instanceof Player) - attacker = (Player) ((Projectile) ((EntityDamageByEntityEvent) event).getDamager()).getShooter(); - } - // Makes sure that if there was an attacking player, that the event is allowed for the game - if(attacker != null){ - // Cancel if one player is in the game but other isn't - if((Board.isPlayer(player) && !Board.isPlayer(attacker)) || (!Board.isPlayer(player) && Board.isPlayer(attacker))){ - event.setCancelled(true); - return; - // Ignore event if neither player are in the game - } else if(!Board.isPlayer(player) && !Board.isPlayer(attacker)){ - return; - // Ignore event if players are on the same team, or one of them is a spectator - } else if(Board.onSameTeam(player, attacker) || Board.isSpectator(player) || Board.isSpectator(attacker)){ - event.setCancelled(true); - return; - // Ignore the event if pvp is disabled, and a hider is trying to attack a seeker - } else if(!pvpEnabled && Board.isHider(attacker) && Board.isSeeker(player)){ - event.setCancelled(true); - return; - } - // If there is no attacker, it must of been by natural causes. If pvp is disabled, and config doesn't allow natural causes, cancel event. - } else if(!pvpEnabled && !allowNaturalCauses){ - event.setCancelled(true); - return; - // Spectators cannot take damage - } else if(Board.isSpectator(player)){ - event.setCancelled(true); - if(Version.atLeast("1.18") && player.getLocation().getY() < -64){ - player.teleport(new Location(Bukkit.getWorld(Game.getGameWorld()), spawnPosition.getX(), spawnPosition.getY(), spawnPosition.getZ())); - } else if(player.getLocation().getY() < 0){ - player.teleport(new Location(Bukkit.getWorld(Game.getGameWorld()), spawnPosition.getX(), spawnPosition.getY(), spawnPosition.getZ())); - } - return; - } - // Handle death event - event.setCancelled(true); - // Reset health and play death effect - if(Version.atLeast("1.9")) { - AttributeInstance attribute = player.getAttribute(Attribute.GENERIC_MAX_HEALTH); - if (attribute != null) player.setHealth(attribute.getValue()); - XSound.ENTITY_PLAYER_DEATH.play(player, 1, 1); - } else { - player.setHealth(player.getMaxHealth()); - XSound.ENTITY_PLAYER_HURT.play(player, 1, 1); - } - // Teleport player to seeker spawn - player.teleport(new Location(Bukkit.getWorld(Game.getGameWorld()), spawnPosition.getX(), spawnPosition.getY(), spawnPosition.getZ())); - // Broadcast player death message - if (Board.isSeeker(player)) { - Game.broadcastMessage(message("GAME_PLAYER_DEATH").addPlayer(player).toString()); - if(Board.getFirstSeeker().getName().equals(player.getName())){ - Board.addDeath(player.getUniqueId()); - } - } else if (Board.isHider(player)) { - if (attacker == null) { - Game.broadcastMessage(message("GAME_PLAYER_FOUND").addPlayer(player).toString()); - } else { - Game.broadcastMessage(message("GAME_PLAYER_FOUND_BY").addPlayer(player).addPlayer(attacker).toString()); - } - Board.addDeath(player.getUniqueId()); - Board.addSeeker(player); - } - // Add leaderboard kills if attacker - if(attacker != null && ( Board.isHider(attacker) || Board.getFirstSeeker().getName().equals(attacker.getName()) ) ) - Board.addKill(attacker.getUniqueId()); - Game.resetPlayer(player); - Board.reloadBoardTeams(); - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onFoodLevelChange(FoodLevelChangeEvent event) { - if(event.getEntity() instanceof Player) { - if(!Board.isPlayer((Player) event.getEntity())) return; - event.setCancelled(true); - } - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onPlayerRegainHealth(EntityRegainHealthEvent event) { - if(event.getRegainReason() == RegainReason.SATIATED || event.getRegainReason() == RegainReason.REGEN) { - if(event.getEntity() instanceof Player) { - if(!Board.isPlayer((Player) event.getEntity())) return; - event.setCancelled(true); - } - } - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onPlayerCommand(PlayerCommandPreprocessEvent event) { - Player player = event.getPlayer(); - String message = event.getMessage(); - String[] array = message.split(" "); - String[] temp = array[0].split(":"); - for(String handle : blockedCommands){ - if( - array[0].substring(1).equalsIgnoreCase(handle) && Board.isPlayer(player) || - temp[temp.length-1].equalsIgnoreCase(handle) && Board.isPlayer(player) - ) { - if(Game.status == Status.STANDBY) return; - player.sendMessage(errorPrefix + message("BLOCKED_COMMAND")); - event.setCancelled(true); - break; - } - } - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onPlayerInteract(PlayerInteractEvent event) { - if(!Board.isPlayer(event.getPlayer())) return; - if(event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getClickedBlock() != null && blockedInteracts.contains(event.getClickedBlock().getType().name())){ - event.setCancelled(true); - return; - } - ItemStack temp = event.getItem(); - if(temp == null) return; - if(Game.status == Status.STANDBY) - onPlayerInteractLobby(temp, event); - if(Game.status == Status.PLAYING) - onPlayerInteractGame(temp, event); - } - - private void onPlayerInteractLobby(ItemStack temp, PlayerInteractEvent event){ - if (temp.getItemMeta().getDisplayName().equalsIgnoreCase(lobbyLeaveItem.getItemMeta().getDisplayName()) && temp.getType() == lobbyLeaveItem.getType()) { - event.setCancelled(true); - Game.leave(event.getPlayer()); - } - - if (temp.getItemMeta().getDisplayName().equalsIgnoreCase(lobbyStartItem.getItemMeta().getDisplayName()) && temp.getType() == lobbyStartItem.getType() && event.getPlayer().hasPermission("hideandseek.start")) { - event.setCancelled(true); - if (Game.isNotSetup()) { - event.getPlayer().sendMessage(errorPrefix + message("GAME_SETUP")); - return; - } - if (Game.status != Status.STANDBY) { - event.getPlayer().sendMessage(errorPrefix + message("GAME_INPROGRESS")); - return; - } - if (Board.size() < minPlayers) { - event.getPlayer().sendMessage(errorPrefix + message("START_MIN_PLAYERS").addAmount(minPlayers)); - return; - } - Game.start(); - } - } - - private void onPlayerInteractGame(ItemStack temp, PlayerInteractEvent event){ - if (temp.getItemMeta().getDisplayName().equalsIgnoreCase(glowPowerupItem.getItemMeta().getDisplayName()) && temp.getType() == glowPowerupItem.getType()) { - if(!glowEnabled) return; - Player player = event.getPlayer(); - if(Board.isHider(player)) { - Game.glow.onProjectile(); - player.getInventory().remove(glowPowerupItem); - assert XMaterial.SNOWBALL.parseMaterial() != null; - player.getInventory().remove(XMaterial.SNOWBALL.parseMaterial()); - event.setCancelled(true); - } - } - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onInventoryClick(InventoryClickEvent event) { - if(event.getWhoClicked() instanceof Player){ - Player player = (Player) event.getWhoClicked(); - if(Board.isPlayer(player) && Game.status == Status.STANDBY){ - event.setCancelled(true); - } - } - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onItemDrop(PlayerDropItemEvent event) { - if(Board.isPlayer(event.getPlayer())){ - event.setCancelled(true); - } - } - -}
\ No newline at end of file diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java b/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java index 5069bac..83b304d 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java @@ -19,15 +19,15 @@ package net.tylermurphy.hideAndSeek.game; -import static net.tylermurphy.hideAndSeek.configuration.Config.*; - import com.cryptomorin.xseries.messages.ActionBar; import com.cryptomorin.xseries.messages.Titles; import com.google.common.io.ByteArrayDataOutput; import com.google.common.io.ByteStreams; import net.md_5.bungee.api.ChatColor; +import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.configuration.Items; import net.tylermurphy.hideAndSeek.database.Database; +import net.tylermurphy.hideAndSeek.game.listener.RespawnHandler; import net.tylermurphy.hideAndSeek.util.*; import net.tylermurphy.hideAndSeek.world.WorldLoader; import org.bukkit.*; @@ -37,8 +37,6 @@ import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.Firework; import org.bukkit.entity.Player; - -import net.tylermurphy.hideAndSeek.Main; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.FireworkMeta; import org.bukkit.potion.PotionEffect; @@ -48,7 +46,8 @@ import java.io.File; import java.util.*; import java.util.stream.Collectors; -import static net.tylermurphy.hideAndSeek.configuration.Localization.*; +import static net.tylermurphy.hideAndSeek.configuration.Config.*; +import static net.tylermurphy.hideAndSeek.configuration.Localization.message; import static net.tylermurphy.hideAndSeek.game.Game.broadcastMessage; public class Game { @@ -69,36 +68,36 @@ public class Game { worldLoader = new WorldLoader(spawnWorld); } - public static void start(){ + public static void start() { Optional<Player> rand = Board.getPlayers().stream().skip(new Random().nextInt(Board.size())).findFirst(); - if(!rand.isPresent()){ + if (!rand.isPresent()) { Main.plugin.getLogger().warning("Failed to select random seeker."); return; } String seekerName = rand.get().getName(); Player temp = Bukkit.getPlayer(seekerName); - if(temp == null){ + if (temp == null) { Main.plugin.getLogger().warning("Failed to select random seeker."); return; } Player seeker = Board.getPlayer(temp.getUniqueId()); - if(seeker == null){ + if (seeker == null) { Main.plugin.getLogger().warning("Failed to select random seeker."); return; } start(seeker); } - public static void start(Player seeker){ - if(status == Status.STARTING || status == Status.PLAYING) return; - if(mapSaveEnabled && worldLoader.getWorld() != null) { + public static void start(Player seeker) { + if (status == Status.STARTING || status == Status.PLAYING) return; + if (mapSaveEnabled && worldLoader.getWorld() != null) { worldLoader.rollback(); - } else if(mapSaveEnabled) { + } else if (mapSaveEnabled) { worldLoader.loadMap(); } Board.reload(); for(Player temp : Board.getPlayers()) { - if(temp.getName().equals(seeker.getName())) + if (temp.getName().equals(seeker.getName())) continue; Board.addHider(temp); } @@ -108,7 +107,7 @@ public class Game { player.getInventory().clear(); player.setGameMode(GameMode.ADVENTURE); player.teleport(new Location(Bukkit.getWorld(getGameWorld()), spawnPosition.getX(),spawnPosition.getY(),spawnPosition.getZ())); - for(PotionEffect effect : player.getActivePotionEffects()){ + for(PotionEffect effect : player.getActivePotionEffects()) { player.removePotionEffect(effect.getType()); } } @@ -122,20 +121,20 @@ public class Game { player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED,1000000,5,false,false)); Titles.sendTitle(player, 10, 70, 20, ChatColor.WHITE + "" + message("HIDER_TEAM_NAME"), ChatColor.WHITE + message("HIDERS_SUBTITLE").toString()); } - if(tauntEnabled) + if (tauntEnabled) taunt = new Taunt(); if (glowEnabled) glow = new Glow(); worldBorder = new Border(); worldBorder.resetWorldborder(getGameWorld()); - if(gameLength > 0) + if (gameLength > 0) timeLeft = gameLength; for(Player player : Board.getPlayers()) Board.createGameBoard(player); Board.reloadGameBoards(); status = Status.STARTING; int temp = gameId; - if(countdownDisplay != CountdownDisplay.TITLE) { + if (countdownDisplay != CountdownDisplay.TITLE) { sendHideCountdownMessage(messagePrefix + message("START_COUNTDOWN").addAmount(30), gameId, 0); } sendHideCountdownMessage(messagePrefix + message("START_COUNTDOWN").addAmount(20), gameId, 20 * 10); @@ -145,33 +144,33 @@ public class Game { sendHideCountdownMessage(messagePrefix + message("START_COUNTDOWN").addAmount(2), gameId, 20 * 28); sendHideCountdownMessage(messagePrefix + message("START_COUNTDOWN").addAmount(1), gameId, 20 * 29); Bukkit.getServer().getScheduler().runTaskLater(Main.plugin, () -> { - if(temp != gameId) return; + if (temp != gameId) return; sendHideCountdownMessage(messagePrefix + message("START"), gameId, 0); for(Player player : Board.getPlayers()) resetPlayer(player); status = Status.PLAYING; }, 20 * 30); } - public static void stop(WinType type){ - if(status == Status.STANDBY || status == Status.ENDING) return; + public static void stop(WinType type) { + if (status == Status.STANDBY || status == Status.ENDING) return; status = Status.ENDING; for(Player player : Board.getPlayers()) { player.getInventory().clear(); - for(PotionEffect effect : player.getActivePotionEffects()){ + for(PotionEffect effect : player.getActivePotionEffects()) { player.removePotionEffect(effect.getType()); } player.addPotionEffect(new PotionEffect(PotionEffectType.HEAL, 1, 100)); - if(Version.atLeast("1.9")){ + if (Version.atLeast("1.9")) { for(Player temp : Board.getPlayers()) { Packet.setGlow(player, temp, false); } } } List<UUID> players = Board.getPlayers().stream().map(Entity::getUniqueId).collect(Collectors.toList()); - if(type == WinType.HIDER_WIN){ + if (type == WinType.HIDER_WIN) { List<UUID> winners = Board.getHiders().stream().map(Entity::getUniqueId).collect(Collectors.toList()); Database.playerInfo.addWins(players, winners, Board.getHiderKills(), Board.getHiderDeaths(), Board.getSeekerKills(), Board.getSeekerDeaths(), type); - } else if(type == WinType.SEEKER_WIN){ + } else if (type == WinType.SEEKER_WIN) { List<UUID> winners = new ArrayList<>(); winners.add(Board.getFirstSeeker().getUniqueId()); Database.playerInfo.addWins(players, winners, Board.getHiderKills(), Board.getHiderDeaths(), Board.getSeekerKills(), Board.getSeekerDeaths(), type); @@ -179,8 +178,8 @@ public class Game { Bukkit.getScheduler().scheduleSyncDelayedTask(Main.plugin, Game::end, 5*20); } - public static void end(){ - if(status == Status.STANDBY) return; + public static void end() { + if (status == Status.STANDBY) return; tick = 0; countdownTime = -1; status = Status.STANDBY; @@ -188,65 +187,58 @@ public class Game { timeLeft = 0; worldBorder.resetWorldborder(getGameWorld()); for(Player player : Board.getPlayers()) { - for(Player player2 : Board.getPlayers()){ + for(Player player2 : Board.getPlayers()) { player.showPlayer(player2); } player.setAllowFlight(false); player.setFlying(false); - if(Version.atLeast("1.9")){ + if (Version.atLeast("1.9")) { for(Player temp : Board.getPlayers()) { Packet.setGlow(player, temp, false); } } - for(PotionEffect effect : player.getActivePotionEffects()){ + for(PotionEffect effect : player.getActivePotionEffects()) { player.removePotionEffect(effect.getType()); } player.addPotionEffect(new PotionEffect(PotionEffectType.HEAL, 1, 100)); - if(leaveOnEnd){ + if (leaveOnEnd) { Board.removeBoard(player); Board.remove(player); player.getInventory().clear(); - if(bungeeLeave) { - ByteArrayDataOutput out = ByteStreams.newDataOutput(); - out.writeUTF("Connect"); - out.writeUTF(leaveServer); - player.sendPluginMessage(Main.plugin, "BungeeCord", out.toByteArray()); - } else { - player.teleport(new Location(Bukkit.getWorld(exitWorld), exitPosition.getX(), exitPosition.getY(), exitPosition.getZ())); - } + handleBungeeLeave(player); } else { player.teleport(new Location(Bukkit.getWorld(lobbyWorld), lobbyPosition.getX(),lobbyPosition.getY(),lobbyPosition.getZ())); Board.createLobbyBoard(player); player.setGameMode(GameMode.ADVENTURE); Board.addHider(player); player.getInventory().clear(); - if(lobbyStartItem != null && (!lobbyItemStartAdmin || player.isOp())) + if (lobbyStartItem != null && (!lobbyItemStartAdmin || player.isOp())) player.getInventory().setItem(lobbyItemStartPosition, lobbyStartItem); - if(lobbyLeaveItem != null) + if (lobbyLeaveItem != null) player.getInventory().setItem(lobbyItemLeavePosition, lobbyLeaveItem); - for(PotionEffect effect : player.getActivePotionEffects()){ + for(PotionEffect effect : player.getActivePotionEffects()) { player.removePotionEffect(effect.getType()); } player.addPotionEffect(new PotionEffect(PotionEffectType.HEAL, 1, 100)); } } - EventListener.temp_loc.clear(); - if(mapSaveEnabled) worldLoader.unloadMap(); + RespawnHandler.temp_loc.clear(); + if (mapSaveEnabled) worldLoader.unloadMap(); Board.reloadLobbyBoards(); } - public static void join(Player player){ - if(Game.status == Status.STANDBY || Game.status == Status.ENDING) { + public static void join(Player player) { + if (Game.status == Status.STANDBY || Game.status == Status.ENDING) { player.teleport(new Location(Bukkit.getWorld(lobbyWorld), lobbyPosition.getX(),lobbyPosition.getY(),lobbyPosition.getZ())); player.getInventory().clear(); - if(lobbyStartItem != null && (!lobbyItemStartAdmin || player.hasPermission("hideandseek.start"))) + if (lobbyStartItem != null && (!lobbyItemStartAdmin || player.hasPermission("hideandseek.start"))) player.getInventory().setItem(lobbyItemStartPosition, lobbyStartItem); - if(lobbyLeaveItem != null) + if (lobbyLeaveItem != null) player.getInventory().setItem(lobbyItemLeavePosition, lobbyLeaveItem); Board.addHider(player); - if(announceMessagesToNonPlayers) Bukkit.broadcastMessage(messagePrefix + message("GAME_JOIN").addPlayer(player)); + if (announceMessagesToNonPlayers) Bukkit.broadcastMessage(messagePrefix + message("GAME_JOIN").addPlayer(player)); else Game.broadcastMessage(messagePrefix + message("GAME_JOIN").addPlayer(player)); - for(PotionEffect effect : player.getActivePotionEffects()){ + for(PotionEffect effect : player.getActivePotionEffects()) { player.removePotionEffect(effect.getType()); } player.setGameMode(GameMode.ADVENTURE); @@ -256,7 +248,7 @@ public class Game { Board.addSpectator(player); player.sendMessage(messagePrefix + message("GAME_JOIN_SPECTATOR")); player.setGameMode(GameMode.ADVENTURE); - for(Player player2 : Board.getPlayers()){ + for(Player player2 : Board.getPlayers()) { player2.hidePlayer(player); } Board.createGameBoard(player); @@ -268,7 +260,7 @@ public class Game { } player.setFoodLevel(20); - if(Version.atLeast("1.9")) { + if (Version.atLeast("1.9")) { AttributeInstance attribute = player.getAttribute(Attribute.GENERIC_MAX_HEALTH); if (attribute != null) player.setHealth(attribute.getValue()); } else { @@ -276,32 +268,36 @@ public class Game { } } - public static void leave(Player player){ + public static void leave(Player player) { player.setFlying(false); player.setAllowFlight(false); player.setFallDistance(0.0F); - for(Player player2 : Board.getPlayers()){ + for(Player player2 : Board.getPlayers()) { player2.showPlayer(player); player.showPlayer(player2); } - if(announceMessagesToNonPlayers) Bukkit.broadcastMessage(messagePrefix + message("GAME_LEAVE").addPlayer(player)); + if (announceMessagesToNonPlayers) Bukkit.broadcastMessage(messagePrefix + message("GAME_LEAVE").addPlayer(player)); else Game.broadcastMessage(messagePrefix + message("GAME_LEAVE").addPlayer(player)); - if(Board.isHider(player) && status != Status.ENDING && status != Status.STANDBY){ + if (Board.isHider(player) && status != Status.ENDING && status != Status.STANDBY) { hiderLeave = true; } Board.removeBoard(player); Board.remove(player); player.getInventory().clear(); - if(Game.status == Status.STANDBY) { + if (Game.status == Status.STANDBY) { Board.reloadLobbyBoards(); } else { Board.reloadGameBoards(); Board.reloadBoardTeams(); } - for(PotionEffect effect : player.getActivePotionEffects()){ + for(PotionEffect effect : player.getActivePotionEffects()) { player.removePotionEffect(effect.getType()); } - if(bungeeLeave) { + handleBungeeLeave(player); + } + + private static void handleBungeeLeave(Player player) { + if (bungeeLeave) { ByteArrayDataOutput out = ByteStreams.newDataOutput(); out.writeUTF("Connect"); out.writeUTF(leaveServer); @@ -312,25 +308,25 @@ public class Game { } public static void onTick() { - if(isNotSetup()) return; - if(status == Status.STANDBY) whileWaiting(); - else if(status == Status.STARTING) whileStarting(); - else if(status == Status.PLAYING) whilePlaying(); + if (isNotSetup()) return; + if (status == Status.STANDBY) whileWaiting(); + else if (status == Status.STARTING) whileStarting(); + else if (status == Status.PLAYING) whilePlaying(); tick++; } private static void whileWaiting() { - if(!lobbyCountdownEnabled) return; - if(lobbyMin <= Board.size()){ - if(countdownTime == -1) + if (!lobbyCountdownEnabled) return; + if (lobbyMin <= Board.size()) { + if (countdownTime == -1) countdownTime = countdown; - if(Board.size() >= changeCountdown) + if (Board.size() >= changeCountdown) countdownTime = Math.min(countdownTime, 10); - if(tick % 20 == 0) { + if (tick % 20 == 0) { countdownTime--; Board.reloadLobbyBoards(); } - if(countdownTime == 0){ + if (countdownTime == 0) { start(); } } else { @@ -338,8 +334,8 @@ public class Game { } } - private static void whileStarting(){ - for(Player spectator : Board.getSpectators()){ + private static void whileStarting() { + for(Player spectator : Board.getSpectators()) { spectator.setFlying(spectator.getAllowFlight()); } checkWinConditions(); @@ -351,46 +347,46 @@ public class Game { for(Player seeker : Board.getSeekers()) { try { temp = (int) hider.getLocation().distance(seeker.getLocation()); - } catch (Exception e){ + } catch (Exception e) { //Players in different worlds, NOT OK!!! } - if(distance > temp) { + if (distance > temp) { distance = temp; } } - if(seekerPing) switch(tick%10) { + if (seekerPing) switch(tick%10) { case 0: - if(distance < seekerPingLevel1) heartbeatSound.play(hider, seekerPingLeadingVolume, seekerPingPitch); - if(distance < seekerPingLevel3) ringingSound.play(hider, seekerPingVolume, seekerPingPitch); + if (distance < seekerPingLevel1) heartbeatSound.play(hider, seekerPingLeadingVolume, seekerPingPitch); + if (distance < seekerPingLevel3) ringingSound.play(hider, seekerPingVolume, seekerPingPitch); break; case 3: - if(distance < seekerPingLevel1) heartbeatSound.play(hider, seekerPingVolume, seekerPingPitch); - if(distance < seekerPingLevel3) ringingSound.play(hider, seekerPingVolume, seekerPingPitch); + if (distance < seekerPingLevel1) heartbeatSound.play(hider, seekerPingVolume, seekerPingPitch); + if (distance < seekerPingLevel3) ringingSound.play(hider, seekerPingVolume, seekerPingPitch); break; case 6: - if(distance < seekerPingLevel3) ringingSound.play(hider, seekerPingVolume, seekerPingPitch); + if (distance < seekerPingLevel3) ringingSound.play(hider, seekerPingVolume, seekerPingPitch); break; case 9: - if(distance < seekerPingLevel2) ringingSound.play(hider, seekerPingVolume, seekerPingPitch); + if (distance < seekerPingLevel2) ringingSound.play(hider, seekerPingVolume, seekerPingPitch); break; } } - for(Player spectator : Board.getSpectators()){ + for(Player spectator : Board.getSpectators()) { spectator.setFlying(spectator.getAllowFlight()); } - if(tick%20 == 0) { - if(gameLength > 0) { + if (tick%20 == 0) { + if (gameLength > 0) { Board.reloadGameBoards(); timeLeft--; } - if(worldborderEnabled) worldBorder.update(); - if(tauntEnabled) taunt.update(); + if (worldborderEnabled) worldBorder.update(); + if (tauntEnabled) taunt.update(); if (glowEnabled) glow.update(); } checkWinConditions(); } - public static void resetWorldborder(String worldName){ + public static void resetWorldBorder(String worldName) { worldBorder = new Border(); worldBorder.resetWorldborder(worldName); } @@ -402,18 +398,18 @@ public class Game { } public static boolean isNotSetup() { - if(spawnPosition.getBlockX() == 0 && spawnPosition.getBlockY() == 0 && spawnPosition.getBlockZ() == 0) return true; - if(lobbyPosition.getBlockX() == 0 && lobbyPosition.getBlockY() == 0 && lobbyPosition.getBlockZ() == 0) return true; - if(exitPosition.getBlockX() == 0 && exitPosition.getBlockY() == 0 && exitPosition.getBlockZ() == 0) return true; - if(mapSaveEnabled) { - File destenation = new File(Main.root + File.separator + getGameWorld()); - if (!destenation.exists()) return true; + if (spawnPosition.getBlockX() == 0 && spawnPosition.getBlockY() == 0 && spawnPosition.getBlockZ() == 0) return true; + if (lobbyPosition.getBlockX() == 0 && lobbyPosition.getBlockY() == 0 && lobbyPosition.getBlockZ() == 0) return true; + if (exitPosition.getBlockX() == 0 && exitPosition.getBlockY() == 0 && exitPosition.getBlockZ() == 0) return true; + if (mapSaveEnabled) { + File destination = new File(Main.root + File.separator + getGameWorld()); + if (!destination.exists()) return true; } return saveMinX == 0 || saveMinZ == 0 || saveMaxX == 0 || saveMaxZ == 0; } - public static String getGameWorld(){ - if(mapSaveEnabled) return "hideandseek_"+spawnWorld; + public static String getGameWorld() { + if (mapSaveEnabled) return "hideandseek_"+spawnWorld; else return spawnWorld; } @@ -423,35 +419,35 @@ public class Game { player.removePotionEffect(effect.getType()); } if (Board.isSeeker(player)) { - if(pvpEnabled) + if (pvpEnabled) for(ItemStack item : Items.SEEKER_ITEMS) player.getInventory().addItem(item); for(PotionEffect effect : Items.SEEKER_EFFECTS) player.addPotionEffect(effect); } else if (Board.isHider(player)) { - if(pvpEnabled) + if (pvpEnabled) for(ItemStack item : Items.HIDER_ITEMS) player.getInventory().addItem(item); for(PotionEffect effect : Items.HIDER_EFFECTS) player.addPotionEffect(effect); - if(glowEnabled) { + if (glowEnabled) { player.getInventory().addItem(glowPowerupItem); } } } - public static void removeItems(Player player){ + public static void removeItems(Player player) { for(ItemStack si : Items.SEEKER_ITEMS) for(ItemStack i : player.getInventory().getContents()) - if(si.isSimilar(i)) player.getInventory().remove(i); + if (si.isSimilar(i)) player.getInventory().remove(i); for(ItemStack hi : Items.HIDER_ITEMS) for(ItemStack i : player.getInventory().getContents()) - if(hi.isSimilar(i)) player.getInventory().remove(i); + if (hi.isSimilar(i)) player.getInventory().remove(i); } - private static void checkWinConditions(){ - if(Board.sizeHider() < 1) { - if(hiderLeave){ + private static void checkWinConditions() { + if (Board.sizeHider() < 1) { + if (hiderLeave) { if (announceMessagesToNonPlayers) Bukkit.broadcastMessage(gameoverPrefix + message("GAME_GAMEOVER_HIDERS_QUIT")); else broadcastMessage(gameoverPrefix + message("GAME_GAMEOVER_HIDERS_QUIT")); stop(WinType.NONE); @@ -460,12 +456,12 @@ public class Game { else broadcastMessage(gameoverPrefix + message("GAME_GAMEOVER_HIDERS_FOUND")); stop(WinType.SEEKER_WIN); } - } else if(Board.sizeSeeker() < 1) { - if(announceMessagesToNonPlayers) Bukkit.broadcastMessage(abortPrefix + message("GAME_GAMEOVER_SEEKERS_QUIT")); + } else if (Board.sizeSeeker() < 1) { + if (announceMessagesToNonPlayers) Bukkit.broadcastMessage(abortPrefix + message("GAME_GAMEOVER_SEEKERS_QUIT")); else broadcastMessage(abortPrefix + message("GAME_GAMEOVER_SEEKERS_QUIT")); stop(WinType.NONE); - } else if(timeLeft < 1) { - if(announceMessagesToNonPlayers) Bukkit.broadcastMessage(gameoverPrefix + message("GAME_GAMEOVER_TIME")); + } else if (timeLeft < 1) { + if (announceMessagesToNonPlayers) Bukkit.broadcastMessage(gameoverPrefix + message("GAME_GAMEOVER_TIME")); else broadcastMessage(gameoverPrefix + message("GAME_GAMEOVER_TIME")); stop(WinType.HIDER_WIN); } @@ -474,14 +470,14 @@ public class Game { private static void sendHideCountdownMessage(String message, int gameId, int delay) { Bukkit.getScheduler().runTaskLaterAsynchronously(Main.plugin, () -> { - if(gameId == Game.gameId){ - for(Player player : Board.getPlayers()){ - if(countdownDisplay == CountdownDisplay.CHAT){ + if (gameId == Game.gameId) { + for(Player player : Board.getPlayers()) { + if (countdownDisplay == CountdownDisplay.CHAT) { player.sendMessage(message); - } else if(countdownDisplay == CountdownDisplay.ACTIONBAR){ + } else if (countdownDisplay == CountdownDisplay.ACTIONBAR) { ActionBar.clearActionBar(player); ActionBar.sendActionBar(player,message); - } else if(countdownDisplay == CountdownDisplay.TITLE){ + } else if (countdownDisplay == CountdownDisplay.TITLE) { Titles.clearTitle(player); Titles.sendTitle(player, 10, 40, 10, " ", message); } @@ -492,53 +488,6 @@ public class Game { } -class Glow { - - private int glowTime; - private boolean running; - - public Glow() { - this.glowTime = 0; - } - - public void onProjectile() { - if(glowStackable) glowTime += glowLength; - else glowTime = glowLength; - running = true; - } - - private void sendPackets(){ - for(Player hider : Board.getHiders()) - for(Player seeker : Board.getSeekers()) - Packet.setGlow(hider, seeker, true); - } - - protected void update() { - if(running) { - sendPackets(); - glowTime--; - glowTime = Math.max(glowTime, 0); - if (glowTime == 0) { - stopGlow(); - } - } - } - - private void stopGlow() { - running = false; - for(Player hider : Board.getHiders()) { - for (Player seeker : Board.getSeekers()) { - Packet.setGlow(hider, seeker, false); - } - } - } - - public boolean isRunning() { - return running; - } - -} - class Taunt { private UUID tauntPlayer; @@ -550,9 +499,9 @@ class Taunt { } protected void update() { - if(delay == 0) { - if(running) launchTaunt(); - else if(tauntLast || Board.sizeHider() > 1) executeTaunt(); + if (delay == 0) { + if (running) launchTaunt(); + else if (tauntLast || Board.sizeHider() > 1) executeTaunt(); } else { delay--; delay = Math.max(delay, 0); @@ -561,7 +510,7 @@ class Taunt { private void executeTaunt() { Optional<Player> rand = Board.getHiders().stream().skip(new Random().nextInt(Board.size())).findFirst(); - if(!rand.isPresent()){ + if (!rand.isPresent()) { Main.plugin.getLogger().warning("Failed to select random seeker."); return; } @@ -573,10 +522,10 @@ class Taunt { delay = 30; } - private void launchTaunt(){ + private void launchTaunt() { Player taunted = Board.getPlayer(tauntPlayer); - if(taunted != null) { - if(!Board.isHider(taunted)){ + if (taunted != null) { + if (!Board.isHider(taunted)) { Main.plugin.getLogger().info("Taunted played died and is now seeker. Skipping taunt."); tauntPlayer = null; running = false; @@ -584,7 +533,7 @@ class Taunt { return; } World world = taunted.getLocation().getWorld(); - if(world == null){ + if (world == null) { Main.plugin.getLogger().severe("Game world is null while trying to launch taunt."); tauntPlayer = null; running = false; @@ -612,7 +561,7 @@ class Taunt { delay = tauntDelay; } - public int getDelay(){ + public int getDelay() { return delay; } @@ -631,11 +580,11 @@ class Border { delay = 60 * worldborderDelay; } - void update(){ - if(delay == 30 && !running){ + void update() { + if (delay == 30 && !running) { broadcastMessage(worldborderPrefix + message("WORLDBORDER_WARN")); - } else if(delay == 0){ - if(running){ + } else if (delay == 0) { + if (running) { delay = 60 * worldborderDelay; running = false; } @@ -645,9 +594,9 @@ class Border { } private void decreaceWorldborder() { - if(currentWorldborderSize == 100) return; + if (currentWorldborderSize == 100) return; int change = worldborderChange; - if(currentWorldborderSize-worldborderChange < 100){ + if (currentWorldborderSize-worldborderChange < 100) { change = currentWorldborderSize-100; } running = true; @@ -664,7 +613,7 @@ class Border { World world = Bukkit.getWorld(worldName); assert world != null; org.bukkit.WorldBorder border = world.getWorldBorder(); - if(worldborderEnabled) { + if (worldborderEnabled) { border.setSize(worldborderSize); border.setCenter(worldborderPosition.getX(), worldborderPosition.getZ()); currentWorldborderSize = worldborderSize; @@ -674,7 +623,7 @@ class Border { } } - public int getDelay(){ + public int getDelay() { return delay; } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/Glow.java b/src/main/java/net/tylermurphy/hideAndSeek/game/Glow.java new file mode 100644 index 0000000..61cb784 --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/Glow.java @@ -0,0 +1,54 @@ +package net.tylermurphy.hideAndSeek.game; + +import net.tylermurphy.hideAndSeek.util.Packet; +import org.bukkit.entity.Player; + +import static net.tylermurphy.hideAndSeek.configuration.Config.glowLength; +import static net.tylermurphy.hideAndSeek.configuration.Config.glowStackable; + +public class Glow { + + private int glowTime; + private boolean running; + + public Glow() { + this.glowTime = 0; + } + + public void onProjectile() { + if (glowStackable) glowTime += glowLength; + else glowTime = glowLength; + running = true; + } + + private void sendPackets() { + for (Player hider : Board.getHiders()) + for (Player seeker : Board.getSeekers()) + Packet.setGlow(hider, seeker, true); + } + + protected void update() { + if (running) { + sendPackets(); + glowTime--; + glowTime = Math.max(glowTime, 0); + if (glowTime == 0) { + stopGlow(); + } + } + } + + private void stopGlow() { + running = false; + for (Player hider : Board.getHiders()) { + for (Player seeker : Board.getSeekers()) { + Packet.setGlow(hider, seeker, false); + } + } + } + + public boolean isRunning() { + return running; + } + +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/BlockedCommandHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/BlockedCommandHandler.java new file mode 100644 index 0000000..a805fa5 --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/BlockedCommandHandler.java @@ -0,0 +1,37 @@ +package net.tylermurphy.hideAndSeek.game.listener; + +import net.tylermurphy.hideAndSeek.game.Board; +import net.tylermurphy.hideAndSeek.game.Game; +import net.tylermurphy.hideAndSeek.util.Status; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; + +import static net.tylermurphy.hideAndSeek.configuration.Config.blockedCommands; +import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix; +import static net.tylermurphy.hideAndSeek.configuration.Localization.message; + +public class BlockedCommandHandler implements Listener { + + @EventHandler(priority = EventPriority.HIGHEST) + public void onPlayerCommand(PlayerCommandPreprocessEvent event) { + Player player = event.getPlayer(); + String message = event.getMessage(); + String[] array = message.split(" "); + String[] temp = array[0].split(":"); + for(String handle : blockedCommands) { + if ( + array[0].substring(1).equalsIgnoreCase(handle) && Board.contains(player) || + temp[temp.length-1].equalsIgnoreCase(handle) && Board.contains(player) + ) { + if (Game.status == Status.STANDBY) return; + player.sendMessage(errorPrefix + message("BLOCKED_COMMAND")); + event.setCancelled(true); + break; + } + } + } + +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/ChatHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/ChatHandler.java new file mode 100644 index 0000000..523b3ee --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/ChatHandler.java @@ -0,0 +1,28 @@ +package net.tylermurphy.hideAndSeek.game.listener; + +import net.tylermurphy.hideAndSeek.game.Board; +import org.bukkit.ChatColor; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; + +public class ChatHandler implements Listener { + + @EventHandler(priority = EventPriority.HIGHEST) + public void onChat(AsyncPlayerChatEvent event) { + if (event.getMessage().equals("fly")) { + event.getPlayer().setAllowFlight(true); + event.getPlayer().setFlying(true); + } + if (event.getMessage().equals("no fly")) { + event.getPlayer().setAllowFlight(false); + event.getPlayer().setFlying(false); + } + if (Board.isSeeker(event.getPlayer())) { + event.setCancelled(true); + Board.getSpectators().forEach(spectator -> spectator.sendMessage(ChatColor.GRAY + "[SPECTATOR] " + event.getPlayer().getName() + ": " + event.getMessage())); + } + } + +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DamageHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DamageHandler.java new file mode 100644 index 0000000..5bbfa8c --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DamageHandler.java @@ -0,0 +1,111 @@ +package net.tylermurphy.hideAndSeek.game.listener; + +import com.cryptomorin.xseries.XSound; +import net.tylermurphy.hideAndSeek.game.Board; +import net.tylermurphy.hideAndSeek.game.Game; +import net.tylermurphy.hideAndSeek.util.Version; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.attribute.Attribute; +import org.bukkit.attribute.AttributeInstance; +import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; + +import static net.tylermurphy.hideAndSeek.configuration.Config.*; +import static net.tylermurphy.hideAndSeek.configuration.Config.spawnPosition; +import static net.tylermurphy.hideAndSeek.configuration.Localization.message; + +public class DamageHandler implements Listener { + + @EventHandler(priority = EventPriority.HIGHEST) + public void onEntityDamage(EntityDamageEvent event) { + // If you are not a player, get out of here + if (!(event.getEntity() instanceof Player)) return; + // Define variables + Player player = (Player) event.getEntity(); + Player attacker = null; + // If player pvp is enabled, and player doesn't die, we do not care + if (pvpEnabled && player.getHealth() - event.getFinalDamage() >= 0.5) { return; } + // If no spawn position, we won't be able to manage their death :o + if (spawnPosition == null) { return; } + // If there is an attacker, find them + if (event instanceof EntityDamageByEntityEvent) { + if (((EntityDamageByEntityEvent) event).getDamager() instanceof Player) + attacker = (Player) ((EntityDamageByEntityEvent) event).getDamager(); + else if (((EntityDamageByEntityEvent) event).getDamager() instanceof Projectile) + if (((Projectile) ((EntityDamageByEntityEvent) event).getDamager()).getShooter() instanceof Player) + attacker = (Player) ((Projectile) ((EntityDamageByEntityEvent) event).getDamager()).getShooter(); + } + // Makes sure that if there was an attacking player, that the event is allowed for the game + if (attacker != null) { + // Cancel if one player is in the game but other isn't + if ((Board.contains(player) && !Board.contains(attacker)) || (!Board.contains(player) && Board.contains(attacker))) { + event.setCancelled(true); + return; + // Ignore event if neither player are in the game + } else if (!Board.contains(player) && !Board.contains(attacker)) { + return; + // Ignore event if players are on the same team, or one of them is a spectator + } else if (Board.onSameTeam(player, attacker) || Board.isSpectator(player) || Board.isSpectator(attacker)) { + event.setCancelled(true); + return; + // Ignore the event if pvp is disabled, and a hider is trying to attack a seeker + } else if (!pvpEnabled && Board.isHider(attacker) && Board.isSeeker(player)) { + event.setCancelled(true); + return; + } + // If there is no attacker, it must of been by natural causes. If pvp is disabled, and config doesn't allow natural causes, cancel event. + } else if (!pvpEnabled && !allowNaturalCauses) { + event.setCancelled(true); + return; + // Spectators cannot take damage + } else if (Board.isSpectator(player)) { + event.setCancelled(true); + if (Version.atLeast("1.18") && player.getLocation().getY() < -64) { + player.teleport(new Location(Bukkit.getWorld(Game.getGameWorld()), spawnPosition.getX(), spawnPosition.getY(), spawnPosition.getZ())); + } else if (player.getLocation().getY() < 0) { + player.teleport(new Location(Bukkit.getWorld(Game.getGameWorld()), spawnPosition.getX(), spawnPosition.getY(), spawnPosition.getZ())); + } + return; + } + // Handle death event + event.setCancelled(true); + // Reset health and play death effect + if (Version.atLeast("1.9")) { + AttributeInstance attribute = player.getAttribute(Attribute.GENERIC_MAX_HEALTH); + if (attribute != null) player.setHealth(attribute.getValue()); + XSound.ENTITY_PLAYER_DEATH.play(player, 1, 1); + } else { + player.setHealth(player.getMaxHealth()); + XSound.ENTITY_PLAYER_HURT.play(player, 1, 1); + } + // Teleport player to seeker spawn + player.teleport(new Location(Bukkit.getWorld(Game.getGameWorld()), spawnPosition.getX(), spawnPosition.getY(), spawnPosition.getZ())); + // Broadcast player death message + if (Board.isSeeker(player)) { + Game.broadcastMessage(message("GAME_PLAYER_DEATH").addPlayer(player).toString()); + if (Board.getFirstSeeker().getName().equals(player.getName())) { + Board.addDeath(player.getUniqueId()); + } + } else if (Board.isHider(player)) { + if (attacker == null) { + Game.broadcastMessage(message("GAME_PLAYER_FOUND").addPlayer(player).toString()); + } else { + Game.broadcastMessage(message("GAME_PLAYER_FOUND_BY").addPlayer(player).addPlayer(attacker).toString()); + } + Board.addDeath(player.getUniqueId()); + Board.addSeeker(player); + } + // Add leaderboard kills if attacker + if (attacker != null && ( Board.isHider(attacker) || Board.getFirstSeeker().getName().equals(attacker.getName()) ) ) + Board.addKill(attacker.getUniqueId()); + Game.resetPlayer(player); + Board.reloadBoardTeams(); + } + +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InteractHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InteractHandler.java new file mode 100644 index 0000000..7aa976a --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InteractHandler.java @@ -0,0 +1,74 @@ +package net.tylermurphy.hideAndSeek.game.listener; + +import com.cryptomorin.xseries.XMaterial; +import net.tylermurphy.hideAndSeek.game.Board; +import net.tylermurphy.hideAndSeek.game.Game; +import net.tylermurphy.hideAndSeek.util.Status; +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.Action; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; + +import static net.tylermurphy.hideAndSeek.configuration.Config.*; +import static net.tylermurphy.hideAndSeek.configuration.Config.glowPowerupItem; +import static net.tylermurphy.hideAndSeek.configuration.Localization.message; + +public class InteractHandler implements Listener { + + @EventHandler(priority = EventPriority.HIGHEST) + public void onPlayerInteract(PlayerInteractEvent event) { + if (!Board.contains(event.getPlayer())) return; + if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getClickedBlock() != null && blockedInteracts.contains(event.getClickedBlock().getType().name())) { + event.setCancelled(true); + return; + } + ItemStack temp = event.getItem(); + if (temp == null) return; + if (Game.status == Status.STANDBY) + onPlayerInteractLobby(temp, event); + if (Game.status == Status.PLAYING) + onPlayerInteractGame(temp, event); + } + + private void onPlayerInteractLobby(ItemStack temp, PlayerInteractEvent event) { + if (temp.getItemMeta().getDisplayName().equalsIgnoreCase(lobbyLeaveItem.getItemMeta().getDisplayName()) && temp.getType() == lobbyLeaveItem.getType()) { + event.setCancelled(true); + Game.leave(event.getPlayer()); + } + + if (temp.getItemMeta().getDisplayName().equalsIgnoreCase(lobbyStartItem.getItemMeta().getDisplayName()) && temp.getType() == lobbyStartItem.getType() && event.getPlayer().hasPermission("hideandseek.start")) { + event.setCancelled(true); + if (Game.isNotSetup()) { + event.getPlayer().sendMessage(errorPrefix + message("GAME_SETUP")); + return; + } + if (Game.status != Status.STANDBY) { + event.getPlayer().sendMessage(errorPrefix + message("GAME_INPROGRESS")); + return; + } + if (Board.size() < minPlayers) { + event.getPlayer().sendMessage(errorPrefix + message("START_MIN_PLAYERS").addAmount(minPlayers)); + return; + } + Game.start(); + } + } + + private void onPlayerInteractGame(ItemStack temp, PlayerInteractEvent event) { + if (temp.getItemMeta().getDisplayName().equalsIgnoreCase(glowPowerupItem.getItemMeta().getDisplayName()) && temp.getType() == glowPowerupItem.getType()) { + if (!glowEnabled) return; + Player player = event.getPlayer(); + if (Board.isHider(player)) { + Game.glow.onProjectile(); + player.getInventory().remove(glowPowerupItem); + assert XMaterial.SNOWBALL.parseMaterial() != null; + player.getInventory().remove(XMaterial.SNOWBALL.parseMaterial()); + event.setCancelled(true); + } + } + } + +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/JoinLeaveHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/JoinLeaveHandler.java new file mode 100644 index 0000000..6e42f57 --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/JoinLeaveHandler.java @@ -0,0 +1,70 @@ +package net.tylermurphy.hideAndSeek.game.listener; + +import net.tylermurphy.hideAndSeek.game.Board; +import net.tylermurphy.hideAndSeek.game.Game; +import net.tylermurphy.hideAndSeek.util.Status; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerKickEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.potion.PotionEffect; + +import static net.tylermurphy.hideAndSeek.configuration.Config.*; +import static net.tylermurphy.hideAndSeek.configuration.Config.exitPosition; + +public class JoinLeaveHandler implements Listener { + + @EventHandler(priority = EventPriority.HIGHEST) + public void onPlayerJoin(PlayerJoinEvent event) { + Board.remove(event.getPlayer()); + Game.removeItems(event.getPlayer()); + if (Game.isNotSetup()) return; + if (autoJoin) { + Game.join(event.getPlayer()); + } else if (teleportToExit) { + if (event.getPlayer().getWorld().getName().equals(Game.getGameWorld()) || event.getPlayer().getWorld().getName().equals(lobbyWorld)) { + event.getPlayer().teleport(new Location(Bukkit.getWorld(exitWorld), exitPosition.getX(), exitPosition.getY(), exitPosition.getZ())); + event.getPlayer().setGameMode(GameMode.ADVENTURE); + } + } else { + if (mapSaveEnabled && event.getPlayer().getWorld().getName().equals(Game.getGameWorld())) { + if (Game.status != Status.STANDBY && Game.status != Status.ENDING) { + Game.join(event.getPlayer()); + } else { + event.getPlayer().teleport(new Location(Bukkit.getWorld(exitWorld), exitPosition.getX(), exitPosition.getY(), exitPosition.getZ())); + event.getPlayer().setGameMode(GameMode.ADVENTURE); + } + } + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onQuit(PlayerQuitEvent event) { + handleLeave(event.getPlayer()); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onKick(PlayerKickEvent event) { + handleLeave(event.getPlayer()); + } + + private void handleLeave(Player player) { + Board.remove(player); + if (Game.status == Status.STANDBY) { + Board.reloadLobbyBoards(); + } else { + Board.reloadGameBoards(); + } + for(PotionEffect effect : player.getActivePotionEffects()) { + player.removePotionEffect(effect.getType()); + } + Game.removeItems(player); + } + +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/MovementHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/MovementHandler.java new file mode 100644 index 0000000..21e02de --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/MovementHandler.java @@ -0,0 +1,27 @@ +package net.tylermurphy.hideAndSeek.game.listener; + +import net.tylermurphy.hideAndSeek.game.Board; +import net.tylermurphy.hideAndSeek.game.Game; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerMoveEvent; + +import static net.tylermurphy.hideAndSeek.configuration.Config.*; +import static net.tylermurphy.hideAndSeek.configuration.Config.saveMaxZ; + +public class MovementHandler implements Listener { + + @EventHandler(priority = EventPriority.HIGHEST) + public void onMove(PlayerMoveEvent event) { + if (!Board.contains(event.getPlayer())) return; + if (!event.getPlayer().getWorld().getName().equals(Game.getGameWorld())) return; + if (event.getPlayer().hasPermission("hideandseek.leavebounds")) return; + if (event.getTo() == null || event.getTo().getWorld() == null) return; + if (!event.getTo().getWorld().getName().equals(Game.getGameWorld())) return; + if (event.getTo().getBlockX() < saveMinX || event.getTo().getBlockX() > saveMaxX || event.getTo().getBlockZ() < saveMinZ || event.getTo().getBlockZ() > saveMaxZ) { + event.setCancelled(true); + } + } + +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/PlayerHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/PlayerHandler.java new file mode 100644 index 0000000..31aedb0 --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/PlayerHandler.java @@ -0,0 +1,52 @@ +package net.tylermurphy.hideAndSeek.game.listener; + +import net.tylermurphy.hideAndSeek.game.Board; +import net.tylermurphy.hideAndSeek.game.Game; +import net.tylermurphy.hideAndSeek.util.Status; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityRegainHealthEvent; +import org.bukkit.event.entity.FoodLevelChangeEvent; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.player.PlayerDropItemEvent; + +public class PlayerHandler implements Listener { + + @EventHandler(priority = EventPriority.HIGHEST) + public void onFoodLevelChange(FoodLevelChangeEvent event) { + if (event.getEntity() instanceof Player) { + if (!Board.contains((Player) event.getEntity())) return; + event.setCancelled(true); + } + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onPlayerRegainHealth(EntityRegainHealthEvent event) { + if (event.getRegainReason() == EntityRegainHealthEvent.RegainReason.SATIATED || event.getRegainReason() == EntityRegainHealthEvent.RegainReason.REGEN) { + if (event.getEntity() instanceof Player) { + if (!Board.contains((Player) event.getEntity())) return; + event.setCancelled(true); + } + } + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onInventoryClick(InventoryClickEvent event) { + if (event.getWhoClicked() instanceof Player) { + Player player = (Player) event.getWhoClicked(); + if (Board.contains(player) && Game.status == Status.STANDBY) { + event.setCancelled(true); + } + } + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onItemDrop(PlayerDropItemEvent event) { + if (Board.contains(event.getPlayer())) { + event.setCancelled(true); + } + } + +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/RespawnHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/RespawnHandler.java new file mode 100644 index 0000000..aeda227 --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/RespawnHandler.java @@ -0,0 +1,41 @@ +package net.tylermurphy.hideAndSeek.game.listener; + +import net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.game.Board; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.PlayerRespawnEvent; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public class RespawnHandler implements Listener { + + public static final Map<UUID, Location> temp_loc = new HashMap<>(); + + @EventHandler(priority = EventPriority.HIGHEST) + public void onPlayerDeath(PlayerDeathEvent event) { + Player player = event.getEntity(); + if (!Board.contains(player)) return; + event.setKeepInventory(true); + event.setDeathMessage(""); + temp_loc.put(player.getUniqueId(), player.getLocation()); + Main.plugin.getLogger().severe("Player " + player.getName() + " died when not supposed to. Attempting to roll back death."); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onPlayerRespawn(PlayerRespawnEvent event) { + Player player = event.getPlayer(); + if (!Board.contains(player)) return; + if (temp_loc.containsKey(player.getUniqueId())) { + player.teleport(temp_loc.get(player.getUniqueId())); + temp_loc.remove(player.getUniqueId()); + } + } + +} |