PlayerData es nil o está vacío en el cliente
Un script pidió la información de un jugador antes de que el juego la mandara. Suele funcionar al entrar y romperse tras reiniciar el script.
Haz esto primero
Que el jugador vuelva a entrar. Si así funciona, el script necesita un arreglo para los reinicios.
Qué significa
El código del cliente leyó los datos del jugador antes de que el framework se los mandara. El objeto existe pero sus campos están vacíos, o directamente es nil, y entonces PlayerData.job.name falla.
Esto es un fallo de tiempos, no de datos. El mismo código funciona unos segundos después, y eso es justo lo que lo vuelve confuso: falla al reiniciar el servidor y al reiniciar el recurso, y funciona cuando lo probás a mano más tarde.
Qué lo provoca
Ordenado por la frecuencia con la que es la respuesta.
- 1
Leerlo a nivel de archivo
El recurso arranca antes de que el jugador esté cargado. En un reinicio del servidor arrancan todos los recursos a la vez, sin ningún jugador en la sesión.
- 2
No escuchar el evento de carga
El framework avisa cuando los datos están listos. El código que no se suscribe tiene que adivinar.
- 3
No contemplar un reinicio del recurso con el jugador ya dentro
esx:playerLoadedse disparó hace mucho; reiniciar tu recurso significa que nunca lo vio. Por eso un script funciona al entrar y se rompe con/restart. - 4
Leer una subtabla que se llena más tarde
PlayerData.jobpuede llegar después que el propioPlayerData.
Cómo saber cuál es el tuyo
¿Funciona cuando volvés a entrar pero se rompe cuando reiniciás el recurso? Entonces es la causa 3, que es la que más se pasa por alto.
Dónde mirar
Donde el archivo toca PlayerData por primera vez, y si hay siquiera un manejador del evento de carga.
Cómo arreglarlo
Suscribite, y contemplá también el caso de que ya estuviera cargado:
local PlayerData = {}
RegisterNetEvent('esx:playerLoaded', function(xPlayer)
PlayerData = xPlayer
end)
RegisterNetEvent('esx:setJob', function(job)
PlayerData.job = job
end)
-- cubre un reinicio del recurso con el jugador ya en la sesión
AddEventHandler('onClientResourceStart', function(res)
if res ~= GetCurrentResourceName() then return end
if ESX and ESX.IsPlayerLoaded() then
PlayerData = ESX.GetPlayerData()
end
end)QBCore tiene la misma forma con QBCore:Client:OnPlayerLoaded y QBCore.Functions.GetPlayerData().
¿Sigues atascado en tu propio código?
Esta página es lo que suele significar este error. Pega tu consola en Server Fixer y ordenará todo lo que haya en ella y te dirá qué hacer primero; y si prefieres no tocarlo, ORBIE puede reparar el script y devolverte el recurso listo para soltar.
bug_reportAbrir el Server FixerPara este tipo de error, el Conversor de scripts traduce un recurso entre ESX, QBCore y Qbox.