Merhaba arkadaşlar.
Günümüzde birçok sunucu binek armor sistemi kullanıyor ve çoğu hatalı veya gereksiz uzun sorgular kullanarak bu işleri yapıyor veya yapmaya çalışıyor.
Bir karakterin kuşandığı eşyaların ARMOR değeri olur ancak binekler kuşanılan bir zırh gibi görünmediğinden dolayı bunlar MODAR yani modifiye armor değeri olarak karaktere verilir. Aynı mantık sabit armor değeri vermesi istenen itemlerde de kullanılmakta. Ancak benim şuan anlatmak istediğim olay binekler üzerinde olduğundan item kısmına hiç girmeyeceğim.

Şimdi. Bana müşteri olarak gelen birçok sunucuda gördüğüm sistemler @mount triggeri altında argo.baseid sorgusu yapıp buna göre + modar vermek ve @dismount triggeri altında yine argo.baseid sorgusu ile bu armoru geri silmek. Sunucuda 20 çeşit binek var desek totalde 40 farklı sorgu oluyor. Bunu kısaltmanın türlü türlü yolları var tabiki.
ANCAK! Burada dikkat edilmesi gereken @dismount triggeri tetiklenirse modar siliniyor ama ya trigger tetiklenmezse ? Yani ya binek silinirse veya oyuncunun altında ölürse ? Evet. Armor bug. Bunun çözümünü kendimde bayağıdır arıyordum.Sürekli aynı yere bakmaya odaklı olduğumuz için aklıma biraz geç geldi ve herkesin kullanmasını isteyeceğim için böyle bir başlık açma gereği duydum. Ben zaten böyle yapmıştım diyen arkadaşlar veya daha iyisi şöyle yaparsan olur diyen arkadaşlar konu açmadığı için şuan bana göre en sağlıklı yöntem aşağıda paylaşacağım kodlardır.

Öncelikle bir defname oluşturuyoruz. Sonrasında armor verecek bineklerimizin baseid değerlerini defname sonrasına direkt yazıyoruz.
NOT:Herzaman makine diline en yakın kodlama en sağlıklısıdır.Tavsiyem her bineğinizin @create triggeri altında tag0.modar gibi değerlerle sabit değer vermenizdir.Ancak bunun sorgusu binerken olsada inerken düzgün olmaz. Bunun sorgu şekilde farklı olucaktır. Ben şuanda bu işin aslında kolay gibi görünse de nekadar sıkıntılı bir durum olduğunu mümkün olan en sade şekilde anlatmaya çalışıyorum :)
 

[defname binek_armor_ayarlar]
binek_armor_c_llama 3
binek_armor_c_m_unicorn 10


Bu şekilde yaptığımız zaman ileride müdahale etmesi kolay olacaktır. Şimdi gelelim can alıcı iki noktaya. Öncelikle bu şekilde direkt değerleri karaktere verirsek buda bir hataya sebeb olur. Mesela unicorn 10 armor veriyordu ama siz bunu 15 yaptınız. Hali hazırda unicorn bineğine binmiş olan bir oyuncu binekten indiği zaman yeni değer olan 15 kadar armor kaybeder. Yani biz bunları çekilcek hafıza olarak kullanacağız.
Her oyuncuda olan bir event içerisinde @mount triggeri kullanacağız.
 

ON=@MOUNT
if (<ddef.binek_armor_<argo.baseid>>) // bu bineğin baseid değeri armor veren binekler listesinde mi diye sorduk.
src.modar +=<ddef.binek_armor_<argo.baseid>>  // listedeyse belirtilen kadar armor sağladık.
endif

ON=@DISMOUNT
if (<ddef.binek_armor_<argo.baseid>>) // bu bineğin baseid değeri armor veren binekler listesinde mi diye sorduk.
src.modar -=<ddef.binek_armor_<argo.baseid>>  // listedeyse belirtilen kadar armor sildik.
endif


Böyle mi yapıyoruz ? Yaptık ve bug oluşmasına müsade ettik. Binek armorlarını yukarıda anlattığım gibi değiştirdiğimiz zaman bineken 10 armor almış adam yukarıdaki kodlama ile 15 armor kaybedicektir.Buda karakter üzerinde negatif veya pozitif armor sorununa sebeb olucaktır.
Lafı daha azla uzatmadan şuan için bana göre en sağlıklı yöntem olan çözüme geçiyorum.
Öncelikle karakterler bineğe bindiği zaman modar almasını @mount ve bunun yardımcı functionu ile yapıyoruz.
 

On=@Mount
if (<ddef.binek_armor_<argo.baseid>>)
src.timerf 0,f_add_binek_armor <argo.baseid> // Komut binek iteminin yaratılışından önce tetiklendiği için bu şekilde eklemek gerekiyor.
endif


Sonra herhangi bir script içerisine bu yardımcı komutu ekliyoruz.

[function f_add_binek_armor] // Yardımcı komut
if (<src.findtype.t_eq_horse>) && (<src.findtype.t_eq_horse.more1>==<args>) // gerekli kontroller
src.modar +=<ddef.binek_armor_<args>> // oyuncuya modar verdik
src.findtype.t_eq_horse.tag0.modar <ddef.binek_armor_<args>> // ve bu modar değerini değişikliklere karşı bineğin eşyasına kaydettik.
endif


Bineğe binince layer25'e bir eşya gelir ve type t_eq_horse olarak ayarlıdır.
Script pack içerisinde böyle bir typedef olmaz.Biz bunu herhangi bir script içinde oluşturalım.

[TYPEDEF T_EQ_HORSE]
on=@destroy // bu eşya oyuncu binekten indiğinde bu silinme triggerini tetikler.
if (<topobj>) && (<topobj.isplayer>) && (<topobj.findlayer.25>==<uid>) && (<ddef.binek_armor_<more1>>) // kendimizi bi sağlama alalım :)
try uid.<topobj>.f_remove_binek_armor <dtag0.modar> // armor silme triggerimizi tetikletelim.
endif

Sonrasında modar silmek için gerekli olan yardımcı komutumuzu da herhangi bir script içerisine ekleyelim.Eğer function ile yapmazsanız karakter üzerinde ki tüm modar değeri siliniyor.

[function f_remove_binek_armor]
modar -=<args> // modar değerimiz bineğin eşyasına kaydedilen değer kadar azaltıldı.


Bu şekilde eklediğimiz zaman oyuncu bineğe bindiğinde bizim Defname olarak belirlediğimiz armoru alıyor ve bu armor değerini bineğe bağlanan item üzerine TAG olarak kaydediyor. Oyuncu binekten inmek istediğinde Defname üzerinden değil bineğe ait olan item üzerinde ki tag verisini alıyor ve kazandıgı kadar armor kaybediyor. Yani siz armor değerlerini değiştirsenizde oyuncu bir problemle karşılaşmıyor. Binek birşekilde oyuncunun altından silindiğinde de item @destroy triggeri tetiklediği için oyuncu offline bile olsa armor değeri azalıyor ve üzerinde negatif veya pozitif bir modar değeri kalmamış oluyor.

Evet şuanda benim kullanmayı tercih ettiğim ve bulabildiğim en sağlıklı çözüm bu şekilde. Kodlamasında aklımı karıştıran tek kısım @mount triggerinde timerf 0 ile işlem yaptırmamız. Keşke SphereX gibi bi emulatörde @aftermount gibi bi trigger olsa veya @itemequip triggeri bineğe binilme anında tetiklense ama malesef yok :) Bineğe binildiğinde bu item direkt karakter üzerine oluşacak şekilde kodlandığından t_eq_horse tipi itemler @equip triggerlerini tetiklemiyor. Alışılmışlıktan dışarı çıkmakta zor oluyor. İnsan birşeyin yapılışını heryerde aynı görünce farklı düşünemez oluyor. Bu konuyu okuyup hmmmm diyecek birçok insan olduğuna eminim. Modar konusunda sorun yaşayan herkes rahatça kullanabilir.

Bir teşekkürünüz beni mutlu etmeye yeter :)



Bu konu Nefrelius tarafından düzenlendi(2024-02-25 00:40, 1 ay önce)
Expert
34.0001

eline sağlık kardom @destroy kullanmak iyi fikirmiş

Üye Ol veya Giriş Yap

Bu forum başlığına mesaj atmak istiyorsanız hemen üye olun veya giriş yapın.