diff options
author | Tyler Murphy <tylermurphy534@gmail.com> | 2022-05-13 21:17:46 -0400 |
---|---|---|
committer | Tyler Murphy <tylermurphy534@gmail.com> | 2022-05-13 21:17:46 -0400 |
commit | ea8f76493141717296e1f59fbdab21c39f1937be (patch) | |
tree | 3d6ceeb5baf90f857b88d8a09fc9a07caddf75ce /src/main/java/net/tylermurphy/hideAndSeek/game | |
parent | Merge pull request #53 from bobby29831/1.4.3 (diff) | |
download | kenshinshideandseek-ea8f76493141717296e1f59fbdab21c39f1937be.tar.gz kenshinshideandseek-ea8f76493141717296e1f59fbdab21c39f1937be.tar.bz2 kenshinshideandseek-ea8f76493141717296e1f59fbdab21c39f1937be.zip |
refactor and encapsulate classes
Diffstat (limited to 'src/main/java/net/tylermurphy/hideAndSeek/game')
20 files changed, 827 insertions, 694 deletions
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java b/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java index 75d2a7d..41950a1 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java @@ -19,8 +19,12 @@ package net.tylermurphy.hideAndSeek.game; -import net.tylermurphy.hideAndSeek.util.Status; -import net.tylermurphy.hideAndSeek.util.Version; +import net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.game.events.Border; +import net.tylermurphy.hideAndSeek.game.events.Glow; +import net.tylermurphy.hideAndSeek.game.events.Taunt; +import net.tylermurphy.hideAndSeek.game.util.Status; +import net.tylermurphy.hideAndSeek.game.util.Version; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; @@ -35,110 +39,110 @@ 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<>(); - private static final Map<String, Player> playerList = new HashMap<>(); - 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<>(); + private final List<String> Hider = new ArrayList<>(), Seeker = new ArrayList<>(), Spectator = new ArrayList<>(); + private final Map<String, Player> playerList = new HashMap<>(); + private final Map<String, CustomBoard> customBoards = new HashMap<>(); + private final Map<String, Integer> hider_kills = new HashMap<>(), seeker_kills = new HashMap<>(), hider_deaths = new HashMap<>(), seeker_deaths = new HashMap<>(); - public static boolean contains(Player player) { + public boolean contains(Player player) { return playerList.containsKey(player.getUniqueId().toString()); } - public static boolean contains(CommandSender sender) { + public boolean contains(CommandSender sender) { return contains((Player) sender); } - public static boolean isHider(Player player) { + public boolean isHider(Player player) { return Hider.contains(player.getUniqueId().toString()); } - public static boolean isHider(UUID uuid) { + public boolean isHider(UUID uuid) { return Hider.contains(uuid.toString()); } - public static boolean isSeeker(Player player) { + public boolean isSeeker(Player player) { return Seeker.contains(player.getUniqueId().toString()); } - public static boolean isSeeker(UUID uuid) { + public boolean isSeeker(UUID uuid) { return Seeker.contains(uuid.toString()); } - public static boolean isSpectator(Player player) { + public boolean isSpectator(Player player) { return Spectator.contains(player.getUniqueId().toString()); } - public static int sizeHider() { + public int sizeHider() { return Hider.size(); } - public static int sizeSeeker() { + public int sizeSeeker() { return Seeker.size(); } - public static int size() { + public int size() { return playerList.values().size(); } - public static List<Player> getHiders() { + public List<Player> getHiders() { return Hider.stream().map(playerList::get).collect(Collectors.toList()); } - public static List<Player> getSeekers() { + public List<Player> getSeekers() { return Seeker.stream().map(playerList::get).collect(Collectors.toList()); } - public static Player getFirstSeeker() { + public Player getFirstSeeker() { return playerList.get(Seeker.get(0)); } - public static List<Player> getSpectators() { + public List<Player> getSpectators() { return Spectator.stream().map(playerList::get).collect(Collectors.toList()); } - public static List<Player> getPlayers() { + public List<Player> getPlayers() { return new ArrayList<>(playerList.values()); } - public static Player getPlayer(UUID uuid) { + public Player getPlayer(UUID uuid) { return playerList.get(uuid.toString()); } - public static void addHider(Player player) { + public void addHider(Player player) { Hider.add(player.getUniqueId().toString()); Seeker.remove(player.getUniqueId().toString()); Spectator.remove(player.getUniqueId().toString()); playerList.put(player.getUniqueId().toString(), player); } - public static void addSeeker(Player player) { + public void addSeeker(Player player) { Hider.remove(player.getUniqueId().toString()); Seeker.add(player.getUniqueId().toString()); Spectator.remove(player.getUniqueId().toString()); playerList.put(player.getUniqueId().toString(), player); } - public static void addSpectator(Player player) { + public void addSpectator(Player player) { Hider.remove(player.getUniqueId().toString()); Seeker.remove(player.getUniqueId().toString()); Spectator.add(player.getUniqueId().toString()); playerList.put(player.getUniqueId().toString(), player); } - public static void remove(Player player) { + public void remove(Player player) { Hider.remove(player.getUniqueId().toString()); Seeker.remove(player.getUniqueId().toString()); Spectator.remove(player.getUniqueId().toString()); playerList.remove(player.getUniqueId().toString()); } - public static boolean onSameTeam(Player player1, Player player2) { + public 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; else return Spectator.contains(player1.getUniqueId().toString()) && Spectator.contains(player2.getUniqueId().toString()); } - public static void reload() { + public void reload() { Hider.clear(); Seeker.clear(); Spectator.clear(); @@ -148,7 +152,7 @@ public class Board { seeker_deaths.clear(); } - public static void addKill(UUID uuid) { + public 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); @@ -164,7 +168,7 @@ public class Board { } } - public static void addDeath(UUID uuid) { + public 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); @@ -180,24 +184,24 @@ public class Board { } } - public static Map<String, Integer> getHiderKills() { + public Map<String, Integer> getHiderKills() { return new HashMap<>(hider_kills); } - public static Map<String, Integer> getSeekerKills() { + public Map<String, Integer> getSeekerKills() { return new HashMap<>(seeker_kills); } - public static Map<String, Integer> getHiderDeaths() { + public Map<String, Integer> getHiderDeaths() { return new HashMap<>(hider_deaths); } - public static Map<String, Integer> getSeekerDeaths() { + public Map<String, Integer> getSeekerDeaths() { return new HashMap<>(seeker_deaths); } - public static void createLobbyBoard(Player player) { + public void createLobbyBoard(Player player) { createLobbyBoard(player, true); } - private static void createLobbyBoard(Player player, boolean recreate) { + private void createLobbyBoard(Player player, boolean recreate) { CustomBoard board = customBoards.get(player.getUniqueId().toString()); if (recreate) { board = new CustomBoard(player, LOBBY_TITLE); @@ -210,10 +214,10 @@ public class Board { } else if (line.contains("{COUNTDOWN}")) { if (!lobbyCountdownEnabled) { board.setLine(String.valueOf(i), line.replace("{COUNTDOWN}", COUNTDOWN_ADMINSTART)); - } else if (Game.countdownTime == -1) { + } else if (Main.getInstance().getGame().getLobbyTime() == -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+""))); + board.setLine(String.valueOf(i), line.replace("{COUNTDOWN}", COUNTDOWN_COUNTING.replace("{AMOUNT}",Main.getInstance().getGame().getLobbyTime()+""))); } } else if (line.contains("{COUNT}")) { board.setLine(String.valueOf(i), line.replace("{COUNT}", getPlayers().size()+"")); @@ -230,51 +234,59 @@ public class Board { customBoards.put(player.getUniqueId().toString(), board); } - public static void createGameBoard(Player player) { + public void createGameBoard(Player player) { createGameBoard(player, true); } - private static void createGameBoard(Player player, boolean recreate) { + private void createGameBoard(Player player, boolean recreate) { CustomBoard board = customBoards.get(player.getUniqueId().toString()); if (recreate) { board = new CustomBoard(player, GAME_TITLE); board.updateTeams(); } + + int timeLeft = Main.getInstance().getGame().getTimeLeft(); + Status status = Main.getInstance().getGame().getStatus(); + + Taunt taunt = Main.getInstance().getGame().getTaunt(); + Border worldBorder = Main.getInstance().getGame().getBorder(); + Glow glow = Main.getInstance().getGame().getGlow(); + int i = 0; for(String line : GAME_CONTENTS) { if (line.equalsIgnoreCase("")) { board.addBlank(); } else { if (line.contains("{TIME}")) { - String value = Game.timeLeft/60 + "m" + Game.timeLeft%60 + "s"; + String value = timeLeft/60 + "m" + timeLeft%60 + "s"; board.setLine(String.valueOf(i), line.replace("{TIME}", value)); } 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) { + if (worldBorder == null || status == Status.STARTING) { board.setLine(String.valueOf(i), line.replace("{BORDER}", BORDER_COUNTING.replace("{AMOUNT}", "0"))); - } 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 if (!worldBorder.isRunning()) { + board.setLine(String.valueOf(i), line.replace("{BORDER}", BORDER_COUNTING.replaceFirst("\\{AMOUNT}", worldBorder.getDelay()/60+"").replaceFirst("\\{AMOUNT}", 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) { + if (taunt == null || status == Status.STARTING) { board.setLine(String.valueOf(i), line.replace("{TAUNT}", TAUNT_COUNTING.replace("{AMOUNT}", "0"))); } else if (!tauntLast && Hider.size() == 1) { board.setLine(String.valueOf(i), line.replace("{TAUNT}", TAUNT_EXPIRED)); - } 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 if (!taunt.isRunning()) { + board.setLine(String.valueOf(i), line.replace("{TAUNT}", TAUNT_COUNTING.replaceFirst("\\{AMOUNT}", taunt.getDelay() / 60 + "").replaceFirst("\\{AMOUNT}", 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()) { + if (glow == null || status == Status.STARTING || !glow.isRunning()) { board.setLine(String.valueOf(i), line.replace("{GLOW}", GLOW_INACTIVE)); } else { board.setLine(String.valueOf(i), line.replace("{GLOW}", GLOW_ACTIVE)); @@ -293,50 +305,50 @@ public class Board { customBoards.put(player.getUniqueId().toString(), board); } - public static void removeBoard(Player player) { + public void removeBoard(Player player) { ScoreboardManager manager = Bukkit.getScoreboardManager(); assert manager != null; player.setScoreboard(manager.getMainScoreboard()); customBoards.remove(player.getUniqueId().toString()); } - public static void reloadLobbyBoards() { + public void reloadLobbyBoards() { for(Player player : playerList.values()) createLobbyBoard(player, false); } - public static void reloadGameBoards() { + public void reloadGameBoards() { for(Player player : playerList.values()) createGameBoard(player, false); } - public static void reloadBoardTeams() { + public void reloadBoardTeams() { for(CustomBoard board : customBoards.values()) board.updateTeams(); } - private static String getSeekerPercent() { + private String getSeekerPercent() { if (playerList.values().size() < 2) return " --"; else return " "+(int)(100*(1.0/playerList.size())); } - private static String getHiderPercent() { + private String getHiderPercent() { if (playerList.size() < 2) return " --"; else return " "+(int)(100-100*(1.0/playerList.size())); } - private static String getTeam(Player player) { + private 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(); else return ChatColor.WHITE + "UNKNOWN"; } - public static void cleanup() { + public void cleanup() { playerList.clear(); Hider.clear(); Seeker.clear(); @@ -380,13 +392,13 @@ class CustomBoard { assert hiderTeam != null; for(String entry : hiderTeam.getEntries()) hiderTeam.removeEntry(entry); - for(Player player : Board.getHiders()) + for(Player player : Main.getInstance().getBoard().getHiders()) hiderTeam.addEntry(player.getName()); Team seekerTeam = board.getTeam("Seeker"); assert seekerTeam != null; for(String entry : seekerTeam.getEntries()) seekerTeam.removeEntry(entry); - for(Player player : Board.getSeekers()) + for(Player player : Main.getInstance().getBoard().getSeekers()) seekerTeam.addEntry(player.getName()); if (Version.atLeast("1.9")) { if (nametagsVisible) { diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/CommandHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/CommandHandler.java deleted file mode 100644 index b7b2dad..0000000 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/CommandHandler.java +++ /dev/null @@ -1,90 +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 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 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 final Map<String,ICommand> COMMAND_REGISTER = new LinkedHashMap<>(); - - private static void registerCommand(ICommand command) { - if (!COMMAND_REGISTER.containsKey(command.getLabel())) { - COMMAND_REGISTER.put(command.getLabel().toLowerCase(), command); - } - } - - public static void registerCommands() { - registerCommand(new About()); - registerCommand(new Help()); - registerCommand(new Setup()); - registerCommand(new Start()); - registerCommand(new Stop()); - registerCommand(new SetSpawnLocation()); - registerCommand(new SetLobbyLocation()); - registerCommand(new SetExitLocation()); - registerCommand(new SetBorder()); - registerCommand(new Reload()); - registerCommand(new SaveMap()); - registerCommand(new SetBounds()); - registerCommand(new Join()); - registerCommand(new Leave()); - registerCommand(new Top()); - registerCommand(new Wins()); - } - - public static boolean handleCommand(CommandSender sender, String[] args) { - 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")) { - 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) { - sender.sendMessage(errorPrefix + message("MAPSAVE_INPROGRESS")); - } else if (permissionsRequired && !sender.hasPermission("hideandseek."+args[0].toLowerCase())) { - sender.sendMessage(errorPrefix + message("COMMAND_NOT_ALLOWED")); - } else { - try { - COMMAND_REGISTER.get(args[0].toLowerCase()).execute(sender,Arrays.copyOfRange(args, 1, args.length)); - } catch (Exception e) { - sender.sendMessage(errorPrefix + "An error has occured."); - e.printStackTrace(); - } - } - } - return true; - } - -} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java b/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java index 83b304d..e33e503 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java @@ -23,24 +23,16 @@ 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.events.Border; +import net.tylermurphy.hideAndSeek.game.events.Glow; +import net.tylermurphy.hideAndSeek.game.events.Taunt; import net.tylermurphy.hideAndSeek.game.listener.RespawnHandler; -import net.tylermurphy.hideAndSeek.util.*; +import net.tylermurphy.hideAndSeek.game.util.*; import net.tylermurphy.hideAndSeek.world.WorldLoader; import org.bukkit.*; -import org.bukkit.attribute.Attribute; -import org.bukkit.attribute.AttributeInstance; import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Firework; import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.FireworkMeta; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionEffectType; import java.io.File; import java.util.*; @@ -48,303 +40,239 @@ import java.util.stream.Collectors; 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 { - public static Taunt taunt; - public static Glow glow; - public static Border worldBorder; - public static WorldLoader worldLoader; - public static int tick = 0; - public static int countdownTime = -1; - public static int gameId = 0; - public static int timeLeft = 0; - public static Status status = Status.STANDBY; + private final Taunt taunt; + private final Glow glow; + private final Border worldBorder; + private final WorldLoader worldLoader; - private static boolean hiderLeave = false; + private final Board board; - static { - worldLoader = new WorldLoader(spawnWorld); + private Status status; + + private int gameTick; + private int lobbyTimer; + private int startingTimer; + private int gameTimer; + private boolean hiderLeft; + + public Game(Board board){ + this.taunt = new Taunt(); + this.glow = new Glow(); + this.worldBorder = new Border(); + this.worldLoader = new WorldLoader(spawnWorld); + + this.status = Status.STANDBY; + + this.board = board; + + this.gameTick = 0; + this.lobbyTimer = -1; + this.startingTimer = -1; + this.gameTimer = 0; + this.hiderLeft = false; } - public static void start() { - Optional<Player> rand = Board.getPlayers().stream().skip(new Random().nextInt(Board.size())).findFirst(); - 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) { - Main.plugin.getLogger().warning("Failed to select random seeker."); - return; - } - Player seeker = Board.getPlayer(temp.getUniqueId()); - if (seeker == null) { - Main.plugin.getLogger().warning("Failed to select random seeker."); - return; - } - start(seeker); + public Status getStatus(){ + return status; } - public static void start(Player seeker) { - if (status == Status.STARTING || status == Status.PLAYING) return; - if (mapSaveEnabled && worldLoader.getWorld() != null) { - worldLoader.rollback(); - } else if (mapSaveEnabled) { - worldLoader.loadMap(); - } - Board.reload(); - for(Player temp : Board.getPlayers()) { - if (temp.getName().equals(seeker.getName())) - continue; - Board.addHider(temp); - } - Board.addSeeker(seeker); - currentWorldborderSize = worldborderSize; - for(Player player : Board.getPlayers()) { - 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()) { - player.removePotionEffect(effect.getType()); - } - } - for(Player player : Board.getSeekers()) { - player.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS,1000000,127,false,false)); - player.addPotionEffect(new PotionEffect(PotionEffectType.SLOW,1000000,127,false,false)); - player.addPotionEffect(new PotionEffect(PotionEffectType.JUMP,1000000,128,false,false)); - Titles.sendTitle(player, 10, 70, 20, ChatColor.WHITE + "" + message("SEEKER_TEAM_NAME"), ChatColor.WHITE + message("SEEKERS_SUBTITLE").toString()); - } - for(Player player : Board.getHiders()) { - 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()); + public int getTimeLeft(){ + return gameTimer; + } + + public int getLobbyTime(){ + return lobbyTimer; + } + + public Glow getGlow(){ + return glow; + } + + public Border getBorder(){ + return worldBorder; + } + + public Taunt getTaunt(){ + return taunt; + } + + public WorldLoader getWorldLoader(){ + return worldLoader; + } + + public void start() { + try { + Optional<Player> rand = board.getPlayers().stream().skip(new Random().nextInt(board.size())).findFirst(); + String seekerName = rand.get().getName(); + Player temp = Bukkit.getPlayer(seekerName); + Player seeker = board.getPlayer(temp.getUniqueId()); + start(seeker); + } catch (Exception e){ + Main.getInstance().getLogger().warning("Failed to select random seeker."); } - if (tauntEnabled) - taunt = new Taunt(); - if (glowEnabled) - glow = new Glow(); - worldBorder = new Border(); - worldBorder.resetWorldborder(getGameWorld()); - if (gameLength > 0) - timeLeft = gameLength; - for(Player player : Board.getPlayers()) - Board.createGameBoard(player); - Board.reloadGameBoards(); + } + + public void start(Player seeker) { + if (mapSaveEnabled) worldLoader.rollback(); + board.reload(); + board.addSeeker(seeker); + PlayerUtil.loadSeeker(seeker, getGameWorld()); + board.getPlayers().forEach(player -> { + board.createGameBoard(player); + if(board.isSeeker(player)) return; + board.addHider(player); + PlayerUtil.loadHider(player, getGameWorld()); + }); + worldBorder.resetWorldBorder(getGameWorld()); + if (gameLength > 0) gameTimer = gameLength; status = Status.STARTING; - int temp = gameId; - if (countdownDisplay != CountdownDisplay.TITLE) { - sendHideCountdownMessage(messagePrefix + message("START_COUNTDOWN").addAmount(30), gameId, 0); - } - sendHideCountdownMessage(messagePrefix + message("START_COUNTDOWN").addAmount(20), gameId, 20 * 10); - sendHideCountdownMessage(messagePrefix + message("START_COUNTDOWN").addAmount(10), gameId, 20 * 20); - sendHideCountdownMessage(messagePrefix + message("START_COUNTDOWN").addAmount(5), gameId, 20 * 25); - sendHideCountdownMessage(messagePrefix + message("START_COUNTDOWN").addAmount(3), gameId, 20 * 27); - 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; - sendHideCountdownMessage(messagePrefix + message("START"), gameId, 0); - for(Player player : Board.getPlayers()) resetPlayer(player); - status = Status.PLAYING; - }, 20 * 30); + startingTimer = 30; } - public static void stop(WinType type) { - if (status == Status.STANDBY || status == Status.ENDING) return; + private void stop(WinType type) { status = Status.ENDING; - for(Player player : Board.getPlayers()) { - player.getInventory().clear(); - for(PotionEffect effect : player.getActivePotionEffects()) { - player.removePotionEffect(effect.getType()); - } - player.addPotionEffect(new PotionEffect(PotionEffectType.HEAL, 1, 100)); - 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()); + List<UUID> players = board.getPlayers().stream().map(Entity::getUniqueId).collect(Collectors.toList()); 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); + List<UUID> winners = board.getHiders().stream().map(Entity::getUniqueId).collect(Collectors.toList()); + Main.getInstance().getDatabase().getGameData().addWins(board, players, winners, board.getHiderKills(), board.getHiderDeaths(), board.getSeekerKills(), board.getSeekerDeaths(), type); } 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); + winners.add(board.getFirstSeeker().getUniqueId()); + Main.getInstance().getDatabase().getGameData().addWins(board, players, winners, board.getHiderKills(), board.getHiderDeaths(), board.getSeekerKills(), board.getSeekerDeaths(), type); } - Bukkit.getScheduler().scheduleSyncDelayedTask(Main.plugin, Game::end, 5*20); + Bukkit.getScheduler().scheduleSyncDelayedTask(Main.getInstance(), this::end, 5*20); } - public static void end() { - if (status == Status.STANDBY) return; - tick = 0; - countdownTime = -1; - status = Status.STANDBY; - gameId++; - timeLeft = 0; - worldBorder.resetWorldborder(getGameWorld()); - for(Player player : Board.getPlayers()) { - for(Player player2 : Board.getPlayers()) { - player.showPlayer(player2); - } - player.setAllowFlight(false); - player.setFlying(false); - if (Version.atLeast("1.9")) { - for(Player temp : Board.getPlayers()) { - Packet.setGlow(player, temp, false); - } - } - for(PotionEffect effect : player.getActivePotionEffects()) { - player.removePotionEffect(effect.getType()); - } - player.addPotionEffect(new PotionEffect(PotionEffectType.HEAL, 1, 100)); + public void end() { + board.getPlayers().forEach(PlayerUtil::unloadPlayer); + worldBorder.resetWorldBorder(getGameWorld()); + board.getPlayers().forEach(player -> { if (leaveOnEnd) { - Board.removeBoard(player); - Board.remove(player); - player.getInventory().clear(); + board.removeBoard(player); + board.remove(player); 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())) - player.getInventory().setItem(lobbyItemStartPosition, lobbyStartItem); - if (lobbyLeaveItem != null) - player.getInventory().setItem(lobbyItemLeavePosition, lobbyLeaveItem); - for(PotionEffect effect : player.getActivePotionEffects()) { - player.removePotionEffect(effect.getType()); - } - player.addPotionEffect(new PotionEffect(PotionEffectType.HEAL, 1, 100)); + board.createLobbyBoard(player); + board.addHider(player); + PlayerUtil.joinPlayer(player); } - } + }); RespawnHandler.temp_loc.clear(); if (mapSaveEnabled) worldLoader.unloadMap(); - Board.reloadLobbyBoards(); + board.reloadLobbyBoards(); + status = Status.ENDED; } - 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"))) - player.getInventory().setItem(lobbyItemStartPosition, lobbyStartItem); - if (lobbyLeaveItem != null) - player.getInventory().setItem(lobbyItemLeavePosition, lobbyLeaveItem); - Board.addHider(player); + public void join(Player player) { + if (status != Status.STARTING && status != Status.PLAYING) { + PlayerUtil.joinPlayer(player); + board.addHider(player); + board.createLobbyBoard(player); + board.reloadLobbyBoards(); if (announceMessagesToNonPlayers) Bukkit.broadcastMessage(messagePrefix + message("GAME_JOIN").addPlayer(player)); - else Game.broadcastMessage(messagePrefix + message("GAME_JOIN").addPlayer(player)); - for(PotionEffect effect : player.getActivePotionEffects()) { - player.removePotionEffect(effect.getType()); - } - player.setGameMode(GameMode.ADVENTURE); - Board.createLobbyBoard(player); - Board.reloadLobbyBoards(); + else broadcastMessage(messagePrefix + message("GAME_JOIN").addPlayer(player)); } else { - Board.addSpectator(player); + PlayerUtil.loadSpectator(player, getGameWorld()); + board.addSpectator(player); + board.createGameBoard(player); player.sendMessage(messagePrefix + message("GAME_JOIN_SPECTATOR")); - player.setGameMode(GameMode.ADVENTURE); - for(Player player2 : Board.getPlayers()) { - player2.hidePlayer(player); - } - Board.createGameBoard(player); - player.teleport(new Location(Bukkit.getWorld(getGameWorld()), spawnPosition.getX(),spawnPosition.getY(),spawnPosition.getZ())); - player.setAllowFlight(true); - player.setFlying(true); - player.setFallDistance(0.0F); - Titles.sendTitle(player, 10, 70, 20, ChatColor.GRAY + "" + ChatColor.BOLD + "SPECTATING", ChatColor.WHITE + message("SPECTATOR_SUBTITLE").toString()); - } - - player.setFoodLevel(20); - if (Version.atLeast("1.9")) { - AttributeInstance attribute = player.getAttribute(Attribute.GENERIC_MAX_HEALTH); - if (attribute != null) player.setHealth(attribute.getValue()); - } else { - player.setHealth(player.getMaxHealth()); } } - public static void leave(Player player) { - player.setFlying(false); - player.setAllowFlight(false); - player.setFallDistance(0.0F); - for(Player player2 : Board.getPlayers()) { - player2.showPlayer(player); - player.showPlayer(player2); - } + public void leave(Player player) { + PlayerUtil.unloadPlayer(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) { - hiderLeave = true; + else broadcastMessage(messagePrefix + message("GAME_LEAVE").addPlayer(player)); + if (board.isHider(player) && status != Status.ENDING && status != Status.STANDBY) { + hiderLeft = true; } - Board.removeBoard(player); - Board.remove(player); - player.getInventory().clear(); - if (Game.status == Status.STANDBY) { - Board.reloadLobbyBoards(); + board.removeBoard(player); + board.remove(player); + if (status == Status.STANDBY) { + board.reloadLobbyBoards(); } else { - Board.reloadGameBoards(); - Board.reloadBoardTeams(); - } - for(PotionEffect effect : player.getActivePotionEffects()) { - player.removePotionEffect(effect.getType()); + board.reloadGameBoards(); + board.reloadBoardTeams(); } handleBungeeLeave(player); } - private static void handleBungeeLeave(Player player) { + private void handleBungeeLeave(Player player) { if (bungeeLeave) { ByteArrayDataOutput out = ByteStreams.newDataOutput(); out.writeUTF("Connect"); out.writeUTF(leaveServer); - player.sendPluginMessage(Main.plugin, "BungeeCord", out.toByteArray()); + player.sendPluginMessage(Main.getInstance(), "BungeeCord", out.toByteArray()); } else { player.teleport(new Location(Bukkit.getWorld(exitWorld), exitPosition.getX(), exitPosition.getY(), exitPosition.getZ())); } } - public static void onTick() { + public void onTick() { if (isNotSetup()) return; if (status == Status.STANDBY) whileWaiting(); else if (status == Status.STARTING) whileStarting(); else if (status == Status.PLAYING) whilePlaying(); - tick++; + gameTick++; } - private static void whileWaiting() { + private void whileWaiting() { if (!lobbyCountdownEnabled) return; - if (lobbyMin <= Board.size()) { - if (countdownTime == -1) - countdownTime = countdown; - if (Board.size() >= changeCountdown) - countdownTime = Math.min(countdownTime, 10); - if (tick % 20 == 0) { - countdownTime--; - Board.reloadLobbyBoards(); + if (lobbyMin <= board.size()) { + if (gameTimer == -1) + lobbyTimer = countdown; + if (board.size() >= changeCountdown) + lobbyTimer = Math.min(lobbyTimer, 10); + if (gameTick % 20 == 0) { + lobbyTimer--; + board.reloadLobbyBoards(); } - if (countdownTime == 0) { + if (lobbyTimer == 0) { start(); } } else { - countdownTime = -1; + lobbyTimer = -1; } } - private static void whileStarting() { - for(Player spectator : Board.getSpectators()) { - spectator.setFlying(spectator.getAllowFlight()); + private void whileStarting() { + + if(gameTick % 20 == 0) { + if (startingTimer % 5 == 0 || startingTimer < 4) { + String message; + if (startingTimer == 0) { + message = message("START").toString(); + status = Status.PLAYING; + board.getPlayers().forEach(player -> PlayerUtil.resetPlayer(player, board)); + } else { + message = message("START_COUNTDOWN").addAmount(startingTimer).toString(); + } + board.getPlayers().forEach(player -> { + if (countdownDisplay == CountdownDisplay.CHAT) { + player.sendMessage(messagePrefix + message); + } else if (countdownDisplay == CountdownDisplay.ACTIONBAR) { + ActionBar.clearActionBar(player); + ActionBar.sendActionBar(player, messagePrefix + message); + } else if (countdownDisplay == CountdownDisplay.TITLE) { + Titles.clearTitle(player); + Titles.sendTitle(player, 10, 40, 10, " ", message); + } + }); + } + startingTimer--; } + checkWinConditions(); } - private static void whilePlaying() { - for(Player hider : Board.getHiders()) { + private void whilePlaying() { + for(Player hider : board.getHiders()) { int distance = 100, temp = 100; - for(Player seeker : Board.getSeekers()) { + for(Player seeker : board.getSeekers()) { try { temp = (int) hider.getLocation().distance(seeker.getLocation()); } catch (Exception e) { @@ -354,7 +282,7 @@ public class Game { distance = temp; } } - if (seekerPing) switch(tick%10) { + if (seekerPing) switch(gameTick %10) { case 0: if (distance < seekerPingLevel1) heartbeatSound.play(hider, seekerPingLeadingVolume, seekerPingPitch); if (distance < seekerPingLevel3) ringingSound.play(hider, seekerPingVolume, seekerPingPitch); @@ -371,13 +299,10 @@ public class Game { break; } } - for(Player spectator : Board.getSpectators()) { - spectator.setFlying(spectator.getAllowFlight()); - } - if (tick%20 == 0) { + if (gameTick %20 == 0) { if (gameLength > 0) { - Board.reloadGameBoards(); - timeLeft--; + board.reloadGameBoards(); + gameTimer--; } if (worldborderEnabled) worldBorder.update(); if (tauntEnabled) taunt.update(); @@ -386,68 +311,31 @@ public class Game { checkWinConditions(); } - public static void resetWorldBorder(String worldName) { - worldBorder = new Border(); - worldBorder.resetWorldborder(worldName); - } - - public static void broadcastMessage(String message) { - for(Player player : Board.getPlayers()) { + public void broadcastMessage(String message) { + for(Player player : board.getPlayers()) { player.sendMessage(message); } } - public static boolean isNotSetup() { + public 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 destination = new File(Main.root + File.separator + getGameWorld()); + File destination = new File(Main.getInstance().getWorldContainer() + File.separator + getGameWorld()); if (!destination.exists()) return true; } return saveMinX == 0 || saveMinZ == 0 || saveMaxX == 0 || saveMaxZ == 0; } - public static String getGameWorld() { + public String getGameWorld() { if (mapSaveEnabled) return "hideandseek_"+spawnWorld; else return spawnWorld; } - public static void resetPlayer(Player player) { - player.getInventory().clear(); - for (PotionEffect effect : player.getActivePotionEffects()) { - player.removePotionEffect(effect.getType()); - } - if (Board.isSeeker(player)) { - 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) - for(ItemStack item : Items.HIDER_ITEMS) - player.getInventory().addItem(item); - for(PotionEffect effect : Items.HIDER_EFFECTS) - player.addPotionEffect(effect); - if (glowEnabled) { - player.getInventory().addItem(glowPowerupItem); - } - } - } - - 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); - for(ItemStack hi : Items.HIDER_ITEMS) - for(ItemStack i : player.getInventory().getContents()) - if (hi.isSimilar(i)) player.getInventory().remove(i); - } - - private static void checkWinConditions() { - if (Board.sizeHider() < 1) { - if (hiderLeave) { + private void checkWinConditions() { + if (board.sizeHider() < 1) { + if (hiderLeft) { if (announceMessagesToNonPlayers) Bukkit.broadcastMessage(gameoverPrefix + message("GAME_GAMEOVER_HIDERS_QUIT")); else broadcastMessage(gameoverPrefix + message("GAME_GAMEOVER_HIDERS_QUIT")); stop(WinType.NONE); @@ -456,179 +344,16 @@ public class Game { else broadcastMessage(gameoverPrefix + message("GAME_GAMEOVER_HIDERS_FOUND")); stop(WinType.SEEKER_WIN); } - } else if (Board.sizeSeeker() < 1) { + } 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) { + } else if (gameTimer < 1) { if (announceMessagesToNonPlayers) Bukkit.broadcastMessage(gameoverPrefix + message("GAME_GAMEOVER_TIME")); else broadcastMessage(gameoverPrefix + message("GAME_GAMEOVER_TIME")); stop(WinType.HIDER_WIN); } - hiderLeave = false; - } - - 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) { - player.sendMessage(message); - } else if (countdownDisplay == CountdownDisplay.ACTIONBAR) { - ActionBar.clearActionBar(player); - ActionBar.sendActionBar(player,message); - } else if (countdownDisplay == CountdownDisplay.TITLE) { - Titles.clearTitle(player); - Titles.sendTitle(player, 10, 40, 10, " ", message); - } - } - } - }, delay); - } - -} - -class Taunt { - - private UUID tauntPlayer; - private int delay; - private boolean running; - - public Taunt() { - this.delay = tauntDelay; - } - - protected void update() { - if (delay == 0) { - if (running) launchTaunt(); - else if (tauntLast || Board.sizeHider() > 1) executeTaunt(); - } else { - delay--; - delay = Math.max(delay, 0); - } - } - - private void executeTaunt() { - Optional<Player> rand = Board.getHiders().stream().skip(new Random().nextInt(Board.size())).findFirst(); - if (!rand.isPresent()) { - Main.plugin.getLogger().warning("Failed to select random seeker."); - return; - } - Player taunted = rand.get(); - taunted.sendMessage(message("TAUNTED").toString()); - broadcastMessage(tauntPrefix + message("TAUNT")); - tauntPlayer = taunted.getUniqueId(); - running = true; - delay = 30; - } - - private void launchTaunt() { - Player taunted = Board.getPlayer(tauntPlayer); - if (taunted != null) { - if (!Board.isHider(taunted)) { - Main.plugin.getLogger().info("Taunted played died and is now seeker. Skipping taunt."); - tauntPlayer = null; - running = false; - delay = tauntDelay; - return; - } - World world = taunted.getLocation().getWorld(); - if (world == null) { - Main.plugin.getLogger().severe("Game world is null while trying to launch taunt."); - tauntPlayer = null; - running = false; - delay = tauntDelay; - return; - } - Firework fw = (Firework) world.spawnEntity(taunted.getLocation(), EntityType.FIREWORK); - FireworkMeta fwm = fw.getFireworkMeta(); - fwm.setPower(4); - fwm.addEffect(FireworkEffect.builder() - .withColor(Color.BLUE) - .withColor(Color.RED) - .withColor(Color.YELLOW) - .with(FireworkEffect.Type.STAR) - .with(FireworkEffect.Type.BALL) - .with(FireworkEffect.Type.BALL_LARGE) - .flicker(true) - .withTrail() - .build()); - fw.setFireworkMeta(fwm); - broadcastMessage(tauntPrefix + message("TAUNT_ACTIVATE")); - } - tauntPlayer = null; - running = false; - delay = tauntDelay; - } - - public int getDelay() { - return delay; - } - - public boolean isRunning() { - return running; - } - -} - -class Border { - - private int delay; - private boolean running; - - public Border() { - delay = 60 * worldborderDelay; - } - - void update() { - if (delay == 30 && !running) { - broadcastMessage(worldborderPrefix + message("WORLDBORDER_WARN")); - } else if (delay == 0) { - if (running) { - delay = 60 * worldborderDelay; - running = false; - } - else decreaceWorldborder(); - } - delay--; - } - - private void decreaceWorldborder() { - if (currentWorldborderSize == 100) return; - int change = worldborderChange; - if (currentWorldborderSize-worldborderChange < 100) { - change = currentWorldborderSize-100; - } - running = true; - broadcastMessage(worldborderPrefix + message("WORLDBORDER_DECREASING").addAmount(change)); - currentWorldborderSize -= worldborderChange; - World world = Bukkit.getWorld(Game.getGameWorld()); - assert world != null; - org.bukkit.WorldBorder border = world.getWorldBorder(); - border.setSize(border.getSize()-change,30); - delay = 30; - } - - public void resetWorldborder(String worldName) { - World world = Bukkit.getWorld(worldName); - assert world != null; - org.bukkit.WorldBorder border = world.getWorldBorder(); - if (worldborderEnabled) { - border.setSize(worldborderSize); - border.setCenter(worldborderPosition.getX(), worldborderPosition.getZ()); - currentWorldborderSize = worldborderSize; - } else { - border.setSize(30000000); - border.setCenter(0, 0); - } - } - - public int getDelay() { - return delay; - } - - public boolean isRunning() { - return running; + hiderLeft = false; } }
\ No newline at end of file diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/events/Border.java b/src/main/java/net/tylermurphy/hideAndSeek/game/events/Border.java new file mode 100644 index 0000000..aa6beca --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/events/Border.java @@ -0,0 +1,71 @@ +package net.tylermurphy.hideAndSeek.game.events; + +import net.tylermurphy.hideAndSeek.Main; +import org.bukkit.Bukkit; +import org.bukkit.World; + +import static net.tylermurphy.hideAndSeek.configuration.Config.*; +import static net.tylermurphy.hideAndSeek.configuration.Localization.message; + +public class Border { + + private int delay; + private boolean running; + + public Border() { + delay = 60 * worldborderDelay; + } + + public void update() { + if (delay == 30 && !running) { + Main.getInstance().getGame().broadcastMessage(worldborderPrefix + message("WORLDBORDER_WARN")); + } else if (delay == 0) { + if (running) { + delay = 60 * worldborderDelay; + running = false; + } + else decreaceWorldborder(); + } + delay--; + } + + private void decreaceWorldborder() { + if (currentWorldborderSize == 100) return; + int change = worldborderChange; + if (currentWorldborderSize-worldborderChange < 100) { + change = currentWorldborderSize-100; + } + running = true; + Main.getInstance().getGame().broadcastMessage(worldborderPrefix + message("WORLDBORDER_DECREASING").addAmount(change)); + currentWorldborderSize -= worldborderChange; + World world = Bukkit.getWorld(Main.getInstance().getGame().getGameWorld()); + assert world != null; + org.bukkit.WorldBorder border = world.getWorldBorder(); + border.setSize(border.getSize()-change,30); + delay = 30; + } + + public void resetWorldBorder(String worldName) { + World world = Bukkit.getWorld(worldName); + assert world != null; + org.bukkit.WorldBorder border = world.getWorldBorder(); + if (worldborderEnabled) { + border.setSize(worldborderSize); + border.setCenter(worldborderPosition.getX(), worldborderPosition.getZ()); + currentWorldborderSize = worldborderSize; + } else { + border.setSize(30000000); + border.setCenter(0, 0); + } + delay = 60 * worldborderDelay; + } + + public int getDelay() { + return delay; + } + + public boolean isRunning() { + return running; + } + +}
\ No newline at end of file diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/Glow.java b/src/main/java/net/tylermurphy/hideAndSeek/game/events/Glow.java index 61cb784..a0031e5 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/Glow.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/events/Glow.java @@ -1,6 +1,7 @@ -package net.tylermurphy.hideAndSeek.game; +package net.tylermurphy.hideAndSeek.game.events; -import net.tylermurphy.hideAndSeek.util.Packet; +import net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.game.util.Packet; import org.bukkit.entity.Player; import static net.tylermurphy.hideAndSeek.configuration.Config.glowLength; @@ -22,12 +23,12 @@ public class Glow { } private void sendPackets() { - for (Player hider : Board.getHiders()) - for (Player seeker : Board.getSeekers()) + for (Player hider : Main.getInstance().getBoard().getHiders()) + for (Player seeker : Main.getInstance().getBoard().getSeekers()) Packet.setGlow(hider, seeker, true); } - protected void update() { + public void update() { if (running) { sendPackets(); glowTime--; @@ -40,8 +41,8 @@ public class Glow { private void stopGlow() { running = false; - for (Player hider : Board.getHiders()) { - for (Player seeker : Board.getSeekers()) { + for (Player hider : Main.getInstance().getBoard().getHiders()) { + for (Player seeker : Main.getInstance().getBoard().getSeekers()) { Packet.setGlow(hider, seeker, false); } } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/events/Taunt.java b/src/main/java/net/tylermurphy/hideAndSeek/game/events/Taunt.java new file mode 100644 index 0000000..191b1e7 --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/events/Taunt.java @@ -0,0 +1,101 @@ +package net.tylermurphy.hideAndSeek.game.events; + +import net.tylermurphy.hideAndSeek.Main; +import org.bukkit.Color; +import org.bukkit.FireworkEffect; +import org.bukkit.World; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Firework; +import org.bukkit.entity.Player; +import org.bukkit.inventory.meta.FireworkMeta; + +import java.util.Optional; +import java.util.Random; +import java.util.UUID; + +import static net.tylermurphy.hideAndSeek.configuration.Config.*; +import static net.tylermurphy.hideAndSeek.configuration.Config.tauntDelay; +import static net.tylermurphy.hideAndSeek.configuration.Localization.message; + +public class Taunt { + + private UUID tauntPlayer; + private int delay; + private boolean running; + + public Taunt() { + this.delay = tauntDelay; + } + + public void update() { + if (delay == 0) { + if (running) launchTaunt(); + else if (tauntLast || Main.getInstance().getBoard().sizeHider() > 1) executeTaunt(); + } else { + delay--; + delay = Math.max(delay, 0); + } + } + + private void executeTaunt() { + Optional<Player> rand = Main.getInstance().getBoard().getHiders().stream().skip(new Random().nextInt(Main.getInstance().getBoard().size())).findFirst(); + if (!rand.isPresent()) { + Main.getInstance().getLogger().warning("Failed to select random seeker."); + return; + } + Player taunted = rand.get(); + taunted.sendMessage(message("TAUNTED").toString()); + Main.getInstance().getGame().broadcastMessage(tauntPrefix + message("TAUNT")); + tauntPlayer = taunted.getUniqueId(); + running = true; + delay = 30; + } + + private void launchTaunt() { + Player taunted = Main.getInstance().getBoard().getPlayer(tauntPlayer); + if (taunted != null) { + if (!Main.getInstance().getBoard().isHider(taunted)) { + Main.getInstance().getLogger().info("Taunted played died and is now seeker. Skipping taunt."); + tauntPlayer = null; + running = false; + delay = tauntDelay; + return; + } + World world = taunted.getLocation().getWorld(); + if (world == null) { + Main.getInstance().getLogger().severe("Game world is null while trying to launch taunt."); + tauntPlayer = null; + running = false; + delay = tauntDelay; + return; + } + Firework fw = (Firework) world.spawnEntity(taunted.getLocation(), EntityType.FIREWORK); + FireworkMeta fwm = fw.getFireworkMeta(); + fwm.setPower(4); + fwm.addEffect(FireworkEffect.builder() + .withColor(Color.BLUE) + .withColor(Color.RED) + .withColor(Color.YELLOW) + .with(FireworkEffect.Type.STAR) + .with(FireworkEffect.Type.BALL) + .with(FireworkEffect.Type.BALL_LARGE) + .flicker(true) + .withTrail() + .build()); + fw.setFireworkMeta(fwm); + Main.getInstance().getGame().broadcastMessage(tauntPrefix + message("TAUNT_ACTIVATE")); + } + tauntPlayer = null; + running = false; + delay = tauntDelay; + } + + public int getDelay() { + return delay; + } + + public boolean isRunning() { + return running; + } + +}
\ No newline at end of file diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/BlockedCommandHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/BlockedCommandHandler.java index a805fa5..7cc6dc3 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/BlockedCommandHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/BlockedCommandHandler.java @@ -1,8 +1,7 @@ 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 net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.game.util.Status; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -23,10 +22,10 @@ public class BlockedCommandHandler implements Listener { 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) + array[0].substring(1).equalsIgnoreCase(handle) && Main.getInstance().getBoard().contains(player) || + temp[temp.length-1].equalsIgnoreCase(handle) && Main.getInstance().getBoard().contains(player) ) { - if (Game.status == Status.STANDBY) return; + if (Main.getInstance().getGame().getStatus() == 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 index 523b3ee..07014b7 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/ChatHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/ChatHandler.java @@ -1,6 +1,6 @@ package net.tylermurphy.hideAndSeek.game.listener; -import net.tylermurphy.hideAndSeek.game.Board; +import net.tylermurphy.hideAndSeek.Main; import org.bukkit.ChatColor; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -19,9 +19,9 @@ public class ChatHandler implements Listener { event.getPlayer().setAllowFlight(false); event.getPlayer().setFlying(false); } - if (Board.isSeeker(event.getPlayer())) { + if (Main.getInstance().getBoard().isSeeker(event.getPlayer())) { event.setCancelled(true); - Board.getSpectators().forEach(spectator -> spectator.sendMessage(ChatColor.GRAY + "[SPECTATOR] " + event.getPlayer().getName() + ": " + event.getMessage())); + Main.getInstance().getBoard().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 index 5bbfa8c..aabbd92 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DamageHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DamageHandler.java @@ -1,13 +1,14 @@ package net.tylermurphy.hideAndSeek.game.listener; import com.cryptomorin.xseries.XSound; +import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.game.Board; import net.tylermurphy.hideAndSeek.game.Game; -import net.tylermurphy.hideAndSeek.util.Version; +import net.tylermurphy.hideAndSeek.game.util.PlayerUtil; +import net.tylermurphy.hideAndSeek.game.util.Status; +import net.tylermurphy.hideAndSeek.game.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; @@ -24,6 +25,10 @@ public class DamageHandler implements Listener { @EventHandler(priority = EventPriority.HIGHEST) public void onEntityDamage(EntityDamageEvent event) { + + Board board = Main.getInstance().getBoard(); + Game game = Main.getInstance().getGame(); + // If you are not a player, get out of here if (!(event.getEntity() instanceof Player)) return; // Define variables @@ -44,18 +49,18 @@ public class DamageHandler implements Listener { // 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))) { + 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)) { + } 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)) { + } 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)) { + } else if (!pvpEnabled && board.isHider(attacker) && board.isSeeker(player)) { event.setCancelled(true); return; } @@ -63,49 +68,52 @@ public class DamageHandler implements Listener { } else if (!pvpEnabled && !allowNaturalCauses) { event.setCancelled(true); return; - // Spectators cannot take damage - } else if (Board.isSpectator(player)) { + } + // Spectators cannot take damage + 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())); + 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())); + player.teleport(new Location(Bukkit.getWorld(game.getGameWorld()), spawnPosition.getX(), spawnPosition.getY(), spawnPosition.getZ())); } return; } + // Players cannot take damage while game is not in session + if (board.contains(player) && (game.getStatus() == Status.STANDBY || game.getStatus() == Status.STARTING)){ + event.setCancelled(true); + return; + } // Handle death event event.setCancelled(true); - // Reset health and play death effect + // 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())); + 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()); + 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)) { + } else if (board.isHider(player)) { if (attacker == null) { - Game.broadcastMessage(message("GAME_PLAYER_FOUND").addPlayer(player).toString()); + game.broadcastMessage(message("GAME_PLAYER_FOUND").addPlayer(player).toString()); } else { - Game.broadcastMessage(message("GAME_PLAYER_FOUND_BY").addPlayer(player).addPlayer(attacker).toString()); + game.broadcastMessage(message("GAME_PLAYER_FOUND_BY").addPlayer(player).addPlayer(attacker).toString()); } - Board.addDeath(player.getUniqueId()); - Board.addSeeker(player); + 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(); + if (attacker != null && ( board.isHider(attacker) || board.getFirstSeeker().getName().equals(attacker.getName()) ) ) + board.addKill(attacker.getUniqueId()); + PlayerUtil.resetPlayer(player, board); + 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 index 7aa976a..bd2c7fe 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InteractHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InteractHandler.java @@ -1,9 +1,8 @@ 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 net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.game.util.Status; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -20,40 +19,40 @@ public class InteractHandler implements Listener { @EventHandler(priority = EventPriority.HIGHEST) public void onPlayerInteract(PlayerInteractEvent event) { - if (!Board.contains(event.getPlayer())) return; + if (!Main.getInstance().getBoard().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) + if (Main.getInstance().getGame().getStatus() == Status.STANDBY) onPlayerInteractLobby(temp, event); - if (Game.status == Status.PLAYING) + if (Main.getInstance().getGame().getStatus() == 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()); + Main.getInstance().getGame().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()) { + if (Main.getInstance().getGame().isNotSetup()) { event.getPlayer().sendMessage(errorPrefix + message("GAME_SETUP")); return; } - if (Game.status != Status.STANDBY) { + if (Main.getInstance().getGame().getStatus() != Status.STANDBY) { event.getPlayer().sendMessage(errorPrefix + message("GAME_INPROGRESS")); return; } - if (Board.size() < minPlayers) { + if (Main.getInstance().getBoard().size() < minPlayers) { event.getPlayer().sendMessage(errorPrefix + message("START_MIN_PLAYERS").addAmount(minPlayers)); return; } - Game.start(); + Main.getInstance().getGame().start(); } } @@ -61,8 +60,8 @@ public class InteractHandler implements Listener { 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(); + if (Main.getInstance().getBoard().isHider(player)) { + Main.getInstance().getGame().getGlow().onProjectile(); player.getInventory().remove(glowPowerupItem); assert XMaterial.SNOWBALL.parseMaterial() != null; player.getInventory().remove(XMaterial.SNOWBALL.parseMaterial()); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/JoinLeaveHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/JoinLeaveHandler.java index 6e42f57..37865b0 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/JoinLeaveHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/JoinLeaveHandler.java @@ -1,8 +1,8 @@ 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 net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.configuration.Items; +import net.tylermurphy.hideAndSeek.game.util.Status; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; @@ -13,6 +13,7 @@ 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.inventory.ItemStack; import org.bukkit.potion.PotionEffect; import static net.tylermurphy.hideAndSeek.configuration.Config.*; @@ -22,20 +23,20 @@ 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; + Main.getInstance().getBoard().remove(event.getPlayer()); + removeItems(event.getPlayer()); + if (Main.getInstance().getGame().isNotSetup()) return; if (autoJoin) { - Game.join(event.getPlayer()); + Main.getInstance().getGame().join(event.getPlayer()); } else if (teleportToExit) { - if (event.getPlayer().getWorld().getName().equals(Game.getGameWorld()) || event.getPlayer().getWorld().getName().equals(lobbyWorld)) { + if (event.getPlayer().getWorld().getName().equals(Main.getInstance().getGame().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()); + if (mapSaveEnabled && event.getPlayer().getWorld().getName().equals(Main.getInstance().getGame().getGameWorld())) { + if (Main.getInstance().getGame().getStatus() != Status.STANDBY && Main.getInstance().getGame().getStatus() != Status.ENDING) { + Main.getInstance().getGame().join(event.getPlayer()); } else { event.getPlayer().teleport(new Location(Bukkit.getWorld(exitWorld), exitPosition.getX(), exitPosition.getY(), exitPosition.getZ())); event.getPlayer().setGameMode(GameMode.ADVENTURE); @@ -55,16 +56,25 @@ public class JoinLeaveHandler implements Listener { } private void handleLeave(Player player) { - Board.remove(player); - if (Game.status == Status.STANDBY) { - Board.reloadLobbyBoards(); + Main.getInstance().getBoard().remove(player); + if (Main.getInstance().getGame().getStatus() == Status.STANDBY) { + Main.getInstance().getBoard().reloadLobbyBoards(); } else { - Board.reloadGameBoards(); + Main.getInstance().getBoard().reloadGameBoards(); } for(PotionEffect effect : player.getActivePotionEffects()) { player.removePotionEffect(effect.getType()); } - Game.removeItems(player); + removeItems(player); + } + + private void removeItems(Player player) { + for(ItemStack si : Items.SEEKER_ITEMS) + for(ItemStack i : player.getInventory().getContents()) + 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); } } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/MovementHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/MovementHandler.java index 21e02de..10872ad 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/MovementHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/MovementHandler.java @@ -1,7 +1,6 @@ package net.tylermurphy.hideAndSeek.game.listener; -import net.tylermurphy.hideAndSeek.game.Board; -import net.tylermurphy.hideAndSeek.game.Game; +import net.tylermurphy.hideAndSeek.Main; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; @@ -14,11 +13,11 @@ 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 (!Main.getInstance().getBoard().contains(event.getPlayer())) return; + if (!event.getPlayer().getWorld().getName().equals(Main.getInstance().getGame().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().getWorld().getName().equals(Main.getInstance().getGame().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 index 31aedb0..b63d982 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/PlayerHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/PlayerHandler.java @@ -1,8 +1,8 @@ package net.tylermurphy.hideAndSeek.game.listener; -import net.tylermurphy.hideAndSeek.game.Board; +import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.game.Game; -import net.tylermurphy.hideAndSeek.util.Status; +import net.tylermurphy.hideAndSeek.game.util.Status; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -17,7 +17,7 @@ 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; + if (!Main.getInstance().getBoard().contains((Player) event.getEntity())) return; event.setCancelled(true); } } @@ -26,7 +26,7 @@ public class PlayerHandler implements Listener { 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; + if (!Main.getInstance().getBoard().contains((Player) event.getEntity())) return; event.setCancelled(true); } } @@ -36,7 +36,7 @@ public class PlayerHandler implements Listener { public void onInventoryClick(InventoryClickEvent event) { if (event.getWhoClicked() instanceof Player) { Player player = (Player) event.getWhoClicked(); - if (Board.contains(player) && Game.status == Status.STANDBY) { + if (Main.getInstance().getBoard().contains(player) && Main.getInstance().getGame().getStatus() == Status.STANDBY) { event.setCancelled(true); } } @@ -44,7 +44,7 @@ public class PlayerHandler implements Listener { @EventHandler(priority = EventPriority.HIGHEST) public void onItemDrop(PlayerDropItemEvent event) { - if (Board.contains(event.getPlayer())) { + if (Main.getInstance().getBoard().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 index aeda227..951304a 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/RespawnHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/RespawnHandler.java @@ -1,7 +1,6 @@ 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; @@ -21,17 +20,17 @@ public class RespawnHandler implements Listener { @EventHandler(priority = EventPriority.HIGHEST) public void onPlayerDeath(PlayerDeathEvent event) { Player player = event.getEntity(); - if (!Board.contains(player)) return; + if (!Main.getInstance().getBoard().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."); + Main.getInstance().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 (!Main.getInstance().getBoard().contains(player)) return; if (temp_loc.containsKey(player.getUniqueId())) { player.teleport(temp_loc.get(player.getUniqueId())); temp_loc.remove(player.getUniqueId()); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/util/CountdownDisplay.java b/src/main/java/net/tylermurphy/hideAndSeek/game/util/CountdownDisplay.java new file mode 100644 index 0000000..e735af9 --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/util/CountdownDisplay.java @@ -0,0 +1,26 @@ +/* + * This file is part of Kenshins Hide and Seek + * + * Copyright (c) 2022 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.util; + +public enum CountdownDisplay { + CHAT, + ACTIONBAR, + TITLE +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/util/Packet.java b/src/main/java/net/tylermurphy/hideAndSeek/game/util/Packet.java new file mode 100644 index 0000000..0fad539 --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/util/Packet.java @@ -0,0 +1,56 @@ +/* + * 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.util; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.ProtocolLibrary; +import com.comphenix.protocol.ProtocolManager; +import com.comphenix.protocol.events.PacketContainer; +import com.comphenix.protocol.wrappers.WrappedDataWatcher; +import com.comphenix.protocol.wrappers.WrappedDataWatcher.Registry; +import com.comphenix.protocol.wrappers.WrappedDataWatcher.Serializer; +import org.bukkit.entity.Player; + +import java.lang.reflect.InvocationTargetException; + +public class Packet { + + private static final ProtocolManager protocolManager = ProtocolLibrary.getProtocolManager(); + + public static void setGlow(Player player, Player target, boolean glowing) { + PacketContainer packet = protocolManager.createPacket(PacketType.Play.Server.ENTITY_METADATA); + packet.getIntegers().write(0, target.getEntityId()); + WrappedDataWatcher watcher = new WrappedDataWatcher(); + Serializer serializer = Registry.get(Byte.class); + watcher.setEntity(target); + if (glowing) { + watcher.setObject(0, serializer, (byte) (0x40)); + } else { + watcher.setObject(0, serializer, (byte) (0x0)); + } + packet.getWatchableCollectionModifier().write(0, watcher.getWatchableObjects()); + try { + protocolManager.sendServerPacket(player, packet); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } + +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/util/PlayerUtil.java b/src/main/java/net/tylermurphy/hideAndSeek/game/util/PlayerUtil.java new file mode 100644 index 0000000..61d2b0e --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/util/PlayerUtil.java @@ -0,0 +1,120 @@ +package net.tylermurphy.hideAndSeek.game.util; + +import com.cryptomorin.xseries.messages.Titles; +import net.md_5.bungee.api.ChatColor; +import net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.configuration.Items; +import net.tylermurphy.hideAndSeek.game.Board; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.attribute.Attribute; +import org.bukkit.attribute.AttributeInstance; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import static net.tylermurphy.hideAndSeek.configuration.Config.*; +import static net.tylermurphy.hideAndSeek.configuration.Config.lobbyPosition; +import static net.tylermurphy.hideAndSeek.configuration.Localization.message; + +public class PlayerUtil { + + public static void loadHider(Player player, String gameWorld){ + player.teleport(new Location(Bukkit.getWorld(gameWorld), spawnPosition.getX(),spawnPosition.getY(),spawnPosition.getZ())); + loadPlayer(player); + 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()); + } + + public static void loadSeeker(Player player, String gameWorld){ + player.teleport(new Location(Bukkit.getWorld(gameWorld), spawnPosition.getX(),spawnPosition.getY(),spawnPosition.getZ())); + loadPlayer(player); + player.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS,1000000,127,false,false)); + player.addPotionEffect(new PotionEffect(PotionEffectType.SLOW,1000000,127,false,false)); + player.addPotionEffect(new PotionEffect(PotionEffectType.JUMP,1000000,128,false,false)); + Titles.sendTitle(player, 10, 70, 20, ChatColor.WHITE + "" + message("SEEKER_TEAM_NAME"), ChatColor.WHITE + message("SEEKERS_SUBTITLE").toString()); + } + + public static void loadSpectator(Player player, String gameWorld){ + player.teleport(new Location(Bukkit.getWorld(gameWorld), spawnPosition.getX(),spawnPosition.getY(),spawnPosition.getZ())); + loadPlayer(player); + player.setAllowFlight(true); + player.setFlying(true); + player.setFallDistance(0.0F); + Main.getInstance().getBoard().getPlayers().forEach(otherPlayer -> { + otherPlayer.hidePlayer(player); + }); + Titles.sendTitle(player, 10, 70, 20, ChatColor.GRAY + "" + ChatColor.BOLD + "SPECTATING", ChatColor.WHITE + message("SPECTATOR_SUBTITLE").toString()); + } + + public static void resetPlayer(Player player, Board board){ + loadPlayer(player); + if (board.isSeeker(player)) { + 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) + for(ItemStack item : Items.HIDER_ITEMS) + player.getInventory().addItem(item); + for(PotionEffect effect : Items.HIDER_EFFECTS) + player.addPotionEffect(effect); + if (glowEnabled) { + player.getInventory().addItem(glowPowerupItem); + } + } + } + + public static void unloadPlayer(Player player){ + player.setGameMode(GameMode.ADVENTURE); + player.getInventory().clear(); + for(PotionEffect effect : player.getActivePotionEffects()) { + player.removePotionEffect(effect.getType()); + } + if (Version.atLeast("1.9")) { + AttributeInstance attribute = player.getAttribute(Attribute.GENERIC_MAX_HEALTH); + if (attribute != null) player.setHealth(attribute.getValue()); + for(Player temp : Main.getInstance().getBoard().getPlayers()) { + Packet.setGlow(player, temp, false); + } + } else { + player.setHealth(player.getMaxHealth()); + } + Main.getInstance().getBoard().getPlayers().forEach(temp -> { + player.showPlayer(temp); + temp.showPlayer(player); + }); + player.setAllowFlight(false); + player.setFlying(false); + player.setFallDistance(0.0F); + } + + public static void joinPlayer(Player player){ + player.teleport(new Location(Bukkit.getWorld(lobbyWorld), lobbyPosition.getX(),lobbyPosition.getY(),lobbyPosition.getZ())); + loadPlayer(player); + if (lobbyStartItem != null && (!lobbyItemStartAdmin || player.hasPermission("hideandseek.start"))) + player.getInventory().setItem(lobbyItemStartPosition, lobbyStartItem); + if (lobbyLeaveItem != null) + player.getInventory().setItem(lobbyItemLeavePosition, lobbyLeaveItem); + } + + private static void loadPlayer(Player player){ + player.setGameMode(GameMode.ADVENTURE); + player.getInventory().clear(); + for(PotionEffect effect : player.getActivePotionEffects()) { + player.removePotionEffect(effect.getType()); + } + player.setFoodLevel(20); + if (Version.atLeast("1.9")) { + AttributeInstance attribute = player.getAttribute(Attribute.GENERIC_MAX_HEALTH); + if (attribute != null) player.setHealth(attribute.getValue()); + } else { + player.setHealth(player.getMaxHealth()); + } + } + +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/util/Status.java b/src/main/java/net/tylermurphy/hideAndSeek/game/util/Status.java new file mode 100644 index 0000000..e630070 --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/util/Status.java @@ -0,0 +1,26 @@ +/* + * 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.util; + +public enum Status { + + STANDBY, STARTING, PLAYING, ENDING, ENDED + +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/util/Version.java b/src/main/java/net/tylermurphy/hideAndSeek/game/util/Version.java new file mode 100644 index 0000000..e2dcfdd --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/util/Version.java @@ -0,0 +1,45 @@ +package net.tylermurphy.hideAndSeek.game.util; + +import org.bukkit.Bukkit; + +import java.util.HashMap; +import java.util.Map; + +public class Version { + + private static final Map<String,Boolean> CACHE = new HashMap<>(); + + public static boolean atLeast(String testVersion) { + + + if (CACHE.containsKey(testVersion)) return CACHE.get(testVersion); + + String[] serverCheckTemp = Bukkit.getBukkitVersion().substring(2,Bukkit.getBukkitVersion().indexOf('-')).split("\\."); + int[] serverCheck = new int[serverCheckTemp.length]; + for(int i=0; i<serverCheck.length; i++) { + serverCheck[i] = Integer.parseInt(serverCheckTemp[i]); + } + + String[] customCheckTemp = testVersion.substring(2).split("\\."); + int[] customCheck = new int[customCheckTemp.length]; + for(int i=0; i<customCheck.length; i++) { + customCheck[i] = Integer.parseInt(customCheckTemp[i]); + } + + boolean result = getResult(customCheck, serverCheck); + CACHE.put(testVersion, result); + return result; + } + + private static boolean getResult(int[] customCheck, int[] serverCheck) { + if (customCheck[0] > serverCheck[0]) return false; + else if (customCheck[0] < serverCheck[0]) return true; + else { + if (customCheck.length == 1 && serverCheck.length == 1) return true; + else if (customCheck.length == 2 && serverCheck.length == 2) { + return customCheck[1] <= serverCheck[1]; + } + else return serverCheck.length == 2; + } + } +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/util/WinType.java b/src/main/java/net/tylermurphy/hideAndSeek/game/util/WinType.java new file mode 100644 index 0000000..f584d80 --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/util/WinType.java @@ -0,0 +1,26 @@ +/* + * 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.util; + +public enum WinType { + + HIDER_WIN, SEEKER_WIN, NONE + +} |