THE ORB
Iniciando o studio

PlayerData é nil ou está vazio no cliente

Um script pediu as informações de um jogador antes de o jogo mandar. Costuma funcionar ao entrar e quebrar depois de reiniciar o script.

groupsQuebra depois de um restartcodePrecisa de um desenvolvedor

Faça isto primeiro

Peça para o jogador entrar de novo. Se funcionar assim, o script precisa de um conserto para restarts.

bug_reportMelhor colar o console inteiro

O que significa

O código do cliente leu os dados do jogador antes de o framework enviar. O objeto existe mas os campos estão vazios, ou ele é nil direto, e aí o PlayerData.job.name falha.

Isso é um bug de tempo, não de dados. O mesmo código funciona uns segundos depois, e é justo isso que confunde: falha no restart do servidor e no restart do resource, e funciona quando você testa na mão mais tarde.

O que causa isso

Ordenado pela frequência com que é a resposta.

  1. 1

    Ler em nível de arquivo

    O resource sobe antes de o jogador estar carregado. Num restart do servidor todos os resources sobem de uma vez, sem nenhum jogador na sessão.

  2. 2

    Não escutar o evento de carga

    O framework avisa quando os dados estão prontos. O código que não se inscreve tem que adivinhar.

  3. 3

    Não contemplar um restart do resource com o jogador já dentro

    O esx:playerLoaded disparou faz tempo; reiniciar o seu resource significa que ele nunca viu. Por isso um script funciona na entrada e quebra com /restart.

  4. 4

    Ler uma subtabela que é preenchida depois

    PlayerData.job pode chegar depois do próprio PlayerData.

Como saber qual é o seu

Funciona quando você entra de novo mas quebra quando reinicia o resource? Então é a causa 3, que é a que mais passa despercebida.

Onde olhar

Onde o arquivo toca o PlayerData pela primeira vez, e se existe sequer um handler do evento de carga.

Como consertar

Se inscreva, e contemple também o caso de ele já estar carregado:

local PlayerData = {}

RegisterNetEvent('esx:playerLoaded', function(xPlayer)
    PlayerData = xPlayer
end)
RegisterNetEvent('esx:setJob', function(job)
    PlayerData.job = job
end)

-- cobre um restart do resource com o jogador já na sessão
AddEventHandler('onClientResourceStart', function(res)
    if res ~= GetCurrentResourceName() then return end
    if ESX and ESX.IsPlayerLoaded() then
        PlayerData = ESX.GetPlayerData()
    end
end)

O QBCore tem a mesma forma com QBCore:Client:OnPlayerLoaded e QBCore.Functions.GetPlayerData().

Ainda travado no seu próprio código?

Esta página é o que esse erro costuma significar. Cole o seu console no Server Fixer e ele vai ordenar tudo o que estiver lá e te dizer o que fazer primeiro; e se você preferir não mexer, o ORBIE consegue consertar o script e te devolver o resource pronto para soltar.

bug_reportAbrir o Server Fixer

Para esse tipo de erro, o Conversor de scripts traduz um resource entre ESX, QBCore e Qbox.

Erros que andam junto com este