THE ORB
Arrancando el studio

intento de indexar un valor nil

Un script esperaba que cierta información estuviera lista y no estaba, así que se detuvo.

groupsEsa función deja de andarcodeNecesita un desarrollador

Haz esto primero

Anota qué script y qué archivo nombra el mensaje, y comprueba si arrancó antes que tu framework.

bug_reportMejor pega tu consola entera

Qué significa

Algo usó el operador . o [] sobre una variable que es nil. En Lua, a.b sólo es legal cuando a es una tabla; cuando a es nil el script se detiene en esa línea. El mensaje suele nombrar qué era nil: (field 'PlayerData'), (global 'ESX'), (local 'data'), (upvalue 'Config').

Ese nombre entre paréntesis es la parte más útil del mensaje, y cada clase apunta a un sitio distinto:

global 'X' — nunca se asignó, o se asignó en un archivo que no se ejecutó.

field 'X' — la tabla existe pero no tiene esa clave.

local 'X' / upvalue 'X' — se asigna en este archivo, pero no antes de que corriera esta línea.

Qué lo provoca

Ordenado por la frecuencia con la que es la respuesta.

  1. 1

    El objeto del framework todavía no cargó (lo más común en el cliente)

    Un archivo de cliente lee ESX, QBCore o PlayerData a nivel de archivo o en un hilo temprano, antes de que el framework haya entregado el objeto del jugador. Tu recurso arranca antes de que el framework termine de cargar al jugador.

  2. 2

    Una clave de configuración que no existe

    Config.Something.value donde Config.Something nunca se definió, se renombró, o vive en un archivo que no está listado en el fxmanifest.

  3. 3

    El servidor mandó nil

    Un manejador de evento de cliente indexa una tabla que pasó el servidor, y por algún camino el servidor no pasó nada. TriggerClientEvent('x', src) sin carga le da nil al manejador.

  4. 4

    Un envoltorio que no devolvió nada

    Los nativos no devuelven tablas, pero un ayudante alrededor de uno sí puede devolver nil para una entidad inválida, y quien lo llama indexa eso.

  5. 5

    El orden de carga

    El archivo que define la tabla está listado DESPUÉS del archivo que la usa en el fxmanifest, así que en el momento de usarla todavía no existe.

Cómo saber cuál es el tuyo

Imprimí el contenedor, no el campo, justo encima de la línea que falla:

print(json.encode(Config.Something))

Si imprime null, el problema es el contenedor y el campo es una pista falsa. Si el nombre entre paréntesis es un global del framework, añadí una espera y mirá si el error se mueve: un problema de tiempos desaparece, una clave que falta no.

Dónde mirar

Abrí el archivo y la línea de la pila. Leé la sentencia entera, no sólo lo que está antes del punto: en a.b.c.d cualquiera de a, a.b o a.b.c puede ser el nil, y el nombre entre paréntesis te dice cuál.

Cómo arreglarlo

Para los tiempos del framework, no leas nunca el objeto a nivel de archivo:

local PlayerData = {}

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

-- cuando de verdad lo necesitás durante el arranque:
CreateThread(function()
    while not ESX or not ESX.IsPlayerLoaded() do Wait(100) end
    -- de acá para abajo es seguro
end)

Para todo lo demás, protegete antes de indexar:

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

¿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 Script Optimizer lee el script y repara el código que hay detrás.

Errores que viajan con este