package hdvtdev.blockAndSeek.managers; import hdvtdev.blockAndSeek.BlockAndSeek; import hdvtdev.blockAndSeek.BlockAndSeekGame; import hdvtdev.blockAndSeek.BlockAndSeekMap; import hdvtdev.blockAndSeek.Localization; import hdvtdev.blockAndSeek.roulette.RouletteCreator; import net.kyori.adventure.text.Component; import net.kyori.adventure.title.Title; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.WorldCreator; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scoreboard.Criteria; import org.bukkit.scoreboard.DisplaySlot; import org.bukkit.scoreboard.Objective; import org.bukkit.scoreboard.Scoreboard; import java.io.File; import java.util.List; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; public class GamesManager { private static final ConcurrentHashMap games = new ConcurrentHashMap<>(); public static boolean isExist(String name) { return games.containsKey(name); } public static Set getAvailableGames() { return games.keySet(); } public static int createGame(String name) { if (games.containsKey(name)) return 1; if (Bukkit.getWorld(name) == null) { if (new File(BlockAndSeek.getServerDataFolder(), name).exists()) { Bukkit.createWorld(new WorldCreator(name)); } else return 2; } BlockAndSeekMap map = ConfigManager.getMap(name); BlockAndSeekGame game = new BlockAndSeekGame(name, map.maxPlayers()); List spawnCords = map.spawn(); List lobbyCords = map.lobby(); games.put(name, game); new BukkitRunnable() { int duration = map.duration(); int waitTime = 30; final Location spawn = new Location(Bukkit.getWorld(name), spawnCords.getFirst(), spawnCords.get(1), spawnCords.get(2)); final Location lobby = new Location(Bukkit.getWorld(name), lobbyCords.getFirst(), lobbyCords.get(1), lobbyCords.get(2)); @Override public void run() { if (!game.isStarted()) { int playerCount = game.playerCount(); for (Player player : game.getPlayers()) { player.sendActionBar(Component.text("Игроков " + playerCount + "/12")); //TODO! } if (playerCount >= map.minPlayers()) { if (waitTime == 0 || playerCount == map.maxPlayers()) { game.start(); Player seeker = game.selectRandomSeeker(); seeker.teleport(spawn); for (Player player : game.getHiders()) { player.teleport(spawn); RouletteCreator.createRoulette(player, null, true, map.blocks()); } } else { if (waitTime < 5 || waitTime % 5 == 0) { for (Player player : game.getPlayers()) { player.sendMessage(Localization.getLangComponentWithPrefix(player.locale().toLanguageTag(), "wait-time-left", "{time}", String.valueOf(waitTime))); } } waitTime--; } } else waitTime = 10; } else { if (game.hidersCount() == 0) { for (Player player : game.getPlayers()) { player.showTitle(Title.title(Localization.getComponent("seekers-won"), Component.text(""))); } game.end(); games.remove(name); this.cancel(); } for (Player player : game.getPlayers()) { player.sendActionBar(Localization.getComponent("game-time-left", "{time}", String.valueOf(duration))); } if (duration == 0) { if (game.hidersCount() == 1) { for (Player player : game.getPlayers()) { player.showTitle(Title.title(Localization.getComponent("hiders-solo-win", "{player}", player.getName()), Component.text(""))); } } else { for (Player player : game.getPlayers()) { player.showTitle(Title.title(Localization.getComponent("hiders-won"), Component.text(""))); } } game.end(); games.remove(name); this.cancel(); } else duration--; } } }.runTaskTimer(BlockAndSeek.getInstance(), 0L, 20L); return 0; } public static BlockAndSeekGame get(String name) { return games.get(name); } private static Scoreboard updateScoreboard(Scoreboard scoreboard, int players, int maxPlayers) { Objective objective = scoreboard.getObjective(DisplaySlot.SIDEBAR); for (String o : scoreboard.getEntries()) { scoreboard.resetScores(o); } objective.getScore(" ").setScore(3); objective.getScore(Localization.getComponent("game-players-count", "{players}", String.valueOf(players), "{max-players}", String.valueOf(maxPlayers)).toString()).setScore(2); objective.getScore(" ").setScore(1); objective.getScore(Localization.getComponent("wait-time-left", "{time}", String.valueOf(30)).toString()).setScore(0); return scoreboard; } private static Scoreboard newLobbyScoreboard(String name, int players, int maxPlayers) { Scoreboard scoreboard = Bukkit.getScoreboardManager().getNewScoreboard(); Objective objective = scoreboard.registerNewObjective(name, Criteria.DUMMY, Localization.getComponent(" game-title", "{title}", name)); objective.setDisplaySlot(DisplaySlot.SIDEBAR); objective.getScore(" ").setScore(3); objective.getScore(Localization.getComponent("game-players-count", "{players}", String.valueOf(players), "{max-players}", String.valueOf(maxPlayers)).toString()).setScore(2); objective.getScore(" ").setScore(1); objective.getScore(Localization.getComponent("wait-time-left", "{time}", String.valueOf(30)).toString()).setScore(0); return scoreboard; } }