Les véhicules FiveM disparaissent ou sont supprimés : pourquoi et le correctif

Les voitures générées disparaissent après quelques secondes ou quand vous vous éloignez ? Culling d'entité OneSync, mode orphelin, propriétaires partant, scripts de nettoyage et comment garder un véhicule persistant.

Symptômes typiques :

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.

Il y a plusieurs systèmes différents qui suppriment les véhicules, et chacun a un correctif différent. Cet article explique chacun, et les façons de rendre un véhicule persistant.

Qui supprime un véhicule

Un véhicule en réseau peut être supprimé par :

  1. Culling d'entité. Sur OneSync, le serveur ne garde que les entités pertinentes pour au moins un joueur. Une entité loin de tout le monde peut être supprimée.
  2. Le propriétaire part. Une entité a un client propriétaire qui la simule. Si le propriétaire se déconnecte, l'entité peut être supprimée à moins que le serveur ne dise au jeu de la garder.
  3. Le nettoyage de la population du jeu. Le jeu supprime les véhicules ambiants qu'il considère comme non nécessaires. Une voiture créée d'une certaine façon peut être traitée comme l'une d'elles.
  4. Un script. De nombreux serveurs exécutent un script de nettoyage qui supprime les voitures inoccupées sur un minuteur.
  5. Votre propre code. Un DeleteEntity dans une boucle, ou un script qui supprime tout près du joueur.

Trouvez lequel c'est avant de changer le code.

Les voitures disparaissent à une heure fixe

Si le véhicule disparaît après exactement le même délai, c'est un script de nettoyage. Cherchez dans vos ressources DeleteEntity, DeleteVehicle et GetAllVehicles :

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

Cherchez une boucle qui supprime tout véhicule sans conducteur. La plupart ont une configuration pour une whitelist ou un délai. Corrigez-la là, pas dans le code du véhicule.

Les voitures disparaissent quand vous vous éloignez

C'est le culling et la règle du propriétaire. OneSync ne garde pas les entités dont personne n'est près. Quand vous générez une voiture pour un joueur et que le joueur quitte sa zone, la voiture est candidate pour suppression.

Le serveur peut décider ce qui se passe avec l'entité avec son mode orphelin :

lua
-- server
SetEntityOrphanMode(vehicle, 2)

SetEntityOrphanMode prend l'entité et un mode. Les modes sont : 0, supprimer l'entité quand elle n'est plus pertinente (le défaut) ; 1, la supprimer quand son propriétaire se déconnecte ; 2, la garder. Vérifiez la référence native actuelle pour votre version serveur avant de vous y fier.

Le véhicule doit être créé sur le serveur pour que ce soit fiable. Une voiture créée par un client, avec CreateVehicle, appartient d'abord à ce client. Voir spawning a vehicle on the server pour le flux complet :

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

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

SetEntityOrphanMode(vehicle, 2)

Attention : une entité gardée reste jusqu'à ce que vous la supprimiez. Si vous définissez le mode orphelin pour garder chaque voiture, les véhicules abandonnés s'accumulent et votre nombre d'entités augmente. Supprimez-les vous-même quand le joueur range la voiture ou part.

Besoins OneSync

La plupart de cela ne s'applique que sur OneSync. Vérifiez qu'il est activé dans server.cfg, et lisez how to enable OneSync. Sans lui, les véhicules sont basés sur le client et disparaissent avec leur propriétaire.

Le nettoyage du jeu sur le client

Quand vous générez une voiture sur le client, le jeu peut la traiter comme faisant partie de la population ambiante et la supprimer. Marquez-la comme une entité de mission pour qu'elle soit traitée comme la vôtre :

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

SetEntityAsMissionEntity compte aussi quand vous devez supprimer un véhicule plus tard. DeleteEntity sur un véhicule que le client ne possède pas en tant que entité de mission peut silencieusement échouer.

Un motif courant est de prendre contrôle d'une entité puis de la supprimer :

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

Véhicules persistants : les vraies approches

Un garage ne garde pas la voiture dans le monde. Il garde une ligne dans la base de données, et génère la voiture au besoin. Pour le stationnement permanent dans la rue, il y a deux approches :

Gardez l'entité

Créez la voiture sur le serveur, définissez le mode orphelin pour garder, et rappelez-vous (net id et plaque) dans une table. La voiture reste dans le monde pendant que le serveur s'exécute. Supprimez-la quand son propriétaire range la voiture.

C'est simple mais coûte des entités, et tout est perdu à un redémarrage. Cela convient à un petit nombre de voitures.

Enregistrez et régénérez

Enregistrez la position et les propriétés de la voiture garée dans la base de données, supprimez l'entité, et régénérez-la quand un joueur s'en rapproche. Cela se met à l'échelle pour de nombreuses voitures, et survit à un redémarrage :

  1. Quand le joueur se gare à l'extérieur, enregistrez la plaque, les coordonnées, la direction et les propriétés.
  2. Supprimez l'entité.
  3. Quand un joueur entre dans un rayon, ou au démarrage du serveur, régénérez-la à partir de la ligne.

Les propriétés sont couvertes dans vehicle properties, et le côté tableau dans garage tables.

Autres causes

Le joueur est à beaucoup de mètres et la voiture est loin de tout rayon de culling. Les entités au-delà d'une certaine distance ne sont pas synchronisées à un client. Une voiture peut sembler manquante sur un client loin d'elle tout en existant toujours sur le serveur. Vérifiez sur le serveur avec DoesEntityExist(vehicle) avant d'assumer qu'elle est supprimée.

Buckets de routage. Un véhicule dans un autre bucket de routage que le joueur est invisible pour lui. Voir routing buckets.

Limite d'entité. Un très grand nombre de véhicules atteint les limites du moteur. Supprimez les véhicules inutilisés au lieu de tout garder.

Le net id est périmé. Un script qui garde un net id pour une voiture qui a été supprimée tient un identifiant qui n'existe plus. Vérifiez avec NetworkDoesEntityExistWithNetworkId avant de l'utiliser.

Liste de contrôle

Symptôme Solution
La voiture disparaît à la même heure à chaque fois Trouvez le script de nettoyage et configurez ou supprimez-le
La voiture disparaît quand vous vous éloignez Créez-la côté serveur et définissez SetEntityOrphanMode pour garder
La voiture disparaît quand le propriétaire se déconnecte Mode orphelin garder, ou enregistrez et régénérez à partir de la base de données
La voiture créée par client est supprimée SetEntityAsMissionEntity(vehicle, true, true)
DeleteEntity ne supprime pas Définissez-la en tant qu'entité de mission en premier sur le client propriétaire
Les voitures s'accumulent Supprimez les véhicules quand ils sont rangés, ne gardez pas chaque entité
La voiture est invisible pour un joueur Vérifiez le bucket de routage et que OneSync est activé

Réponses rapides

Pourquoi les voitures garées disparaissent-elles quand je m'éloigne ?

Sur OneSync, une entité qui n'est plus pertinente pour aucun joueur est supprimée par le serveur. Si vous voulez qu'une voiture garée reste, le serveur doit la garder, par exemple en définissant son mode orphelin, ou le script doit la régénérer quand quelqu'un revient.

Qu'est-ce que SetEntityOrphanMode ?

Un native serveur qui dit au jeu quoi faire avec une entité dont le propriétaire a quitté. Il peut supprimer l'entité, la supprimer quand elle n'est plus pertinente, ou la garder.

Dois-je toujours utiliser SetEntityAsMissionEntity ?

Sur le client, cela aide toujours contre le nettoyage de la population propre du jeu, qui peut supprimer une voiture qu'il pense être ambiante. Cela ne remplace pas les paramètres côté serveur.

Des scripts sans ce problème

Advanced BoostingDu boosting de véhicules piloté par tablette : contrats de classe D à S+, crews et file d’attente en direct.Voir le script →Chameleon Paints82 peintures caméléon à reflets changeants, dans un menu à appliquer en un clic.Voir le script →Car BombPosez, détectez et désamorcez des bombes sur les véhicules — avec téléphone détonateur et mini-jeu de C4.Voir le script →

À lire aussi