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); }
/// <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); }
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); }
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); }
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); }