Files
blockandseek/src/main/java/hdvtdev/blockAndSeek/BlockAndSeekGame.java

139 lines
3.9 KiB
Java
Raw Normal View History

2025-06-22 03:19:06 +03:00
package hdvtdev.blockAndSeek;
2025-07-01 03:25:09 +03:00
import hdvtdev.blockAndSeek.managers.FreezeManager;
2025-06-26 01:18:01 +03:00
import me.libraryaddict.disguise.DisguiseAPI;
2025-07-01 03:25:09 +03:00
import org.bukkit.Bukkit;
2025-06-28 00:36:06 +03:00
import org.bukkit.GameMode;
2025-07-01 03:25:09 +03:00
import org.bukkit.Location;
2025-06-22 03:19:06 +03:00
import org.bukkit.entity.Player;
2025-06-26 01:18:01 +03:00
import org.bukkit.persistence.PersistentDataType;
2025-06-22 03:19:06 +03:00
2025-07-01 03:25:09 +03:00
import java.util.*;
2025-06-26 01:18:01 +03:00
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
2025-06-22 03:19:06 +03:00
public class BlockAndSeekGame {
2025-06-26 01:18:01 +03:00
private final ConcurrentHashMap<Player, PlayerType> players = new ConcurrentHashMap<>();
2025-06-22 03:19:06 +03:00
2025-06-28 00:36:06 +03:00
private final AtomicBoolean started = new AtomicBoolean(false);
2025-06-26 01:18:01 +03:00
private final String name;
2025-06-28 00:36:06 +03:00
private final int maxPlayers;
2025-07-01 03:25:09 +03:00
private final Location lobby;
2025-06-26 01:18:01 +03:00
2025-06-28 00:36:06 +03:00
2025-07-01 03:25:09 +03:00
public BlockAndSeekGame(String name, int maxPlayers, List<Integer> lobby) {
2025-06-26 01:18:01 +03:00
this.name = name;
2025-06-28 00:36:06 +03:00
this.maxPlayers = maxPlayers;
2025-07-01 03:25:09 +03:00
this.lobby = new Location(Bukkit.getWorld(name), lobby.getFirst(), lobby.get(1), lobby.get(2));
2025-06-28 00:36:06 +03:00
}
public List<Player> getHiders() {
return players.entrySet().stream().filter(e -> Objects.equals(e.getValue(), PlayerType.HIDER)).map(Map.Entry::getKey).toList();
2025-06-26 01:18:01 +03:00
}
2025-07-01 03:25:09 +03:00
public void preEnd() {
for (Player hider : getHiders()) {
FreezeManager.unfreezeIfFrozen(hider);
FreezeManager.removePlayerDisguise(hider);
DisguiseAPI.undisguiseToAll(hider);
hider.getInventory().clear();
hider.setGlowing(true);
}
for (Player player : getPlayers()) {
player.setInvulnerable(true);
player.setVisibleByDefault(true);
}
}
2025-06-26 01:18:01 +03:00
public void end() {
2025-07-01 03:25:09 +03:00
for (Player hider : getHiders()) {
FreezeManager.removePlayerDisguise(hider);
DisguiseAPI.undisguiseToAll(hider);
}
2025-06-26 01:18:01 +03:00
for (Player player : players.keySet()) {
2025-07-01 03:25:09 +03:00
player.teleport(lobby);
player.getPersistentDataContainer().remove(Keys.PLAYER);
2025-06-28 00:36:06 +03:00
player.setGameMode(GameMode.SURVIVAL);
2025-07-01 03:25:09 +03:00
player.setInvulnerable(false);
player.setGlowing(false);
2025-06-26 01:18:01 +03:00
}
}
public boolean addPlayer(Player player) {
2025-06-28 00:36:06 +03:00
if (started.get() || playerCount() + 1 > maxPlayers) {
2025-06-26 01:18:01 +03:00
return false;
}
2025-07-01 03:25:09 +03:00
player.getPersistentDataContainer().set(Keys.PLAYER, PersistentDataType.STRING, name);
player.teleport(lobby);
2025-06-26 01:18:01 +03:00
players.put(player, PlayerType.HIDER);
return true;
}
public void removePlayer(Player player) {
players.remove(player);
}
2025-06-28 00:36:06 +03:00
public void setSpectator(Player player) {
players.put(player, PlayerType.SPECTATOR);
player.setGameMode(GameMode.SPECTATOR);
}
2025-06-26 01:18:01 +03:00
public Set<Player> getPlayers() {
return players.keySet();
}
public Player getLastHider() {
for (Map.Entry<Player, PlayerType> entry : players.entrySet()) {
if (entry.getValue() == PlayerType.HIDER) return entry.getKey();
2025-06-22 03:19:06 +03:00
}
2025-06-26 01:18:01 +03:00
return null;
}
public int seekersCount() {
return (int) players.values().stream().filter(f -> f.equals(PlayerType.SEEKER)).count();
}
2025-06-28 00:36:06 +03:00
public int hidersCount() {
2025-06-26 01:18:01 +03:00
return (int) players.values().stream().filter(f -> f.equals(PlayerType.HIDER)).count();
}
public int playerCount() {
return players.size();
}
public void start() {
started.set(true);
2025-06-22 03:19:06 +03:00
}
2025-06-26 01:18:01 +03:00
public boolean isStarted() {
return started.get();
2025-06-22 03:19:06 +03:00
}
2025-06-26 01:18:01 +03:00
public Player selectRandomSeeker() {
2025-07-01 03:25:09 +03:00
return selectRandomSeekers(1).getFirst();
}
public List<Player> selectRandomSeekers(int count) {
ArrayList<Player> playerList = new ArrayList<>(players.keySet());
Collections.shuffle(playerList);
List<Player> seekers = playerList.subList(0, Math.min(count, playerList.size()));
for (Player seeker : seekers) players.put(seeker, PlayerType.SEEKER);
return seekers;
2025-06-26 01:18:01 +03:00
}
2025-06-22 03:19:06 +03:00
2025-06-26 01:18:01 +03:00
private enum PlayerType {
SEEKER,
2025-06-28 00:36:06 +03:00
HIDER,
SPECTATOR
2025-06-26 01:18:01 +03:00
}
2025-06-22 03:19:06 +03:00
}