Hikayeler

Reklam vermek için turkmmo@gmail.com

DB_NAME_COLUMN Sistemi Detaylı Kaldırma Rehberi

MaviAy44

Emre Kırıcı
Telefon Numarası Onaylanmış Üye TC Kimlik Numarası Doğrulanmış Üye
Yönetici
Turnuva
Yarışma
Katılım
16 Tem 2019
Konular
714
Mesajlar
3,540
Online süresi
6ay 20g
Reaksiyon Skoru
2,107
Altın Konu
34
Başarım Puanı
309
TM Yaşı
6 Yıl 9 Ay 8 Gün
MmoLira
26,209
DevLira
122

Metin2 EP, Valorant VP dahil tüm oyun ürünlerini en uygun fiyatlarla bulabilir, Item ve Karakterlerinizi hızlıca satabilirsiniz. HEMEN TIKLA!

Source Temizliği: Proto "LocaleName" Karmaşasına Son Verin
Korece isim sütununu kaldırın, encoding hatalarından ve kod kirliliğinden kurtulun.




Nedir ve Neden Yapıyoruz?

Orijinal Ymir altyapısında "Name" sütunu Korece isimler, "LocaleName" sütunu ise yerel dildeki (İngilizce/Türkçe) isimler için ayrılmıştır. Ancak Korece konuşmayan geliştiriciler için bu durum:
  • ❌ Gereksiz Kod Kalabalığı: Her yerde çift kontrol yapılır.
  • ❌ Encoding Sorunları: Visual Studio veya veritabanı encoding'i bozulduğunda Korece karakterler (gb2312) sunucunun açılmamasına veya mob isimlerinin bozuk görünmesine neden olur.
  • ❌ Veri Tekrarı: Proto dosyalarında gereksiz yere iki isim tutulur.

Bu rehber ile "LocaleName" yapısını kaldırıp, her şeyi tek bir "Name" (szName) yapısı altında birleştiriyoruz.




⚠️ DİKKAT ⚠️
İşlemlere başlamadan önce Client Source, Server Source ve Tools yedeğinizi alınız!
DumpProto düzenlemesi içerir, kapatıcı (packer) güncellemeniz gerekebilir.






BÖLÜM 1: Client Source (İstemci)

Dosya: Client\Source\GameLib\ItemData.cpp
Bul:
Kod:
return m_ItemTable.szLocaleName;
Değiştir:
Kod:
return m_ItemTable.szName;

Dosya: Client\Source\GameLib\ItemData.h
Bul ve Sil:
Kod:
char szLocaleName[ITEM_NAME_MAX_LEN + 1];

Dosya: Client\Source\UserInterface\PythonNetworkStreamCommand.cpp
Bul:
Kod:
strMonsterList += c_pMobTable->szLocaleName;
Değiştir:
Kod:
strMonsterList += c_pMobTable->szName;

Dosya: Client\Source\UserInterface\PythonNonPlayer.cpp
İşlem: Aşağıdaki tüm
Kod:
szLocaleName
kullanımlarını
Kod:
szName
ile değiştirin.

Kod:
// 1. Değişiklik
pNonPlayerData->szLocaleName -> pNonPlayerData->szName

// 2. Değişiklik (GetName içinde)
*c_pszName = p->szLocaleName; -> *c_pszName = p->szName;

// 3. Değişiklik (GetMonsterName içinde)
return c_pTable->szLocaleName; -> return c_pTable->szName;

Dosya: Client\Source\UserInterface\PythonNonPlayer.h
Bul ve Sil:
Kod:
char szLocaleName[CHARACTER_NAME_MAX_LEN + 1];




BÖLÜM 2: Server Source - DB & Common

Dosya: Server\Source\common\tables.h
Bul ve Sil (SEntityTable içinde):
Kod:
char szLocaleName[CHARACTER_NAME_MAX_LEN + 1];
Bul ve Sil (SItemTable içinde):
Kod:
char szLocaleName[ITEM_NAME_MAX_LEN + 1];

Dosya: Server\Source\db\ClientManager.cpp
Bul ve Sil:
Kod:
extern int g_iItemCacheFlushSeconds;
extern std::string g_stLocaleNameColumn; // SİL

Bul ve Sil (InitializeLocalization içinde):
Kod:
g_stLocaleNameColumn = "xxx";
// ... ve ...
else if (strcmp(locale.szKey, "DB_NAME_COLUMN") == 0)
{
    // ...
    g_stLocaleNameColumn = locale.szValue;
}

Dosya: Server\Source\db\ClientManagerBoot.cpp
Bul ve Sil:
Kod:
extern std::string g_stLocaleNameColumn;

InitializeMobTable Fonksiyonu Düzenlemeleri:
  • Sil:
    Kod:
    strlcpy(mob_table->szLocaleName, tempTable->szLocaleName, sizeof(tempTable->szName));
  • Loglardaki `szLocaleName` alanlarını kaldırın.

InitializeItemTable Fonksiyonu Düzenlemeleri:
  • Sil:
    Kod:
    strlcpy(item_table->szLocaleName, tempTable->szLocaleName, sizeof(item_table->szLocaleName));
  • Loglardaki `szLocaleName` alanlarını kaldırın.

MirrorMobTableIntoDB Fonksiyonu (Query Yapısı):
Buradaki sorguyu `szLocaleName` olmadan sadeleştiriyoruz.

Bununla Değiştirin:
Kod:
        snprintf(query, sizeof(query),
                 "replace into mob_proto%s "
                 "("
                 "vnum, name, type, rank, battle_type, level, size, ai_flag, setRaceFlag, setImmuneFlag, "
                 "on_click, empire, drop_item, resurrection_vnum, folder, "
                 "st, dx, ht, iq, damage_min, damage_max, max_hp, regen_cycle, regen_percent, exp, "
                 "gold_min, gold_max, def, attack_speed, move_speed, aggressive_hp_pct, aggressive_sight, attack_range, polymorph_item, "

                 "enchant_curse, enchant_slow, enchant_poison, enchant_stun, enchant_critical, enchant_penetrate, "
                 "resist_sword, resist_twohand, resist_dagger, resist_bell, resist_fan, resist_bow, "
                 "resist_fire, resist_elect, resist_magic, resist_wind, resist_poison, "
                 "dam_multiply, summon, drain_sp, "

                 "skill_vnum0, skill_level0, skill_vnum1, skill_level1, skill_vnum2, skill_level2, "
                 "skill_vnum3, skill_level3, skill_vnum4, skill_level4, "
                 "sp_berserk, sp_stoneskin, sp_godspeed, sp_deathblow, sp_revive"
                 ") "
                 "values ("

                 "%d, \"%s\", %d, %d, %d, %d, %d, %u, %u, %u, "
                 "%d, %d, %d, %d, '%s', "
                 "%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, "
                 "%d, %d, %d, %d, %d, %d, %d, %d, %d, "

                 "%d, %d, %d, %d, %d, %d, "
                 "%d, %d, %d, %d, %d, %d, "
                 "%d, %d, %d, %d, %d, "
                 "%f, %d, %d, "

                 "%d, %d, %d, %d, %d, %d, "
                 "%d, %d, %d, %d, "
                 "%d, %d, %d, %d, %d"
                 ")",
                 GetTablePostfix(),

                 t.dwVnum, t.szName, t.bType, t.bRank, t.bBattleType, t.bLevel, t.bSize, t.dwAIFlag, t.dwRaceFlag, t.dwImmuneFlag,
                 t.bOnClickType, t.bEmpire, t.dwDropItemVnum, t.dwResurrectionVnum, t.szFolder,
                 t.bStr, t.bDex, t.bCon, t.bInt, t.dwDamageRange[0], t.dwDamageRange[1], t.dwMaxHP, t.bRegenCycle, t.bRegenPercent, t.dwExp,

                 t.dwGoldMin, t.dwGoldMax, t.wDef, t.sAttackSpeed, t.sMovingSpeed, t.bAggresiveHPPct, t.wAggressiveSight, t.wAttackRange, t.dwPolymorphItemVnum,
                 t.cEnchants[0], t.cEnchants[1], t.cEnchants[2], t.cEnchants[3], t.cEnchants[4], t.cEnchants[5],
                 t.cResists[0], t.cResists[1], t.cResists[2], t.cResists[3], t.cResists[4], t.cResists[5],
                 t.cResists[6], t.cResists[7], t.cResists[8], t.cResists[9], t.cResists[10],
                 t.fDamMultiply, t.dwSummonVnum, t.dwDrainSP,

                 t.Skills[0].dwVnum, t.Skills[0].bLevel, t.Skills[1].dwVnum, t.Skills[1].bLevel, t.Skills[2].dwVnum, t.Skills[2].bLevel,
                 t.Skills[3].dwVnum, t.Skills[3].bLevel, t.Skills[4].dwVnum, t.Skills[4].bLevel,
                 t.bBerserkPoint, t.bStoneSkinPoint, t.bGodSpeedPoint, t.bDeathBlowPoint, t.bRevivePoint
                );

MirrorItemTableIntoDB Fonksiyonu:
Burada `g_stLocaleNameColumn` kontrolünü kaldırıp tek bir sorgu bırakıyoruz.

Bununla Değiştirin:
Kod:
        const TItemTable& t = *it;
        char query[4096];
        snprintf(query, sizeof(query),
                 "replace into item_proto%s ("
                 "vnum, type, subtype, name, gold, shop_buy_price, weight, size, "
                 "flag, wearflag, antiflag, immuneflag, "
                 "refined_vnum, refine_set, magic_pct, socket_pct, addon_type, "
                 "limittype0, limitvalue0, limittype1, limitvalue1, "
                 "applytype0, applyvalue0, applytype1, applyvalue1, applytype2, applyvalue2, "
                 "value0, value1, value2, value3, value4, value5 ) "
                 "values ("
                 "%d, %d, %d, \"%s\", %d, %d, %d, %d, "
                 "%d, %d, %d, %d, "
                 "%d, %d, %d, %d, %d, "
                 "%d, %d, %d, %d, "
                 "%d, %d, %d, %d, %d, %d, "
                 "%d, %d, %d, %d, %d, %d )",
                 GetTablePostfix(),
                 t.dwVnum, t.bType, t.bSubType, t.szName, t.dwGold, t.dwShopBuyPrice, t.bWeight, t.bSize,
                 t.dwFlags, t.dwWearFlags, t.dwAntiFlags, t.dwImmuneFlag,
                 t.dwRefinedVnum, t.wRefineSet, t.bAlterToMagicItemPct, t.bGainSocketPct, t.sAddonType,
                 t.aLimits[0].bType, t.aLimits[0].lValue, t.aLimits[1].bType, t.aLimits[1].lValue,
                 t.aApplies[0].bType, t.aApplies[0].lValue, t.aApplies[1].bType, t.aApplies[1].lValue, t.aApplies[2].bType, t.aApplies[2].lValue,
                 t.alValues[0], t.alValues[1], t.alValues[2], t.alValues[3], t.alValues[4], t.alValues[5]);
        CDBManager::instance().AsyncQuery(query);

Dosya: Server\Source\db\Main.cpp
Bul ve Sil:
Kod:
std::string g_stLocaleNameColumn = "name";
Bul ve Sil: `CConfig::instance().GetValue("NAME_COLUMN"...` bloğunu silin.

Dosya: Server\Source\db\ProtoReader.cpp
TXT okuyucuda artık localeName aramak yerine doğrudan name'i güncelleyeceğiz.

Mob Table İçin Değiştir:
Kod:
    /*======== NAME =======*/
    strlcpy(mobTable->szName, csvTable.AsStringByIndex(col++), sizeof(mobTable->szName));
    // Overwrite name with localized name if found
    if (auto it = nameMap.find(mobTable->dwVnum); it != nameMap.end())
    {
        strlcpy(mobTable->szName, it->second, sizeof(mobTable->szName));
    }

Item Table İçin Değiştir:
Kod:
    // Overwrite name with localized name if found
    if (auto it = nameMap.find(itemTable->dwVnum); it != nameMap.end())
    {
        strlcpy(itemTable->szName, it->second, sizeof(itemTable->szName));
    }
(Ayrıca `szLocaleName` içeren log kayıtlarını `szName` ile değiştirin.)




BÖLÜM 3: Server Source - Game

Aşağıdaki dosyalarda `szLocaleName` gördüğünüz her yeri `szName` olarak değiştirmeniz gerekmektedir. Bazı yerlerde `GetTable(xxx)->szLocaleName` şeklinde geçer, bunları da `szName` yapın.

Dosya Listesi:
  • game/char.cpp
  • game/char_manager.cpp
  • game/cmd_general.cpp (At besleme ve item gereksinimi logları)
  • game/input_main.cpp (Fısıltı ve Ticaret logları)
  • game/item.cpp (GetRefineFromVnum ve GetBaseName fonksiyonları)
  • game/item.h (`GetName` fonksiyonu artık `szName` döndürmeli)
  • game/item_manager.cpp
  • game/mob_manager.cpp
  • game/questlua_global.cpp
  • game/regen.cpp
  • game/shop_manager.cpp




BÖLÜM 4: Tools (DumpProto)
Kapatıcınızın proto oluştururken hata vermemesi için bunu yapmalısınız.

Dosya: Tools\DumpProto\dump_proto\dump_proto.cpp

  • Struct'lardan `szLocaleName` değişkenlerini silin.
  • TXT'den veri okurken (Set_Proto_Mob_Table ve Set_Proto_Item_Table) `szLocaleName` atamalarını kaldırın, `nameMap` (mob_names.txt / item_names.txt) verisini doğrudan `szName` üzerine yazın.
  • Build fonksiyonlarındaki (BuildMobTable / BuildItemTable) `szLocaleName` loglarını `szName` ile değiştirin veya silin.




Tüm işlemleri bitirdikten sonra tüm projeyi (Client, Server, DumpProto) "Rebuild" yapın.
Artık protos'larınızda sadece tek bir isim sütunu var!
İyi forumlar!
 
Son düzenleme:
PAYLAŞIM İÇİN TEŞEKKÜRLER, ELİNE SAĞLIK.
 
Eline sağlık, paylaşım için teşekkürler :)
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst