void Creature::onGainExperience(double& gainExp, Creature* target, bool multiplied)
{
if(gainExp <= 0)
return;
if(master)
{
gainExp = gainExp / 2;
master->onGainExperience(gainExp, target, multiplied);
}
else if(!multiplied)
gainExp *= g_config.getDouble(ConfigManager::RATE_EXPERIENCE);
int16_t color = g_config.getNumber(ConfigManager::EXPERIENCE_COLOR);
if(color < 0)
color = random_range(0, 255);
const Position& targetPos = getPosition();
SpectatorVec list;
g_game.getSpectators(list, targetPos, false, false, Map::maxViewportX, Map::maxViewportX,
Map::maxViewportY, Map::maxViewportY);
std::stringstream ss;
ss << ucfirst(getNameDescription()) << " gained " << (uint64_t)gainExp << " experience points.";
SpectatorVec textList;
for(SpectatorVec::const_iterator it = list.begin(); it != list.end(); ++it)
{
if(!(*it)->getPlayer())
continue;
if((*it) != this)
textList.push_back(*it);
}
MessageDetails* details = new MessageDetails((int32_t)gainExp, (Color_t)color);
g_game.addStatsMessage(textList, MSG_EXPERIENCE_OTHERS, ss.str(), targetPos, details);
if(Player* player = getPlayer())
{
ss.str("");
ss << "You gained " << (uint64_t)gainExp << " experience points.";
player->sendStatsMessage(MSG_EXPERIENCE, ss.str(), targetPos, details);
}
delete details;
}