fix: 10 bugs — timer, compass, escape teleport, win conditions, results, tests

This commit is contained in:
loki5512344 2026-06-15 11:55:44 +02:00
parent 2f4de4fbb6
commit 17388f97e7
6 changed files with 113 additions and 40 deletions

View file

@ -31,6 +31,7 @@ public class EndgamePhase implements Phase {
private HatchCondition hatchCondition;
private HatchEscape hatchEscape;
private Sidebar sidebar;
private int endgameTimer = -1; // секунд до конца эндгейма (-1 = не активно)
public EndgamePhase() {
this.openTicks = 20 * 20;
@ -100,6 +101,15 @@ public class EndgamePhase implements Phase {
@Override
public void tick(GameSession session) {
updateGates(session);
if (endgameTimer > 0 && session.getTicksElapsed() % 20 == 0) {
endgameTimer--;
if (sidebar != null) {
sidebar.setEndgameTimer(endgameTimer);
}
}
// Update sidebar stats every 40 ticks
if (session.getTicksElapsed() % 40 == 0 && sidebar != null) {
for (BasePlayer bp : session.getPlayers().values()) {
@ -198,6 +208,12 @@ public class EndgamePhase implements Phase {
// -------------------------------------------------------------------------
private void activateEndgame(GameSession session) {
if (endgameTimer < 0) {
endgameTimer = session.getConfig().getPostgameSeconds();
}
if (sidebar != null) {
sidebar.setEndgameTimer(endgameTimer);
}
if (gateManager != null && !gatesActivated) {
gateManager.activateEndgame();
gatesActivated = true;
@ -268,26 +284,40 @@ public class EndgamePhase implements Phase {
}
if (survivorsAlive == 0) {
complete = true;
announceEndgameEnd(session);
teleportAllToLobby(session);
}
}
private void announceEndgameEnd(GameSession session) {
List<String> results = new ArrayList<>();
results.add("§6§l=== РЕЗУЛЬТАТЫ ===");
int escaped = 0, died = 0;
int escaped = 0, died = 0, sacrificed = 0, leftBehind = 0;
for (BasePlayer player : session.getPlayers().values()) {
if (player.isKiller()) continue;
Player p = player.getPlayer();
String name = p != null ? p.getName() : "Unknown";
if (player.getState() == PlayerState.ESCAPED) {
results.add("§a✔ " + name + " — Сбежал");
escaped++;
} else {
results.add("§c✘ " + name + " — Погиб");
died++;
switch (player.getState()) {
case ESCAPED:
results.add("§a✔ " + name + " — Сбежал");
escaped++;
break;
case DEAD:
results.add("§c✘ " + name + " — Погиб");
died++;
break;
case HOOKED:
case CARRIED:
results.add("§4✘ " + name + " — Принесён в жертву");
sacrificed++;
break;
default:
results.add("§7✘ " + name + " — Оставлен");
leftBehind++;
break;
}
}
results.add("§7Выживших: §a" + escaped + " §7/ Погибших: §c" + died);
results.add("§7Выживших: §a" + escaped + " §7/ Погибших: §c" + died
+ " §7/ В жертву: §4" + sacrificed + " §7/ Оставлено: §7" + leftBehind);
String msg = String.join("\n", results);
for (BasePlayer player : session.getPlayers().values()) {
Player p = player.getPlayer();