PlayerData est nil ou vide sur le client
Un script a demandé les infos d'un joueur avant que le jeu ne les envoie. Cela marche en général à la connexion et casse après un redémarrage du script.
Faites d'abord ceci
Faites reconnecter le joueur. Si cela marche alors, le script a besoin d'un correctif pour les redémarrages.
Ce que ça veut dire
Le code client a lu les données du joueur avant que le framework ne les envoie. L'objet existe mais ses champs sont vides, ou il est carrément nil, et PlayerData.job.name échoue.
C'est un bug de timing, pas de données. Le même code fonctionne quelques secondes plus tard, et c'est exactement ce qui trouble : il échoue au redémarrage du serveur et au redémarrage de la ressource, et fonctionne quand vous le testez à la main plus tard.
Ce qui la provoque
Classé par fréquence : la cause la plus probable en premier.
- 1
Le lire au niveau du fichier
La ressource démarre avant que le joueur ne soit chargé. Au redémarrage du serveur, toutes les ressources démarrent en même temps, sans aucun joueur en session.
- 2
Ne pas écouter l'événement de chargement
Le framework annonce quand les données sont prêtes. Le code qui ne s'abonne pas doit deviner.
- 3
Ne pas gérer un redémarrage de ressource avec le joueur déjà en jeu
esx:playerLoadeds'est déclenché il y a longtemps ; redémarrer votre ressource signifie qu'elle ne l'a jamais vu. C'est pourquoi un script marche à la connexion et casse au/restart. - 4
Lire une sous-table remplie plus tard
PlayerData.jobpeut arriver aprèsPlayerDatalui-même.
Comment savoir laquelle est la vôtre
Cela marche quand vous vous reconnectez mais casse quand vous redémarrez la ressource ? Alors c'est la cause 3, celle qu'on rate le plus souvent.
Où regarder
Là où le fichier touche PlayerData pour la première fois, et s'il existe seulement un gestionnaire de l'événement de chargement.
Comment la corriger
Abonnez-vous, et couvrez aussi le cas où c'est déjà chargé :
local PlayerData = {}
RegisterNetEvent('esx:playerLoaded', function(xPlayer)
PlayerData = xPlayer
end)
RegisterNetEvent('esx:setJob', function(job)
PlayerData.job = job
end)
-- couvre un redémarrage de ressource avec le joueur déjà en session
AddEventHandler('onClientResourceStart', function(res)
if res ~= GetCurrentResourceName() then return end
if ESX and ESX.IsPlayerLoaded() then
PlayerData = ESX.GetPlayerData()
end
end)QBCore a la même forme avec QBCore:Client:OnPlayerLoaded et QBCore.Functions.GetPlayerData().
Toujours bloqué sur votre propre code ?
Cette page explique ce que cette erreur signifie en général. Collez votre console dans Server Fixer : il classera tout ce qui s'y trouve et vous dira quoi faire en premier ; et si vous préférez ne pas y toucher, ORBIE peut réparer le script et vous rendre la ressource prête à déposer.
bug_reportOuvrir le Server FixerPour ce type d'erreur, le Convertisseur de scripts traduit une ressource entre ESX, QBCore et Qbox.