FiveM Lua'da exports: exports('name', fn) ve 'Böyle bir export yok'

FiveM Lua'da exports nasıl tanımlanır ve çağırılır, fxmanifest exports ve server_exports stilleri ve 'Böyle bir export yok' hatalarını nasıl düzeltilir başlama sırası veya yanlış taraftan.

Betik başkasını çağırır ve konsol yanıtlar:

text
No such export getCount in resource my_inventory

Bu makale Lua'da exports'ların nasıl tanımlandığını ve çağırıldığını, onları bildirmenin iki yolunu ve bu hatanın görülme yaygın nedenlerini gösterir.

Export tanımlama

Export bir kaynağın başkalarına bir işlev sunmasını sağlar. Basit yol betik içindeki exports işlevidir:

lua
-- my_inventory/server/main.lua
local function getCount(source, item)
    -- ...
    return 5
end

exports('getCount', getCount)

İşlevi satır içi de iletebilirsiniz:

lua
exports('getCount', function(source, item)
    return 5
end)

Bu kadar. fxmanifest.lua için eklenecek hiçbir şey yoktur ve export betik çalışan tarafta var olur: sunucu betiğine koyun ve sunucu export'u, istemci betiğine koyun ve istemci export'u.

Manifest stili

Eski kaynaklar fxmanifest.lua içinde exports bildirer ve aynı ad ile düz global işlev tanımlar:

lua
-- fxmanifest.lua
fx_version 'cerulean'
game 'gta5'

server_exports { 'getCount' }
exports { 'getOwnedCount' }
lua
-- server script
function getCount(source, item)
    return 5
end
  • exports { … } istemci exports listeler.
  • server_exports { … } sunucu exports listeler.

Bu hala çalışır ve birçok ESX ve QBCore kaynağı kullanır. İki stil çatışmaz, bu nedenle bir kaynak karıştırabilir. Yeni kod için, exports('name', fn) daha basittir çünkü işlev ve export birlikte yaşar ve manifest'te satırı unutamazsınız. fxmanifest.lua'nın geçerli manifest dosya adı olduğunu hatırlayın: bkz. fxmanifest vs __resource.lua.

Export çağırma

Aynı tarafta başka herhangi bir kaynaktan:

lua
local count = exports['my_inventory']:getCount(source, 'water')

Nokta ve iki nokta üst üste sürümleri aynı şeydir, ad geçerli Lua tanımlayıcısı olduğu sürece:

lua
local count = exports.my_inventory:getCount(source, 'water')

Kaynak adında qb-core gibi bir tire olduğunda, köşeli parantez formunu kullanın: exports['qb-core']:GetCoreObject(). Çağrı senkronudur: işlevin değerini döndürür ve işlev beklerse getiri verebilir.

İpucu: argümanlar ve dönüş değerleri kaynaklar arasında seyahat eder, bu nedenle tablolar kopyalanır. Export'dan aldığınız tabloyu değiştirmek diğer kaynağın kendi verilerini değiştirmez. Döndürülen tablo içindeki işlevler hala çalışır, sahibine geri çağrı yaptıkları gibi.

Neden "Böyle bir export yok" alıyorsunuz

text
No such export getCount in resource my_inventory

Bunları bu sırada kontrol edin:

  1. Kaynak başlatılmadı. Konsolu açın ve ensure my_inventory çalıştırın. Başlamazsa önce onu düzeltin.
  2. Arayanın arkasında başladı. Export sadece sahibi betikleri yükledikten sonra var olur. Bkz. server.cfg'de başlama sırası ve sahibini onun üzerine koyun.
  3. Ad yanlış yazıldı. Export adları büyük/küçük harf duyarlıdır: getCount ve GetCount farklıdır.
  4. Yanlış taraf. Sunucu betiği istemci export'u çağıramaz ve tam tersi. Hata aynı görünür.
  5. Export bildirilir ancak işlev eksik. Manifest stili ile, server_exports { 'getCount' } sunucuda getCount adlı global işleve ihtiyaç duyar. Yerel işlev sayılmaz.
  6. Sahibi başarısız oldu veya durdu. Betik hatası üzerinde çökmüşse veya durdurduysanız, exports'ları tekrar çalışana kadar gitmiş olur. Konsolda başlangıç çıkışını okuyun.

Bu hatanın gerçek dünya sürümleri için, bkz. No such export GetSharedObject in resource es_extended ve QBCore nil: GetCoreObject.

Bağımlılıkları kullanarak sırayı emin yapın

Tek başına ensure satırlarının sırasına güvenmeyin. Kaynak'ın export'u çağıran manifest'te bağımlılığı bildirin:

lua
dependency 'my_inventory'

FiveM sonra my_inventory önce başlatır ve eksikse kaynağı başlatmayı reddeder, daha net bir mesajla (bağımlılık bulunamadı).

Eksik kaynak'ı nazikçe ele alma

Başka kaynak isteğe bağlıysa, çağırmadan önce durumunu kontrol edin:

lua
if GetResourceState('my_inventory') == 'started' then
    local count = exports.my_inventory:getCount(source, 'water')
end

GetResourceState started, stopped, starting veya missing gibi bir dize döndürür. İsteğe bağlı bir entegrasyonu konsol hatası olmadan desteklemek için temiz yoldur.

Kendi exports'ları çağırma

Bir kaynak kendi exports'ı da kendi adıyla çağırabilir: exports['my_inventory']:getCount(...). Sadece kaynak içinde kullanılan işlev için normal yerel işlev daha hızlı ve daha basittir. Exports kaynaklar arasında sınır içindir.

Performansa bir söz

Her çağrı iki kaynak arasında geçer, bu nedenle normal işlev çağrısından yavaştır. Değeri bir kez okuyabilir ve tutabiliyorsanız sıkı çerçeve başına döngüde export çağırmayın. Saniyede birkaç kez çağırmak iyidir.

Kontrol Listesi

Belirtisi Düzeltme
No such export x in resource y y başlatın ve server.cfg içinde arayanın önüne koyun
Sunucuda çalışır, istemci üzerinde başarısız olur İstemci betiğinde de export'u tanımlayın veya sunucudan çağırın
Manifest stili export eksik Manifest girişiyle aynı ada sahip global işlev tanımlayın
Ad durumu farklı Yazımı tam eşleştirin
Kaynak adında tire exports['my-resource']:name()
İsteğe bağlı entegrasyon konsolu sele uğratır Önce GetResourceState('x') == 'started' kontrol edin

Kısa yanıtlar

Başka kaynaktan export'u nasıl çağırırım?

exports['resource_name']:exportName(args) veya exports.resource_name:exportName(args) kullanın. Diğer kaynak başlatılmış olmalı ve aynı tarafta (istemci veya sunucu) o export'u tanımlamalı.

fxmanifest.lua'da hala exports'a ihtiyacım var mı?

exports('name', fn) ile değil: betikten kendi içindeki export'u kaydeder. Manifest'teki exports {} ve server_exports {} listeleri eski stil, burada global işlev ada göre ortaya çıkarılır.

Neden export istemci üzerinde çalışır ama sunucuda değil?

İstemci ve sunucu exports ayrıdır. İstemci betiğinde tanımlanan export'u sadece istemci üzerinde, sunucu betiğinde tanımlanan sadece sunucuda var.

Bu sorunu yaşatmayan scriptler

Item Creator V2Animasyonlar, proplar, efektler ve daha fazlasıyla kullanılabilir eşyalar oluşturun — kod yazmadan.Scripti gör →Mic PhoneTablete dönüşen katlanabilir bir telefon; oyuncunun gerçek telefonuna da taşınır.Scripti gör →Shop CreatorBir dakikadan kısa sürede dükkân kurun — sahipler, çalışanlar, kasalar ve soygunlar dahil.Scripti gör →

Okumaya devam edin