kenshinshideandseek/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java

395 lines
14 KiB
Java
Raw Normal View History

/*
* This file is part of Kenshins Hide and Seek
*
* Copyright (c) 2021 Tyler Murphy.
*
* Kenshins Hide and Seek free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
2021-12-27 19:14:32 +00:00
* he Free Software Foundation version 3.
*
* Kenshins Hide and Seek is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
2021-12-26 22:58:18 +00:00
package net.tylermurphy.hideAndSeek.game;
import static net.tylermurphy.hideAndSeek.configuration.Config.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import net.tylermurphy.hideAndSeek.util.Status;
2022-04-11 16:36:11 +00:00
import net.tylermurphy.hideAndSeek.util.Version;
2021-12-26 22:58:18 +00:00
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.scoreboard.*;
public class Board {
private static final List<String> Hider = new ArrayList<>(), Seeker = new ArrayList<>(), Spectator = new ArrayList<>();
private static final Map<String, Player> playerList = new HashMap<>();
private static final Map<String, CustomBoard> customBoards = new HashMap<>();
public static boolean isPlayer(Player player) {
return playerList.containsKey(player.getName());
}
2021-12-29 04:37:54 +00:00
public static boolean isPlayer(String name){
return playerList.containsKey(name);
}
2021-12-26 22:58:18 +00:00
public static boolean isPlayer(CommandSender sender) {
return playerList.containsKey(sender.getName());
}
public static boolean isHider(Player player) {
return Hider.contains(player.getName());
}
public static boolean isSeeker(Player player) {
return Seeker.contains(player.getName());
}
public static boolean isSpectator(Player player) {
return Spectator.contains(player.getName());
}
public static int sizeHider() {
return Hider.size();
}
public static int sizeSeeker() {
return Seeker.size();
}
public static int size() {
return playerList.values().size();
}
public static List<Player> getHiders(){
return Hider.stream().map(playerList::get).collect(Collectors.toList());
}
public static List<Player> getSeekers(){
return Seeker.stream().map(playerList::get).collect(Collectors.toList());
}
public static Player getFirstSeeker(){
return playerList.get(Seeker.get(0));
}
public static List<Player> getSpectators(){
return Spectator.stream().map(playerList::get).collect(Collectors.toList());
}
public static List<Player> getPlayers(){
return new ArrayList<>(playerList.values());
}
public static Player getPlayer(String name) {
return playerList.get(name);
}
public static void addHider(Player player) {
Hider.add(player.getName());
Seeker.remove(player.getName());
Spectator.remove(player.getName());
playerList.put(player.getName(), player);
}
public static void addSeeker(Player player) {
Hider.remove(player.getName());
Seeker.add(player.getName());
Spectator.remove(player.getName());
playerList.put(player.getName(), player);
}
public static void addSpectator(Player player) {
Hider.remove(player.getName());
Seeker.remove(player.getName());
Spectator.add(player.getName());
playerList.put(player.getName(), player);
}
public static void remove(Player player) {
Hider.remove(player.getName());
Seeker.remove(player.getName());
Spectator.remove(player.getName());
playerList.remove(player.getName());
}
public static boolean onSameTeam(Player player1, Player player2) {
if(Hider.contains(player1.getName()) && Hider.contains(player2.getName())) return true;
else if(Seeker.contains(player1.getName()) && Seeker.contains(player2.getName())) return true;
else return Spectator.contains(player1.getName()) && Spectator.contains(player2.getName());
}
public static void reload() {
Hider.clear();
Seeker.clear();
Spectator.clear();
}
public static void createLobbyBoard(Player player) {
createLobbyBoard(player, true);
}
private static void createLobbyBoard(Player player, boolean recreate) {
CustomBoard board = customBoards.get(player.getName());
if(recreate) {
board = new CustomBoard(player, "&l&eHIDE AND SEEK");
board.updateTeams();
}
board.setLine("hiders", ChatColor.BOLD + "" + ChatColor.YELLOW + "HIDER %" + ChatColor.WHITE + getHiderPercent());
board.setLine("seekers", ChatColor.BOLD + "" + ChatColor.RED + "SEEKER %" + ChatColor.WHITE + getSeekerPercent());
board.addBlank();
board.setLine("players", "Players: " + playerList.values().size());
board.addBlank();
if(lobbyCountdownEnabled){
if(Game.countdownTime == -1){
board.setLine("waiting", "Waiting for players...");
} else {
board.setLine("waiting", "Starting in: "+ChatColor.GREEN + Game.countdownTime+"s");
}
} else {
board.setLine("waiting", "Waiting for gamemaster...");
}
board.display();
customBoards.put(player.getName(), board);
}
public static void createGameBoard(Player player){
createGameBoard(player, true);
}
private static void createGameBoard(Player player, boolean recreate){
CustomBoard board = customBoards.get(player.getName());
if(recreate) {
board = new CustomBoard(player, "&l&eHIDE AND SEEK");
board.updateTeams();
}
board.setLine("hiders", ChatColor.BOLD + "" + ChatColor.YELLOW + "HIDERS:" + ChatColor.WHITE + " " + Hider.size());
board.setLine("seekers", ChatColor.BOLD + "" + ChatColor.RED + "SEEKERS:" + ChatColor.WHITE + " " + Seeker.size());
board.addBlank();
if(glowEnabled){
if(Game.glow == null || Game.status == Status.STARTING || !Game.glow.isRunning())
board.setLine("glow", "Glow: " + ChatColor.RED + "Inactive");
else
board.setLine("glow", "Glow: " + ChatColor.GREEN + "Active");
}
if(tauntEnabled && tauntCountdown){
if(Game.taunt == null || Game.status == Status.STARTING)
board.setLine("taunt", "Taunt: " + ChatColor.YELLOW + "0m0s");
else if(!tauntLast && Hider.size() == 1){
board.setLine("taunt", "Taunt: " + ChatColor.YELLOW + "Expired");
} else if(!Game.taunt.isRunning())
board.setLine("taunt", "Taunt: " + ChatColor.YELLOW + Game.taunt.getDelay()/60 + "m" + Game.taunt.getDelay()%60 + "s");
else
board.setLine("taunt", "Taunt: " + ChatColor.YELLOW + "Active");
}
if(worldborderEnabled){
if(Game.worldBorder == null || Game.status == Status.STARTING){
board.setLine("board", "WorldBorder: " + ChatColor.YELLOW + "0m0s");
} else if(!Game.worldBorder.isRunning()) {
board.setLine("board", "WorldBorder: " + ChatColor.YELLOW + Game.worldBorder.getDelay()/60 + "m" + Game.worldBorder.getDelay()%60 + "s");
} else {
board.setLine("board", "WorldBorder: " + ChatColor.YELLOW + "Decreasing");
}
}
if(glowEnabled || (tauntEnabled && tauntCountdown) || worldborderEnabled)
board.addBlank();
board.setLine("time", "Time Left: " + ChatColor.GREEN + Game.timeLeft/60 + "m" + Game.timeLeft%60 + "s");
board.addBlank();
board.setLine("team", "Team: " + getTeam(player));
board.display();
customBoards.put(player.getName(), board);
}
public static void removeBoard(Player player) {
ScoreboardManager manager = Bukkit.getScoreboardManager();
assert manager != null;
player.setScoreboard(manager.getMainScoreboard());
customBoards.remove(player.getName());
}
public static void reloadLobbyBoards() {
for(Player player : playerList.values())
createLobbyBoard(player, false);
}
public static void reloadGameBoards() {
for(Player player : playerList.values())
createGameBoard(player, false);
}
public static void reloadBoardTeams() {
for(CustomBoard board : customBoards.values())
board.updateTeams();
}
private static String getSeekerPercent() {
if(playerList.values().size() < 2)
return " --";
else
return " "+(int)(100*(1.0/playerList.size()));
}
private static String getHiderPercent() {
if(playerList.size() < 2)
return " --";
else
return " "+(int)(100-100*(1.0/playerList.size()));
}
private static String getTeam(Player player) {
if(isHider(player)) return ChatColor.GOLD + "HIDER";
else if(isSeeker(player)) return ChatColor.RED + "SEEKER";
else if(isSpectator(player)) return ChatColor.GRAY + "SPECTATOR";
else return ChatColor.WHITE + "UNKNOWN";
}
}
class CustomBoard {
private final Scoreboard board;
private final Objective obj;
private final Player player;
private final Map<String,Line> LINES;
private int blanks;
private boolean displayed;
public CustomBoard(Player player, String title){
ScoreboardManager manager = Bukkit.getScoreboardManager();
assert manager != null;
this.board = manager.getNewScoreboard();
this.LINES = new HashMap<>();
this.player = player;
2022-04-11 16:36:11 +00:00
if(Version.atLeast("1.13")){
this.obj = board.registerNewObjective(
"Scoreboard", "dummy", ChatColor.translateAlternateColorCodes('&', title));
} else {
this.obj = board.registerNewObjective("Scoreboard", "dummy");
this.obj.setDisplayName(ChatColor.translateAlternateColorCodes('&', title));
}
2021-12-26 22:58:18 +00:00
this.blanks = 0;
this.displayed = false;
this.updateTeams();
}
public void updateTeams() {
try{ board.registerNewTeam("Hider"); } catch (Exception ignored){}
try{ board.registerNewTeam("Seeker"); } catch (Exception ignored){}
Team hiderTeam = board.getTeam("Hider");
assert hiderTeam != null;
for(String entry : hiderTeam.getEntries())
hiderTeam.removeEntry(entry);
for(Player player : Board.getHiders())
hiderTeam.addEntry(player.getName());
Team seekerTeam = board.getTeam("Seeker");
assert seekerTeam != null;
for(String entry : seekerTeam.getEntries())
seekerTeam.removeEntry(entry);
for(Player player : Board.getSeekers())
seekerTeam.addEntry(player.getName());
2022-04-11 16:36:11 +00:00
if(Version.atLeast("1.9")){
if(nametagsVisible) {
hiderTeam.setOption(Team.Option.NAME_TAG_VISIBILITY, Team.OptionStatus.FOR_OWN_TEAM);
seekerTeam.setOption(Team.Option.NAME_TAG_VISIBILITY, Team.OptionStatus.FOR_OTHER_TEAMS);
} else {
hiderTeam.setOption(Team.Option.NAME_TAG_VISIBILITY, Team.OptionStatus.NEVER);
seekerTeam.setOption(Team.Option.NAME_TAG_VISIBILITY, Team.OptionStatus.NEVER);
}
} else {
if(nametagsVisible) {
hiderTeam.setNameTagVisibility(NameTagVisibility.HIDE_FOR_OTHER_TEAMS);
seekerTeam.setNameTagVisibility(NameTagVisibility.HIDE_FOR_OWN_TEAM);
} else {
hiderTeam.setNameTagVisibility(NameTagVisibility.NEVER);
seekerTeam.setNameTagVisibility(NameTagVisibility.NEVER);
}
}
if(Version.atLeast("1.12")){
hiderTeam.setColor(ChatColor.GOLD);
seekerTeam.setColor(ChatColor.RED);
2021-12-26 22:58:18 +00:00
} else {
2022-04-11 16:36:11 +00:00
hiderTeam.setPrefix(ChatColor.translateAlternateColorCodes('&', "&6"));
seekerTeam.setPrefix(ChatColor.translateAlternateColorCodes('&', "&c"));
2021-12-26 22:58:18 +00:00
}
}
public void setLine(String key, String message){
Line line = LINES.get(key);
if(line == null)
addLine(key, message);
else
updateLine(key, message);
}
private void addLine(String key, String message){
Score score = obj.getScore(message);
score.setScore(LINES.values().size()+1);
Line line = new Line(LINES.values().size()+1, message);
LINES.put(key, line);
}
public void addBlank(){
if(displayed) return;
StringBuilder temp = new StringBuilder();
for(int i = 0; i <= blanks; i ++)
temp.append(ChatColor.RESET);
blanks++;
addLine("blank"+blanks, temp.toString());
}
private void updateLine(String key, String message){
Line line = LINES.get(key);
board.resetScores(line.getMessage());
line.setMessage(message);
Score newScore = obj.getScore(message);
newScore.setScore(line.getScore());
}
public void display() {
displayed = true;
obj.setDisplaySlot(DisplaySlot.SIDEBAR);
player.setScoreboard(board);
}
}
class Line {
private final int score;
private String message;
public Line(int score, String message){
this.score = score;
this.message = message;
}
public int getScore() {
return score;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}