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; }