THE ORB
Uruchamiam studio

PlayerData jest nil albo puste na kliencie

Skrypt poprosił o dane gracza, zanim gra je wysłała. Zwykle działa przy wejściu, a psuje się po restarcie skryptu.

groupsPsuje się po restarciecodePotrzebny programista

Zrób najpierw to

Niech gracz wejdzie ponownie. Jeśli wtedy działa, skrypt wymaga poprawki pod restarty.

bug_reportWklej zamiast tego całą konsolę

Co to znaczy

Kod kliencki odczytał dane gracza, zanim framework je wysłał. Obiekt istnieje, ale jego pola są puste, albo całość jest nil, więc PlayerData.job.name pada.

To błąd czasu, nie błąd danych. Ten sam kod działa po kilku sekundach, i właśnie to jest w nim mylące: pada przy restarcie serwera i przy restarcie zasobu, a działa, kiedy sprawdzasz go ręcznie później.

Co to powoduje

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

  1. 1

    Odczyt w zasięgu pliku

    Zasób startuje, zanim gracz się wczyta. Przy restarcie serwera wszystkie zasoby startują naraz, bez żadnego gracza w sesji.

  2. 2

    Brak nasłuchu na zdarzenie wczytania

    Framework ogłasza, kiedy dane są gotowe. Kod, który nigdy się nie subskrybuje, musi zgadywać.

  3. 3

    Nieobsłużony restart zasobu przy graczu już obecnym

    esx:playerLoaded odpaliło się dawno temu; restart twojego zasobu znaczy, że nigdy tego nie zobaczy. Dlatego skrypt działa przy wejściu, a psuje się przy /restart.

  4. 4

    Odczyt podtablicy, która wypełnia się później

    PlayerData.job potrafi przyjść po samym PlayerData.

Jak poznać, który jest twój

Działa, kiedy wchodzisz ponownie, a psuje się, kiedy restartujesz zasób? Wtedy to przyczyna 3, i to ta najczęściej przeoczana.

Gdzie szukać

Miejsce, w którym plik pierwszy raz dotyka PlayerData, i to, czy w ogóle jest handler zdarzenia wczytania.

Jak to naprawić

Zasubskrybuj, i obsłuż też przypadek, w którym gracz już jest wczytany:

local PlayerData = {}

RegisterNetEvent('esx:playerLoaded', function(xPlayer)
    PlayerData = xPlayer
end)
RegisterNetEvent('esx:setJob', function(job)
    PlayerData.job = job
end)

-- pokrywa restart zasobu przy graczu już obecnym w sesji
AddEventHandler('onClientResourceStart', function(res)
    if res ~= GetCurrentResourceName() then return end
    if ESX and ESX.IsPlayerLoaded() then
        PlayerData = ESX.GetPlayerData()
    end
end)

W QBCore jest to ten sam kształt, z QBCore:Client:OnPlayerLoaded i QBCore.Functions.GetPlayerData().

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 Konwerter skryptów przenosi zasób między ESX, QBCore i Qbox.

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