Los vehículos de FiveM desaparecen o se despawnan: por qué sucede y la solución
¿Los coches desovados desaparecen después de unos segundos o cuando te alejas? Entity culling de OneSync, orphan mode, dueños que se van, scripts de limpieza y cómo mantener un vehículo persistente.
Síntomas típicos:
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.Hay varios sistemas diferentes que eliminan vehículos, y cada uno tiene una solución diferente. Este artículo explica cada uno, y las formas de hacer que un vehículo sea persistente.
Quién elimina un vehículo
Un vehículo en red puede ser eliminado por:
- Entity culling. En OneSync, el servidor solo mantiene entidades que son relevantes para al menos un jugador. Una entidad lejos de todos puede ser eliminada.
- El propietario se va. Una entidad tiene un cliente propietario que la simula. Si el propietario se desconecta, la entidad puede ser eliminada a menos que el servidor le diga al juego que la mantenga.
- La limpieza de población del juego. El juego elimina vehículos ambientales que considera no necesarios. Un coche creado de cierta manera puede ser tratado como uno de ellos.
- Un script. Muchos servidores ejecutan un script de limpieza que elimina coches desocupados en un temporizador.
- Tu propio código. Un
DeleteEntityen un bucle, o un script que elimina cualquier cosa cerca del jugador.
Averigua cuál es antes de cambiar código.
Los coches desaparecen en un tiempo fijo
Si el vehículo desaparece exactamente después del mismo retraso, es un script de limpieza. Busca en tus recursos DeleteEntity, DeleteVehicle y GetAllVehicles:
grep -ri "GetAllVehicles" resources/ --include=*.luaBusca un bucle que elimine cualquier vehículo sin conductor. La mayoría de ellos tienen una configuración para una whitelist o un retraso. Arregla ahí, no en el código del vehículo.
Los coches desaparecen cuando te alejas
Esto es culling y la regla del propietario. OneSync no mantiene entidades que nadie esté cerca. Cuando desovas un coche para un jugador y el jugador deja su área, el coche es un candidato para eliminación.
El servidor puede decidir qué sucede con la entidad con su modo huérfano:
-- server
SetEntityOrphanMode(vehicle, 2)SetEntityOrphanMode toma la entidad y un modo. Los modos son: 0, elimina la entidad cuando ya no es relevante (el predeterminado); 1, elimínala cuando su propietario se desconecta; 2, mantenla. Comprueba la referencia nativa actual para tu construcción de servidor antes de confiar en los números.
El vehículo debe ser creado en el servidor para que esto sea confiable. Un coche creado por un cliente, con CreateVehicle, pertenece primero a ese cliente. Mira desovando un vehículo en el servidor para el flujo completo:
local vehicle = CreateVehicleServerSetter(joaat('sultan'), 'automobile', x, y, z, heading)
while not DoesEntityExist(vehicle) do
Wait(0)
end
SetEntityOrphanMode(vehicle, 2)Cuidado: una entidad mantenida permanece hasta que la elimines. Si estableces el modo huérfano en mantener en cada coche, los vehículos abandonados se acumulan y tu número de entidades sube. Elimínalos tú mismo cuando el jugador almacene el coche o se vaya.
Necesita OneSync
La mayoría de esto solo se aplica en OneSync. Comprueba que esté habilitado en server.cfg, y lee cómo habilitar OneSync. Sin él, los vehículos están basados en el cliente y desaparecen con su propietario.
La limpieza del juego en el cliente
Cuando desovas un coche en el cliente, el juego puede tratarlo como parte de la población ambiental y eliminarlo. Márcalo como una entidad de misión para que se trate como tuyo:
local vehicle = CreateVehicle(model, x, y, z, heading, true, false)
SetEntityAsMissionEntity(vehicle, true, true)SetEntityAsMissionEntity también importa cuando necesitas eliminar un vehículo más tarde. DeleteEntity en un vehículo que el cliente no posee como una entidad de misión puede fallar silenciosamente.
Un patrón común es tomar control de una entidad y luego eliminarla:
local function removeVehicle(vehicle)
if not DoesEntityExist(vehicle) then return end
SetEntityAsMissionEntity(vehicle, true, true)
DeleteEntity(vehicle)
endVehículos persistentes: los enfoques reales
Un garaje no mantiene el coche en el mundo. Mantiene una fila en la base de datos, y desova el coche cuando es necesario. Para estacionamiento callejero persistente, hay dos enfoques:
Mantén la entidad
Crea el coche en el servidor, establece el modo huérfano en mantener, y recuerda (net id y matrícula) en una tabla. El coche permanece en el mundo mientras el servidor se ejecuta. Elimínalo cuando su propietario guarda el coche.
Esto es simple pero cuesta entidades, y todo se pierde en un reinicio. Se adapta a un pequeño número de coches.
Guarda y reaparición
Guarda la posición y propiedades del coche estacionado en la base de datos, elimina la entidad, y desovalo de nuevo cuando un jugador se acerque. Esto escala a muchos coches, y sobrevive un reinicio:
- Cuando el jugador estaciona afuera, guarda la matrícula, coordenadas, heading y propiedades.
- Elimina la entidad.
- Cuando un jugador entra en un radio, o en el inicio del servidor, desovalo de nuevo desde la fila.
Las propiedades se cubren en propiedades del vehículo, y el lado de la tabla en tablas de garaje.
Otras causas
El jugador está muchos metros lejos y el coche está lejos de cualquier radio de culling. Las entidades más allá de cierta distancia no se sincronizan a un cliente. Un coche puede parecer que falta en un cliente lejos de él mientras aún existe en el servidor. Comprueba en el servidor con DoesEntityExist(vehicle) antes de asumir que fue eliminado.
Routing buckets. Un vehículo en otro routing bucket que el jugador es invisible para ellos. Mira routing buckets.
Límite de entidades. Un número muy alto de vehículos alcanza los límites del motor. Elimina vehículos no usados en lugar de mantener todo.
El net id es antiguo. Un script que mantiene un net id para un coche que fue eliminado mantiene un handle que ya no existe. Comprueba con NetworkDoesEntityExistWithNetworkId antes de usarlo.
Lista de comprobación
| Síntoma | Solución |
|---|---|
| El coche desaparece a la misma hora cada vez | Encuentra el script de limpieza y configúralo o elimínalo |
| El coche desaparece cuando te alejas | Créalo en el lado del servidor y establece SetEntityOrphanMode en mantener |
| El coche desaparece cuando el propietario cierra sesión | Modo huérfano mantener, o guarda y reaparición de la base de datos |
| El coche creado por el cliente es eliminado | SetEntityAsMissionEntity(vehicle, true, true) |
DeleteEntity no elimina |
Estáblecelo como una entidad de misión primero en el cliente propietario |
| Los coches se acumulan | Elimina vehículos cuando se almacenan, no mantengas cada entidad |
| El coche es invisible para un jugador | Comprueba el routing bucket y que OneSync esté activado |
Respuestas rápidas
¿Por qué los coches estacionados desaparecen cuando me alejo?
En OneSync, una entidad que ya no es relevante para ningún jugador es eliminada por el servidor. Si quieres que un coche estacionado se quede, el servidor tiene que mantenerlo, por ejemplo estableciendo su modo huérfano, o el script debe reaparicionarlo cuando alguien regresa.
¿Qué es SetEntityOrphanMode?
Un nativo del servidor que le dice al juego qué hacer con una entidad cuyo propietario se fue. Puede eliminar la entidad, eliminarla cuando ya no es relevante, o mantenerla.
¿Todavía necesito SetEntityAsMissionEntity?
En el cliente aún ayuda contra la limpieza de población propia del juego, que puede eliminar un coche que cree que es ambiental. No reemplaza la configuración del lado del servidor.
Scripts que evitan este problema
Advanced BoostingBoosting de vehículos desde una tablet: contratos de clase D a S+, crews y cola en vivo.Ver script →
Chameleon Paints82 pinturas camaleón que cambian de color, en un menú de un clic.Ver script →
Car BombColoca, detecta y desactiva bombas en coches — con detonador y minijuego de C4.Ver script →