BURDAN ÖNCELİKLE SÖYLÜYORUM ALINTIDIR SADECE BILGI OLSUN DIYE PAYLASMAK ISTEDIM PAYLAŞILDIYSA KAPATILABİLİR TRANSLATE EDİP PAYLAŞMAK İSTEDİM
Server Kısmı:
service.h'ı aç ve aşşağıdaki bloğu ekle
length.h'de arat:
ÜSTÜNE Ekle:
Aynı dosyadaki enumERaceFlags ile değiştir :
battle.cpp'de arat:
Üstüne Ekle:
char.cpp'de arat
Üstüne Ekle:
char.cpp'de arat:
Üstüne Ekle:
char.h'da arat:
Üstüne Ekle:
constants.cpp'de arat:
Üstüne Ekle:
Şimdi db sourcenin içine girelim.
ProtoReader.cpp'de Arat:
Bununla Değiştir:
Derleyin ve.
Client SRC'deki işlemlere geçelim:
locale_inc.h'i açıp altına ekleyelim:
PythonItemModule.cpp'de arat:
Üstüne Ekle:
Packet.h'de Arat:
Üstüne Ekle:
itemData.h'da Arat:
Üstüne Ekle:
Root dosyalarına geçelim.
uiToolTip.py'yi açın
ve Aratın:
Üstüne Ekle:
Dump Protoya gidelim ve ItemCSVReader.cpp'de Aratın:
Sonrasına Ekleyin:
Arat:
Bununla Değiştir:
Local dosyasının içine girin, locale_game.txt'de sona ekleyin:
Derleyin ve bu kadar.
İtem protoyu da şunlar için kullanın.
APPLY_ATTBONUS_ELEC,
APPLY_ATTBONUS_FIRE,
APPLY_ATTBONUS_ICE,
APPLY_ATTBONUS_WIND,
APPLY_ATTBONUS_EARTH,
APPLY_ATTBONUS_DARK
UMARIM İŞE YARAMIŞTIR TEŞEKKÜRLER
Metin2 özel sunucularında geliştirme yaparken, oyuncu deneyimini artırmak ve oyun içi stratejik derinliği genişletmek adına yeni sistemler entegre etmek oldukça önemlidir. Bu bağlamda, element bonusları gibi mekanikler, karakterlerin savaş dengelerini doğrudan etkileyebilir. Bu makalede, Metin2 özel sunucularda yeni element bonuslarının nasıl aktif edileceği konusunu detaylı olarak ele alacağız.
Element Sistemi Nedir?
Metin2'de element sistemi, karakterlerin silah ve zırhlar aracılığıyla sahip oldukları elemental değerlerle, düşmanlara karşı farklı bonuslar kazanmalarını sağlar. Geleneksel element tipleri arasında ateş, su, toprak ve rüzgar bulunur. Ancak bazı özel sunucular, bu sistemi genişleterek daha fazla element türü ve bonus kombinasyonu sunabilir.
Yeni Element Bonuslarının Aktifleştirilmesi İçin Gerekli Adımlar
1. Server Side Değişiklikler:
Sunucu tarafında yeni element sistemini aktif etmek için öncelikle game core dosyalarında değişiklik yapılması gerekir. Bu genellikle C++ tabanlı server src dosyalarında yapılır. Özellikle char.cpp, item.cpp ve battle.cpp gibi ana dosyalarda yeni element tanımlamaları ve bonus hesaplamaları yapılmaktadır.
2. Client Tarafında Desteğin Sağlanması:
Yeni element bonusları aktif edildiğinde, istemci tarafında da bu bilgilerin doğru şekilde görüntülenmesi gerekir. Bu işlem için client src üzerinde çalışmak gerekebilir. UI Script (uiscript), Python GUI (py gui) ve py root dosyalarında gerekli düzenlemeler yapılmalıdır.
3. Database Ayarlamaları:
Yeni element değerleri db (database) kısmında da tanımlanmalıdır. Item_properties veya char tables gibi tablolarda yeni element alanları oluşturulup, değerlerin doğru şekilde eşleştirilmesi sağlanmalıdır.
4. Auth ve Game Sunucu Eşgüdümü:
Auth ve game sunucusu arasında veri aktarımı sırasında yeni element değerlerinin eksiksiz aktarılması için gerekli protokol güncellemeleri yapılmalıdır. Bu, sunucu çökmesini veya veri kaybını önler.
Olası Sorunlar ve Çözümleri
Yeni element sistemlerini entegre ederken bazı durumlarda compile hataları, item drop problemleri veya client-side donmalar yaşanabilir. Bu sorunların çözümünde martysama gibi topluluk projelerinden destek almak faydalı olabilir. Ayrıca, source edit sırasında yapılan değişikliklerin yedeklenmesi, geri dönüşüm için kritik öneme sahiptir.
Sonuç
Metin2 özel sunucularında yeni element bonuslarını aktif etmek, hem oyuncuların ilgisini çekecek hem de oyun içi dengeyi etkileyebilecek önemli bir gelişmedir. Bu işlem, C++ bilgisi, Python script becerileri ve veritabanı yönetimi gerektirir. Doğru uygulandığında, sunucunuzun rekabet avantajı artar ve daha özgün bir oyun deneyimi sunulabilir.
When developing Metin2 private servers, integrating new systems such as element bonuses is crucial for enhancing player experience and increasing strategic depth within the game. This article will provide a detailed explanation on how to activate new element bonuses on Metin2 private servers.
What Is the Element System?
In Metin2, the element system allows characters to gain various bonuses against enemies through elemental values provided by their weapons and armor. Traditional elements include fire, water, earth, and wind. However, some private servers expand this system to include more element types and bonus combinations.
Steps to Activate New Element Bonuses
1. Server-Side Modifications:
To activate new elements on the server side, modifications must first be made to the game core files. This is usually done within the C++ based server src files. Files like char.cpp, item.cpp, and battle.cpp require updates to include new element definitions and bonus calculations.
2. Client-Side Support:
Once new element bonuses are activated, the client must correctly display these values. This requires working with client src files. Necessary adjustments must be made in UI Script (uiscript), Python GUI (py gui), and py root files.
3. Database Configurations:
New element values need to be defined in the db (database). Tables such as item_properties or char_tables should include new element fields and ensure proper value mapping.
4. Coordination Between Auth and Game Servers:
To ensure new element values are transferred correctly between auth and game servers, necessary protocol updates must be applied. This prevents server crashes or data loss during transfers.
Potential Issues and Solutions
While integrating new element systems, issues such as compile errors, item drop problems, or client-side freezes may occur. Community projects like martysama can offer support in resolving these issues. Additionally, backing up changes made during source edit processes is critical for recovery purposes.
Conclusion
Activating new element bonuses on Metin2 private servers is a significant update that can both attract players and influence in-game balance. This process requires knowledge of C++, Python scripting, and database management. When implemented correctly, it increases your server's competitive advantage and delivers a more unique gameplay experience.
Server Kısmı:
service.h'ı aç ve aşşağıdaki bloğu ekle
Kod:
#define ELEMENT_NEW_BONUSES
Kod:
MAX_APPLY_NUM, };
Kod:
#ifdef ELEMENT_NEW_BONUSES APPLY_ATTBONUS_ELEC, APPLY_ATTBONUS_FIRE, APPLY_ATTBONUS_ICE, APPLY_ATTBONUS_WIND, APPLY_ATTBONUS_EARTH, APPLY_ATTBONUS_DARK, #endif
Aynı dosyadaki enumERaceFlags ile değiştir :
Kod:
enum ERaceFlags { RACE_FLAG_ANIMAL = (1 << 0), RACE_FLAG_UNDEAD = (1 << 1), RACE_FLAG_DEVIL = (1 << 2), RACE_FLAG_HUMAN = (1 << 3), RACE_FLAG_ORC = (1 << 4), RACE_FLAG_MILGYO = (1 << 5), RACE_FLAG_INSECT = (1 << 6), RACE_FLAG_FIRE = (1 << 7), RACE_FLAG_ICE = (1 << 8), RACE_FLAG_DESERT = (1 << 9), RACE_FLAG_TREE = (1 << 10), RACE_FLAG_ELEC = (1 << 11), RACE_FLAG_WIND = (1 << 12), RACE_FLAG_EARTH = (1 << 13), RACE_FLAG_DARK = (1 << 14), RACE_FLAG_ATT_ELEC = (1 << 15), RACE_FLAG_ATT_FIRE = (1 << 16), RACE_FLAG_ATT_ICE = (1 << 17), RACE_FLAG_ATT_WIND = (1 << 18), RACE_FLAG_ATT_EARTH = (1 << 19), RACE_FLAG_ATT_DARK = (1 << 20), };
Kod:
else if (pkVictim->IsRaceFlag(RACE_FLAG_ICE)) iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_ICE)) / 100;
Kod:
#ifdef ELEMENT_NEW_BONUSES else if (pkVictim->IsRaceFlag(RACE_FLAG_ELEC)) iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_ELEC)) / 100; else if (pkVictim->IsRaceFlag(RACE_FLAG_WIND)) iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_WIND)) / 100; else if (pkVictim->IsRaceFlag(RACE_FLAG_EARTH)) iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_EARTH)) / 100; else if (pkVictim->IsRaceFlag(RACE_FLAG_DARK)) iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_DARK)) / 100; #endif
Kod:
case POINT_NORMAL_HIT_DEFEND_BONUS:
Kod:
#ifdef ELEMENT_NEW_BONUSES case POINT_ATTBONUS_ELEC: case POINT_ATTBONUS_FIRE: case POINT_ATTBONUS_ICE: case POINT_ATTBONUS_WIND: case POINT_ATTBONUS_EARTH: case POINT_ATTBONUS_DARK: #endif
Kod:
PointChange(aApplyInfo[bApplyType].bPointType, iVal);
Kod:
#ifdef ELEMENT_NEW_BONUSES case APPLY_ATTBONUS_ELEC: case APPLY_ATTBONUS_FIRE: case APPLY_ATTBONUS_ICE: case APPLY_ATTBONUS_WIND: case APPLY_ATTBONUS_EARTH: case APPLY_ATTBONUS_DARK: #endif
Kod:
}; enum EPKModes
Kod:
#ifdef ELEMENT_NEW_BONUSES POINT_ATTBONUS_ELEC, POINT_ATTBONUS_WIND, POINT_ATTBONUS_EARTH, POINT_ATTBONUS_DARK, #endif
Kod:
}; const int aiItemMagicAttributePercentHigh[ITEM_ATTRIBUTE_MAX_LEVEL] = {30, 40, 20, 8, 2};
Kod:
#ifdef ELEMENT_NEW_BONUSES { POINT_ATTBONUS_ELEC,}, { POINT_ATTBONUS_FIRE, }, { POINT_ATTBONUS_ICE, }, { POINT_ATTBONUS_WIND, }, { POINT_ATTBONUS_EARTH, }, { POINT_ATTBONUS_DARK, }, #endif
ProtoReader.cpp'de Arat:
Kod:
string arApplyType[*] = { "APPLY_NONE", "APPLY_MAX_HP", "APPLY_MAX_SP", "APPLY_CON", "APPLY_INT", "APPLY_STR", "APPLY_DEX", "APPLY_ATT_SPEED", "APPLY_MOV_SPEED", "APPLY_CAST_SPEED", "APPLY_HP_REGEN", "APPLY_SP_REGEN", "APPLY_POISON_PCT", "APPLY_STUN_PCT", "APPLY_SLOW_PCT", "APPLY_CRITICAL_PCT", "APPLY_PENETRATE_PCT", "APPLY_ATTBONUS_HUMAN", "APPLY_ATTBONUS_ANIMAL", "APPLY_ATTBONUS_ORC", "APPLY_ATTBONUS_MILGYO", "APPLY_ATTBONUS_UNDEAD", "APPLY_ATTBONUS_DEVIL", "APPLY_STEAL_HP", "APPLY_STEAL_SP", "APPLY_MANA_BURN_PCT", "APPLY_DAMAGE_SP_RECOVER", "APPLY_BLOCK", "APPLY_DODGE", "APPLY_RESIST_SWORD", "APPLY_RESIST_TWOHAND", "APPLY_RESIST_DAGGER", "APPLY_RESIST_BELL", "APPLY_RESIST_FAN", "APPLY_RESIST_BOW","APPLY_RESIST_FIRE", "APPLY_RESIST_ELEC", "APPLY_RESIST_MAGIC", "APPLY_RESIST_WIND", "APPLY_REFLECT_MELEE", "APPLY_REFLECT_CURSE", "APPLY_POISON_REDUCE", "APPLY_KILL_SP_RECOVER", "APPLY_EXP_DOUBLE_BONUS", "APPLY_GOLD_DOUBLE_BONUS", "APPLY_ITEM_DROP_BONUS", "APPLY_POTION_BONUS", "APPLY_KILL_HP_RECOVER", "APPLY_IMMUNE_STUN", "APPLY_IMMUNE_SLOW", "APPLY_IMMUNE_FALL", "APPLY_SKILL", "APPLY_BOW_DISTANCE", "APPLY_ATT_GRADE_BONUS", "APPLY_DEF_GRADE_BONUS", "APPLY_MAGIC_ATT_GRADE", "APPLY_MAGIC_DEF_GRADE", "APPLY_CURSE_PCT", "APPLY_MAX_STAMINA", "APPLY_ATTBONUS_WARRIOR", "APPLY_ATTBONUS_ASSASSIN", "APPLY_ATTBONUS_SURA", "APPLY_ATTBONUS_SHAMAN", "APPLY_ATTBONUS_MONSTER", "APPLY_MALL_ATTBONUS", "APPLY_MALL_DEFBONUS", "APPLY_MALL_EXPBONUS", "APPLY_MALL_ITEMBONUS", "APPLY_MALL_GOLDBONUS", "APPLY_MAX_HP_PCT", "APPLY_MAX_SP_PCT", "APPLY_SKILL_DAMAGE_BONUS","APPLY_NORMAL_HIT_DAMAGE_BONUS", "APPLY_SKILL_DEFEND_BONUS", "APPLY_NORMAL_HIT_DEFEND_BONUS", "APPLY_PC_BANG_EXP_BONUS", "APPLY_PC_BANG_DROP_BONUS", "APPLY_EXTRACT_HP_PCT", "APPLY_RESIST_WARRIOR", "APPLY_RESIST_ASSASSIN", "APPLY_RESIST_SURA", "APPLY_RESIST_SHAMAN", "APPLY_ENERGY", "APPLY_DEF_GRADE", "APPLY_COSTUME_ATTR_BONUS", "APPLY_MAGIC_ATTBONUS_PER", "APPLY_MELEE_MAGIC_ATTBONUS_PER", "APPLY_RESIST_ICE", "APPLY_RESIST_EARTH", "APPLY_RESIST_DARK", "APPLY_ANTI_CRITICAL_PCT", "APPLY_ANTI_PENETRATE_PCT", "APPLY_ATTBONUS_WOLF", "APPLY_RESIST_WOLF", "APPLY_RESIST_CLAW", "APPLY_ANTI_RESIST_MAGIC", "APPLY_ATTBONUS_ELECT", "APPLY_ATTBONUS_FIRE", "APPLY_ATTBONUS_ICE", "APPLY_ATTBONUS_WIND", "APPLY_ATTBONUS_EARTH", "APPLY_ATTBONUS_DARK" };
Kod:
#ifdef ELEMENT_NEW_BONUSES string arApplyType[*] = { "APPLY_NONE", "APPLY_MAX_HP", "APPLY_MAX_SP", "APPLY_CON", "APPLY_INT", "APPLY_STR", "APPLY_DEX", "APPLY_ATT_SPEED", "APPLY_MOV_SPEED", "APPLY_CAST_SPEED", "APPLY_HP_REGEN", "APPLY_SP_REGEN", "APPLY_POISON_PCT", "APPLY_STUN_PCT", "APPLY_SLOW_PCT", "APPLY_CRITICAL_PCT", "APPLY_PENETRATE_PCT", "APPLY_ATTBONUS_HUMAN", "APPLY_ATTBONUS_ANIMAL", "APPLY_ATTBONUS_ORC", "APPLY_ATTBONUS_MILGYO", "APPLY_ATTBONUS_UNDEAD", "APPLY_ATTBONUS_DEVIL", "APPLY_STEAL_HP", "APPLY_STEAL_SP", "APPLY_MANA_BURN_PCT", "APPLY_DAMAGE_SP_RECOVER", "APPLY_BLOCK", "APPLY_DODGE", "APPLY_RESIST_SWORD", "APPLY_RESIST_TWOHAND", "APPLY_RESIST_DAGGER", "APPLY_RESIST_BELL", "APPLY_RESIST_FAN", "APPLY_RESIST_BOW","APPLY_RESIST_FIRE", "APPLY_RESIST_ELEC", "APPLY_RESIST_MAGIC", "APPLY_RESIST_WIND", "APPLY_REFLECT_MELEE", "APPLY_REFLECT_CURSE", "APPLY_POISON_REDUCE", "APPLY_KILL_SP_RECOVER", "APPLY_EXP_DOUBLE_BONUS", "APPLY_GOLD_DOUBLE_BONUS", "APPLY_ITEM_DROP_BONUS", "APPLY_POTION_BONUS", "APPLY_KILL_HP_RECOVER", "APPLY_IMMUNE_STUN", "APPLY_IMMUNE_SLOW", "APPLY_IMMUNE_FALL", "APPLY_SKILL", "APPLY_BOW_DISTANCE", "APPLY_ATT_GRADE_BONUS", "APPLY_DEF_GRADE_BONUS", "APPLY_MAGIC_ATT_GRADE", "APPLY_MAGIC_DEF_GRADE", "APPLY_CURSE_PCT", "APPLY_MAX_STAMINA", "APPLY_ATTBONUS_WARRIOR", "APPLY_ATTBONUS_ASSASSIN", "APPLY_ATTBONUS_SURA", "APPLY_ATTBONUS_SHAMAN", "APPLY_ATTBONUS_MONSTER", "APPLY_MALL_ATTBONUS", "APPLY_MALL_DEFBONUS", "APPLY_MALL_EXPBONUS", "APPLY_MALL_ITEMBONUS", "APPLY_MALL_GOLDBONUS", "APPLY_MAX_HP_PCT", "APPLY_MAX_SP_PCT", "APPLY_SKILL_DAMAGE_BONUS","APPLY_NORMAL_HIT_DAMAGE_BONUS", "APPLY_SKILL_DEFEND_BONUS", "APPLY_NORMAL_HIT_DEFEND_BONUS", "APPLY_PC_BANG_EXP_BONUS", "APPLY_PC_BANG_DROP_BONUS", "APPLY_EXTRACT_HP_PCT", "APPLY_RESIST_WARRIOR", "APPLY_RESIST_ASSASSIN", "APPLY_RESIST_SURA", "APPLY_RESIST_SHAMAN", "APPLY_ENERGY", "APPLY_DEF_GRADE", "APPLY_COSTUME_ATTR_BONUS", "APPLY_MAGIC_ATTBONUS_PER", "APPLY_MELEE_MAGIC_ATTBONUS_PER", "APPLY_RESIST_ICE", "APPLY_RESIST_EARTH", "APPLY_RESIST_DARK", "APPLY_ANTI_CRITICAL_PCT", "APPLY_ANTI_PENETRATE_PCT", "APPLY_ATTBONUS_WOLF", "APPLY_RESIST_WOLF", "APPLY_RESIST_CLAW", "APPLY_ANTI_RESIST_MAGIC", "APPLY_ATTBONUS_ELECT", "APPLY_ATTBONUS_FIRE", "APPLY_ATTBONUS_ICE", "APPLY_ATTBONUS_WIND", "APPLY_ATTBONUS_EARTH", "APPLY_ATTBONUS_DARK" }; #else string arApplyType[*] = { "APPLY_NONE", "APPLY_MAX_HP", "APPLY_MAX_SP", "APPLY_CON", "APPLY_INT", "APPLY_STR", "APPLY_DEX", "APPLY_ATT_SPEED", "APPLY_MOV_SPEED", "APPLY_CAST_SPEED", "APPLY_HP_REGEN", "APPLY_SP_REGEN", "APPLY_POISON_PCT", "APPLY_STUN_PCT", "APPLY_SLOW_PCT", "APPLY_CRITICAL_PCT", "APPLY_PENETRATE_PCT", "APPLY_ATTBONUS_HUMAN", "APPLY_ATTBONUS_ANIMAL", "APPLY_ATTBONUS_ORC", "APPLY_ATTBONUS_MILGYO", "APPLY_ATTBONUS_UNDEAD", "APPLY_ATTBONUS_DEVIL", "APPLY_STEAL_HP", "APPLY_STEAL_SP", "APPLY_MANA_BURN_PCT", "APPLY_DAMAGE_SP_RECOVER", "APPLY_BLOCK", "APPLY_DODGE", "APPLY_RESIST_SWORD", "APPLY_RESIST_TWOHAND", "APPLY_RESIST_DAGGER", "APPLY_RESIST_BELL", "APPLY_RESIST_FAN", "APPLY_RESIST_BOW", "APPLY_RESIST_FIRE", "APPLY_RESIST_ELEC", "APPLY_RESIST_MAGIC", "APPLY_RESIST_WIND", "APPLY_REFLECT_MELEE", "APPLY_REFLECT_CURSE", "APPLY_POISON_REDUCE", "APPLY_KILL_SP_RECOVER", "APPLY_EXP_DOUBLE_BONUS", "APPLY_GOLD_DOUBLE_BONUS", "APPLY_ITEM_DROP_BONUS", "APPLY_POTION_BONUS", "APPLY_KILL_HP_RECOVER", "APPLY_IMMUNE_STUN", "APPLY_IMMUNE_SLOW", "APPLY_IMMUNE_FALL", "APPLY_SKILL", "APPLY_BOW_DISTANCE", "APPLY_ATT_GRADE_BONUS", "APPLY_DEF_GRADE_BONUS", "APPLY_MAGIC_ATT_GRADE", "APPLY_MAGIC_DEF_GRADE", "APPLY_CURSE_PCT", "APPLY_MAX_STAMINA", "APPLY_ATTBONUS_WARRIOR", "APPLY_ATTBONUS_ASSASSIN", "APPLY_ATTBONUS_SURA", "APPLY_ATTBONUS_SHAMAN", "APPLY_ATTBONUS_MONSTER", "APPLY_MALL_ATTBONUS", "APPLY_MALL_DEFBONUS", "APPLY_MALL_EXPBONUS", "APPLY_MALL_ITEMBONUS", "APPLY_MALL_GOLDBONUS", "APPLY_MAX_HP_PCT", "APPLY_MAX_SP_PCT", "APPLY_SKILL_DAMAGE_BONUS", "APPLY_NORMAL_HIT_DAMAGE_BONUS", "APPLY_SKILL_DEFEND_BONUS", "APPLY_NORMAL_HIT_DEFEND_BONUS", "APPLY_PC_BANG_EXP_BONUS", "APPLY_PC_BANG_DROP_BONUS", "APPLY_EXTRACT_HP_PCT", "APPLY_RESIST_WARRIOR", "APPLY_RESIST_ASSASSIN", "APPLY_RESIST_SURA", "APPLY_RESIST_SHAMAN", "APPLY_ENERGY", "APPLY_DEF_GRADE", "APPLY_COSTUME_ATTR_BONUS", "APPLY_MAGIC_ATTBONUS_PER", "APPLY_MELEE_MAGIC_ATTBONUS_PER", "APPLY_RESIST_ICE", "APPLY_RESIST_EARTH", "APPLY_RESIST_DARK", "APPLY_ANTI_CRITICAL_PCT", "APPLY_ANTI_PENETRATE_PCT", "APPLY_ATTBONUS_WOLF", "APPLY_RESIST_WOLF", "APPLY_RESIST_CLAW", "APPLY_ANTI_RESIST_MAGIC", }; #endif
Client SRC'deki işlemlere geçelim:
locale_inc.h'i açıp altına ekleyelim:
Kod:
#define ELEMENT_NEW_BONUSES
Kod:
#ifdef ENABLE_NEW_EQUIPMENT_SYSTEM
Kod:
#ifdef ELEMENT_NEW_BONUSES PyModule_AddIntConstant(poModule, "APPLY_ATTBONUS_ELEC", CItemData::APPLY_ATTBONUS_ELEC); PyModule_AddIntConstant(poModule, "APPLY_ATTBONUS_FIRE", CItemData::APPLY_ATTBONUS_FIRE); PyModule_AddIntConstant(poModule, "APPLY_ATTBONUS_ICE", CItemData::APPLY_ATTBONUS_ICE); PyModule_AddIntConstant(poModule, "APPLY_ATTBONUS_WIND", CItemData::APPLY_ATTBONUS_WIND); PyModule_AddIntConstant(poModule, "APPLY_ATTBONUS_EARTH", CItemData::APPLY_ATTBONUS_EARTH); PyModule_AddIntConstant(poModule, "APPLY_ATTBONUS_DARK", CItemData::APPLY_ATTBONUS_DARK); #endif
Kod:
POINT_MIN_WEP = 200,
Kod:
#ifdef ELEMENT_NEW_BONUSES POINT_ATTBONUS_ELEC, POINT_ATTBONUS_WIND, POINT_ATTBONUS_EARTH, POINT_ATTBONUS_DARK, #endif
Kod:
MAX_APPLY_NUM, }; enum EImmuneFlags
Kod:
#ifdef ELEMENT_NEW_BONUSES APPLY_ATTBONUS_ELEC, APPLY_ATTBONUS_FIRE, APPLY_ATTBONUS_ICE, APPLY_ATTBONUS_WIND, APPLY_ATTBONUS_EARTH, APPLY_ATTBONUS_DARK, #endif
uiToolTip.py'yi açın
ve Aratın:
Kod:
} ATTRIBUTE_NEED_WIDTH = {
Kod:
item.APPLY_ATTBONUS_ELEC : localeInfo.TOOLTIP_APPLY_ATTBONUS_ELEC, item.APPLY_ATTBONUS_FIRE : localeInfo.TOOLTIP_APPLY_ATTBONUS_FIRE, item.APPLY_ATTBONUS_ICE : localeInfo.TOOLTIP_APPLY_ATTBONUS_ICE, item.APPLY_ATTBONUS_WIND : localeInfo.TOOLTIP_APPLY_ATTBONUS_WIND, item.APPLY_ATTBONUS_EARTH : localeInfo.TOOLTIP_APPLY_ATTBONUS_EARTH, item.APPLY_ATTBONUS_DARK : localeInfo.TOOLTIP_APPLY_ATTBONUS_DARK,
Kod:
#include "ItemCSVReader.h"
Kod:
#define ELEMENT_NEW_BONUSES
Kod:
string arApplyType[*] = {"APPLY_NONE", "APPLY_MAX_HP", "APPLY_MAX_SP", "APPLY_CON", "APPLY_INT", "APPLY_STR", "APPLY_DEX", "APPLY_ATT_SPEED", "APPLY_MOV_SPEED", "APPLY_CAST_SPEED", "APPLY_HP_REGEN", "APPLY_SP_REGEN", "APPLY_POISON_PCT", "APPLY_STUN_PCT", "APPLY_SLOW_PCT", "APPLY_CRITICAL_PCT", "APPLY_PENETRATE_PCT", "APPLY_ATTBONUS_HUMAN", "APPLY_ATTBONUS_ANIMAL", "APPLY_ATTBONUS_ORC", "APPLY_ATTBONUS_MILGYO", "APPLY_ATTBONUS_UNDEAD", "APPLY_ATTBONUS_DEVIL", "APPLY_STEAL_HP", "APPLY_STEAL_SP", "APPLY_MANA_BURN_PCT", "APPLY_DAMAGE_SP_RECOVER", "APPLY_BLOCK", "APPLY_DODGE", "APPLY_RESIST_SWORD", "APPLY_RESIST_TWOHAND", "APPLY_RESIST_DAGGER", "APPLY_RESIST_BELL", "APPLY_RESIST_FAN", "APPLY_RESIST_BOW","APPLY_RESIST_FIRE", "APPLY_RESIST_ELEC", "APPLY_RESIST_MAGIC", "APPLY_RESIST_WIND", "APPLY_REFLECT_MELEE", "APPLY_REFLECT_CURSE", "APPLY_POISON_REDUCE", "APPLY_KILL_SP_RECOVER", "APPLY_EXP_DOUBLE_BONUS", "APPLY_GOLD_DOUBLE_BONUS", "APPLY_ITEM_DROP_BONUS", "APPLY_POTION_BONUS", "APPLY_KILL_HP_RECOVER", "APPLY_IMMUNE_STUN", "APPLY_IMMUNE_SLOW", "APPLY_IMMUNE_FALL", "APPLY_SKILL", "APPLY_BOW_DISTANCE", "APPLY_ATT_GRADE_BONUS", "APPLY_DEF_GRADE_BONUS", "APPLY_MAGIC_ATT_GRADE", "APPLY_MAGIC_DEF_GRADE", "APPLY_CURSE_PCT", "APPLY_MAX_STAMINA", "APPLY_ATTBONUS_WARRIOR", "APPLY_ATTBONUS_ASSASSIN", "APPLY_ATTBONUS_SURA", "APPLY_ATTBONUS_SHAMAN", "APPLY_ATTBONUS_MONSTER", "APPLY_MALL_ATTBONUS", "APPLY_MALL_DEFBONUS", "APPLY_MALL_EXPBONUS", "APPLY_MALL_ITEMBONUS", "APPLY_MALL_GOLDBONUS", "APPLY_MAX_HP_PCT", "APPLY_MAX_SP_PCT", "APPLY_SKILL_DAMAGE_BONUS","APPLY_NORMAL_HIT_DAMAGE_BONUS", "APPLY_SKILL_DEFEND_BONUS", "APPLY_NORMAL_HIT_DEFEND_BONUS", "APPLY_PC_BANG_EXP_BONUS", "APPLY_PC_BANG_DROP_BONUS", "APPLY_EXTRACT_HP_PCT", "APPLY_RESIST_WARRIOR", "APPLY_RESIST_ASSASSIN", "APPLY_RESIST_SURA", "APPLY_RESIST_SHAMAN", "APPLY_ENERGY", "APPLY_DEF_GRADE", "APPLY_COSTUME_ATTR_BONUS", "APPLY_MAGIC_ATTBONUS_PER", "APPLY_MELEE_MAGIC_ATTBONUS_PER", "APPLY_RESIST_ICE", "APPLY_RESIST_EARTH", "APPLY_RESIST_DARK", "APPLY_ANTI_CRITICAL_PCT", "APPLY_ANTI_PENETRATE_PCT", "APPLY_ATTBONUS_WOLF", "APPLY_RESIST_WOLF", "APPLY_RESIST_CLAW","APPLY_ANTI_RESIST_MAGIC","APPLY_ATTBONUS_ELECT","APPLY_ATTBONUS_FIRE","APPLY_ATTBONUS_ICE","APPLY_ATTBONUS_WIND","APPLY_ATTBONUS_EARTH","APPLY_ATTBONUS_DARK"};
Kod:
#ifdef ELEMENT_NEW_BONUSES string arApplyType[*] = {"APPLY_NONE", "APPLY_MAX_HP", "APPLY_MAX_SP", "APPLY_CON", "APPLY_INT", "APPLY_STR", "APPLY_DEX", "APPLY_ATT_SPEED", "APPLY_MOV_SPEED", "APPLY_CAST_SPEED", "APPLY_HP_REGEN", "APPLY_SP_REGEN", "APPLY_POISON_PCT", "APPLY_STUN_PCT", "APPLY_SLOW_PCT", "APPLY_CRITICAL_PCT", "APPLY_PENETRATE_PCT", "APPLY_ATTBONUS_HUMAN", "APPLY_ATTBONUS_ANIMAL", "APPLY_ATTBONUS_ORC", "APPLY_ATTBONUS_MILGYO", "APPLY_ATTBONUS_UNDEAD", "APPLY_ATTBONUS_DEVIL", "APPLY_STEAL_HP", "APPLY_STEAL_SP", "APPLY_MANA_BURN_PCT", "APPLY_DAMAGE_SP_RECOVER", "APPLY_BLOCK", "APPLY_DODGE", "APPLY_RESIST_SWORD", "APPLY_RESIST_TWOHAND", "APPLY_RESIST_DAGGER", "APPLY_RESIST_BELL", "APPLY_RESIST_FAN", "APPLY_RESIST_BOW","APPLY_RESIST_FIRE", "APPLY_RESIST_ELEC", "APPLY_RESIST_MAGIC", "APPLY_RESIST_WIND", "APPLY_REFLECT_MELEE", "APPLY_REFLECT_CURSE", "APPLY_POISON_REDUCE", "APPLY_KILL_SP_RECOVER", "APPLY_EXP_DOUBLE_BONUS", "APPLY_GOLD_DOUBLE_BONUS", "APPLY_ITEM_DROP_BONUS", "APPLY_POTION_BONUS", "APPLY_KILL_HP_RECOVER", "APPLY_IMMUNE_STUN", "APPLY_IMMUNE_SLOW", "APPLY_IMMUNE_FALL", "APPLY_SKILL", "APPLY_BOW_DISTANCE", "APPLY_ATT_GRADE_BONUS", "APPLY_DEF_GRADE_BONUS", "APPLY_MAGIC_ATT_GRADE", "APPLY_MAGIC_DEF_GRADE", "APPLY_CURSE_PCT", "APPLY_MAX_STAMINA", "APPLY_ATTBONUS_WARRIOR", "APPLY_ATTBONUS_ASSASSIN", "APPLY_ATTBONUS_SURA", "APPLY_ATTBONUS_SHAMAN", "APPLY_ATTBONUS_MONSTER", "APPLY_MALL_ATTBONUS", "APPLY_MALL_DEFBONUS", "APPLY_MALL_EXPBONUS", "APPLY_MALL_ITEMBONUS", "APPLY_MALL_GOLDBONUS", "APPLY_MAX_HP_PCT", "APPLY_MAX_SP_PCT", "APPLY_SKILL_DAMAGE_BONUS","APPLY_NORMAL_HIT_DAMAGE_BONUS", "APPLY_SKILL_DEFEND_BONUS", "APPLY_NORMAL_HIT_DEFEND_BONUS", "APPLY_PC_BANG_EXP_BONUS", "APPLY_PC_BANG_DROP_BONUS", "APPLY_EXTRACT_HP_PCT", "APPLY_RESIST_WARRIOR", "APPLY_RESIST_ASSASSIN", "APPLY_RESIST_SURA", "APPLY_RESIST_SHAMAN", "APPLY_ENERGY", "APPLY_DEF_GRADE", "APPLY_COSTUME_ATTR_BONUS", "APPLY_MAGIC_ATTBONUS_PER", "APPLY_MELEE_MAGIC_ATTBONUS_PER", "APPLY_RESIST_ICE", "APPLY_RESIST_EARTH", "APPLY_RESIST_DARK", "APPLY_ANTI_CRITICAL_PCT", "APPLY_ANTI_PENETRATE_PCT", "APPLY_ATTBONUS_WOLF", "APPLY_RESIST_WOLF", "APPLY_RESIST_CLAW","APPLY_ANTI_RESIST_MAGIC","APPLY_ATTBONUS_ELECT","APPLY_ATTBONUS_FIRE","APPLY_ATTBONUS_ICE","APPLY_ATTBONUS_WIND","APPLY_ATTBONUS_EARTH","APPLY_ATTBONUS_DARK"}; #else string arApplyType[*] = { "APPLY_NONE", "APPLY_MAX_HP", "APPLY_MAX_SP", "APPLY_CON", "APPLY_INT", "APPLY_STR", "APPLY_DEX", "APPLY_ATT_SPEED", "APPLY_MOV_SPEED", "APPLY_CAST_SPEED", "APPLY_HP_REGEN", "APPLY_SP_REGEN", "APPLY_POISON_PCT", "APPLY_STUN_PCT", "APPLY_SLOW_PCT", "APPLY_CRITICAL_PCT", "APPLY_PENETRATE_PCT", "APPLY_ATTBONUS_HUMAN", "APPLY_ATTBONUS_ANIMAL", "APPLY_ATTBONUS_ORC", "APPLY_ATTBONUS_MILGYO", "APPLY_ATTBONUS_UNDEAD", "APPLY_ATTBONUS_DEVIL", "APPLY_STEAL_HP", "APPLY_STEAL_SP", "APPLY_MANA_BURN_PCT", "APPLY_DAMAGE_SP_RECOVER", "APPLY_BLOCK", "APPLY_DODGE", "APPLY_RESIST_SWORD", "APPLY_RESIST_TWOHAND", "APPLY_RESIST_DAGGER", "APPLY_RESIST_BELL", "APPLY_RESIST_FAN", "APPLY_RESIST_BOW", "APPLY_RESIST_FIRE", "APPLY_RESIST_ELEC", "APPLY_RESIST_MAGIC", "APPLY_RESIST_WIND", "APPLY_REFLECT_MELEE", "APPLY_REFLECT_CURSE", "APPLY_POISON_REDUCE", "APPLY_KILL_SP_RECOVER", "APPLY_EXP_DOUBLE_BONUS", "APPLY_GOLD_DOUBLE_BONUS", "APPLY_ITEM_DROP_BONUS", "APPLY_POTION_BONUS", "APPLY_KILL_HP_RECOVER", "APPLY_IMMUNE_STUN", "APPLY_IMMUNE_SLOW", "APPLY_IMMUNE_FALL", "APPLY_SKILL", "APPLY_BOW_DISTANCE", "APPLY_ATT_GRADE_BONUS", "APPLY_DEF_GRADE_BONUS", "APPLY_MAGIC_ATT_GRADE", "APPLY_MAGIC_DEF_GRADE", "APPLY_CURSE_PCT", "APPLY_MAX_STAMINA", "APPLY_ATTBONUS_WARRIOR", "APPLY_ATTBONUS_ASSASSIN", "APPLY_ATTBONUS_SURA", "APPLY_ATTBONUS_SHAMAN", "APPLY_ATTBONUS_MONSTER", "APPLY_MALL_ATTBONUS", "APPLY_MALL_DEFBONUS", "APPLY_MALL_EXPBONUS", "APPLY_MALL_ITEMBONUS", "APPLY_MALL_GOLDBONUS", "APPLY_MAX_HP_PCT", "APPLY_MAX_SP_PCT", "APPLY_SKILL_DAMAGE_BONUS", "APPLY_NORMAL_HIT_DAMAGE_BONUS", "APPLY_SKILL_DEFEND_BONUS", "APPLY_NORMAL_HIT_DEFEND_BONUS", "APPLY_PC_BANG_EXP_BONUS", "APPLY_PC_BANG_DROP_BONUS", "APPLY_EXTRACT_HP_PCT", "APPLY_RESIST_WARRIOR", "APPLY_RESIST_ASSASSIN", "APPLY_RESIST_SURA", "APPLY_RESIST_SHAMAN", "APPLY_ENERGY", "APPLY_DEF_GRADE", "APPLY_COSTUME_ATTR_BONUS", "APPLY_MAGIC_ATTBONUS_PER", "APPLY_MELEE_MAGIC_ATTBONUS_PER", "APPLY_RESIST_ICE", "APPLY_RESIST_EARTH", "APPLY_RESIST_DARK", "APPLY_ANTI_CRITICAL_PCT", "APPLY_ANTI_PENETRATE_PCT", "APPLY_ATTBONUS_WOLF", "APPLY_RESIST_WOLF", "APPLY_RESIST_CLAW", "APPLY_ANTI_RESIST_MAGIC", }; #endif
Kod:
TOOLTIP_APPLY_ATTBONUS_ELEC Strong against Lightning +%d%% SA TOOLTIP_APPLY_ATTBONUS_FIRE Strong against Fire +%d%% SA TOOLTIP_APPLY_ATTBONUS_ICE Strong against Ice +%d%% SA TOOLTIP_APPLY_ATTBONUS_WIND Strong against Wind +%d%% SA TOOLTIP_APPLY_ATTBONUS_EARTH Strong against Earth +%d%% SA TOOLTIP_APPLY_ATTBONUS_DARK Strong against Dark +%d%% SA
Derleyin ve bu kadar.
İtem protoyu da şunlar için kullanın.
APPLY_ATTBONUS_ELEC,
APPLY_ATTBONUS_FIRE,
APPLY_ATTBONUS_ICE,
APPLY_ATTBONUS_WIND,
APPLY_ATTBONUS_EARTH,
APPLY_ATTBONUS_DARK
UMARIM İŞE YARAMIŞTIR TEŞEKKÜRLER
- <li data-xf-list-type="ul">
Yeni Element Bonuslarının Aktifleştirilmesi
Metin2 özel sunucularında geliştirme yaparken, oyuncu deneyimini artırmak ve oyun içi stratejik derinliği genişletmek adına yeni sistemler entegre etmek oldukça önemlidir. Bu bağlamda, element bonusları gibi mekanikler, karakterlerin savaş dengelerini doğrudan etkileyebilir. Bu makalede, Metin2 özel sunucularda yeni element bonuslarının nasıl aktif edileceği konusunu detaylı olarak ele alacağız.
Element Sistemi Nedir?
Metin2'de element sistemi, karakterlerin silah ve zırhlar aracılığıyla sahip oldukları elemental değerlerle, düşmanlara karşı farklı bonuslar kazanmalarını sağlar. Geleneksel element tipleri arasında ateş, su, toprak ve rüzgar bulunur. Ancak bazı özel sunucular, bu sistemi genişleterek daha fazla element türü ve bonus kombinasyonu sunabilir.
Yeni Element Bonuslarının Aktifleştirilmesi İçin Gerekli Adımlar
1. Server Side Değişiklikler:
Sunucu tarafında yeni element sistemini aktif etmek için öncelikle game core dosyalarında değişiklik yapılması gerekir. Bu genellikle C++ tabanlı server src dosyalarında yapılır. Özellikle char.cpp, item.cpp ve battle.cpp gibi ana dosyalarda yeni element tanımlamaları ve bonus hesaplamaları yapılmaktadır.
2. Client Tarafında Desteğin Sağlanması:
Yeni element bonusları aktif edildiğinde, istemci tarafında da bu bilgilerin doğru şekilde görüntülenmesi gerekir. Bu işlem için client src üzerinde çalışmak gerekebilir. UI Script (uiscript), Python GUI (py gui) ve py root dosyalarında gerekli düzenlemeler yapılmalıdır.
3. Database Ayarlamaları:
Yeni element değerleri db (database) kısmında da tanımlanmalıdır. Item_properties veya char tables gibi tablolarda yeni element alanları oluşturulup, değerlerin doğru şekilde eşleştirilmesi sağlanmalıdır.
4. Auth ve Game Sunucu Eşgüdümü:
Auth ve game sunucusu arasında veri aktarımı sırasında yeni element değerlerinin eksiksiz aktarılması için gerekli protokol güncellemeleri yapılmalıdır. Bu, sunucu çökmesini veya veri kaybını önler.
Olası Sorunlar ve Çözümleri
Yeni element sistemlerini entegre ederken bazı durumlarda compile hataları, item drop problemleri veya client-side donmalar yaşanabilir. Bu sorunların çözümünde martysama gibi topluluk projelerinden destek almak faydalı olabilir. Ayrıca, source edit sırasında yapılan değişikliklerin yedeklenmesi, geri dönüşüm için kritik öneme sahiptir.
Sonuç
Metin2 özel sunucularında yeni element bonuslarını aktif etmek, hem oyuncuların ilgisini çekecek hem de oyun içi dengeyi etkileyebilecek önemli bir gelişmedir. Bu işlem, C++ bilgisi, Python script becerileri ve veritabanı yönetimi gerektirir. Doğru uygulandığında, sunucunuzun rekabet avantajı artar ve daha özgün bir oyun deneyimi sunulabilir.
Activating New Element Bonuses
When developing Metin2 private servers, integrating new systems such as element bonuses is crucial for enhancing player experience and increasing strategic depth within the game. This article will provide a detailed explanation on how to activate new element bonuses on Metin2 private servers.
What Is the Element System?
In Metin2, the element system allows characters to gain various bonuses against enemies through elemental values provided by their weapons and armor. Traditional elements include fire, water, earth, and wind. However, some private servers expand this system to include more element types and bonus combinations.
Steps to Activate New Element Bonuses
1. Server-Side Modifications:
To activate new elements on the server side, modifications must first be made to the game core files. This is usually done within the C++ based server src files. Files like char.cpp, item.cpp, and battle.cpp require updates to include new element definitions and bonus calculations.
2. Client-Side Support:
Once new element bonuses are activated, the client must correctly display these values. This requires working with client src files. Necessary adjustments must be made in UI Script (uiscript), Python GUI (py gui), and py root files.
3. Database Configurations:
New element values need to be defined in the db (database). Tables such as item_properties or char_tables should include new element fields and ensure proper value mapping.
4. Coordination Between Auth and Game Servers:
To ensure new element values are transferred correctly between auth and game servers, necessary protocol updates must be applied. This prevents server crashes or data loss during transfers.
Potential Issues and Solutions
While integrating new element systems, issues such as compile errors, item drop problems, or client-side freezes may occur. Community projects like martysama can offer support in resolving these issues. Additionally, backing up changes made during source edit processes is critical for recovery purposes.
Conclusion
Activating new element bonuses on Metin2 private servers is a significant update that can both attract players and influence in-game balance. This process requires knowledge of C++, Python scripting, and database management. When implemented correctly, it increases your server's competitive advantage and delivers a more unique gameplay experience.
