public static uint BaseGain(uint pl_level, uint mob_level) { uint baseGain; GtXpRecord xpPlayer = CliDB.XpGameTable.GetRow(pl_level); GtXpRecord xpMob = CliDB.XpGameTable.GetRow(mob_level); if (mob_level >= pl_level) { uint nLevelDiff = mob_level - pl_level; if (nLevelDiff > 4) { nLevelDiff = 4; } baseGain = (uint)Math.Round(xpPlayer.PerKill * (1 + 0.05f * nLevelDiff)); } else { uint gray_level = GetGrayLevel(pl_level); if (mob_level > gray_level) { uint ZD = GetZeroDifference(pl_level); baseGain = (uint)Math.Round(xpMob.PerKill * ((1 - ((pl_level - mob_level) / ZD)) * (xpMob.Divisor / xpPlayer.Divisor))); } else { baseGain = 0; } } Global.ScriptMgr.OnBaseGainCalculation(baseGain, pl_level, mob_level); return(baseGain); }
public static uint BaseGain(uint pl_level, uint mob_level) { uint baseGain; GtXpRecord xpPlayer = CliDB.XpGameTable.GetRow(pl_level); GtXpRecord xpMob = CliDB.XpGameTable.GetRow(mob_level); if (mob_level >= pl_level) { uint nLevelDiff = mob_level - pl_level; if (nLevelDiff > 4) { nLevelDiff = 4; } baseGain = (uint)Math.Round(xpPlayer.PerKill * (1 + 0.05f * nLevelDiff)); } else { uint gray_level = GetGrayLevel(pl_level); if (mob_level > gray_level) { uint ZD = GetZeroDifference(pl_level); baseGain = (uint)Math.Round(xpMob.PerKill * ((1 - ((pl_level - mob_level) / ZD)) * (xpMob.Divisor / xpPlayer.Divisor))); } else { baseGain = 0; } } if (WorldConfig.GetIntValue(WorldCfg.MinCreatureScaledXpRatio) != 0 && pl_level != mob_level) { // Use mob level instead of player level to avoid overscaling on gain in a min is enforced uint baseGainMin = BaseGain(pl_level, pl_level) * WorldConfig.GetUIntValue(WorldCfg.MinCreatureScaledXpRatio) / 100; baseGain = Math.Max(baseGainMin, baseGain); } Global.ScriptMgr.OnBaseGainCalculation(baseGain, pl_level, mob_level); return(baseGain); }