All pastes #289251 Raw Edit

Mine

public text v1 · immutable
#289251 ·published 2006-12-23 00:05 UTC
rendered paste body
inline 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;
}