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:
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:
- Entity culling. Na OneSync serwer trzyma tylko jednostki istotne dla co najmniej jednego gracza. Jednostka daleko od wszystkich może być usunięta.
- 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.
- 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.
- Skrypt. Wiele serwerów uruchamia skrypt czyszczenia, który usuwa niezajęte samochody na timer.
- Twój własny kod.
DeleteEntityw 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:
grep -ri "GetAllVehicles" resources/ --include=*.luaSzukaj 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:
-- 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:
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:
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:
local function removeVehicle(vehicle)
if not DoesEntityExist(vehicle) then return end
SetEntityAsMissionEntity(vehicle, true, true)
DeleteEntity(vehicle)
endPojazdy 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:
- Gdy gracz parkuje na zewnątrz, zapisz tablicę, współrzędne, nagłówek i właściwości.
- Usuń jednostkę.
- 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 →