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:

lua
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
end

I passaggi:

  1. IsModelInCdimage verifica che il modello esista. Un errore di digitazione o un'auto addon mancante si ferma qui invece di congelare.
  2. RequestModel poi un ciclo su HasModelLoaded aspetta, con un timeout.
  3. CreateVehicle accetta il modello, la posizione, l'heading, poi isNetwork (true in modo che gli altri giocatori lo vedano) e netMissionEntity.
  4. SetModelAsNoLongerNeeded libera 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:

lua
local vehicle = spawnVehicle('sultan', GetEntityCoords(PlayerPedId()), GetEntityHeading(PlayerPedId()))

if vehicle then
    SetVehicleNumberPlateText(vehicle, 'MIC 001')
    SetPedIntoVehicle(PlayerPedId(), vehicle, -1)
end

La 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:

lua
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:

lua
-- server
local netId = NetworkGetNetworkIdFromEntity(vehicle)

Sul client, attendi che l'entità esista su quella macchina, quindi converti:

lua
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 è:

  1. Crea il veicolo.
  2. Imposta la targa con SetVehicleNumberPlateText.
  3. 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:

lua
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:

lua
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.

Script senza questo problema

Advanced BoostingBoosting di veicoli dal tablet: contratti dalla classe D alla S+, crew e coda in tempo reale.Vedi script →Chameleon Paints82 vernici camaleonte che cambiano colore, in un menu da applicare con un clic.Vedi script →

Continua a leggere