OYUN GÜNDEMİ

Metin2 Extended Affect Flags Rehberi: Affect Flag Limiti 96’ya Nasıl Çıkarılır?

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.

unnamed-file-2 Metin2 Extended Affect Flags Rehberi: Affect Flag Limiti 96’ya Nasıl Çıkarılır?

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.

AlanEski YapıYeni Yapı
Affect Flag DWORDDWORD bits[2]DWORD bits[3]
Toplam Bit6496
Server PacketdwAffectFlag[2]dwAffectFlag[3]
Client ContainerBIT_SIZE = 64BIT_SIZE = 96

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; } #endif

Atama 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]; #endif

Karşı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]; #endif

Server 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); #endif

char.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]; #endif

Server 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]; #endif

Server 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_FLAG

Client 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, #endif

Client 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]); #endif

Aynı 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]); #endif

CPythonNetworkStream::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]); #endif

Aynı 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]); #endif

Affect 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ş :

Bu Kategoriden

Mmooyun Büyüyor: Metin2 Geliştirici Platformumuz dev.mmooyun Açıldı! 29.03.2026 mmooyun Rehberleri, Metin2 İçerikleri, Oyun Haberleri ve Teknoloji 14.03.2026
Okuma Önerisi

Benzer rehberlere ve güncel oyun içeriklerine göz atabilirsin.

Okumaya Devam Et

Subnautica 2'de derin deniz keşiflerini mümkün kılan Modification Station ve araç modüllerinin üretim paneli. Subnautica 2 Modification Station Rehberi: Araç Yükseltmeleri ve Celestine Tarımı 19.05.2026 Subnautica 2 Biomod yetenek listesindeki en güçlü siber-biyolojik gen mutasyonları ve hücre paneli gösterimi. Subnautica 2 En İyi Yetenekler Tier List: En Güçlü Biomod Seçimleri 19.05.2026 Subnautica 2 Feedback Resonator yükseltmesini açmak için Root Canyon biyomunda taranması gereken antik laboratuvar kalıntıları. Subnautica 2 Feedback Resonator Nasıl Alınır? Root Canyon ve Tarama Rehberi 19.05.2026 Subnautica 2 Power Center ana salonunda yer alan ve dördüncü Angel Comb ile kilitleri açılan devasa uzaylı türbini. Subnautica 2 Power Center Türbini Nasıl Çalıştırılır? Alien Ruins Bulmaca Rehberi 19.05.2026

Hızlı Geçiş

Rehber Haber Önizleme Mobil Oyun