- Ticaret Puanı
- 0
- Katılım
- 19 Ocak 2026
- Mesajlar
- 277
- Tepkime puanı
- 225
- Puanları
- 0
- Web sitesi
- www.youtube.com
- Discord
- ayzekk.
- Mevcut Bakiye
- 4605 ₺
[Joymax Ağ Protokolü] Sunucu Yanıt Paketleri (0xA000 - 0xBFFF): Beceri Yürütme ve Hasar Hesaplama Döngüsü
Joymax ikili ağ protokolünde `0xA000 - 0xBFFF` aralığı, istemcinin başlattığı eylemlere (`0x6000 - 0x7FFF`) sunucunun verdiği resmi onay, ret veya sonuç paketlerine (RPC Responses) tahsis edilmiştir. İstemci ile sunucu arasındaki durum senkronizasyonu bu aralıktaki paketlerle mühürlenir. İstemci yerel tarafta bir animasyonu başlatsa dahi, sunucudan onay paketi gelmediği sürece envanterindeki eşya güncellenmez, can barı düşmez ve beceri hasarı hedefe yansıtılmaz.
Bu monografide, dövüş motorunun kalbi olan `0xB070 SERVER_ENTITY_SKILL_START`, hedef detaylarını taşıyan `0xB045 SERVER_ENTITY_SELECTION`, hareket yankısı `0xB021` ve hasar serileştirme alt yapısı (`DamageData`) incelenmektedir.
1. Deterministik Yanıt Mimarisi ve +0x4000 Eşleşmesi
Joymax mimarisinde sunucu yanıtları, istemci isteklerinin doğrudan fonksiyonel aynasıdır. Her istek opcode'u, sayısal değerine `0x4000` eklenerek sunucu yanıtına dönüştürülür:
2. Opcode 0xB070 — SERVER_ENTITY_SKILL_START ve Hasar Motoru
`sro_client.exe` binary'sinde `0x008A52F0` handler adresi tarafından işlenir. Bu paket, Silkroad'daki savaş mekaniğinin en sofistike veri yapısını barındırır.
Paket Başlığı:**
- `Success` (bool, 1B): Becerinin başarıyla başlatılıp başlatılmadığı. Eğer `false` ise paket sonlanır.
- `CastType` (u8, 1B): `0` = Buff / Güçlendirme, `2` = Saldırı / Attack.
- `AttackIndex` (u8, 1B): Kombo saldırılarında kaçıncı vuruş olduğu (0 = ilk vuruş).
- `SkillID` (u32, 4B): Kullanılan becerinin referans kimliği (`_RefSkill`).
- `SourceUniqueID` (u32, 4B): Beceriyi kullanan oyuncu veya canavar.
- `SkillUniqueID` (u32, 4B): Bu beceri kullanımı için sunucu tarafından atanan oturum kimliği.
- `TargetUniqueID` (u32, 4B): Birincil hedef varlık.
3. DamageData Alt Veri Yapısı ve Alan Etkisi (AOE)
Eğer `CastType == 2` (Saldırı) ise, paket doğrudan `DamageData` yapısını okumaya başlar. Bu yapı tekli veya çoklu (AOE) hedeflere vurulan hasarı, kritik vuruşları, bloklamaları ve geri savrulmaları (KnockBack) tek bir ağ mesajında birleştirir.
4. İkili Kod Kanıtları ve C++ Struct Düzenleri
5. Özel Sunucu ve Bot Geliştiricileri İçin Kritik Kurallar
1. Animasyon ve Ağ Asenkronisi:** Silkroad'da hasar animasyondan önce ağda çözülür. İstemci `0xB070` paketini aldığı anda hedefin canını düşürür; ancak ekrandaki vuruş animasyonu 1-2 saniye sürebilir. Bot geliştirirken karakterin serbest kaldığını anlamak için `0xB070` değil, `0xB071 SERVER_ENTITY_SKILL_END` paketi dinlenmelidir.
2. Ölüm Bayrağı (Effect == 128):** Eğer bir vuruşta `DamageEffect` değeri `128` (0x80) gelirse, hedef o darbeyle ölmüştür ve arkasından hasar baytları okunmaz. Bu kontrolü atlayan paket okuyucular deseralizasyon hatası alarak çöker.
3. Blok ve İptal (Block/Cancel):** `DamageEffect` içinde `Block (0x02)` veya `Cancel (0x08)` bayrakları varsa sunucu hasar değerini (`DamageValue`) pakete yazmaz; çünkü hedef 0 hasar almıştır.
Joymax ikili ağ protokolünde `0xA000 - 0xBFFF` aralığı, istemcinin başlattığı eylemlere (`0x6000 - 0x7FFF`) sunucunun verdiği resmi onay, ret veya sonuç paketlerine (RPC Responses) tahsis edilmiştir. İstemci ile sunucu arasındaki durum senkronizasyonu bu aralıktaki paketlerle mühürlenir. İstemci yerel tarafta bir animasyonu başlatsa dahi, sunucudan onay paketi gelmediği sürece envanterindeki eşya güncellenmez, can barı düşmez ve beceri hasarı hedefe yansıtılmaz.
Bu monografide, dövüş motorunun kalbi olan `0xB070 SERVER_ENTITY_SKILL_START`, hedef detaylarını taşıyan `0xB045 SERVER_ENTITY_SELECTION`, hareket yankısı `0xB021` ve hasar serileştirme alt yapısı (`DamageData`) incelenmektedir.
1. Deterministik Yanıt Mimarisi ve +0x4000 Eşleşmesi
Joymax mimarisinde sunucu yanıtları, istemci isteklerinin doğrudan fonksiyonel aynasıdır. Her istek opcode'u, sayısal değerine `0x4000` eklenerek sunucu yanıtına dönüştürülür:
| İstemci İsteği | Sunucu Yanıtı | Yanıt Veri Formatı | Başarı / Hata Belirteci |
|---|---|---|---|
| 0x6103 (Giriş Talebi) | 0xA103 | Sonuç Kodu (u8) + Hata Kodu / Shard Listesi | 0x01: Başarılı, 0x02: Hatalı Şifre, 0x04: Banlı |
| 0x7001 (Karakter Seçimi) | 0xB001 | Sonuç Kodu (u8) | 0x01: Başarılı (Dünya yüklenir), 0x02: Başarısız |
| 0x7021 (Hareket) | 0xB021 | Sonuç (u32) + hasMovement + Koordinat Echosu | İstemcinin hareket yolunu onaylar ve çevreye yayınlar |
| 0x7034 (Eşya Taşıma) | 0xB034 | Sonuç (u8) + Kaynak Slot + Hedef Slot + Adet | 0x01: Başarılı (Slotlar takas edilir) |
| 0x7045 (Hedef Seçimi) | 0xB045 | UniqueID (u32) + Hedefin HP/MP/Buff Durumu (50 Bayt) | Seçilen varlığın detaylı durum penceresini açar |
| 0x7074 (Beceri Kullanımı) | 0xB070 | Success (bool) + CastType + DamageData Alt Yapısı | Becerinin başladığını ve vurulan hasarı iletir |
2. Opcode 0xB070 — SERVER_ENTITY_SKILL_START ve Hasar Motoru
`sro_client.exe` binary'sinde `0x008A52F0` handler adresi tarafından işlenir. Bu paket, Silkroad'daki savaş mekaniğinin en sofistike veri yapısını barındırır.
Paket Başlığı:**
- `Success` (bool, 1B): Becerinin başarıyla başlatılıp başlatılmadığı. Eğer `false` ise paket sonlanır.
- `CastType` (u8, 1B): `0` = Buff / Güçlendirme, `2` = Saldırı / Attack.
- `AttackIndex` (u8, 1B): Kombo saldırılarında kaçıncı vuruş olduğu (0 = ilk vuruş).
- `SkillID` (u32, 4B): Kullanılan becerinin referans kimliği (`_RefSkill`).
- `SourceUniqueID` (u32, 4B): Beceriyi kullanan oyuncu veya canavar.
- `SkillUniqueID` (u32, 4B): Bu beceri kullanımı için sunucu tarafından atanan oturum kimliği.
- `TargetUniqueID` (u32, 4B): Birincil hedef varlık.
3. DamageData Alt Veri Yapısı ve Alan Etkisi (AOE)
Eğer `CastType == 2` (Saldırı) ise, paket doğrudan `DamageData` yapısını okumaya başlar. Bu yapı tekli veya çoklu (AOE) hedeflere vurulan hasarı, kritik vuruşları, bloklamaları ve geri savrulmaları (KnockBack) tek bir ağ mesajında birleştirir.
| Alan Adı | Veri Tipi | Açıklama |
|---|---|---|
| HasDamage | bool | Hasar verisi var mı? |
| HitCount | uint8_t | Tek seferde vuran darbe adedi |
| TargetCount | uint8_t | Hasar alan toplam hedef sayısı (AOE durumunda > 1) |
| TargetUniqueID | uint32_t | Hasar alan hedef varlık |
| DamageEffect | uint8_t | 1=KnockBack, 2=Block, 4=Position, 8=Cancel, 128=Dead |
| DamageType | uint8_t | 1=Normal, 2=Critical, 4=Status Effect (Zehir/Donma) |
| DamageValue | uint32_t | Hedefe vurulan net hasar miktarı |
| AbsorbedDamage | uint8_t | Kalkan veya buff tarafından emilen hasar oranı |
| ReflectedFlag | uint8_t | Hasar yansıtması (reflect) aktif mi? |
4. İkili Kod Kanıtları ve C++ Struct Düzenleri
Bu gizli bloğun içeriği yalnızca şu üyeler tarafından görülebilir. Bu İçerik Premium Üyelere Özeldir. Engelsiz Tüm Gizli İçerikleri Görmek İçin Premium Üyelik satın alabilirsiniz. Ücretli Üyelikler
5. Özel Sunucu ve Bot Geliştiricileri İçin Kritik Kurallar
1. Animasyon ve Ağ Asenkronisi:** Silkroad'da hasar animasyondan önce ağda çözülür. İstemci `0xB070` paketini aldığı anda hedefin canını düşürür; ancak ekrandaki vuruş animasyonu 1-2 saniye sürebilir. Bot geliştirirken karakterin serbest kaldığını anlamak için `0xB070` değil, `0xB071 SERVER_ENTITY_SKILL_END` paketi dinlenmelidir.
2. Ölüm Bayrağı (Effect == 128):** Eğer bir vuruşta `DamageEffect` değeri `128` (0x80) gelirse, hedef o darbeyle ölmüştür ve arkasından hasar baytları okunmaz. Bu kontrolü atlayan paket okuyucular deseralizasyon hatası alarak çöker.
3. Blok ve İptal (Block/Cancel):** `DamageEffect` içinde `Block (0x02)` veya `Cancel (0x08)` bayrakları varsa sunucu hasar değerini (`DamageValue`) pakete yazmaz; çünkü hedef 0 hasar almıştır.
Silkroad Geliştirici Camiasına Teşekkür ve Saygı
Bu kapsamlı teknik dokümantasyon, tersine mühendislik mimarisi ve protokol analizlerinin gün ışığına çıkmasında Silkroad ekosistemine yıllardır karşılıksız devasa emekler veren ve bu mirası ileriye taşımaya devam eden öncü geliştiricilerimize en içten teşekkürlerimizi sunarız:
DaxterSoul — Paket filtreleme, proxy mimarileri ve sunucu güvenliğindeki temel çalışmaları ve topluluğa kazandırdığı standartlar için,
florian0 — İstemci (Client) ve GameServer ikili (binary) tersine mühendisliği, hook ve assembly düzeyindeki rehber niteliğindeki araştırmaları için,
JellyBitz — Açık kaynak Silkroad araçları, paket analiz kütüphaneleri ve geliştirici ekosistemine sunduğu paha biçilmez açık kaynak yazılımlar için,
ferdoran — İstemci-sunucu protokol analizlerinin, opcode referanslarının ve teknik dokümantasyonun derlenip topluluğa kazandırılmasındaki büyük gayretleri için.
Silkroad geliştirici topluluğuna kattığınız değer, paylaştığınız bilgi birikimi ve sunduğunuz vizyon için sonsuz teşekkürler. İyi ki varsınız!



