rendered paste bodyinline uint32 CalculateXpToGive(Unit *pVictim, Unit *pAttacker)
{
CreatureInfo *victimI = pVictim->GetCreatureName();
if(victimI)
{
if(victimI->Type == CRITTER)
return 0;
}
if(pVictim->GetTypeId() == TYPEID_PLAYER)
return 0;
if(pAttacker->getLevel() >= PLAYER_LEVEL_CAP)
return 0;
uint16 VictimLvl = pVictim->GetUInt32Value(UNIT_FIELD_LEVEL);
uint16 AttackerLvl = pAttacker->GetUInt32Value(UNIT_FIELD_LEVEL);
float zd = 5;
float g = 5;
// get zero diff
if(AttackerLvl >= 70)
zd = 19;
else if(AttackerLvl >= 65)
zd = 18;
else if(AttackerLvl >= 60)
zd = 17;
else if(AttackerLvl >= 55)
zd = 16;
else if(AttackerLvl >= 50)
zd = 15;
else if(AttackerLvl >= 45)
zd = 14;
else if(AttackerLvl >= 40)
zd = 13;
else if(AttackerLvl >= 30)
zd = 12;
else if(AttackerLvl >= 20)
zd = 11;
else if(AttackerLvl >= 16)
zd = 9;
else if(AttackerLvl >= 12)
zd = 8;
else if(AttackerLvl >= 10)
zd = 7;
else if(AttackerLvl >= 8)
zd = 6;
else
zd = 5;
// get grey diff
if(AttackerLvl >= 70)
g = 15;
else if(AttackerLvl >= 65)
g = 14;
else if(AttackerLvl >= 60)
g = 13;
else if(AttackerLvl >= 55)
g = 12;
else if(AttackerLvl >= 50)
g = 11;
else if(AttackerLvl >= 45)
g = 10;
else if(AttackerLvl >= 40)
g = 9;
else if(AttackerLvl >= 30)
g = 8;
else if(AttackerLvl >= 20)
g = 7;
else if(AttackerLvl >= 10)
g = 6;
else
g = 5;
float xp = 0.0f;
float fVictim = VictimLvl;
float fAttacker = AttackerLvl;
if(VictimLvl == AttackerLvl)
xp = float( ((fVictim * 5.0f) + 45.0f) );
else if(VictimLvl > AttackerLvl)
{
float j = 1.0f + (0.25f * (fVictim - fAttacker));
xp = float( ((AttackerLvl * 5.0f) + 45.0f) * j );
}
else
{
if((AttackerLvl - VictimLvl) < g)
{
float j = (1.0f - float((fAttacker - fVictim) / zd));
xp = (AttackerLvl * 5.0f + 45.0f) * j;
}
}
// multiply by global XP rate
if(xp == 0.0f)
return 0;
xp *= sWorld.getRate(RATE_XP);
return (uint32)xp;
}