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:
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:
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:
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 dururkenGetEntityCoords(PlayerPedId())ile ya da bir koordinat aracıyla alın.size, box için genişlik, uzunluk ve yüksekliktir;vec3olarak verilir vecoordsü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:
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,
})onEnterveonExither 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:
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
insideyerineonEnterveonExitiç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 →