private static void TryToEvade(List <Skillshot> HitBy, Vector2 to) { var dangerLevel = 0; foreach (var skillshot in HitBy) { dangerLevel = Math.Max(dangerLevel, skillshot.GetValue <Slider>("DangerLevel").Value); } foreach (var evadeSpell in EvadeSpellDatabase.Spells) { if (evadeSpell.Enabled && evadeSpell.DangerLevel <= dangerLevel) { if (evadeSpell.IsSpellShield && ObjectManager.Player.Spellbook.CanUseSpell(evadeSpell.Slot) == SpellState.Ready) { if (IsAboutToHit(ObjectManager.Player, evadeSpell.Delay)) { ObjectManager.Player.Spellbook.CastSpell(evadeSpell.Slot, ObjectManager.Player); } NoSolutionFound = true; return; } if (evadeSpell.IsReady()) { if (evadeSpell.IsMovementSpeedBuff) { var points = Evader.GetEvadePoints((int)evadeSpell.MoveSpeedTotalAmount()); if (points.Count > 0) { EvadePoint = to.Closest(points); Evading = true; if (evadeSpell.IsSummonerSpell) { ObjectManager.Player.Spellbook.CastSpell( evadeSpell.Slot, ObjectManager.Player); } else { ObjectManager.Player.Spellbook.CastSpell(evadeSpell.Slot, ObjectManager.Player); } return; } } if (evadeSpell.IsDash) { if (evadeSpell.IsTargetted) { var targets = Evader.GetEvadeTargets( evadeSpell.ValidTargets, evadeSpell.Speed, evadeSpell.Delay, evadeSpell.MaxRange); if (targets.Count > 0) { var closestTarget = Utils.Closest(targets, to); EvadePoint = closestTarget.ServerPosition.To2D(); Evading = true; if (evadeSpell.IsSummonerSpell) { ObjectManager.Player.Spellbook.CastSpell(evadeSpell.Slot, closestTarget); } else { ObjectManager.Player.Spellbook.CastSpell(evadeSpell.Slot, closestTarget); } return; } if (Utils.TickCount - LastWardJumpAttempt < 250) { NoSolutionFound = true; return; } } else { var points = Evader.GetEvadePoints(evadeSpell.Speed, evadeSpell.Delay); points.RemoveAll( item => item.Distance(ObjectManager.Player.ServerPosition) > evadeSpell.MaxRange); if (evadeSpell.FixedRange) { for (var i = 0; i < points.Count; i++) { points[i] = PlayerPosition .Extend(points[i], evadeSpell.MaxRange); } for (var i = points.Count - 1; i > 0; i--) { if (!IsSafe(points[i]).IsSafe) { points.RemoveAt(i); } } } else { for (var i = 0; i < points.Count; i++) { var k = (int) (evadeSpell.MaxRange - PlayerPosition.Distance(points[i])); k -= Math.Max(RandomN.Next(k) - 100, 0); var extended = points[i] + k * (points[i] - PlayerPosition) .Normalized(); if (IsSafe(extended).IsSafe) { points[i] = extended; } } } if (points.Count > 0) { EvadePoint = to.Closest(points); Evading = true; if (!evadeSpell.Invert) { if (evadeSpell.RequiresPreMove) { var theSpell = evadeSpell; Utility.DelayAction.Add( Game.Ping / 2 + 100, delegate { ObjectManager.Player.Spellbook.CastSpell( theSpell.Slot, EvadePoint.To3D()); }); } else { ObjectManager.Player.Spellbook.CastSpell(evadeSpell.Slot, EvadePoint.To3D()); } } else { var castPoint = PlayerPosition - (EvadePoint - PlayerPosition); ObjectManager.Player.Spellbook.CastSpell(evadeSpell.Slot, castPoint.To3D()); } return; } } } if (evadeSpell.IsBlink) { if (evadeSpell.IsTargetted) { var targets = Evader.GetEvadeTargets( evadeSpell.ValidTargets, int.MaxValue, evadeSpell.Delay, evadeSpell.MaxRange, true); if (targets.Count > 0) { if (IsAboutToHit(ObjectManager.Player, evadeSpell.Delay)) { var closestTarget = Utils.Closest(targets, to); EvadePoint = closestTarget.ServerPosition.To2D(); Evading = true; if (evadeSpell.IsSummonerSpell) { ObjectManager.Player.Spellbook.CastSpell( evadeSpell.Slot, closestTarget); } else { ObjectManager.Player.Spellbook.CastSpell(evadeSpell.Slot, closestTarget); } } NoSolutionFound = true; return; } if (Utils.TickCount - LastWardJumpAttempt < 250) { NoSolutionFound = true; return; } } else { var points = Evader.GetEvadePoints(int.MaxValue, evadeSpell.Delay, true); points.RemoveAll( item => item.Distance(ObjectManager.Player.ServerPosition) > evadeSpell.MaxRange); for (var i = 0; i < points.Count; i++) { var k = (int) (evadeSpell.MaxRange - PlayerPosition.Distance(points[i])); k = k - new Random(Utils.TickCount).Next(k); var extended = points[i] + k * (points[i] - PlayerPosition).Normalized(); if (IsSafe(extended).IsSafe) { points[i] = extended; } } if (points.Count > 0) { if (IsAboutToHit(ObjectManager.Player, evadeSpell.Delay)) { EvadePoint = to.Closest(points); Evading = true; if (evadeSpell.IsSummonerSpell) { ObjectManager.Player.Spellbook.CastSpell( evadeSpell.Slot, EvadePoint.To3D()); } else { ObjectManager.Player.Spellbook.CastSpell(evadeSpell.Slot, EvadePoint.To3D()); } } NoSolutionFound = true; return; } } } if (evadeSpell.IsInvulnerability) { if (evadeSpell.IsTargetted) { var targets = Evader.GetEvadeTargets( evadeSpell.ValidTargets, int.MaxValue, 0, evadeSpell.MaxRange, true, false, true); if (targets.Count > 0) { if (IsAboutToHit(ObjectManager.Player, evadeSpell.Delay)) { var closestTarget = Utils.Closest(targets, to); EvadePoint = closestTarget.ServerPosition.To2D(); Evading = true; ObjectManager.Player.Spellbook.CastSpell(evadeSpell.Slot, closestTarget); } NoSolutionFound = true; return; } } else { if (IsAboutToHit(ObjectManager.Player, evadeSpell.Delay)) { if (evadeSpell.SelfCast) { ObjectManager.Player.Spellbook.CastSpell(evadeSpell.Slot); } else { ObjectManager.Player.Spellbook.CastSpell( evadeSpell.Slot, ObjectManager.Player.ServerPosition); } } } NoSolutionFound = true; return; } } if (evadeSpell.IsShield && ObjectManager.Player.Spellbook.CanUseSpell(evadeSpell.Slot) == SpellState.Ready) { if (IsAboutToHit(ObjectManager.Player, evadeSpell.Delay)) { ObjectManager.Player.Spellbook.CastSpell(evadeSpell.Slot, ObjectManager.Player); } NoSolutionFound = true; return; } } } NoSolutionFound = true; }
private static void ObjAiHeroOnOnIssueOrder(Obj_AI_Base sender, GameObjectIssueOrderEventArgs args) { if (!sender.IsMe) { return; } if (args.Order == GameObjectOrder.MoveTo || args.Order == GameObjectOrder.AttackTo) { EvadeToPoint.X = args.TargetPosition.X; EvadeToPoint.Y = args.TargetPosition.Y; } else { EvadeToPoint = Vector2.Zero; } if (DetectedSkillshots.Count == 0) { ForcePathFollowing = false; } if (NoSolutionFound) { return; } if (!Config.EvadeMenu.Item("Enabled").GetValue <KeyBind>().Active) { return; } if (EvadeSpellDatabase.Spells.Any(evadeSpell => evadeSpell.Name == "Walking" && !evadeSpell.Enabled)) { return; } var myPath = ObjectManager.Player.GetPath( new Vector3(args.TargetPosition.X, args.TargetPosition.Y, ObjectManager.Player.ServerPosition.Z)).To2DList(); var safeResult = IsSafe(PlayerPosition); if (Evading || !safeResult.IsSafe) { var rcSafePath = IsSafePath(myPath, Config.EvadingRouteChangeTimeOffset); if (args.Order == GameObjectOrder.MoveTo) { var willMove = false; if (Evading && Utils.TickCount - Config.LastEvadePointChangeT > Config.EvadePointChangeInterval) { var points = Evader.GetEvadePoints(-1, 0, false, true); if (points.Count > 0) { var to = new Vector2(args.TargetPosition.X, args.TargetPosition.Y); EvadePoint = to.Closest(points); Evading = true; Config.LastEvadePointChangeT = Utils.TickCount; willMove = true; } } if (rcSafePath.IsSafe && IsSafe(myPath[myPath.Count - 1]).IsSafe&& args.Order == GameObjectOrder.MoveTo) { EvadePoint = myPath[myPath.Count - 1]; Evading = true; willMove = true; } if (!willMove) { ForcePathFollowing = true; } } args.Process = false; return; } var safePath = IsSafePath(myPath, Config.CrossingTimeOffset); if (!safePath.IsSafe && args.Order != GameObjectOrder.AttackUnit) { if (safePath.Intersection.Valid) { if (ObjectManager.Player.Distance(safePath.Intersection.Point) > 75) { ForcePathFollowing = true; } } ForcePathFollowing = true; args.Process = false; } if (!safePath.IsSafe && args.Order == GameObjectOrder.AttackUnit) { var target = args.Target; if (target != null && target.IsValid <Obj_AI_Base>() && target.IsVisible) { if (PlayerPosition.Distance(((Obj_AI_Base)target).ServerPosition) > ObjectManager.Player.AttackRange + ObjectManager.Player.BoundingRadius + target.BoundingRadius) { args.Process = false; } } } }