public override ActionResult Execute( AI ai )
    {
        if (!MoveTargetVariable.IsValid || !MoveTargetVariable.IsVariable) {
            return ActionResult.FAILURE;
        }

        WaypointSet waypointSet = GetWaypointSetFromExpression( ai );
        if (waypointSet == null) {
            return ActionResult.FAILURE;
        }

        if (waypointSet != lastWaypointSet) {
            waypointArrivedAt = -1;
            lastWaypointSet = waypointSet;
        }

        if (waypointArrivedAt == -1) {
            waypointArrivedAt = waypointSet.GetClosestWaypointIndex( ai.Kinematic.Position );
            if (waypointArrivedAt < 0) {
                return ActionResult.FAILURE;
            }

            moveTarget.VectorTarget = waypointSet.Waypoints[ waypointArrivedAt ].position;
            moveTarget.CloseEnoughDistance = Mathf.Max( waypointSet.Waypoints[ waypointArrivedAt ].range, ai.Motor.CloseEnoughDistance );
            if (!ai.Motor.IsAt( moveTarget )) {
                ai.WorkingMemory.SetItem<MoveLookTarget>( MoveTargetVariable.VariableName, moveTarget );
                if (waypointVariable.IsValid && waypointVariable.IsVariable) {
                    ai.WorkingMemory.SetItem<Waypoint>( waypointVariable.VariableName, waypointSet.Waypoints[ waypointArrivedAt ] );
                }
                return ActionResult.SUCCESS;
            }
        }

        NavigationGraphNode tNode = waypointSet.Graph.GetNode( waypointArrivedAt );
        if (tNode.OutEdgeCount > 0) {
            List<int> tConnectedNodes = new List<int>( );
            for (int k = 0; k < tNode.OutEdgeCount; k++) {
                int tIndex = ((VectorPathNode)tNode.EdgeOut( k ).ToNode).NodeIndex;
                if ((tIndex != previousWaypoint) && (!tConnectedNodes.Contains( tIndex )))
                    tConnectedNodes.Add( tIndex );
            }
            if (tConnectedNodes.Count == 0) {
                previousWaypoint = waypointArrivedAt;
                waypointArrivedAt = ((VectorPathNode)tNode.EdgeOut( 0 ).ToNode).NodeIndex;
            } else {
                previousWaypoint = waypointArrivedAt;
                waypointArrivedAt = tConnectedNodes[ UnityEngine.Random.Range( 0, tConnectedNodes.Count ) ];
            }
        }
        moveTarget.VectorTarget = waypointSet.Waypoints[ waypointArrivedAt ].position;
        moveTarget.CloseEnoughDistance = Mathf.Max( waypointSet.Waypoints[ waypointArrivedAt ].range, ai.Motor.CloseEnoughDistance );
        ai.WorkingMemory.SetItem<MoveLookTarget>( MoveTargetVariable.VariableName, moveTarget );
        if (waypointVariable.IsValid && waypointVariable.IsVariable) {
            ai.WorkingMemory.SetItem<Waypoint>( waypointVariable.VariableName, waypointSet.Waypoints[ waypointArrivedAt ] );
        }

        return ActionResult.SUCCESS;
    }
    public override ActionResult Execute(AI ai)
    {
        count += 0.5f;
        bool isNear = false;
        if (ai.Motor.IsAt(moveTarget)){
            isNear = true;
        }
        if ((moveTarget.VectorTarget == Vector3.zero) || isNear) {
            isNear = false;
            if (!MoveTargetVariable.IsValid || !MoveTargetVariable.IsVariable)
                return ActionResult.FAILURE;

            WaypointSet waypointSet = GetWaypointSetFromExpression(ai);
            if (waypointSet == null)
                return ActionResult.FAILURE;

            if (waypointSet != lastWaypointSet)
            {
                lastWaypoint = -1;
                lastWaypointSet = waypointSet;
            }

            if (lastWaypoint == -1)
            {
                lastWaypoint = waypointSet.GetClosestWaypointIndex(ai.Kinematic.Position);
                if (lastWaypoint < 0)
                    return ActionResult.FAILURE;

                moveTarget.VectorTarget = waypointSet.Waypoints[lastWaypoint].position;
                moveTarget.CloseEnoughDistance = Mathf.Max(waypointSet.Waypoints[lastWaypoint].range, ai.Motor.CloseEnoughDistance);
        //				if (!ai.Motor.IsAt(moveTarget))
        //				{
        //					ai.WorkingMemory.SetItem<MoveLookTarget>(MoveTargetVariable.VariableName, moveTarget);
        //					return ActionResult.SUCCESS;
        //				}
            }

            //**REMOVED EXTRA LINE HERE
            NavigationGraphNode tNode = waypointSet.Graph.GetNode(lastWaypoint);
            if (tNode.OutEdgeCount > 0)
            {
                int tRandomEdge = UnityEngine.Random.Range(0, tNode.OutEdgeCount); //**FIXED THIS LINE
                lastWaypoint = ((VectorPathNode)tNode.EdgeOut(tRandomEdge).ToNode).NodeIndex;
            }
            moveTarget.VectorTarget = waypointSet.Waypoints[lastWaypoint].position;
            moveTarget.CloseEnoughDistance = Mathf.Max(waypointSet.Waypoints[lastWaypoint].range, ai.Motor.CloseEnoughDistance);
        }
        ai.WorkingMemory.SetItem<MoveLookTarget>(MoveTargetVariable.VariableName, moveTarget);
        if(count > 1000f)
        {
            ai.WorkingMemory.SetItem("isSearching", false);
            count = 0;
            return ActionResult.FAILURE;
        }
        return ActionResult.SUCCESS;
    }