Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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));
        }