Fahrzeug in FiveM spawnen: CreateVehicle vs CreateVehicleServerSetter
Spawn Fahrzeuge auf die richtige Weise in FiveM: client CreateVehicle mit RequestModel, server CreateVehicleServerSetter auf OneSync, net ids, Kennzeichen, Schlüssel und verschwindende Autos.
Du spawnst ein Fahrzeug und es erscheint unsichtbar, spawnt unter der Karte, verschwindet nach einer Minute oder nur der Spieler, der es gespawnt hat, kann es sehen. Es gibt zwei richtige Wege, um ein Auto zu spawnen, und jeder hat einen anderen Satz von Fallstricken. Dieser Artikel zeigt beide, wie man das Kennzeichen setzt und die Schlüssel übergibt, und warum gespawnte Autos verschwinden.
Spawn auf dem Client mit CreateVehicle
Die Client-Version ist die, die die meisten Scripts verwenden. Das Modell muss geladen werden, bevor du das Fahrzeug erstellst, sonst gibt CreateVehicle 0 zurück:
local function spawnVehicle(modelName, coords, heading)
local model = joaat(modelName)
if not IsModelInCdimage(model) or not IsModelAVehicle(model) then
print('invalid vehicle model:', modelName)
return nil
end
RequestModel(model)
local timeout = GetGameTimer() + 5000
while not HasModelLoaded(model) do
if GetGameTimer() > timeout then
print('model did not load:', modelName)
return nil
end
Wait(0)
end
local vehicle = CreateVehicle(model, coords.x, coords.y, coords.z, heading, true, false)
SetModelAsNoLongerNeeded(model)
return vehicle
endDie Schritte:
IsModelInCdimageüberprüft, dass das Modell vorhanden ist. Ein Tippfehler oder ein fehlender Addon-Auto stoppt hier statt einzufrieren.RequestModeldann eine Schleife aufHasModelLoadedwartet, mit einem Timeout.CreateVehiclenimmt das Modell, die Position, den Heading, dannisNetwork(trueso dass andere Spieler es sehen) undnetMissionEntity.SetModelAsNoLongerNeededbefreit den Model-Speicher, wenn du fertig bist.
Wenn das Fahrzeug ein Addon ist, siehe wie man Addon-Autos hinzufügt zuerst. Ein Modell, das nicht gestreamt wird, lädt nie.
Tipp: mit ox_lib,
lib.requestModel(model)macht die Anfrage und das Warten für dich und wirft Fehler aus bei Timeout.
Setze den Spieler auf den Fahrersitz und stelle das Kennzeichen:
local vehicle = spawnVehicle('sultan', GetEntityCoords(PlayerPedId()), GetEntityHeading(PlayerPedId()))
if vehicle then
SetVehicleNumberPlateText(vehicle, 'MIC 001')
SetPedIntoVehicle(PlayerPedId(), vehicle, -1)
endDas Kennzeichen hält maximal 8 Zeichen.
Spawn auf dem Server mit CreateVehicleServerSetter
Auf OneSync, der Server kann das Fahrzeug selbst erstellen. Dies ist zuverlässiger für Scripts, wo der Server das Spawn entscheidet, wie ein Garage oder ein Job-Fahrzeug, und kein Client muss in der Nähe bleiben:
RegisterNetEvent('my_script:spawnCar', function()
local src = source
local ped = GetPlayerPed(src)
local coords = GetEntityCoords(ped)
local heading = GetEntityHeading(ped)
local vehicle = CreateVehicleServerSetter(joaat('sultan'), 'automobile', coords.x, coords.y, coords.z, heading)
while not DoesEntityExist(vehicle) do
Wait(0)
end
SetVehicleNumberPlateText(vehicle, 'MIC 001')
TaskWarpPedIntoVehicle(ped, vehicle, -1)
local netId = NetworkGetNetworkIdFromEntity(vehicle)
TriggerClientEvent('my_script:vehicleSpawned', src, netId)
end)Das zweite Argument ist der Fahrzeugtyp als String: 'automobile', 'bike', 'boat', 'heli', 'plane', 'submarine', 'trailer' oder 'train'. Wähle den, der zum Modell passt. Ein Bike als Automobile erstellt, wird sich falsch verhalten.
Im Gegensatz zum Client, du forderst das Modell nicht auf dem Server an. Der Call ist auch asynchron: die Entität kann die Moment nicht existieren, wenn sie zurückkommt, also warte auf DoesEntityExist, mit Timeout in echtem Code.
Aktiviere OneSync in server.cfg, oder der Call funktioniert nicht. Siehe wie man OneSync aktiviert.
Net IDs: das Auto an einen Client übergeben
Ein Fahrzeug, das auf dem Server erstellt wird, hat einen Entity-Handle, der nur auf dem Server existiert. Ein Client kann ihn nicht verwenden. Um auf das Auto über Maschinen hinweg zu verweisen, verwende seine Network ID, die überall gleich ist:
-- server
local netId = NetworkGetNetworkIdFromEntity(vehicle)Auf dem Client, warte darauf, dass die Entität auf dieser Maschine existiert, dann konvertiere:
RegisterNetEvent('my_script:vehicleSpawned', function(netId)
local timeout = GetGameTimer() + 5000
while not NetworkDoesEntityExistWithNetworkId(netId) do
if GetGameTimer() > timeout then return end
Wait(0)
end
local vehicle = NetToVeh(netId)
print('my vehicle is', vehicle)
end)Sende nie den Raw-Entity-Handle über ein Event: er bedeutet nichts auf einer anderen Maschine.
Kennzeichen und Schlüssel
Setze das Kennzeichen direkt nach dem Fahrzeug vorhanden ist, wie in den Beispielen oben, und vor du die Schlüssel übergibst. Die Schlüssel hängen von deinem Fahrzeugschlüssel-Script ab, da jedes Script seine eigene Funktion hat. Die meisten arbeiten mit dem Kennzeichen, also ist die übliche Reihenfolge:
- Erstelle das Fahrzeug.
- Setze das Kennzeichen mit
SetVehicleNumberPlateText. - Rufe den Export oder Event deines Schlüssel-Scripts mit diesem Kennzeichen auf.
Speichere dasselbe Kennzeichen in deiner Datenbank, wenn das Fahrzeug Eigentum ist, damit die Garage es wiederfinden kann. Überprüfe die Dokumentation des Schlüssel-Scripts, das du verwendest, für den exakten Call. Kopiere keinen Call von einem anderen Server.
Warum gespawnte Autos verschwinden
Nicht relevant für niemanden. Das Spiel entfernt eine vernetzte Entität, wenn niemand in ihrer Nähe ist. Ein Auto, das auf dem Server für einen Spieler gespawnt wird, der sich dann entfernt, kann gelöscht werden.
Der Besitzer ist weg. Eine Entität gehört einem Spieler, der sie besitzt. Wenn der Besitzer des Client-gespawnten Fahrzeugs disconnected oder außer Reichweite geht, kann es entfernt werden. Auf dem Server kannst du setzen, was passiert:
SetEntityOrphanMode(vehicle, 2)Der Orphan-Modus 2 ist "behalte die Entität", 0 ist der Standard (lösche, wenn nicht relevant), und 1 löscht es, wenn der Besitzer disconnectet. Überprüfe die Dokumentation der Funktion für deinen Server Build.
Nicht als Mission-Entität markiert. Auf dem Client, Ambient Cleanup kann ein Auto, das du erstellt hast, löschen. Markiere es so, dass das Spiel es als deines behandelt:
SetEntityAsMissionEntity(vehicle, true, true)Ein Cleanup-Script. Viele Server führen ein Script aus, das unbewohnte Fahrzeuge entfernt. Wenn deine Autos zur festen Zeit verschwinden, das ist die Ursache, nicht dein Spawn-Code.
Es ist nie gespawnt. Ein unsichtbares oder fehlendes Auto bedeutet oft, dass das Modell nicht geladen war, CreateVehicle gab 0 zurück und das Script ging weiter. Überprüfe immer den zurückgegebenen Handle.
Lösche Autos selbst, wenn du fertig bist, mit DeleteEntity(vehicle), damit sie sich nicht häufen.
Checkliste
| Symptom | Behebung |
|---|---|
CreateVehicle gibt 0 zurück |
RequestModel und warte auf HasModelLoaded zuerst |
| Einfrieren bei schlechtem Modellnamen | Überprüfe IsModelInCdimage vor dem Anfordern |
| Nur der Spawner sieht das Auto | Übergebe isNetwork = true an CreateVehicle |
CreateVehicleServerSetter tut nichts |
Aktiviere OneSync und warte auf DoesEntityExist |
| Client bekommt eine nutzlose Entity-ID | Sende die net id, dann verwende NetToVeh auf dem Client |
| Auto verschwindet später | Markiere als Mission-Entität, setze den Orphan-Modus, überprüfe Cleanup-Scripts |
| Spieler kann sein Auto nicht fahren | Gib die Schlüssel mit deinem Schlüssel-Script, mit dem Kennzeichen |
Kurze Antworten
Brauche ich OneSync, um CreateVehicleServerSetter zu verwenden?
Ja. Server-seitige Entitätserstellung braucht OneSync aktiviert. Auf einem Server ohne OneSync, spawne das Fahrzeug auf dem Client mit CreateVehicle.
Warum verschwindet mein gespawntes Auto?
Ein vernetztes Fahrzeug wird gelöscht, wenn es für niemandem mehr relevant ist, oder wenn sein Besitzer geht, es sei denn, du sagst dem Spiel, es zu behalten. Markiere es als Mission-Entität auf dem Client oder setze seinen Orphan-Modus auf dem Server.
Wie gebe ich dem Spieler die Schlüssel?
Es hängt vom Fahrzeugschlüssel-Script ab, das dein Server verwendet. Die meisten haben einen Client-Export oder Event, das das Kennzeichen nimmt, also rufe das auf, nachdem du das Kennzeichen setzt.

