Metin2 Unknown Packet Header hatası, özellikle source üzerinde yeni sistem ekleyen veya packet yapısında değişiklik yapan geliştiricilerin sık karşılaştığı problemlerden biridir. Bu hata genellikle client ile server arasında gönderilen verinin iki taraf tarafından aynı şekilde anlaşılmamasından kaynaklanır. Yani sorun çoğu zaman tek bir satırdan değil, packet ID, struct boyutu, sequence ayarı veya eksik gönderilen veri gibi küçük ama kritik farklardan doğar.

Metin2 packet sistemi, client ve server arasındaki iletişimin temelini oluşturur. Oyuncunun hareket etmesi, saldırması, item kullanması, login olması, NPC ile konuşması veya bir sistem penceresini açması gibi birçok işlem packet üzerinden gerçekleşir. Bu yüzden packet tarafında yapılan en küçük uyumsuzluk bile oyunda Unknown packet header, SEQUENCE mismatch, client crash veya veri işlenememesi gibi sonuçlar doğurabilir.
Metin2 Unknown Packet Header Hatası Nedir?
Metin2 Unknown Packet Header hatası, client veya server tarafının gelen packet ID değerini tanıyamaması durumunda ortaya çıkar. Metin2’de her packet genellikle BYTE bId ile başlar. Bu ID, paketin ne amaçla gönderildiğini belirtir. Örneğin login, saldırı, hareket, chat veya özel sistemler için ayrı packet ID değerleri bulunur.
Client bir packet gönderdiğinde server bu ID’ye bakarak hangi işlemi çalıştıracağını anlar. Aynı şekilde server client’a veri gönderdiğinde client da bu header üzerinden hangi fonksiyonu tetikleyeceğini belirler. Eğer gelen header, packet map veya network phase tarafında tanımlı değilse sistem “Unknown packet header” şeklinde hata verir.
Bu hata bazen gerçekten eksik packet tanımından kaynaklanır. Ancak çoğu zaman asıl sebep packet boyutunun uyuşmamasıdır. Örneğin server 20 byte beklerken client 19 byte gönderirse, sıradaki byte yanlışlıkla yeni header gibi okunabilir. Bu durumda görünen header hatası aslında bir önceki packetin eksik veya fazla okunmasından kaynaklanır.
Teknik Not
Unknown packet header her zaman “bu packet hiç eklenmemiş” anlamına gelmez. Çoğu zaman bir önceki packet yanlış boyutta gönderildiği veya okunduğu için veri akışı kayar.
Metin2 Packet Sistemi Nasıl Çalışır?
Metin2’de packet, client ile server arasında taşınan bilgi paketidir. Oyuncu boşluk tuşuna basıp saldırı yaptığında client server’a saldırı bilgisini gönderir. Server bu bilgiyi işler, hedefi, mesafeyi, saldırı durumunu ve sonucu kontrol eder. Ardından gerekirse client’a yeni bir packet göndererek sonucu bildirir.
Packetler genellikle Packet.h içinde tanımlanır. Hem client tarafında hem de server tarafında aynı packet ID ve struct yapısının bulunması gerekir. Eğer client tarafındaki struct ile server tarafındaki struct farklıysa, hata kaçınılmazdır. Bu nedenle source düzenlerken iki taraftaki Packet.h dosyalarının birebir uyumlu olması kritik öneme sahiptir.
Packet isimlendirmesinde kullanılan bazı kısaltmalar da geliştiriciye yön verir. CG client’tan game server’a giden packetleri, GC game server’dan client’a dönen packetleri, GG ise game core’ları arasındaki P2P iletişim packetlerini ifade eder.
Static ve Dynamic Packet Farkı
Metin2 Unknown Packet Header hatasını analiz ederken static ve dynamic packet farkını bilmek önemlidir. Static packetler sabit boyuta sahiptir. Yani struct boyutu bellidir ve her gönderimde aynı uzunlukta veri taşır. Bu tür packetlerde client ve server tarafındaki struct birebir aynı olmak zorundadır.
Dynamic packetler ise ek veri uzunluğu taşıyabilir. Bu tip packetlerde genellikle WORD türünde bir length alanı bulunur. Bu length değeri, paketin toplam boyutunu veya ek veri kısmının uzunluğunu belirtir. Eğer length yanlış hesaplanırsa server paketin eksik veya fazla kısmını okuyabilir.
Dynamic packetlerde yapılan hatalar genellikle daha zor yakalanır. Çünkü header doğru olabilir, struct başlangıcı doğru olabilir; ancak ek veri uzunluğu hatalıysa sonraki packetin başlangıcı kayabilir. Bu da bir sonraki packet için Unknown packet header hatası oluşturabilir.
Static Packet
Sabit struct boyutu kullanır. Client ve server tarafında birebir aynı tanımlanmalıdır.
Dynamic Packet
Ek length alanı kullanır. Yanlış uzunluk hesabı veri akışını bozabilir.
Sequence System Nedir?
Sequence system, daha yeni Metin2 client yapılarında kullanılan ek bir güvenlik ve doğrulama sistemidir. Temel mantık, client’ın bazı packetlerden sonra ekstra sequence verisi göndermesi ve server’ın bu veriyi kontrol etmesidir. Eğer sequence değeri beklenenle uyuşmazsa oyuncu oyundan atılabilir.
Bu sistem packet akışının doğru ilerleyip ilerlemediğini kontrol etmek için kullanışlıdır. Ancak packet eklerken veya mevcut packetleri değiştirirken sequence ayarları doğru yapılmazsa SEQUENCE mismatch hataları oluşabilir. Bu hata genellikle SendSequence() çağrısının unutulması veya packet_info tarafındaki true/false ayarının client ile uyuşmaması nedeniyle görülür.
Sequence mismatch bazen doğrudan sequence ayarından değil, yine packet boyutu uyumsuzluğundan kaynaklanır. Server, packet verisinin bir kısmını sequence verisi sanabilir. Bu yüzden sequence hatası gördüğünüzde yalnızca sequence çağrısına değil, packet struct boyutuna da bakmanız gerekir.
Sequence Hatasında İlk Kontrol
Packet sequence kullanıyorsa client tarafında SendSequence çağrısı var mı, server packet_info tarafında ilgili true/false değeri doğru mu ve struct boyutları birebir aynı mı mutlaka kontrol edilmelidir.
Unknown Packet Header Hatası Nasıl Okunur?
Hata genellikle şu mantıkta görünür: Unknown packet header: XXX, last: YYY ZZZ. Burada XXX, client veya server’ın tanıyamadığı packet header değeridir. YYY ve ZZZ ise bu hatadan önce gönderilen son iki packet bilgisidir.
Bu son iki packet değeri çok önemlidir. Çünkü hata çoğu zaman XXX packetinden değil, ondan önce gönderilen packetlerden kaynaklanır. Özellikle son gönderilen packetlerden biri eksik byte göndermiş veya server tarafında eksik okunmuşsa, sıradaki veri yanlış header gibi algılanabilir.
Bu yüzden logdaki “last” değerlerini takip etmek gerekir. Hangi aksiyonda hata oluşuyor? Space tuşuna basınca mı? NPC’ye tıklayınca mı? Pencere açınca mı? Item kullanınca mı? Hatanın tetiklendiği aksiyon, ilgili client ve server fonksiyonlarını bulmanızı sağlar.
| Log Parçası | Anlamı |
|---|---|
| XXX | Tanınamayan packet header değeri. |
| YYY | Hatadan önce gönderilen packetlerden biri. |
| ZZZ | Hatadan hemen önceki diğer packet bilgisi. |
En Yaygın Sebep: Packet Size Mismatch
Metin2 Unknown Packet Header hatalarının en yaygın nedeni packet size mismatch durumudur. Client ve server aynı packet için farklı struct boyutu kullanıyorsa, veri akışı bozulur. Örneğin client struct içine yeni bir alan ekledi ama server tarafında aynı alan eklenmedi. Bu durumda client daha fazla veri gönderir, server daha azını okur ve kalan byte sıradaki packet gibi yorumlanabilir.
Tersi durumda server daha fazla veri beklerken client daha az gönderiyorsa, server sonraki packet verisini önceki packetin devamı sanabilir. Her iki senaryoda da sonuç genellikle bilinmeyen header, sequence mismatch veya işlenemeyen veri hatası olur.
Bu nedenle yeni sistem eklerken UserInterface/Packet.h ve game/src/Packet.h mutlaka birlikte kontrol edilmelidir. Packet ID aynı mı? Struct sırası aynı mı? Veri tipleri aynı mı? Padding veya farklı derleyici davranışı boyutu değiştiriyor mu? Bu sorular cevaplanmadan hata çözülmez.
Packet Size Kontrol Listesi
- Client ve server Packet.h dosyalarında aynı packet ID kullanılıyor mu?
- Struct alanları aynı sırada mı?
- Veri tipleri iki tarafta da aynı mı?
- Dynamic packet length doğru hesaplanıyor mu?
- Client gönderdiği kadar server okuyor mu?
- Server gönderdiği kadar client Recv yapıyor mu?
Client Tarafında Kontrol Edilecek Dosyalar
Client tarafında packet hatalarını çözmek için özellikle PythonNetworkPhaseGame.cpp ve benzeri network phase dosyaları incelenmelidir. Server’dan gelen GC packetleri burada karşılanır. Eğer yeni bir packet eklediyseniz ama client tarafında handler tanımlamadıysanız, oyun gelen veriyi tanıyamaz.
Ayrıca client bir packet gönderiyorsa ilgili fonksiyonda Send() çağrısının doğru yapıldığından emin olun. Dynamic veri gönderiliyorsa önce header, sonra length, sonra ek veri doğru sırada gönderilmelidir. Sequence sistemi kullanılıyorsa SendSequence() unutulmamalıdır.
Client tarafında eksik Recv() çağrısı da ciddi sorundur. Server bir packet içinde ek veri gönderiyorsa client bu veriyi okumak zorundadır. Okumazsa veri buffer’da kalır ve sonraki packet header’ı kayabilir.
Server Tarafında Kontrol Edilecek Dosyalar
Server tarafında en önemli noktalardan biri packet_map.cpp ve input_main gibi packet işleme alanlarıdır. Client’tan gelen CG packetleri burada karşılanır. Yeni packet eklediğinizde server bu packetin header değerini, boyutunu ve işleme fonksiyonunu bilmelidir.
Eğer packet_map içinde packet tanımlanmadıysa server gelen header’ı tanımaz. Eğer tanımlandı ama boyut yanlış girildiyse server veriyi hatalı okur. Sequence kullanılıyorsa packet_info içindeki sequence ayarı client ile aynı mantıkta olmalıdır.
Server tarafındaki input fonksiyonlarında eksik okuma veya fazla okuma olup olmadığı da kontrol edilmeli. Özellikle dynamic packetlerde length kadar veri okunup okunmadığı dikkatle incelenmelidir.
Genel Debug Kontrol Listesi
- Hata hangi aksiyonda oluşuyor?
- Logdaki last packet değerleri hangi işlemle ilişkili?
- Client ve server Packet.h birebir aynı mı?
- packet_map.cpp içinde packet doğru tanımlı mı?
- PythonNetworkPhaseGame tarafında handler mevcut mu?
- Send ve Recv miktarları eşleşiyor mu?
- Sequence ayarı iki tarafta da uyumlu mu?
- Dynamic packet length değeri doğru mu?
PACKETDUMP ve ENABLE_SEQUENCE_SYSTEM Neden Faydalı?
Packet hatalarını çözerken debug araçları büyük kolaylık sağlar. __PACKETDUMP__, gönderilen ve alınan packetleri daha net takip etmeye yardımcı olabilir. Hangi packet hangi sırayla geliyor, hangi header’dan sonra hata oluşuyor, buffer nerede kayıyor gibi sorulara daha hızlı cevap verir.
ENABLE_SEQUENCE_SYSTEM ise sequence kontrolünü aktif kullanan yapılarda hatanın nereden geldiğini anlamak için önemlidir. Sequence mismatch gördüğünüzde sistemin gerçekten sequence hatası mı verdiğini, yoksa packet boyutu kayması nedeniyle mi sequence verisini yanlış okuduğunu ayırt etmeniz gerekir.
Bu araçlar tek başına çözüm değildir, ancak doğru yerde bakmanızı sağlar. Metin2 packet hatalarında en zor kısım genellikle sorunun kaynağını bulmaktır. Log ve dump bilgisi, bu süreci ciddi şekilde kısaltır.
Metin2 source geliştirme, packet sistemleri ve C++ hata çözümleri için MMOoyun teknoloji kategorisini takip edebilirsiniz. Metin2 PvP ve oyun geliştirme rehberleri için rehber kategorisine de göz atabilirsiniz.
Genel Değerlendirme
Metin2 Unknown Packet Header ve sequence mismatch hataları, çoğunlukla client ile server arasında packet tanımı, boyutu veya okuma-yazma sırası uyuşmadığında ortaya çıkar. Bu hataları çözmek için rastgele kod kopyalamak yerine hangi packetin, hangi aksiyonda, hangi sırada bozulduğunu takip etmek gerekir.
En doğru yaklaşım; Packet.h dosyalarını karşılaştırmak, packet_map ve network phase tanımlarını kontrol etmek, Send/Recv miktarlarını doğrulamak ve sequence ayarlarını iki tarafta da uyumlu hale getirmektir. Unknown packet header hatası korkutucu görünse de, doğru log okuma ve sistemli kontrolle genellikle kaynağı bulunabilen bir problemdir.
Daha Fazla Oyun Icerigi
Rehber, haber, onizleme ve oyun dunyasina dair daha fazla icerige mmooyun.com sitemizden ulasabilirsiniz. Ek icerikler ve oyun odakli guncel paylasimlar icin dev.mmooyun.com adresini de ziyaret edebilirsiniz.
Paylaş :









