summaryrefslogtreewikicommitdiff
path: root/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/Start.java41
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/util/CommandGroup.java2
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java19
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/configuration/Items.java47
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/configuration/Localization.java6
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/database/GameDataTable.java7
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/database/connections/MySQLConnection.java1
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/database/connections/SQLiteConnection.java2
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/Board.java34
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/Game.java73
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/PlayerLoader.java33
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/listener/ChatHandler.java2
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/listener/DamageHandler.java12
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/listener/InteractHandler.java85
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/listener/InventoryHandler.java33
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/util/PAPIExpansion.java30
-rw-r--r--src/main/resources/config.yml29
-rw-r--r--src/main/resources/lang/localization_de-DE.yml12
-rw-r--r--src/main/resources/lang/localization_en-US.yml14
-rw-r--r--src/main/resources/plugin.yml2
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