diff options
Diffstat (limited to 'src/main')
20 files changed, 383 insertions, 101 deletions
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/Start.java b/src/main/java/net/tylermurphy/hideAndSeek/command/Start.java index 5184933..455e777 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/command/Start.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/Start.java @@ -7,11 +7,11 @@ import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; -import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix; -import static net.tylermurphy.hideAndSeek.configuration.Config.minPlayers; +import static net.tylermurphy.hideAndSeek.configuration.Config.*; import static net.tylermurphy.hideAndSeek.configuration.Localization.message; public class Start implements ICommand { @@ -33,19 +33,29 @@ public class Start implements ICommand { sender.sendMessage(errorPrefix + message("START_MIN_PLAYERS").addAmount(minPlayers)); return; } - String seekerName; + if (args.length < 1) { Main.getInstance().getGame().start(); return; - } else { - seekerName = args[0]; - } - Player seeker = Bukkit.getPlayer(seekerName); - if (seeker == null || !Main.getInstance().getBoard().contains(seeker)) { - sender.sendMessage(errorPrefix + message("START_INVALID_NAME").addPlayer(seekerName)); + }; + + List<Player> initialSeekers = new ArrayList<>(); + for (int i = 0; i < args.length; i++) { + Player seeker = Bukkit.getPlayer(args[i]); + if (seeker == null || !Main.getInstance().getBoard().contains(seeker) || initialSeekers.contains(seeker)) { + sender.sendMessage(errorPrefix + message("START_INVALID_NAME").addPlayer(args[i])); + return; + } + initialSeekers.add(seeker); + } + + int minHiders = minPlayers - startingSeekerCount; + if (Main.getInstance().getBoard().size() - initialSeekers.size() < minHiders) { + sender.sendMessage(errorPrefix + message("START_MIN_PLAYERS").addAmount(minPlayers)); return; - } - Main.getInstance().getGame().start(seeker); + } + + Main.getInstance().getGame().start(initialSeekers); } public String getLabel() { @@ -53,18 +63,15 @@ public class Start implements ICommand { } public String getUsage() { - return "<*player>"; + return "<*seekers...>"; } public String getDescription() { - return "Starts the game either with a random seeker or chosen one"; + return "Starts the game either with a random set of seekers or a chosen list"; } public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) { - if(parameter.equals("player")) { - return Main.getInstance().getBoard().getPlayers().stream().map(Player::getName).collect(Collectors.toList()); - } - return null; + return Main.getInstance().getBoard().getPlayers().stream().map(Player::getName).collect(Collectors.toList()); } } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/util/CommandGroup.java b/src/main/java/net/tylermurphy/hideAndSeek/command/util/CommandGroup.java index 9bfdd0e..907f031 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/command/util/CommandGroup.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/util/CommandGroup.java @@ -51,7 +51,7 @@ public class CommandGroup { if (data == null) { player.sendMessage( - String.format("%s%sKenshin's Hide and Seek %s(%s1.7.4%s)\n", ChatColor.AQUA, ChatColor.BOLD, ChatColor.GRAY, ChatColor.WHITE, ChatColor.GRAY) + + String.format("%s%sKenshin's Hide and Seek %s(%s1.7.5%s)\n", ChatColor.AQUA, ChatColor.BOLD, ChatColor.GRAY, ChatColor.WHITE, ChatColor.GRAY) + String.format("%sAuthor: %s[KenshinEto]\n", ChatColor.GRAY, ChatColor.WHITE) + String.format("%sHelp Command: %s/hs %shelp", ChatColor.GRAY, ChatColor.AQUA, ChatColor.WHITE) ); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java index 9fc7009..8a71903 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java @@ -62,8 +62,12 @@ public class Config { allowNaturalCauses, saveInventory, delayedRespawn, + dontRewardQuit, spawnPatch, dropItems, + respawnAsSpectator, + waitTillNoneLeft, + gameOverTitle, regenHealth; public static int @@ -82,7 +86,9 @@ public class Config { lobbyItemStartPosition, flightToggleItemPosition, teleportItemPosition, - delayedRespawnDelay; + startingSeekerCount, + delayedRespawnDelay, + endGameDelay; public static float seekerPingLeadingVolume, @@ -154,7 +160,9 @@ public class Config { } //Lobby - minPlayers = Math.max(2, config.getInt("minPlayers")); + startingSeekerCount = Math.max(1, config.getInt("startingSeekerCount")); + waitTillNoneLeft = config.getBoolean("waitTillNoneLeft"); + minPlayers = Math.max(1 + startingSeekerCount + (waitTillNoneLeft ? 0 : 1), config.getInt("minPlayers")); countdown = Math.max(10, config.getInt("lobby.countdown")); changeCountdown = Math.max(minPlayers, config.getInt("lobby.changeCountdown")); lobbyMin = Math.max(minPlayers, config.getInt("lobby.min")); @@ -188,6 +196,11 @@ public class Config { placeholderError = config.getString("placeholder.incorrect"); placeholderNoData = config.getString("placeholder.noData"); saveInventory = config.getBoolean("saveInventory"); + respawnAsSpectator = config.getBoolean("respawnAsSpectator"); + dontRewardQuit = config.getBoolean("dontRewardQuit"); + endGameDelay = Math.max(0,config.getInt("endGameDelay")); + gameOverTitle = config.getBoolean("gameOverTitle"); + try { countdownDisplay = CountdownDisplay.valueOf(config.getString("hideCountdownDisplay")); } catch (IllegalArgumentException e) { @@ -271,4 +284,4 @@ public class Config { return temp; } -}
\ No newline at end of file +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Items.java b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Items.java index e5f970b..8b4cddc 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Items.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Items.java @@ -16,6 +16,12 @@ import java.util.List; public class Items { public static List<ItemStack> HIDER_ITEMS, SEEKER_ITEMS; + public static ItemStack + HIDER_HELM, SEEKER_HELM, + HIDER_CHEST, SEEKER_CHEST, + HIDER_LEGS, SEEKER_LEGS, + HIDER_BOOTS, SEEKER_BOOTS; + public static List<PotionEffect> HIDER_EFFECTS, SEEKER_EFFECTS; public static void loadItems() { @@ -23,24 +29,60 @@ public class Items { ConfigManager manager = ConfigManager.create("items.yml"); SEEKER_ITEMS = new ArrayList<>(); + SEEKER_HELM = null; + SEEKER_CHEST = null; + SEEKER_LEGS = null; + SEEKER_BOOTS = null; ConfigurationSection SeekerItems = manager.getConfigurationSection("items.seeker"); int i = 1; while (true) { ConfigurationSection section = SeekerItems.getConfigurationSection(String.valueOf(i)); if (section == null) break; ItemStack item = createItem(section); - if (item != null) SEEKER_ITEMS.add(item); + if (item == null) continue; + String loc = section.getString("location"); + if (loc == null) { + SEEKER_ITEMS.add(item); + } else if (loc.equals("helmet")) { + SEEKER_HELM = item; + } else if (loc.equals("chestplate")) { + SEEKER_CHEST = item; + } else if (loc.equals("leggings")) { + SEEKER_LEGS = item; + } else if (loc.equals("boots")) { + SEEKER_BOOTS = item; + } else { + SEEKER_ITEMS.add(item); + } i++; } HIDER_ITEMS = new ArrayList<>(); + HIDER_HELM = null; + HIDER_CHEST = null; + HIDER_LEGS = null; + HIDER_BOOTS = null; ConfigurationSection HiderItems = manager.getConfigurationSection("items.hider"); i = 1; while (true) { ConfigurationSection section = HiderItems.getConfigurationSection(String.valueOf(i)); if (section == null) break; ItemStack item = createItem(section); - if (item != null) HIDER_ITEMS.add(item); + if (item == null) continue; + String loc = section.getString("location"); + if (loc == null) { + HIDER_ITEMS.add(item); + } else if (loc.equals("helmet")) { + HIDER_HELM = item; + } else if (loc.equals("chestplate")) { + HIDER_CHEST = item; + } else if (loc.equals("leggings")) { + HIDER_LEGS = item; + } else if (loc.equals("boots")) { + HIDER_BOOTS = item; + } else { + HIDER_ITEMS.add(item); + } i++; } SEEKER_EFFECTS = new ArrayList<>(); @@ -64,7 +106,6 @@ public class Items { if (effect != null) HIDER_EFFECTS.add(effect); i++; } - } private static ItemStack createItem(ConfigurationSection item) { diff --git a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Localization.java b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Localization.java index b9f9b69..babf759 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Localization.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Localization.java @@ -15,12 +15,14 @@ public class Localization { put("en-US", new String[][]{ {"WORLDBORDER_DECREASING"}, {"START","TAUNTED"}, - {"GAME_SETUP", "SETUP_GAME", "SETUP_LOBBY", "SETUP_SEEKER_LOBBY", "SETUP_EXIT", "SETUP_SAVEMAP", "SETUP_BOUNDS"} + {"GAME_SETUP", "SETUP_GAME", "SETUP_LOBBY", "SETUP_SEEKER_LOBBY", "SETUP_EXIT", "SETUP_SAVEMAP", "SETUP_BOUNDS"}, + {"GAME_PLAYER_FOUND", "GAME_PLAYER_FOUND_BY"} }); put("de-DE", new String[][]{ {}, {"TAUNTED"}, - {"GAME_SETUP", "SETUP_GAME", "SETUP_LOBBY", "SETUP_SEEKER_LOBBY", "SETUP_EXIT", "SETUP_SAVEMAP", "SETUP_BOUNDS"} + {"GAME_SETUP", "SETUP_GAME", "SETUP_LOBBY", "SETUP_SEEKER_LOBBY", "SETUP_EXIT", "SETUP_SAVEMAP", "SETUP_BOUNDS"}, + {"GAME_PLAYER_FOUND", "GAME_PLAYER_FOUND_BY"} }); }}; diff --git a/src/main/java/net/tylermurphy/hideAndSeek/database/GameDataTable.java b/src/main/java/net/tylermurphy/hideAndSeek/database/GameDataTable.java index 87378f9..d5fe7e6 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/database/GameDataTable.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/database/GameDataTable.java @@ -79,7 +79,6 @@ public class GameDataTable { rs.getInt("seeker_deaths") ); rs.close(); - connection.close(); CACHE.put(uuid, info); return info; } @@ -111,7 +110,6 @@ public class GameDataTable { rs.getInt("seeker_deaths") ); rs.close(); - connection.close(); CACHE.put(uuid, info); return info; } @@ -145,7 +143,6 @@ public class GameDataTable { infoList.add(info); } rs.close(); - connection.close(); return infoList; } catch (SQLException e) { Main.getInstance().getLogger().severe("SQL Error: " + e.getMessage()); @@ -190,8 +187,8 @@ public class GameDataTable { database.encodeUUID(info.getUniqueId()), info.getHiderWins() + (winners.contains(uuid) && type == WinType.HIDER_WIN ? 1 : 0), info.getSeekerWins() + (winners.contains(uuid) && type == WinType.SEEKER_WIN ? 1 : 0), - info.getHiderGames() + (board.isHider(uuid) || (board.isSeeker(uuid) && !board.getFirstSeeker().getUniqueId().equals(uuid)) ? 1 : 0), - info.getSeekerGames() + (board.getFirstSeeker().getUniqueId().equals(uuid) ? 1 : 0), + info.getHiderGames() + (board.isHider(uuid) || (board.isSeeker(uuid) && winners.contains(uuid)) ? 1 : 0), + info.getSeekerGames() + (board.isSeeker(uuid) && winners.contains(uuid) ? 1 : 0), info.getHiderKills() + hider_kills.getOrDefault(uuid, 0), info.getSeekerKills() + seeker_kills.getOrDefault(uuid, 0), info.getHiderDeaths() + hider_deaths.getOrDefault(uuid, 0), diff --git a/src/main/java/net/tylermurphy/hideAndSeek/database/connections/MySQLConnection.java b/src/main/java/net/tylermurphy/hideAndSeek/database/connections/MySQLConnection.java index e237e71..20e7c8e 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/database/connections/MySQLConnection.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/database/connections/MySQLConnection.java @@ -25,7 +25,6 @@ import net.tylermurphy.hideAndSeek.Main; import java.sql.Connection; import java.sql.SQLException; -import java.sql.Statement; import static net.tylermurphy.hideAndSeek.configuration.Config.*; diff --git a/src/main/java/net/tylermurphy/hideAndSeek/database/connections/SQLiteConnection.java b/src/main/java/net/tylermurphy/hideAndSeek/database/connections/SQLiteConnection.java index 1a03106..bbf330b 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/database/connections/SQLiteConnection.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/database/connections/SQLiteConnection.java @@ -52,7 +52,7 @@ public class SQLiteConnection implements DatabaseConnection { public Connection connect() { Connection conn = null; try { - String url = "jdbc:sqlite:"+databaseFile; + String url = "jdbc:sqlite:"+databaseFile.getPath(); conn = DriverManager.getConnection(url, config.toProperties()); } catch (SQLException e) { Main.getInstance().getLogger().severe(e.getMessage()); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java b/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java index 2050f33..4f6be2f 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java @@ -25,7 +25,7 @@ public class Board { SPECTATOR, } - private UUID initialSeeker = null; + private List<UUID> initialSeekers = null; private final Map<UUID, Type> Players = new HashMap<>(); private final Map<UUID, CustomBoard> customBoards = new HashMap<>(); private final Map<UUID, Integer> hider_kills = new HashMap<>(), seeker_kills = new HashMap<>(), hider_deaths = new HashMap<>(), seeker_deaths = new HashMap<>(); @@ -34,6 +34,10 @@ public class Board { return Players.containsKey(player.getUniqueId()); } + public boolean containsUUID(UUID uuid) { + return Players.containsKey(uuid); + } + public boolean isHider(Player player) { return isHider(player.getUniqueId()); } @@ -104,9 +108,15 @@ public class Board { .collect(Collectors.toList()); } - public Player getFirstSeeker() { - if(initialSeeker == null) return null; - return Bukkit.getPlayer(initialSeeker); + public void setInitialSeekers(List<UUID> seekers) { + initialSeekers = seekers; + } + + public List<Player> getInitialSeekers() { + if(initialSeekers == null) return null; + return initialSeekers.stream().map(u -> { + return Bukkit.getPlayer(u); + }).collect(Collectors.toList()); } public Player getPlayer(UUID uuid) { @@ -121,9 +131,6 @@ public class Board { } public void addSeeker(Player player) { - if(initialSeeker == null) { - initialSeeker = player.getUniqueId(); - } Players.put(player.getUniqueId(), Type.SEEKER); } @@ -347,7 +354,7 @@ public class Board { public void cleanup() { Players.clear();; - initialSeeker = null; + initialSeekers = null; customBoards.clear(); } @@ -415,13 +422,8 @@ class CustomBoard { seekerTeam.setNameTagVisibility(NameTagVisibility.NEVER); } } - if (Main.getInstance().supports(12)) { - hiderTeam.setColor(ChatColor.GOLD); - seekerTeam.setColor(ChatColor.RED); - } else { - hiderTeam.setPrefix(ChatColor.translateAlternateColorCodes('&', "&6")); - seekerTeam.setPrefix(ChatColor.translateAlternateColorCodes('&', "&c")); - } + hiderTeam.setPrefix(message("HIDER_TEAM_NAME").toString() + " " + ChatColor.RESET); + seekerTeam.setPrefix(message("SEEKER_TEAM_NAME").toString() + " " + ChatColor.RESET); } public void setLine(String key, String message) { @@ -487,4 +489,4 @@ class Line { this.message = message; } -}
\ No newline at end of file +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java b/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java index 41df9b8..36e48b0 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java @@ -58,6 +58,8 @@ public class Game { private int gameTimer; private boolean hiderLeft; + private Random random; + public Game(Map map, Board board) { this.currentMap = map; @@ -74,6 +76,8 @@ public class Game { this.startingTimer = -1; this.gameTimer = 0; this.hiderLeft = false; + + this.random = new Random(); } public Status getStatus(){ @@ -97,22 +101,28 @@ public class Game { } public void start() { - Player seeker; - try { - int rand = (int) (Math.random() * board.getPlayers().size()); - seeker = board.getPlayers().get(rand); - } catch (Exception e){ - Main.getInstance().getLogger().warning("Failed to select random seeker."); - return; - } - start(seeker); + List<Player> seekers = new ArrayList<>(startingSeekerCount); + List<Player> pool = board.getPlayers(); + for (int i = 0; i < startingSeekerCount; i++) { + try { + int rand = random.nextInt(0, pool.size()); + seekers.add(pool.remove(rand)); + } catch (Exception e){ + Main.getInstance().getLogger().warning("Failed to select random seeker."); + return; + } + } + start(seekers); } - public void start(Player seeker) { + public void start(List<Player> seekers) { if (mapSaveEnabled) currentMap.getWorldLoader().rollback(); board.reload(); - board.addSeeker(seeker); - PlayerLoader.loadSeeker(seeker, currentMap); + board.setInitialSeekers(seekers.stream().map(Player::getUniqueId).collect(Collectors.toList())); + seekers.forEach(seeker -> { + board.addSeeker(seeker); + PlayerLoader.loadSeeker(seeker, currentMap); + }); board.getPlayers().forEach(player -> { if(board.isSeeker(player)) return; board.addHider(player); @@ -133,10 +143,15 @@ public class Game { 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()); + board.getInitialSeekers().forEach(p -> { + winners.add(p.getUniqueId()); + }); + if (!waitTillNoneLeft && board.getHiders().size() == 1) { + winners.add(board.getHiders().get(0).getUniqueId()); + } Main.getInstance().getDatabase().getGameData().addWins(board, players, winners, board.getHiderKills(), board.getHiderDeaths(), board.getSeekerKills(), board.getSeekerDeaths(), type); } - Bukkit.getScheduler().scheduleSyncDelayedTask(Main.getInstance(), this::end, 5*20); + Bukkit.getScheduler().scheduleSyncDelayedTask(Main.getInstance(), this::end, endGameDelay*20); } public void end() { @@ -332,6 +347,12 @@ public class Game { } } + public void broadcastTitle(String title, String subtitle) { + for (Player player : board.getPlayers()) { + Titles.sendTitle(player, 10, 70, 20, title, subtitle); + } + } + public boolean isCurrentMapValid() { return currentMap != null && !currentMap.isNotSetup(); } @@ -351,26 +372,38 @@ public class Game { } private void checkWinConditions() { - if (board.sizeHider() < 1) { - if (hiderLeft) { + int hiderCount = board.sizeHider(); + if (hiderCount < 1 || (!waitTillNoneLeft && hiderCount < 2)) { + if (hiderLeft && dontRewardQuit) { if (announceMessagesToNonPlayers) Bukkit.broadcastMessage(gameOverPrefix + message("GAME_GAMEOVER_HIDERS_QUIT")); else broadcastMessage(gameOverPrefix + message("GAME_GAMEOVER_HIDERS_QUIT")); + if (gameOverTitle) broadcastTitle(message("GAME_TITLE_NO_WIN").toString(), message("GAME_GAMEOVER_HIDERS_QUIT").toString()); stop(WinType.NONE); } else { - if (announceMessagesToNonPlayers) Bukkit.broadcastMessage(gameOverPrefix + message("GAME_GAMEOVER_HIDERS_FOUND")); - else broadcastMessage(gameOverPrefix + message("GAME_GAMEOVER_HIDERS_FOUND")); + if (hiderCount < 1 || waitTillNoneLeft) { + if (announceMessagesToNonPlayers) Bukkit.broadcastMessage(gameOverPrefix + message("GAME_GAMEOVER_HIDERS_FOUND")); + else broadcastMessage(gameOverPrefix + message("GAME_GAMEOVER_HIDERS_FOUND")); + if (gameOverTitle) broadcastTitle(message("GAME_TITLE_SEEKERS_WIN").toString(), message("GAME_GAMEOVER_HIDERS_FOUND").toString()); + } else { + Player hider = board.getHiders().get(0); + if (announceMessagesToNonPlayers) Bukkit.broadcastMessage(gameOverPrefix + message("GAME_GAMEOVER_LAST_HIDER").addPlayer(hider)); + else broadcastMessage(gameOverPrefix + message("GAME_GAMEOVER_LAST_HIDER").addPlayer(hider)); + if (gameOverTitle) broadcastTitle(message("GAME_TITLE_SINGLE_HIDER_WIN").addPlayer(hider).toString(), message("GAME_SUBTITLE_SINGLE_HIDER_WIN").addPlayer(hider).toString()); + } stop(WinType.SEEKER_WIN); } } 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); + if (gameOverTitle) broadcastTitle(message("GAME_TITLE_NO_WIN").toString(), message("GAME_GAMEOVER_SEEKERS_QUIT").toString()); + stop(dontRewardQuit ? WinType.NONE : WinType.HIDER_WIN); } else if (gameTimer < 1) { if (announceMessagesToNonPlayers) Bukkit.broadcastMessage(gameOverPrefix + message("GAME_GAMEOVER_TIME")); else broadcastMessage(gameOverPrefix + message("GAME_GAMEOVER_TIME")); + if (gameOverTitle) broadcastTitle(message("GAME_TITLE_HIDERS_WIN").toString(), message("GAME_GAMEOVER_TIME").toString()); stop(WinType.HIDER_WIN); } hiderLeft = false; } -}
\ No newline at end of file +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/PlayerLoader.java b/src/main/java/net/tylermurphy/hideAndSeek/game/PlayerLoader.java index 4ee1f5c..9c2dd37 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/PlayerLoader.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/PlayerLoader.java @@ -67,19 +67,48 @@ public class PlayerLoader { Titles.sendTitle(player, 10, 70, 20, ChatColor.GRAY + "" + ChatColor.BOLD + "SPECTATING", ChatColor.WHITE + message("SPECTATOR_SUBTITLE").toString()); } + public static void loadDeadHiderSpectator(Player player, Map map) { + map.getGameSpawn().teleport(player); + loadPlayer(player); + player.setAllowFlight(true); + player.setFlying(true); + player.setFallDistance(0.0F); + player.getInventory().setItem(flightToggleItemPosition, flightToggleItem); + player.getInventory().setItem(teleportItemPosition, teleportItem); + Main.getInstance().getBoard().getPlayers().forEach(otherPlayer -> otherPlayer.hidePlayer(player)); + } + public static void resetPlayer(Player player, Board board){ if(board.isSpectator(player)) return; loadPlayer(player); if (board.isSeeker(player)) { - if (pvpEnabled) + if (pvpEnabled) { for(ItemStack item : Items.SEEKER_ITEMS) player.getInventory().addItem(item); + if (Items.SEEKER_HELM != null) + player.getInventory().setHelmet(Items.SEEKER_HELM); + if (Items.SEEKER_CHEST != null) + player.getInventory().setChestplate(Items.SEEKER_CHEST); + if (Items.SEEKER_LEGS != null) + player.getInventory().setLeggings(Items.SEEKER_LEGS); + if (Items.SEEKER_BOOTS != null) + player.getInventory().setBoots(Items.SEEKER_BOOTS); + } for(PotionEffect effect : Items.SEEKER_EFFECTS) player.addPotionEffect(effect); } else if (board.isHider(player)) { - if (pvpEnabled) + if (pvpEnabled) { for(ItemStack item : Items.HIDER_ITEMS) player.getInventory().addItem(item); + if (Items.HIDER_HELM != null) + player.getInventory().setHelmet(Items.HIDER_HELM); + if (Items.HIDER_CHEST != null) + player.getInventory().setChestplate(Items.HIDER_CHEST); + if (Items.HIDER_LEGS != null) + player.getInventory().setLeggings(Items.HIDER_LEGS); + if (Items.HIDER_BOOTS != null) + player.getInventory().setBoots(Items.HIDER_BOOTS); + } for(PotionEffect effect : Items.HIDER_EFFECTS) player.addPotionEffect(effect); if (glowEnabled) { 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 27347c2..d83b702 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/ChatHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/ChatHandler.java @@ -9,7 +9,7 @@ import org.bukkit.event.player.AsyncPlayerChatEvent; public class ChatHandler implements Listener { - @EventHandler(priority = EventPriority.HIGHEST) + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void onChat(AsyncPlayerChatEvent event) { if (Main.getInstance().getBoard().isSpectator(event.getPlayer())) { event.setCancelled(true); 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 37537d6..7f3f22e 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DamageHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DamageHandler.java @@ -94,7 +94,7 @@ public class DamageHandler implements Listener { // Reveal player if they are disguised Main.getInstance().getDisguiser().reveal(player); // Teleport player to seeker spawn - if(delayedRespawn){ + if(delayedRespawn && !respawnAsSpectator){ game.getCurrentMap().getGameSeekerLobby().teleport(player); player.sendMessage(messagePrefix + message("RESPAWN_NOTICE").addAmount(delayedRespawnDelay)); Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(Main.getInstance(), () -> { @@ -117,10 +117,14 @@ public class DamageHandler implements Listener { } else { game.broadcastMessage(message("GAME_PLAYER_FOUND_BY").addPlayer(player).addPlayer(attacker).toString()); } - board.addSeeker(player); + if (respawnAsSpectator) { + board.addSpectator(player); + PlayerLoader.loadDeadHiderSpectator(player, game.getCurrentMap()); + } else { + board.addSeeker(player); + PlayerLoader.resetPlayer(player, board); + } } - //Reload player - PlayerLoader.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 0326391..95577ee 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InteractHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InteractHandler.java @@ -3,8 +3,10 @@ package net.tylermurphy.hideAndSeek.game.listener; import com.cryptomorin.xseries.XMaterial; import com.cryptomorin.xseries.messages.ActionBar; import net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.game.Board; import net.tylermurphy.hideAndSeek.game.util.Status; import org.bukkit.ChatColor; +import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -13,6 +15,8 @@ import org.bukkit.event.block.Action; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.BookMeta; +import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.SkullMeta; import java.util.ArrayList; @@ -94,17 +98,82 @@ public class InteractHandler implements Listener { return; } if(temp.isSimilar(teleportItem)){ - int amount = Main.getInstance().getBoard().getHiders().size() + Main.getInstance().getBoard().getSeekers().size(); - Inventory teleportMenu = Main.getInstance().getServer().createInventory(null, 9*(((amount-1)/9)+1), ChatColor.stripColor(teleportItem.getItemMeta().getDisplayName())); - List<String> hider_lore = new ArrayList<>(); hider_lore.add(message("HIDER_TEAM_NAME").toString()); - Main.getInstance().getBoard().getHiders().forEach(hider -> teleportMenu.addItem(getSkull(hider, hider_lore))); - List<String> seeker_lore = new ArrayList<>(); seeker_lore.add(message("SEEKER_TEAM_NAME").toString()); - Main.getInstance().getBoard().getSeekers().forEach(seeker -> teleportMenu.addItem(getSkull(seeker, seeker_lore))); - event.getPlayer().openInventory(teleportMenu); + // int amount = Main.getInstance().getBoard().getHiders().size() + Main.getInstance().getBoard().getSeekers().size(); + // Inventory teleportMenu = Main.getInstance().getServer().createInventory(null, 9*(((amount-1)/9)+1), ChatColor.stripColor(teleportItem.getItemMeta().getDisplayName())); + // List<String> hider_lore = new ArrayList<>(); hider_lore.add(message("HIDER_TEAM_NAME").toString()); + // Main.getInstance().getBoard().getHiders().forEach(hider -> teleportMenu.addItem(getSkull(hider, hider_lore))); + // List<String> seeker_lore = new ArrayList<>(); seeker_lore.add(message("SEEKER_TEAM_NAME").toString()); + // Main.getInstance().getBoard().getSeekers().forEach(seeker -> teleportMenu.addItem(getSkull(seeker, seeker_lore))); + // event.getPlayer().openInventory(teleportMenu); + createSpectatorTeleportPage(event.getPlayer(), 0); } } - private ItemStack getSkull(Player player, List<String> lore){ + public static void createSpectatorTeleportPage(Player player, int page) { + + if (page < 0) { + return; + } + + final Board board = Main.getInstance().getBoard(); + List<Player> players = new ArrayList<>(); + players.addAll(board.getHiders()); + players.addAll(board.getSeekers()); + + final int page_size = 9 * 5; + final int amount = players.size(); + final int start = page * page_size; + + int page_amount = amount - start; + + if (page_amount < 1) { + return; + } + + boolean next = false, prev = true; + + if (page_amount > page_size) { + page_amount = page_size; + next = true; + } + + if (page == 0) { + prev = false; + } + + final int rows = ((amount - 1) / 9) + 2; + + final Inventory teleportMenu = Main.getInstance().getServer().createInventory(null, 9 * rows, ChatColor.stripColor(teleportItem.getItemMeta().getDisplayName())); + + final List<String> hider_lore = new ArrayList<>(); hider_lore.add(message("HIDER_TEAM_NAME").toString()); + final List<String> seeker_lore = new ArrayList<>(); seeker_lore.add(message("SEEKER_TEAM_NAME").toString()); + + for (int i = 0; i < page_amount; i++) { + Player plr = players.get(i); + teleportMenu.addItem(getSkull(plr, board.isHider(plr) ? hider_lore : seeker_lore)); + } + + final int lastRow = (rows - 1) * 9; + if (prev) { + teleportMenu.setItem(lastRow, getPageItem(page - 1)); + } + + if (next) { + teleportMenu.setItem(lastRow + 8, getPageItem(page + 1)); + } + + player.openInventory(teleportMenu); + } + + private static ItemStack getPageItem(int page) { + ItemStack prevItem = new ItemStack(XMaterial.ENCHANTED_BOOK.parseMaterial(), page + 1); + ItemMeta meta = prevItem.getItemMeta(); + meta.setDisplayName("Page " + (page+1)); + prevItem.setItemMeta(meta); + return prevItem; + } + + private static ItemStack getSkull(Player player, List<String> lore){ assert XMaterial.PLAYER_HEAD.parseMaterial() != null; ItemStack playerHead = new ItemStack(XMaterial.PLAYER_HEAD.parseMaterial(), 1, (byte) 3); SkullMeta playerHeadMeta = (SkullMeta) playerHead.getItemMeta(); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InventoryHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InventoryHandler.java index 0f306b1..dd30e60 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InventoryHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InventoryHandler.java @@ -32,6 +32,8 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; public class InventoryHandler implements Listener { @@ -52,13 +54,30 @@ public class InventoryHandler implements Listener { private void checkForSpectatorTeleportMenu(InventoryClickEvent event){ Player player = (Player) event.getWhoClicked(); - if (Main.getInstance().getBoard().isSpectator(player) && event.getCurrentItem().getType() == XMaterial.PLAYER_HEAD.parseMaterial()) { - event.setCancelled(true); - player.closeInventory(); - String name = event.getCurrentItem().getItemMeta().getDisplayName(); - Player clicked = Main.getInstance().getServer().getPlayer(name); - if(clicked == null) return; - player.teleport(clicked); + + ItemStack item = event.getCurrentItem(); + ItemMeta meta = item.getItemMeta(); + String name = meta.getDisplayName(); + + if (Main.getInstance().getBoard().isSpectator(player)) { + if (XMaterial.PLAYER_HEAD.isSimilar(item)) { + event.setCancelled(true); + player.closeInventory(); + Player clicked = Main.getInstance().getServer().getPlayer(name); + if (clicked == null) return; + player.teleport(clicked); + } else if (XMaterial.ENCHANTED_BOOK.isSimilar(item)) { + event.setCancelled(true); + player.closeInventory(); + if (!name.startsWith("Page ")) return; + String number_str = name.substring(5); + try { + int page = Integer.parseInt(number_str); + InteractHandler.createSpectatorTeleportPage(player, page - 1); + } catch(Exception ignored) { + return; + } + } } } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/util/PAPIExpansion.java b/src/main/java/net/tylermurphy/hideAndSeek/util/PAPIExpansion.java index 8e4078e..2d80b88 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/util/PAPIExpansion.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/util/PAPIExpansion.java @@ -4,6 +4,9 @@ import me.clip.placeholderapi.expansion.PlaceholderExpansion; import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.database.Database; import net.tylermurphy.hideAndSeek.database.util.PlayerInfo; +import net.tylermurphy.hideAndSeek.game.Board; +import net.tylermurphy.hideAndSeek.game.util.Status; + import org.bukkit.OfflinePlayer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -28,7 +31,7 @@ public class PAPIExpansion extends PlaceholderExpansion { @Override public @NotNull String getVersion() { - return "1.4.3"; + return "1.7.5"; } @Override @@ -41,8 +44,33 @@ public class PAPIExpansion extends PlaceholderExpansion { public String onRequest(OfflinePlayer player, @NotNull String params) { Database database = Main.getInstance().getDatabase(); String[] args = params.split("_"); + Status status = Main.getInstance().getGame().getStatus(); + Board board = Main.getInstance().getBoard(); + + System.out.println(args); if (args.length < 1) return null; + + if (args.length == 1 && args[0].equals("hiders")) { + if (!board.containsUUID(player.getUniqueId())) { + return "-"; + } else if (status == Status.PLAYING || status == Status.STARTING) { + return "" + Main.getInstance().getBoard().getHiders().size(); + } else { + return "-"; + } + } + + if (args.length == 1 && args[0].equals("seekers")) { + if (!board.containsUUID(player.getUniqueId())) { + return "-"; + } else if (status == Status.PLAYING || status == Status.STARTING) { + return "" + Main.getInstance().getBoard().getSeekers().size(); + } else { + return "-"; + } + } + if ((args.length == 2 || args.length == 3) && (args[0].equals("stats") || args[0].equals("rank-place"))) { Optional<PlayerInfo> info = this.getPlayerInfo(args.length == 2 ? player.getUniqueId() : database.getNameData().getUUID(args[2])); if (info.isPresent()) { diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 5316402..a514b56 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -48,6 +48,33 @@ permissionsRequired: true # default: 2 minPlayers: 2 +# Amount of initial seekers when game starts +# default: 1 +startingSeekerCount: 1 + +# By default, when a HIDER dies they will join the SEEKER team. If enabled they will instead become a spectator +# default: false +respawnAsSpectator: false + +# If enabled, the game will go until no hiders are left. If the timer runs out all hiders left will be marked as winning. +# If disabled the game wll go until there is only one hider left. If the timer runs out, all hiders left win, if t here is one +# hider left, all inital seekers win along with the last hider. +# default: true +waitTillNoneLeft: true + +# By default, if the last hider or seeker quits the game, a win type of NONE is given, which doesnt mark anyone as winning. This can be +# used as a way to prevent players form quitting in a loop to get someone else points. +# default: true +dontRewardQuit: true + +# The amount of seconds the game will wait until the players are teleported to the lobby after a game over +# default: 5 +endGameDelay: 5 + +# Along with a chat message, display a title describing the gameover +# default: false +gameOverTitle: false + # This plugin by default functions as not tag to catch Hiders, but to pvp. All players are given weapons, # and seekers slightly better weapons (this can be changed in items.yml). If you want, you can disable this # entire pvp functionality, and make Hiders get found on a single hit. Hiders would also not be able to fight @@ -304,4 +331,4 @@ exit: x: 0 y: 0 z: 0 - world: "world"
\ No newline at end of file + world: "world" diff --git a/src/main/resources/lang/localization_de-DE.yml b/src/main/resources/lang/localization_de-DE.yml index 92309ee..ca98ea2 100644 --- a/src/main/resources/lang/localization_de-DE.yml +++ b/src/main/resources/lang/localization_de-DE.yml @@ -12,12 +12,18 @@ Localization: COMMAND_ERROR: "Ein unbekannter Fehler ist aufgetreten." COMMAND_INVALID_ARG: "Ungültiges Argument: {AMOUNT}" GAME_PLAYER_DEATH: "&c{PLAYER}&f ist gestorben." - GAME_PLAYER_FOUND: "&e{PLAYER}&f wurde gefunden und ist nun ein Seeker." - GAME_PLAYER_FOUND_BY: "&e{PLAYER}&f wurde von &c{PLAYER}&f gefunden und ist nun ein Seeker." + GAME_PLAYER_FOUND: "&e{PLAYER}&f wurde gefunden" + GAME_PLAYER_FOUND_BY: "&e{PLAYER}&f wurde von &c{PLAYER}&f gefunden" GAME_GAMEOVER_HIDERS_FOUND: "Alle Hider wurden gefunden." + GAME_GAMEOVER_LAST_HIDER: "Der letzte Hider, &e{PLAYER}&f, hat gewonnen!" GAME_GAMEOVER_SEEKERS_QUIT: "All Seeker haben das Spiel verlassen." GAME_GAMEOVER_HIDERS_QUIT: "All Hider haben das Spiel verlassen." GAME_GAMEOVER_TIME: "Seekers haben keine Spielzeit mehr. Die Hiders haben gewonnen!" + GAME_TITLE_HIDERS_WIN: "&aHiders haben gewonnen!" + GAME_TITLE_SINGLE_HIDER_WIN: "&a{PLAYER} haben gewonnen!" + GAME_TITLE_SEEKERS_WIN: "&cSeekers haben gewonnen!" + GAME_TITLE_NO_WIN: "&bSpiel ist aus" + GAME_SUBTITLE_SINGLE_HIDER_WIN: "{PLAYER} ist der letzte lebende Hider!" GAME_SETUP: "Es gibt keine Setup-Karten! Führen Sie /hs map status auf einer Karte aus, um zu sehen, was Sie tun müssen." GAME_INGAME: "Du bist bereits in der Lobby oder im Spiel." GAME_NOT_INGAME: "Du bist weder in einer Lobby noch in einem Spiel." @@ -128,5 +134,5 @@ Localization: CONFIRMATION: "Führen Sie /hs confirm innerhalb von 10s aus, um zu bestätigen." # DO NOT EDIT IT OR IT MAY BREAK OR RESET FILE -version: 4 +version: 5 type: "de-DE" diff --git a/src/main/resources/lang/localization_en-US.yml b/src/main/resources/lang/localization_en-US.yml index 062f4f2..a2a2223 100644 --- a/src/main/resources/lang/localization_en-US.yml +++ b/src/main/resources/lang/localization_en-US.yml @@ -12,12 +12,18 @@ Localization: COMMAND_ERROR: "An internal error has occurred." COMMAND_INVALID_ARG: "Invalid argument: {AMOUNT}" GAME_PLAYER_DEATH: "&c{PLAYER}&f was killed." - GAME_PLAYER_FOUND: "&e{PLAYER}&f was found and became a seeker." - GAME_PLAYER_FOUND_BY: "&e{PLAYER}&f was found by &c{PLAYER}&f and became a seeker." + GAME_PLAYER_FOUND: "&e{PLAYER}&f was found" + GAME_PLAYER_FOUND_BY: "&e{PLAYER}&f was found by &c{PLAYER}&f" GAME_GAMEOVER_HIDERS_FOUND: "All hiders have been found." + GAME_GAMEOVER_LAST_HIDER: "The last hider, &e{PLAYER}&f, has won!" GAME_GAMEOVER_SEEKERS_QUIT: "All seekers have quit." GAME_GAMEOVER_HIDERS_QUIT: "All hiders have quit." GAME_GAMEOVER_TIME: "Seekers ran out of time. Hiders win!" + GAME_TITLE_HIDERS_WIN: "&aHiders Win!" + GAME_TITLE_SINGLE_HIDER_WIN: "&a{PLAYER} Wins!" + GAME_TITLE_SEEKERS_WIN: "&cSeekers Win!" + GAME_TITLE_NO_WIN: "&bGame Over" + GAME_SUBTITLE_SINGLE_HIDER_WIN: "{PLAYER} is the last hider alive!" GAME_SETUP: "There are no setup maps! Run /hs map status on a map to see what you need to do." GAME_INGAME: "You are already in the lobby/game." GAME_NOT_INGAME: "You are not in a lobby/game." @@ -128,5 +134,5 @@ Localization: CONFIRMATION: "Run /hs confirm within 10s to confirm." # DO NOT EDIT IT OR IT MAY BREAK OR RESET FILE -version: 4 -type: "en-US"
\ No newline at end of file +version: 5 +type: "en-US" diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index dc8cab1..777c1ba 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,6 +1,6 @@ name: KenshinsHideAndSeek main: net.tylermurphy.hideAndSeek.Main -version: 1.7.4 +version: 1.7.5 author: KenshinEto load: STARTUP api-version: 1.13 |