Esempio n. 1
0
        internal static AttackableUnit GetTarget(OrbwalkingMode?modeArg)
        {
            var mode = modeArg ?? ActiveMode;

            if ((mode == OrbwalkingMode.LaneClear || mode == OrbwalkingMode.Hybrid) &&
                !Program.MainMenu["Orbwalker"]["Advanced"]["PriorizeFarm"])
            {
                var target = Variables.TargetSelector.GetTarget(-1, DamageType.Physical);
                if (target != null)
                {
                    return(target);
                }
            }
            if (mode == OrbwalkingMode.LaneClear || mode == OrbwalkingMode.Hybrid || mode == OrbwalkingMode.LastHit)
            {
                foreach (var minion in
                         GameObjects.EnemyMinions.Where(m => m.InAutoAttackRange() && Minion.IsMinion(m))
                         .OrderByDescending(m => m.GetMinionType() == MinionTypes.Siege)
                         .ThenBy(m => m.GetMinionType() == MinionTypes.Super)
                         .ThenBy(m => m.Health)
                         .ThenByDescending(m => m.MaxHealth))
                {
                    var time =
                        (int)
                        (Program.Player.AttackCastDelay * 1000
                         + Math.Max(0, Program.Player.Distance(minion) - Program.Player.BoundingRadius)
                         / Program.Player.GetProjectileSpeed() * 1000 - 100 + Game.Ping / 2f);
                    var healthPrediction = Health.GetPrediction(minion, time, FarmDelay);
                    if (healthPrediction <= 0)
                    {
                        InvokeAction(
                            new OrbwalkerActionArgs
                        {
                            Position = minion.Position, Target = minion, Process = true,
                            Type     = OrbwalkingType.NonKillableMinion
                        });
                    }
                    if (healthPrediction > 0 && healthPrediction <= Program.Player.GetAutoAttackDamage(minion, true))
                    {
                        return(minion);
                    }
                }
            }
            if (mode == OrbwalkingMode.LaneClear)
            {
                foreach (var turret in GameObjects.EnemyTurrets.Where(t => t.InAutoAttackRange()))
                {
                    return(turret);
                }
                foreach (var inhibitor in GameObjects.EnemyInhibitors.Where(i => i.InAutoAttackRange()))
                {
                    return(inhibitor);
                }
                if (GameObjects.EnemyNexus.InAutoAttackRange())
                {
                    return(GameObjects.EnemyNexus);
                }
            }
            if (mode != OrbwalkingMode.LastHit)
            {
                var target = Variables.TargetSelector.GetTarget(-1, DamageType.Physical);
                if (target != null)
                {
                    return(target);
                }
            }
            if (ActiveMode == OrbwalkingMode.LaneClear)
            {
                var shouldWait =
                    GameObjects.EnemyMinions.Any(
                        m =>
                        m.InAutoAttackRange() && Minion.IsMinion(m) &&
                        Health.GetPrediction(m, (int)(Program.Player.AttackDelay * 1000 * 2f), FarmDelay)
                        <= Program.Player.GetAutoAttackDamage(m, true));
                if (!shouldWait)
                {
                    foreach (var specialMinion in
                             GameObjects.EnemyMinions.Where(
                                 m => m.InAutoAttackRange() && SpecialMinions.Any(i => i.Equals(m.CharData.BaseSkinName))))
                    {
                        return(specialMinion);
                    }
                    var mob = GameObjects.JungleLegendary.FirstOrDefault(j => j.InAutoAttackRange())
                              ?? GameObjects.JungleSmall.FirstOrDefault(
                        j =>
                        j.InAutoAttackRange() && j.Name.Contains("Mini") && j.Name.Contains("SRU_Razorbeak"))
                              ?? GameObjects.JungleLarge.FirstOrDefault(j => j.InAutoAttackRange())
                              ?? GameObjects.JungleSmall.FirstOrDefault(j => j.InAutoAttackRange());
                    if (mob != null)
                    {
                        return(mob);
                    }
                    foreach (var sentinel in
                             GameObjects.EnemyMinions.Where(
                                 m => m.InAutoAttackRange() && m.CharData.BaseSkinName == "kalistaspawn"))
                    {
                        return(sentinel);
                    }
                    if (LastMinion.InAutoAttackRange())
                    {
                        var predHealth = Health.GetPrediction(
                            LastMinion,
                            (int)(Program.Player.AttackDelay * 1000 * 2f),
                            FarmDelay);
                        if (predHealth >= 2 * Program.Player.GetAutoAttackDamage(LastMinion, true) ||
                            Math.Abs(predHealth - LastMinion.Health) < float.Epsilon)
                        {
                            return(LastMinion);
                        }
                    }
                    var minion = (from m in
                                  GameObjects.EnemyMinions.Where(m => m.InAutoAttackRange() && Minion.IsMinion(m))
                                  let predictedHealth =
                                      Health.GetPrediction(m, (int)(Program.Player.AttackDelay * 1000 * 2f), FarmDelay)
                                      where
                                      predictedHealth >= 2 * Program.Player.GetAutoAttackDamage(m, true) ||
                                      Math.Abs(predictedHealth - m.Health) < float.Epsilon
                                      select m).MaxOrDefault(m => m.Health);
                    if (minion != null)
                    {
                        return(LastMinion = minion);
                    }
                    return
                        (GameObjects.EnemyMinions.FirstOrDefault(
                             m =>
                             m.InAutoAttackRange() &&
                             (m.CharData.BaseSkinName == "elisespiderling" ||
                              m.CharData.BaseSkinName == "teemomushroom")));
                }
            }
            return(null);
        }