2025-06-22 03:19:06 +03:00
|
|
|
package hdvtdev.blockAndSeek;
|
|
|
|
|
|
2025-06-26 01:18:01 +03:00
|
|
|
import me.libraryaddict.disguise.DisguiseAPI;
|
|
|
|
|
import org.bukkit.Material;
|
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-06-26 01:18:01 +03:00
|
|
|
import java.security.SecureRandom;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
import java.util.Set;
|
|
|
|
|
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-26 01:18:01 +03:00
|
|
|
private AtomicBoolean started = new AtomicBoolean(false);
|
|
|
|
|
private final String name;
|
|
|
|
|
|
|
|
|
|
public BlockAndSeekGame(String name) {
|
|
|
|
|
this.name = name;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void end() {
|
|
|
|
|
for (Player player : players.keySet()) {
|
|
|
|
|
EventListener.unfreezePlayer(player);
|
|
|
|
|
player.getPersistentDataContainer().remove(BlockAndSeekContainer.PLAYER);
|
|
|
|
|
player.sendBlockChange(player.getLocation(), Material.AIR.createBlockData());
|
|
|
|
|
DisguiseAPI.undisguiseToAll(player);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public boolean addPlayer(Player player) {
|
|
|
|
|
if (started.get()) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
player.getPersistentDataContainer().set(BlockAndSeekContainer.PLAYER, PersistentDataType.STRING, name);
|
|
|
|
|
players.put(player, PlayerType.HIDER);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void removePlayer(Player player) {
|
|
|
|
|
players.remove(player);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public int hidersCound() {
|
|
|
|
|
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() {
|
|
|
|
|
SecureRandom random = new SecureRandom();
|
|
|
|
|
int i = 0;
|
|
|
|
|
int randomNum = random.nextInt(0, players.size());
|
|
|
|
|
for (Player player : players.keySet()) {
|
|
|
|
|
if (i == randomNum) return player;
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
}
|
2025-06-22 03:19:06 +03:00
|
|
|
|
2025-06-26 01:18:01 +03:00
|
|
|
private enum PlayerType {
|
|
|
|
|
SEEKER,
|
|
|
|
|
HIDER
|
|
|
|
|
}
|
2025-06-22 03:19:06 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|