THE ORB
Arrancando el studio

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.

groupsSe rompe tras un reiniciocodeNecesita un desarrollador

Haz esto primero

Que el jugador vuelva a entrar. Si así funciona, el script necesita un arreglo para los reinicios.

bug_reportMejor pega tu consola entera

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. 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. 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. 3

    No contemplar un reinicio del recurso con el jugador ya dentro

    esx:playerLoaded se disparó hace mucho; reiniciar tu recurso significa que nunca lo vio. Por eso un script funciona al entrar y se rompe con /restart.

  4. 4

    Leer una subtabla que se llena más tarde

    PlayerData.job puede llegar después que el propio PlayerData.

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 Fixer

Para este tipo de error, el Conversor de scripts traduce un recurso entre ESX, QBCore y Qbox.

Errores que viajan con este