public long GetXP(NpcMonster monster, Group group)
{
int partySize = 1;
double partyPenalty = 1d;
int levelDifference = Level - monster.Level;
if (group != null)
{
int levelSum = group.Characters.Sum(g => g.Character.Level);
partySize = group.CharacterCount;
partyPenalty = 12 / partySize / (double)levelSum;
}
// xp calculation dependant on level difference
long xpcalculation = levelDifference < 5 ? monster.XP : monster.XP / 3 * 2;
// xp calculation / penalty * rate
long xp = (long)Math.Round(xpcalculation * CharacterHelper.ExperiencePenalty(Level, monster.Level) * ServerManager.XPRate);
// bonus percentage calculation for level 1 - 5 and difference of levels bigger or equal
// to 4
if (Level <= 5 && levelDifference < -4)
{
xp += xp / 2;
}
if (monster.Level >= 75)
{
xp *= 2;
}
// divide exp by multiplication of partyPenalty with level e.g. 57 * 0,014...
if (partySize > 1 && group != null)
{
xp = (long)Math.Round(xp / (Level * partyPenalty));
}
return xp;
}