ATK/DEF/ARM Increase
Explicação: No Tibia 8.0 nós temos algumas armas que aumentam a Def (e.g: You see a XXXX. (Atk: YY Def: ZZ + A)
Fiz semelhante, mas a diferença é que ele pode aumentar o ataque ou mesmo a armor.
Esse é meu primeiro código em OTServ, não tive recursos de testar, mas acho que está 100%
Vamos ao código
Items.cpp
Em ItemType::ItemType()
Adicione:
atkbonus = 0; armbonus = 0; defbonus = 0;
Depois de:
else if(strcasecmp(strValue.c_str(), "attack") == 0){ if(readXMLInteger(itemAttributesNode, "value", intValue)){ it.attack = intValue; } } else if(strcasecmp(strValue.c_str(), "armor") == 0){ if(readXMLInteger(itemAttributesNode, "value", intValue)){ it.armor = intValue; } } else if(strcasecmp(strValue.c_str(), "defense") == 0){ if(readXMLInteger(itemAttributesNode, "value", intValue)){ it.defense= intValue; } }
Adicione:
else if(strcasecmp(strValue.c_str(), "atkincrease") == 0){ if(readXMLInteger(itemAttributesNode, "value", intValue)){ it.atkbonus = intValue; } } else if(strcasecmp(strValue.c_str(), "armincrease") == 0){ if(readXMLInteger(itemAttributesNode, "value", intValue)){ it.armbonus = intValue; } } else if(strcasecmp(strValue.c_str(), "defincrease") == 0){ if(readXMLInteger(itemAttributesNode, "value", intValue)){ it.defbonus = intValue; } }
Troque:
return baseDefense + (defense * shieldSkill) / 100;
Por:
if(getDefBonus) { return getDefBonus() + baseDefense + (defense * shieldSkill) / 100; } else if(getArmBonus) { return getArmBonus() + baseDefense + (defense * shieldSkill) / 100; } else if(getDefBonus && getArmBonus) { return getArmBonus() + getDefBonus() + baseDefense + (defense * shieldSkill) / 100; } else { return baseDefense + (defense * shieldSkill) / 100; }
Items.h
Declare esses valores:
int32_t atkbonus; int32_t armbonus; int32_t defbonus;
E depois de:
int32_t getAttack() const {return items[id].attack;} int32_t getArmor() const {return items[id].armor;} int32_t getDefense() const {return items[id].defence;}
Adicione:
int32_t getAtkBonus() const {return items[id].atkbonus;} int32_t getArmBonus() const {return items[id].armbonus;} int32_t getDefBonus() const {return items[id].defbonus;}
Troque:
if(getAttack()) s << article(it.name) << " (Atk:" << (int32_t)getAttack() << " Def:" << (int32_t)getDefense() << ")."; else s << article(it.name) << " (Def:" << (int32_t)getDefense() << ")."; } else if(getArmor()) s << article(it.name) << " (Arm:" << (int32_t)getArmor() << ").";
Por:
if(getAttack()) { if(getAtkBonus()) { s << article(it.name) << " (Atk:" << (int32_t)getAttack() << " + " << (int32_t)getAtkBonus() << " Def:" << (int32_t)getDefense() << ")."; } else if(getDefBonus()) { s << article(it.name) << " (Atk:" << (int32_t)getAttack() << " Def:" << (int32_t)getDefense() << " + " << (int32_t)getDefBonus() << ")."; } else if(getAtkBonus() && getDefBonus()) { s << article(it.name) << " (Atk:" << (int32_t)getAttack() << " + " << (int32_t)getAtkBonus() << " Def:" << (int32_t)getDefense() << " + " << (int32_t)getDefBonus() << ")."; } else { s << article(it.name) << " (Atk:" << (int32_t)getAttack() << " Def:" << (int32_t)getDefense() << ")."; } } else if(getArmor()) { if(getArmBonus()) { s << article(it.name) << " (Arm:" << (int32_t)getArmor() << ") +" << (int32_t)getArmBonus(); } else { s << article(it.name) << " (Arm:" << (int32_t)getArmor() << ")."; } } else { if(getDefBonus()) { s << article(it.name) << " (Def:" << (int32_t)getDefense() << " + " << (int32_t)getDefBonus() << ")."; } else { s << article(it.name) << " (Def:" << (int32_t)getDefense() << ")."; } }
Weapons.cpp
Troque:
int32_t attackValue = item->getAttack();
Por:
if(item->getAtkBonus()) int32_t attackValue = item->getAttack() + item->getAtkBonus(); else int32_t attackValue = item->getAttack();
Para usar é fácil:
<attribute key="atkincrease" value="3"/> <attribute key="defincrease" value="5"/> <attribute key="armincrease" value="4"/>
Basta por isso em algum item no items.xml
Caso não queira por increases, basta deixar sem.
Código desenvolvido totalmente por mim