feat: killer/survivor win conditions with title announcements, fix forcestart reset bug
This commit is contained in:
parent
78fc8bfb55
commit
d59b965407
4 changed files with 95 additions and 24 deletions
|
|
@ -209,16 +209,75 @@ public class GameplayPhase implements Phase {
|
|||
PlayerState st = bp.getState();
|
||||
if (st == PlayerState.ESCAPED) {
|
||||
escapedSurvivors++;
|
||||
} else if (st != PlayerState.DEAD && st != PlayerState.HOOKED) {
|
||||
} else if (st == PlayerState.DEAD) {
|
||||
// dead, counted below
|
||||
} else {
|
||||
// HEALTHY, INJURED, DOWNED, CARRIED, HOOKED — still in game
|
||||
aliveSurvivors++;
|
||||
}
|
||||
}
|
||||
|
||||
boolean allDead = (aliveSurvivors == 0 && escapedSurvivors == 0 && totalSurvivors > 0);
|
||||
boolean allEscaped = (escapedSurvivors == totalSurvivors && totalSurvivors > 0);
|
||||
if (totalSurvivors == 0) return; // no survivors registered yet
|
||||
|
||||
if (allDead || allEscaped) {
|
||||
boolean killerWin = (aliveSurvivors == 0 && escapedSurvivors == 0);
|
||||
boolean survivorsWin = (escapedSurvivors == totalSurvivors);
|
||||
|
||||
if (killerWin) {
|
||||
announceKillerWin(session);
|
||||
shouldEnd = true;
|
||||
} else if (survivorsWin) {
|
||||
announceSurvivorWin(session);
|
||||
shouldEnd = true;
|
||||
}
|
||||
}
|
||||
|
||||
private void announceKillerWin(GameSession session) {
|
||||
Bukkit.broadcast(Component.text("", NamedTextColor.RED));
|
||||
Bukkit.broadcast(Component.text("☠ КИЛЛЕР ПОБЕДИЛ! ☠", NamedTextColor.DARK_RED));
|
||||
Bukkit.broadcast(Component.text("Все выжившие уничтожены.", NamedTextColor.RED));
|
||||
Bukkit.broadcast(Component.text("", NamedTextColor.RED));
|
||||
|
||||
for (BasePlayer bp : session.getPlayers().values()) {
|
||||
Player p = bp.getPlayer();
|
||||
if (p == null || !p.isOnline()) continue;
|
||||
if (bp.isKiller()) {
|
||||
p.showTitle(net.kyori.adventure.title.Title.title(
|
||||
Component.text("ПОБЕДА!", net.kyori.adventure.text.format.TextColor.color(0xFF2222)),
|
||||
Component.text("Ты уничтожил всех выживших", NamedTextColor.RED)
|
||||
));
|
||||
p.playSound(p.getLocation(), Sound.UI_TOAST_CHALLENGE_COMPLETE, 1.0f, 1.0f);
|
||||
} else {
|
||||
p.showTitle(net.kyori.adventure.title.Title.title(
|
||||
Component.text("ПОРАЖЕНИЕ", net.kyori.adventure.text.format.TextColor.color(0x888888)),
|
||||
Component.text("Киллер победил", NamedTextColor.GRAY)
|
||||
));
|
||||
p.playSound(p.getLocation(), Sound.ENTITY_WITHER_DEATH, 0.5f, 0.8f);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void announceSurvivorWin(GameSession session) {
|
||||
Bukkit.broadcast(Component.text("", NamedTextColor.GREEN));
|
||||
Bukkit.broadcast(Component.text("✔ ВЫЖИВШИЕ ПОБЕДИЛИ! ✔", NamedTextColor.GREEN));
|
||||
Bukkit.broadcast(Component.text("Все выжившие сбежали!", NamedTextColor.YELLOW));
|
||||
Bukkit.broadcast(Component.text("", NamedTextColor.GREEN));
|
||||
|
||||
for (BasePlayer bp : session.getPlayers().values()) {
|
||||
Player p = bp.getPlayer();
|
||||
if (p == null || !p.isOnline()) continue;
|
||||
if (!bp.isKiller()) {
|
||||
p.showTitle(net.kyori.adventure.title.Title.title(
|
||||
Component.text("ПОБЕГ!", net.kyori.adventure.text.format.TextColor.color(0x00FF00)),
|
||||
Component.text("Вы выбрались живыми!", NamedTextColor.YELLOW)
|
||||
));
|
||||
p.playSound(p.getLocation(), Sound.UI_TOAST_CHALLENGE_COMPLETE, 1.0f, 1.2f);
|
||||
} else {
|
||||
p.showTitle(net.kyori.adventure.title.Title.title(
|
||||
Component.text("ПОРАЖЕНИЕ", net.kyori.adventure.text.format.TextColor.color(0x888888)),
|
||||
Component.text("Все выжившие сбежали", NamedTextColor.GRAY)
|
||||
));
|
||||
p.playSound(p.getLocation(), Sound.ENTITY_WITHER_DEATH, 0.5f, 0.8f);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue