From 3079a7e99cffd3fe9b91bbf9e3b479b5380ff014 Mon Sep 17 00:00:00 2001 From: Sivert Date: Wed, 28 Oct 2026 21:13:23 +0100 Subject: [PATCH] fix(livetest): the forfeit step keeps the T bots when it kicks the CT ones Switching bot_quota_mode to normal with 8 bots and bot_quota 4 made CS2 drop 4 bots at random. When it dropped the T ones, both teams were empty and no forfeit started (nightly 2026-10-28). Raise the quota to the bots there first. Co-Authored-By: Claude Opus 5.5 --- scripts/livetest/README.md | 2 +- scripts/livetest/livetest.py | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/scripts/livetest/README.md b/scripts/livetest/README.md index be98d05e..211f1884 100644 --- a/scripts/livetest/README.md +++ b/scripts/livetest/README.md @@ -81,7 +81,7 @@ The match flow up to `match_live` with rules in the match config (`max_tech_paus | tech pause | `ru match tech team1` | `pause: technical by team1`, then `pause: ended (technical pause time is up)` | | tech limit | `ru match tech team1` again | `pause: technical refused for team1 (1/1 used)` | | tactical timeout | `ru match tac team2` (`timeout_terrorist_start`) | `pause: tactical timeout by team2`, then `pause: ended (tactical timeout over)` | -| forfeit countdown | `bot_quota_mode normal`, `bot_join_team T`, `bot_kick ""` per CT bot | `forfeit: team1 has nobody connected` | +| forfeit countdown | `bot_quota `, `bot_quota_mode normal`, `bot_join_team T`, `bot_kick ""` per CT bot | `forfeit: team1 has nobody connected` | | cancel | `bot_add_ct` | `forfeit: team1 is back` | | forfeit | the CT bots kicked again, 20 s | `forfeit: team1 (team_absent) forfeits map 1`, then postgame and idle | diff --git a/scripts/livetest/livetest.py b/scripts/livetest/livetest.py index 85ef10a3..06d81399 100755 --- a/scripts/livetest/livetest.py +++ b/scripts/livetest/livetest.py @@ -1036,6 +1036,11 @@ def _act(): self.quota_mode_set = True self.srv.send("bot_quota_mode") # echo, restored in cleanup self.srv.send("mp_autoteambalance 0") + # In normal mode bot_quota counts every bot, not each team: raise it to the bots + # there first, or the switch drops the extra ones at random. Dropping the T bots + # left both teams empty and no forfeit to start (nightly 2026-10-28). + on = [n for n, hist in f.bot_sides.items() if hist and n not in f.bots_gone] + self.srv.send(f"bot_quota {len(on)}") self.srv.send("bot_quota_mode normal") self.srv.send("bot_join_team T") names = ct_bots()