attempt to index a nil value (global 'QBCore'): la solución con GetCoreObject

¿QBCore es nil en tu script? El antiguo evento QBCore:GetObject ya no existe. Cómo obtener el core object con GetCoreObject, en QBCore y en QBox, y por qué puede seguir siendo nil.

En algún punto de tu consola:

text
SCRIPT ERROR: @my_script/client/main.lua:8: attempt to index a nil value (global 'QBCore')

QBCore está funcionando, el script parece correcto y QBCore sigue siendo nil. Aquí tienes el porqué y cómo arreglarlo en QBCore y en QBox.

Por qué QBCore es nil

Los scripts de QBCore antiguos obtenían el core object con un evento:

lua
QBCore = nil
TriggerEvent('QBCore:GetObject', function(obj) QBCore = obj end)

Ese evento se eliminó de qb-core. Ya nadie le responde, así que QBCore se queda en nil y la primera línea QBCore.Functions… peta.

La solución: GetCoreObject

Pídele el objeto a qb-core con el export, al principio del archivo:

lua
local QBCore = exports['qb-core']:GetCoreObject()

Es la misma línea en el cliente y en el servidor. Ponla en todos los archivos que usen QBCore, o una sola vez en un archivo shared que el manifest cargue primero:

lua
-- fxmanifest.lua
shared_script 'shared/core.lua'
client_scripts { 'client/*.lua' }
server_scripts { 'server/*.lua' }
lua
-- shared/core.lua
QBCore = exports['qb-core']:GetCoreObject()

Consejo: si QBCore es local en un archivo, los demás archivos no pueden verlo. Un error de nil en un solo archivo del script suele significar justo eso.

¿Sigue siendo nil? qb-core todavía no está funcionando

El export solo responde si qb-core arrancó antes. En server.cfg:

cfg
ensure oxmysql
ensure ox_lib
ensure qb-core
ensure [qb]

ensure my_script

Después:

  • Revisa el arranque del propio qb-core al principio de la consola del servidor. Un error de base de datos ahí significa que sus exports nunca llegan a existir, y te sale No such export GetCoreObject in resource qb-core.
  • Añade la dependencia al fxmanifest.lua del script, para que FiveM arranque primero qb-core o se niegue a arrancar el script sin él:
lua
dependency 'qb-core'

En QBox

El core de QBox es qbx_core, y mantiene una capa de compatibilidad para los scripts de qb-core: exports['qb-core']:GetCoreObject() sigue devolviendo un objeto, así que la mayoría de scripts de QBCore funcionan tal cual.

Lo que cambia es el orden y el nombre en server.cfg:

cfg
ensure oxmysql
ensure ox_lib
ensure qbx_core

En QBox no hay una carpeta qb-core aparte. Si todavía tienes una, quítala, o los dos cores se pelearán entre sí.

Para código nuevo, QBox prefiere sus propios exports antes que la gran tabla QBCore, por ejemplo en el servidor:

lua
local player = exports.qbx_core:GetPlayer(source)
if player then
    print(player.PlayerData.citizenid)
end

Datos del jugador en el cliente

Leer al jugador demasiado pronto es el otro nil clásico:

lua
-- this runs before the player is loaded: job is nil
local job = QBCore.Functions.GetPlayerData().job

En lugar de eso, espera al jugador:

lua
local QBCore = exports['qb-core']:GetCoreObject()
local PlayerData = {}

RegisterNetEvent('QBCore:Client:OnPlayerLoaded', function()
    PlayerData = QBCore.Functions.GetPlayerData()
end)

RegisterNetEvent('QBCore:Client:OnJobUpdate', function(job)
    PlayerData.job = job
end)

Si el script también se puede reiniciar mientras estás dentro del juego, lee los datos una vez al arrancar, porque para entonces OnPlayerLoaded ya se ha disparado.

Checklist

Síntoma Solución
attempt to index a nil value (global 'QBCore') local QBCore = exports['qb-core']:GetCoreObject() al principio del archivo
Nil solo en un archivo QBCore es local en otro archivo; defínelo también ahí, o en un archivo shared
No such export GetCoreObject qb-core (o qbx_core) no ha arrancado, o ha fallado al arrancar
Servidor QBox Mantén el export, arranca qbx_core y quita cualquier carpeta qb-core antigua
job es nil al arrancar Espera a QBCore:Client:OnPlayerLoaded

¿Usas ESX? El mismo problema allí está explicado en ESX es nil: cómo arreglar esx:getSharedObject.

Respuestas rápidas

¿Por qué QBCore es nil en mi script?

El script nunca obtuvo el core object: usa el evento QBCore:GetObject, que ya se eliminó, define QBCore en otro archivo o arranca antes que qb-core. Usa local QBCore = exports['qb-core']:GetCoreObject() al principio de cada archivo.

¿GetCoreObject funciona en QBox?

Sí. qbx_core mantiene una capa de compatibilidad con qb-core, así que exports['qb-core']:GetCoreObject() sigue respondiendo. Para código nuevo, QBox prefiere sus propios exports, como exports.qbx_core:GetPlayer(source).

¿Tengo que llamar a GetCoreObject en cada archivo?

Cada archivo que usa QBCore lo necesita, a no ser que el script lo defina una sola vez en un archivo shared que se cargue antes que los demás.

Scripts que evitan este problema

Advanced BoostingBoosting de vehículos desde una tablet: contratos de clase D a S+, crews y cola en vivo.Ver script →Clothing DesignerDiseña ropa dentro de FiveM — pincel, capas, imágenes e IA — y póntela.Ver script →Quest CreatorUn editor visual de misiones y diálogos con NPC, nodo a nodo dentro del juego.Ver script →

Sigue leyendo