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:
No such export getCount in resource my_inventoryBu 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:
-- my_inventory/server/main.lua
local function getCount(source, item)
-- ...
return 5
end
exports('getCount', getCount)İşlevi satır içi de iletebilirsiniz:
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:
-- fxmanifest.lua
fx_version 'cerulean'
game 'gta5'
server_exports { 'getCount' }
exports { 'getOwnedCount' }-- server script
function getCount(source, item)
return 5
endexports { … }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:
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:
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
No such export getCount in resource my_inventoryBunları bu sırada kontrol edin:
- Kaynak başlatılmadı. Konsolu açın ve
ensure my_inventoryçalıştırın. Başlamazsa önce onu düzeltin. - 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.
- Ad yanlış yazıldı. Export adları büyük/küçük harf duyarlıdır:
getCountveGetCountfarklıdır. - Yanlış taraf. Sunucu betiği istemci export'u çağıramaz ve tam tersi. Hata aynı görünür.
- Export bildirilir ancak işlev eksik. Manifest stili ile,
server_exports { 'getCount' }sunucudagetCountadlı global işleve ihtiyaç duyar. Yerel işlev sayılmaz. - 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:
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:
if GetResourceState('my_inventory') == 'started' then
local count = exports.my_inventory:getCount(source, 'water')
endGetResourceState 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 →