Multiplayer - Moving Character on Client with SimpleMoveToLocation moves oodly

My Character on the Client doesn’t seem to move as it would on the Server. It seems to itch slowly towards the location set by SimpleMoveToLocation function, without rotating or animating (except for idle animation).

On the Server, the Character behaves normally, and the only saving grace is that the client character rotates on the Server but still moves extremely slow similarly to the client.

void ACppPlayerController::Server_Move_Implementation(FVector Location)
{
    // testing to see if its properly calling the server
    // seems irrelevant to the issue 
    if (HasAuthority())
    {
       UNavigationSystemV1* NavSys = FNavigationSystem::GetCurrent<UNavigationSystemV1>(GetWorld());
       if (!ChampionPawn)
       {
          GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("ChampionPawn is null"));
          return;
       }
       if (!NavSys)
       {
          GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("NavSys is null"));
          return;
       }
       if (!PathFollowingComponent)
       {
          GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("PathFollowComp is null"));
          return;
       }
       const FNavAgentProperties& NavAgentProps = ChampionPawn->GetNavAgentPropertiesRef();
       FNavLocation NavLoc;
       FSharedConstNavQueryFilter QueryFilter;
       for (int i = 1; i < 30; i++)
       {
          float a = 10;  
          FVector QExtent = FVector(a*i, a*i, 1000.f);
          if (NavSys->ProjectPointToNavigation(Location, NavLoc, QExtent, &NavAgentProps, QueryFilter))
          {
             float FvDistance = UKismetMathLibrary::Vector_Distance(Location, ChampionPawn->GetActorLocation());

              // rotates the character at a faster rate for smoother movement
              // if the location is close by a certain threshold (150.f for now)
             if (FvDistance < 150.f)
             {
                bMoveToAcquiredLocShort = true;
             
                // rotate the character towards location
                FVector PawnLoc = FVector (ChampionPawn->GetActorLocation().X, ChampionPawn->GetActorLocation().Y, 0.f);
                FVector AcquiredLoc = FVector(Location.X, Location.Y, 0.f);
                FRotator PawnRot = UKismetMathLibrary::FindLookAtRotation(PawnLoc, AcquiredLoc);
             
                TargetPawnRotation = PawnRot;
                                  
             }
             bMoveToAcquiredLocShort = false;
            
            // the final move command
             UAIBlueprintHelperLibrary::SimpleMoveToLocation(this, NavLoc.Location);
             
             // spawn the FX on the clicked location
             Multicast_SpawnFC(Location);
             break;
          }
       }
    }
}

The setup includes a PlayerController that has a Right-Click input that samples the registered location of the linetrace from the mouse. It calls a RequestMove() function that checks Authority, implementing the logic SimpleMoveToLocation logic or calling the RPC function Sever_Move() to do the same
(The logic of which I have provided above)

It looks like the character class is using Character Movement Component (CMC).

CMC utilizes Client-side Movement Prediction which requires the Autonomous Proxy to apply its own movement, then replicate the move commands to the server.

Keeping with that you’d use SimpleMoveToLocation on the local client, then RPC the server to Apply it.

Client first, Server second

SimpleMoveToLocation is not replicated, it drives its own CharacterMovement + PathFollowingComponent on the machine that calls it.

your Server_Move runs on server so only the server pawn actually pathfinds. the client pawn crawls because it has no path, just replication smoothing. instead call the move on the owning client too, or drive movement with replicated input rather than pathfinding on server.

common pattern: client requests Server_Move with target, server validates and then multicasts or client also calls SimpleMoveToLocation locally if it has authority over its own controller. also make sure bReplicates on the pawn and movement replication is on, otherwise rotation wont replicate either.