Metin2’de küçük ama göze hoş gelen client düzenlemelerinden biri de boss isimlerini normal moblardan farklı renkte göstermektir. Oyuncu açısından da işe yarıyor aslında, çünkü kalabalık slotlarda veya event bölgelerinde boss’u ayırt etmek daha kolay oluyor. Özellikle metin, boss ve normal mobların iç içe olduğu haritalarda bu tarz ufak görsel düzenlemeler oyunu daha okunabilir hale getiriyor.

Bu paylaşımda boss rankına sahip canavarların isim rengini ayrı bir renk olarak tanımlayacağız. Sistem client taraflı çalışıyor, yani server source ile uğraşmadan sadece client dosyaları üzerinden düzenleme yapılacak.
Yapılacak İşlem
Düzenleme yapılacak ana bölümler şunlar:
Client/UserInterface
Client/root
UserInterface tarafında boss için yeni bir name color index tanımlıyoruz. Root tarafında ise bu index’e karşılık gelecek RGB rengini ekliyoruz.
Locale_inc.h Düzenlemesi
Öncelikle şu dosyayı açıyoruz:
Client/UserInterface/Locale_inc.h
Dosyanın uygun bir yerine şu define eklenir:
#define ELISIA_BOSS_NAMECOLOR
Bu define sayesinde boss isim rengi sistemi aktif/pasif kontrol edilebilir hale geliyor. İleride kaldırmak isterseniz sistemi komple silmek yerine bu define üzerinden kapatabilirsiniz.
InstanceBase.h Düzenlemesi
Şimdi şu dosyayı açıyoruz:
Client/UserInterface/InstanceBase.h
Şu satırı bulun:
NAMECOLOR_WAYPOINT,
Altına ekleyin:
#ifdef ELISIA_BOSS_NAMECOLOR
NAMECOLOR_BOSS,
#endif
Ardından yine aynı dosyada şu satırı bulun:
BOOL IsStone();
Altına ekleyin:
BOOL IsBoss();
Burada client’a yeni bir kontrol eklemiş oluyoruz. Yani oyun artık bir yaratığın boss olup olmadığını IsBoss() fonksiyonu ile anlayabilecek.
InstanceBase.cpp Düzenlemesi
Şimdi şu dosyayı açıyoruz:
Client/UserInterface/InstanceBase.cpp
Şu fonksiyonu bulun:
BOOL CInstanceBase::IsStone()
{
return m_GraphicThingInstance.IsStone();
}
Altına ekleyin:
BOOL CInstanceBase::IsBoss()
{
const CPythonNonPlayer::TMobTable* pkTab = CPythonNonPlayer::Instance().GetTable(GetRace()); if (pkTab != nullptr)
{
if (pkTab->bRank >= 4 && !IsStone() && pkTab->bType == 0)
return TRUE;
} return FALSE;
}
Burada mantık şu: Mob tablosundan yaratığın bilgisi alınıyor. Eğer rank değeri boss seviyesindeyse, taş değilse ve mob tipi uygunsa boss olarak kabul ediliyor.
bRank >= 4 kısmı boss ayrımını yapan ana nokta. Yani rank değeri belirli seviyenin üstünde olan yaratıkların isim rengi farklı gösterilecek.
InstanceBaseEffect.cpp Düzenlemesi
Şimdi şu dosyayı açıyoruz:
Client/UserInterface/InstanceBaseEffect.cpp
Dosya içinde şu fonksiyonu bulun:
UINT CInstanceBase::GetNameColorIndex()
Bu fonksiyonun içinde şu bloğu bulun:
else if (IsNPC())
{
return NAMECOLOR_NPC;
}
Altına ekleyin:
#ifdef ELISIA_BOSS_NAMECOLOR
else if (IsBoss())
{
return NAMECOLOR_BOSS;
}
#endif
Bu kısım önemli. Çünkü oyun bir karakterin, NPC’nin, mobun veya boss’un ismini hangi renkte göstereceğine burada karar veriyor. Boss kontrolünü NPC’den sonra ekleyerek boss yaratıkların ayrı renk index’i kullanmasını sağlıyoruz.
PythonApplicationModule.cpp Düzenlemesi
Şu dosyayı açın:
Client/UserInterface/PythonApplicationModule.cpp
Şu satırı bulun:
PyModule_AddIntConstant(poModule, "CAMERA_STOP", CPythonApplication::CAMERA_STOP);
Altına ekleyin:
#ifdef ELISIA_BOSS_NAMECOLOR
PyModule_AddIntConstant(poModule, "ELISIA_BOSS_NAMECOLOR", 1);
#else
PyModule_AddIntConstant(poModule, "ELISIA_BOSS_NAMECOLOR", 0);
#endif
Bu ekleme ile root tarafında app.ELISIA_BOSS_NAMECOLOR kontrolünü kullanabileceğiz. Yani Python tarafı bu sistemin açık olup olmadığını anlayacak.
PythonCharecterManagerModule.cpp Düzenlemesi
Şu dosyayı açın:
Client/UserInterface/PythonCharecterManagerModule.cpp
Şu satırı bulun:
PyModule_AddIntConstant(poModule, "NAMECOLOR_WAYPOINT", CInstanceBase::NAMECOLOR_WAYPOINT);
Altına ekleyin:
#ifdef ELISIA_BOSS_NAMECOLOR
PyModule_AddIntConstant(poModule, "NAMECOLOR_BOSS", CInstanceBase::NAMECOLOR_BOSS);
#endif
Bu kısım da boss name color index’ini Python tarafına aktarıyor. Bunu eklemezseniz root içinde chrmgr.NAMECOLOR_BOSS kullanıldığında hata alabilirsiniz.
Root Dosyaları
Şimdi client root tarafına geçiyoruz.
colorinfo.py Düzenlemesi
Şu dosyayı açın:
Client/root/colorinfo.py
Şu satırı bulun:
CHR_NAME_RGB_WAYPOINT = (255, 255, 255)
Altına ekleyin:
CHR_NAME_RGB_BOSS = (255, 177, 0)
Buradaki değer boss isim rengini belirler. Bu örnekte turuncu / altın tonunda bir renk kullanılıyor. Boss isimleri normal moblardan daha dikkat çekici görünür.
İsterseniz farklı renk de verebilirsiniz. Mesela kırmızıya yakın yapmak isterseniz RGB değerlerini değiştirebilirsiniz. Ama çok parlak renk seçerseniz oyun içinde biraz göz yorabilir, ona dikkat etmek lazım.
introloading.py Düzenlemesi
Şu dosyayı açın:
Client/root/introloading.py
Dosya içinde şu fonksiyonu bulun:
def __RegisterColor(self):
Bu fonksiyonun içinde NAME_COLOR_DICT yapısını göreceksiniz. Şuna benzer bir blok olur:
NAME_COLOR_DICT = {
chrmgr.NAMECOLOR_PC : colorInfo.CHR_NAME_RGB_PC,
chrmgr.NAMECOLOR_NPC : colorInfo.CHR_NAME_RGB_NPC,
chrmgr.NAMECOLOR_MOB : colorInfo.CHR_NAME_RGB_MOB,
chrmgr.NAMECOLOR_PVP : colorInfo.CHR_NAME_RGB_PVP,
chrmgr.NAMECOLOR_PK : colorInfo.CHR_NAME_RGB_PK,
chrmgr.NAMECOLOR_PARTY : colorInfo.CHR_NAME_RGB_PARTY,
chrmgr.NAMECOLOR_WARP : colorInfo.CHR_NAME_RGB_WARP,
chrmgr.NAMECOLOR_WAYPOINT : colorInfo.CHR_NAME_RGB_WAYPOINT, chrmgr.NAMECOLOR_EMPIRE_MOB : colorInfo.CHR_NAME_RGB_EMPIRE_MOB,
chrmgr.NAMECOLOR_EMPIRE_NPC : colorInfo.CHR_NAME_RGB_EMPIRE_NPC,
chrmgr.NAMECOLOR_EMPIRE_PC+1 : colorInfo.CHR_NAME_RGB_EMPIRE_PC_A,
chrmgr.NAMECOLOR_EMPIRE_PC+2 : colorInfo.CHR_NAME_RGB_EMPIRE_PC_B,
chrmgr.NAMECOLOR_EMPIRE_PC+3 : colorInfo.CHR_NAME_RGB_EMPIRE_PC_C,
}Bu bloğun hemen altına şunu ekleyin:
if app.ELISIA_BOSS_NAMECOLOR:
NAME_COLOR_DICT[chrmgr.NAMECOLOR_BOSS] = colorInfo.CHR_NAME_RGB_BOSS
Bu ekleme ile boss isim rengi Python tarafında aktif olarak kaydedilmiş olur.
Sistem Ne İşe Yarıyor?
Bu düzenlemeden sonra boss olarak algılanan yaratıkların isimleri normal moblardan farklı renkte görünür. Mesela normal yaratık isimleri standart renkte kalırken, boss isimleri altın / turuncu renkte görünebilir.
Oyuncu tarafında çok büyük bir sistem gibi görünmeyebilir ama kullanım hissi güzel. Boss’u seçmek, kalabalıkta fark etmek, eventlerde hedefi daha hızlı görmek falan daha rahat oluyor. Özellikle boss farm, event mapleri ve kalabalık PvM alanlarında işe yarayan bir düzenleme.
Dikkat Edilmesi Gerekenler
Bu sistem boss kontrolünü şu şarta göre yapıyor:
pkTab->bRank >= 4 && !IsStone() && pkTab->bType == 0
Yani rank değeri boss seviyesinde olan, metin taşı olmayan ve mob tipinde bulunan varlıklar boss olarak kabul ediliyor.
Bazı fileslerde rank veya type değerleri farklı düzenlenmiş olabilir. Eğer sistem çalışmazsa önce mob_proto tarafındaki boss rank değerlerini kontrol etmek gerekir. Çünkü client tarafı burada gelen tablo bilgisine göre karar veriyor.
Ayrıca PythonCharecterManagerModule.cpp ve introloading.py tarafındaki eklemeler unutulursa boss renk index’i root tarafında tanınmayabilir.
Boss isimlerini farklı renkte göstermek küçük ama hoş bir client düzenlemesi. Oyuncular açısından bossları fark etmek kolaylaşıyor, oyun içi görünüm de biraz daha düzenli hale geliyor. Özellikle PvM ve boss farm ağırlıklı serverlarda bu tarz detaylar oyuncu deneyimini daha iyi hissettiriyor.
Düzenlemeleri yaptıktan sonra client source derlenmeli, root dosyaları da paketlenip test edilmelidir.
Kaynak: Client/UserInterface ve Client/root düzenlemeleri
Paylaşım: MMOOYUN.COM
Not
Daha fazla Metin2 sistemi, client-source düzenlemesi, hazır files, özel geliştirme ve teknik destek için geliştirici tarafındaki adresimizi ziyaret edebilirsiniz:
Paylaş :








