void Player::addExperience(uint64_t exp)
{
uint32_t prevLevel = level;
uint64_t nextLevelExp = Player::getExpForLevel(level + 1);
if(Player::getExpForLevel(level) > nextLevelExp)
{
//player has reached max level
levelPercent = 0;
sendStats();
return;
}
experience += exp;
while(experience >= nextLevelExp)
{
++level;
Vocation* voc = vocation;
if(voc->getId() > 0 && g_config.getBool(ConfigManager::ROOK_SYSTEM) &&
level <= (uint32_t)g_config.getNumber(ConfigManager::ROOK_TOLEVEL))
{
if(Vocation* tmp = Vocations::getInstance()->getVocation(0))
voc = tmp;
}
healthMax += voc->getGain(GAIN_HEALTH);
health += voc->getGain(GAIN_HEALTH);
manaMax += voc->getGain(GAIN_MANA);
mana += voc->getGain(GAIN_MANA);
capacity += voc->getGainCap();
nextLevelExp = Player::getExpForLevel(level + 1);
if(Player::getExpForLevel(level) > nextLevelExp) //player has reached max level
break;
}
if(prevLevel != level)
{
updateBaseSpeed();
g_game.changeSpeed(this, 0);
if(party)
party->updateSharedExperience();
CreatureEventList advanceEvents = getCreatureEvents(CREATURE_EVENT_ADVANCE);
for(CreatureEventList::iterator it = advanceEvents.begin(); it != advanceEvents.end(); ++it)
(*it)->executeAdvance(this, SKILL__LEVEL, prevLevel, level);
std::stringstream s;
s << "You advanced from Level " << prevLevel << " to Level " << level << ".";
sendTextMessage(MSG_EVENT_ADVANCE, s.str());
}
uint64_t currLevelExp = Player::getExpForLevel(level);
nextLevelExp = Player::getExpForLevel(level + 1);
levelPercent = 0;
if(nextLevelExp > currLevelExp)
levelPercent = Player::getPercentLevel(experience - currLevelExp, nextLevelExp - currLevelExp);
sendStats();
}