mdbd/src/main/java/dev/loki/phase/LobbyPhase.java

159 lines
No EOL
6.2 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package dev.loki.phase;
import dev.loki.config.GameConfig;
import dev.loki.core.GameSession;
import dev.loki.player.BasePlayer;
import dev.loki.config.MessagesConfig;
import net.kyori.adventure.text.Component;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
/**
* Лобби-фаза: ждёт минимум 4 игроков.
* При 4 игроках таймер 45 сек, при 5 — сбрасывается до 15 сек.
*/
public class LobbyPhase implements Phase {
private final GameConfig config;
private int tickSub; // счётчик тиков внутри текущей секунды
private int secondsLeft;
private boolean started;
private boolean forced;
private int lastPlayerCount; // для отслеживания изменения кол-ва игроков
public LobbyPhase(GameConfig config) {
this.config = config;
this.secondsLeft = config.getCountdown4Players(); // начальный таймер
this.tickSub = 0;
this.started = false;
this.forced = false;
this.lastPlayerCount = 0;
}
@Override
public void enter(GameSession session) {
// Телепортируем тех кто уже в сессии (если есть)
var lobbyManager = session.getPlugin().getLobbyManager();
for (var player : session.getPlayers().values()) {
var p = player.getPlayer();
if (p != null && p.isOnline()) {
p.setGameMode(org.bukkit.GameMode.ADVENTURE);
lobbyManager.teleportToLobby(p);
MessagesConfig messages = session.getPlugin().getConfigManager().getMessages();
p.sendMessage(messages.get("lobby.opened"));
}
}
}
@Override
public void tick(GameSession session) {
if (forced) {
started = true;
return;
}
int playerCount = session.getPlayerCount();
int minPlayers = config.getMinPlayers(); // 4
int maxPlayers = config.getMaxPlayers(); // 5
// Недостаточно игроков — сбрасываем таймер
if (playerCount < minPlayers) {
secondsLeft = config.getCountdown4Players();
tickSub = 0;
lastPlayerCount = playerCount;
MessagesConfig messages = session.getPlugin().getConfigManager().getMessages();
sendActionBarToAll(session, messages.get("lobby.waiting", playerCount, maxPlayers));
return;
}
// Когда количество игроков меняется — обновляем нужный таймер
if (playerCount != lastPlayerCount) {
lastPlayerCount = playerCount;
if (playerCount >= maxPlayers) {
// При максимуме игроков сокращаем таймер до countdown-5-players
int fast = config.getCountdown5Players();
if (secondsLeft > fast) {
secondsLeft = fast;
tickSub = 0;
MessagesConfig messages = session.getPlugin().getConfigManager().getMessages();
Bukkit.broadcast(messages.get("lobby.all-ready", fast));
}
}
}
// Тикаем таймер
tickSub++;
if (tickSub >= 20) {
tickSub = 0;
secondsLeft--;
// Анонс вслух на ключевых секундах
if (secondsLeft == 30 || secondsLeft == 15 || secondsLeft == 10
|| secondsLeft == 5 || secondsLeft == 3
|| secondsLeft == 2 || secondsLeft == 1) {
MessagesConfig messages = session.getPlugin().getConfigManager().getMessages();
Bukkit.broadcast(messages.get("lobby.countdown", secondsLeft));
}
}
// ActionBar всем (на русском, без прогресс-бара)
MessagesConfig messages = session.getPlugin().getConfigManager().getMessages();
sendActionBarToAll(session, messages.get("lobby.actionbar-waiting", secondsLeft, playerCount, maxPlayers));
if (secondsLeft <= 0) {
started = true;
}
}
private void sendActionBarToAll(GameSession session, Component msg) {
for (BasePlayer bp : session.getPlayers().values()) {
Player p = bp.getPlayer();
if (p != null && p.isOnline()) {
p.sendActionBar(msg);
}
}
}
private String buildCountdownBar(int current, int total) {
int filled = total > 0 ? (int) (10.0 * current / total) : 0;
int empty = 10 - filled;
return "§a" + "#".repeat(Math.max(0, filled)) + "§7" + "-".repeat(Math.max(0, empty));
}
@Override
public void exit(GameSession session) {
for (BasePlayer bp : session.getPlayers().values()) {
Player p = bp.getPlayer();
if (p != null && p.isOnline()) p.sendActionBar(Component.empty());
}
MessagesConfig messages = session.getPlugin().getConfigManager().getMessages();
Bukkit.broadcast(messages.get("lobby.starting"));
}
@Override
public void onPlayerJoined(GameSession session, Player player) {
player.setGameMode(org.bukkit.GameMode.ADVENTURE);
session.getPlugin().getLobbyManager().teleportToLobby(player);
int playerCount = session.getPlayerCount();
int maxPlayers = config.getMaxPlayers();
// Сообщаем только участникам этой сессии, не всему серверу
MessagesConfig messages = session.getPlugin().getConfigManager().getMessages();
Component msg = messages.get("lobby.player-joined", player.getName(), playerCount, maxPlayers);
for (BasePlayer bp : session.getPlayers().values()) {
Player p = bp.getPlayer();
if (p != null && p.isOnline()) p.sendMessage(msg);
}
}
@Override
public boolean isComplete() {
return started;
}
public void forceStart() {
this.forced = true;
}
public int getSecondsLeft() {
return secondsLeft;
}
}