void ABaseVehicleAI::UpdateMovement() {
	float steering = CalculateSteering();
	float throttle = CalculateThrottle();
	GetVehicleMovementComponent()->SetSteeringInput(steering);
	GetVehicleMovementComponent()->SetThrottleInput(throttle);
	if(GetDistanceFromDestination() < 250) {
		GetVehicleMovementComponent()->SetHandbrakeInput(true);
		State = EVehicleMovementState::VMS_Stopping;
		OnMoveCompleted.Broadcast();
		State = EVehicleMovementState::VMS_Idle;
		UKismetSystemLibrary::K2_SetTimer(this, "UpdateMovement", 0.0, false);
	}
	else {
		State = EVehicleMovementState::VMS_Moving;
	}
}
tResult YawToSteer::OnPinEvent(IPin *pSource, tInt nEventCode, tInt nParam1, tInt nParam2, IMediaSample *pMediaSample)
{
    RETURN_IF_POINTER_NULL(pMediaSample);
    RETURN_IF_POINTER_NULL(pSource);
    RETURN_IF_POINTER_NULL(pMediaSample);

    if (nEventCode != IPinEventSink::PE_MediaSampleReceived)
    {
        RETURN_NOERROR;
    }

    logger.StartLog();

    if (pSource == &senderCarYawInPin)
    {
        GetSenderYaw(pMediaSample);
        // init senderYaw if necessary
        if (!isSenderYawInitialized)
        {
            oldSenderYaw = senderYaw;
            isSenderYawInitialized = tTrue;
        }

        deltaSenderYaw = CalcYawDelta(oldSenderYaw, senderYaw);

        if (deltaSenderYaw > abruptVariationThreshold)
        {
            isLocalYawInitialized = tFalse;
            isSenderYawInitialized = tFalse;
            targetLocalYaw = 0;
            RETURN_NOERROR;
        }
            // ignore yaw values if deviation compared to last value less than x (0.2)
        else if (abs(deltaSenderYaw) > 0.2)
        {

            targetLocalYaw += deltaSenderYaw;
        }
    }
    else if (pSource == &localCarYawInPin)
    {
        GetLocalYaw(pMediaSample);
        // init localYaw if necessary
        if (!isLocalYawInitialized && isSenderYawInitialized)
        {
            targetLocalYaw = localYaw;
            isLocalYawInitialized = tTrue;
        }
    }
    else if (pSource == &senderCarSpeedInPin)
    {
        senderSpeed = GetFloat(pMediaSample);
        directionCorrection = (senderSpeed > SPEED_STATIONARY) ? -1 : 1;
    }

    if (isSenderYawInitialized && isLocalYawInitialized)
    {
        CalculateSteering();
        TransmitSignalValue(&steerOutPin, steer);
    }
    else
    {
        steer = STEERING_STRAIGHT;
    }

    logger.Log(cString::Format("sendYaw %f |localY %f targetY %f steer %f | %f\n"
                                       "\tSpeed: %f; corr: %f",
                               senderYaw, localYaw, targetLocalYaw, steer,
                               CalcYawDelta(targetLocalYaw, localYaw), senderSpeed, directionCorrection).GetPtr());

    logger.EndLog();

    RETURN_NOERROR;
}