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.
Zrób najpierw to
Niech gracz wejdzie ponownie. Jeśli wtedy działa, skrypt wymaga poprawki pod restarty.
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
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
Brak nasłuchu na zdarzenie wczytania
Framework ogłasza, kiedy dane są gotowe. Kod, który nigdy się nie subskrybuje, musi zgadywać.
- 3
Nieobsłużony restart zasobu przy graczu już obecnym
esx:playerLoadedodpalił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
Odczyt podtablicy, która wypełnia się później
PlayerData.jobpotrafi przyjść po samymPlayerData.
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 FixerDla tego rodzaju błędu Konwerter skryptów przenosi zasób między ESX, QBCore i Qbox.