Survival mode bugfixes and revive mechanism
All checks were successful
CI / lint (push) Successful in 31s
CI / build (push) Successful in 32s
CI / release (push) Successful in 32s

This commit is contained in:
Kamal Tufekcic 2026-07-08 18:10:09 +03:00
commit 2fa85e8b1f
14 changed files with 529 additions and 35 deletions

View file

@ -53,8 +53,9 @@ public interface IMatchDriver
bool OwnsBotPopulation => false;
// Drive bot population (called from SyncBots when OwnsBotPopulation): survival sets bot_quota from the wave kill-budget.
void ManageBots() { }
// A human died (victim). Survival: move to spectator + run wipe detection. No-op elsewhere (native DM respawn handles it).
void OnHumanDeath(CCSPlayerController victim, PlayerData pd) { }
// A human died (victim); `attacker` is the killer — a bot in normal PvE combat, null/self for a suicide/fall/world death.
// Survival: run wipe detection + register a Field Medic revive beacon (combat deaths only). No-op elsewhere (native DM respawn).
void OnHumanDeath(CCSPlayerController victim, PlayerData pd, CCSPlayerController? attacker) { }
// A human left mid-run. Survival: bank their accumulated run-XP into the main table before the pd is dropped.
void OnHumanDisconnect(ulong steamId, PlayerData pd) { }
// Extra run-scoped stat bonus (survival cards) added on top of Eff() at every stat site via EffRun. 0 in TDM/GG.
@ -70,6 +71,10 @@ public interface IMatchDriver
double TeamTakeMult() => 1.0;
// Optional mode status line for the HUD (survival shows the wave / bots-left line). "" = no line.
string HudStatusLine(PlayerData pd) => "";
// Optional per-player HUD line for the survival Field Medic revive: the locator (arrow + distance to a downed ally),
// the channel progress bar while reviving, or the edge warning. html = the center-HTML HUD (font tags) vs plain world
// text. "" = nothing to show (no card, no downed ally, or not survival). Only SurvivalDriver overrides it.
string ReviveHudLine(CCSPlayerController p, PlayerData pd, bool html) => "";
// Optional weapon-ladder status line for the shop info panel (Gun Game shows the current rung). null = N/A.
string? LadderStatusLine(PlayerData pd) => null;
// Mode-specific block for the local status API (Api.cs), serialized as-is into the payload's "Extra" field.