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