This code works for me:
if (Owner)
{
TArray<AActor*> FoundActors;
UGameplayStatics::GetAllActorsOfClass(GetWorld(), APlayerStart::StaticClass(), FoundActors);
auto PlayerStart = Cast<APlayerStart>(FoundActors[0]);
auto PlayerController = Owner->GetController();
PlayerController->UnPossess();
auto PlayerClass = Owner->GetClass();
auto NewCharacter = GetWorld()->SpawnActor<AActor>(PlayerClass, PlayerStart->GetActorLocation(), PlayerStart->GetActorRotation());
if (NewCharacter)
{
auto CharacterToPossess = Cast<ACharacter>(NewCharacter);
if (CharacterToPossess)
{
PlayerController->Possess(CharacterToPossess);
Owner->Destroy();
}
}
}
But still interesting in the RestartPlayerAtPlayerStart() logic