fix: 10 bugs — timer, compass, escape teleport, win conditions, results, tests
This commit is contained in:
parent
2f4de4fbb6
commit
17388f97e7
6 changed files with 113 additions and 40 deletions
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -113,6 +113,9 @@ public class GameplayPhase implements Phase {
|
|||
if (generatorRepair != null) generatorRepair.tick();
|
||||
if (interaction != null) interaction.tickSurvivors();
|
||||
hookHandler.tick();
|
||||
if (ui.tickMatchTimer(session)) {
|
||||
shouldEnd = true;
|
||||
}
|
||||
|
||||
// Particle effects around generators (every 10 ticks)
|
||||
if (tickCounter % 10 == 0 && generatorManager != null) {
|
||||
|
|
@ -161,8 +164,6 @@ public class GameplayPhase implements Phase {
|
|||
ui.resetPlayers(session);
|
||||
damageSystem.clear();
|
||||
damageSystem.clearManagers();
|
||||
|
||||
Bukkit.broadcast(session.getPlugin().getConfigManager().getMessages().get("game.end"));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -371,6 +372,9 @@ public class GameplayPhase implements Phase {
|
|||
p.playSound(p.getLocation(), Sound.ENTITY_PLAYER_LEVELUP, 1.0f, 1.2f);
|
||||
Bukkit.broadcast(Component.text(
|
||||
"§6[DBD] §a" + p.getName() + " §6сбежал через ворота!"));
|
||||
p.setGameMode(GameMode.SPECTATOR);
|
||||
p.getInventory().clear();
|
||||
session.getPlugin().getLobbyManager().teleportToLobby(p);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -57,24 +57,24 @@ public class GameplayWinConditions {
|
|||
return;
|
||||
}
|
||||
|
||||
// Killer wins: all survivors are downed/hooked/carried/dead
|
||||
if (allSurvivorsIncapacitated(session)) {
|
||||
winReason = "killer_win";
|
||||
Bukkit.broadcast(session.getPlugin().getConfigManager().getMessages().get("game.all-incapacitated"));
|
||||
announceKillerWin(session);
|
||||
shouldEnd = true;
|
||||
return;
|
||||
}
|
||||
|
||||
// Survivors win: all generators done and at least one escaped
|
||||
if (hasEscapedSurvivor(session)) {
|
||||
winReason = "survivors_win";
|
||||
announceSurvivorsWin(session);
|
||||
shouldEnd = true;
|
||||
return;
|
||||
}
|
||||
|
||||
// Killer wins: all survivors are downed/hooked/carried/dead (ESCAPED excluded)
|
||||
if (allSurvivorsIncapacitated(session)) {
|
||||
winReason = "killer_win";
|
||||
Bukkit.broadcast(session.getPlugin().getConfigManager().getMessages().get("game.all-incapacitated"));
|
||||
announceKillerWin(session);
|
||||
shouldEnd = true;
|
||||
}
|
||||
}
|
||||
|
||||
/** True if NO survivor can act (all are DOWNED, HOOKED, CARRIED, DEAD, or ESCAPED). */
|
||||
/** True if NO survivor can act (all are DOWNED, HOOKED, CARRIED, DEAD). */
|
||||
private boolean allSurvivorsIncapacitated(GameSession session) {
|
||||
boolean hasSurvivors = false;
|
||||
for (BasePlayer bp : session.getPlayers().values()) {
|
||||
|
|
@ -82,8 +82,7 @@ public class GameplayWinConditions {
|
|||
hasSurvivors = true;
|
||||
PlayerState st = bp.getState();
|
||||
if (st != PlayerState.DOWNED && st != PlayerState.HOOKED
|
||||
&& st != PlayerState.CARRIED && st != PlayerState.DEAD
|
||||
&& st != PlayerState.ESCAPED) {
|
||||
&& st != PlayerState.CARRIED && st != PlayerState.DEAD) {
|
||||
return false; // at least one survivor can still act
|
||||
}
|
||||
}
|
||||
|
|
@ -121,7 +120,7 @@ public class GameplayWinConditions {
|
|||
for (BasePlayer bp : session.getPlayers().values()) {
|
||||
Player p = bp.getPlayer();
|
||||
if (p == null || !p.isOnline()) continue;
|
||||
if (!bp.isKiller() && bp.getState() == PlayerState.DEAD) {
|
||||
if (!bp.isKiller() && (bp.getState() == PlayerState.DEAD || bp.getState() == PlayerState.ESCAPED)) {
|
||||
p.setGameMode(GameMode.SPECTATOR);
|
||||
} else {
|
||||
p.setGameMode(GameMode.SURVIVAL);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue