ox_lib bölgeleri: lib.zones.box, sphere ve poly ile onEnter ve onExit

FiveM'de ox_lib bölgeleri nasıl kullanılır: coords, size, rotation ve debug ile lib.zones.box, sphere ve poly, onEnter, onExit, inside, bölgeleri kaldırma ve ox_target.

Bir oyuncunun bir mağazaya, garaja veya yasak bir alana ne zaman girdiğini, her karede bir döngüde mesafe kontrol etmeden bilmeniz gerekir. ox_lib bölgeleri bunu sizin yerinize yapar: bir şekil tanımlarsınız, oyuncu girdiğinde veya çıktığında fonksiyonunuzu çağırır. Bu rehber üç şekli, callback'leri, kaldırmayı ve ne zaman bunun yerine ox_target kullanılacağını anlatır.

Bölgeler bağımlılık olarak ox_lib'e ihtiyaç duyar ve @ox_lib/init.lua ile yüklenir. Eksikse, ox_lib init.lua bulunamadı yazısına bakın.

Bölge türleri

Üç tür vardır, hepsi lib.zones altındadır ve hepsi istemci tarafındadır.

Box, yüksekliği olan bir dikdörtgen; odalar ve kapı girişleri için uygundur:

lua
local zone = lib.zones.box({
    coords = vec3(441.0, -981.0, 30.7),
    size = vec3(4.0, 6.0, 3.0),
    rotation = 90.0,
    debug = true,
    onEnter = function(self)
        print('entered the box')
    end,
    onExit = function(self)
        print('left the box')
    end,
})

Sphere, bir noktanın çevresinde bir yarıçap; açık alanlar için uygundur:

lua
local zone = lib.zones.sphere({
    coords = vec3(441.0, -981.0, 30.7),
    radius = 3.0,
    debug = true,
    onEnter = function() print('in range') end,
    onExit = function() print('out of range') end,
})

Poly, noktalardan oluşan bir dış hat; bir avlu veya otopark gibi düzensiz şekiller için:

lua
local zone = lib.zones.poly({
    points = {
        vec3(400.0, -1000.0, 29.0),
        vec3(420.0, -1000.0, 29.0),
        vec3(420.0, -970.0, 29.0),
        vec3(400.0, -970.0, 29.0),
    },
    thickness = 4.0,
    debug = true,
    onEnter = function() print('in the yard') end,
    onExit = function() print('left the yard') end,
})

Poly için thickness, şeklin noktaların yüksekliği etrafında ne kadar yüksek olduğudur. Noktaları zemin seviyesinde tutun ve kalınlığı merdivendeki oyuncuları da kapsayacak kadar büyük verin.

Coords, size ve rotation

  • coords, box veya sphere'in merkezidir. Orada dururken GetEntityCoords(PlayerPedId()) ile ya da bir koordinat aracıyla alın.
  • size, box için genişlik, uzunluk ve yüksekliktir; vec3 olarak verilir ve coords üzerinde ortalanır.
  • rotation, box'ı dikey ekseni etrafında derece cinsinden döndürür. Binanın veya kapının yönünü (heading) kullanın.
  • radius, sphere'ler içindir.

Bunları doğru ayarlamanın en kolay yolu debug = true'dur: bölge dünyada çizilir, böylece içinden yürüyebilir, bir sayıyı değiştirip kaynağı yeniden başlatarak tam oturana kadar deneyebilirsiniz. Her karede çizim yaptığı için yayından önce debug'ı kapatın.

Callback'ler: onEnter, onExit, inside

Üç callback tüm durumları karşılar:

lua
local zone = lib.zones.sphere({
    coords = vec3(441.0, -981.0, 30.7),
    radius = 4.0,
    onEnter = function(self)
        lib.showTextUI('[E] Open shop')
    end,
    onExit = function(self)
        lib.hideTextUI()
    end,
    inside = function(self)
        if IsControlJustReleased(0, 38) then
            print('pressed E inside the zone')
        end
    end,
})
  • onEnter ve onExit her geçişte bir kez çalışır. Bildirimler, text UI, bir şeyi yükleme veya kaldırma için kullanın.
  • inside, oyuncu içerideyken her tick'te çalışır. Tuşa basma gibi her karede kontrol edilmesi gereken her şey buraya gider ve bölgenin dışında size hiçbir maliyeti olmaz.

inside'ı kısa tutun: veritabanı çağrısı yok, lib.callback.await yok, döngü içinde Wait yok. Tuşa basma ayrıntıları için işaretçiler ve text UI yazısına bakın.

Bölgeleri kaldırma

lib.zones.box bir nesne döndürür. Onu saklayın ve alan artık önemli olmadığında kaldırın:

lua
local shopZone

local function createZone()
    shopZone = lib.zones.box({
        coords = vec3(441.0, -981.0, 30.7),
        size = vec3(4.0, 4.0, 3.0),
        onEnter = function() lib.showTextUI('[E] Shop') end,
        onExit = function() lib.hideTextUI() end,
    })
end

local function removeZone()
    if shopZone then
        shopZone:remove()
        shopZone = nil
    end
end

AddEventHandler('onResourceStop', function(resource)
    if resource == GetCurrentResourceName() then
        removeZone()
        lib.hideTextUI()
    end
end)

Bölgenin gösterdiği arayüzü gizlemeyi unutmayın: bölgeyi kaldırdığınızda oyuncu içerideyse, onun için onExit çağrılmayabilir.

Bir noktanın bölgenin içinde olup olmadığını zone:contains(coords) ile de sorabilirsiniz; örneğin bir menü açıldığında oyuncunun konumunu kontrol etmek için.

Bölgeler ve ox_target

İkisi farklı sorunları çözer:

lib.zones ox_target
Soru "Oyuncu bu alanda mı?" "Oyuncu buna bakıp bir tuşa basıyor mu?"
Sonuç Sizin callback'leriniz Hedef menüsünde bir seçenek listesi
Kullanım Güvenli bölgeler, hız sınırları, müzik alanları, yaklaşınca NPC oluşturma Kapılar, ATM'ler, mağaza tezgahları, nesneler

Oyuncu etkileşime girmeyi seçecekse, ox_target bölgelerini kullanın ve eski sistemlerle karşılaştırması için qb-target ve ox-target yazısına bakın. Oyuncu geldiğinde bir şey kendiliğinden olmalıysa, bir lib bölgesi kullanın. İkisini birleştirmek yaygındır: bir bölge siz gelince bir ped yükler ve ox_target o pede seçeneklerini verir.

Performans

Bölgeler, elle yazılmış bir #(coords - playerCoords) < 3.0 döngüsüne göre ucuzdur, çünkü ox_lib onları tek bir merkezi döngüde kontrol eder ve inside fonksiyonunuzu yalnızca geçerli olduğu yerde çalıştırır. Birkaç alışkanlık bunu böyle tutar:

  • Bölgeleri bir döngüde veya her menü açılışında değil, bir kez oluşturun.
  • Tek bir büyük bölge yeterliyken yüzlerce küçük bölge oluşturmayın.
  • İşi inside yerine onEnter ve onExit içine koyun.
  • Canlı sunucuda debug'ı kapatın.

Sonucu resmon ile kontrol edin, yüksek resmon ms yazısında anlatıldığı gibi.

Kontrol listesi

Belirti Çözüm
Bölge hiç tetiklenmiyor Merkez coords, doğru size ve rotation kullanın; görmek için debug = true ayarlayın
lib nil @ox_lib/init.lua'yı shared_scripts'e ekleyin
Çıktıktan sonra text UI kalıyor onExit içinde ve bölge kaldırılırken lib.hideTextUI() çağırın
Tuşa basma algılanmıyor onEnter'da değil, inside'da kontrol edin
Kaynak yeniden başlatılınca bölgeler geride kalıyor onResourceStop'ta zone:remove() çağırın
Yüksek resmon inside'ı hafif tutun ve debug'ı kapatın

Kısa yanıtlar

lib.zones ile ox_target arasındaki fark nedir?

lib.zones oyuncunun bir alanın içinde olduğunu size bildirir, siz de kendi kodunuzu çalıştırırsınız. ox_target ise bir varlığa veya bölgeye etkileşim (bakıp tıklanan bir seçenek) ekler. Alanlar için bölgeleri, oyuncunun bastığı şeyler için ox_target'ı kullanın.

Bölgeyi kurarken nasıl görebilirim?

Bölge seçeneklerinde debug = true ayarlayın. Şekli dünyada çizer, böylece koordinatları, boyutu ve rotasyonu düzeltebilirsiniz. İşiniz bitince kapatın.

Bir bölgeyi nasıl kaldırırım?

lib.zones.box'ın döndürdüğü nesneyi saklayın ve zone:remove() çağırın. Bunu kaynak durduğunda veya alana artık ihtiyaç kalmadığında yapın.

Bu sorunu yaşatmayan scriptler

Shop CreatorBir dakikadan kısa sürede dükkân kurun — sahipler, çalışanlar, kasalar ve soygunlar dahil.Scripti gör →Advanced BoostingTabletten araç boosting: D’den S+ sınıfına kontratlar, ekipler ve canlı sıra.Scripti gör →CCTV Security CamerasYerleştirilebilir kameralar, canlı çoklu görüntü tableti ve basılı delil fotoğrafları.Scripti gör →

Okumaya devam edin