Reliable network event overflow em FiveM: encontre o script e conserte

Jogadores kickados com Reliable network event overflow? Um script envia muitos dados de evento. Encontre o recurso, encolha payloads, use latent events e state bags.

Um jogador é jogado para fora do server, ou o server inteiro começa a timeout, com uma mensagem como essa:

text
Reliable network event overflow

FiveM mantém uma fila limitada de reliable network events para cada conexão. Quando um script a preenche mais rápido que a conexão pode enviar, o jogador é derrubado. A causa é quase sempre um recurso. Aqui está como encontrá-lo e consertá-lo.

O que acontece

Cada TriggerClientEvent e TriggerServerEvent é uma mensagem confiável: deve chegar, em ordem. Se você envia muitas delas, ou muito grandes, a fila para aquele jogador cresce. Quando transborda, a conexão é cortada.

Os padrões usuais:

  • Uma tabela grande enviada em um evento: uma lista completa de veículos, items, jogadores, ou uma config inteira.
  • Um loop que dispara um evento em cada tick ou a cada poucos milissegundos.
  • Um evento enviado para todos (-1) muitas vezes por segundo.
  • Um script que envia os mesmos dados novamente e novamente, quando não mudou.
lua
-- bad: sends everything, to everyone, every 100 ms
CreateThread(function()
    while true do
        Wait(100)
        TriggerClientEvent('myscript:update', -1, GetAllData())
    end
end)

Encontre o recurso

A mensagem de erro não nomeia o script, então você tem que medir.

  1. Olhe o console do server ao redor da hora dos kicks. Muitos nomes de evento idênticos, ou um recurso que começou logo antes dos problemas, é uma pista.
  2. Use o profiler. O profiler built-in grava uma sessão curta e deixa você abri-la em um viewer. No console do server:
text
profiler record 500
profiler view

Verifique os comandos exatos para seu server build, pois podem mudar entre versões. A gravação mostra quais recursos e eventos levam tempo, e ajuda você a notar o pesado.

  1. Pare recursos um de cada vez em um test server. Se os kicks param depois que você para um recurso, você o encontrou.
  2. Procure no código por TriggerClientEvent e TriggerServerEvent dentro de loops, e por eventos enviados com -1.

Dica: o problema frequentemente começa depois que você adiciona um novo script, ou depois de uma atualização de script. Verifique o que mudou primeiro.

Solução 1: envie payloads menores

Envie apenas o que mudou, não o conjunto de dados inteiro.

lua
-- bad: the whole table
TriggerClientEvent('shop:sync', src, allShops)

-- better: only the changed entry
TriggerClientEvent('shop:updateOne', src, shopId, shops[shopId])

Remova campos que o cliente não precisa, envie ids em vez de objetos inteiros, e deixe o cliente requisitar detalhes quando precisar.

Solução 2: envie menos frequentemente

Dispare eventos quando algo acontece, não em um timer. Se você precisa de um timer, deixe-o mais lento e pule quando nada mudou.

lua
local last = nil

CreateThread(function()
    while true do
        Wait(2000)
        local data = GetData()
        if data ~= last then
            last = data
            TriggerClientEvent('myscript:update', -1, data)
        end
    end
end)

Envie para os jogadores que precisam, não para -1, quando apenas alguns jogadores se importam.

Solução 3: latent events para big data

Quando você realmente deve enviar muitos dados, como uma config grande ou uma imagem, use um latent event. Envia os dados no background em uma velocidade que você define, em bytes por segundo, em vez de preencher a fila normal.

lua
-- server -> client, 50 KB/s
TriggerLatentClientEvent('myscript:bigData', src, 50000, bigTable)
lua
-- client -> server
TriggerLatentServerEvent('myscript:bigData', 50000, bigTable)

O evento chega depois, então use-o apenas para dados que não são time critical. Escolha uma velocidade que não sature a conexão do jogador.

Solução 4: state bags para shared state

Se os dados são state de uma entidade ou jogador (uma flag, um valor, um status), um state bag é frequentemente melhor que eventos. FiveM replica mudanças para você, e apenas envia o que mudou.

lua
-- server
Player(src).state:set('isCuffed', true, true)

-- client, anywhere
local cuffed = LocalPlayer.state.isCuffed

State bags são para valores pequenos, não para tabelas grandes. Leia FiveM state bags explained para como funcionam, e Client and server events in FiveM para o básico de eventos.

Se você não conseguir editar o script

Se o script é um recurso pago ou protegido, você não consegue mudar seu código. Reporte o problema ao autor com o resultado do profiler e a hora dos kicks. Eles saberão qual evento é muito grande. Até então, parar o recurso ou abaixar sua taxa de refresh na config, se tiver, é a única workaround.

Checklist

Sintoma Solução
Reliable network event overflow kick Encontre o script que envia muitos dados
Kicks começaram depois de adicionar um script Pare aquele recurso e teste novamente
Tabela grande em um evento Envie apenas dados mudados ou ids
Evento em um loop rápido Envie na mudança, deixe o timer mais lento
Evento enviado para -1 constantemente Envie para os jogadores que precisam
Big payload que não é urgente TriggerLatentClientEvent ou TriggerLatentServerEvent
State de entidade ou jogador Use state bags

Respostas rápidas

O que causa Reliable network event overflow?

Um recurso envia eventos mais rápido ou com mais dados que a conexão pode entregar. Tabelas grandes enviadas em um evento, ou um loop que dispara eventos a cada poucos milissegundos, são as causas usuais.

Reliable network event overflow é causado por muitos jogadores?

Não diretamente. Mais jogadores tornam mais provável, porque um script que envia para todos multiplica o tráfego. A causa ainda é um recurso que envia muitos dados.

O que é um latent event?

Um latent event envia seus dados no background em uma velocidade que você escolhe, então não entope a fila de evento normal. Use-o para payloads grandes que não são urgentes.

Scripts sem esse problema

Mic PhoneUm celular dobrável que abre em tablet e chega ao celular de verdade do jogador.Ver script →CCTV Security CamerasCâmeras posicionáveis, um tablet com várias telas ao vivo e fotos impressas como prova.Ver script →Shop CreatorMonte uma loja em menos de um minuto — donos, funcionários, cofres e assaltos inclusos.Ver script →

Continue lendo