Votre serveur CS2 tourne bien, puis la map change et tout le monde est éjecté : le serveur a crashé. Si GOTV est activé et que des joueurs étaient connectés, c’est ce bug. Voici la solution, puis la cause.
La solution : une ligne
Ajoutez ceci à game/csgo/cfg/server.cfg:
bot_join_delay 15- Les bots attendent maintenant 15 secondes après chaque changement de map avant de rejoindre.
- Le crash se produit quand des bots rejoignent pendant qu’un joueur charge encore la nouvelle map. Avec ce délai, les joueurs chargent d’abord.
- GOTV reste activé. Les démos continuent d’enregistrer, les spectateurs continuent de regarder.
- Pour l’appliquer sans redémarrer, envoyez-le par RCON :
rcon bot_join_delay 15
Dans notre lab : sans lui, 3 changements de map sur 6 ont crashé. Avec lui, 0 sur 18, en changeant de map en cours de match, en fin de match et en changeant de mode en direct. Chaque serveur CS2 de 2hours.gg l’inclut.
Quand ça arrive
Tout ceci en même temps :
- SourceTV (GOTV) est activé :
tv_enable 1 - Au moins un vrai joueur est connecté. Un serveur avec uniquement des bots n’a jamais crashé.
- Le niveau change : une map choisie depuis la console, changelevel ou map, la fin d’un match ou le vote de fin de match.
C’est aléatoire. Dans nos tests, environ la moitié des changements de map ont crashé, et sur les serveurs en production c’était plus fréquent avec 3 joueurs connectés ou plus. Un serveur qui a survécu à un changement peut crasher au suivant.
Ce que ça donne : tous les joueurs sont déconnectés en même temps pendant le chargement de la map, et le log du serveur se termine par une erreur de segmentation (SIGSEGV) au lieu du lancement de la nouvelle map.
Différences entre les modes
La config Valve de chaque mode fixe combien de bots rejoignent à chaque chargement de map. Plus il y a de bots qui rejoignent, plus il y a de risques de crash :
- Deathmatch, Team Deathmatch, Casual : jusqu’à 10 bots rejoignent à chaque chargement. Les plus exposés, et là où nous avons vu le plus de crashs.
- Competitive : 1 bot. Dans notre lab, il n’a pas crashé sans la solution, mais des serveurs en production avec plus de joueurs, si.
- La solution est la même pour tous les modes : bot_join_delay est un seul réglage qui s’applique à chaque changement de map, quelle qu’en soit l’origine.
Le vrai bug (pour les curieux)
C’est un bug du moteur de Valve, pas d’un plugin. Il a crashé avec Metamod et CounterStrikeSharp retirés. Il est signalé depuis 2024 sous ValveSoftware/csgo-osx-linux#3831. Suivez-le là-bas : nous espérons que Valve le corrigera vite, et que ce contournement deviendra inutile.
Ce que nous avons trouvé avec un débogueur :
- Au changement de map, SourceTV s’arrête et déconnecte le joueur connecté avec la raison "SourceTV stopped" (HLTVSTOP), alors que c’est un joueur normal et pas un spectateur GOTV.
- Ce joueur à moitié déconnecté se retrouve avec un objet interne vide. Sur un serveur sans plugins, le moteur crashe dessus immédiatement (libengine2.so).
- Si cette étape passe, le code du jeu crashe une seconde plus tard, quand les bots rejoignent la nouvelle map (libserver.so). C’est celui qu’évite bot_join_delay, et c’était tous les crashs que nous avons vus sur les serveurs CounterStrikeSharp.
- Sur un serveur sans Metamod, nous avons aussi vu le premier crash, côté moteur. Nous n’avons pas encore testé bot_join_delay contre celui-là.
Ce qui ne marche pas
tv_enable 0en cours de partie : déconnecte tous les joueurs d’un coup.- GOTV coupé dès le démarrage : pas de crash, mais pas de démos ni de mode spectateur.
tv_delay,tv_delaymapchange,tv_autorecord 0,tv_stoprecord: crashent quand même. Arrêter la démo ne suffit pas : il a crashé sans aucune démo en cours d’enregistrement.bot_quota 0dans le _server.cfg d’un mode : il s’exécute aussi à chaque redémarrage de match et peut éjecter SourceTV lui-même, donc GOTV arrête d’enregistrer en pleine map.mapau lieu de changelevel : même crash.
Une config complète pour votre propre serveur
Ce que nous utilisons sur chaque serveur, dans server.cfg :
tv_enable 1
tv_autorecord 1
bot_join_delay 15- Gardez-le dans server.cfg, pas seulement dans une commande RCON ponctuelle, pour qu’il soit toujours là après un redémarrage.
- 15 secondes est la valeur que nous avons testée. Les joueurs avec une connexion lente ou sur de grosses maps Workshop mettent plus de temps à charger : une valeur plus haute est plus sûre et fait seulement arriver les bots un peu plus tard.
- Pour vérifier qu’il est actif, tapez dans la console du serveur ou en RCON :
bot_join_delay - Vous jouez sans bots ? Gardez-le quand même : des modes comme Deathmatch et Casual ajoutent des bots à chaque chargement de map par défaut.
Ou évitez la configuration : chaque serveur CS2 sur 2hours.gg a déjà la solution, avec GOTV et les démos activés.
Déployer un serveur CS2 à l’heure