Beispiel #1
0
        /// <summary>
        ///     Resolves the spell bonus damage.
        /// </summary>
        /// <param name="source">
        ///     The source
        /// </param>
        /// <param name="target">
        ///     The target
        /// </param>
        /// <param name="spellBonus">
        ///     The spell bonus collection
        /// </param>
        /// <param name="index">
        ///     The index (spell level - 1)
        /// </param>
        /// <returns>
        ///     The <see cref="double" />.
        /// </returns>
        private static double ResolveBonusSpellDamage(
            this Obj_AI_Base source,
            Obj_AI_Base target,
            ChampionDamageSpellBonus spellBonus,
            int index)
        {
            var sourceScale = spellBonus.ScalingTarget == DamageScalingTarget.Source ? source : target;
            var percent     = spellBonus.DamagePercentages?[Math.Min(index, spellBonus.DamagePercentages.Count - 1)];
            var origin      = 0f;

            switch (spellBonus.ScalingType)
            {
            case DamageScalingType.BonusAttackPoints:
                origin = sourceScale.FlatPhysicalDamageMod;
                break;

            case DamageScalingType.AbilityPoints:
                origin = sourceScale.TotalMagicalDamage;
                break;

            case DamageScalingType.AttackPoints:
                origin = sourceScale.TotalAttackDamage;
                break;

            case DamageScalingType.MaxHealth:
                origin = sourceScale.MaxHealth;
                break;

            case DamageScalingType.CurrentHealth:
                origin = sourceScale.Health;
                break;

            case DamageScalingType.MissingHealth:
                origin = sourceScale.MaxHealth - sourceScale.Health;
                break;

            case DamageScalingType.Armor:
                origin = sourceScale.Armor;
                break;

            case DamageScalingType.MaxMana:
                origin = sourceScale.MaxMana;
                break;
            }

            if (!string.IsNullOrEmpty(spellBonus.ScalingBuff))
            {
                var buffCount =
                    (spellBonus.ScalingBuffTarget == DamageScalingTarget.Source ? source : target).GetBuffCount(
                        spellBonus.ScalingBuff);

                return(buffCount != 0 ? (origin * (percent ?? 0)) * (buffCount + spellBonus.ScalingBuffOffset) : 0d);
            }

            return(origin * (percent ?? 0));
        }
        /// <summary>
        ///     Resolves the spell bonus damage.
        /// </summary>
        /// <param name="source">
        ///     The source
        /// </param>
        /// <param name="target">
        ///     The target
        /// </param>
        /// <param name="spellBonus">
        ///     The spell bonus collection
        /// </param>
        /// <param name="index">
        ///     The index (spell level - 1)
        /// </param>
        /// <returns>
        ///     The <see cref="double" />.
        /// </returns>
        private static double ResolveBonusSpellDamage(
            this Obj_AI_Base source,
            Obj_AI_Base target,
            ChampionDamageSpellBonus spellBonus,
            int index)
        {
            var sourceScale = spellBonus.ScalingTarget == DamageScalingTarget.Source ? source : target;
            var percent     = spellBonus.DamagePercentages?.Count > 0
                              ? spellBonus.DamagePercentages[Math.Min(index, spellBonus.DamagePercentages.Count - 1)]
                              : 0d;
            var origin = 0f;

            switch (spellBonus.ScalingType)
            {
            case DamageScalingType.BonusAttackPoints:
                origin = sourceScale.FlatPhysicalDamageMod;
                break;

            case DamageScalingType.AbilityPoints:
                origin = sourceScale.TotalMagicalDamage;
                break;

            case DamageScalingType.AttackPoints:
                origin = sourceScale.TotalAttackDamage;
                break;

            case DamageScalingType.MaxHealth:
                origin = sourceScale.MaxHealth;
                break;

            case DamageScalingType.CurrentHealth:
                origin = sourceScale.Health;
                break;

            case DamageScalingType.MissingHealth:
                origin = sourceScale.MaxHealth - sourceScale.Health;
                break;

            case DamageScalingType.BonusHealth:
                origin = ((Obj_AI_Hero)sourceScale).BonusHealth;
                break;

            case DamageScalingType.Armor:
                origin = sourceScale.Armor;
                break;

            case DamageScalingType.MaxMana:
                origin = sourceScale.MaxMana;
                break;

            case DamageScalingType.BonusMana:
                origin = ((Obj_AI_Hero)sourceScale).BonusMana;
                break;
            }

            var dmg = origin
                      * (percent > 0
                             ? percent
                         + (spellBonus.ScalePer100Ap > 0
                                      ? source.TotalMagicalDamage / 100 * spellBonus.ScalePer100Ap
                                      : 0)
                         + (spellBonus.ScalePer100BonusAd > 0
                                      ? source.FlatPhysicalDamageMod / 100 * spellBonus.ScalePer100BonusAd
                                      : 0)
                         + (spellBonus.ScalePer100Ad > 0
                                      ? source.TotalAttackDamage / 100 * spellBonus.ScalePer100Ad
                                      : 0)
                             : 0);

            if (target is Obj_AI_Minion && spellBonus.BonusDamageOnMinion?.Count > 0)
            {
                dmg += spellBonus.BonusDamageOnMinion[Math.Min(index, spellBonus.BonusDamageOnMinion.Count - 1)];
            }

            if (!string.IsNullOrEmpty(spellBonus.ScalingBuff))
            {
                var buffCount =
                    (spellBonus.ScalingBuffTarget == DamageScalingTarget.Source ? source : target).GetBuffCount(
                        spellBonus.ScalingBuff);
                dmg = buffCount > 0 ? dmg * (buffCount + spellBonus.ScalingBuffOffset) : 0d;
            }

            if (dmg > 0)
            {
                if (spellBonus.MinDamage?.Count > 0)
                {
                    dmg = Math.Max(dmg, spellBonus.MinDamage[Math.Min(index, spellBonus.MinDamage.Count - 1)]);
                }

                if (target is Obj_AI_Minion && spellBonus.MaxDamageOnMinion?.Count > 0)
                {
                    dmg = Math.Min(
                        dmg,
                        spellBonus.MaxDamageOnMinion[Math.Min(index, spellBonus.MaxDamageOnMinion.Count - 1)]);
                }
            }

            return(dmg);
        }
        /// <summary>
        ///     Resolves the spell bonus damage.
        /// </summary>
        /// <param name="source">
        ///     The source
        /// </param>
        /// <param name="target">
        ///     The target
        /// </param>
        /// <param name="spellBonus">
        ///     The spell bonus collection
        /// </param>
        /// <param name="index">
        ///     The index (spell level - 1)
        /// </param>
        /// <returns>
        ///     The <see cref="double" />.
        /// </returns>
        private static double ResolveBonusSpellDamage(
            this Obj_AI_Base source,
            Obj_AI_Base target,
            ChampionDamageSpellBonus spellBonus,
            int index)
        {
            var sourceScale = spellBonus.ScalingTarget == DamageScalingTarget.Source ? source : target;
            var percent = spellBonus.DamagePercentages?[Math.Min(index, spellBonus.DamagePercentages.Count - 1)];
            var origin = 0f;

            switch (spellBonus.ScalingType)
            {
                case DamageScalingType.BonusAttackPoints:
                    origin = sourceScale.FlatPhysicalDamageMod;
                    break;
                case DamageScalingType.AbilityPoints:
                    origin = sourceScale.TotalMagicalDamage;
                    break;
                case DamageScalingType.AttackPoints:
                    origin = sourceScale.TotalAttackDamage;
                    break;
                case DamageScalingType.MaxHealth:
                    origin = sourceScale.MaxHealth;
                    break;
                case DamageScalingType.CurrentHealth:
                    origin = sourceScale.Health;
                    break;
                case DamageScalingType.MissingHealth:
                    origin = sourceScale.MaxHealth - sourceScale.Health;
                    break;
                case DamageScalingType.Armor:
                    origin = sourceScale.Armor;
                    break;
                case DamageScalingType.MaxMana:
                    origin = sourceScale.MaxMana;
                    break;
            }

            if (!string.IsNullOrEmpty(spellBonus.ScalingBuff))
            {
                var buffCount =
                    (spellBonus.ScalingBuffTarget == DamageScalingTarget.Source ? source : target).GetBuffCount(
                        spellBonus.ScalingBuff);

                return buffCount != 0 ? (origin * (percent ?? 0)) * (buffCount + spellBonus.ScalingBuffOffset) : 0d;
            }

            return origin * (percent ?? 0);
        }
        /// <summary>
        ///     Resolves the spell bonus damage.
        /// </summary>
        /// <param name="source">
        ///     The source
        /// </param>
        /// <param name="target">
        ///     The target
        /// </param>
        /// <param name="spellBonus">
        ///     The spell bonus collection
        /// </param>
        /// <param name="index">
        ///     The index (spell level - 1)
        /// </param>
        /// <returns>
        ///     The <see cref="double" />.
        /// </returns>
        private static double ResolveBonusSpellDamage(
            this AIBaseClient source,
            AIBaseClient target,
            ChampionDamageSpellBonus spellBonus,
            int index)
        {
            var sourceScale = spellBonus.ScalingTarget == DamageScalingTarget.Source ? source : target;
            var percent     = spellBonus.DamagePercentages?.Count > 0
                              ? spellBonus.DamagePercentages[Math.Min(index, spellBonus.DamagePercentages.Count - 1)]
                              : 0d;
            var origin = 0f;

            switch (spellBonus.ScalingType)
            {
            case DamageScalingType.AttackPoints:
                origin = sourceScale.TotalAttackDamage;
                break;

            case DamageScalingType.BonusAttackPoints:
                origin = sourceScale.FlatPhysicalDamageMod;
                break;

            case DamageScalingType.AbilityPoints:
                origin = sourceScale.TotalMagicalDamage;
                break;

            case DamageScalingType.BonusHealth:
                origin = sourceScale.BonusHealth;
                break;

            case DamageScalingType.CurrentHealth:
                origin = sourceScale.Health;
                break;

            case DamageScalingType.MaxHealth:
                origin = sourceScale.MaxHealth;
                break;

            case DamageScalingType.MissingHealth:
                origin = sourceScale.MaxHealth - sourceScale.Health;
                break;

            case DamageScalingType.BonusMana:
                origin = sourceScale.BonusMana;
                break;

            case DamageScalingType.MaxMana:
                origin = sourceScale.MaxMana;
                break;

            case DamageScalingType.Armor:
                origin = sourceScale.Armor;
                break;

            case DamageScalingType.BonusArmor:
                origin = sourceScale.BonusArmor;
                break;

            case DamageScalingType.SpellBlock:
                origin = sourceScale.SpellBlock;
                break;

            case DamageScalingType.BonusSpellBlock:
                origin = sourceScale.BonusSpellBlock;
                break;

            case DamageScalingType.PhysicalLethality:
                origin = sourceScale.PhysicalLethality;
                break;
            }

            var dmg = origin
                      * ((percent > 0 ? percent : 0)
                         + (spellBonus.ScalePer100Ap > 0
                                    ? Math.Abs(source.TotalMagicalDamage / 100) * spellBonus.ScalePer100Ap
                                    : 0)
                         + (spellBonus.ScalePer100Ad > 0
                                    ? Math.Abs(source.TotalAttackDamage / 100) * spellBonus.ScalePer100Ad
                                    : 0)
                         + (spellBonus.ScalePer100BonusAd > 0
                                    ? Math.Abs(source.FlatPhysicalDamageMod / 100) * spellBonus.ScalePer100BonusAd
                                    : 0)
                         + (!string.IsNullOrEmpty(spellBonus.PercentageStackBuff)
                                    ? (string.IsNullOrEmpty(spellBonus.PercentageCheckBuff) || source.HasBuff(spellBonus.PercentageCheckBuff)
                                        ? (spellBonus.PercentagePerBuffStack * source.GetBuffCount(spellBonus.PercentageStackBuff))
                                        : 0)
                                    : 0));

            if (target is AIMinionClient && spellBonus.BonusDamageOnMinion?.Count > 0)
            {
                dmg += spellBonus.BonusDamageOnMinion[Math.Min(index, spellBonus.BonusDamageOnMinion.Count - 1)];
            }

            if (target is AIMinionClient && target.Team == GameObjectTeam.Neutral && spellBonus.BonusDamageOnMonster?.Count > 0)
            {
                dmg += spellBonus.BonusDamageOnMonster[Math.Min(index, spellBonus.BonusDamageOnMonster.Count - 1)];
            }

            if (!string.IsNullOrEmpty(spellBonus.BonusBuff))
            {
                dmg += source.GetBuffCount(spellBonus.BonusBuff) + spellBonus.BonusBuffOffset;
            }

            if (!string.IsNullOrEmpty(spellBonus.ScalingBuff))
            {
                var buffCount =
                    (spellBonus.ScalingBuffTarget == DamageScalingTarget.Source ? source : target).GetBuffCount(
                        spellBonus.ScalingBuff);
                dmg = buffCount > 0 ? dmg * (buffCount + spellBonus.ScalingBuffOffset) : 0d;
            }

            if (dmg > 0)
            {
                if (spellBonus.MinDamage?.Damages?.Count > 0)
                {
                    dmg = Math.Max(dmg, source.ResolveLimitDamage(target, spellBonus.MinDamage, index));
                }

                if (target is AIMinionClient && spellBonus.MaxDamageOnMinion?.Count > 0)
                {
                    dmg = Math.Min(
                        dmg,
                        spellBonus.MaxDamageOnMinion[Math.Min(index, spellBonus.MaxDamageOnMinion.Count - 1)]);
                }

                if (target is AIMinionClient && target.Team == GameObjectTeam.Neutral && spellBonus.MaxDamageOnMonster?.Count > 0)
                {
                    dmg = Math.Min(
                        dmg,
                        spellBonus.MaxDamageOnMonster[Math.Min(index, spellBonus.MaxDamageOnMonster.Count - 1)]);
                }
            }

            return(dmg);
        }
        /// <summary>
        ///     Resolves the spell bonus damage.
        /// </summary>
        /// <param name="source">
        ///     The source
        /// </param>
        /// <param name="target">
        ///     The target
        /// </param>
        /// <param name="spellBonus">
        ///     The spell bonus collection
        /// </param>
        /// <param name="index">
        ///     The index (spell level - 1)
        /// </param>
        /// <returns>
        ///     The <see cref="double" />.
        /// </returns>
        private static double ResolveBonusSpellDamage(
            this Obj_AI_Base source,
            Obj_AI_Base target,
            ChampionDamageSpellBonus spellBonus,
            int index)
        {
            var sourceScale = spellBonus.ScalingTarget == DamageScalingTarget.Source ? source : target;
            var percent = spellBonus.DamagePercentages?.Count > 0
                              ? spellBonus.DamagePercentages[Math.Min(index, spellBonus.DamagePercentages.Count - 1)]
                              : 0d;
            var origin = 0f;

            switch (spellBonus.ScalingType)
            {
                case DamageScalingType.BonusAttackPoints:
                    origin = sourceScale.FlatPhysicalDamageMod;
                    break;
                case DamageScalingType.AbilityPoints:
                    origin = sourceScale.TotalMagicalDamage;
                    break;
                case DamageScalingType.AttackPoints:
                    origin = sourceScale.TotalAttackDamage;
                    break;
                case DamageScalingType.MaxHealth:
                    origin = sourceScale.MaxHealth;
                    break;
                case DamageScalingType.CurrentHealth:
                    origin = sourceScale.Health;
                    break;
                case DamageScalingType.MissingHealth:
                    origin = sourceScale.MaxHealth - sourceScale.Health;
                    break;
                case DamageScalingType.BonusHealth:
                    origin = ((Obj_AI_Hero)sourceScale).BonusHealth;
                    break;
                case DamageScalingType.Armor:
                    origin = sourceScale.Armor;
                    break;
                case DamageScalingType.MaxMana:
                    origin = sourceScale.MaxMana;
                    break;
            }

            var dmg = origin
                      * (percent > 0 || percent < 0
                             ? (percent > 0 ? percent : 0)
                               + (spellBonus.ScalePer100Ap > 0
                                      ? Math.Abs(source.TotalMagicalDamage / 100) * spellBonus.ScalePer100Ap
                                      : 0)
                               + (spellBonus.ScalePer100BonusAd > 0
                                      ? Math.Abs(source.FlatPhysicalDamageMod / 100) * spellBonus.ScalePer100BonusAd
                                      : 0)
                               + (spellBonus.ScalePer100Ad > 0
                                      ? Math.Abs(source.TotalAttackDamage / 100) * spellBonus.ScalePer100Ad
                                      : 0)
                             : 0);

            if (target.Type == GameObjectType.obj_AI_Minion && spellBonus.BonusDamageOnMinion?.Count > 0)
            {
                dmg += spellBonus.BonusDamageOnMinion[Math.Min(index, spellBonus.BonusDamageOnMinion.Count - 1)];
            }

            if (!string.IsNullOrEmpty(spellBonus.ScalingBuff))
            {
                var buffCount =
                    (spellBonus.ScalingBuffTarget == DamageScalingTarget.Source ? source : target).GetBuffCount(
                        spellBonus.ScalingBuff);
                dmg = buffCount != 0 ? dmg * (buffCount + spellBonus.ScalingBuffOffset) : 0d;
            }

            if (dmg > 0)
            {
                if (spellBonus.MinDamage?.Count > 0)
                {
                    dmg = Math.Max(dmg, spellBonus.MinDamage[Math.Min(index, spellBonus.MinDamage.Count - 1)]);
                }

                if (target.Type == GameObjectType.obj_AI_Minion && spellBonus.MaxDamageOnMinion?.Count > 0)
                {
                    dmg = Math.Min(
                        dmg,
                        spellBonus.MaxDamageOnMinion[Math.Min(index, spellBonus.MaxDamageOnMinion.Count - 1)]);
                }
            }

            return dmg;
        }