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); } } } }
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; } } } }
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(); } }