14 Aralık 2013 Cumartesi

Sendpacket nedir? Neler yapılabilir?

Merhabalar.
Bu yazımda sendpacket nedir ve neler yapılabilir bunlardan bahsetmek istiyorum. Spherescript kavramında her ne kadar arka planda kalsalarda, öğrendiğinizde aslında önemli bir değer olduğunun farkına varacaksınız.



Peki nedir bu sendpacket?
Sendpacket aslında sphere script ile Ultima Online ilişkisinin tamamıdır desek yalan olmaz.
Sendpacket;
Client -> Server
Server -> Client
şeklindeki tablo ile tepkimeden, kullanıcının işlemlerinden, oyundaki olağan süreçten ve diğer olaylardan kaynaklanan etkidir. Bazı paketler her iki taraftan da gönderilir.
Sphere, bize bu konuda avantaj sağlayarak script yazanların paketleri kontrol altına almasını sağlamıştır.

Öncelikle sendpacketlerin yer aldığı bir kaç kaynak sitelere göz atmanızı tavsiye ediyorum.

Join UO
Pol Server
Necrotoolz Kairpacket
Ruosi
UO Torfo

Hemen sonra sphere de nasıl kullanıcığıma dair, wiki sitesinde ki dokumana da bakmanızda yarar var.
Sphere Wiki

Peki nasıl yapabiliriz? İşlemlerimizi nasıl değerlendiririz?
Paketler için temel bilgi olarak şunları söyleyebilirim; bitler aracılığı ile gönderilir ve alınır.

1)BIT : 1 bitlik değişkendir. Değeri 0 veya 1 olabilir.
2)BYTE : 8 bitlik işaretsiz değişkendir. Değeri 0-255 olabilir.
3)WORD : 16 bitlik işaretsiz değişkendir. Değeri 0-65535 olabilir. 2 byte
4)DWORD : 32 bitlik işaretli değişkendir. Değeri -2147483647 – +2147483647 olabilir. 4 byte
5)FLOAT : 32 bitlik kayan noktalı değişkendir.Değeri-2147483646.999 – +2147483646.999 olabilir. 8 byte

Sphere de sendpacket veri alışverişi byte üzerinden yapılır. Paketlerin listelendiği sitelerde (yukarıdaki) kullanımları şu şekilde ifade edilir.
BYTE = byte
BYTE[2] = word için w
BYTE[4] = dword için d
BYTE[8] = float için f

Kullandığım paketler arasından en karışık gibi görüneni seçip birlikte analiz edelim.

0x6C Target Packet - Link #1 - Link #2
6C - Target
Target Packet.
19 bytes
from both
byteID (6C)
byteTarget Type (0x00 = Object Target, 0x01 = Tile Target)
dwordSender Serial
byteFlags (0x00 = None, 0x01 = Harmful, 0x02 = Beneficial, 0x03 = Cancel Target)
dwordObject Serial
wordX (0xFFFF = cancel target)
wordY (0xFFFF = cancel target)
wordZ
wordGraphic (0x00 = Land Target)

Bu paket, target ile işlem yapmamızı sağlar. Oyunda iken .target ile açılan gibi bir target açabilir yada target açıldığında ESC ye başmışız gibi target i iptal edebiliriz.

sendpacket 06c 00 d00 00 d00 w00 w00 w00 w00
Bu komutla yeni bir target açabiliriz (işlem yapılamaz)

sendpacket 06c 00 d00 03 d00 w00 w00 w00 w00
Bu komutta ise yukarıdaki 00 aksine 03 yaptık. Paket açıklamasında 0x03 = Cancel Target ibaresine göre, açılan target i iptal etme komutunuda bitirmiş olduk.

Paketler ile yapılabilecek şeyler yazmakla bitmez. Bir örneği daha analiz edelim.

0x54 Sound - Link #1 - Link #2
54 - Play Sound
Play Sound Packet.
12 bytes
from server
byteID (54)
byteFlags
wordSound ID
wordVolume
wordX
wordY
wordZ

sendpacket 054 01 w01ff w1 w<p.x> w<p.y> w<p.z>
Bu paket ile komutu kullanan kişiye bir ses ilettik. Bunu oyunda normalde bulunan .sound komutu ile de yapabilirdik. Fakat bu paket in farkı, ses i sadece kullanan kişiye iletmesi. Öte yandan .sound ile kullanılan ses, çevredeki diğer oyuncularca da duyulabilirdi.
Komutta yer alan x,y,z ibarelerinden de anlaşılacağı gibi sesin nereye iletileceği, yani kullanan kişinin bulunduğu koordinatı vererek kişisel bir ses komutu yapabiliyoruz. Hangi sesi çaldığımızı ise w0f11 te yer alan 01ff değiştirerek anlayabiliriz.

Bu paketi daha kullanışlı bir hale getirebiliriz.
[function doit]
sendpacket 054 01 w<args> w1 w<p.x> w<p.y> w<p.z>
Kullanımı: Oyundayken .doit 01ff yazabilirsiniz.

Diğer sendpacket scriptleri ve fonksiyonlar

Kullanıcıyı logout ettiren paket
0xD1 Logout Response - Link #1 - Link #2
Fonksiyon kullanımı: doit
[function doit]
sendpacket 0d1 01

Yukarı doğru çıkan rakam efekti
0xBF Generic Information - Link #1 - Link #2
Fonksiyon kullanımı: doit 5
[function doit]
sendpacket 0bf w11 w022 01 d<uid> <args>

War / Peace moda geçmek
0x72 Combat - Link #1 - Link #2
Fonksiyon kullanımı: doit 1 / doit 0
[function doit]
sendpacket 072 0<args> 00 32 00

Basit olarak sendpacket kullanma yöntemleri bu şekildedir. Bundan sonraki dersimizde sendpacket leri fonksiyon ile karşılayarak işlemler yapacağız.

Hiç yorum yok:

Yorum Gönder