CS2 サーバーが普通に動いていたのに、マップが変わった瞬間に全員がキックされる:サーバーがクラッシュしています。GOTV がオンでプレイヤーが接続していたなら、このバグです。まず解決方法、次に原因を説明します。
解決方法:1 行だけ
次のファイルにこれを追加します game/csgo/cfg/server.cfg:
bot_join_delay 15- マップ変更のたびに、ボットは 15 秒待ってから参加するようになります。
- クラッシュは、プレイヤーがまだ新しいマップを読み込んでいる最中にボットが参加すると起きます。遅延を入れれば、プレイヤーが先に読み込みを終えます。
- GOTV はオンのままです。デモの録画も観戦もそのまま続きます。
- 再起動せずに適用するには、RCON で送ります:
rcon bot_join_delay 15
私たちのラボでは、この設定なしだと 6 回のマップ変更のうち 3 回クラッシュしました。設定ありでは、試合途中の変更、試合終了時の変更、ライブでのモード切り替えを含めて 18 回中 0 回でした。2hours.gg のすべての CS2 サーバーにこの設定が入っています。
発生する条件
次の条件がすべてそろったときです:
- SourceTV (GOTV) が有効:
tv_enable 1 - 実際のプレイヤーが 1 人以上接続している。ボットだけのサーバーは一度もクラッシュしませんでした。
- レベルが変わる:コンソールでのマップ選択、changelevel や map、試合終了、試合終了時の投票など。
発生はランダムです。私たちのテストではマップ変更の約半分でクラッシュし、ライブのサーバーでは 3 人以上接続しているときにより多く起きました。1 回のマップ変更を乗り切ったサーバーでも、次でクラッシュすることがあります。
症状:マップの読み込み中に全プレイヤーが一斉に切断され、新しいマップが始まる代わりにサーバーログがセグメンテーション違反(SIGSEGV)で終わります。
モードごとの違い
各モードの Valve の config が、マップ読み込みのたびに参加するボットの数を決めています。参加するボットが多いほど、クラッシュの機会も増えます:
- Deathmatch、Team Deathmatch、Casual:読み込みのたびに最大 10 体のボットが参加します。最も影響を受けやすく、クラッシュを最も多く確認したモードです。
- Competitive:ボット 1 体。私たちのラボでは設定なしでもクラッシュしませんでしたが、プレイヤーの多いライブのサーバーではクラッシュしました。
- 解決方法はどのモードでも同じです。bot_join_delay は 1 つの設定で、何がきっかけでも、すべてのマップ変更に適用されます。
本当のバグ(興味のある方へ)
これはプラグインではなく Valve のエンジンのバグです。Metamod と CounterStrikeSharp を外してもクラッシュしました。2024 年から次の issue として報告されています: ValveSoftware/csgo-osx-linux#3831。そちらで状況を追ってください。Valve が早く修正し、この回避策が不要になることを願っています。
デバッガーでわかったこと:
- マップが変わると SourceTV が終了し、接続中のプレイヤーを "SourceTV stopped"(HLTVSTOP)という理由で切断します。そのプレイヤーは GOTV の視聴者ではなく、通常のプレイヤーなのにです。
- 中途半端に切断されたそのプレイヤーには、空の内部オブジェクトが残ります。素のサーバーでは、エンジンがすぐにそこでクラッシュします(libengine2.so)。
- その段階を乗り切っても、1 秒後にボットが新しいマップに参加するとき、ゲームコードがクラッシュします(libserver.so)。bot_join_delay が防ぐのはこちらで、CounterStrikeSharp サーバーで見たクラッシュはすべてこれでした。
- Metamod なしの素のサーバーでは、1 つ目のエンジン側のクラッシュも確認しました。そちらに対する bot_join_delay の効果はまだ試していません。
効果のない方法
tv_enable 0をゲーム中に実行:全プレイヤーが一斉に切断されます。- 起動時から GOTV をオフ:クラッシュはしませんが、デモも観戦もなくなります。
tv_delay,tv_delaymapchange,tv_autorecord 0,tv_stoprecord: それでもクラッシュします。デモを止めるだけでは不十分で、デモを一切録画していなくてもクラッシュしました。bot_quota 0をモードの _server.cfg に入れる:試合の再開のたびにも実行され、SourceTV 自体をキックすることがあるため、マップの途中で GOTV の録画が止まります。mapを changelevel の代わりに使う:同じくクラッシュします。
自分のサーバー用の完全な設定
私たちがすべてのサーバーの server.cfg で使っている設定:
tv_enable 1
tv_autorecord 1
bot_join_delay 15- 一度きりの RCON コマンドだけでなく server.cfg に入れておけば、再起動後も有効です。
- 私たちが試したのは 15 秒です。回線が遅いプレイヤーや大きな Workshop マップでは読み込みに時間がかかるので、大きめの値のほうが安全です。ボットが少し遅れて来るだけです。
- 有効か確認するには、サーバーコンソールか RCON で次を入力します:
bot_join_delay - ボットなしで遊ぶ場合も、この設定は残しておいてください。Deathmatch や Casual などのモードは、デフォルトでマップ読み込みのたびにボットを追加します。
設定を省きたいなら:2hours.gg の CS2 サーバーには最初からこの修正が入っており、GOTV とデモもオンです。