attempt to index a nil value (global 'QBCore'): GetCoreObject düzeltmesi

QBCore betiğinizde nil var mı? Eski QBCore:GetObject olayı gitti. GetCoreObject ile QBCore ve QBox üzerinde çekirdek nesnenin nasıl elde edileceği ve neden hala nil olabileceği.

Konsolunuzun bir yerinde:

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

QBCore çalışıyor, komut dosyası düzgün görünüyor ve QBCore hala nil. QBCore ve QBox

Neden QBCore nil

Daha eski QBCore komut dosyaları, bir etkinlik içeren temel nesneyi aldı:

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

Bu etkinlik qb-core'den kaldırıldı. Artık kimse yanıt vermiyor, bu nedenle QBCore nil olarak kalıyor ve ilk QBCore.Functions… satırı çöküyor.

Düzeltme: GetCoreObject

Dosyanın üst kısmında qb-core'den dışa aktarmayla birlikte nesnesini isteyin:

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

İstemcide ve sunucuda aynı satırdır. Bunu QBCore kullanan her dosyaya veya bildirimin ilk olarak yüklendiği paylaşılan dosyaya bir kez koyun:

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

İpucu: eğer QBCore bir dosyada local ise, diğer dosyalar onu göremez. Komut dosyasının yalnızca bir dosyasındaki nil hatası genellikle tam olarak bu anlama gelir.

Hâlâ nil mi? qb-core henüz çalışmıyor

Dışa aktarma yalnızca qb-core önce başlatıldığında yanıt verir. server.cfg'de:

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

ensure my_script

Sonra:

  • Sunucu konsolunun üst kısmındaki qb-core'nin kendi başlangıcını kontrol edin. Buradaki bir veritabanı hatası, dışa aktarmaların hiçbir zaman mevcut olmadığı anlamına gelir ve No such export GetCoreObject in resource qb-core alırsınız.
  • Bağımlılığı komut dosyasının fxmanifest.lua'sine ekleyin, böylece FiveM önce qb-core'i başlatır veya komut dosyasını onsuz başlatmayı reddeder:
lua
dependency 'qb-core'

QBox

QBox'nin çekirdeği qbx_core'tir ve qb-core komut dosyaları için bir uyumluluk katmanı tutar: exports['qb-core']:GetCoreObject() hâlâ bir nesne döndürür, dolayısıyla çoğu QBCore komut dosyası olduğu gibi çalışır.

server.cfg:

cfg
ensure oxmysql
ensure ox_lib
ensure qbx_core

QBox üzerinde ayrı bir qb-core klasörü yok. Hala bir tane varsa kaldırın, aksi takdirde iki çekirdek kavga eder.

Yeni kod için QBox, örneğin sunucudaki büyük QBCore tablosu yerine kendi dışa aktarımlarını tercih eder:

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

İstemcideki oyuncu verileri

Oynatıcıyı çok erken okumak diğer bir klasiktir nil:

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

Bunun yerine oynatıcıyı bekleyin:

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)

Komut dosyası siz oyundayken de yeniden başlatılabiliyorsa, OnPlayerLoaded o zamana kadar zaten etkinleştiğinden, verileri başlatıldığında da bir kez okuyun.

Kontrol listesi

Belirti Düzelt
attempt to index a nil value (global 'QBCore') local QBCore = exports['qb-core']:GetCoreObject() dosyanın üst kısmında
Nil yalnızca tek bir dosyada QBCore başka bir dosyada yereldir; orada veya paylaşılan bir dosyada da tanımlayın
No such export GetCoreObject qb-core (veya qbx_core) başlatılmadı veya başlatılamadı
QBox sunucu Dışa aktarmayı koruyun, qbx_core'yi başlatın, eski qb-core klasörlerini kaldırın
job başlangıçta nil Bekle QBCore:Client:OnPlayerLoaded

Bunun yerine ESX çalıştırılıyor mu? ESX ile nil arasındaki sorunun aynısı: esx:getSharedObject'nin düzeltilmesi.

Kısa yanıtlar

Komut dosyamda neden QBCore nil var?

Betik hiçbir zaman çekirdek nesneyi alamadı: Kaldırılan QBCore:GetObject olayını kullanıyor, başka bir dosyada QBCore'i tanımlıyor veya qb-core'den önce başlıyor. Her dosyanın üst kısmında local QBCore = exports['qb-core']:GetCoreObject() öğesini kullanın.

GetCoreObject, QBox üzerinde çalışıyor mu?

Evet. qbx_core, qb-core için bir uyumluluk katmanı tutar, dolayısıyla exports['qb-core']:GetCoreObject() hala yanıt verir. Yeni kod için QBox, exports.qbx_core:GetPlayer(source) gibi kendi dışa aktarımlarını tercih eder.

Her dosyada GetCoreObject'yi çağırmam gerekiyor mu?

Komut dosyası onu diğerlerinden önce yüklenen paylaşılan bir dosyada bir kez tanımlamadığı sürece, QBCore kullanan her dosya buna ihtiyaç duyar.

Bu sorunu yaşatmayan scriptler

Advanced BoostingTabletten araç boosting: D’den S+ sınıfına kontratlar, ekipler ve canlı sıra.Scripti gör →Clothing DesignerFiveM içinde kıyafet tasarlayın — fırça, katmanlar, görsel içe aktarma ve yapay zekâ — sonra giyin.Scripti gör →Quest CreatorGörevler ve NPC diyalogları için oyun içinde düğüm düğüm kurulan görsel editör.Scripti gör →

Okumaya devam edin