THE ORB
Uruchamiam studio

Reliable network event overflow

Skrypt wysłał do jednego gracza tyle, że jego połączenie nie nadążyło, więc został wyrzucony.

groupsGracze losowo wyrzucanicodePotrzebny programista

Zrób najpierw to

Zanotuj, którym graczom i kiedy się to zdarza. Tu trzeba, żeby ktoś znalazł hałaśliwy skrypt.

bug_reportWklej zamiast tego całą konsolę

Co to znaczy

Do klienta zakolejkowano więcej zdarzeń, niż potrafi pomieścić kanał niezawodny. FiveM zrywa połączenie, zamiast zostawać jeszcze dalej w tyle, więc gracze wylatują bez oczywistego powodu.

Kanał jest per klient, więc gracz, który wylatuje, niekoniecznie jest tym, który robi coś nietypowego.

Co to powoduje

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

  1. 1

    Zdarzenie wywoływane w pętli ticka

    TriggerClientEvent wewnątrz wątku z krótkim Waitem, per gracz, to podręcznikowa przyczyna.

  2. 2

    Rozgłos w pętli

    TriggerClientEvent('x', -1, ...) wewnątrz czegokolwiek, co się powtarza, mnoży się przez liczbę graczy.

  3. 3

    Bardzo duże dane

    Cały ekwipunek albo mapa wszystkich graczy, wysyłane często. Rozmiar zapycha kanał równie pewnie jak liczba.

  4. 4

    Pętla zwrotna między klientem a serwerem

    Klient wywołuje zdarzenie serwerowe, serwer odpowiada zdarzeniem klienckim, klient odpowiada znowu.

  5. 5

    Cheater spamujący zdarzeniem

    Co jest też problemem bezpieczeństwa — zobacz skaner podatności.

Jak poznać, który jest twój

Policz je. Licznik per zdarzenie po stronie serwera przez minutę od razu wskazuje winowajcę:

local counts = {}
local realTrigger = TriggerClientEvent
-- opakuj, licz, wypisuj co 60 s

Gdzie szukać

Każde TriggerClientEvent wewnątrz CreateThread i każdy rozgłos na -1.

Jak to naprawić

Wysyłaj stan, a nie strumień zdarzeń. State bagi replikują się raz i tylko wtedy, gdy się zmienią:

-- zamiast TriggerClientEvent co tick
Entity(veh).state:set('fuel', level, true)

Kiedy musisz wysyłać zdarzenia, dławij i grupuj:

if GetGameTimer() - lastSend > 1000 then
    lastSend = GetGameTimer()
    TriggerClientEvent('myres:update', src, batchedPayload)
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