Esse sistema foi postado na otland pelo usuário VirrageS
Foi testado em um TFS 0.4 REV.3884
Vamos lá:
ITEM.CPP
Embaixo de:
case ATTR_ARTICLE:
{
std::string article;
if(!propStream.getString(article))
return ATTR_READ_ERROR;
setAttribute("article", article);
break;
}
Colocar:
case ATTR_CRITICALHITCHANCE:
{
int32_t criticalHitChance;
if(!propStream.getLong((uint32_t&)criticalHitChance))
return ATTR_READ_ERROR;
setAttribute("criticalhitchance", criticalHitChance);
break;
}
Embaixo de:
bool begin = true;
if(tmp)
{
s << " (Arm:" << tmp;
begin = false;
}
Colocar:
if(it.criticalHitChance || (item && item->getCriticalHitChance()))
{
if(begin)
{
begin = false;
s << " (";
}
else
s << ", ";
s << "Crit Chance:" << std::showpos << int32_t(item ? item->getCriticalHitChance() : it.criticalHitChance) << "%"<< std::noshowpos;
}
Embaixo de:
if(it.defense || it.extraDefense || (item && (item->getDefense() || item->getExtraDefense())))
{
if(begin)
{
begin = false;
s << " (";
}
else
s << ", ";
s << "Def:" << int32_t(item ? item->getDefense() : it.defense);
if(it.extraDefense || (item && item->getExtraDefense()))
s << " " << std::showpos << int32_t(item ? item->getExtraDefense() : it.extraDefense) << std::noshowpos;
}
Colocar:
if(it.criticalHitChance || (item && item->getCriticalHitChance()))
{
if(begin)
{
begin = false;
s << " (";
}
else
s << ", ";
s << "Crit Chance:" << std::showpos << int32_t(item ? item->getCriticalHitChance() : it.criticalHitChance) << "%"<< std::noshowpos;
}
ITEM.H
Embaixo de:
ATTR_DUALWIELD = 43,
Colocar:
ATTR_CRITICALHITCHANCE = 44,
Embaixo de:
int32_t getAttack() const;
Colocar:
int32_t getCriticalHitChance() const;
Embaixo de:
inline bool Item::isScriptProtected() const
{
const bool* v = getBooleanAttribute("scriptprotected");
if(v)
return *v;
return false;
}
Colocar:
inline int32_t Item::getCriticalHitChance() const
{
const int32_t* v = getIntegerAttribute("criticalhitchance");
if(v)
return *v;
return items[id].criticalHitChance;
}
ITEMS.CPP
Embaixo de:
attackSpeed = 0;
Colocar:
criticalHitChance = 0;
Embaixo de:
else if(tmpStrValue == "extradefense" || tmpStrValue == "extradef")
{
if(readXMLInteger(itemAttributesNode, "value", intValue))
it.extraDefense = intValue;
}
Colocar:
else if(tmpStrValue == "criticalhitchance")
{
if(readXMLInteger(itemAttributesNode, "value", intValue))
it.criticalHitChance = intValue;
}
ITEMS.H
TROCAR:
int32_t attack, extraAttack, defense, extraDefense, armor, breakChance, hitChance, maxHitChance,
POR:
int32_t attack, criticalHitChance, extraAttack, defense, extraDefense, armor, breakChance, hitChance, maxHitChance,
LUASCRIPT.CPP
Embaixo de:
setField(L, "text", item->text);
Colocar:
setField(L, "criticalHitChance", item->criticalHitChance);
PLAYER.CPP
Embaixo de:
int32_t Player::getArmor() const
{
int32_t i = SLOT_FIRST, armor = 0;
for(; i < SLOT_LAST; ++i)
{
if(Item* item = getInventoryItem((slots_t)i))
armor += item->getArmor();
}
if(vocation->getMultiplier(MULTIPLIER_ARMOR) != 1.0)
return int32_t(armor * vocation->getMultiplier(MULTIPLIER_ARMOR));
return armor;
}
Colocar:
int32_t Player::getCriticalHitChance() const
{
int32_t i = SLOT_FIRST, crit = 0;
for(; i < SLOT_LAST; ++i)
{
if(Item* item = getInventoryItem((slots_t)i))
crit += item->getCriticalHitChance();
}
return crit;
}
PLAYER.H
Embaixo de:
virtual int32_t getArmor() const;
Colocar:
virtual int32_t getCriticalHitChance() const;
WEAPONS.CPP
Substituir todos:
if(random_range(1, 100) < g_config.getNumber(ConfigManager::CRITICAL_HIT_CHANCE))
Por:
if(random_range(1, 100) < player->getCriticalHitChance() + g_config.getNumber(ConfigManager::CRITICAL_HIT_CHANCE))
A tag para se colocar no items.xml é a seguinte:
<attribute key="criticalHitChance" value="5" />
Espero que gostem!