fix: colors, /dbd join flow, world creation, role assign, action bar lobby, /dbdadmin world, tab complete

This commit is contained in:
loki5512344 2026-06-03 19:34:10 +02:00
parent 327ad9b906
commit 1adb8c84fd
19 changed files with 874 additions and 112 deletions

View file

@ -2,9 +2,11 @@ package dev.loki.phase;
import dev.loki.config.GameConfig;
import dev.loki.core.GameSession;
import dev.loki.player.BasePlayer;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
public class LobbyPhase implements Phase {
private final GameConfig config;
@ -22,6 +24,14 @@ public class LobbyPhase implements Phase {
@Override
public void enter(GameSession session) {
Bukkit.broadcast(Component.text("[DBD] Лобби открыто! Используйте /dbd join", NamedTextColor.GREEN));
// Teleport already-in-session players to lobby (e.g. on restart)
var lobbyManager = session.getPlugin().getLobbyManager();
for (var player : session.getPlayers().values()) {
var bukkitPlayer = player.getPlayer();
if (bukkitPlayer != null && bukkitPlayer.isOnline()) {
lobbyManager.teleportToLobby(bukkitPlayer);
}
}
}
@Override
@ -33,6 +43,9 @@ public class LobbyPhase implements Phase {
secondsLeft = config.getLobbyCountdown();
countdown = 0;
started = false;
// Show waiting message in action bar to all players in lobby
sendActionBarToAll(session,
Component.text("⏳ Ожидание игроков: " + playerCount + "/" + minPlayers, NamedTextColor.YELLOW));
return;
}
@ -40,12 +53,18 @@ public class LobbyPhase implements Phase {
if (countdown >= 20) {
countdown = 0;
secondsLeft--;
}
if (secondsLeft <= 5 || secondsLeft % 10 == 0) {
Bukkit.broadcast(Component.text(
"[DBD] До начала: " + secondsLeft + " сек. (" + playerCount + "/" + minPlayers + ")",
NamedTextColor.YELLOW));
}
// Action bar: показываем каждый тик (обновляется плавно)
String bar = buildCountdownBar(secondsLeft, config.getLobbyCountdown());
sendActionBarToAll(session,
Component.text("▶ Старт через: " + secondsLeft + "с " + bar +
" (" + playerCount + "/" + minPlayers + ")", NamedTextColor.GREEN));
// Chat-announce на ключевых отметках
if (countdown == 0 && (secondsLeft <= 5 || secondsLeft == 10 || secondsLeft == 30)) {
Bukkit.broadcast(Component.text(
"[DBD] До начала: " + secondsLeft + " сек.", NamedTextColor.YELLOW));
}
if (secondsLeft <= 0) {
@ -53,11 +72,41 @@ public class LobbyPhase implements Phase {
}
}
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) {
// Clear action bar for all
for (BasePlayer bp : session.getPlayers().values()) {
Player p = bp.getPlayer();
if (p != null && p.isOnline()) p.sendActionBar(Component.empty());
}
Bukkit.broadcast(Component.text("[DBD] Игра начинается!", NamedTextColor.GREEN));
}
@Override
public void onPlayerJoined(GameSession session, Player player) {
session.getPlugin().getLobbyManager().teleportToLobby(player);
int playerCount = session.getPlayerCount();
int minPlayers = config.getMinPlayers();
Bukkit.broadcast(Component.text(
"[DBD] " + player.getName() + " присоединился к очереди! (" + playerCount + "/" + minPlayers + ")",
NamedTextColor.YELLOW));
}
@Override
public boolean isComplete() {
return started;