Spawn di un veicolo in FiveM: CreateVehicle vs CreateVehicleServerSetter
Spawn di veicoli nel modo giusto in FiveM: client CreateVehicle con RequestModel, server CreateVehicleServerSetter su OneSync, net ids, targhe, chiavi e auto che scompaiono.
Spawn un veicolo e appare invisibile, spawna sotto la mappa, scompare dopo un minuto, o solo il giocatore che lo ha creato può vederlo. Ci sono due modi corretti per spawn di un'auto, e ognuno ha una serie diversa di insidie. Questo articolo mostra entrambi, come impostare la targa e consegnare le chiavi, e perché i veicoli creati scompaiono.
Spawn sul client con CreateVehicle
La versione client è quella che la maggior parte degli script usa. Il modello deve essere caricato prima di creare il veicolo, altrimenti CreateVehicle restituisce 0:
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
endI passaggi:
IsModelInCdimageverifica che il modello esista. Un errore di digitazione o un'auto addon mancante si ferma qui invece di congelare.RequestModelpoi un ciclo suHasModelLoadedaspetta, con un timeout.CreateVehicleaccetta il modello, la posizione, l'heading, poiisNetwork(truein modo che gli altri giocatori lo vedano) enetMissionEntity.SetModelAsNoLongerNeededlibera la memoria del modello quando finisci.
Se il veicolo è un addon, vedi prima come aggiungere auto addon. Un modello che non è in streaming non si carica mai.
Suggerimento: con ox_lib,
lib.requestModel(model)fa la richiesta e l'attesa per te, e genera un errore su un timeout.
Metti il giocatore nel sedile del conducente e imposta la targa:
local vehicle = spawnVehicle('sultan', GetEntityCoords(PlayerPedId()), GetEntityHeading(PlayerPedId()))
if vehicle then
SetVehicleNumberPlateText(vehicle, 'MIC 001')
SetPedIntoVehicle(PlayerPedId(), vehicle, -1)
endLa targa contiene al massimo 8 caratteri.
Spawn sul server con CreateVehicleServerSetter
Su OneSync, il server può creare il veicolo stesso. Questo è più affidabile per gli script in cui il server decide lo spawn, come un garage o un veicolo di lavoro, e nessun client deve stare vicino:
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)Il secondo argomento è il tipo di veicolo come stringa: 'automobile', 'bike', 'boat', 'heli', 'plane', 'submarine', 'trailer' o 'train'. Scegli quello che corrisponde al modello. Una bici creata come automobile si comporterà male.
A differenza del client, non richiedi il modello sul server. La chiamata è anche asincrona: l'entità potrebbe non esistere nel momento in cui ritorna, quindi attendi DoesEntityExist, con un timeout nel codice reale.
Abilita OneSync in server.cfg, altrimenti la chiamata non funziona. Vedi come abilitare OneSync.
Net ids: consegnare l'auto a un client
Un veicolo creato sul server ha un handle di entità che esiste solo sul server. Un client non può usarlo. Per fare riferimento all'auto tra le macchine, usa il suo network id, che è lo stesso ovunque:
-- server
local netId = NetworkGetNetworkIdFromEntity(vehicle)Sul client, attendi che l'entità esista su quella macchina, quindi converti:
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)Non inviare mai l'handle di entità grezzo su un evento: non significa nulla su un'altra macchina.
Targhe e chiavi
Imposta la targa subito dopo che il veicolo esiste, come negli esempi sopra, e prima di consegnare le chiavi. Le chiavi dipendono dallo script delle chiavi del veicolo che il tuo server usa, poiché ogni script ha la sua funzione. La maggior parte funziona con la targa, quindi l'ordine usuale è:
- Crea il veicolo.
- Imposta la targa con
SetVehicleNumberPlateText. - Chiama l'esportazione o l'evento dello script delle chiavi con quella targa.
Archivia la stessa targa nel tuo database, se il veicolo è di proprietà, in modo che il garage possa trovarla di nuovo. Controlla la documentazione dello script delle chiavi che usi per la chiamata esatta. Non copiare una chiamata da un altro server.
Perché i veicoli creati scompaiono
Non rilevante per nessuno. Il gioco rimuove un'entità in rete quando nessuno le è vicino. Un'auto creata sul server per un giocatore che poi si allontana può essere eliminata.
Il proprietario è uscito. Un'entità appartiene a un giocatore che la possiede. Quando un veicolo creato dal client il cui proprietario si disconnette o si allontana dall'intervallo, potrebbe essere rimosso. Sul server puoi impostare cosa succede:
SetEntityOrphanMode(vehicle, 2)La modalità orfana 2 è "mantieni l'entità", 0 è l'impostazione predefinita (elimina quando non rilevante), e 1 la elimina quando il proprietario si disconnette. Controlla la documentazione nativa per il tuo server build.
Non contrassegnato come entità di missione. Sul client, la pulizia ambientale può eliminare un'auto che hai creato. Contrassegnala in modo che il gioco la tratti come la tua:
SetEntityAsMissionEntity(vehicle, true, true)Uno script di pulizia. Molti server eseguono uno script che rimuove i veicoli non occupati. Se le tue auto scompaiono in un momento fisso, questa è la causa, non il tuo codice di spawn.
Non è mai stato creato. Un'auto invisibile o mancante di solito significa che il modello non è stato caricato, CreateVehicle ha restituito 0 e lo script ha continuato. Controlla sempre l'handle restituito.
Elimina le auto tu stesso quando finisci, con DeleteEntity(vehicle), in modo che non si accumulino.
Checklist
| Sintomo | Soluzione |
|---|---|
CreateVehicle restituisce 0 |
RequestModel e attendi HasModelLoaded prima |
| Blocco su un nome di modello errato | Controlla IsModelInCdimage prima di richiedere |
| Solo lo spawner vede l'auto | Passa isNetwork = true a CreateVehicle |
CreateVehicleServerSetter non fa nulla |
Abilita OneSync e attendi DoesEntityExist |
| Il client ottiene un id di entità inutile | Invia il net id, quindi usa NetToVeh sul client |
| L'auto scompare dopo | Contrassegna come entità di missione, imposta la modalità orfana, controlla gli script di pulizia |
| Il giocatore non può guidare la sua auto | Dai le chiavi con lo script delle chiavi, usando la targa |
Risposte rapide
Ho bisogno di OneSync per usare CreateVehicleServerSetter?
Sì. La creazione di entità lato server ha bisogno di OneSync abilitato. Su un server senza di esso, genera il veicolo sul client con CreateVehicle.
Perché la mia auto creata scompare?
Un veicolo in rete viene eliminato quando non è più rilevante per nessuno, o quando il suo proprietario esce, a meno che tu non dica al gioco di mantenerlo. Contrassegnalo come entità di missione sul client, o imposta la sua modalità orfana sul server.
Come do al giocatore le chiavi?
Dipende dallo script delle chiavi del veicolo che il tuo server usa. La maggior parte ha un'esportazione o un evento client che accetta la targa, quindi chiama quello dopo aver impostato la targa.

