Upadek przez mapę w FiveM: kolizje się nie ładują, jak naprawić

Gracze upadają przez mapę przy spawnie lub teleportacji? Napraw opóźnione kolizje: brakujące .ybn pliki, zbyt wiele streamingu, RequestCollisionAtCoord i HasCollisionLoadedAroundEntity.

Objaw: spawniasz, teletransportujesz lub wchodzisz do niestandardowego wnętrza i upadasz przez podłogę, czasami do morza lub pustki pod mapą, lub upadasz przez kilka sekund na połączeniu, zanim wylądowisz. Przyczyna to jedna rzecz: gra rysuje świat, zanim załadowała kolizję, która go umacnia. Oto jak to naprawić w plikach i w swoich skryptach.

Dlaczego to się dzieje

Dane kolizji (pliki .ybn) są streamowane jak modele. Gra ładuje je wokół gracza i to trwa. Gdy skrypt przenosi gracza daleko na raz, lub gracz spawnie na zabitym serwerze, gracz może być umieszczony, zanim podłoga istnieje. Grawitacja wygrywa i gracz upada.

Są cztery zwykłe przyczyny:

  • Niestandardowa mapa nie ma kolizji, lub nie jest streamowana.
  • Serwer streamuje zbyt wiele, więc każde ładowanie jest powolne.
  • Skrypt teletransportuje się bez czekania na kolizję.
  • Połączenie jest powolne, więc pliki zasobów przychodzą opóźnione dla gracza, który dołącza.

Przyczyna 1: brakujące .ybn w niestandardowej mapie

Jeśli upadasz tylko wewnątrz jednego MLO lub jednej mapy, spójrz na jej zasób najpierw:

text
my_mlo/
  fxmanifest.lua
  stream/
    my_mlo.ymap
    my_mlo.ytyp
    my_mlo.ybn      <- the collisions
  • Pliki .ybn muszą być wewnątrz stream. .ybn poza tym nigdy nie jest wysyłany do graczy.
  • Pakiet na kilka części budynku może mieć kilka plików .ybn. Upewnij się, że wszystkie przyszły, gdy kopiowałeś folder.
  • Jeśli pakiet w ogóle nie ma .ybn, autor nie zrobił kolizji, i potrzebne jest narzędzie do edycji mapy. Skontaktuj się z autorem lub wybierz inną mapę.
  • Sprawdź, czy zasób jest uruchomiony i manifest ma this_is_a_map 'yes'. Patrz how to install an MLO dla pełnego układu.

Przyczyna 2: streaming zbyt wiele

Każdy gracz pobiera i ładuje pliki streamowane twoich zasobów. Bardzo duże tekstury, zbyt wiele samochodów dodatków, ubrań, pedów i map używają budżetu streamowania, a kolizje ładują się późno, ponieważ czekają za ciężkimi plikami.

Znaki to powolne dołączenie, tekstury, które wyskakują późno, i ostrzeżenia w konsoli. Zmniejsz i usuń to, czego nie potrzebujesz: oversized assets and texture loss pokazuje jak. Lżejszy serwer ładuje kolizje szybciej dla wszystkich.

Porada: po usunięciu zasobów wyczyść własną pamięć podręczną klienta i testuj ponownie, ponieważ stara pamięć podręczna może ukryć zysk. Patrz clear the FiveM cache.

Przyczyna 3: skrypt, który nie czeka

To jest najczęstsza przyczyna teleportacji, odrodzenia i wyboru spawnu. Naprawa to zamrożenie gracza, poproszenie o kolizję, czekanie aż się załaduje, i dopiero wtedy zwolnienie gracza.

lua
local function teleportSafe(coords)
    local ped = PlayerPedId()

    FreezeEntityPosition(ped, true)
    SetEntityCoordsNoOffset(ped, coords.x, coords.y, coords.z, false, false, false)

    RequestCollisionAtCoord(coords.x, coords.y, coords.z)

    local timeout = GetGameTimer() + 5000
    while not HasCollisionLoadedAroundEntity(ped) and GetGameTimer() < timeout do
        RequestCollisionAtCoord(coords.x, coords.y, coords.z)
        Wait(0)
    end

    FreezeEntityPosition(ped, false)
end

Co robi każda część:

  • FreezeEntityPosition trzyma gracza w bezruchu, więc grawitacja nie może działać podczas czekania.
  • RequestCollisionAtCoord mówi grze, aby zaczęła ładować kolizję w tych współrzędnych. Wezwij to każdą klatkę, podczas gdy czekasz.
  • HasCollisionLoadedAroundEntity zwraca true, gdy kolizja wokół peda jest tam.
  • Timeout zatrzymuje niekończącą się pętlę, jeśli obszar nigdy się nie załaduje, na przykład gdy mapa w ogóle nie ma kolizji.

Używaj tego samego wzoru, gdy gracz spawnie po wyborze postaci, i dla pojazdów: zamraź pojazd za FreezeEntityPosition(vehicle, true) i czekaj na HasCollisionLoadedAroundEntity(vehicle).

Przyczyna 4: zbyt wcześnie spawowanie przy połączeniu

Przy połączeniu, pierwsze spawnie może się zdarzyć, zanim obszar jest gotowy. Skrypty spawnu i multicharakter, które nie czekają, to zwykła przyczyna. Jeśli gracz jest niewidoczny i zamrożony przez pierwsze sekundy, a potem upada, sprawdź swój skrypt spawnu dla powyższego wzoru. Aby uzyskać połączenie, które wisi na ekranie ładowania, patrz players stuck on the loading screen.

Jeśli problem występuje tylko dla graczy z powolnymi połączeniami, pliki są wciąż pobierane, gdy gracz jest umieszczany. Trzymanie plików streamowanych małych jest największą pomocą, a ekran ładowania lub zanikania, który trzyma gracza, aż powyższe sprawdzenie będzie prawdziwe, unika większości widocznych upadków.

Lista kontrolna debugowania na jeden raz

  1. Czy to się dzieje dla wszystkich, czy tylko dla niektórych graczy? Wszyscy wskazują na pliki mapy, niektórzy gracze na pamięć podręczną lub prędkość.
  2. Czy to się dzieje tylko w jednym miejscu? Wtedy jest to zasób mapy bez kolizji tam.
  3. Zatrzymaj ten zasób mapy i spróbuj ponownie. Jeśli już nie upadasz, mapa brakuje kolizji. Jeśli podstawowa gra też cię powoduje upadek, problem to obciążenie, a nie mapa.
  4. Czy to się dzieje tylko zaraz po teleportacji? Skrypt potrzebuje pętli czekania powyżej.

Gdy dwie mapy się nakładają

Kolizja może również brakować, gdy jedna mapa usuwa obiekty gry podstawowej, a druga mapa nie umieszcza własnej kolizji na ich miejscu. Patrz map conflicts.

Lista kontrolna

Objaw Naprawa
Upadek wewnątrz jednej niestandardowej mapy Dodaj pliki .ybn do jego folderu stream
Upadek po teleportacji Zamraź, RequestCollisionAtCoord, czekaj na HasCollisionLoadedAroundEntity
Upadek przy połączeniu Spraw, aby skrypt spawnu czekał na kolizję, zanim odblokuje
Wszystko ładuje się powoli Zmniejsz rozmiar i liczbę zasobów streamowanych
Tylko niektórzy gracze upadają Wyczyść ich pamięć podręczną i sprawdzić ich połączenie
Niekończąca się pętla oczekiwania Dodaj timeout, aby pętla się zakończyła, nawet jeśli obszar nigdy się nie załaduje

Szybkie odpowiedzi

Dlaczego upadnę przez mapę, gdy się teletransportuję?

Gra nie załadowała jeszcze kolizji wokół nowej pozycji, więc nie ma podłoża, na którym stać. Poproś o kolizję w celu i czekaj, aż się załaduje, zanim odblokujesz gracza.

Który native czeka na załadowanie kolizji?

HasCollisionLoadedAroundEntity(entity) zwraca true, gdy kolizja wokół tej encji jest załadowana. Najpierw wezwij RequestCollisionAtCoord(x, y, z), aby gra zaczęła ją ładować.

Dlaczego to się dzieje tylko na niestandardowej mapie?

Mapa nie ma .ybn plików kolizji, lub są w złym folderze, lub brakuje ich w streamie. Widoczny model jest tam, ale nic stałego nie ma.

Skrypty bez tego problemu

Advanced BoostingBoosting pojazdów z tabletu: kontrakty od klasy D do S+, ekipy i kolejka na żywo.Zobacz skrypt →Quest CreatorWizualny edytor questów i dialogów z NPC, budowanych węzeł po węźle w grze.Zobacz skrypt →CCTV Security CamerasKamery do rozstawienia, tablet z podglądem wielu kamer na żywo i drukowane zdjęcia jako dowody.Zobacz skrypt →

Czytaj dalej