summaryrefslogtreewikicommitdiff
path: root/src/main/java/dev/tylerm/khs/game/Game.java
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/main/java/dev/tylerm/khs/game/Game.java (renamed from src/main/java/net/tylermurphy/hideAndSeek/game/Game.java)97
1 files changed, 66 insertions, 31 deletions
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java b/src/main/java/dev/tylerm/khs/game/Game.java
index 41df9b8..ac7e808 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java
+++ b/src/main/java/dev/tylerm/khs/game/Game.java
@@ -17,19 +17,21 @@
*
*/
-package net.tylermurphy.hideAndSeek.game;
+package dev.tylerm.khs.game;
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.tylermurphy.hideAndSeek.Main;
-import net.tylermurphy.hideAndSeek.configuration.Map;
-import net.tylermurphy.hideAndSeek.configuration.Maps;
-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.game.util.*;
+import dev.tylerm.khs.game.events.Glow;
+import dev.tylerm.khs.game.events.Taunt;
+import dev.tylerm.khs.game.listener.RespawnHandler;
+import dev.tylerm.khs.game.util.CountdownDisplay;
+import dev.tylerm.khs.game.util.Status;
+import dev.tylerm.khs.Main;
+import dev.tylerm.khs.configuration.Map;
+import dev.tylerm.khs.configuration.Maps;
+import dev.tylerm.khs.game.util.WinType;
import org.bukkit.*;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
@@ -38,8 +40,8 @@ import org.bukkit.inventory.ItemStack;
import java.util.*;
import java.util.stream.Collectors;
-import static net.tylermurphy.hideAndSeek.configuration.Config.*;
-import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
+import static dev.tylerm.khs.configuration.Config.*;
+import static dev.tylerm.khs.configuration.Localization.message;
public class Game {
@@ -58,6 +60,8 @@ public class Game {
private int gameTimer;
private boolean hiderLeft;
+ private Random random;
+
public Game(Map map, Board board) {
this.currentMap = map;
@@ -74,6 +78,8 @@ public class Game {
this.startingTimer = -1;
this.gameTimer = 0;
this.hiderLeft = false;
+
+ this.random = new Random();
}
public Status getStatus(){
@@ -97,22 +103,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);
@@ -122,7 +134,7 @@ public class Game {
currentMap.getWorldBorder().resetWorldBorder();
if (gameLength > 0) gameTimer = gameLength;
status = Status.STARTING;
- startingTimer = 30;
+ startingTimer = hidingTimer;
}
private void stop(WinType type) {
@@ -133,10 +145,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 +349,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 +374,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
+}