summaryrefslogtreewikicommitdiff
path: root/src/main/java/net/tylermurphy/hideAndSeek/game
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/net/tylermurphy/hideAndSeek/game')
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/Board.java128
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/CommandHandler.java90
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/Game.java639
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/events/Border.java71
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/events/Glow.java (renamed from src/main/java/net/tylermurphy/hideAndSeek/game/Glow.java)15
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/events/Taunt.java101
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/listener/BlockedCommandHandler.java11
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/listener/ChatHandler.java6
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/listener/DamageHandler.java66
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/listener/InteractHandler.java25
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/listener/JoinLeaveHandler.java42
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/listener/MovementHandler.java9
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/listener/PlayerHandler.java12
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/listener/RespawnHandler.java7
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/util/CountdownDisplay.java26
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/util/Packet.java56
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/util/PlayerUtil.java120
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/util/Status.java26
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/util/Version.java45
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/util/WinType.java26
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
+
+}