15 Aralık 2013 Pazar

Fonksiyon ile sendpacket karşılamak

Arka arkaya aynı konuya yakın üçüncü konumu açıyorum çünkü bu konunun önemini sonraya sarkıtmak yanlış olurdu.
Bu yazımda sendpacket leri fonksiyon ile karşılayarak özelleştirmeyi göreceğiz.
Nasıl mı? Buyrun yazımın devamına...



Çok basit aslında. Bir önceki yazımda sendpacket kullanımını kavradıysanız bundan sonrası gayet anlaşılır gelecektir.

Status barda yer alan STAT LOCK yani stat kilitleme tuşlarını örneğin;
statlock.str 1
gibi kontrol edebiliyoruz. Fakat bu bazen yeterli olmayabilir. Mesela resimde yer alan STAT LOCK tuşlarına basıldığında bir uyarı mesajı verdirmek istesek ne yapabiliriz?

İşte tam burada sendpacket imdadımıza yetişiyor. Önce bu işlemin hangi paket ile çağırıldığına bakıyoruz.
General Information Packet

Bu paket adından da anlaşılacağı üzere bir çok işlemin paketlerini içerir. İşlemleri birbirlerinden ayırt etmek için alt paketler vardır. Bize lazım olan STAT LOCK ve bunun alt paketinin değeri 0x1a Extended stats dır.
Peki çağırma işlemini nasıl yapıyoruz?

Önce sphere.ini dosyasını açıyoruz ve [SPHERE] başlığının hemen altına PACKET191=stat.lock yazıyoruz. Burada önemle dikkat etmemiz gereken yer aslında 0bf olan paketin sphere.ini ye yazılırken 191 olarak yazılması. 0bf Hexadecimal, 191 ise Decimal değerdir ve aynıdır. Sphere tarafından aynı yorumlanır. Bunun çevirisini <eval 0bf> ile alabilirsiniz.
[SPHERE]
PACKET191=stat.lock

Bu işlem ile gelen paketi fonksiyon ile karşılamaya hazırız. Artık fonksiyonumuzu yapalım ve sorgularımıza geçelim.
[function stat.lock]
if (<local.4> == 01a)
ref1 <local.char>
  ref1.say <local.5> <local.6>
endif

İşte hepsi bu kadar. STAT LOCK tuşlarına bastığınızda <local.5> ve <local.6> değerlerinin değiştiğini göreceksiniz. Buna göre kodlamaya devam edebilirsiniz.

Local.5 için değerler
STR = 0
DEX = 1
INT = 2

Local.6 için değerler
Yükselişe alma = 0
Düşüşe alma = 1
Kilitleme = 2

"İyi güzel fakat nerden çıktı bu local değerler. Bu değişkenlere değer atamadık ki." diye sorabilirsiniz.
Cevap olarak şunları söyleyebilirim;

Sphere.ini den atanan paketlere karşılık gelen fonksiyonda local.char işlemi yapan karakter oluyor.
Alt paketlerden bahsetmiştim yukarıda hatırlarsanız. Bu alt paketlerde local.0, local.1, local.3 ardışığı ile paket boyutuna göre devam ediyor. Kaç adet local paket boyutunu olduğunu da bir önceki yazımda yer alan sendpacket gönderirkenki bytes değerlerinin sayısı ile eşleştirebiliriz.

STAT LOCK tan hariç başka bir çok kullanışlı fonksiyonlar üretebiliriz. Örneğin kendimize bir Move fonksiyonu yapabilir ve eğer istersek bu fonksiyonu trigger a dönüştürebilir, oyuncunun her adımını kontrol edebiliriz. Move Request

[SPHERE]
PACKET2=move.check
[function move.check]
ref1 <local.char>
ref1.say <ref1.p>

Eğer trigger yapmak isterseniz (fonksiyon ile de kontrol edilebilir ve bu anlamda triggerin herhangi bir ekstra etkisi yoktur)
[function move.check]
ref1 <local.char>
ref1.trigger @Move

[events e_doit]
on=@move
say <p>

Son bir örneğimi Dye Window ile vererek yazımı sonlandırmak istiyorum.

[SPHERE]
PACKET149=hue.picker
[function hue.picker]
ref1 <local.char>
ref1.say <local.8>

Bu paket, oyuncunun i_dyes ile i_dye_tub renk seçimini gösterecektir. Bu iki eşyaya bağlı kalmadan direk bir renk seçim penceresi açmak isterseniz şu fonksiyonu da eklemeniz gerekmektedir.
[function f_huepicker]
sendpacket 095 d<src> w0000 w0fab

Yukarıdaki fonksiyoda 0fab değerini değiştirerek (örneğin katana uid 013fe) boya rengini önizleme yapılan eşyayı değiştirebilirsiniz. Oyun içinde f_huepicker yazarak boya penceresini açabilirsiniz.

Sonuç olarak sendpacket
Bu sendpacket üçlemesini konu tazeyken peşpeşe paylaşmak istedim. Yapılabilecek şeyler bir hayli fazla. Bir sonraki sendpacket ile efekt yapımı hakkında konuşacağız.

Hiç yorum yok:

Yorum Gönder