private static IEnumerable<Obj_AI_Base> GetEvadeTargets( EvadeSpellData spell, bool onlyGood = false, bool dontCheckForSafety = false) { var badTargets = new List<Obj_AI_Base>(); var goodTargets = new List<Obj_AI_Base>(); var allTargets = new List<Obj_AI_Base>(); foreach (var targetType in spell.ValidTargets) { switch (targetType) { case SpellTargets.AllyChampions: allTargets.AddRange( EntityManager.Heroes.Allies.Where(i => i.IsValidTarget(spell.MaxRange, false) && !i.IsMe)); break; case SpellTargets.AllyMinions: allTargets.AddRange(EntityManager.MinionsAndMonsters.GetLaneMinions(EntityManager.UnitTeam.Ally, ObjectManager.Player.ServerPosition, spell.MaxRange)); break; case SpellTargets.AllyWards: allTargets.AddRange( ObjectManager.Get<Obj_AI_Minion>() .Where( i => i.IsValidTarget(spell.MaxRange, false) && i.Team == ObjectManager.Player.Team)); break; case SpellTargets.EnemyChampions: allTargets.AddRange(EntityManager.Heroes.Enemies.Where(i => i.IsValidTarget(spell.MaxRange))); break; case SpellTargets.EnemyMinions: allTargets.AddRange(EntityManager.MinionsAndMonsters.GetLaneMinions(EntityManager.UnitTeam.Enemy, ObjectManager.Player.ServerPosition, spell.MaxRange)); break; } } foreach (var target in allTargets.Where(i => dontCheckForSafety || IsSafePoint(i.ServerPosition.To2D()).IsSafe)) { if (spell.Name == "YasuoDashWrapper" && target.HasBuff("YasuoDashWrapper")) { continue; } var pathToTarget = new List<Vector2> { ObjectManager.Player.ServerPosition.To2D(), target.ServerPosition.To2D() }; if (IsSafePath(pathToTarget, Configs.EvadingFirstTimeOffset, spell.Speed, spell.Delay).IsSafe) { goodTargets.Add(target); } if (IsSafePath(pathToTarget, Configs.EvadingSecondTimeOffset, spell.Speed, spell.Delay).IsSafe) { badTargets.Add(target); } } return goodTargets.Any() ? goodTargets : (onlyGood ? new List<Obj_AI_Base>() : badTargets); }