Veicoli FiveM che scompaiono o si despawnano: perché accade e la correzione

Le auto generate scompaiono dopo pochi secondi o quando ti allontani? Culling entità OneSync, modalità orfana, proprietari che lasciano, script di pulizia e come mantenere un veicolo persistente.

Sintomi tipici:

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.

Ci sono diversi sistemi diversi che eliminano i veicoli, e ognuno ha una correzione diversa. Questo articolo spiega ognuno, e i modi per rendere un veicolo persistente.

Chi elimina un veicolo

Un veicolo in rete può essere rimosso da:

  1. Culling entità. Su OneSync, il server mantiene solo le entità che sono rilevanti per almeno un giocatore. Un'entità lontana da tutti può essere rimossa.
  2. Il proprietario che se ne va. Un'entità ha un client proprietario che la simula. Se il proprietario si disconnette, l'entità può essere rimossa a meno che il server non dica al gioco di mantenerla.
  3. La pulizia della popolazione del gioco. Il gioco elimina i veicoli ambientali che considera non necessari. Un'auto creata in un certo modo può essere trattata come uno di loro.
  4. Uno script. Molti server eseguono uno script di pulizia che elimina le auto non occupate su un timer.
  5. Il tuo codice. Un DeleteEntity in un ciclo, o uno script che elimina qualsiasi cosa vicino al giocatore.

Scopri quale è prima di cambiare il codice.

Le auto scompaiono a un'ora fissa

Se il veicolo scompare esattamente dopo lo stesso ritardo, è uno script di pulizia. Cerca nelle tue risorse DeleteEntity, DeleteVehicle e GetAllVehicles:

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

Cerca un ciclo che elimina qualsiasi veicolo senza conducente. La maggior parte di loro ha una configurazione per una whitelist o un ritardo. Correggilo lì, non nel codice del veicolo.

Le auto scompaiono quando ti allontani

Questo è culling e la regola del proprietario. OneSync non mantiene le entità che nessuno è vicino. Quando generi un'auto per un giocatore e il giocatore lascia la sua area, l'auto è un candidato per la rimozione.

Il server può decidere cosa succede all'entità con la sua modalità orfana:

lua
-- server
SetEntityOrphanMode(vehicle, 2)

SetEntityOrphanMode accetta l'entità e una modalità. Le modalità sono: 0, elimina l'entità quando non è più rilevante (il valore predefinito); 1, eliminala quando il suo proprietario si disconnette; 2, mantienila. Controlla il riferimento nativo attuale per il tuo server build prima di fare affidamento sui numeri.

Il veicolo deve essere creato sul server affinché ciò sia affidabile. Un'auto creata da un client, con CreateVehicle, appartiene a quel client per primo. Vedi spawning a vehicle on the server per il flusso completo:

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

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

SetEntityOrphanMode(vehicle, 2)

Attenzione: un'entità mantenuta rimane finché non la elimini. Se imposti la modalità orfana per mantenere su ogni auto, le auto abbandonate si accumulano e il tuo conteggio di entità aumenta. Eliminale tu stesso quando il giocatore archivia l'auto o se ne va.

Ha bisogno di OneSync

La maggior parte di questo si applica solo su OneSync. Controlla che sia abilitato in server.cfg, e leggi come abilitare OneSync. Senza di esso, i veicoli sono basati su client e scompaiono con il loro proprietario.

La pulizia del gioco sul client

Quando generi un'auto sul client, il gioco potrebbe trattarla come parte della popolazione ambientale e rimuoverla. Contrassegnala come entità di missione in modo che sia trattata come la tua:

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

SetEntityAsMissionEntity conta anche quando devi eliminare un veicolo dopo. DeleteEntity su un veicolo che il client non possiede come entità di missione può silenziosamente fallire.

Un modello comune è prendere il controllo di un'entità e poi eliminarla:

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

Veicoli persistenti: i veri approcci

Un garage non mantiene l'auto nel mondo. Mantiene una riga nel database, e genera l'auto quando necessario. Per il parcheggio stradale persistente, ci sono due approcci:

Mantieni l'entità

Crea l'auto sul server, imposta la modalità orfana per mantenere, e ricordala (net id e targa) in una tabella. L'auto rimane nel mondo mentre il server gira. Eliminala quando il suo proprietario archivia l'auto.

Questo è semplice ma costa entità, e tutto viene perso al riavvio. Si adatta a un piccolo numero di auto.

Salva e rigenerata

Salva la posizione e le proprietà dell'auto parcheggiata nel database, elimina l'entità, e generala di nuovo quando un giocatore si avvicina. Questo scala a molte auto, e sopravvive a un riavvio:

  1. Quando il giocatore parcheggia all'esterno, salva la targa, le coordinate, l'heading e le proprietà.
  2. Rimuovi l'entità.
  3. Quando un giocatore entra in un raggio, o all'avvio del server, generala di nuovo dalla riga.

Le proprietà sono coperte in proprietà del veicolo, e il lato tabella in tabelle del garage.

Altre cause

Il giocatore è molti metri lontano e l'auto è lontana da qualsiasi raggio di culling. Le entità oltre una certa distanza non vengono sincronizzate a un client. Un'auto può sembrare mancante su un client lontano da essa mentre esiste comunque sul server. Controlla sul server con DoesEntityExist(vehicle) prima di presumere che sia stata eliminata.

Routing buckets. Un veicolo in un routing bucket diverso dal giocatore è invisibile per loro. Vedi routing buckets.

Limite di entità. Un numero molto alto di veicoli colpisce i limiti del motore. Rimuovi i veicoli non utilizzati invece di mantenere tutto.

Il net id è obsoleto. Uno script che mantiene un net id per un'auto che è stata eliminata contiene un handle che non esiste più. Controlla con NetworkDoesEntityExistWithNetworkId prima di usarlo.

Checklist

Sintomo Soluzione
L'auto scompare alla stessa ora ogni volta Trova lo script di pulizia e configuralo o rimuovilo
L'auto scompare quando ti allontani Creala lato server e imposta SetEntityOrphanMode per mantenere
L'auto scompare quando il proprietario disconnette Modalità orfana mantieni, o salva e rigenerata dal database
L'auto creata dal client viene eliminata SetEntityAsMissionEntity(vehicle, true, true)
DeleteEntity non elimina Impostala come entità di missione per primo sul client proprietario
Le auto si accumulano Elimina i veicoli quando archiviati, non mantenere ogni entità
L'auto invisibile a un giocatore Controlla il routing bucket e che OneSync sia acceso

Risposte rapide

Perché le auto parcheggiate scompaiono quando mi allontano?

Su OneSync, un'entità che non è più rilevante per nessun giocatore viene rimossa dal server. Se vuoi che un'auto parcheggiata rimanga, il server deve mantenerla, ad esempio impostando la sua modalità orfana, o lo script deve rigenerarla quando qualcuno torna.

Cos'è SetEntityOrphanMode?

Un nativo del server che dice al gioco cosa fare con un'entità il cui proprietario ha lasciato. Può eliminare l'entità, eliminarla quando non è più rilevante, o mantenerla.

Ho ancora bisogno di SetEntityAsMissionEntity?

Sul client aiuta ancora contro la pulizia della popolazione del gioco stesso, che può eliminare un'auto che pensa sia ambientale. Non sostituisce le impostazioni lato server.

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 →Car BombPiazza, individua e disinnesca bombe sui veicoli — con telefono detonatore e minigioco del C4.Vedi script →

Continua a leggere