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:
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:
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:
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:
-- fxmanifest.lua
shared_script 'shared/core.lua'
client_scripts { 'client/*.lua' }
server_scripts { 'server/*.lua' }-- shared/core.lua
QBCore = exports['qb-core']:GetCoreObject()Wskazówka: jeśli
QBCorewynosilocalw 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:
ensure oxmysql
ensure ox_lib
ensure qb-core
ensure [qb]
ensure my_scriptNastę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.luaskryptu, tak aby FiveM uruchamiał qb-core jako pierwszy lub odmawiał uruchomienia skryptu bez niego:
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:
ensure oxmysql
ensure ox_lib
ensure qbx_coreNie 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:
local player = exports.qbx_core:GetPlayer(source)
if player then
print(player.PlayerData.citizenid)
endDane gracza w kliencie
Zbyt wczesne czytanie odtwarzacza to kolejny klasyczny nil:
-- this runs before the player is loaded: job is nil
local job = QBCore.Functions.GetPlayerData().jobZamiast tego poczekaj na gracza:
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 →