Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }