src/main/java/noahnok/dbdl/files/game/DGame.java
package noahnok.dbdl.files.game;
import lombok.Getter;
import lombok.Setter;
import net.md_5.bungee.api.ChatMessageType;
import net.md_5.bungee.api.chat.TextComponent;
import noahnok.dbdl.files.DeadByDaylight;
import noahnok.dbdl.files.game.generators.Generator;
import noahnok.dbdl.files.game.levers.DLever;
import noahnok.dbdl.files.player.DPlayer;
import noahnok.dbdl.files.player.PlayerStatus;
import org.bukkit.*;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import java.util.*;
import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.Collectors;
public class DGame {
@Getter
private final String id;
@Getter
private final Set<DPlayer> players = new HashSet<>();
private final Map<UUID, Boolean> allowMove = new HashMap<>();
@Getter
private final List<Generator> generators = new ArrayList<>();
@Getter
private final List<ExitGate> exitGates = new ArrayList<>();
private DeadByDaylight main;
@Getter
private DArena arena;
@Getter
private DGamemode gamemode;
@Getter
@Setter
private STATUS status;
private boolean usesLobby;
private Location lobbyLocation;
private boolean customGame;
private boolean showInPool;
@Getter
private int finishedGens;
@Getter
private boolean canOpenGates = false;
@Getter
@Setter
private boolean canEscape = false;
@Setter
private Countdown cd;
@Getter
@Setter
private InGameCountdown igCD;
public DGame(DArena arena, DGamemode gamemode, STATUS status, DeadByDaylight main) {
this.arena = arena;
this.gamemode = gamemode;
this.status = status;
this.main = main;
this.id = main.getGameManager().generateGameID(this);
}
public void moveToDead(UUID id) {
main.getDPlayerManager().getPlayer(id).setStatus(PlayerStatus.DEAD);
}
public void moveToEscaped(UUID id) {
main.getDPlayerManager().getPlayer(id).setStatus(PlayerStatus.ESCAPED);
main.getGameManager().canGameEnd(this);
}
public DLever getLeverAtBlock(Block block) {
for (ExitGate gate : exitGates) {
if (gate.getLever1().getBlock().equals(block)) {
return gate.getLever1();
}
if (gate.getLever2().getBlock().equals(block)) {
return gate.getLever2();
}
}
return null;
}
public void incrementGens() {
finishedGens++;
if (finishedGens >= 5) {
announce("The exit gates have been powered! Go open them!");
for (Generator gen : generators) {
gen.complete();
}
canOpenGates = true;
}
}
private void allowPlayerMove(UUID id) {
allowMove.put(id, true);
}
private void disallowPlayerMove(UUID id) {
allowMove.put(id, false);
}
public DPlayer getPlayer(UUID id) {
for (DPlayer player : players) {
if (player.getId().equals(id)) {
return player;
}
}
return null;
}
public boolean canPlayerMove(UUID id) {
if (allowMove.get(id) == null) {
return true;
}
return allowMove.get(id);
}
public void allowAllMove() {
for (DPlayer player : players) {
allowPlayerMove(player.getId());
}
}
public void disallowAllMove() {
for (DPlayer player : players) {
disallowPlayerMove(player.getId());
}
}
public int totalCurrentPlayers() {
return players.size();
}
public int totalPossiblePlayers() {
return gamemode.getHunters() + gamemode.getHunted();
}
public void teleportPlayers() {
Set<Location> huntedspawns = new HashSet<>(arena.getPossibleHuntedSpawns());
Set<Location> hunterspawns = new HashSet<>(arena.getPossibleHunterSpawns());
for (DPlayer player : players) {
if (player.getStatus().equals(PlayerStatus.HUNTED)) {
Location loc = getRandomLocation(huntedspawns);
huntedspawns.remove(loc);
main.getServer().getPlayer(player.getId()).teleport(loc);
} else {
Location loc = getRandomLocation(hunterspawns);
hunterspawns.remove(loc);
main.getServer().getPlayer(player.getId()).teleport(loc);
}
}
}
private Location getRandomLocation(Set<Location> locations) {
if (locations.size() == 1) {
return locations.iterator().next();
}
main.getLogger().info("size: " + locations.size());
int rand = ThreadLocalRandom.current().nextInt(1, locations.size()) - 1;
main.getLogger().info("rand: " + rand);
int i = 0;
for (Location loc : locations) {
if (i == rand) {
return loc;
}
i++;
}
return locations.iterator().next();
}
public void endGame() {
for (DPlayer player : players) {
Player actual = player.getPlayer();
actual.teleport(Bukkit.getServer().getWorld("world").getSpawnLocation());
player.setSpectating(false);
actual.setGameMode(GameMode.SURVIVAL);
actual.setHealth(20D);
actual.setSaturation(20F);
actual.setFoodLevel(20);
actual.setFlying(false);
player.resetPlayerState();
player.setCurrentGame(null);
player.stopSpectating();
}
players.clear();
}
public boolean isHunter(UUID id) {
for (DPlayer player : players) {
if (player.getId().equals(id)) {
if (player.getStatus() == PlayerStatus.HUNTER
|| player.getStatus() == PlayerStatus.CARRYING) {
return true;
}
}
}
return false;
}
public Generator isGenerator(Block block) {
for (Generator gen : generators) {
if (gen.getBlock().equals(block)) {
return gen;
}
}
return null;
}
public void kill() {
this.arena.setInUse(false);
this.arena = null;
this.cd = null;
this.gamemode = null;
this.status = null;
this.main = null;
}
public Set<DPlayer> getHunted() {
return players.stream().filter(player -> player.getStatus() == PlayerStatus.HUNTED)
.collect(Collectors.toCollection(HashSet::new));
}
public Set<DPlayer> getHunters() {
return players.stream().filter(player -> player.getStatus() == PlayerStatus.HUNTER ||
player.getStatus() == PlayerStatus.CARRYING).collect(Collectors.toCollection(HashSet::new));
}
public void announceJoin(Player p) {
for (DPlayer player : players) {
Player reciever = main.getServer().getPlayer(player.getId());
reciever.spigot().sendMessage(ChatMessageType.ACTION_BAR,
TextComponent.fromLegacyText(ChatColor.GOLD + p.getName() + ChatColor.GRAY + " joined the game!"));
reciever.sendMessage(main.prefix + ChatColor.GOLD + p.getName() + ChatColor.GRAY + " joined the game!");
}
p.sendMessage(main.prefix + "You joined the game!");
}
public void announceLeave(Player p) {
for (DPlayer player : players) {
Player reciever = main.getServer().getPlayer(player.getId());
reciever.spigot().sendMessage(ChatMessageType.ACTION_BAR,
TextComponent.fromLegacyText(ChatColor.GOLD + p.getName() + ChatColor.GRAY + " left the game!"));
reciever.sendMessage(main.prefix + ChatColor.GOLD + p.getName() + ChatColor.GRAY + " left the game!");
}
p.sendMessage(main.prefix + "You left the game!");
}
public void announce(String message) {
for (DPlayer player : players) {
sendAB(message, player.getId());
main.getServer().getPlayer(player.getId()).sendMessage(main.prefix + message);
}
}
private void sendAB(String message, UUID id) {
Bukkit.getServer().getPlayer(id).spigot().sendMessage(ChatMessageType.ACTION_BAR,
TextComponent.fromLegacyText(ChatColor.translateAlternateColorCodes('&', message)));
}
public double getMultiplier() {
int playercount = players.size() - 1;
switch (playercount) {
case 4:
return 1.0;
case 3:
return 1.25;
case 2:
return 1.75;
case 1:
return 2.5;
default:
return 1.0;
}
}
public void sendPlayersStats() {
for (DPlayer dplayer : players) {
String message = "";
switch (dplayer.getPlayerState().getEndGameState()) {
case ESCAPED:
message = "You escaped the " + ChatColor.BLACK + "Hunter";
break;
case DEAD:
message = "You " + ChatColor.BLACK + "Died";
break;
case SACRIFICED:
message = "You were " + ChatColor.DARK_RED + "Sacrificed to the " + ChatColor.BLACK + "Entity";
break;
// Always the hunter,, if not used as a fail safe!
case NONE:
message = "You have displeased the " + ChatColor.BLACK + "Entity";
break;
}
Player player = dplayer.getPlayer();
player.sendMessage(main.prefix + message);
player.sendMessage(ChatColor.GRAY + "You have recieved " + ChatColor.DARK_RED +
dplayer.getGameScore() + " Bloodpoints");
dplayer.setBloodPoints(dplayer.getBloodPoints() + dplayer.getGameScore());
dplayer.addToStaticScore(dplayer.getGameScore());
main.getSqlManager().uploadUserStats(dplayer);
dplayer.clearGameScore();
}
}
public void countDownBleep(int timeLeft) {
for (DPlayer player : players) {
Player actual = player.getPlayer();
actual.spigot().sendMessage(ChatMessageType.ACTION_BAR,
TextComponent.fromLegacyText(ChatColor.translateAlternateColorCodes('&',
"&7Summoned in " + timeLeft + "s")));
actual.setLevel(timeLeft);
actual.playSound(actual.getLocation(), Sound.BLOCK_NOTE_PLING, 1.0F, 1.0F);
}
}
public void gameStartBleep(int timeLeft) {
for (DPlayer player : players) {
Player actual = player.getPlayer();
actual.spigot().sendMessage(ChatMessageType.ACTION_BAR,
TextComponent.fromLegacyText(ChatColor.translateAlternateColorCodes('&',
"&7Game starts in " + timeLeft + "s")));
actual.setLevel(timeLeft);
actual.playSound(actual.getLocation(), Sound.BLOCK_NOTE_PLING, 1.0F, 2.0F);
}
}
public void startGameSound() {
for (DPlayer player : players) {
Player actual = player.getPlayer();
actual.playSound(actual.getLocation(), Sound.ENTITY_WITHER_SPAWN, 1.0F, 1.0F);
}
}
public void endGameSound() {
for (DPlayer player : players) {
Player actual = player.getPlayer();
actual.playSound(actual.getLocation(), Sound.ENTITY_WITHER_DEATH, 1.0F, 1.0F);
}
}
}