Veículos FiveM desaparecendo ou despawnando: por que acontece e a correção

Carros spawnados desaparecem após alguns segundos ou quando você se afasta? Culling de entidade OneSync, modo órfão, proprietários saindo, scripts de limpeza e como manter um veículo persistente.

Sintomas típicos:

text
You spawn a car, walk a few hundred metres, and it is gone. Or a car you left on the street is missing after you log out.

Existem vários sistemas diferentes que deletam veículos, e cada um tem uma correção diferente. Este artigo explica cada um, e os jeitos de manter um veículo persistente.

Quem deleta um veículo

Um veículo em rede pode ser removido por:

  1. Culling de entidade. No OneSync, o servidor apenas mantém entidades que são relevantes a pelo menos um jogador. Uma entidade longe de todos pode ser removida.
  2. O proprietário sair. Uma entidade tem um cliente proprietário que a simula. Se o proprietário desconectar, a entidade pode ser removida a menos que o servidor diga ao jogo para mantê-la.
  3. Limpeza de população do jogo. O jogo deleta veículos ambiente que considera desnecessários. Um carro criado de uma certa forma pode ser tratado como um deles.
  4. Um script. Muitos servidores executam um script de limpeza que deleta carros desocupados em um timer.
  5. Seu próprio código. Um DeleteEntity em um loop, ou um script que deleta qualquer coisa perto do jogador.

Descubra qual é antes de mudar código.

Carros desaparecem em um tempo fixo

Se o veículo desaparece após exatamente o mesmo atraso, é um script de limpeza. Procure em seus recursos por DeleteEntity, DeleteVehicle e GetAllVehicles:

bash
grep -ri "GetAllVehicles" resources/ --include=*.lua

Procure por um loop que deleta qualquer veículo sem motorista. A maioria deles tem uma config para uma whitelist ou um atraso. Corrija lá, não no código de veículo.

Carros desaparecem quando você se afasta

Isso é culling e a regra de proprietário. OneSync não mantém entidades que ninguém está perto. Quando você spawna um carro para um jogador e o jogador deixa sua área, o carro é candidato para remoção.

O servidor pode decidir o que acontece com a entidade com seu modo órfão:

lua
-- server
SetEntityOrphanMode(vehicle, 2)

SetEntityOrphanMode toma a entidade e um modo. Os modos são: 0, deletar a entidade quando não é mais relevante (o padrão); 1, deletá-la quando seu proprietário desconecta; 2, mantê-la. Verifique a referência nativa atual para sua compilação de servidor antes de depender dos números.

O veículo deve ser criado no servidor para isso ser confiável. Um carro criado por um cliente, com CreateVehicle, pertence àquele cliente primeiro. Veja spawnando um veículo no servidor para o fluxo completo:

lua
local vehicle = CreateVehicleServerSetter(joaat('sultan'), 'automobile', x, y, z, heading)

while not DoesEntityExist(vehicle) do
    Wait(0)
end

SetEntityOrphanMode(vehicle, 2)

Atenção: uma entidade mantida fica até você deletá-la. Se você definir modo órfão para manter em cada carro, veículos abandonados se acumulam e sua contagem de entidades sobe. Delete-os você mesmo quando o jogador armazena o carro ou sai.

Precisa de OneSync

A maioria disso aplica-se apenas no OneSync. Verifique que está ativado em server.cfg, e leia como ativar OneSync. Sem ele, veículos são baseados em cliente e desaparecem com seu proprietário.

A limpeza do jogo no cliente

Quando você spawna um carro no cliente, o jogo pode tratá-lo como parte da população ambiente e removê-lo. Marque-o como uma entidade de missão para que seja tratado como seu:

lua
local vehicle = CreateVehicle(model, x, y, z, heading, true, false)
SetEntityAsMissionEntity(vehicle, true, true)

SetEntityAsMissionEntity também importa quando você precisa deletar um veículo depois. DeleteEntity em um veículo que o cliente não possui como uma entidade de missão pode falhar silenciosamente.

Um padrão comum é assumir o controle de uma entidade e depois deletá-la:

lua
local function removeVehicle(vehicle)
    if not DoesEntityExist(vehicle) then return end
    SetEntityAsMissionEntity(vehicle, true, true)
    DeleteEntity(vehicle)
end

Veículos persistentes: as abordagens reais

Uma garagem não mantém o carro no mundo. Ela mantém uma linha no banco de dados, e spawna o carro quando necessário. Para estacionamento permanente na rua, há duas abordagens:

Mantenha a entidade

Crie o carro no servidor, defina o modo órfão para manter, e lembre-o (net id e placa) em uma tabela. O carro fica no mundo enquanto o servidor funciona. Delete-o quando seu proprietário armazena o carro.

Isso é simples mas custa entidades, e tudo é perdido em um restart. Serve para um pequeno número de carros.

Salve e respawne

Salve a posição e propriedades do carro estacionado no banco de dados, delete a entidade, e spawne-o novamente quando um jogador fica perto. Isso escala para muitos carros, e sobrevive um restart:

  1. Quando o jogador estaciona fora, salve a placa, coordenadas, heading e propriedades.
  2. Remova a entidade.
  3. Quando um jogador entra em um raio, ou na inicialização do servidor, spawne novamente da linha.

As propriedades são cobradas em propriedades de veículo, e o lado da tabela em tabelas de garagem.

Outras causas

O jogador está muito longe e o carro está distante de qualquer raio de culling. Entidades além de uma certa distância não são sincronizadas com um cliente. Um carro pode parecer faltando para um cliente longe dele enquanto ainda existe no servidor. Verifique no servidor com DoesEntityExist(vehicle) antes de assumir que é deletado.

Routing buckets. Um veículo em outro routing bucket do que o jogador é invisível para eles. Veja routing buckets.

Limite de entidade. Um número muito alto de veículos atinge os limites do engine. Remova veículos não utilizados em vez de manter tudo.

O net id é obsoleto. Um script que mantém um net id para um carro que foi deletado segura um identificador que não existe mais. Verifique com NetworkDoesEntityExistWithNetworkId antes de usá-lo.

Lista de verificação

Sintoma Solução
Carro desaparece na mesma hora cada vez Encontre o script de limpeza e configure ou remova-o
Carro desaparece quando você se afasta Crie no lado do servidor e defina SetEntityOrphanMode para manter
Carro desaparece quando o proprietário faz logout Modo órfão manter, ou salve e respawne do banco de dados
Carro criado no cliente é deletado SetEntityAsMissionEntity(vehicle, true, true)
DeleteEntity não deleta Defina como uma entidade de missão primeiro no cliente proprietário
Carros se acumulam Delete veículos quando armazena, não mantenha cada entidade
Carro invisível para um jogador Verifique o routing bucket e que OneSync está ativado

Respostas rápidas

Por que carros estacionados desaparecem quando eu me afasto?

No OneSync, uma entidade que não é mais relevante para nenhum jogador é removida pelo servidor. Se você quer que um carro estacionado fique, o servidor tem que mantê-lo, por exemplo, definindo seu modo órfão, ou o script deve respawná-lo quando alguém retornar.

O que é SetEntityOrphanMode?

Um native de servidor que diz ao jogo o que fazer com uma entidade cujo proprietário saiu. Pode deletar a entidade, deletá-la quando não é mais relevante, ou mantê-la.

Eu ainda preciso de SetEntityAsMissionEntity?

No cliente ainda ajuda contra a limpeza de população do próprio jogo, que pode deletar um carro que pensa ser ambiente. Não substitui as configurações do lado do servidor.

Scripts sem esse problema

Advanced BoostingBoosting de veículos pelo tablet: contratos da classe D à S+, crews e fila ao vivo.Ver script →Chameleon Paints82 pinturas camaleão que mudam de cor, num menu de um clique.Ver script →Car BombPlante, detecte e desarme bombas em veículos — com celular detonador e minigame de C4.Ver script →

Continue lendo