Example #1
0
 public virtual double CalculateAADamage(AIHeroClient target, int aacount = 2)
 {
     return(AutoAttack.GetDamage(target) * aacount);
 }
Example #2
0
        private static AIHeroClient GetNewTarget(float range, DamageType dmgType = DamageType.Physical,
                                                 Vector3?_from = null)
        {
            if (range == -1)
            {
                range = Utility.GetAARange();
            }

            if (ConfigMenu.OnlyAttackSelected)
            {
                if (SelectedTarget != null)
                {
                    if (SelectedTarget.IsValidTarget(range))
                    {
                        return(SelectedTarget);
                    }
                    if (SelectedTarget.IsValidTarget())
                    {
                        return(null);
                    }
                }
            }

            if (ConfigMenu.FocusSelected)
            {
                if (SelectedTarget != null)
                {
                    if (SelectedTarget.IsValidTarget(range))
                    {
                        return(SelectedTarget);
                    }
                    if (ConfigMenu.FocusExtraRange > 0 &&
                        SelectedTarget.IsValidTarget(range + ConfigMenu.FocusExtraRange))
                    {
                        return(null);
                    }
                }
            }
            var from = _from ?? ObjectManager.Player.ServerPosition;

            var enemies =
                HeroManager.Enemies.Where(
                    p => p.IsValidTarget(range + p.BoundingRadius, true, from) && !IsInvulnerable(p, dmgType));

            if (enemies.Count() == 0)
            {
                return(null);
            }

            switch (ConfigMenu.TargettingMode)
            {
            case 1:
                return(enemies.MinOrDefault(hero => hero.Health));

            case 2:
                return(enemies.MaxOrDefault(hero => hero.BaseAttackDamage + hero.FlatPhysicalDamageMod));

            case 3:
                return(enemies.MaxOrDefault(hero => hero.BaseAbilityDamage + hero.FlatMagicDamageMod));

            case 4:
                return
                    (enemies.MinOrDefault(
                         hero =>
                         (_from ?? ObjectManager.Player.ServerPosition).Distance(
                             hero.ServerPosition, true)));

            case 5:
                return(enemies.Find(hero => hero.Distance(Game.CursorPos, true) < 22500));    // 150 * 150

            case 6:
                return
                    (enemies.MaxOrDefault(
                         hero =>
                         ObjectManager.Player.CalcDamage(hero, DamageType.Physical, 100) / (1 + hero.Health) *
                         GetPriority(hero)));

            case 7:
                return
                    (enemies.MaxOrDefault(
                         hero =>
                         ObjectManager.Player.CalcDamage(hero, DamageType.Magical, 100) / (1 + hero.Health) *
                         GetPriority(hero)));

            case 0:
            {
                var killableWithAA = enemies.Where(p => p.Health <= AutoAttack.GetDamage(p, true)).FirstOrDefault();
                if (killableWithAA != null)
                {
                    return(killableWithAA);
                }

                var possibleTargets = enemies.OrderByDescending(GetPriority);
                if (possibleTargets.Count() == 1)
                {
                    return(possibleTargets.First());
                }
                if (possibleTargets.Count() > 1)
                {
                    var killableTarget =
                        possibleTargets.OrderByDescending(GetTotalADAPMultipler)
                        .FirstOrDefault(q => GetHealthMultipler(q) >= 10);
                    if (killableTarget != null)
                    {
                        return(killableTarget);
                    }

                    var          targets              = possibleTargets.OrderBy(p => ObjectManager.Player.Distance(p.ServerPosition));
                    AIHeroClient mostImportant        = null;
                    double       mostImportantsDamage = 0;
                    foreach (var target in targets)
                    {
                        var dmg = target.CalcDamage(ObjectManager.Player, DamageType.Physical, 100) +
                                  target.CalcDamage(ObjectManager.Player, DamageType.Magical, 100);
                        if (mostImportant == null)
                        {
                            mostImportant        = target;
                            mostImportantsDamage = dmg;
                        }
                        else
                        {
                            if (Utility.InAARange(ObjectManager.Player, target) &&
                                !Utility.InAARange(ObjectManager.Player, mostImportant))
                            {
                                mostImportant        = target;
                                mostImportantsDamage = dmg;
                            }
                            else if ((Utility.InAARange(ObjectManager.Player, target) &&
                                      Utility.InAARange(ObjectManager.Player, mostImportant)) ||
                                     (!Utility.InAARange(ObjectManager.Player, target) &&
                                      !Utility.InAARange(ObjectManager.Player, mostImportant)))
                            {
                                if (mostImportantsDamage < dmg / 2f)
                                {
                                    mostImportant        = target;
                                    mostImportantsDamage = dmg;
                                    continue;
                                }

                                if ((mostImportant.IsMelee && !target.IsMelee) ||
                                    (!mostImportant.IsMelee && target.IsMelee))
                                {
                                    var targetMultp         = GetHealthMultipler(target);
                                    var mostImportantsMultp = GetHealthMultipler(mostImportant);
                                    if (mostImportantsMultp < targetMultp)
                                    {
                                        mostImportant        = target;
                                        mostImportantsDamage = dmg;
                                    }
                                }
                            }
                        }
                    }
                    return(mostImportant);
                }
                return(null);
            }
            }

            return(null);
        }