FiveM Fahrzeuge verschwinden oder despawnen: warum es passiert und die Behebung

Gespawnte Autos verschwinden nach ein paar Sekunden oder wenn du weggängst? OneSync Entity Culling, Orphan Mode, Besitzer verlassen, Cleanup-Scripts und wie man ein Fahrzeug persistent hält.

Typische Symptome:

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.

Es gibt mehrere verschiedene Systeme, die Fahrzeuge löschen, und jedes hat eine andere Behebung. Dieser Artikel erklärt jeden einzelnen und die Wege, um ein Fahrzeug persistent zu machen.

Wer löscht ein Fahrzeug

Ein vernetztes Fahrzeug kann gelöscht werden durch:

  1. Entity Culling. Auf OneSync, der Server behält nur Entitäten, die für mindestens einen Spieler relevant sind. Eine Entität weit weg von jedem kann entfernt werden.
  2. Der Besitzer geht. Eine Entität hat einen Besitzer-Client, der sie simuliert. Wenn der Besitzer disconnected, kann die Entität entfernt werden, es sei denn, der Server sagt dem Spiel, es zu behalten.
  3. Die Population-Bereinigung des Spiels. Das Spiel löscht Umgebungsfahrzeuge, die es als nicht notwendig hält. Ein Auto, das in einer bestimmten Weise erstellt wird, kann als eines davon behandelt werden.
  4. Ein Script. Viele Server führen ein Cleanup-Script aus, das unbewohnte Autos auf einem Timer löscht.
  5. Dein eigener Code. Ein DeleteEntity in einer Schleife oder ein Script, das alles in der Nähe des Spielers löscht.

Finde heraus, welche es ist, bevor du den Code änderst.

Autos verschwinden zu einer festen Zeit

Wenn das Fahrzeug nach genau der gleichen Verzögerung verschwindet, ist es ein Cleanup-Script. Suche deine Ressourcen nach DeleteEntity, DeleteVehicle und GetAllVehicles:

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

Suche nach einer Schleife, die Fahrzeuge ohne Fahrer löscht. Die meisten haben eine Konfiguration für eine Whitelist oder eine Verzögerung. Behebe es dort, nicht im Fahrzeugcode.

Autos verschwinden, wenn du weggängst

Dies ist Culling und die Besitzer-Regel. OneSync behält keine Entitäten, die niemand in der Nähe ist. Wenn du ein Auto für einen Spieler spawnst und der Spieler seinen Bereich verlässt, ist das Auto ein Kandidat für Entfernung.

Der Server kann entscheiden, was mit der Entität mit seinem Orphan-Modus passiert:

lua
-- server
SetEntityOrphanMode(vehicle, 2)

SetEntityOrphanMode nimmt die Entität und einen Modus. Die Modi sind: 0, lösche die Entität, wenn sie nicht mehr relevant ist (der Standard); 1, lösche sie, wenn ihr Besitzer disconnected; 2, behalte sie. Überprüfe die aktuelle Native-Referenz für deinen Server Build, bevor du dich darauf verlässt.

Das Fahrzeug muss auf dem Server erstellt werden, damit dies zuverlässig ist. Ein Auto, das von einem Client mit CreateVehicle erstellt wird, gehört zunächst diesem Client. Siehe Fahrzeug auf dem Server spawnen für den vollständigen Fluss:

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

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

SetEntityOrphanMode(vehicle, 2)

Achtung: Eine behaltene Entität bleibt, bis du sie löschst. Wenn du Orphan-Modus setzen zu behalten auf jedem Auto, verlassene Fahrzeuge stapeln sich und deine Entity-Anzahl steigt. Lösche sie selbst, wenn der Spieler das Auto speichert oder geht.

Braucht OneSync

Die meisten davon gelten nur auf OneSync. Überprüfe, dass es in server.cfg aktiviert ist und lese wie man OneSync aktiviert. Ohne OneSync sind Fahrzeuge Client-basiert und verschwinden mit ihrem Besitzer.

Die Bereinigung des Spiels auf dem Client

Wenn du ein Auto auf dem Client spawnst, kann das Spiel es als Teil der Umgebungsbevölkerung behandeln und es entfernen. Markiere es als Mission-Entität, damit es als deins behandelt wird:

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

SetEntityAsMissionEntity ist auch wichtig, wenn du ein Fahrzeug später löschen musst. DeleteEntity auf einem Fahrzeug, das der Client nicht als Mission-Entität besitzt, kann stillschweigend fehlschlagen.

Ein häufiges Muster ist, die Kontrolle über eine Entität zu übernehmen und sie dann zu löschen:

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

Persistent Fahrzeuge: die echten Ansätze

Eine Garage behält nicht das Auto in der Welt. Es behält eine Zeile in der Datenbank und spawnt das Auto, wenn notwendig. Für persistent Straßenparken gibt es zwei Ansätze:

Behalte die Entität

Erstelle das Auto auf dem Server, setze den Orphan-Modus zu behalten und erinnere dich (Net ID und Kennzeichen) in einer Tabelle. Das Auto bleibt in der Welt, während der Server läuft. Lösche es, wenn sein Besitzer das Auto speichert.

Dies ist einfach, kostet aber Entitäten, und alles geht bei einem Neustart verloren. Es passt zu einer kleinen Anzahl von Autos.

Speichere und spawne erneut

Speichere die Position und Eigenschaften des geparkten Autos in der Datenbank, lösche die Entität und spawne es erneut, wenn ein Spieler in der Nähe kommt. Dies skaliert auf viele Autos und überlebt einen Neustart:

  1. Wenn der Spieler außen parkt, speichere das Kennzeichen, die Koordinaten, den Heading und die Eigenschaften.
  2. Entferne die Entität.
  3. Wenn ein Spieler einen Radius betritt oder beim Server-Start, spawne sie erneut aus der Zeile.

Die Eigenschaften werden in Fahrzeug-Eigenschaften behandelt und die Tabellenseite in Garage-Tabellen.

Andere Ursachen

Der Spieler ist viele Meter entfernt und das Auto ist weit weg von jedem Cull-Radius. Entitäten jenseits einer bestimmten Entfernung werden nicht an einen Client synchronisiert. Ein Auto kann auf einem Client weit weg davon fehlend aussehen, während es immer noch auf dem Server existiert. Überprüfe auf dem Server mit DoesEntityExist(vehicle), bevor du annimmst, dass es gelöscht ist.

Routing-Buckets. Ein Fahrzeug in einem anderen Routing-Bucket als der Spieler ist für sie unsichtbar. Siehe Routing-Buckets.

Entity-Limit. Eine sehr hohe Anzahl von Fahrzeugen trifft die Grenzen des Engines. Entferne unbenutzte Fahrzeuge, anstatt alles zu behalten.

Die Net ID ist veraltet. Ein Script, das eine Net ID für ein Auto hält, das gelöscht wurde, hält einen Handle, der nicht mehr existiert. Überprüfe mit NetworkDoesEntityExistWithNetworkId, bevor du es verwendest.

Checkliste

Symptom Behebung
Auto verschwindet zur gleichen Zeit jedes Mal Finde das Cleanup-Script und konfiguriere oder entferne es
Auto verschwindet, wenn du weggängst Erstelle es auf dem Server und setze SetEntityOrphanMode zu behalten
Auto verschwindet, wenn der Besitzer ausloggt Orphan-Modus behalten oder speichere und spawne von der Datenbank neu
Client-erstelltes Auto wird gelöscht SetEntityAsMissionEntity(vehicle, true, true)
DeleteEntity löscht nicht Setze es zuerst als Mission-Entität auf dem Besitzer-Client
Autos stapeln sich Lösche Fahrzeuge, wenn gespeichert, behalte nicht jede Entität
Auto unsichtbar für einen Spieler Überprüfe den Routing-Bucket und dass OneSync an ist

Kurze Antworten

Warum verschwinden geparkte Autos, wenn ich weggehe?

Auf OneSync wird eine Entität, die nicht mehr relevant für einen Spieler ist, vom Server entfernt. Wenn du ein geparktes Auto behalten möchtest, muss der Server es behalten, zum Beispiel durch Setzen des Orphan-Modus oder das Script muss es spawnen, wenn jemand zurückkommt.

Was ist SetEntityOrphanMode?

Ein Server-Native, der dem Spiel sagt, was mit einer Entität zu tun ist, deren Besitzer gegangen ist. Es kann die Entität löschen, sie löschen, wenn sie nicht mehr relevant ist, oder behalten.

Brauche ich immer noch SetEntityAsMissionEntity?

Auf dem Client hilft es immer noch gegen die Population-Bereinigung des Spiels, die ein Auto löschen kann, das es für Umgebung hält. Es ersetzt nicht die Einstellungen auf der Serverseite.

Scripts ohne dieses Problem

Advanced BoostingFahrzeug-Boosting per Tablet: Aufträge von Klasse D bis S+, Crews und eine Live-Warteschlange.Script ansehen →Chameleon Paints82 schillernde Chamäleon-Lacke in einem Menü, per Klick aufgetragen.Script ansehen →Car BombPlatziere, finde und entschärfe Autobomben — mit Zünder-Handy und C4-Minispiel.Script ansehen →

Weiterlesen