93 lines
3.1 KiB
Java
93 lines
3.1 KiB
Java
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;
|
||
}
|
||
}
|