attempt to index a nil value (global 'QBCore'): GetCoreObject исправление
QBCore — это nil в вашем скрипте? Старое событие QBCore:GetObject исчезло. Как получить основной объект с помощью GetCoreObject, на QBCore и на QBox и почему он все еще может быть nil.
Где-то в вашей консоли:
SCRIPT ERROR: @my_script/client/main.lua:8: attempt to index a nil value (global 'QBCore')QBCore работает, сценарий выглядит нормально, а QBCore по-прежнему nil. Вот почему и как это исправить в QBCore и в QBox.
Почему QBCore — это nil
Старые QBCore скрипты получали основной объект с помощью события:
QBCore = nil
TriggerEvent('QBCore:GetObject', function(obj) QBCore = obj end)Это событие было удалено из qb-core. Никто больше на него не отвечает, поэтому QBCore остается nil, а первая строка QBCore.Functions… вылетает.
Исправление: GetCoreObject
Запросите у qb-core его объект при экспорте в верхней части файла:
local QBCore = exports['qb-core']:GetCoreObject()Это одна и та же строка на клиенте и на сервере. Поместите его в каждый файл, использующий QBCore, или один раз в общий файл, который манифест загружает первым:
-- fxmanifest.lua
shared_script 'shared/core.lua'
client_scripts { 'client/*.lua' }
server_scripts { 'server/*.lua' }-- shared/core.lua
QBCore = exports['qb-core']:GetCoreObject()Совет: если
QBCoreнаходится вlocalв одном файле, другие файлы не смогут его увидеть. Ошибка nil только в одном файле скрипта обычно означает именно это.
Все еще nil? qb-core еще не запущен
Экспорт отвечает только в том случае, если qb-core запускается первым. В server.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 первым или отказывался запускать скрипт без нее:
dependency 'qb-core'Включено QBox
QBox — это qbx_core, и оно поддерживает уровень совместимости для сценариев qb-core: exports['qb-core']:GetCoreObject() по-прежнему возвращает объект, поэтому большинство сценариев QBCore выполняются без изменений.
Что меняется, так это порядок и имя в server.cfg:
ensure oxmysql
ensure ox_lib
ensure qbx_coreНа устройстве QBox нет отдельной папки qb-core. Если оно у вас еще есть, удалите его, иначе два ядра начнут ссориться.
Для нового кода QBox предпочитает собственный экспорт большой таблице QBCore, например на сервере:
local player = exports.qbx_core:GetPlayer(source)
if player then
print(player.PlayerData.citizenid)
endДанные игрока в клиенте
Слишком раннее чтение информации об игроке — еще одна классика nil:
-- this runs before the player is loaded: job is nil
local job = QBCore.Functions.GetPlayerData().jobВместо этого дождитесь игрока:
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 — узел за узлом прямо в игре.Смотреть скрипт →