Metin2 Extended Affect Flags rehberi, Metin2 source üzerinde affect flag limitini 64 bitten 96 bite çıkarmak isteyen geliştiriciler için hazırlandı. Varsayılan sistemde affect flag verisi iki adet DWORD üzerinden taşındığı için toplam 64 flag alanı bulunur. Yeni efekt, buff, görünüm durumu veya özel sistemler eklemek isteyen projelerde bu limit zamanla yetersiz hale gelebilir.

Bu düzenleme ile hem server hem client tarafında affect flag dizileri 2 DWORD yerine 3 DWORD olacak şekilde genişletilir. Böylece 64 yerine 96 affect flag kullanılabilir. Ancak işlem packet yapısını etkilediği için yalnızca server tarafına veya yalnızca client tarafına uygulanmamalıdır. İki tarafın da aynı yapıyı okuması gerekir.
Kısa Bilgi
Bu işlem affect flag limitini 64’ten 96’ya çıkarır. Server packet yapısı, client packet yapısı ve affect flag container boyutu birlikte güncellenmelidir.
Metin2 Extended Affect Flags Rehberi: Sistem Ne İşe Yarar?
Metin2 Extended Affect Flags rehberi kapsamındaki düzenleme, karakter üzerindeki affect durumlarını daha geniş bir alanda tutmanızı sağlar. Metin2’de zehir, stun, görünmezlik, hız potu, özel bufflar, savaş alanı işaretleri, elemental bufflar ve benzeri pek çok durum affect flag üzerinden taşınır.
Varsayılan yapıda 2 adet DWORD kullanıldığı için 32 + 32 toplam 64 flag alanı vardır. Bu rehberde üçüncü DWORD eklenir ve limit 96’ya çıkarılır. Bu sayede yeni affect enum değerleri için daha fazla alan açılır.
Dikkat Edilmesi Gerekenler
Bu işlem packet boyutunu etkiler. Server ve client aynı anda güncellenmezse karakter spawn, update veya affect görünümünde uyumsuzluk yaşanabilir.
Server Tarafı: common/service.h Düzenlemesi
İlk olarak server tarafında sistemi aktif edecek define eklenir. Bu define, ilgili kod bloklarının şartlı olarak 3 DWORD yapısını kullanmasını sağlar.
// common/service.h #define __EXTENDED_AFFECT_FLAG__Server Tarafı: game/src/affect_flag.h Düzenlemesi
TAffectFlag yapısı varsayılan olarak iki DWORD kullanır. Bu alan 3 DWORD olacak şekilde genişletilir. Ayrıca constructor, atama ve karşılaştırma işlemleri de üçüncü DWORD’u kapsayacak şekilde güncellenir.
Önce aşağıdaki eski yapıyı bulun:
DWORD bits[2]; inline TAffectFlag() { bits[0] = 0; bits[1] = 0; } inline TAffectFlag(DWORD v1, DWORD v2 = 0) { bits[0] = v1; bits[1] = v2; }Bu kısmı aşağıdaki şartlı yapı ile değiştirin:
#if defined(__EXTENDED_AFFECT_FLAG__) DWORD bits[3]; inline TAffectFlag() { bits[0] = 0; bits[1] = 0; bits[2] = 0; } inline TAffectFlag(DWORD v1, DWORD v2 = 0, DWORD v3 = 0) { bits[0] = v1; bits[1] = v2; bits[2] = v3; } #else DWORD bits[2]; inline TAffectFlag() { bits[0] = 0; bits[1] = 0; } inline TAffectFlag(DWORD v1, DWORD v2 = 0) { bits[0] = v1; bits[1] = v2; } #endifAtama işlemi yapılan yerde aşağıdaki satırları bulun:
bits[0] = rhs.bits[0]; bits[1] = rhs.bits[1];Altına üçüncü DWORD kopyasını ekleyin:
#if defined(__EXTENDED_AFFECT_FLAG__) bits[2] = rhs.bits[2]; #endifKarşılaştırma satırını bulun:
return lhs.bits[0] == rhs.bits[0] && lhs.bits[1] == rhs.bits[1];Bunu aşağıdaki yapıyla değiştirin:
#if defined(__EXTENDED_AFFECT_FLAG__) return lhs.bits[0] == rhs.bits[0] && lhs.bits[1] == rhs.bits[1] && lhs.bits[2] == rhs.bits[2]; #else return lhs.bits[0] == rhs.bits[0] && lhs.bits[1] == rhs.bits[1]; #endifServer Tarafı: building.cpp ve char.cpp Packet Aktarımı
Packet içine üçüncü affect flag değerinin de yazılması gerekir. Önce building.cpp içinde CObject::EncodeInsertPacket bölümünü güncelleyin.
Şu satırları bulun:
pack.dwAffectFlag[0] = unsigned(m_data.xRot); pack.dwAffectFlag[1] = unsigned(m_data.yRot);Altına ekleyin:
#if defined(__EXTENDED_AFFECT_FLAG__) pack.dwAffectFlag[2] = unsigned(m_data.zRot); #endifchar.cpp içinde CHARACTER::EncodeInsertPacket ve CHARACTER::UpdatePacket alanlarında şu satırları bulun:
pack.dwAffectFlag[0] = m_afAffectFlag.bits[0]; pack.dwAffectFlag[1] = m_afAffectFlag.bits[1];Her iki alanda da altına ekleyin:
#if defined(__EXTENDED_AFFECT_FLAG__) pack.dwAffectFlag[2] = m_afAffectFlag.bits[2]; #endifServer Tarafı: game/src/packet.h Düzenlemesi
Server packet yapılarında dwAffectFlag[2] alanları 3 DWORD destekleyecek hale getirilmelidir. Bu işlem packet_add_char ve packet_update_char yapılarında uygulanır.
Eski satır:
DWORD dwAffectFlag[2];Yeni yapı:
#if defined(__EXTENDED_AFFECT_FLAG__) DWORD dwAffectFlag[3]; #else DWORD dwAffectFlag[2]; #endifServer Kontrol Listesi
- service.h içine __EXTENDED_AFFECT_FLAG__ define eklendi mi?
- TAffectFlag bits[3] olacak şekilde güncellendi mi?
- Assignment ve comparison işlemleri bits[2] değerini kapsıyor mu?
- char.cpp packet doldurma alanları üçüncü DWORD’u yazıyor mu?
- packet.h içindeki add/update packetleri dwAffectFlag[3] destekliyor mu?
Client Tarafı: Locale_inc.h Define Ekleme
Client tarafında da aynı sistemin aktif edilmesi gerekir. Bunun için UserInterface/Locale_inc.h içine aşağıdaki define eklenir.
// UserInterface/Locale_inc.h #define ENABLE_EXTENDED_AFFECT_FLAGClient Tarafı: AffectFlagContainer.h BIT_SIZE Güncellemesi
Client tarafındaki affect flag container hâlâ 64 bit kalırsa üçüncü DWORD okunamaz. Bu yüzden BIT_SIZE değeri 96 olacak şekilde şartlı güncellenir.
Eski satır:
BIT_SIZE = 64,Yeni yapı:
#if defined(ENABLE_EXTENDED_AFFECT_FLAG) BIT_SIZE = 96, #else BIT_SIZE = 64, #endifClient Tarafı: Packet.h Düzenlemesi
Client packet yapılarında da server ile aynı şekilde dwAffectFlag[3] desteği eklenmelidir. Bu değişiklik packet_add_char, packet_add_char2, packet_update_char ve packet_update_char2 yapılarında yapılmalıdır.
Eski satır:
DWORD dwAffectFlag[2];Yeni yapı:
#if defined(ENABLE_EXTENDED_AFFECT_FLAG) DWORD dwAffectFlag[3]; #else DWORD dwAffectFlag[2]; #endifÖnemli Not
Client Packet.h ve server packet.h aynı mantıkta güncellenmelidir. Aksi halde network packet boyutu farklılaşır ve karakter verisi yanlış okunabilir.
Client Tarafı: PythonNetworkStreamPhaseGameActor.cpp
Client, karakter append ve update packetlerini okurken üçüncü affect flag DWORD’unu container içine kopyalamalıdır. Varsayılan yapıda bits[0] ve bits[1] okunur. Extended yapı için bits[2], offset 64 üzerinden kopyalanır.
CPythonNetworkStream::RecvCharacterAppendPacket içinde şu satırı bulun:
kNetActorData.m_kAffectFlags.CopyData(32, sizeof(chrAddPacket.dwAffectFlag[1]), &chrAddPacket.dwAffectFlag[1]);Altına ekleyin:
#if defined(ENABLE_EXTENDED_AFFECT_FLAG) kNetActorData.m_kAffectFlags.CopyData(64, sizeof(chrAddPacket.dwAffectFlag[2]), &chrAddPacket.dwAffectFlag[2]); #endifAynı ekleme CPythonNetworkStream::RecvCharacterAppendPacketNew için de yapılmalıdır:
#if defined(ENABLE_EXTENDED_AFFECT_FLAG) kNetActorData.m_kAffectFlags.CopyData(64, sizeof(chrAddPacket.dwAffectFlag[2]), &chrAddPacket.dwAffectFlag[2]); #endifCPythonNetworkStream::RecvCharacterUpdatePacket içinde şu satırı bulun:
kNetUpdateActorData.m_kAffectFlags.CopyData(32, sizeof(chrUpdatePacket.dwAffectFlag[1]), &chrUpdatePacket.dwAffectFlag[1]);Altına ekleyin:
#if defined(ENABLE_EXTENDED_AFFECT_FLAG) kNetUpdateActorData.m_kAffectFlags.CopyData(64, sizeof(chrUpdatePacket.dwAffectFlag[2]), &chrUpdatePacket.dwAffectFlag[2]); #endifAynı ekleme CPythonNetworkStream::RecvCharacterUpdatePacketNew için de yapılmalıdır:
#if defined(ENABLE_EXTENDED_AFFECT_FLAG) kNetUpdateActorData.m_kAffectFlags.CopyData(64, sizeof(chrUpdatePacket.dwAffectFlag[2]), &chrUpdatePacket.dwAffectFlag[2]); #endifAffect Enum Alanı İçin Örnek Kullanım
Genişletme sonrası enum tarafında 64 üzeri affect flag değerleri kullanılabilir hale gelir. Aşağıdaki örnek, 64 sonrası elemental buff ve özel flag alanlarının nasıl devam ettirilebileceğini gösterir. Projenizde enum sırası ve mevcut sistemleriniz farklıysa, kendi source yapınıza göre kontrol etmelisiniz.
enum EAffectBits { AFFECT_YMIR, AFFECT_INVISIBILITY, AFFECT_SPAWN, AFFECT_POISON, AFFECT_SLOW, AFFECT_STUN, AFFECT_DUNGEON_READY, AFFECT_SHOW_ALWAYS, AFFECT_BUILDING_CONSTRUCTION_SMALL, AFFECT_BUILDING_CONSTRUCTION_LARGE, AFFECT_BUILDING_UPGRADE, AFFECT_MOV_SPEED_POTION, AFFECT_ATT_SPEED_POTION, AFFECT_FISH_MIND, AFFECT_JEONGWI, AFFECT_GEOMGYEONG, AFFECT_CHEONGEUN, AFFECT_GYEONGGONG, AFFECT_EUNHYEONG, AFFECT_GWIGEOM, AFFECT_GONGPO, AFFECT_JUMAGAP, AFFECT_HOSIN, AFFECT_BOHO, AFFECT_KWAESOK, AFFECT_HEUKSIN, AFFECT_MUYEONG, AFFECT_REVIVE_INVISIBILITY, AFFECT_FIRE, AFFECT_GICHEON, AFFECT_JEUNGRYEOK, AFFECT_DASH, AFFECT_PABEOP, AFFECT_FALLEN_CHEONGEUN, AFFECT_POLYMORPH, AFFECT_WAR_FLAG1, AFFECT_WAR_FLAG2, AFFECT_WAR_FLAG3, AFFECT_CHINA_FIREWORK, AFFECT_CANNOT_ATTACK, AFFECT_CANNOT_USE_SKILL, AFFECT_DS, AFFECT_BLEEDING, AFFECT_RED_POSSESSION, AFFECT_BLUE_POSSESSION, AFFECT_UNK45, AFFECT_UNK46, AFFECT_UNBEATABLE, AFFECT_BATTLE_FIELD_RANK1, AFFECT_BATTLE_FIELD_RANK2, AFFECT_BATTLE_FIELD_RANK3, AFFECT_TARGET_VICTIM, AFFECT_UNK52, AFFECT_ELECTRIC_SHOCK, AFFECT_CONFUSION, AFFECT_SOUL_RED, AFFECT_SOUL_BLUE, AFFECT_SOUL_MIX, AFFECT_UNK58, AFFECT_BATTLE_ROYALE_SLOW_1, AFFECT_BATTLE_ROYALE_SLOW_2, AFFECT_BATTLE_ROYALE_SLOW_3, AFFECT_UNK62, AFFECT_PASWAE, AFFECT_UNK64, AFFECT_FLAG_ELEMENT_BUFF_CRACK_NONE, AFFECT_FLAG_ELEMENT_BUFF_CRACK_FIRE, AFFECT_FLAG_ELEMENT_BUFF_CRACK_ICE, AFFECT_FLAG_ELEMENT_BUFF_CRACK_ELECT, AFFECT_FLAG_ELEMENT_BUFF_CRACK_WIND, AFFECT_FLAG_ELEMENT_BUFF_CRACK_EARTH, AFFECT_FLAG_ELEMENT_BUFF_CRACK_DARK, AFFECT_FLAG_UNK72, AFFECT_FLAG_UNK73, AFFECT_FLAG_UNK74, AFFECT_FLAG_UNK75, AFFECT_FLAG_UNK76, AFFECT_FLAG_UNK77, AFFECT_FLAG_UNK78, AFFECT_FLAG_UNK79, AFFECT_CHEONUN_INVINCIBILITY, AFFECT_CHEONUN_NORMAL, AFFECT_CHEONUN_MASTER, AFFECT_CHEONUN_GRAND_MASTER, AFFECT_CHEONUN_PERFECT_MASTER, AFFECT_NUM, AFFECT_HWAYEOM = AFFECT_GEOMGYEONG, };Metin2 Extended Affect Flags Rehberi İçin Test Adımları
Metin2 Extended Affect Flags rehberi uygulandıktan sonra test süreci çok önemlidir. Önce server ve client temiz şekilde derlenmelidir. Ardından karakter giriş, karakter görünümü, mob ve building spawn, affect update ve yeni flag kullanımı tek tek kontrol edilmelidir.
Test sırasında özellikle packet uyumsuzluğu belirtileri aranmalıdır. Karakterlerin görünmemesi, yanlış efektlerin aktif olması, client crash, actor update hataları veya bazı buffların hiç görünmemesi gibi sorunlar packet tarafında eksik düzenleme olduğuna işaret edebilir.
Son Kontrol Listesi
- Server ve client aynı anda güncellendi mi?
- packet_add_char ve packet_update_char yapıları iki tarafta da uyumlu mu?
- Client AffectFlagContainer BIT_SIZE 96 oldu mu?
- PythonNetworkStream tarafında üçüncü DWORD offset 64 ile kopyalanıyor mu?
- Yeni affect enum değerleri 64 üzeri alanlarda doğru çalışıyor mu?
- Oyunda karakter, mob, building ve buff görünümü test edildi mi?
Daha fazla Metin2 source düzenleme ve teknik rehber için MMOoyun.com rehber kategorisini takip edebilirsiniz. Oyun geliştirme ve teknoloji içerikleri için ayrıca teknoloji kategorisine göz atabilirsiniz.
Genel Değerlendirme
Metin2 Extended Affect Flags rehberi, yeni sistemler ve ek buff efektleri geliştirmek isteyen projeler için affect flag alanını genişleten önemli bir source düzenlemesidir. Varsayılan 64 bit sınırını 96 bite çıkarmak, özellikle özel sistemler, elemental bufflar veya yeni karakter durumları ekleyen sunucular için daha rahat çalışma alanı sağlar.
Bu işlem packet ve network yapısına dokunduğu için dikkatli uygulanmalıdır. Server, client, packet yapıları, affect container ve network stream kopyalama adımları eksiksiz tamamlanırsa sistem daha fazla affect flag taşıyabilir hale gelir. Canlı ortama geçmeden önce mutlaka test client ve test server üzerinde kapsamlı deneme yapılmalıdır.
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ş :






