PlayerData ist auf dem Client nil oder leer
Ein Script hat die Daten eines Spielers angefragt, bevor das Spiel sie geschickt hat. Klappt meist beim Joinen und bricht nach einem Script-Neustart.
Mach das zuerst
Lass den Spieler neu joinen. Wenn es dann geht, braucht das Script einen Fix für Neustarts.
Was es bedeutet
Der Client-Code hat die Spielerdaten gelesen, bevor das Framework sie geschickt hat. Das Objekt existiert, aber seine Felder sind leer, oder das Ganze ist nil — und PlayerData.job.name scheitert.
Das ist ein Timing-Fehler, kein Datenfehler. Derselbe Code funktioniert ein paar Sekunden später, und genau das macht ihn verwirrend: Er scheitert beim Serverneustart und beim Resource-Neustart und geht, wenn du es später von Hand probierst.
Was es auslöst
Sortiert danach, wie oft es die Antwort ist.
- 1
Es auf Dateiebene lesen
Die Resource startet, bevor der Spieler geladen ist. Bei einem Serverneustart starten alle Resources gleichzeitig, ganz ohne Spieler in der Sitzung.
- 2
Nicht auf das Lade-Event hören
Das Framework meldet, wenn die Daten bereit sind. Code, der sich nicht abonniert, muss raten.
- 3
Einen Resource-Neustart mit schon anwesendem Spieler nicht abdecken
esx:playerLoadedfeuerte vor langer Zeit; ein Neustart deiner Resource heißt, sie hat es nie gesehen. Deshalb geht ein Script beim Beitritt und bricht bei/restart. - 4
Eine Untertabelle lesen, die später gefüllt wird
PlayerData.jobkann nachPlayerDataselbst eintreffen.
Wie du erkennst, welcher deiner ist
Geht es, wenn du neu beitrittst, bricht aber beim Neustart der Resource? Dann ist es Ursache 3 — die am häufigsten übersehene.
Wo du nachsehen musst
Wo die Datei PlayerData zum ersten Mal anfasst, und ob es überhaupt einen Handler für das Lade-Event gibt.
Wie du es behebst
Abonnier dich, und deck auch den Fall ab, dass schon geladen wurde:
local PlayerData = {}
RegisterNetEvent('esx:playerLoaded', function(xPlayer)
PlayerData = xPlayer
end)
RegisterNetEvent('esx:setJob', function(job)
PlayerData.job = job
end)
-- deckt einen Resource-Neustart ab, wenn der Spieler schon in der Sitzung ist
AddEventHandler('onClientResourceStart', function(res)
if res ~= GetCurrentResourceName() then return end
if ESX and ESX.IsPlayerLoaded() then
PlayerData = ESX.GetPlayerData()
end
end)QBCore hat dieselbe Form mit QBCore:Client:OnPlayerLoaded und QBCore.Functions.GetPlayerData().
Hängst du immer noch an deinem eigenen Code?
Diese Seite sagt, was dieser Fehler üblicherweise bedeutet. Füg deine Konsole in Server Fixer ein: es sortiert alles darin und sagt dir, was zuerst dran ist; und wenn du lieber nicht ranwillst, kann ORBIE das Script reparieren und dir die Resource fertig zum Einsetzen zurückgeben.
bug_reportServer Fixer öffnenFür diese Art Fehler Skript-Konverter übersetzt eine Resource zwischen ESX, QBCore und Qbox.