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:
Reliable network event overflowFiveM 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.
-- 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.
- 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.
- Use o profiler. O profiler built-in grava uma sessão curta e deixa você abri-la em um viewer. No console do server:
profiler record 500
profiler viewVerifique 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.
- Pare recursos um de cada vez em um test server. Se os kicks param depois que você para um recurso, você o encontrou.
- Procure no código por
TriggerClientEventeTriggerServerEventdentro 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.
-- 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.
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.
-- server -> client, 50 KB/s
TriggerLatentClientEvent('myscript:bigData', src, 50000, bigTable)-- 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.
-- server
Player(src).state:set('isCuffed', true, true)
-- client, anywhere
local cuffed = LocalPlayer.state.isCuffedState 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 →