FiveM'de 'Kaynak Y'de X gibi bir ihracat yok': nasıl düzeltilir
FiveM'de 'Kaynak Y'de X gibi bir ihracat yok' hatası mı alıyorsunuz? Nedenleri: kaynak başlatılmadı, yanlış klasör adı, istemci veya sunucu tarafı uyumsuzluğu, yeniden adlandırılan ihracat ve başlangıç sırası.
Konsol bunu gösterir, sık sık bir döngüde:
SCRIPT ERROR: @my_script/server/main.lua:14: No such export GetItemCount in resource my_inventoryBetiğiniz exports['my_inventory']:GetItemCount() adını çağırdı. O anda, my_inventory bu ada sahip bir ihracata sahip değildi. İleti her iki parçayı adlandırır, bu nedenle çözüm küçük sayıda nedenlerden biridir. Bu rehber genel durumu kapsar. İhracat getSharedObject ise es_extended kaynağından, bunun yerine Kaynak es_extended'de getSharedObject gibi bir ihracat yok bölümünü okuyun, bu ESX'e özgü nedenler vardır.
1. Kaynak başlatılmamıştır
Bir ihracat yalnızca kaynağı çalışırken var olur. Başlangıçta konsolu kontrol edin:
- Kaynak,
server.cfg'deensureveyastartile listelenmişmi? - Hatalar olmadan başladı mı, yoksa
Kaynağı başlatılamadıveyaBetik yüklenemediyazdırdı mı? - txAdmin'de durduruldu mu? Kaynaklar sayfasını kontrol edin.
Başlamayan bir kaynak, örneğin Lua söz dizimi hatası veya eksik bağımlılık nedeniyle, hiçbir ihracata sahip değildir. Önce kendi hatasını düzeltme. Kaynağı başlatılamadı ve bağımlılık bulunamadı bölümlerine bakın. Özellikle söz dizimi hatası Lua söz dizimi hatası: yakın beklenmeyen sembol bölümünde ele alınmıştır.
2. Kaynak adı yanlıştır
exports['my_inventory'] betiğin başlığını değil, kaynağın klasör adını kullanır. Klasör yeniden adlandırılmışsa, onu eski adla çağıran her betik başarısız olur.
Tipik durumlar:
my_inventory-masterveyamy_inventory-mainadını daha kısaca değiştirdiniz ve eski adla çağırmaya devam ettiniz.- Ad bir yerde tire ve diğerinde alt çizgi kullanır:
my-inventoryvemy_inventoryfarklı kaynaklardır. - Büyükleştirme farklı: klasörü tam olarak eşleştirin.
- Kaynak,
[qb]gibi köşeli parantezli bir klasörde bulunur. Köşeli parantezler yalnızca bir kategori: adın parçası değil, bu nedenle[qb]/my_inventorydeğilmy_inventorykullanın.
Bazı kaynaklar başka bir kaynağı fxmanifest'te provide 'other_name' ile değiştirir, böylece eski adı isteyenlerin betikleri hala çalışır. Bir kaynağı uyumlu bir kaynakla değiştirdiyseniz ve eski ad başarısız olursa, yenisinin sağlayıp sağlamadığını kontrol edin ve ikisinin çatışmaması için eski klasörü kaldırdığınızı kontrol edin.
3. İhracat diğer tarafta
İhracatlar taraf başına'dır. İstemci betiğinde kayıtlı bir ihracat yalnızca başka bir istemci betiğinden çağrılabilir ve sunucuda kayıtlı bir ihracat yalnızca sunucu betiğinden çağrılabilir.
-- my_inventory/server/main.lua
exports('GetItemCount', function(source, item)
return 0
end)-- my_script/client/main.lua
-- fails: GetItemCount exists on the server only
local count = exports['my_inventory']:GetItemCount('water')Kontrol etmek için, sağlayıcının dosyalarına bakın: exports(...) satırı client/ veya server/ veya her iki tarafta da çalışan shared_scripts altında listelenen bir dosyada. İhracat yalnızca sunucu ise, sunucu betiğinden çağırın ve verileri istemciye bir olay veya geri arama ile getirin, sunucu geri aramaları bölümüne bakın.
4. İhracat yeniden adlandırıldı veya kaldırıldı
Kaynaklar sürümler arasında değişir. Eski bir sürümde GetItemCount adında bir ihracat, yenisinde getItemCount veya Search olabilir ve Lua adları büyük/küçük harfe duyarlıdır. Hata, her iki kaynağın bir güncellemesinden sonra ortaya çıktıysa:
- Sağlayıcının
fxmanifest.lua,READMEveya belgelerini açın ve mevcut ihracat listesini arayın. - Kaynak klasöründe
exports(ve çağırdığınız adı arayın. - Çağrınızı güncelleyin veya diğer kaynağı betiğin yazıldığı sürüme güncelleyin.
Tersinin de var olduğunu unutmayın: yeni bir ihracatı çağırmak için güncellenen bir betik, sağlayıcı hala bunun olmadığı eski bir versiyonla çalışırken.
grep -rn "exports(" resources/[mic]/my_inventoryWindows'ta bunun yerine editörünüzün arama kutusunu kullanın.
5. Başlama sırası ve bağımlılıklar
Kaynak varsa ve ihracata sahipse, ancak çağrı hazır olmadan önce gerçekleşirse, aynı hatayı alırsınız. Kaynaklar server.cfg'nin sırasına göre başlar:
ensure oxmysql
ensure ox_lib
ensure my_inventory
ensure my_scriptSağlayıcıyı onu kullanan betiğin üstüne koyun. Kalıcı bir çözüm için, çağıranın fxmanifest.lua'da bağlantıyı belirtin:
dependency 'my_inventory'Daha sonra FiveM my_inventory'yi ilk olarak başlatır ve onu olmadan betiği başlatmayı reddeder. Sıralama hakkında daha fazla bilgi için server.cfg kaynak sırası bölümüne bakın.
İlgili iki tuzak:
- İhracat geç kaydedilir.
exports('Name', fn)satıra ulaşıldığında çalışır. Dosyada hata varsa veya uzun birWaitsonrasında kaydedilirse, bu arada çalışan çağırıcılar başarısız olur. İhracatları dosyanın en üstüne yakın kaydedin. - Yükleme zamanında bir çağrı.
local count = exports['my_inventory']:GetItemCount('water')gibi üst düzey bir çağrı, dosyanız yüklendiği anda çalışır. Bunu bir olaya veya bir iş parçacığına taşıyın veya bağımlılığın zaten çalışmakta olduğundan emin olun.
Ayrıca isteğe bağlı bir tümleştirmeyi pcall ve kaynağın çalışıp çalışmadığının bir kontrolü ile koruyabilirsiniz:
if GetResourceState('my_inventory') == 'started' then
local ok, count = pcall(function()
return exports['my_inventory']:GetItemCount('water')
end)
endGetResourceState 'started', 'stopped', 'missing' veya diğer durumları döndürür, bu nedenle hangi durumda olduğunu da günlüğe kaydedebilirsiniz. İhracatların nasıl çalıştığının daha derin bir bakışı için Lua'da FiveM ihracatları bölümünü okuyun.
6. Bir kaynağı yeniden başlattı, diğerini değil
Sunucu çalışırken bir sağlayıcıyı yeniden başlatmak, nesnelerini tutan betikleri her zaman yeniden bağlamaz. Bir sağlayıcıyı yeniden başlattıktan veya güncelledikten sonra, onu çağıran betikleri yeniden başlatın veya sunucuyu yeniden başlatın.
Kontrol Listesi
| Belirti | Çözüm |
|---|---|
| Kaynağı başlangıçta konsola eklenmedi | server.cfg'ye ensure my_inventory ekleyin |
Hata üstünde Kaynağı başlatılamadı |
Sağlayıcının kendi hatasını ilk olarak düzeltme |
| Klasör yeniden adlandırıldı | exports['name'] içinde tam klasör adını kullanın |
| İhracat yanlış taraftan çağrıldı | Onu tanımlayan taraftan çağırın veya bir olay/geri arama kullanın |
| Güncellemeden sonra hata | İhracat yeniden adlandırıldı veya kaldırıldı; sağlayıcının mevcut ihracat listesini kontrol edin |
| Yalnızca başlangıçta hata | Sağlayıcıyı çağıranın üstüne koyun; bir dependency satırı ekleyin |
| Sağlayıcı yeniden başlattıktan sonra hala başarısız | Onu çağıran betikleri yeniden başlatın |
Kısa yanıtlar
'Kaynak Y'de X gibi bir ihracat yok' ne demek?
Bir betik exports['Y']:X() adını çağırdı ve kaynak Y o anda X adında bir ihracata sahip değildi. Y çalışmıyor, farklı bir ada sahip, X'i diğer tarafta tanımlar veya bu versiyonda bu ihracata sahip değil.
Kaynak adı büyük/küçük harfe duyarlı mı?
Bunu büyük/küçük harfe duyarlı olarak düşünün: exports['name'] içindeki ad, tire ve alt çizgi dahil olmak üzere klasör adıyla tam olarak eşleşmelidir. Bu, özellikle Linux sunucularında önemlidir.
Ensure sırası bu hatayı düzeltir mi?
Sıklıkla evet. Kaynaklar server.cfg'nin sırasına göre başlar, bu nedenle ihracatı sağlayan kaynağı çağıran kaynağın üstüne koyun veya fxmanifest'e bir dependency satırı ekleyin.
Bu sorunu yaşatmayan scriptler
Mic PhoneTablete dönüşen katlanabilir bir telefon; oyuncunun gerçek telefonuna da taşınır.Scripti gör →
CCTV Security CamerasYerleştirilebilir kameralar, canlı çoklu görüntü tableti ve basılı delil fotoğrafları.Scripti gör →
Item Creator V2Animasyonlar, proplar, efektler ve daha fazlasıyla kullanılabilir eşyalar oluşturun — kod yazmadan.Scripti gör →