Exemplo n.º 1
0
        public bool IsMovingAway(AITunnel ActiveTunnel)
        {
            float Min, Max;

            PolygonMesh.ProjectPolygon(ActiveTunnel.Right, ActiveTunnel.CollisionBox, out Min, out Max);

            float FinalPosition    = Vector3.Dot(ActiveTunnel.Right, Position);
            float RelativePosition = 0;

            //On the Right
            if (FinalPosition < Min && FinalPosition < Max)
            {
                RelativePosition = 1;
            }
            //On the Left
            else if (FinalPosition > Min && FinalPosition > Max)
            {
                RelativePosition = -1;
            }

            float DirectionFromTunnel = GetDirectionFromInsideTunnel(ActiveTunnel);

            if (RelativePosition != 0 && DirectionFromTunnel != 0 && DirectionFromTunnel != RelativePosition)
            {
                return(true);
            }

            return(false);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Used for edge cases when moving from one tunnel to another and going out of bound when turning.
        /// </summary>
        /// <returns></returns>
        public bool IsInFrontOfTunnel()
        {
            float MinTunnel, MaxTunnel;

            PolygonMesh.ProjectPolygon(CurrentAITunnel.Forward, CurrentAITunnel.CollisionBox, out MinTunnel, out MaxTunnel);
            float MinPlayer, MaxPlayer;

            PolygonMesh.ProjectPolygon(CurrentAITunnel.Forward, CollisionBox, out MinPlayer, out MaxPlayer);

            return(MinPlayer > MaxTunnel);
        }
Exemplo n.º 3
0
        public float GetDirectionFromOutsideTunnel(AITunnel ActiveTunnel)
        {
            float MinTunnel, MaxTunnel;

            PolygonMesh.ProjectPolygon(Right, ActiveTunnel.CollisionBox, out MinTunnel, out MaxTunnel);
            float FinalPlayerPosition = Vector3.Dot(Right, Position);

            if (MinTunnel < FinalPlayerPosition && MaxTunnel < FinalPlayerPosition)
            {
                return(-1);
            }
            if (MinTunnel > FinalPlayerPosition && MaxTunnel > FinalPlayerPosition)
            {
                return(1);
            }

            return(0);
        }
Exemplo n.º 4
0
        public float GetDirectionFromOutsideTunnel(Vector3 PlayerRight, Vector3 PlayerPosition, PolygonMesh Tunnel)
        {
            float MinTunnel, MaxTunnel;

            PolygonMesh.ProjectPolygon(PlayerRight, Tunnel, out MinTunnel, out MaxTunnel);
            float FinalPlayerPosition = Vector3.Dot(PlayerRight, PlayerPosition);

            if (MinTunnel < FinalPlayerPosition && MaxTunnel < FinalPlayerPosition)
            {
                return(-1);
            }
            if (MinTunnel > FinalPlayerPosition && MaxTunnel > FinalPlayerPosition)
            {
                return(1);
            }

            return(0);
        }
Exemplo n.º 5
0
        public float GetHorizontalDistanceToAITunnel(AITunnel ActiveTunnel)
        {
            if (IsMovingAway(ActiveTunnel))
            {
                return(GetDirectionFromInsideTunnel(ActiveTunnel));
            }

            float Min, Max;

            PolygonMesh.ProjectPolygon(Right, ActiveTunnel.CollisionBox, out Min, out Max);

            float FinalPosition = Vector3.Dot(Right, Position);

            if (FinalPosition < Min && FinalPosition < Max)
            {
                return(-1);
            }
            else if (FinalPosition > Min && FinalPosition > Max)
            {
                return(1);
            }
            //Inside Tunnel
            else if (FinalPosition > Min && FinalPosition < Max)
            {
                return(GetHorizontalDistanceToExitPointOfAITunnel(ActiveTunnel));
            }

            //if perpendicular
            float a = Vector3.Dot(ActiveTunnel.Forward, Right);

            if (a == 0)
            {
                return(-1);
            }

            return(0);
        }