bool CItem::AddRareAttribute()
{
int count = GetRareAttrCount();
if (count >= ITEM_ATTRIBUTE_RARE_NUM)
return false;
int pos = count + ITEM_ATTRIBUTE_RARE_START;
TPlayerItemAttribute & attr = m_aAttr[pos];
int nAttrSet = GetAttributeSetIndex();
std::vector<int> avail;
for (int i = 0; i < MAX_APPLY_NUM; ++i)
{
const TItemAttrTable & r = g_map_itemRare[i];
if (r.dwApplyIndex != 0 && r.bMaxLevelBySet[nAttrSet] > 0 && HasRareAttr(i) != true)
{
avail.push_back(i);
}
}
const TItemAttrTable& r = g_map_itemRare[avail[number(0, avail.size() - 1)]];
int nAttrLevel = number(1, 5);
int randomChance = number(0, 100);
if (randomChance < 1) // 20% Chance to get max lvl attr
nAttrLevel = 5;
else if (randomChance < 1) // 20% chance to get max lvl attr
nAttrLevel = 4;
else if (randomChance < 20) // 20% chance to get max lvl attr
nAttrLevel = 3;
else if (randomChance < 40) // 20% chance to get max lvl attr
nAttrLevel = 2;
else if (randomChance < 60) // 20% chance to get max lvl attr
nAttrLevel = 1;
if (nAttrLevel > r.bMaxLevelBySet[nAttrSet])
nAttrLevel = r.bMaxLevelBySet[nAttrSet];
attr.bType = r.dwApplyIndex;
attr.sValue = r.lValues[nAttrLevel - 1];
UpdatePacket();
Save();
const char * pszIP = NULL;
if (GetOwner() && GetOwner()->GetDesc())
pszIP = GetOwner()->GetDesc()->GetHostName();
LOG_LEVEL_CHECK(LOG_LEVEL_MAX, LogManager::instance().ItemLog(pos, attr.bType, attr.sValue, GetID(), "SET_RARE", "", pszIP ? pszIP : "", GetOriginalVnum()));
return true;
}