İçeriğe geç
Türkiye'nin SRO tanıtım & topluluk platformu

vSro Paylaşım [Joymax Ağ Protokolü] Sunucudan İstemciye Olay Paketleri (0x3000 - 0x4FFF): Entity Spawn ve Karakter Verisi

Cevaplar0
Görüntüleme6
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ü] Sunucudan İstemciye Olay Paketleri (0x3000 - 0x4FFF): Entity Spawn ve Karakter Verisi

Silkroad Online protokolünün en karmaşık, en büyük ve en yüksek veri yoğunluğuna sahip bölümü `0x3000 - 0x4FFF` sayısal aralığıdır. Bu aralık, sunucunun istemciye gönderdiği asenkron olay (unsolicited event), durum güncellemesi ve dünya senkronizasyon mesajlarına tahsis edilmiştir. İstemci bu paketleri doğrudan talep etmez; sunucudaki GameServer nesne yöneticisi (CObjectManager) ve hücre ızgarası (Cell Grid), bir varlık görüş alanına girdiğinde, durum değiştirdiğinde veya dünyada bir olay tetiklendiğinde bu paketleri istemciye yayınlar (broadcast).

Bu teknik monografide, protokolün en devasa veri yapısı olan `0x3013 SERVER_CHARACTER_DATA`, polimorfik dallanma mimarisine sahip `0x3015 SERVER_ENTITY_SPAWN` ve büyük veri bloklarının bölünerek taşınmasını sağlayan çok parçalı (multi-part) çerçeveleme protokolü derinlemesine incelenmektedir.


1. Çok Parçalı Çerçeveleme (Multi-Part Framing) Mimarisi

Joymax ikili protokolünde tek bir TCP paketinin taşıyabileceği azami gövde boyutu 4096 bayttır. Ancak bir oyuncu oyuna ilk girdiğinde (Spawn anı), üzerinde taşıdığı yüzlerce eşya, stat puanları, mastery seviyeleri, aktif beceriler ve görev kayıtları 4096 baytı aşabilir. Benzer şekilde 7 sayfalı guild kasası (`0x3255`) veya oyuncu kasası (`0x3049`) tek bir pakete sığmaz.

Joymax bu sorunu aşmak için "Çerçeveleyici Opcode Çifti" (Framing Opcode Pair) desenini tasarlamıştır:

Veri TürüBaşlangıç (Begin)Veri Parçası (Chunk)Bitiş (End)İstemci Davranışı
Karakter Ana Verisi0x34A50x30130x34A60x34A6 gelene kadar ekran kararır, render dondurulur; bitince sahne açılır.
Kullanıcı Deposu (Storage)0x30470x30490x3048Kasa UI penceresi kilitlenir; 0x3048 ile slotlar render edilir.
Lonca Deposu (Guild Storage)0x32530x32550x3254Depo eşyaları sayfalanarak alınır ve tampon belleğe yazılır.
Toplu Varlık Doğumu (Group Spawn)0x30170x30190x3018 / 0x3041Toplu canavar/NPC doğuşlarında sahne grafı tek seferde güncellenir.


2. Opcode 0x3013 — SERVER_CHARACTER_DATA Anatomisi

`sro_client.exe` binary'sinde `0x008A6580` handler adresi tarafından karşılanan bu paket, Silkroad'daki en kapsamlı ikili veri bloğudur.

Bileşen Hiyerarşisi:
1. Başlık (Header): Sunucu zaman damgası (`u32`), Model ID (`RefObjID`), Karakter ölçeği (`u8`), Mevcut/Maks Seviye (`u8`), Tecrübe Puanı (`u64`), SP Barı (`u32`), Altın (`u64`), SP Puanı (`u32`), Stat Puanları (`u16`), Berserk Barı (`u8`), Maks HP (`u32`), Maks MP (`u32`), PK Ceza Sayaçları ve PVP Bayrağı (`u8`).
2. Envanter Bloğu: `InventoryCapacity` (`u8`), ardından `ItemCount` adet eşya kaydı. Her eşya slot indeksi ve 36 baytlık ikili ItemData yapısı içerir.
3. Avatar Envanteri: `AvatarCapacity` (`u8`), ardından donatılmış avatar eşyaları.
4. Mastery Bloğu: Bölüm sabiti (`0x01`). Ardından dinamik döngü: her adımda `ReadBool() == true` olduğu sürece `MasteryID (u32)` ve `Level (u8)` okunur.
5. Beceri (Skill) Bloğu: Bölüm sabiti (`0x01`). Ardından dinamik döngü: `ReadBool() == true` oldukça `SkillID (u32)` ve `Enabled (u8)` okunur.
6. Görev (Quest) Bloğu: Tamamlanmış ve aktif görevlerin ilerleme sayaçları.
7. Dünya Durumu & Konum: Benzersiz dünya kimliği (`UniqueID - u32`), Bölge (`RegionID - u16`), Konum vektörü (`PosX, PosY, PosZ - f32`), Açı (`Angle - u16`), Hareket hedef vektörü (`DestRegion, DestX, DestY, DestZ`), Yaşam durumu (`LifeState`) ve Hareket durumu (`MotionState`).


3. Opcode 0x3015 — SERVER_ENTITY_SPAWN Polimorfik Ayrıştırma

`0x3015` paketi tek bir sabit struct değildir; Joymax nesne yönelimli motorunun (C++ sınıf hiyerarşisi) ağ üzerindeki polimorfik temsilidir. İstemci, paketin ilk 4 baytındaki `RefObjID` değerine bakarak nesne türünü saptar ve dallanır (Branching).

Dal (Branch)Belirleyici KriterÖzel Alanlar ve Taşınan Veriler
isSkillZoneEntityTypeCode == 0x0054 (Alan Becerisi)SkillID, UniqueID, Bölge, PosX/Y/Z, Açı. Büyü dairesi veya zehir alanı efekti oluşturur.
isPlayerType.ID1 == 1 && Type.ID2 == 1Ölçek, BerserkSeviyesi, PVPCape, Donatılmış Eşyalar (RefItemID + Plus), Avatarlar, Maske (Transform), İsim, Job Ünvanı, Guild, Union, Tezgah Başlığı.
isMonster / isNPCType.ID1 == 1 && Type.ID2 == 2Nadirik/Rarity bayrağı (Normal, Champion, Unique, Giant), Konum, Hız, Aktif Buff'lar.
isFortressStructisNPC && Fortress YapısıMevcut HP, Maks HP, Kapı durumu (Açık/Kapalı), Savunma bayrakları.
isItem / isDropType.ID1 == 3 (Yerdeki Eşya/Kutu)RefItemID, Drop UniqueID, Bölge, Koordinat, Sahip Oyuncu ID (Drop koruması süresince).


4. İkili Kod Kanıtları ve C++ Bellek 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. Geliştirici ve Özel Sunucu (vSRO) Notları

1. Entity Spawn Sıralaması: Bir oyuncu ışınlandığında veya hücre değiştirdiğinde sunucu önce çevre arazi ve statik objeleri hazırlar, ardından `0x3015` ile mob ve oyuncuları gönderir. İstemci henüz karakter verisini (`0x34A6`) almadan gelen `0x3015` paketlerini kuyruğa (spawn queue) almak zorundadır.
2. Drop Koruması (0x304D): Yerdeki kutu veya eşyanın sahibi dışındaki oyuncular tarafından alınabilmesi (unlocked), `0x304D SERVER_DROP_UNLOCKED` paketiyle istemcilere bildirilir. Bu paket gelmeden gönderilen `0x7034` toplama isteği sunucu tarafından anında reddedilir.
3. Despawn Senkronizasyonu (0x3016): Görüş alanından çıkan bir varlığın istemci hafızasından (`CObjectManager`) silinmesi gecikirse "hayalet karakter" (ghost entity) görsel hatası meydana gelir.

🙏 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!
 

Konuyu görüntüleyenler

Yükleniyor...
Yükleniyor...
Şu anda sitemizde 18,005 Aktif Kullanıcı
Çevrimiçi üyeler
Konular 1,209
Mesajlar 4,051
Kullanıcılar 1,597
Son üye serkankacan
Geri
Üst