Strange client replication jitter.

Hello everybody,

I’m running into an incredibly annoying issue that has me perplexed. The aim is to have my character follow the cursor and rotate around it and have this replicate for every player. It does this, however there seems to be a very strange location jitter on the client’s perspective. The rotation replicates just fine, however the location is what seems to jitter whilst it is moving. Here is my code, if anybody can point me in the direction of where/how to fix this it would be greatly appreciated!

void ASkyDiveCharacter::OnRep_PosChange()
{
	SetActorLocation(CurrentPosition);
}

void ASkyDiveCharacter::OnRep_RotChange()
{
	SetActorRotation(CurrentRotation);
}

void ASkyDiveCharacter::MoveForward(float Value)
{
	if (!Controller || Value == 0.0f) return;

	ASkyDivePlayerController* PlayerController = Cast<ASkyDivePlayerController>(GetController());
	if (PlayerController)
	{
		FVector mouseLocation, mouseDirection;
		PlayerController->DeprojectMousePositionToWorld(mouseLocation, mouseDirection);

		FVector EndLoc = mouseLocation + mouseDirection * 10000;

		FCollisionQueryParams Sky_TraceParams = FCollisionQueryParams(FName(TEXT("Sky_Trace")), true, this);
		Sky_TraceParams.bTraceComplex = true;
		Sky_TraceParams.bTraceAsyncScene = true;
		Sky_TraceParams.bReturnPhysicalMaterial = false;

		FHitResult RV_Hit(ForceInit);

		GetWorld()->LineTraceSingle(
			RV_Hit,
			mouseLocation,
			EndLoc,
			ECC_Visibility,
			Sky_TraceParams
			);

		if (Role != ROLE_Authority && IsLocallyControlled())
		{
				FVector RotVec(GetActorLocation() - RV_Hit.Location);
				float	BreakVecRot(FMath::RadiansToDegrees(FMath::Atan2(RotVec.Y, RotVec.Z)) * 1 - 90);

				FVector BreakVec(0, RV_Hit.Location.Y, RV_Hit.Location.Z);

				SetActorLocation(FMath::VInterpConstantTo(GetActorLocation(), BreakVec, Value * 260, 5));
				//SetActorRotation(FRotator(0, 0, BreakVecRot));

				SetActorRotation(FMath::RInterpTo(GetActorRotation(), FRotator(0, 0, BreakVecRot), Value * 3, 5));
		}

		if (Role < ROLE_Authority)
		{
				FVector RotVec(CurrentPosition - RV_Hit.Location);
				float	BreakVecRot(FMath::RadiansToDegrees(FMath::Atan2(RotVec.Y, RotVec.Z)) * 1 - 90);

				FVector BreakVec(0, RV_Hit.Location.Y, RV_Hit.Location.Z);

				ServerMoveForward(FMath::VInterpConstantTo(CurrentPosition, BreakVec, Value * 260, 5), FMath::RInterpTo(CurrentRotation, FRotator(0, 0, BreakVecRot), Value * 3, 5));
		}

	}
}

bool ASkyDiveCharacter::ServerMoveForward_Validate(FVector Location, FRotator Rotation)
{
	return true;
}

void ASkyDiveCharacter::ServerMoveForward_Implementation(FVector Location, FRotator Rotation)
{
	SetActorLocation(Location);
	CurrentPosition = GetActorLocation();

	SetActorRotation(Rotation);
	CurrentRotation = GetActorRotation();
}

void ASkyDiveCharacter::GetLifetimeReplicatedProps(TArray< FLifetimeProperty > & OutLifetimeProps) const
{
	Super::GetLifetimeReplicatedProps(OutLifetimeProps);

	DOREPLIFETIME(ASkyDiveCharacter, CurrentPosition);
	DOREPLIFETIME(ASkyDiveCharacter, CurrentRotation);

}