package dev.loki.phase; import dev.loki.core.GameSession; import dev.loki.objective.GeneratorManager; import dev.loki.player.BasePlayer; import dev.loki.player.PlayerState; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Bukkit; import org.bukkit.Sound; import org.bukkit.entity.Player; public class GameplayPhase implements Phase { private final GeneratorManager generatorManager; private int tickCounter; private boolean shouldEnd; private boolean allGensDone; public GameplayPhase(GeneratorManager generatorManager) { this.generatorManager = generatorManager; this.tickCounter = 0; this.shouldEnd = false; this.allGensDone = false; } @Override public void enter(GameSession session) { Bukkit.broadcast(Component.text("[DBD] Игра началась! Выжившие, чините генераторы!", NamedTextColor.GREEN)); tickCounter = 0; // Teleport is handled by RoleAssigner.assignRoles — no double-teleport needed here } @Override public void tick(GameSession session) { tickCounter++; generatorManager.tick(); if (tickCounter % 20 == 0) { checkGeneratorProgress(session); checkWinConditions(session); } } private void checkGeneratorProgress(GameSession session) { if (allGensDone) return; if (generatorManager.areAllRequiredCompleted()) { allGensDone = true; Bukkit.broadcast(Component.text( "[DBD] Все генераторы починены! Открывайте ворота!", NamedTextColor.GREEN)); for (BasePlayer bp : session.getPlayers().values()) { Player p = bp.getPlayer(); if (p != null) { p.playSound(p.getLocation(), Sound.ENTITY_FIREWORK_ROCKET_BLAST, 1.0f, 1.0f); } } } } private void checkWinConditions(GameSession session) { int aliveSurvivors = 0; int escapedSurvivors = 0; int totalSurvivors = 0; for (BasePlayer bp : session.getPlayers().values()) { if (bp.isKiller()) continue; totalSurvivors++; PlayerState state = bp.getState(); if (state == PlayerState.ESCAPED) { escapedSurvivors++; } else if (state != PlayerState.DEAD && state != PlayerState.HOOKED) { aliveSurvivors++; } } boolean allSurvivorsDead = (aliveSurvivors == 0 && escapedSurvivors == 0 && totalSurvivors > 0); boolean allEscaped = (escapedSurvivors == totalSurvivors && totalSurvivors > 0); if (allSurvivorsDead || allEscaped) { shouldEnd = true; } } @Override public void exit(GameSession session) { Bukkit.broadcast(Component.text("[DBD] Игровая фаза завершена!", NamedTextColor.GOLD)); } @Override public boolean isComplete() { return shouldEnd; } }