THE ORB
Uruchamiam studio

NetworkGetEntityFromNetworkId zwróciło 0

Grze gracza powiedziano o czymś, zanim to naprawdę dotarło na jego ekran.

groupsSporadyczne błędy wizualnecodePotrzebny programista

Zrób najpierw to

Sporadyczne są normalne. Ciągłe znaczą, że skrypt nie czeka jak trzeba.

bug_reportWklej zamiast tego całą konsolę

Co to znaczy

Identyfikator sieciowy zamieniono na lokalny uchwyt encji, a takiej encji na tym kliencie jeszcze nie ma. Natywna zwraca 0, zamiast zgłosić błąd, więc awaria wychodzi później jako bad argument albo index-nil.

To zwykle WYŚCIG, a nie błąd w identyfikatorze: serwer utworzył encję, a ten klient jeszcze jej nie dostał.

Co to powoduje

Uszeregowane według tego, jak często są odpowiedzią.

  1. 1

    Klient dostał informację przed zsynchronizowaniem encji

    Serwer tworzy pojazd i natychmiast wywołuje zdarzenie klienckie z identyfikatorem sieciowym. Zdarzenie dociera przed encją.

  2. 2

    Encja jest poza zasięgiem

    OneSync synchronizuje tylko encje blisko gracza. Identyfikator czegoś z drugiego końca mapy rozwiązuje się na tym kliencie na nic.

  3. 3

    Jest w innym routing buckecie

    To samo co poza zasięgiem, tylko celowo.

  4. 4

    Encję usunięto między wysłaniem a odbiorem

    Pojazd usunięty, kiedy wiadomość była w drodze.

  5. 5

    Identyfikator jest nieaktualny

    Identyfikatory sieciowe są używane ponownie. Taki trzymany sprzed kilku minut może teraz znaczyć coś innego albo nic.

Jak poznać, który jest twój

print(NetworkDoesNetworkIdExist(netId), NetworkDoesEntityExistWithNetworkId(netId))

Oba false przy graczu stojącym tuż obok to prawdziwy problem; oba false z drugiego końca mapy to po prostu zasięg.

Gdzie szukać

Miejsce odbioru identyfikatora sieciowego i to, czy cokolwiek czeka na encję.

Jak to naprawić

Zaczekaj na nią, z terminem — nigdy w nieograniczonej pętli:

local function entityFromNet(netId, timeoutMs)
    local deadline = GetGameTimer() + (timeoutMs or 5000)
    while not NetworkDoesEntityExistWithNetworkId(netId) do
        if GetGameTimer() > deadline then return nil end
        Wait(0)
    end
    return NetToEnt(netId)
end

Wciąż utknąłeś na własnym kodzie?

Ta strona mówi, co ten błąd zwykle oznacza. Wklej swoją konsolę do Server Fixera, a uszereguje wszystko, co w niej jest, i powie, co zrobić najpierw; a jeśli wolisz tego nie ruszać, ORBIE naprawi skrypt i odda ci zasób gotowy do wrzucenia.

bug_reportOtwórz Server Fixer

Dla tego rodzaju błędu Skaner bezpieczeństwa oznacza obsługę zdarzeń, która do tego prowadzi.

Błędy, które chodzą z tym w parze