attempt to index a nil value (global 'QBCore'): GetCoreObject исправление

QBCore — это nil в вашем скрипте? Старое событие QBCore:GetObject исчезло. Как получить основной объект с помощью GetCoreObject, на QBCore и на QBox и почему он все еще может быть nil.

Где-то в вашей консоли:

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

QBCore работает, сценарий выглядит нормально, а QBCore по-прежнему nil. Вот почему и как это исправить в QBCore и в QBox.

Почему QBCore — это nil

Старые QBCore скрипты получали основной объект с помощью события:

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

Это событие было удалено из qb-core. Никто больше на него не отвечает, поэтому QBCore остается nil, а первая строка QBCore.Functions… вылетает.

Исправление: GetCoreObject

Запросите у qb-core его объект при экспорте в верхней части файла:

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

Это одна и та же строка на клиенте и на сервере. Поместите его в каждый файл, использующий QBCore, или один раз в общий файл, который манифест загружает первым:

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()

Совет: если QBCore находится в local в одном файле, другие файлы не смогут его увидеть. Ошибка nil только в одном файле скрипта обычно означает именно это.

Все еще nil? qb-core еще не запущен

Экспорт отвечает только в том случае, если qb-core запускается первым. В server.cfg:

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

ensure my_script

Тогда:

  • Проверьте запуск qb-core в верхней части консоли сервера. Ошибка базы данных означает, что экспортированные данные никогда не существуют, и вы получаете No such export GetCoreObject in resource qb-core.
  • Добавьте зависимость к fxmanifest.lua скрипта, чтобы FiveM запускал qb-core первым или отказывался запускать скрипт без нее:
lua
dependency 'qb-core'

Включено QBox

QBox — это qbx_core, и оно поддерживает уровень совместимости для сценариев qb-core: exports['qb-core']:GetCoreObject() по-прежнему возвращает объект, поэтому большинство сценариев QBCore выполняются без изменений.

Что меняется, так это порядок и имя в server.cfg:

cfg
ensure oxmysql
ensure ox_lib
ensure qbx_core

На устройстве QBox нет отдельной папки qb-core. Если оно у вас еще есть, удалите его, иначе два ядра начнут ссориться.

Для нового кода QBox предпочитает собственный экспорт большой таблице QBCore, например на сервере:

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

Данные игрока в клиенте

Слишком раннее чтение информации об игроке — еще одна классика nil:

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

Вместо этого дождитесь игрока:

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)

Если сценарий также можно перезапустить во время игры, прочитайте данные один раз при его запуске, так как OnPlayerLoaded к тому времени уже сработает.

Контрольный список

Симптом Исправить
attempt to index a nil value (global 'QBCore') local QBCore = exports['qb-core']:GetCoreObject() вверху файла
Nil только в одном файле QBCore является локальным для другого файла; определите его там же или в общем файле
No such export GetCoreObject qb-core (или qbx_core) не запущен или не удалось запустить
QBox сервер Сохраните экспорт, запустите qbx_core, удалите старую папку qb-core
job — nil при запуске Подождите QBCore:Client:OnPlayerLoaded

Вместо этого запускаете ESX? Та же проблема, что и ESX, это nil: исправление esx:getSharedObject.

Короткие ответы

Почему QBCore nil в моем скрипте?

Сценарий никогда не получал основной объект: он использует удаленное событие QBCore:GetObject, определяет QBCore в другом файле или запускается до qb-core. Используйте local QBCore = exports['qb-core']:GetCoreObject() вверху каждого файла.

Работает ли GetCoreObject на QBox?

Да. qbx_core сохраняет уровень совместимости для qb-core, поэтому exports['qb-core']:GetCoreObject() по-прежнему отвечает. Для нового кода QBox предпочитает собственный экспорт, например exports.qbx_core:GetPlayer(source).

Нужно ли мне вызывать GetCoreObject в каждом файле?

Каждый файл, использующий QBCore, нуждается в этом, если только сценарий не определяет его один раз в общем файле, который загружается раньше других.

Скрипты без этой проблемы

Advanced BoostingУгон машин на заказ через планшет: контракты от класса D до S+, команды и живая очередь.Смотреть скрипт →Clothing DesignerСоздавайте одежду прямо в FiveM — кисть, слои, импорт изображений и ИИ — и носите её.Смотреть скрипт →Quest CreatorВизуальный редактор квестов и диалогов с NPC — узел за узлом прямо в игре.Смотреть скрипт →

Читайте также