fBaseXtensions.Navigation.Gridpoint.GPQuadrant.CheckPoint C# (CSharp) Method

CheckPoint() private method

private CheckPoint ( GridPoint point, System.Vector3 LoSCheckV3, PointCheckingFlags flags ) : bool
point GridPoint
LoSCheckV3 System.Vector3
flags PointCheckingFlags
return bool
        private bool CheckPoint(GridPoint point, Vector3 LoSCheckV3, PointCheckingFlags flags)
        {
            //Check blacklisted points and ignored
            if (point.Ignored) return false;

            //Check if this point is in a blocked direction
            if (flags.HasFlag(PointCheckingFlags.BlockedDirection))
            {
                if (FunkyGame.Navigation.CheckPointAgainstBlockedDirection(point)) return false;
            }

            //Create Vector3
            Vector3 pointVectorReturn = (Vector3)point;
            Vector3 pointVector = pointVectorReturn;
            Vector3 botcurpos = FunkyGame.Hero.Position;

            //2D Obstacle Navigation Check
            bool ZCheck = false;
            if (this.AreaIsFlat)
            {
                if (flags.HasFlag(PointCheckingFlags.ObstacleOverlap))
                {
                    if (ObjectCache.Obstacles.Values.OfType<CacheServerObject>().Any(obj => ObjectCache.CheckFlag(ObstacleType.Navigation, obj.Obstacletype.Value) && obj.PointInside(point))) return false;
                }

                if (flags.HasFlag(PointCheckingFlags.ObstacleIntersection))
                {
                    if (ObjectCache.Obstacles.Values.OfType<CacheServerObject>().Any(obj => ObjectCache.CheckFlag(ObstacleType.Navigation, obj.Obstacletype.Value) && obj.TestIntersection(botcurpos, point))) return false;
                }

                ZCheck = true;
            }

            //Check if we already within this "point".
            if (botcurpos.Distance2D(pointVector) < 2.5f) return false;

            //3D Obstacle Navigation Check
            if (!ZCheck)
            {
                //Because Z Variance we need to check if we can raycast walk to the location.
                if (!Navigation.CanRayCast(botcurpos, pointVector)) return false;
                if (!Navigation.MGP.CanStandAt(pointVector)) return false;

                if (flags.HasFlag(PointCheckingFlags.ObstacleOverlap))
                {
                    if (ObjectCache.Obstacles.Values.OfType<CacheServerObject>().Any(obj => ObjectCache.CheckFlag(ObstacleType.Navigation, obj.Obstacletype.Value) && obj.PointInside(pointVector))) return false;
                }
                if (flags.HasFlag(PointCheckingFlags.ObstacleIntersection))
                {
                    if (ObjectCache.Obstacles.Values.OfType<CacheServerObject>().Any(obj => ObjectCache.CheckFlag(ObstacleType.Navigation, obj.Obstacletype.Value) && obj.TestIntersection(botcurpos, pointVector))) return false;
                }
            }

            if (!Navigation.CheckVectorFlags(botcurpos, pointVector, flags)) return false;

            LastSafespotFound = pointVectorReturn;
            LastSafeGridPointFound = point.Clone();
            return true;
        }