172 lines
6.6 KiB
Java
172 lines
6.6 KiB
Java
|
|
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<String, BlockAndSeekGame> games = new ConcurrentHashMap<>();
|
||
|
|
|
||
|
|
public static boolean isExist(String name) {
|
||
|
|
return games.containsKey(name);
|
||
|
|
}
|
||
|
|
|
||
|
|
public static Set<String> 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<Integer> spawnCords = map.spawn();
|
||
|
|
List<Integer> 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;
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|