THE ORB
Iniciando o studio

tentativa de indexar um valor nil

Um script esperava que certa informação estivesse pronta e não estava, então parou.

groupsAquela função para de funcionarcodePrecisa de um desenvolvedor

Faça isto primeiro

Anote qual script e qual arquivo a mensagem nomeia, e veja se ele subiu antes do seu framework.

bug_reportMelhor colar o console inteiro

O que significa

Alguma coisa usou o operador . ou [] sobre uma variável que é nil. Em Lua, a.b só é legal quando a é uma tabela; quando a é nil o script para naquela linha. A mensagem costuma nomear o que era nil: (field 'PlayerData'), (global 'ESX'), (local 'data'), (upvalue 'Config').

Esse nome entre parênteses é a parte mais útil da mensagem, e cada tipo aponta para um lugar diferente:

global 'X' — nunca foi atribuído, ou foi atribuído num arquivo que não rodou.

field 'X' — a tabela existe mas não tem essa chave.

local 'X' / upvalue 'X' — é atribuído neste arquivo, mas não antes desta linha rodar.

O que causa isso

Ordenado pela frequência com que é a resposta.

  1. 1

    O objeto do framework ainda não carregou (o mais comum no cliente)

    Um arquivo de cliente lê ESX, QBCore ou PlayerData em nível de arquivo ou numa thread inicial, antes de o framework entregar o objeto do jogador. O seu resource sobe antes de o framework terminar de carregar o jogador.

  2. 2

    Uma chave de configuração que não existe

    Config.Something.value onde Config.Something nunca foi definido, foi renomeado, ou vive num arquivo que não está listado no fxmanifest.

  3. 3

    O servidor mandou nil

    Um handler de evento de cliente indexa uma tabela que o servidor passou, e por algum caminho o servidor não passou nada. TriggerClientEvent('x', src) sem carga dá nil para o handler.

  4. 4

    Um wrapper que não devolveu nada

    Os nativos não devolvem tabelas, mas um auxiliar em volta de um pode devolver nil para uma entidade inválida, e quem chama indexa isso.

  5. 5

    A ordem de carga

    O arquivo que define a tabela está listado DEPOIS do arquivo que a usa no fxmanifest, então no momento do uso ela ainda não existe.

Como saber qual é o seu

Imprima o contêiner, não o campo, logo acima da linha que falha:

print(json.encode(Config.Something))

Se imprimir null, o problema é o contêiner e o campo é pista falsa. Se o nome entre parênteses é um global do framework, adicione uma espera e veja se o erro se move: um problema de tempo some, uma chave que falta não.

Onde olhar

Abra o arquivo e a linha da pilha. Leia a instrução inteira, não só o que está antes do ponto: em a.b.c.d qualquer um entre a, a.b ou a.b.c pode ser o nil, e o nome entre parênteses diz qual.

Como consertar

Para o tempo do framework, nunca leia o objeto em nível de arquivo:

local PlayerData = {}

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

-- quando você realmente precisa dele durante a inicialização:
CreateThread(function()
    while not ESX or not ESX.IsPlayerLoaded() do Wait(100) end
    -- daqui para baixo é seguro
end)

Para todo o resto, proteja antes de indexar:

local entry = Config.Jobs[job]
if not entry then return end

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 Script Optimizer lê o script e conserta o código por trás disso.

Erros que andam junto com este