コード例 #1
0
ファイル: Graves.cs プロジェクト: tekintr/Elobuddy
        private static void Orbwalker_OnPostAttack(AttackableUnit target, EventArgs args)
        {
            if (target.GetType() != typeof(AIHeroClient) || target.IsMe || !Orbwalker.ActiveModesFlags.HasFlag(Orbwalker.ActiveModes.Combo))//no idea why it invokes twice
            {
                return;
            }

            if (!E.IsReady() || !Settings.Combo.UseE || Settings.Misc.EUsageMode != 1 || Settings.Combo.UseEOnlyToDardoch || GetAmmoCount > 1)
            {
                return;
            }

            var heroClient = TargetSelector.GetTarget(Player.Instance.GetAutoAttackRange() + 425, DamageType.Physical);
            var position   = Vector3.Zero;

            if (heroClient == null)
            {
                return;
            }

            var dmg = Player.Instance.GetAutoAttackDamage(heroClient, true) * 2;

            if (Q.IsReady())
            {
                dmg += Player.Instance.GetSpellDamage(heroClient, SpellSlot.Q);
            }
            if (W.IsReady())
            {
                dmg += Player.Instance.GetSpellDamage(heroClient, SpellSlot.W);
            }
            if (R.IsReady())
            {
                dmg += Player.Instance.GetSpellDamage(heroClient, SpellSlot.R);
            }

            if (!((dmg < heroClient.TotalHealthWithShields()) || (Q.IsReady() && W.IsReady())))
            {
                return;
            }

            if (Settings.Misc.EMode == 0)
            {
                if (Player.Instance.HealthPercent > heroClient.HealthPercent + 5 && heroClient.CountEnemiesInRange(600) <= 2)
                {
                    if (!Player.Instance.Position.Extend(Game.CursorPos, 420)
                        .To3D()
                        .IsVectorUnderEnemyTower() &&
                        (!heroClient.IsMelee ||
                         Player.Instance.Position.Extend(Game.CursorPos, 420)
                         .IsInRange(heroClient, heroClient.GetAutoAttackRange() * 1.5f)))
                    {
                        Misc.PrintDebugMessage("1v1 Game.CursorPos");
                        position = Game.CursorPos.Distance(Player.Instance) > E.Range
                            ? Player.Instance.Position.Extend(Game.CursorPos, 420).To3D()
                            : Game.CursorPos;
                    }
                }
                else
                {
                    var closest =
                        EntityManager.Heroes.Enemies.Where(x => x.IsValidTarget(1300))
                        .OrderBy(x => x.Distance(Player.Instance)).ToArray()[0];

                    var list =
                        SafeSpotFinder.GetSafePosition(Player.Instance.Position.To2D(), 900,
                                                       1300,
                                                       heroClient.IsMelee ? heroClient.GetAutoAttackRange() * 2 : heroClient.GetAutoAttackRange())
                        .Where(
                            x =>
                            !x.Key.To3D().IsVectorUnderEnemyTower() &&
                            x.Key.IsInRange(Prediction.Position.PredictUnitPosition(closest, 850),
                                            Player.Instance.GetAutoAttackRange() - 50))
                        .Select(source => source.Key)
                        .ToList();

                    if (list.Any())
                    {
                        var paths =
                            EntityManager.Heroes.Enemies.Where(x => x.IsValidTarget(1300))
                            .Select(x => x.Path)
                            .Count(result => result != null && result.Last().Distance(Player.Instance) < 300);

                        var asc = Misc.SortVectorsByDistance(list, heroClient.Position.To2D())[0].To3D();
                        if (Player.Instance.CountEnemiesInRange(Player.Instance.GetAutoAttackRange()) == 0 &&
                            !EntityManager.Heroes.Enemies.Where(x => x.Distance(Player.Instance) < 1000).Any(
                                x => Prediction.Position.PredictUnitPosition(x, 800)
                                .IsInRange(asc,
                                           x.IsMelee ? x.GetAutoAttackRange() * 2 : x.GetAutoAttackRange())))
                        {
                            position = asc;

                            Misc.PrintDebugMessage("Paths low sorting Ascending");
                        }
                        else if (Player.Instance.CountEnemiesInRange(1000) <= 2 && (paths == 0 || paths == 1) &&
                                 ((closest.Health < Player.Instance.GetAutoAttackDamage(closest, true) * 2) ||
                                  (Orbwalker.LastTarget is AIHeroClient &&
                                   Orbwalker.LastTarget.Health <
                                   Player.Instance.GetAutoAttackDamage(closest, true) * 2)))
                        {
                            position = asc;
                        }
                        else
                        {
                            position =
                                Misc.SortVectorsByDistanceDescending(list, heroClient.Position.To2D())[0].To3D();
                            Misc.PrintDebugMessage("Paths high sorting Descending");
                        }
                    }
                    else
                    {
                        Misc.PrintDebugMessage("1v1 not found positions...");
                    }
                }

                if (position != Vector3.Zero && EntityManager.Heroes.Enemies.Any(x => x.IsValidTarget(900)))
                {
                    E.Cast(position.Distance(Player.Instance) > E.Range ? Player.Instance.Position.Extend(position, E.Range).To3D() : position);
                }
            }
            else if (Settings.Misc.EMode == 1)
            {
                var enemies = Player.Instance.CountEnemiesInRange(1300);
                var pos     = Game.CursorPos.Distance(Player.Instance) > E.Range
                    ? Player.Instance.Position.Extend(Game.CursorPos, 420).To3D()
                    : Game.CursorPos;

                if (!pos.IsVectorUnderEnemyTower())
                {
                    if (heroClient.IsMelee &&
                        !pos.IsInRange(Prediction.Position.PredictUnitPosition(heroClient, 850),
                                       heroClient.GetAutoAttackRange() + 150))
                    {
                        E.Cast(pos);
                        return;
                    }
                    if (!heroClient.IsMelee)
                    {
                        E.Cast(pos);
                    }
                }
                else if (enemies == 2 && Player.Instance.CountAlliesInRange(850) >= 1)
                {
                    E.Cast(pos);
                }
                else if (enemies >= 2)
                {
                    if (
                        !EntityManager.Heroes.Enemies.Any(
                            x =>
                            pos.IsInRange(Prediction.Position.PredictUnitPosition(x, 400),
                                          x.IsMelee ? x.GetAutoAttackRange() + 150 : x.GetAutoAttackRange())))
                    {
                        E.Cast(pos);
                    }
                }
            }
        }
コード例 #2
0
ファイル: Harass.cs プロジェクト: DarkAvengerr/Marksman-AIO
        public static void Execute()
        {
            if (IsPostAttack && Q.IsReady() && Settings.Harass.UseQ &&
                Player.Instance.ManaPercent >= Settings.Harass.MinManaToUseQ)
            {
                var enemies  = Player.Instance.CountEnemiesInRange(1300);
                var target   = TargetSelector.GetTarget(Player.Instance.GetAutoAttackRange() + 300, DamageType.Physical);
                var position = Vector3.Zero;

                if (!Settings.Misc.QSafetyChecks)
                {
                    if (!Player.Instance.Position.Extend(Game.CursorPos, 300).To3D().IsVectorUnderEnemyTower())
                    {
                        Q.Cast(Player.Instance.Position.Extend(Game.CursorPos, 285).To3D());
                    }
                }
                else
                {
                    switch (Settings.Misc.QMode)
                    {
                    case 1:
                        switch (enemies)
                        {
                        case 0:
                        {
                            if (
                                !Player.Instance.Position.Extend(Game.CursorPos, 285)
                                .To3D()
                                .IsVectorUnderEnemyTower())
                            {
                                position = Player.Instance.Position.Extend(Game.CursorPos, 285).To3D();
                            }
                        }
                        break;

                        case 1:
                        {
                            if (target != null && Player.Instance.HealthPercent > 50 &&
                                target.HealthPercent < 30)
                            {
                                if (
                                    !Player.Instance.Position.Extend(Game.CursorPos, 285)
                                    .To3D()
                                    .IsVectorUnderEnemyTower())
                                {
                                    Console.WriteLine("[DEBUG] 1v1 Game.CursorPos");
                                    position = Player.Instance.Position.Extend(Game.CursorPos, 285).To3D();
                                }
                            }
                            else if (target != null)
                            {
                                var list =
                                    SafeSpotFinder.GetSafePosition(Player.Instance.Position.To2D(), 300,
                                                                   900,
                                                                   target.IsMelee
                                                    ? target.GetAutoAttackRange() * 2
                                                    : target.GetAutoAttackRange())
                                    .Where(x => !x.Key.To3D().IsVectorUnderEnemyTower())
                                    .Select(source => source.Key)
                                    .ToList();

                                if (list.Any())
                                {
                                    Console.WriteLine("[DEBUG] 1v1 found positions");
                                    position =
                                        Misc.SortVectorsByDistance(list, target.Position.To2D())[0].To3D();
                                }
                                Console.WriteLine("[DEBUG] 1v1 not found positions...");
                            }
                        }
                        break;

                        case 2:
                        {
                            var enemy =
                                EntityManager.Heroes.Enemies.Where(
                                    x => !x.IsDead && x.Distance(Player.Instance) < 1300)
                                .OrderBy(x => x.Distance(Player.Instance)).ToArray();

                            List <Vector2> list;
                            if (Player.Instance.HealthPercent > 50 && enemy[0].HealthPercent < 30 &&
                                (enemy[1].Distance(Player.Instance) > 600 || enemy[1].HealthPercent < 25))
                            {
                                list =
                                    SafeSpotFinder.GetSafePosition(Player.Instance.Position.To2D(), 300, 1300,
                                                                   300)
                                    .Where(x => x.Value == 0 && !x.Key.To3D().IsVectorUnderEnemyTower())
                                    .Select(source => source.Key)
                                    .ToList();
                                Console.WriteLine("[DEBUG] 2v1 main if");
                            }
                            else
                            {
                                list =
                                    SafeSpotFinder.GetSafePosition(Player.Instance.Position.To2D(), 300,
                                                                   Player.Instance.CountEnemiesInRange(800) >= 1 ? 800 : 1300,
                                                                   Player.Instance.CountEnemiesInRange(800) >= 1 ? 400 : 450)
                                    .Where(x => x.Value < 2 && !x.Key.To3D().IsVectorUnderEnemyTower())
                                    .Select(source => source.Key)
                                    .ToList();
                                Console.WriteLine("[DEBUG] 2v1 else .. ");
                            }
                            if (list.Any())
                            {
                                Console.WriteLine("[DEBUG] 2v1 found positions");
                                position = Misc.SortVectorsByDistance(list, target.Position.To2D())[0].To3D();
                            }
                            Console.WriteLine("[DEBUG] 2v1 not found positions");
                        }
                        break;

                        case 3:
                        {
                            var list =
                                SafeSpotFinder.GetSafePosition(Player.Instance.Position.To2D(), 300, 1300, 550)
                                .Where(x => x.Value < 2 && !x.Key.To3D().IsVectorUnderEnemyTower())
                                .Select(source => source.Key)
                                .ToList();

                            if (list.Any())
                            {
                                Console.WriteLine("[DEBUG] 3v1 found positions ");
                                position = Misc.SortVectorsByDistance(list, target.Position.To2D())[0].To3D();
                            }
                            else
                            {
                                Console.WriteLine("[DEBUG] 3v1 not found positions ");
                                var list2 =
                                    SafeSpotFinder.GetSafePosition(Player.Instance.Position.To2D(), 300, 1300,
                                                                   450)
                                    .Where(x => !x.Key.To3D().IsVectorUnderEnemyTower())
                                    .Select(source => source.Key)
                                    .ToList();
                                var closest =
                                    EntityManager.Heroes.Enemies.Where(x => x.IsValidTarget(900))
                                    .OrderBy(x => x.Distance(Player.Instance));

                                if (list2.Any())
                                {
                                    Console.WriteLine("[DEBUG] 3v1 found positions else ");
                                    position =
                                        Misc.SortVectorsByDistanceDescending(list2,
                                                                             closest.First().Position.To2D())
                                        [0].To3D();
                                }
                            }
                        }
                        break;

                        case 4:
                        {
                            var list =
                                SafeSpotFinder.GetSafePosition(Player.Instance.Position.To2D(), 300, 1300, 650)
                                .Where(x => x.Value <= 1 && !x.Key.To3D().IsVectorUnderEnemyTower())
                                .Select(source => source.Key)
                                .ToList();

                            if (list.Any())
                            {
                                position =
                                    Misc.SortVectorsByDistanceDescending(list, target.Position.To2D())[0].To3D();
                            }
                            else
                            {
                                var list2 =
                                    SafeSpotFinder.GetSafePosition(Player.Instance.Position.To2D(), 300, 1300,
                                                                   550)
                                    .Where(x => !x.Key.To3D().IsVectorUnderEnemyTower())
                                    .Select(source => source.Key)
                                    .ToList();
                                var closest =
                                    EntityManager.Heroes.Enemies.Where(x => x.IsValidTarget(1300))
                                    .OrderBy(x => x.Distance(Player.Instance));

                                if (list2.Any())
                                {
                                    position =
                                        Misc.SortVectorsByDistanceDescending(list2,
                                                                             closest.First().Position.To2D())
                                        [0].To3D();
                                }
                            }
                        }
                        break;

                        default:
                        {
                            var list =
                                SafeSpotFinder.GetSafePosition(Player.Instance.Position.To2D(), 300, 1300, 750)
                                .Where(x => x.Value <= 1 && !x.Key.To3D().IsVectorUnderEnemyTower())
                                .Select(source => source.Key)
                                .ToList();

                            if (list.Any())
                            {
                                position =
                                    Misc.SortVectorsByDistanceDescending(list, target.Position.To2D())[0].To3D();
                            }
                            else
                            {
                                var list2 =
                                    SafeSpotFinder.GetSafePosition(Player.Instance.Position.To2D(), 300, 1300,
                                                                   550)
                                    .Where(x => !x.Key.To3D().IsVectorUnderEnemyTower())
                                    .Select(source => source.Key)
                                    .ToList();
                                var closest =
                                    EntityManager.Heroes.Enemies.Where(x => x.IsValidTarget(1300))
                                    .OrderBy(x => x.Distance(Player.Instance));

                                if (list2.Any())
                                {
                                    position =
                                        Misc.SortVectorsByDistanceDescending(list2,
                                                                             closest.First().Position.To2D())
                                        [0].To3D();
                                }
                            }
                        }
                        break;
                        }
                        if (position != Vector3.Zero && EntityManager.Heroes.Enemies.Any(x => x.IsValidTarget(900)))
                        {
                            Q.Cast(Game.CursorPos.Extend(position, 285).To3D());
                        }
                        break;

                    case 0:
                        var pos = Player.Instance.Position.Extend(Game.CursorPos, 299).To3D();

                        if (!pos.IsVectorUnderEnemyTower())
                        {
                            if (target != null)
                            {
                                if (target.HealthPercent + 15 < Player.Instance.HealthPercent)
                                {
                                    if (target.IsMelee &&
                                        !pos.IsInRange(Prediction.Position.PredictUnitPosition(target, 850),
                                                       target.GetAutoAttackRange() + 150))
                                    {
                                        Q.Cast(pos);
                                    }
                                    else if (!target.IsMelee)
                                    {
                                        Q.Cast(pos);
                                    }
                                }
                                else if (enemies == 2 && Player.Instance.CountAlliesInRange(850) >= 1)
                                {
                                    Q.Cast(pos);
                                }
                                else if (enemies >= 2)
                                {
                                    if (
                                        !EntityManager.Heroes.Enemies.Any(
                                            x =>
                                            pos.IsInRange(Prediction.Position.PredictUnitPosition(x, 850),
                                                          x.IsMelee
                                                            ? x.GetAutoAttackRange() + 150
                                                            : x.GetAutoAttackRange())))
                                    {
                                        Q.Cast(pos);
                                    }
                                }
                            }
                        }
                        break;
                    }
                }
            }
        }
コード例 #3
0
        public static void Execute()
        {
            if (E.IsReady() && Settings.Combo.UseE)
            {
                // ReSharper disable once SwitchStatementMissingSomeCases
                switch (Settings.Misc.ETargeting)
                {
                case 0:
                    var target = TargetSelector.GetTarget(E.Range, DamageType.Physical);

                    if ((target != null) && WillEStun(target))
                    {
                        E.Cast(target);
                        return;
                    }
                    break;

                case 1:
                    foreach (var enemy in
                             StaticCacheProvider.GetChampions(CachedEntityType.EnemyHero,
                                                              x => x.IsValidTargetCached(E.Range) && WillEStun(x))
                             .OrderByDescending(TargetSelector.GetPriority))
                    {
                        E.Cast(enemy);
                        return;
                    }
                    break;
                }
            }

            if (Settings.Combo.TryToQE && Q.IsReady() && E.IsReady() && (Player.Instance.CountEnemiesInRangeCached(1100) == 1) && (Player.Instance.Mana >= 120))
            {
                var target = TargetSelector.GetTarget(Player.Instance.GetAutoAttackRange(), DamageType.Physical);

                if (target == null)
                {
                    return;
                }

                if (WillEStun(target, Player.Instance.Position.Extend(Game.CursorPos, 300).To3D(), 100, 440))
                {
                    Q.Cast(Player.Instance.Position.Extend(Game.CursorPos, 285).To3D());
                    return;
                }

                var points = new Geometry.Polygon.Circle(Player.Instance.Position, 300).Points.Where(
                    x => !x.To3D().IsVectorUnderEnemyTower() && WillEStun(target, x.To3D(), 100, 440, 370)).ToList();

                foreach (var vector2 in points)
                {
                    Q.Cast(Player.Instance.Position.Extend(vector2, 285).To3D());
                    return;
                }
            }

            if (IsPostAttack && Q.IsReady() && Settings.Combo.UseQ && (!Settings.Combo.UseQOnlyToProcW ||
                                                                       ((Orbwalker.LastTarget.GetType() == typeof(AIHeroClient)) &&
                                                                        HasSilverDebuff((AIHeroClient)Orbwalker.LastTarget) &&
                                                                        (GetSilverDebuff((AIHeroClient)Orbwalker.LastTarget).Count == 1))))
            {
                var enemies  = Player.Instance.CountEnemiesInRangeCached(2000);
                var target   = TargetSelector.GetTarget(Player.Instance.GetAutoAttackRange() + 320, DamageType.Physical);
                var position = Vector3.Zero;

                if (!Settings.Misc.QSafetyChecks)
                {
                    if (!Player.Instance.Position.Extend(Game.CursorPos, 300).To3D().IsVectorUnderEnemyTower())
                    {
                        var positions = StaticCacheProvider.GetChampions(CachedEntityType.EnemyHero).Select(x => Prediction.Position.PredictUnitPosition(x, 370));

                        if (positions.Any(x => Player.Instance.IsInRange(x, Player.Instance.GetAutoAttackRange())) && IsValidDashDirection(Player.Instance.Position.Extend(Game.CursorPos, 300).To3D()))
                        {
                            Q.Cast(Player.Instance.Position.Extend(Game.CursorPos, 285).To3D());
                            return;
                        }
                    }
                }
                else
                {
                    switch (Settings.Misc.QMode)
                    {
                    case 1:
                        if ((target != null) && (Player.Instance.HealthPercent > target.HealthPercent) && (Player.Instance.HealthPercent > 10) &&
                            (target.CountEnemiesInRangeCached(1000) <= 2))
                        {
                            if ((!Player.Instance.Position.Extend(Game.CursorPos, 285).To3D().IsVectorUnderEnemyTower() &&
                                 (!target.IsMelee || !Player.Instance.Position.Extend(Game.CursorPos, 285).IsInRangeCached(target.Position, target.GetAutoAttackRange() * 1.5f))) ||
                                !target.IsMovingTowards(Player.Instance, 300))
                            {
                                var qPosition    = Player.Instance.Position.Extend(Game.CursorPos, 300).To3D();
                                var unitPosition = Prediction.Position.PredictUnitPosition(target, 300);

                                if (Settings.Combo.BlockQsOutOfAaRange && !qPosition.IsInRangeCached(unitPosition, Player.Instance.GetAutoAttackRange()))
                                {
                                    return;
                                }

                                if (IsValidDashDirection(qPosition))
                                {
                                    Misc.PrintDebugMessage("1v1 Game.CursorPos");
                                    Q.Cast(qPosition);
                                    return;
                                }
                            }
                        }
                        else if (target != null)
                        {
                            var closest = StaticCacheProvider.GetChampions(CachedEntityType.EnemyHero,
                                                                           x => x.IsValidTargetCached(2000)).OrderBy(x => x.DistanceCached(Player.Instance)).ToArray()[0];

                            var list = SafeSpotFinder.GetSafePosition(Player.Instance.Position.To2D(), 900, 2000, 600)
                                       .Where(x => (x.Key.CutVectorNearWall(320).Distance(Player.Instance) > 250) && (x.Value <= 1))
                                       .Select(source => source.Key).ToList();

                            if (list.Any())
                            {
                                var range = enemies * 125;
                                var paths = StaticCacheProvider.GetChampions(CachedEntityType.EnemyHero, x => x.IsValidTargetCached(2000))
                                            .Count(x => x.IsMovingTowards(Player.Instance, range < x.GetAutoAttackRange() ? (int)x.GetAutoAttackRange() : range));

                                if ((Player.Instance.CountEnemiesInRangeCached(Player.Instance.GetAutoAttackRange()) == 0) || (paths == 0))
                                {
                                    if (Settings.Combo.BlockQsOutOfAaRange)
                                    {
                                        var positions = StaticCacheProvider.GetChampions(CachedEntityType.EnemyHero).Select(x => Prediction.Position.PredictUnitPosition(x, 300));

                                        list.ForEach(x =>
                                        {
                                            if (!positions.Any(p => x.IsInRangeCached(p, Player.Instance.GetAutoAttackRange())))
                                            {
                                                list.Remove(x);
                                            }
                                        });
                                    }

                                    position = Misc.SortVectorsByDistance(list, closest.Position.To2D())[0].To3D();

                                    Misc.PrintDebugMessage("Paths low sorting Ascending");
                                }
                                else if ((Player.Instance.CountEnemiesInRangeCached(1000) <= 2) && (paths <= 2) &&
                                         list.Any(x => x.IsInRangeCached(Prediction.Position.PredictUnitPosition(target, 300), Player.Instance.GetAutoAttackRange() - 50)) &&
                                         (target.Health < Player.Instance.GetAutoAttackDamage(target) * 2f + Damage.QBonusDamage[Q.Level]))
                                {
                                    position = Misc.SortVectorsByDistance(list.Where(x =>
                                                                                     x.IsInRangeCached(Prediction.Position.PredictUnitPosition(target, 300), Player.Instance.GetAutoAttackRange() - 50)).ToList(),
                                                                          target.Position.To2D())[0].To3D();

                                    Misc.PrintDebugMessage("Paths low sorting Ascending");
                                }
                                else
                                {
                                    position = Misc.SortVectorsByDistanceDescending(list, target.Position.To2D())[0].To3D();

                                    Misc.PrintDebugMessage("Paths high sorting Descending");
                                }
                            }
                            else
                            {
                                position = Misc.SortVectorsByDistanceDescending(
                                    SafeSpotFinder.PointsInRange(Player.Instance.Position.To2D(), 300, 300).ToList(), closest.Position.To2D())[0].To3D();

                                Misc.PrintDebugMessage("not found positions...");
                            }
                        }

                        if ((position != Vector3.Zero) &&
                            StaticCacheProvider.GetChampions(CachedEntityType.EnemyHero,
                                                             x => x.IsValidTargetCached(Player.Instance.GetAutoAttackRange() + 300) && (Prediction.Health.GetPrediction(x, 500) > 0)).Any())
                        {
                            Q.Cast(Player.Instance.Position.Extend(position, 285).To3D());
                            return;
                        }
                        break;

                    case 0:
                        var pos = Player.Instance.Position.Extend(Game.CursorPos, 299).To3D();

                        if (!pos.IsVectorUnderEnemyTower())
                        {
                            if (target != null)
                            {
                                if (enemies == 1)
                                {
                                    var unitPosition = Prediction.Position.PredictUnitPosition(target, 370);
                                    var isInRange    = pos.IsInRangeCached(unitPosition, target.IsMelee ? 500 : 300);

                                    if ((!isInRange && IsValidDashDirection(pos)) || (isInRange && (target.HealthPercent >= Player.Instance.HealthPercent) && target.IsMovingTowards(Player.Instance, 600) && EnemiesInDirectionOfTheDash(pos, 1300).All(x => !x.IdEquals(target))) ||
                                        ((Player.Instance.GetAutoAttackDamageCached(target) * (2 + Damage.QBonusDamage[Q.Level] * 2) >= target.TotalHealthWithShields()) &&
                                         EnemiesInDirectionOfTheDash(pos, 2000).Any(x => x.IdEquals(target))) || (!target.IsMovingTowards(Player.Instance, 600) && IsValidDashDirection(pos)))
                                    {
                                        if ((Player.Instance.HealthPercent - 15 >= target.HealthPercent) && Player.Instance.IsInRangeCached(target, Player.Instance.GetAutoAttackRange()) &&
                                            !pos.IsInRangeCached(target, Player.Instance.GetAutoAttackRange() - 50))
                                        {
                                            return;
                                        }

                                        Q.Cast(pos);
                                        return;
                                    }
                                }
                                else if ((enemies == 2) && (((Player.Instance.CountAlliesInRangeCached(400) > 1) && IsValidDashDirection(pos)) || !EnemiesInDirectionOfTheDash(pos, 1300).Any() ||
                                                            ((Player.Instance.GetAutoAttackDamageCached(target) * (2 + Damage.QBonusDamage[Q.Level] * 2) >= target.TotalHealthWithShields()) && (pos.CountEnemiesInRangeCached(Player.Instance.GetAutoAttackRange()) == 1) && IsValidDashDirection(pos)) ||
                                                            !StaticCacheProvider.GetChampions(CachedEntityType.EnemyHero,
                                                                                              x => x.IsValidTarget(1200) && pos.IsInRangeCached(Prediction.Position.PredictUnitPosition(target, 300), x.IsMelee ? 500 : x.GetAutoAttackRange())).Any()))
                                {
                                    if (Settings.Combo.BlockQsOutOfAaRange)
                                    {
                                        var positions = StaticCacheProvider.GetChampions(CachedEntityType.EnemyHero).Select(x => Prediction.Position.PredictUnitPosition(x, 370));

                                        if (!positions.Any(x => pos.IsInRangeCached(x, Player.Instance.GetAutoAttackRange())))
                                        {
                                            return;
                                        }
                                    }

                                    Q.Cast(pos);
                                    return;
                                }
                                else
                                {
                                    var range = enemies * 150;

                                    if (!StaticCacheProvider.GetChampions(CachedEntityType.EnemyHero, x =>
                                                                          pos.IsInRangeCached(Prediction.Position.PredictUnitPosition(x, 300), range < x.GetAutoAttackRange() ? x.GetAutoAttackRange() : range)).Any())
                                    {
                                        Q.Cast(pos);
                                        return;
                                    }
                                }
                            }

                            var closest         = StaticCacheProvider.GetChampions(CachedEntityType.EnemyHero, x => x.IsValidTargetCached(1300)).OrderBy(x => x.DistanceCached(Player.Instance)).FirstOrDefault();
                            var paths           = StaticCacheProvider.GetChampions(CachedEntityType.EnemyHero, x => x.IsValidTargetCached(1300)).Count(x => x.IsMovingTowards(Player.Instance));
                            var validEscapeDash = (pos.DistanceCached(closest) > Player.Instance.DistanceCached(closest)) && (pos.DistanceCached(Player.Instance) >= 270);

                            if ((closest != null) && (Player.Instance.CountEnemiesInRangeCached(350) >= 1) && (paths >= 1) && (validEscapeDash || !EnemiesInDirectionOfTheDash(pos, 1300).Any()))
                            {
                                Q.Cast(pos);
                            }
                        }
                        break;

                    default:
                        return;
                    }
                }
            }

            if (!IsPreAttack && Q.IsReady() && Settings.Combo.UseQ && Settings.Combo.UseQToPoke)
            {
                var enemies  = Player.Instance.CountEnemiesInRangeCached(1200);
                var target   = TargetSelector.GetTarget(Player.Instance.GetAutoAttackRange() + 300, DamageType.Physical);
                var position = Player.Instance.Position.Extend(Game.CursorPos, 299).To3D();

                if ((target != null) && !target.IsMovingTowards(Player.Instance, 300) && !position.IsVectorUnderEnemyTower() &&
                    (Player.Instance.HealthPercent > target.HealthPercent) &&
                    !Player.Instance.IsInAutoAttackRange(target) && (enemies == 1))
                {
                    var targetPos = Prediction.Position.PredictUnitPosition(target, 370);

                    if (!targetPos.IsInRange(position, 300) &&
                        position.IsInRange(targetPos, Player.Instance.GetAutoAttackRange()))
                    {
                        Q.Cast(position);
                    }
                }
            }

            if (!R.IsReady() || !Settings.Combo.UseR)
            {
                return;
            }
            {
                var enemies = Player.Instance.CountEnemiesInRangeCached(Player.Instance.GetAutoAttackRange() + 330);
                var target  = TargetSelector.GetTarget(Player.Instance.GetAutoAttackRange() + 330, DamageType.Physical);

                if ((target == null) || (Orbwalker.LastTarget.GetType() != typeof(AIHeroClient)) || (enemies < 3) ||
                    !(Player.Instance.HealthPercent > 25))
                {
                    return;
                }

                R.Cast();
            }
        }