Servidores de jogos por hora. Pague só quando jogar.

Servidor CS2 crasha na troca de mapa (GOTV ligado): a solução em uma linha

Seu servidor CS2 roda bem, aí o mapa muda e todo mundo é expulso: o servidor crashou. Se o GOTV está ligado e havia jogadores conectados, é esse bug. Aqui está a solução e depois o motivo.

A solução: uma linha

Adicione isto em game/csgo/cfg/server.cfg:

bot_join_delay 15
  • Agora os bots esperam 15 segundos depois de cada troca de mapa antes de entrar.
  • O crash acontece quando bots entram enquanto um jogador ainda está carregando o novo mapa. Com o atraso, os jogadores carregam primeiro.
  • O GOTV continua ligado. As demos continuam gravando, os espectadores continuam assistindo.
  • Para aplicar sem reiniciar, envie pelo RCON: rcon bot_join_delay 15

No nosso lab: sem ela, 3 de 6 trocas de mapa crasharam. Com ela, 0 de 18 crasharam, entre trocas no meio da partida, trocas no fim da partida e mudanças de modo ao vivo. Todo servidor CS2 do 2hours.gg já vem com ela.

Quando acontece

Tudo isto ao mesmo tempo:

  • SourceTV (GOTV) está ativado: tv_enable 1
  • Pelo menos um jogador de verdade está conectado. Um servidor só com bots nunca crashou.
  • O nível muda: um mapa escolhido pelo console, changelevel ou map, o fim de uma partida ou a votação do fim da partida.

É aleatório. Nos nossos testes cerca de metade das trocas de mapa crasharam, e em servidores ao vivo aconteceu com mais frequência com 3 ou mais jogadores conectados. Um servidor que sobreviveu a uma troca pode crashar na próxima.

Como aparece: todos os jogadores caem ao mesmo tempo durante o carregamento do mapa, e o log do servidor termina com uma falha de segmentação (SIGSEGV) em vez de o novo mapa começar.

Diferenças entre os modos

O config da Valve de cada modo define quantos bots entram a cada carregamento de mapa. Mais bots entrando significa mais chances de crash:

  • Deathmatch, Team Deathmatch, Casual: até 10 bots entram a cada carregamento. São os mais expostos, e onde vimos mais crashes.
  • Competitive: 1 bot. No nosso lab não crashou sem a solução, mas servidores ao vivo com mais jogadores crasharam.
  • A solução é a mesma em todos os modos: bot_join_delay é uma configuração que vale para toda troca de mapa, seja qual for a causa.

O bug de verdade (para os curiosos)

É um bug da engine da Valve, não de um plugin. Crashou com Metamod e CounterStrikeSharp removidos. Ele é reportado desde 2024 como ValveSoftware/csgo-osx-linux#3831. Acompanhe lá: esperamos que a Valve corrija logo e que esta solução alternativa deixe de ser necessária.

O que encontramos com um debugger:

  • Quando o mapa muda, o SourceTV desliga e desconecta o jogador conectado com o motivo "SourceTV stopped" (HLTVSTOP), mesmo sendo um jogador normal e não um espectador do GOTV.
  • Esse jogador meio desconectado fica com um objeto interno vazio. Em um servidor puro a engine crasha nele na hora (libengine2.so).
  • Se essa etapa sobrevive, o código do jogo crasha um segundo depois, quando os bots entram no novo mapa (libserver.so). É esse que o bot_join_delay evita, e foram todos os crashes que vimos em servidores com CounterStrikeSharp.
  • Em um servidor puro sem Metamod também vimos o primeiro crash, o da engine. Ainda não testamos o bot_join_delay contra esse.

O que não funciona

  • tv_enable 0 durante o jogo: derruba todos os jogadores de uma vez.
  • GOTV desligado desde o boot: sem crash, mas sem demos e sem espectadores.
  • tv_delay, tv_delaymapchange, tv_autorecord 0, tv_stoprecord: continuam crashando. Parar a demo não basta: crashou sem nenhuma demo gravando.
  • bot_quota 0 no _server.cfg de um modo: ele também roda a cada restart de partida e pode expulsar o próprio SourceTV, então o GOTV para de gravar no meio do mapa.
  • map em vez de changelevel: mesmo crash.

Uma configuração completa para o seu próprio servidor

O que rodamos em todo servidor, no server.cfg:

tv_enable 1
tv_autorecord 1
bot_join_delay 15
  • Deixe no server.cfg, não só em um comando RCON avulso, para que volte depois de um restart.
  • 15 segundos é o que testamos. Jogadores com conexão lenta ou mapas grandes da Workshop demoram mais para carregar, então um valor maior é mais seguro e só faz os bots chegarem um pouco mais tarde.
  • Para conferir se está ativo, digite no console do servidor ou no RCON: bot_join_delay
  • Joga sem bots? Mantenha mesmo assim: modos como Deathmatch e Casual adicionam bots a cada carregamento de mapa por padrão.

Ou pule a configuração: todo servidor CS2 no 2hours.gg já tem a solução, com GOTV e demos ligados.

Implante um servidor CS2 por hora

Veja também

← Voltar para todos os guias