private static Vector3 GetDashQPos() { var firstQPos = Me.ServerPosition.Extend(Game.CursorPosition, Q.Range); var allPoint = MyGeometry.GetCirclrPos(Me.ServerPosition, Q.Range); foreach (var point in allPoint) { var mousecount = firstQPos.CountEnemiesInRange(300); var count = point.CountEnemiesInRange(300); if (!HaveEnemiesInRange(point)) { continue; } if (mousecount == count) { if (point.DistanceToMouse() < firstQPos.DistanceToMouse()) { firstQPos = point; } } if (count < mousecount) { firstQPos = point; } } for (var i = 1; i <= 5; i++) { if (NavMesh.IsWall(Me.ServerPosition.Extend(firstQPos, i * 20))) { return(Vector3.Zero); } } if (MiscOption.GetBool("QTurret") && firstQPos.UnderTurret(true)) { return(Vector3.Zero); } if (MiscOption.GetBool("QCheck")) { if (Me.CountEnemiesInRange(Q.Range + Me.BoundingRadius - 30) < firstQPos.CountEnemiesInRange(Q.Range * 2 - Me.BoundingRadius)) { return(Vector3.Zero); } if (firstQPos.CountEnemiesInRange(Q.Range * 2 - Me.BoundingRadius) > 3) { return(Vector3.Zero); } } return(!HaveEnemiesInRange(firstQPos) ? Vector3.Zero : firstQPos); }
public static List <Vector2> GetEvadePoints(int speed = -1, int delay = 0, bool onlyGood = false) { speed = speed == -1 ? (int)ObjectManager.GetLocalPlayer().MoveSpeed : speed; var goodCandidates = new List <Vector2>(); var badCandidates = new List <Vector2>(); var polygonList = new List <MyGeometry.Polygon>(); var takeClosestPath = false; var detectedSkillshots = DetectedSkillshots.ToArray(); foreach (var skillshot in detectedSkillshots) { if (skillshot.Evade()) { if (skillshot.SpellData.TakeClosestPath && skillshot.IsDanger(ObjectManager.GetLocalPlayer().ServerPosition.To2D())) { takeClosestPath = true; } polygonList.Add(skillshot.EvadePolygon); } } var dangerPolygons = MyGeometry.ClipPolygons(polygonList).ToPolygons().ToArray(); var myPosition = ObjectManager.GetLocalPlayer().ServerPosition.To2D(); foreach (var poly in dangerPolygons) { for (var i = 0; i <= poly.Points.Count - 1; i++) { var sideStart = poly.Points[i]; var sideEnd = poly.Points[i == poly.Points.Count - 1 ? 0 : i + 1]; var originalCandidate = myPosition.ProjectOn(sideStart, sideEnd).SegmentPoint; var distanceToEvadePoint = Vector2.DistanceSquared(originalCandidate, myPosition); if (distanceToEvadePoint < 600 * 600) { var sideDistance = Vector2.DistanceSquared(sideEnd, sideStart); var direction = (sideEnd - sideStart).Normalized(); var s = distanceToEvadePoint < 200 * 200 && sideDistance > 90 * 90 ? 7 : 0; for (var j = -s; j <= s; j++) { var candidate = originalCandidate + j * 20 * direction; var pathToPoint = ObjectManager.GetLocalPlayer().GetPath(candidate.To3D()).To2DList(); if (IsSafePath(pathToPoint, 250, speed, delay).IsSafe) { goodCandidates.Add(candidate); } if (IsSafePath(pathToPoint, 80, speed, delay).IsSafe&& j == 0) { badCandidates.Add(candidate); } } } } } if (takeClosestPath) { if (goodCandidates.Count > 0) { goodCandidates = new List <Vector2> { goodCandidates.MinOrDefault(vector2 => ObjectManager.GetLocalPlayer().Distance(vector2, true)) }; } if (badCandidates.Count > 0) { badCandidates = new List <Vector2> { badCandidates.MinOrDefault(vector2 => ObjectManager.GetLocalPlayer().Distance(vector2, true)) }; } } return(goodCandidates.Count > 0 ? goodCandidates : (onlyGood ? new List <Vector2>() : badCandidates)); }