Çok eski bir web tarayıcısı kullanıyorsunuz. Bu veya diğer siteleri görüntülemekte sorunlar yaşayabilirsiniz.. Tarayıcınızı güncellemeli veya alternatif bir tarayıcı kullanmalısınız.
Zamanında [1298] için kanatı sadece görsellik olarak yaparken şuan ki kadar bilgim yoktu ama neyin ne olduğunu az buçuk biliyordum.
Kanatın yapımını kafamda canlandırdığımda karakterin clan grade kolluğuna eklemeyi düşündüm ve böylece karaktere extra olarak yeni birşey eklenmiş olacaktı.
Çünkü zamanında çoğu kişi bu kanat için uğraşmıştı.
Turkko, Darkko gibi çoğu server sahibi olsun şuan pvp ortamında takılanlar olsun hepsi bunun [1298] için ilk kanat olmadığını bilirler.
Daha önceden kanat uyarlamaya çalışma çabaları herkesin sürmüştü yapacaz edicez tarzında ama herkesin ve bu işin ehli olan kişilerin bile söylediği bir laf vardı. " Karaktere herhangi bir şekilde extradan bişey eklenmiyor. " Tabi ki o zamanlar herkesin bilgisi yoktu şuan ki kadar ama böyle denmişti sonuçta.
Client üstüne aşırı derece düştüğüm için bu konuları çok rahat kavrayıp neyin ne olamayacağını da biliyordum.
Moradon arkasında duvarda asılı heykeller var melek tarzında onların kanatlarını Object klasöründen söküp effect haline getirmiştim.
Nasıl pathos glove ellere denk geliyorsa ordaki kanatı da alıp sırt bölümüne yerleştirmiştim. Bunları yapmam 5-10 Dakikamı almamıştı.
Bunu server sahiplerine felan attığımda burda takılan ByErotica şahsı o fotoğrafları alıp üstünde oynayıp kesip bicip ben yaptım diye millete satmaya bile çalışmıştı o zamanlar.
Yani saniyesinde fotoğrafı attığımın 5 dakikası sonra Turkko sahibine satılık felan diye atıyordu öyle diyeyim.
Bunları niye anlatıyorum bazı kişilerin ne olduğunu da anlayın istiyorum.
Anlayacağınız o kanat ilkti 1298 için ama şuanda yaptığım için gelecek olursak yaparken grade sistemine eklemeyi düşündüm.
Çünkü benim yaptığım dosya sistemi (.N3Pmesh) olarak geçiyordu. Bunu okuyan Item klasöründe karakterin grade sistemiydi ve onun üzerinden yapmaya karar verdim. Twostarsın Projesinde (github) da verdiği dosyaları daha yeniydi.
Üst versionlardan eser yoktu. PENTAGRAM o dosyaları geliştiriyordu ve programlama bilgisi çok iyidir.
Aklıma yaptığım kanatın tak çıkar olacağı fikri geldi. Biz oyunda clan kurduğumuzda yada yeni bir clana girdiğimizde kolluk geliyordu ve clandan çıkarsak yada clanı patlatırsak clan kolluğu gidiyordu.
Bu tarz yapabilirsek kanat tak çıkar olabilirdi. PENTAGRAM ile bunu konuştuğumda olabileceğini packet yapısına bakılması gerektiğini felan anlattı.
Ondan sonra twostarsın dosyalarını indirip 1298 uyarladım.
Yani oyuna girebilecek kadar packet ve prosedür uyarlayıp inventory olaylarının çalışması yetiyordu.
Birazdan zaten kanatın hangi packetlerle tak çıkar olduğunu anlatacağım.
Yani anlayacağınız kanat böylece tak çıkar oluyordu.
Şuan ortalıkta bulunan tüm sourceleri istediğiniz versiona uyarlayabilirsiniz.
1298-1453-1534 hepsinde kanatın çalışma mantığı aynıdır.
Dosyaları uyarladıktan sonra alttaki anlatacağım şeyleri yaptığınız taktir'de kanat tak çıkar olacaktır.
Ayrıca vereceğim olay direk hazır halde server files, ko.exe felan değildir.
Az buçuk bilgisi olan birisi rahatlıkla yapabilir anlatacaklarımı.
Not : Buraya bir not düşeyim. Yok niye source paylaşmıyorsun yada niye kaynak kodlarını atmadın fonksiyonların kodlarını vereydin söyle böyle diyenleriniz olacaktır. Hazır kod olayına her zaman karşıyım eğer bu yazdıklarımı yapamayacak birisi varsa zaten hiç birşey bilmiyordur gitsin kendini biraz geliştirsin sonra dediklerimi yapmaya çalışsın. İlerde diyecektir ki ben hatalıymışım adam ne güzel anlatmış. Bilgisizliğinizi benim düşünceme yansıtmayınız. Şimdiden anlayışınız için Teşekkür ediyorum.
1298'de yaptığım Hera, Kızmage, Maden Sistemi, Chaotic Generator, Krowaz Kırdırma bunlar gibi bi sürü şeyin anlatımını yayın yaparak yada videolu olarak anlatabilirim.)
Şimdi gelelim olayımıza gerekli olan şeyleri sıralayalım.
1) KnightOnLine.exe için Assembly patch; bunun sebebi client tarafında clan grade kolluğunun kontrolleri bulunmaktadır. İlk önce OllyDbg programımızı indiriyoruz. Sadece bu bölümü fotoğraflı olarak anlatacağım.
İlk önce OllyDbg programımızı açıyoruz. Ardından KnightOnLine.exe dosyamızı seçerek devam ediyoruz.
Not : KnightOnLine.exe clientin içinde olması gerekiyor. Belli başlı .dll dosyalarını isteyecektir.
Sağ tıklayıp View->Module 'KnightOn' değerini seçiyoruz.
Gelen ekranda yine sağ tıklayıp Search for -> All referenced text strings diyoruz.
Karşımıza string değerleri geldi buraya da sağ tıklayıp "Search for text" diyoruz.
Açılan pencerede "clanaddon" değerini yazıp OK diyoruz ve aratıyoruz.
Vee Item\Clanaddon... gibi bi değer karşımıza geldi. O değere iki kere tıkladığımızda bizi yeni bir pencereye atıcak.
Alttaki resimde gördüğünüz gibi gelen pencerede kırmızı ile işaretli olan bizim işlem yapacağımız kod satırı oluyor.
Not : Sizde kırmızı ile işaretli olmayacaktır. Soldaki offset değerinden bulabilirsiniz.
00457195 offset değeri oluyor.
Not : Burada kullandığım KnightOnLine.exe versionu 1298'dir.
Üst versionlarda aynı offset değerinden bulamazsınız.
Şimdi o kod satırının anlamına gelelim.
Kod:
Değerli ziyaretçimiz, içeriği görebilmeniz için lütfen
Giriş yap
veya ücretsiz
Kayıt ol
anlayışınız için teşekkürler.
Üstteki verdiğim kod bizim kırmızı ile işaretli olan yani CMP EAX, 5 değerimize denk gelmektedir. Buradaki kodların açıklamasını da yapayım.
Eğer iGrade değişkeni 5 ve 5'den küçük ise szPlug string değişkenine Item tablosundaki
ClanAddOn_...n3cplug dosyasının ismini ver diyor. Eğer iGrade değeri bunlara uyuşmuyorsa alttaki "sprintf" ile başlayan kodu işlemiyor.
Çok iyi anlamanız için bir örnek daha verelim.
Oyuna girerken WIZ_MYINFO packetinle karakterimizin gradesini değiştirip cliente yolluyoruz. Böylelikle biz kendi karakterimizde kanatı görmüş oluyoruz ama değiştirdiğimiz clan gradesinin değerini cliente 5 ve 5'den üstünü gönderirsek (6, 7, 8, 9..) dosya ismini
client kontrol ettiği için okuyamayacak ve kanatı oyunda sırtımızda göremeyeceğiz. Şimdi o değeri yükseltelim.
CMP EAX, 5 değerini değiştirmemiz gerekiyor. Bunun için CTRL + E yapıyoruz.
Edit code penceremiz açılıyor.
Şimdi buradaki anlatıma geçelim.
Üstteki resimde sayısal değerler görüyorsunuz ama onlar bizim normal kullandığımız günlük hayattaki gibi sayılar değil. Onu da anlatacağım.
Hesap makinesini yada internet sitelerinden hex to decimal olarak arattığınızda yada tam tersi decimal to hex olarak yaptığınızda 05 değerini değiştirdiğimizde yazıcağımız değeri buluruz.
Ben alttaki resimde Maximum 121 Grade yani Kanat eklensin istediğim için
( 121 Değeri kafadan sallama siz istediğinizi verebilirsiniz. ) hex karşılığı olan 79 Değerini vermişim.
Not : 79 diye verdiğimiz değer HEX'tir. Bunu decimale çevirdiğimizde 121'e karşılık gelir.
Yani siz 10' tane yapacaksanız Decimal to HEX yapıyorsunuz. 10 = 0A oluyor oraya 0A yazıcaksınız.
Sonrasında OK diyip sağ tıklıyorsunuz. Gelen ekranda Copy to executable -> All modifications diyip yeni KnightOnLine.exe dosyamızı kaydediyoruz.
2) Gameserver (Ebenezer) için packet sisteminin anlatımına geçelim şimdi. Burada direk fonksiyonu vermeyeceğim.
Sadece size nereye hangi packeti ekleyeceğiniz, neden eklemek zorundasınız gibisinden packet yapılarını felan vericem.
x) Database tarafına WING_DATA isminde yeni tablo oluşturuyorsunuz.
Sütun bilgileri;
Num - int
Name - varchar(20)
Grade - tinyint
Açıklamasını söyle yapayım. Num diye vereceğiniz değer pet slotuna takacağınız itemin numarası. Name değerini server dosyaları okumuyor siz oraya not alın diye açtırdım.
Örnek Dragon Wing tarzında. Grade dediğimiz ise sizin altta verdiğim patchte yazacak olan grade numaranızdır ona da örnek olarak 6 diyebiliriz.
Ardından bu tablomuzu Gameserver'a okutuyoruz.
x) User.h içine yeni bir uint8 değeri atıyoruz. m_WingGrade isminde.
User.cpp içinde Initialize() fonksiyonuna m_WingGrade = 0; ekliyoruz.
x) WIZ_MYINFO packetinin yani SendMyInfo() fonksiyonun içerisinde clan packetlerinin başında Karakterin Inventorysinden pet slotu yani CWING buda 5. slota denk geliyor onun bilgilerini çekiyoruz. Bizim WING_DATA tablomunuzu çektiğimiz array içerisinden pet slotundaki kanat itemini çekiyoruz. Eğer böyle bi değer tabloda var ise m_WingGrade değerimizi arrayden aldığımız veriye esitliyoruz. Yani m_WingGrade oluyor size WING_DATA tablosundaki Grade sütunundaki değere eşit.
Not : Devam edeceğim ilk önce sunu söyleyeyim eğer sendmyinfo fonksiyonunu yapmazsanız karakter oyuna girişte pet slotunda kanat varsa kanatı göremez.
Daha sonra ordaki eğer clanı yoksa diye gönderilen boş packet aşağıdaki gibi olacaktır.
x) Şimdi gelelim itemi taktığımızda ve çıkardığımız olacak işlemlere ItemMove fonksiyonunun içine itemi taktığımız yere sizde isimleri neydi cidden unuttum bende öyle bi fonksiyon ismi bile yok. Neyse item taktığınız yere ilk slotun yani sürüklemekte olduğunuz slotun numarasını WING_DATA arrayinde aratıyorsunuz. Eğer tabloda böyle bi item numarası varsa kanatı takabiliyor. Oraya nation kontrolü ekliyoruz. Human Karus kanatları farklı sonuçta eğer takabiliyorsa m_WingGrade değişkenine arrayden gelen veriyi atıyoruz. Fonksiyonun içersinde devam edip oraya Clan packetlerini gönderiyoruz.
Bunun tam ters işlemini de itemi çıkarttığında yapıyorsunuz.
Clan packetlerini ters göndericeksiniz.
x) Şimdi gelelim son noktamıza yukarda verdiğim WIZ_MYINFO örneğinin aynısını WIZ_USER_INOUT packetine yani GetUserInfo fonksiyonunun içerisine yazıyorsunuz.
Onu da söyle açıklayayım yukardaki packet ile birebir aynı zaten yapacağınız şey eğer clanı varsa ise şu packet yok ise şu packeti göndericeksiniz ama içerisinde Knights->Grade yerine m_WingGrade byte değerini packete ekleyeceksiniz.
3) Vereceğim patchi client içine attığınızda herşey bitecektir. Zaten ortalıkta dolaşan kanat dosyaları bana ait olduğu için onları da kullanabilirsiniz.
Patch içerisinde Note.txt bulunmaktadır onu okuyarak işlem yaparsınız.