attempt to index a nil value (global 'QBCore'): poprawka GetCoreObject

QBCore to nil w Twoim skrypcie? Stare zdarzenie QBCore:GetObject zniknęło. Jak uzyskać główny obiekt za pomocą GetCoreObject, na QBCore i na QBox i dlaczego nadal może to być nil.

Gdzieś w konsoli:

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

QBCore działa, skrypt wygląda dobrze, a QBCore nadal wynosi nil. Oto dlaczego i jak to naprawić w QBCore i QBox.

Dlaczego QBCore to nil

Starsze QBCore skrypty zawierały obiekt podstawowy ze zdarzeniem:

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

To wydarzenie zostało usunięte z qb-core. Nikt już nie odpowiada, więc QBCore pozostaje nil i pierwsza QBCore.Functions… linia ulega awarii.

Poprawka: GetCoreObject

Zapytaj qb-core o obiekt eksportu na górze pliku:

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

To ta sama linia na kliencie i na serwerze. Umieść go w każdym pliku, który używa QBCore lub raz w udostępnionym pliku, który manifest ładuje jako pierwszy:

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

Wskazówka: jeśli QBCore wynosi local w jednym pliku, inne pliki go nie widzą. Błąd nil tylko w jednym pliku skryptu zwykle oznacza dokładnie to.

Nadal nil? qb-core jeszcze nie działa

Eksport odpowiada tylko wtedy, gdy qb-core rozpoczął się jako pierwszy. W server.cfg:

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

ensure my_script

Następnie:

  • Sprawdź początek qb-core u góry konsoli serwera. Błąd bazy danych oznacza, że eksport nigdy nie istnieje i otrzymujesz No such export GetCoreObject in resource qb-core.
  • Dodaj zależność do fxmanifest.lua skryptu, tak aby FiveM uruchamiał qb-core jako pierwszy lub odmawiał uruchomienia skryptu bez niego:
lua
dependency 'qb-core'

Wł. QBox

QBox rdzeń to qbx_core i utrzymuje warstwę zgodności dla qb-core skryptów: exports['qb-core']:GetCoreObject() nadal zwraca obiekt, więc większość QBCore skryptów działa tak, jak jest.

Zmienia się kolejność i nazwa w server.cfg:

cfg
ensure oxmysql
ensure ox_lib
ensure qbx_core

Nie ma oddzielnego folderu qb-core na QBox. Jeśli nadal go masz, usuń go, w przeciwnym razie dwa rdzenie będą walczyć.

W przypadku nowego kodu QBox woli własny eksport niż dużą tabelę QBCore, na przykład na serwerze:

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

Dane gracza w kliencie

Zbyt wczesne czytanie odtwarzacza to kolejny klasyczny nil:

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

Zamiast tego poczekaj na gracza:

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)

Jeśli skrypt można również uruchomić ponownie, gdy jesteś w grze, przeczytaj dane raz również podczas jego uruchamiania, ponieważ do tego czasu OnPlayerLoaded już się uruchomił.

Lista kontrolna

Objaw Napraw
attempt to index a nil value (global 'QBCore') local QBCore = exports['qb-core']:GetCoreObject() u góry pliku
Nil tylko w jednym pliku QBCore jest lokalny dla innego pliku; zdefiniuj go również tam lub w udostępnionym pliku
No such export GetCoreObject qb-core (lub qbx_core) nie został uruchomiony lub nie został uruchomiony
QBox Zachowaj eksport, rozpocznij qbx_core, usuń cały stary folder qb-core
job to nil podczas uruchamiania Poczekaj na QBCore:Client:OnPlayerLoaded

Zamiast tego chcesz uruchomić ESX? Ten sam problem ESX dotyczy nil: naprawianie esx:getSharedObject.

Szybkie odpowiedzi

Dlaczego w moim skrypcie znajduje się QBCore nil?

Skrypt nigdy nie otrzymał obiektu podstawowego: wykorzystuje usunięte zdarzenie QBCore:GetObject, definiuje QBCore w innym pliku lub zaczyna się przed qb-core. Użyj local QBCore = exports['qb-core']:GetCoreObject() na górze każdego pliku.

Czy GetCoreObject działa na QBox?

Tak. qbx_core utrzymuje warstwę zgodności dla qb-core, więc exports['qb-core']:GetCoreObject() nadal odpowiada. W przypadku nowego kodu QBox preferuje własne eksporty, takie jak exports.qbx_core:GetPlayer(source).

Czy muszę wywoływać GetCoreObject w każdym pliku?

Każdy plik korzystający z QBCore tego potrzebuje, chyba że skrypt zdefiniuje to raz w udostępnionym pliku, który jest ładowany przed innymi.

Skrypty bez tego problemu

Advanced BoostingBoosting pojazdów z tabletu: kontrakty od klasy D do S+, ekipy i kolejka na żywo.Zobacz skrypt →Clothing DesignerProjektuj ubrania w FiveM — pędzel, warstwy, import obrazów i AI — a potem je noś.Zobacz skrypt →Quest CreatorWizualny edytor questów i dialogów z NPC, budowanych węzeł po węźle w grze.Zobacz skrypt →

Czytaj dalej