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:

text
SCRIPT ERROR: @my_script/server/main.lua:14: No such export GetItemCount in resource my_inventory

Betiğ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'de ensure veya start ile listelenmişmi?
  • Hatalar olmadan başladı mı, yoksa Kaynağı başlatılamadı veya Betik yüklenemedi yazdı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-master veya my_inventory-main adı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-inventory ve my_inventory farklı 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_inventory değil my_inventory kullanı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.

lua
-- my_inventory/server/main.lua
exports('GetItemCount', function(source, item)
    return 0
end)
lua
-- 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:

  1. Sağlayıcının fxmanifest.lua, README veya belgelerini açın ve mevcut ihracat listesini arayın.
  2. Kaynak klasöründe exports( ve çağırdığınız adı arayın.
  3. Ç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.

bash
grep -rn "exports(" resources/[mic]/my_inventory

Windows'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:

cfg
ensure oxmysql
ensure ox_lib
ensure my_inventory

ensure my_script

Sağ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:

lua
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 bir Wait sonrası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:

lua
if GetResourceState('my_inventory') == 'started' then
    local ok, count = pcall(function()
        return exports['my_inventory']:GetItemCount('water')
    end)
end

GetResourceState '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 →

Okumaya devam edin