Merhaba Arkadaşlar Öncelikle Belirtmek İsterimki Konu Sadece Source Kullanan Gameler İçin Paylaşılmıştır .[/LEFT]
Editleyeceğimiz Dosyalar ;
ClientManager.h
ClientManagerBoot.cpp
Başlayalım.
ClientManager.h Açılır. ve MirrorMobTableIntoDB Aratılır.
Gri İşaretlenen Kısım Silinir.
ClientManagerBoot.cpp Açılır.
CClientManager::InitializeTables Aratılır 4 Fonksiyon Aşağıdaki Gibi Değiştirilir ;
MirrorMobTableIntoDB Aratılır Ve Kod Bloğu Tamamiyle Silinir.
MirrorItemTableIntoDB Aratılır Ve Kod Bloğu Tamamiyle Silinir.
Gri Gözüken Yerleri Sileceksiniz Sizde Daha Büyük Olacaktır Bilginize.
Şimdi İse bool CClientManager::InitializeMobTable() Aratacaksınız Ve Kod Bloğunu Aşağıdaki Kodlarla Değiştireceksiniz ;
Kod:
[COLOR=#111111][FONT=Tahoma]bool CClientManager::InitializeMobTable()[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]{[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]char query[4096];[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]snprintf(query, sizeof(query),[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]"SELECT vnum, name, %s, type, rank, battle_type, level, "[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]"size+0, ai_flag+0, setRaceFlag+0, setImmuneFlag+0, "[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]"on_click, empire, drop_item, resurrection_vnum, folder, "[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]"st, dx, ht, iq, damage_min, damage_max, max_hp, regen_cycle, regen_percent, exp, "[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]"gold_min, gold_max, def, attack_speed, move_speed, "[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]"aggressive_hp_pct, aggressive_sight, attack_range, polymorph_item, "[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]"enchant_curse, enchant_slow, enchant_poison, enchant_stun, enchant_critical, enchant_penetrate, "[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]"resist_sword, resist_twohand, resist_dagger, resist_bell, resist_fan, resist_bow, "[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]"resist_fire, resist_elect, resist_magic, resist_wind, resist_poison, "[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]"dam_multiply, summon, drain_sp, "[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]"skill_vnum0, skill_level0, skill_vnum1, skill_level1, skill_vnum2, skill_level2,"[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]"skill_vnum3, skill_level3, skill_vnum4, skill_level4 , sp_berserk, sp_stoneskin, "[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]"sp_godspeed, sp_deathblow, sp_revive "[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]"FROM mob_proto%s ORDER BY vnum",[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]g_stLocaleNameColumn.c_str(), GetTablePostfix());[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]SQLResult * pRes = pkMsg->Get();[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]if (!pRes->uiNumRows)[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]{[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]sys_err("Could not load mob_proto. No results!");[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]return false;[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]}[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]sys_log(0, "MOB_PROTO loading...");[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]if (!m_vec_mobTable.empty())[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]{[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]sys_log(0, "RELOAD: mob_proto");[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]m_vec_mobTable.clear();[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]}[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]m_vec_mobTable.resize(pRes->uiNumRows);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]memset(&m_vec_mobTable[0], 0, sizeof(TMobTable) * m_vec_mobTable.size());[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]TMobTable * mob_table = &m_vec_mobTable[0];[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]MYSQL_ROW data;[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]int col;[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]while ((data = mysql_fetch_row(pRes->pSQLResult)))[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]{[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]col = 0;[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->dwVnum, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]strlcpy(mob_table->szName, data[col++], sizeof(mob_table->szName));[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]strlcpy(mob_table->szLocaleName, data[col++], sizeof(mob_table->szLocaleName));[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->bType, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->bRank, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->bBattleType, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->bLevel, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->bSize, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->dwAIFlag, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->dwRaceFlag, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->dwImmuneFlag, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->bOnClickType, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->bEmpire, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->dwDropItemVnum, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->dwResurrectionVnum, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]strlcpy(mob_table->szFolder, data[col++], sizeof(mob_table->szFolder));[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->bStr, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->bDex, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->bCon, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->bInt, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->dwDamageRange[0], data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->dwDamageRange[1], data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->dwMaxHP, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->bRegenCycle, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->bRegenPercent, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->dwExp, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->dwGoldMin, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->dwGoldMax, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->wDef, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->sAttackSpeed, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->sMovingSpeed, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->bAggresiveHPPct, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->wAggressiveSight, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->wAttackRange, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->dwPolymorphItemVnum, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]int i;[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]for (i = 0; i < MOB_ENCHANTS_MAX_NUM; ++i)[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->cEnchants[i], data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]for (i = 0; i < MOB_RESISTS_MAX_NUM; ++i)[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->cResists[i], data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->fDamMultiply, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->dwSummonVnum, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->dwDrainSP, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]for (i = 0; i < MOB_SKILL_MAX_NUM; ++i)[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]{[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->Skills[i].dwVnum, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->Skills[i].bLevel, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]}[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->bBerserkPoint, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->bStoneSkinPoint, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->bGodSpeedPoint, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->bDeathBlowPoint, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]str_to_number(mob_table->bRevivePoint, data[col++]);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]sys_log(1, "MOB #%-5d %-24s %-24s level: %-3u rank: %u empire: %d", mob_table->dwVnum, mob_table->szName, mob_table->szLocaleName, mob_table->bLevel, mob_table->bRank, mob_table->bEmpire);[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]++mob_table;[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]}[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]sort(m_vec_mobTable.begin(), m_vec_mobTable.end(), FCompareVnum());[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]sys_log(0, "CClientManager::InitializeMobTable:: %d mobs loaded.n", m_vec_mobTable.size());[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]fprintf(stderr, "CClientManager::InitializeMobTable:: %d mobs loaded\n", m_vec_mobTable.size());[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma]return true;[/FONT][/COLOR] [COLOR=#111111][FONT=Tahoma][LEFT]}[/LEFT] [/FONT][/COLOR]
Şimdi İse bool CClientManager::InitializeItemTable() Aratın Ve Kod Bloğunu Aşağıdaki Gibi Değiştirin.
Kod:
[COLOR=#111111][FONT=Tahoma]bool CClientManager::InitializeItemTable()[/FONT][/COLOR][COLOR=#222222][FONT=Tahoma] [/FONT][/COLOR][COLOR=#111111][COLOR=#111111][FONT=Tahoma]{[/FONT][/COLOR][/COLOR] [COLOR=#111111][FONT=Tahoma]char query[4096]; snprintf(query, sizeof(query), "SELECT vnum, name, %s, type, subtype, gold, shop_buy_price, weight, size, flag, wearflag, " "antiflag, immuneflag+0, 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 " "FROM item_proto%s ORDER BY vnum", g_stLocaleNameColumn.c_str(), GetTablePostfix()); std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query)); SQLResult * pRes = pkMsg->Get(); if (!pRes->uiNumRows) { sys_err("Could not load item_proto. No results!"); return false; } sys_log(0, "ITEM_PROTO loading..."); if (!m_vec_itemTable.empty()) { sys_log(0, "RELOAD: item_proto"); m_vec_itemTable.clear(); m_map_itemTableByVnum.clear(); } m_vec_itemTable.resize(pRes->uiNumRows); memset(&m_vec_itemTable[0], 0, sizeof(TItemTable) * m_vec_itemTable.size()); TItemTable * item_table = &m_vec_itemTable[0]; MYSQL_ROW data; int col; while ((data = mysql_fetch_row(pRes->pSQLResult))) { col = 0; str_to_number(item_table->dwVnum, data[col++]); strlcpy(item_table->szName, data[col++], sizeof(item_table->szName)); strlcpy(item_table->szLocaleName, data[col++], sizeof(item_table->szLocaleName)); str_to_number(item_table->bType, data[col++]); str_to_number(item_table->bSubType, data[col++]); str_to_number(item_table->dwGold, data[col++]); str_to_number(item_table->dwShopBuyPrice, data[col++]); str_to_number(item_table->bWeight, data[col++]); str_to_number(item_table->bSize, data[col++]); str_to_number(item_table->dwFlags, data[col++]); str_to_number(item_table->dwWearFlags, data[col++]); str_to_number(item_table->dwAntiFlags, data[col++]); str_to_number(item_table->dwImmuneFlag, data[col++]); str_to_number(item_table->dwRefinedVnum, data[col++]); str_to_number(item_table->wRefineSet, data[col++]); str_to_number(item_table->bAlterToMagicItemPct, data[col++]); str_to_number(item_table->bGainSocketPct, data[col++]); str_to_number(item_table->sAddonType, data[col++]); item_table->cLimitRealTimeFirstUseIndex = -1; item_table->cLimitTimerBasedOnWearIndex = -1; int i; for (i = 0; i < ITEM_LIMIT_MAX_NUM; ++i) { str_to_number(item_table->aLimits[i].bType, data[col++]); str_to_number(item_table->aLimits[i].lValue, data[col++]); if (LIMIT_REAL_TIME_START_FIRST_USE == item_table->aLimits[i].bType) item_table->cLimitRealTimeFirstUseIndex = (char)i; if (LIMIT_TIMER_BASED_ON_WEAR == item_table->aLimits[i].bType) item_table->cLimitTimerBasedOnWearIndex = (char)i; } for (i = 0; i < ITEM_APPLY_MAX_NUM; ++i) { str_to_number(item_table->aApplies[i].bType, data[col++]); str_to_number(item_table->aApplies[i].lValue, data[col++]); } for (i = 0; i < ITEM_VALUES_MAX_NUM; ++i) str_to_number(item_table->alValues[i], data[col++]); sys_log(1, "ITEM: #%-5lu %-24s %-24s VAL: %ld %ld %ld %ld %ld %ld WEAR %lu ANTI %lu IMMUNE %lu REFINE %lu REFINE_SET %u MAGIC_PCT %u", item_table->dwVnum,item_table->szName,item_table->szLocaleName, item_table->alValues[0],item_table->alValues[1],item_table->alValues[2], item_table->alValues[3],item_table->alValues[4],item_table->alValues[5], item_table->dwWearFlags,item_table->dwAntiFlags,item_table->dwImmuneFlag, item_table->dwRefinedVnum,item_table->wRefineSet,item_table->bAlterToMagicItemPct); m_map_itemTableByVnum.insert(std::map<DWORD, TItemTable *>::value_type(item_table->dwVnum, item_table)); ++item_table; } sort(m_vec_itemTable.begin(), m_vec_itemTable.end(), FCompareVnum()); sys_log(0, "CClientManager::InitializeItemTable:: %d items loaded.n", m_vec_itemTable.size()); fprintf(stderr, "CClientManager::InitializeItemTable:: %d items loaded\n", m_vec_itemTable.size()); return true; } [/FONT][/COLOR][COLOR=#111111][FONT=Tahoma] [/FONT][/COLOR]
Database Açılırken Böyle Birşey Geliyorsa ;
CClientManager::InitializeMobTable:: 1198 mobs loaded.
CClientManager::InitializeItemTable:: 5562 items loaded.
CClientManager::InitializeItemTable:: 5562 items loaded.
Başarıyla Yapmışsınız Demektir.
- Pelin Melek Aslan -
Bilgilendirme ;
Metin2 Lobby'da 40K item_proto ve mob_proto Dosyalarını Navicat ile Düzenlemek (TXT DB Kullanmadan)
Metin2 özel sunucu geliştirme süreçlerinde, item_proto ve mob_proto dosyaları büyük önem taşır. Bu dosyalar, oyuncuların kullanabileceği eşyaları ve haritalarda spawn edilecek olan mobları tanımlar. Geleneksel olarak birçok geliştirici, bu dosyaları TXT tabanlı veritabanları üzerinden düzenler. Ancak bu yöntem zamanla sınırlamalar doğurabilir. Özellikle 40K gibi yüksek sayıda veri barındıran sistemlerde, doğrudan SQL üzerinden işlem yapmak çok daha verimlidir. Bu rehberde, Navicat kullanarak item_proto ve mob_proto dosyalarını nasıl düzenleyeceğinizi adım adım anlatacağız. Bu yöntemde TXT DB kullanılmaz; tüm işlemler doğrudan veritabanı üzerinden yapılır.
Neden Navicat?
Navicat, güçlü bir veritabanı yönetim aracıdır. Görsel arayüzü sayesinde, veritabanı üzerinde kolayca gezinebilir, sorgular çalıştırabilir ve verileri düzenleyebilirsiniz. Metin2 geliştiricileri için, özellikle item_proto ve mob_proto gibi yoğun yapılar üzerinde çalışırken, Navicat kullanmak hem zaman kazandırır hem de hataları azaltır. Ayrıca, item_proto dosyasında 40.000'in üzerinde satır olduğunda, manuel TXT düzenleme çok karmaşık hale gelir. Navicat ile bu işlem çok daha kontrollü ve verimli yapılır.
Hazırlık Aşaması
İlk olarak, Metin2 veritabanınıza erişim sağlamanız gerekir. Sunucunuzda game_db adında bir veritabanı bulunur. Bu veritabanında item_proto ve mob_proto adlı iki temel tablo yer alır. Navicat üzerinden bu veritabanına bağlanın. Bağlantı bilgileriniz genellikle localhost, root kullanıcı adı ve şifrenizdir. Eğer farklı bir yapı kullanıyorsanız, bilgileri sunucu yapılandırmanıza göre ayarlayın.
item_proto Tablosunu Düzenlemek
item_proto tablosu, Metin2'de kullanılacak tüm eşyaların tanımlandığı yerdir. Her bir eşyanın ID'si, adı, sınıfı, grafik yolu, fiyat, dayanıklılık gibi bilgileri burada yer alır. Bu tabloya yeni bir eşya eklemek veya mevcut bir eşyayı düzenlemek oldukça kolaydır. Navicat üzerinden item_proto tablosuna sağ tıklayıp Open Table seçeneğini seçin. Artık tabloyu görsel olarak görüntüleyebilir ve veriler üzerinde değişiklik yapabilirsiniz. Örneğin, yeni bir eşya eklemek istiyorsanız, son satıra sağ tıklayıp Insert Row diyerek yeni bir satır oluşturabilirsiniz. Buraya eşyanın ID'sini, adını, grafik yolunu ve diğer özelliklerini girin. Dikkat edilmesi gereken en önemli konu, ID değerlerinin benzersiz olmasıdır. Aynı ID'ye sahip iki eşya olmamalıdır.
mob_proto Tablosunu Düzenlemek
mob_proto ise, Metin2 haritalarında spawn edilecek olan canavarların (NPC) tanımlandığı yerdir. Her bir mob, ID, ad, level, can, hasar, savunma gibi pek çok nitelikle tanımlanır. Bu tabloyu da item_proto gibi açabilir ve düzenleyebilirsiniz. Yeni bir mob eklemek için, yine son satıra sağ tıklayıp Insert Row komutunu kullanabilirsiniz. Mob ID'si benzersiz olmalıdır ve genellikle 3000’den sonra numaralandırılır. Bu şekilde, resmi Metin2 mob ID'leriyle çakışmazsınız. Mob adı, grafik yolu, AI türü gibi bilgileri eksiksiz girin. Bu bilgiler eksikse, mob sunucuda doğru çalışmaz veya görünmez.
Veri Doğrulama ve Test[/BR][/BR]Değişiklik yaptıktan sonra, sunucuyu yeniden başlatmadan önce verilerin doğru girildiğinden emin olun. Özellikle item_proto ve mob_proto’daki ID'lerin benzersiz ve doğru girildiğinden emin olun. Yanlış ID kullanımı, sunucuda çökme veya hata oluşmasına neden olabilir. Veritabanı üzerinde değişiklik yaptığınızda, Commit etmeyi unutmayın. Aksi takdirde değişiklikler kalıcı olmaz. Değişiklikleri yaptıktan sonra, sunucunuzu yeniden başlatın ve test edin. Eşyaların ve mobların doğru şekilde görünüp görünmediğini kontrol edin.
Sonuç[/BR][/BR]Navicat kullanarak item_proto ve mob_proto dosyalarını düzenlemek, Metin2 geliştirme sürecini büyük ölçüde kolaylaştırır. Özellikle 40K gibi yüksek sayıda veri içeren sistemlerde, TXT DB kullanımına göre daha güvenli ve hızlı bir yöntemdir. Bu rehber sayesinde, artık doğrudan SQL üzerinden veritabanı üzerinde çalışarak, Metin2 sunucunuzu daha profesyonel yönetebilirsiniz.
Editing 40K item_proto and mob_proto with Navicat (No TXT DB)
In the process of developing private Metin2 servers, item_proto and mob_proto files hold great importance. These files define the items that players can use and the mobs that will spawn on maps. Traditionally, many developers edit these files via TXT-based databases. However, this method may lead to limitations over time. Especially in systems like 40K, which contain a large number of entries, directly working with SQL becomes much more efficient. In this guide, we'll explain step by step how to edit item_proto and mob_proto files using Navicat. This method does not use TXT DB; all operations are performed directly within the database.
Why Navicat?
Navicat is a powerful database management tool. Its visual interface allows you to easily navigate through the database, run queries, and edit data. For Metin2 developers, especially when working with dense structures like item_proto and mob_proto, using Navicat saves time and reduces errors. Moreover, when the item_proto file contains over 40,000 rows, manual TXT editing becomes very complex. With Navicat, this process becomes far more controlled and efficient.
Preparation Stage
Firstly, you need to connect to your Metin2 database. Your server has a database named game_db. Within this database, there are two main tables called item_proto and mob_proto. Connect to this database via Navicat. Your connection details usually include localhost, root as username, and your password. If you're using a different setup, adjust the settings according to your server configuration.
Editing the item_proto Table
The item_proto table defines all the items used in Metin2. Each item contains its ID, name, class, graphics path, price, durability, and other attributes. Adding a new item or editing an existing one is quite straightforward. Right-click on the item_proto table in Navicat and select Open Table. Now you can visually view the table and make edits. For example, to add a new item, right-click on the last row and choose Insert Row. Enter the item’s ID, name, graphics path, and other properties. The most important thing to note is that IDs must be unique. There shouldn’t be two items with the same ID.
Editing the mob_proto Table
mob_proto defines the monsters (NPCs) that spawn in Metin2 maps. Each mob is defined by attributes such as ID, name, level, health, damage, defense, etc. You can open and edit this table just like item_proto. To add a new mob, right-click on the last row and use Insert Row. The mob ID must be unique and generally starts after 3000 to avoid conflicts with official Metin2 mob IDs. Ensure all information such as the mob name, graphics path, and AI type is filled in completely. Missing information may cause the mob to malfunction or become invisible in-game.
Data Validation and Testing[/BR][/BR]After making changes, ensure that the data is correctly entered before restarting the server. Especially check that IDs in item_proto and mob_proto are unique and properly entered. Incorrect IDs can cause crashes or errors on the server. After making changes in the database, don’t forget to Commit them; otherwise, the changes won't be saved. After committing, restart your server and test it. Check whether items and mobs appear correctly in-game.
Conclusion[/BR][/BR]Editing item_proto and mob_proto with Navicat significantly eases the Metin2 development process. Especially for systems containing high-volume data like 40K, it is a safer and faster approach than TXT DB usage. With this guide, you can now manage your Metin2 server more professionally by working directly with the database.
- Pelin Melek Aslan -
Bilgilendirme ;
Metin2 Lobby'da 40K item_proto ve mob_proto Dosyalarını Navicat ile Düzenlemek (TXT DB Kullanmadan)
Metin2 özel sunucu geliştirme süreçlerinde, item_proto ve mob_proto dosyaları büyük önem taşır. Bu dosyalar, oyuncuların kullanabileceği eşyaları ve haritalarda spawn edilecek olan mobları tanımlar. Geleneksel olarak birçok geliştirici, bu dosyaları TXT tabanlı veritabanları üzerinden düzenler. Ancak bu yöntem zamanla sınırlamalar doğurabilir. Özellikle 40K gibi yüksek sayıda veri barındıran sistemlerde, doğrudan SQL üzerinden işlem yapmak çok daha verimlidir. Bu rehberde, Navicat kullanarak item_proto ve mob_proto dosyalarını nasıl düzenleyeceğinizi adım adım anlatacağız. Bu yöntemde TXT DB kullanılmaz; tüm işlemler doğrudan veritabanı üzerinden yapılır.
Neden Navicat?
Navicat, güçlü bir veritabanı yönetim aracıdır. Görsel arayüzü sayesinde, veritabanı üzerinde kolayca gezinebilir, sorgular çalıştırabilir ve verileri düzenleyebilirsiniz. Metin2 geliştiricileri için, özellikle item_proto ve mob_proto gibi yoğun yapılar üzerinde çalışırken, Navicat kullanmak hem zaman kazandırır hem de hataları azaltır. Ayrıca, item_proto dosyasında 40.000'in üzerinde satır olduğunda, manuel TXT düzenleme çok karmaşık hale gelir. Navicat ile bu işlem çok daha kontrollü ve verimli yapılır.
Hazırlık Aşaması
İlk olarak, Metin2 veritabanınıza erişim sağlamanız gerekir. Sunucunuzda game_db adında bir veritabanı bulunur. Bu veritabanında item_proto ve mob_proto adlı iki temel tablo yer alır. Navicat üzerinden bu veritabanına bağlanın. Bağlantı bilgileriniz genellikle localhost, root kullanıcı adı ve şifrenizdir. Eğer farklı bir yapı kullanıyorsanız, bilgileri sunucu yapılandırmanıza göre ayarlayın.
item_proto Tablosunu Düzenlemek
item_proto tablosu, Metin2'de kullanılacak tüm eşyaların tanımlandığı yerdir. Her bir eşyanın ID'si, adı, sınıfı, grafik yolu, fiyat, dayanıklılık gibi bilgileri burada yer alır. Bu tabloya yeni bir eşya eklemek veya mevcut bir eşyayı düzenlemek oldukça kolaydır. Navicat üzerinden item_proto tablosuna sağ tıklayıp Open Table seçeneğini seçin. Artık tabloyu görsel olarak görüntüleyebilir ve veriler üzerinde değişiklik yapabilirsiniz. Örneğin, yeni bir eşya eklemek istiyorsanız, son satıra sağ tıklayıp Insert Row diyerek yeni bir satır oluşturabilirsiniz. Buraya eşyanın ID'sini, adını, grafik yolunu ve diğer özelliklerini girin. Dikkat edilmesi gereken en önemli konu, ID değerlerinin benzersiz olmasıdır. Aynı ID'ye sahip iki eşya olmamalıdır.
mob_proto Tablosunu Düzenlemek
mob_proto ise, Metin2 haritalarında spawn edilecek olan canavarların (NPC) tanımlandığı yerdir. Her bir mob, ID, ad, level, can, hasar, savunma gibi pek çok nitelikle tanımlanır. Bu tabloyu da item_proto gibi açabilir ve düzenleyebilirsiniz. Yeni bir mob eklemek için, yine son satıra sağ tıklayıp Insert Row komutunu kullanabilirsiniz. Mob ID'si benzersiz olmalıdır ve genellikle 3000’den sonra numaralandırılır. Bu şekilde, resmi Metin2 mob ID'leriyle çakışmazsınız. Mob adı, grafik yolu, AI türü gibi bilgileri eksiksiz girin. Bu bilgiler eksikse, mob sunucuda doğru çalışmaz veya görünmez.
Veri Doğrulama ve Test[/BR][/BR]Değişiklik yaptıktan sonra, sunucuyu yeniden başlatmadan önce verilerin doğru girildiğinden emin olun. Özellikle item_proto ve mob_proto’daki ID'lerin benzersiz ve doğru girildiğinden emin olun. Yanlış ID kullanımı, sunucuda çökme veya hata oluşmasına neden olabilir. Veritabanı üzerinde değişiklik yaptığınızda, Commit etmeyi unutmayın. Aksi takdirde değişiklikler kalıcı olmaz. Değişiklikleri yaptıktan sonra, sunucunuzu yeniden başlatın ve test edin. Eşyaların ve mobların doğru şekilde görünüp görünmediğini kontrol edin.
Sonuç[/BR][/BR]Navicat kullanarak item_proto ve mob_proto dosyalarını düzenlemek, Metin2 geliştirme sürecini büyük ölçüde kolaylaştırır. Özellikle 40K gibi yüksek sayıda veri içeren sistemlerde, TXT DB kullanımına göre daha güvenli ve hızlı bir yöntemdir. Bu rehber sayesinde, artık doğrudan SQL üzerinden veritabanı üzerinde çalışarak, Metin2 sunucunuzu daha profesyonel yönetebilirsiniz.
Editing 40K item_proto and mob_proto with Navicat (No TXT DB)
In the process of developing private Metin2 servers, item_proto and mob_proto files hold great importance. These files define the items that players can use and the mobs that will spawn on maps. Traditionally, many developers edit these files via TXT-based databases. However, this method may lead to limitations over time. Especially in systems like 40K, which contain a large number of entries, directly working with SQL becomes much more efficient. In this guide, we'll explain step by step how to edit item_proto and mob_proto files using Navicat. This method does not use TXT DB; all operations are performed directly within the database.
Why Navicat?
Navicat is a powerful database management tool. Its visual interface allows you to easily navigate through the database, run queries, and edit data. For Metin2 developers, especially when working with dense structures like item_proto and mob_proto, using Navicat saves time and reduces errors. Moreover, when the item_proto file contains over 40,000 rows, manual TXT editing becomes very complex. With Navicat, this process becomes far more controlled and efficient.
Preparation Stage
Firstly, you need to connect to your Metin2 database. Your server has a database named game_db. Within this database, there are two main tables called item_proto and mob_proto. Connect to this database via Navicat. Your connection details usually include localhost, root as username, and your password. If you're using a different setup, adjust the settings according to your server configuration.
Editing the item_proto Table
The item_proto table defines all the items used in Metin2. Each item contains its ID, name, class, graphics path, price, durability, and other attributes. Adding a new item or editing an existing one is quite straightforward. Right-click on the item_proto table in Navicat and select Open Table. Now you can visually view the table and make edits. For example, to add a new item, right-click on the last row and choose Insert Row. Enter the item’s ID, name, graphics path, and other properties. The most important thing to note is that IDs must be unique. There shouldn’t be two items with the same ID.
Editing the mob_proto Table
mob_proto defines the monsters (NPCs) that spawn in Metin2 maps. Each mob is defined by attributes such as ID, name, level, health, damage, defense, etc. You can open and edit this table just like item_proto. To add a new mob, right-click on the last row and use Insert Row. The mob ID must be unique and generally starts after 3000 to avoid conflicts with official Metin2 mob IDs. Ensure all information such as the mob name, graphics path, and AI type is filled in completely. Missing information may cause the mob to malfunction or become invisible in-game.
Data Validation and Testing[/BR][/BR]After making changes, ensure that the data is correctly entered before restarting the server. Especially check that IDs in item_proto and mob_proto are unique and properly entered. Incorrect IDs can cause crashes or errors on the server. After making changes in the database, don’t forget to Commit them; otherwise, the changes won't be saved. After committing, restart your server and test it. Check whether items and mobs appear correctly in-game.
Conclusion[/BR][/BR]Editing item_proto and mob_proto with Navicat significantly eases the Metin2 development process. Especially for systems containing high-volume data like 40K, it is a safer and faster approach than TXT DB usage. With this guide, you can now manage your Metin2 server more professionally by working directly with the database.
