Pojazdy FiveM znikają lub despawnują: dlaczego to się dzieje i naprawa

Spawne samochody znikają po kilku sekundach lub gdy się oddalasz? OneSync entity culling, orphan mode, właściciele opuszczający, skrypty czyszczenia i jak zachować pojazd trwały.

Typowe objawy:

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.

Jest kilka różnych systemów, które usuwają pojazdy i każdy ma inną naprawę. Ten artykuł wyjaśnia każdy z nich i sposoby na uczynienie pojazdu trwałym.

Kto usuwa pojazd

Pojazd w sieci może zostać usunięty przez:

  1. Entity culling. Na OneSync serwer trzyma tylko jednostki istotne dla co najmniej jednego gracza. Jednostka daleko od wszystkich może być usunięta.
  2. Właściciel opuszcza. Jednostka ma klienta właściciela, który ją symuluje. Jeśli właściciel się rozłączy, jednostka może być usunięta, chyba że serwer powie grze, aby ją przechowywała.
  3. Czyszczenie populacji gry. Gra usuwa pojazdy otoczenia, które uważa za niepotrzebne. Samochód stworzony w określony sposób może być traktowany jako jeden z nich.
  4. Skrypt. Wiele serwerów uruchamia skrypt czyszczenia, który usuwa niezajęte samochody na timer.
  5. Twój własny kod. DeleteEntity w pętli, lub skrypt, który usuwa cokolwiek blisko gracza.

Najpierw ustal, który to jest, zanim zmienisz kod.

Samochody znikają w ustalonym czasie

Jeśli pojazd znika po dokładnie tej samej opóźnieniu, to jest skrypt czyszczenia. Przeszukaj zasoby dla DeleteEntity, DeleteVehicle i GetAllVehicles:

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

Szukaj pętli, która usuwa każdy pojazd bez kierowcy. Większość z nich ma konfigurację dla whitelist'y lub opóźnienia. Napraw to tam, a nie w kodzie pojazdu.

Samochody znikają, gdy się oddalasz

To jest culling i reguła właściciela. OneSync nie trzyma jednostek, które nikt nie ma blisko. Gdy spawnujesz samochód dla gracza i gracz opuszcza jego obszar, samochód jest kandydatem do usunięcia.

Serwer może zdecydować, co się stanie z jednostką za pomocą jej orphan mode:

lua
-- server
SetEntityOrphanMode(vehicle, 2)

SetEntityOrphanMode bierze jednostkę i tryb. Tryby to: 0, usuń jednostkę, gdy nie jest już istotna (domyślnie); 1, usuń ją, gdy jej właściciel się rozłączy; 2, zachowaj ją. Sprawdź bieżące odniesienie native'a dla Twojej kompilacji serwera, zanim się na nich polegasz.

Pojazd musi być stworzony na serwerze, aby to było niezawodne. Samochód stworzony przez klienta z CreateVehicle najpierw należy do tego klienta. Zobacz spawn pojazdu na serwerze dla pełnego przepływu:

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

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

SetEntityOrphanMode(vehicle, 2)

Ostrzeżenie: zachowana jednostka pozostaje, dopóki ją nie usuniesz. Jeśli ustawisz orphan mode do zachowania na każdym samochodzie, opuszczone pojazdy się piętrzą i liczba jednostek rośnie. Usuń je sam, gdy gracz przechowuje samochód lub się wylogowuje.

Potrzebuje OneSync

Większość z tego dotyczy tylko OneSync. Sprawdź, czy jest włączony w server.cfg i przeczytaj jak włączyć OneSync. Bez niego pojazdy są oparte na kliencie i znikają z ich właścicielem.

Czyszczenie populacji gry na kliencie

Gdy spawnujesz samochód na kliencie, gra może traktować go jako część populacji otoczenia i usunąć go. Oznacz go jako jednostkę misji, aby traktować go jako twojego:

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

SetEntityAsMissionEntity ma również znaczenie, gdy później potrzebujesz usunąć pojazd. DeleteEntity na pojazdu, którego klient nie posiadł jako jednostkę misji, może cicho zawieść.

Typowym wzorcem jest przejęcie kontroli nad jednostką, a następnie jej usunięcie:

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

Pojazdy trwałe: rzeczywiste podejścia

Garaż nie trzyma samochodu na świecie. Trzyma wiersz w bazie danych i spawnuje samochód, gdy jest potrzebny. Dla trwałego parkowania na ulicy, są dwa podejścia:

Zachowaj jednostkę

Stwórz samochód na serwerze, ustaw orphan mode do zachowania i zapamiętaj go (net id i tablica) w tabeli. Samochód pozostaje na świecie, gdy serwer działa. Usuń go, gdy jego właściciel przechowuje samochód.

To jest proste, ale kosztuje jednostki i wszystko jest tracone przy restarcie. Pasuje do małej liczby samochodów.

Zapisz i zrespawnuj

Zapisz pozycję i właściwości zaparkowanego samochodu w bazie danych, usuń jednostkę i spawn ją ponownie, gdy gracz się zbliży. To skaluje się do wielu samochodów i przetrwa restart:

  1. Gdy gracz parkuje na zewnątrz, zapisz tablicę, współrzędne, nagłówek i właściwości.
  2. Usuń jednostkę.
  3. Gdy gracz wchodzi w promień, lub przy starcie serwera, spawn ją ponownie z wiersza.

Właściwości są opisane w właściwościach pojazdu i strona tabeli w tabelach garażu.

Inne przyczyny

Gracz jest wiele metrów daleko i samochód jest daleko od każdego promienia culling'u. Jednostki poza określoną odległością nie są synchronizowane z klientem. Samochód może wyglądać jak brakuje na kliencie daleko od niego, podczas gdy nadal istnieje na serwerze. Sprawdź na serwerze z DoesEntityExist(vehicle) zanim założysz, że jest usunięty.

Routing buckets. Pojazd w innym routing bucket'cie niż gracz jest dla nich niewidoczny. Zobacz routing buckets.

Limit jednostek. Bardzo duża liczba pojazdów trafia na limity silnika. Usuń nieużywane pojazdy zamiast przechowywać wszystko.

Net id jest przestarzały. Skrypt, który trzyma net id dla samochodu, który został usunięty, trzyma uchwyt, który już nie istnieje. Sprawdzaj z NetworkDoesEntityExistWithNetworkId przed jego użyciem.

Lista kontrolna

Objaw Rozwiązanie
Samochód znika o tej samej porze za każdym razem Znajdź skrypt czyszczenia i skonfiguruj lub usuń
Samochód znika, gdy się oddalasz Stwórz go po stronie serwera i ustaw SetEntityOrphanMode do zachowania
Samochód znika, gdy właściciel się wylogowuje Orphan mode zachowania lub zapisz i zrespawnuj z bazy danych
Samochód stworzony przez klienta się usuwa SetEntityAsMissionEntity(vehicle, true, true)
DeleteEntity nie usuwa Najpierw ustaw go jako jednostkę misji na kliencie właściciela
Samochody się piętrzą Usuń pojazdy przy przechowywaniu, nie przechowuj każdej jednostki
Samochód niewidoczny dla jednego gracza Sprawdzaj routing bucket i że OneSync jest włączony

Szybkie odpowiedzi

Dlaczego zaparkowane samochody znikają, gdy się oddalasz?

Na OneSync jednostka, która nie jest już istotna dla żadnego gracza, jest usuwana przez serwer. Jeśli chcesz, aby zaparkowany samochód pozostał, serwer musi go przechowywać, na przykład ustawiając jego orphan mode, lub skrypt musi go zrespawnować, gdy ktoś się wróci.

Co to jest SetEntityOrphanMode?

Serwer native, który mówi grze co zrobić z jednostką, której właściciel odszedł. Może usunąć jednostkę, usunąć ją, gdy nie jest już istotna, lub ją przechowywać.

Czy nadal potrzebuję SetEntityAsMissionEntity?

Na kliencie nadal pomaga przeciwko własnemu czyszczeniu populacji gry, które może usunąć samochód, który myśli, że jest otoczeniem. Nie zastępuje on ustawień po stronie serwera.

Skrypty bez tego problemu

Advanced BoostingBoosting pojazdów z tabletu: kontrakty od klasy D do S+, ekipy i kolejka na żywo.Zobacz skrypt →Chameleon Paints82 lakiery kameleon zmieniające kolor, w jednym menu — klik i gotowe.Zobacz skrypt →Car BombPodkładaj, wykrywaj i rozbrajaj bomby w autach — z telefonem-detonatorem i minigrą C4.Zobacz skrypt →

Czytaj dalej