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.
Faça isto primeiro
Peça para o jogador entrar de novo. Se funcionar assim, o script precisa de um conserto para restarts.
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
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
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
Não contemplar um restart do resource com o jogador já dentro
O
esx:playerLoadeddisparou faz tempo; reiniciar o seu resource significa que ele nunca viu. Por isso um script funciona na entrada e quebra com/restart. - 4
Ler uma subtabela que é preenchida depois
PlayerData.jobpode chegar depois do próprioPlayerData.
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 FixerPara esse tipo de erro, o Conversor de scripts traduz um resource entre ESX, QBCore e Qbox.