你的 CS2 服务器运行正常,一换图所有人都被踢了:服务器崩溃了。如果 GOTV 开着且有玩家在线,就是这个 bug。下面先给解决方法,再说原因。
解决方法:一行
把这行加到 game/csgo/cfg/server.cfg:
bot_join_delay 15- 现在每次换图后,机器人会等 15 秒再加入。
- 崩溃发生在玩家还在加载新地图时机器人加入。有了延迟,玩家会先加载完成。
- GOTV 保持开启。demo 照常录制,观众照常观战。
- 不重启就生效的话,通过 RCON 发送:
rcon bot_join_delay 15
在我们的实验环境里:不加这个设置,6 次换图崩溃了 3 次。加上之后,18 次换图 0 次崩溃,包括比赛中途换图、比赛结束换图和在线切换模式。每台 2hours.gg 的 CS2 服务器都自带这个设置。
什么时候会发生
以下条件同时满足时:
- SourceTV (GOTV) 已开启:
tv_enable 1 - 至少有一名真人玩家在线。只有机器人的服务器从未崩溃。
- 关卡发生变化:在控制台选地图、changelevel 或 map、比赛结束,或比赛结束投票。
它是随机的。在我们的测试中大约一半的换图会崩溃,在线服务器上有 3 名或更多玩家时更容易发生。一次换图没事的服务器,下一次也可能崩溃。
表现:加载地图时所有玩家同时掉线,服务器日志以段错误(SIGSEGV)结束,新地图没有开始。
不同模式的区别
每个模式的 Valve config 决定了每次加载地图时加入多少机器人。加入的机器人越多,崩溃的机会越多:
- Deathmatch、Team Deathmatch、Casual:每次加载最多加入 10 个机器人。最容易受影响,也是我们看到崩溃最多的模式。
- Competitive:1 个机器人。在我们的实验环境里不加设置也没崩溃,但玩家更多的在线服务器崩溃过。
- 所有模式的解决方法都一样:bot_join_delay 是一个设置,对每次换图都生效,不管是什么触发的。
真正的 bug(给好奇的人)
这是 Valve 引擎的 bug,不是插件问题。去掉 Metamod 和 CounterStrikeSharp 后照样崩溃。从 2024 年起就有人报告,编号为 ValveSoftware/csgo-osx-linux#3831。可以在那里关注进展:希望 Valve 早日修复,让这个变通方法不再需要。
我们用调试器发现的情况:
- 换图时,SourceTV 关闭,并以 "SourceTV stopped"(HLTVSTOP)为理由断开在线玩家,尽管这名玩家是普通玩家,不是 GOTV 观众。
- 这名断开一半的玩家会留下一个空的内部对象。在原版服务器上,引擎会立刻在这里崩溃(libengine2.so)。
- 如果这一步没崩,一秒后机器人加入新地图时,游戏代码会崩溃(libserver.so)。bot_join_delay 防止的就是这一种,我们在 CounterStrikeSharp 服务器上看到的崩溃全是它。
- 在没有 Metamod 的原版服务器上,我们也看到了第一种引擎侧的崩溃。bot_join_delay 对那一种是否有效,我们还没测试。
无效的方法
tv_enable 0在游戏中执行:所有玩家同时掉线。- 从启动起就关闭 GOTV:不会崩溃,但没有 demo,也不能观战。
tv_delay,tv_delaymapchange,tv_autorecord 0,tv_stoprecord: 照样崩溃。停止 demo 不够:完全不录 demo 时也崩溃了。bot_quota 0写进模式的 _server.cfg:它在每次比赛重开时也会执行,还可能把 SourceTV 自己踢掉,导致 GOTV 在地图中途停止录制。map代替 changelevel:同样崩溃。
给你自己服务器的完整设置
我们在每台服务器的 server.cfg 里用的设置:
tv_enable 1
tv_autorecord 1
bot_join_delay 15- 把它写进 server.cfg,不要只用一次性的 RCON 命令,这样重启后也会生效。
- 我们测试的是 15 秒。网络慢的玩家或大型 Workshop 地图加载更久,所以更大的值更安全,只是机器人会晚一点到。
- 要确认是否生效,在服务器控制台或 RCON 输入:
bot_join_delay - 不玩机器人?也请保留:Deathmatch 和 Casual 等模式默认每次加载地图都会添加机器人。
或者省掉这些设置:2hours.gg 上的每台 CS2 服务器都已经带有这个修复,GOTV 和 demo 也都开着。