ESX is nil: fixing esx:getSharedObject in ESX Legacy

attempt to index a nil value (global 'ESX')? Eski esx:getSharedObject etkinliği ESX Legacy'den kaldırıldı. İşte tek satırlık düzeltme ve düzenleyemediğiniz komut dosyalarıyla ilgili ne yapmanız gerektiği.

Sunucunuzu başlatıyorsunuz, F8 konsolunu açıyorsunuz ve işte karşınızda:

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

Veya sunucu tarafındaki ikizi attempt to index a nil value (upvalue 'ESX'). Komut dosyası iyi durumda, ESX çalışıyor ve ESX hala nil. Bu, en yaygın ESX hatasıdır ve neredeyse her zaman aynı nedene sahiptir.

Neden ESX nil

Daha eski ESX komut dosyaları, ESX nesnesini şu şekilde alır:

lua
ESX = nil

TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)

Bu olay, ESX 1.1 ve 1.2'nin paylaşılan nesnesini nasıl dağıttığıyla ilgiliydi. ESX Legacy kullanımdan kaldırıldı ve mevcut sürümler artık buna yanıt vermiyor. Komut dosyası, etkinliği tetikler, kimse yanıt vermez ve ESX, onu kullanan ilk satır çökene kadar nil olarak kalır.

Bunu çoğunlukla yıllar önce yazılan veya eski eğitimlerden kopyalanan senaryolarda göreceksiniz.

Çözüm: es_extended'e doğrudan

Bu satırları ESX Legacy'in sağladığı dışa aktarmayla değiştirin:

lua
ESX = exports['es_extended']:getSharedObject()

İstemcide ve sunucuda aynı şekilde çalışır. Bunu ESX kullanan her dosyada yapın. Komut dosyasında bunun gibi bir bekleme döngüsü de varsa onu silin; dışa aktarma işlemi hemen yanıt verir:

lua
-- old code: remove it
Citizen.CreateThread(function()
    while ESX == nil do
        TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)
        Citizen.Wait(0)
    end
end)

Daha da basit: imports.lua

es_extended sizin için ESX ayarını yapan küçük bir dosya gönderir. Bunu betiğin fxmanifest.lua:

lua
fx_version 'cerulean'
game 'gta5'
lua54 'yes'

shared_script '@es_extended/imports.lua'

client_scripts { 'client/*.lua' }
server_scripts { 'server/*.lua' }

Artık her istemci ve sunucu dosyasında genel bir ESX bulunur ve istemcide ESX.PlayerData, oyuncunun işi ve parası değiştikçe güncel kalır. getSharedObject satırlarını tamamen silebilirsiniz.

İpucu: komut dosyası başına bir yaklaşım kullanın. Her dosyanın üst kısmındaki dışa aktarma veya manifest dosyasındaki imports.lua; ikisini karıştırmak işe yarar ama gürültü olur.

Hâlâ nil mi? Başlangıç sırasını kontrol edin

Dışa aktarmayı zaten kullanıyorsanız ve ESX hala nil ise veya No such export getSharedObject in resource es_extended alırsanız, komut dosyası es_extended'den önce başlatılıyor demektir. Sırayı server.cfg'iniz belirler:

cfg
ensure oxmysql
ensure ox_lib
ensure es_extended
ensure [esx]

ensure my_script

Sunucu konsolunda en baştan kontrol edilecek iki şey daha:

  • es_extended hatasız başladı. Başarısız olursa (kötü bir mysql_connection_string, eksik bir oxmysql), ona bağlı olan her komut dosyası da başarısız olur.
  • Klasörün adı es_extended'dir. Yeniden adlandırılmış veya kopyalanmış bir kopya, dışa aktarma adını bozar ve Linux'ta ad, büyük/küçük harfe duyarlıdır.

Bu hatayı es_extended kaynağında böyle bir dışa aktarma yok getSharedObject bölümünde ayrıntılı olarak ele alıyoruz.

İstemcideki oyuncu verileri

Eski komut dosyaları da oynatıcıyı şu şekilde okur:

lua
-- old
ESX.GetPlayerData()
RegisterNetEvent('esx:playerLoaded')
AddEventHandler('esx:playerLoaded', function(xPlayer) PlayerData = xPlayer end)

Bu hala ESX Legacy'de çalışıyor, tek bir ayrıntıyla: başlangıçta job veya money okumadan önce oynatıcının yüklenmesini bekleyin.

lua
CreateThread(function()
    while not ESX.IsPlayerLoaded() do Wait(250) end
    local job = ESX.GetPlayerData().job
    print(('job: %s (%s)'):format(job.name, job.grade))
end)

RegisterNetEvent('esx:setJob', function(job)
    -- the job changed: refresh whatever shows it
end)

imports.lua ile ESX.PlayerData.job sizin için güncel tutulur.

Düzenleyemediğiniz komut dosyaları

Komut dosyası emanete alınmışsa (şifrelenmişse) ve hala eski olayı kullanıyorsa kodunu değiştiremezsiniz. Tercih sırasına göre:

  1. Yazarından güncelleme isteyin. Hala ESX karşılığında satılan tüm komut dosyaları dışa aktarmayı kullanmalıdır.
  2. ESX'den gelen eski olayı kendiniz yanıtlayın. es_extended'de bunu bir sunucu dosyasına ve bir istemci dosyasına ekleyin:
lua
AddEventHandler('esx:getSharedObject', function(cb)
    cb(ESX)
end)

Dikkat: bu, es_extended'in kendisine ait bir yamadır. ESX güncellendiğinde bunun üzerine yazılır, dolayısıyla her güncellemeden sonra tekrar eklemeniz gerekir. Bunu bir çözüm olarak değil geçici bir çözüm olarak tutun.

Hızlı kontrol listesi

Belirti Düzelt
attempt to index a nil value (global 'ESX') TriggerEvent('esx:getSharedObject'…)'yi exports['es_extended']:getSharedObject()
Hala nil değişiklikten sonra Start es_extended before the script in server.cfg
No such export getSharedObject es_extended başlatılmadı, başarısız oldu veya farklı şekilde adlandırıldı
ESX.PlayerData.job başlangıçta nil Önce ESX.IsPlayerLoaded()'yi bekleyin
Eski etkinliğe sahip emanet edilen komut dosyası Yazara sorun; bu arada es_extended

Kısa yanıtlar

Komut dosyamda neden ESX nil var?

Komut dosyası, eski TriggerEvent('esx:getSharedObject') çağrısıyla ESX komutunu ister, mevcut ESX Legacy artık yanıt vermez. Bunu ESX = exports['es_extended']:getSharedObject() ile değiştirin veya fxmanifest'e shared_script '@es_extended/imports.lua' ekleyin.

Hem istemci hem de sunucu dosyalarını değiştirmem gerekiyor mu?

Evet. ESX kullanan her dosyanın istemcide ve sunucuda nesneye ihtiyacı vardır. fxmanifest'teki imports.lua satırı bunların hepsini aynı anda kapsar.

Komut dosyası emanete alınmışsa ve onu düzenleyemezsem ne olur?

Önce yazarından güncelleme isteyin. Son çare olarak eski etkinliğe es_extended adresinden yanıt verebilirsiniz, ancak ESX'i her güncellediğinizde bunu tekrar eklemeniz gerekir.

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 →Item Creator V2Animasyonlar, proplar, efektler ve daha fazlasıyla kullanılabilir eşyalar oluşturun — kod yazmadan.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