x

Search in
Sort by:

Question Status:

Search help

  • Simple searches use one or more words. Separate the words with spaces (cat dog) to search cat,dog or both. Separate the words with plus signs (cat +dog) to search for items that may contain cat but must contain dog.
  • You can further refine your search on the search results page, where you can search by keywords, author, topic. These can be combined with each other. Examples
    • cat dog --matches anything with cat,dog or both
    • cat +dog --searches for cat +dog where dog is a mandatory term
    • cat -dog -- searches for cat excluding any result containing dog
    • [cats] —will restrict your search to results with topic named "cats"
    • [cats] [dogs] —will restrict your search to results with both topics, "cats", and "dogs"

Movement of an ACharacter not replicated in multi-players

I'm facing a problem with replicating the movement of a player's drone.

The logic of the player's drone is working in single game mode, but in multi-player mode the movement is not replicated.

The drone is a ACharacter type. Header file: /** @brief AKDroneCharacter is owned by a player character. The drone has a camera and is guided by the player. */ UCLASS() class KSGM_API AKDroneCharacter : public ACharacter { GENERATED_UCLASS_BODY()

 public:
     virtual void PostInitializeComponents() override;
 
     virtual void PossessedBy(AController* NewController) override;
     virtual void UnPossessed() override;
     virtual void Restart() override;
 
     /** cleanup */
     virtual void Destroyed() override;
 
     UFUNCTION(BlueprintCallable, Category = Team)
     virtual FLinearColor GetTeamColor() const;
 
     virtual void NotifyTeamChanged();
     virtual void PlayerChangedTeam();
 
     /** Returns the master controller for this actor. */
     UFUNCTION(BlueprintCallable, Category = Pawn)
     class AKPlayerController* GetMasterController() const;
 
     /** Called when Master Controller is replicated */
     UFUNCTION()
     virtual void OnRep_MasterController();
 
     /**
     <summary>The basic attributes of the character</summary>
     */
     UPROPERTY(EditAnywhere, BlueprintReadWrite, Replicated, Category = "DefaultAttributes")
     FKBasicAttributeStruct BasicAttributes;
 
     /**
     <summary>The computed basic attributes of the character</summary>
     */
     UPROPERTY(EditAnywhere, BlueprintReadWrite, Replicated, Category = "ComputedAttributes")
     FKBasicAttributeStruct ComputedBasicAttributes;
 
     /** Controller currently mastering this Actor */
     UPROPERTY(replicatedUsing = OnRep_MasterController)
     class AKPlayerController* MasterController;
 
 ….
 }
 

Source file: AKDroneCharacter::AKDroneCharacter(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { // The default basic attributes for this drone BasicAttributes.Defaults();

     bWantsToRun = false;
     bIsDying = false;
     GetMesh()->bReceivesDecals = false;
     GetMesh()->SetCollisionObjectType(ECC_Pawn);
     GetMesh()->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);
     GetMesh()->SetCollisionResponseToChannel(COLLISION_WEAPON, ECR_Block);
     GetMesh()->SetCollisionResponseToChannel(COLLISION_PROJECTILE, ECR_Block);
     GetMesh()->SetCollisionResponseToChannel(COLLISION_SPELL, ECR_Ignore);
     GetMesh()->SetCollisionResponseToChannel(ECC_Visibility, ECR_Block);
     GetMesh()->SetEnableGravity(false);
 
     GetCapsuleComponent()->SetCollisionResponseToChannel(ECC_Camera, ECR_Ignore);
     GetCapsuleComponent()->SetCollisionResponseToChannel(COLLISION_PROJECTILE, ECR_Block);
     GetCapsuleComponent()->SetCollisionResponseToChannel(COLLISION_SPELL, ECR_Ignore);
     GetCapsuleComponent()->SetCollisionResponseToChannel(COLLISION_WEAPON, ECR_Ignore);
     GetCapsuleComponent()->SetEnableGravity(false);
 
     // This is a flying character
     GetCharacterMovement()->bOrientRotationToMovement = false;
     GetCharacterMovement()->bUseControllerDesiredRotation = true;
     //GetCharacterMovement()->bRunPhysicsWithNoController = true;
     GetCharacterMovement()->SetMovementMode(EMovementMode::MOVE_Flying);
     GetCharacterMovement()->DefaultLandMovementMode = EMovementMode::MOVE_Flying;
     GetCharacterMovement()->DefaultWaterMovementMode = EMovementMode::MOVE_Flying;
 
     // set our turn rates for input
     BaseTurnRate = 45.f;
     BaseLookUpRate = 45.f;
 
     SetReplicates(true);
     SetReplicateMovement(true);
     bAlwaysRelevant = true;
 
     PrimaryActorTick.bCanEverTick = true;
     PrimaryActorTick.TickGroup = TG_PrePhysics;
     //SetRemoteRoleForBackwardsCompat(ROLE_SimulatedProxy);
     PrimaryActorTick.bStartWithTickEnabled = true;
     PrimaryActorTick.bAllowTickOnDedicatedServer = true;
 
 }
 
 /*
  * Replication
  * 
  */
 void AKDroneCharacter::PreReplication(IRepChangedPropertyTracker & ChangedPropertyTracker)
 {
     Super::PreReplication(ChangedPropertyTracker);
 
     // Only replicate this property for a short duration after it changes so join in progress players don't get spammed with fx when joining late
     DOREPLIFETIME_ACTIVE_OVERRIDE(AKDroneCharacter, LastTakeHitInfo, GetWorld() && GetWorld()->GetTimeSeconds() < LastTakeHitTimeTimeout);
 }
 
 void AKDroneCharacter::GetLifetimeReplicatedProps(TArray< FLifetimeProperty > & OutLifetimeProps) const
 {
     Super::GetLifetimeReplicatedProps(OutLifetimeProps);
 
     // everyone except local owner: flag change is locally instigated
     DOREPLIFETIME_CONDITION(AKDroneCharacter, bWantsToRun, COND_SkipOwner);
 
     DOREPLIFETIME_CONDITION(AKDroneCharacter, LastTakeHitInfo, COND_Custom);
 
     // everyone
     DOREPLIFETIME_CONDITION(AKDroneCharacter, BasicAttributes, COND_None);
     DOREPLIFETIME_CONDITION(AKDroneCharacter, ComputedBasicAttributes, COND_None);
 }
 
 void AKDroneCharacter::PostInitializeComponents()
 {
     Super::PostInitializeComponents();
 
     UE_LOG(LogDebug, Verbose, TEXT("AKDroneCharacter::PostInitializeComponents  -  Role=%s   IsLocallyControlled=%i   Actor=%s"), NETROLETOSTRING(Role), IsLocallyControlled(), *GetName());
 
     // Copy basic attributes to computed attributes
     ComputedBasicAttributes = BasicAttributes;
 
     // play respawn effects
     if (GetNetMode() != NM_DedicatedServer)
     {
         if (RespawnFX)
         {
             UGameplayStatics::SpawnEmitterAtLocation(this, RespawnFX, GetActorLocation(), GetActorRotation());
         }
 
         if (RespawnSound)
         {
             UGameplayStatics::PlaySoundAtLocation(this, RespawnSound, GetActorLocation());
         }
     }
 }
 
 void AKDroneCharacter::Destroyed()
 {
     AKDroneCharacterController* PC = Cast<AKDroneCharacterController>(Controller);
     UE_LOG(LogDebug, Verbose, TEXT("AKDroneCharacter::Destroyed  -  Role=%s   IsLocallyControlled=%i   Actor=%s  Controller=%s"), NETROLETOSTRING(Role), IsLocallyControlled(), *GetNameSafe(this), (PC) ? *GetNameSafe(PC) : TEXT("None"));
 
     Super::Destroyed();
 }
 
 void AKDroneCharacter::PossessedBy(AController* NewController)
 {
     UE_LOG(LogDebug, Verbose, TEXT("AKDroneCharacter::PossessedBy  -  this=%s  NewController=%s"), *GetNameSafe(this), *GetNameSafe(NewController));
 
     SetOwner(NewController);
 
     Super::PossessedBy(NewController);
 
 
     AKDroneCharacterController* PC = Cast<AKDroneCharacterController>(Controller);
     if (PC != nullptr)
     {
         PC->SetPawn(this);
     }
 }
 
 void AKDroneCharacter::UnPossessed()
 {
     UE_LOG(LogDebug, Verbose, TEXT("AKDroneCharacter::UnPossessed  -  Role=%s   IsLocallyControlled=%i   Actor=%s"), NETROLETOSTRING(Role), IsLocallyControlled(), *GetName());
     Super::UnPossessed();
 }
 
 void AKDroneCharacter::Restart()
 {
     UE_LOG(LogDebug, Verbose, TEXT("AKDroneCharacter::Restart  -  Role=%s   IsLocallyControlled=%i   Actor=%s"), NETROLETOSTRING(Role), IsLocallyControlled(), *GetName());
     Super::Restart();
     ClearJumpInput();
 
 }
 void AKDroneCharacter::DroneTurnAtRate(float Rate)
 {
     if ((Controller != NULL) && (Rate != 0.0f))
     {
         // calculate delta for this frame from the rate information
         const FRotator Rotation = Controller->GetControlRotation();
         Controller->SetControlRotation(FRotator(Rotation.Pitch, Rotation.Yaw + ( Rate * BaseTurnRate * GetWorld()->GetDeltaSeconds() ), Rotation.Roll));
 
     }
 }
 
 void AKDroneCharacter::DroneMoveRight(float Value)
 {
     UE_LOG(LogDebug, VeryVerbose, TEXT("AKDroneCharacter::DroneMoveRight  -  Value=%f"), Value);
     if ((Controller != nullptr) && (Value != 0.0f))
     {
         // find out which way is right
         const FRotator Rotation = Controller->GetControlRotation();
         const FRotator YawRotation(0, Rotation.Yaw, 0);
 
         // get right vector 
         const FVector Direction = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);
         // add movement in that direction
         AddMovementInput(Direction, Value);
     }
 }
 
 void AKDroneCharacter::DroneMoveUp(float Value)
 {
     UE_LOG(LogDebug, VeryVerbose, TEXT("AKDroneCharacter::DroneMoveUp  -  Value=%f"), Value);
     if ((Controller != NULL) && (Value != 0.0f))
     {
         // find out which way is right
         const FRotator Rotation = Controller->GetControlRotation();
         const FRotator YawRotation(0, Rotation.Yaw, 0);
 
         // get right vector 
         const FVector Direction = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Z);
         // add movement in that direction
         AddMovementInput(Direction, Value);
     }
 }
 
 

The drone's controller is very simple. Header file:

 UCLASS(config = Game)
 class KSGM_API AKDroneCharacterController : public AController
 {
     GENERATED_UCLASS_BODY()
 
     // Begin AController interface
     virtual void GameHasEnded(class AActor* EndGameFocus = NULL, bool bIsWinner = false) override;
     virtual void Possess(class APawn* InPawn) override;
     virtual void BeginInactiveState() override;
     virtual void OnRep_Pawn();
     virtual void SetPawn(APawn* InPawn);
     // End APlayerController interface
 
 };

Source files:

 AKDroneCharacterController::AKDroneCharacterController(const FObjectInitializer& ObjectInitializer)
     : Super(ObjectInitializer)
 {
 }
 
 
 void AKDroneCharacterController::SetPawn(APawn* InPawn)
 {
     UE_LOG(LogOnline, Log, TEXT("AKDroneCharacterController::SetPawn   this=%s    Role=%s   IsLocalController()=%i   InPawn=%s"), *GetNameSafe(this), NETROLETOSTRING(Role), IsLocalController(), *GetNameSafe(InPawn));
 
     Super::SetPawn(InPawn);
 }
 
 void AKDroneCharacterController::OnRep_Pawn()
 {
     UE_LOG(LogOnline, Log, TEXT("AKDroneCharacterController::OnRep_Pawn  -  this=%s    GetPawn()=%s"), *GetNameSafe(this), *GetNameSafe(GetPawn()));
     Super::OnRep_Pawn();
 }
 
 void AKDroneCharacterController::Possess(APawn* InPawn)
 {
     UE_LOG(LogOnline, Log, TEXT("AKDroneCharacterController::Possess  -  this=%s    InPawn()=%s"), *GetNameSafe(this), *GetNameSafe(InPawn));
 
     Super::Possess(InPawn);
 }
 
 void AKDroneCharacterController::BeginInactiveState()
 {
     Super::BeginInactiveState();
 
     AGameState* GameState = GetWorld()->GetGameState<AGameState>();
 
 }
 
 void AKDroneCharacterController::GameHasEnded(AActor* EndGameFocus, bool bIsWinner)
 {
     // Stop any movement we already have
     StopMovement();
 }
 
 

The player owns the drone. The drone is created when the player's character is created. No problem with the player's character. Perfectly replicated.

The player's character is also a ACharacter type. The move of the player's drone is done by the player's character and not the drone itself. This is working in single player mode.

Source file:

 AKPlayerCharacter::AKPlayerCharacter(const FObjectInitializer& ObjectInitializer)
     : Super(ObjectInitializer)
 {
     // Create the automatic collection sphere for automatic collectable objects
     AutomaticCollectionSphere = ObjectInitializer.CreateDefaultSubobject<USphereComponent>(this, TEXT("AutomaticCollectionSphere"));
     AutomaticCollectionSphere->AttachToComponent(RootComponent, FAttachmentTransformRules::KeepRelativeTransform);
     // Set the radius for the collection sphere
     AutomaticCollectionRadius = 200.f;
     AutomaticCollectionSphere->SetSphereRadius(AutomaticCollectionRadius);
     AutomaticCollectionSphere->OnComponentBeginOverlap.AddDynamic(this, &AKPlayerCharacter::OnBeginOverlapAutomaticCollectionSphere);
     // Set the channel responses
     AutomaticCollectionSphere->SetCollisionResponseToChannel(COLLISION_PROJECTILE, ECR_Ignore);
     AutomaticCollectionSphere->SetCollisionResponseToChannel(COLLISION_SPELL, ECR_Ignore);
     AutomaticCollectionSphere->SetCollisionResponseToChannel(COLLISION_WEAPON, ECR_Ignore);
     // We want to generate an overlap event for guided actors
     AutomaticCollectionSphere->SetCollisionResponseToChannel(COLLISION_GUIDED, ECR_Overlap);
 
     // Create the detection pickup box for pickup collectable objects
     DetectionPickupBox = ObjectInitializer.CreateDefaultSubobject<UBoxComponent>(this, TEXT("DetectionPickupBox"));
     DetectionPickupBox->AttachToComponent(RootComponent, FAttachmentTransformRules::KeepRelativeTransform);
     // Set the box extent for the pickup box
     DetectionBoxExtent.X = 110.0f;
     DetectionBoxExtent.Y = 50.0f;
     DetectionBoxExtent.Z = 100.0f;
     DetectionPickupBox->SetBoxExtent(DetectionBoxExtent);
     DetectionPickupBox->OnComponentBeginOverlap.AddDynamic(this, &AKPlayerCharacter::OnBeginOverlapDetectionPickupBox);
     DetectionPickupBox->OnComponentEndOverlap.AddDynamic(this, &AKPlayerCharacter::OnEndOverlapDetectionPickupBox);
     // Set the channel responses
     DetectionPickupBox->SetCollisionResponseToChannel(COLLISION_PROJECTILE, ECR_Ignore);
     DetectionPickupBox->SetCollisionResponseToChannel(COLLISION_SPELL, ECR_Ignore);
     DetectionPickupBox->SetCollisionResponseToChannel(COLLISION_WEAPON, ECR_Ignore);
     DetectionPickupBox->SetCollisionResponseToChannel(COLLISION_GUIDED, ECR_Ignore);
 
     // Set size for collision capsule
     GetCapsuleComponent()->InitCapsuleSize(42.f, 96.0f);
 
     // set our turn rates for input
     BaseTurnRate = 45.f;
     BaseLookUpRate = 45.f;
 
     // Don't rotate when the controller rotates. Let that just affect the camera.
     bUseControllerRotationPitch = false;
     bUseControllerRotationYaw = false;
     bUseControllerRotationRoll = false;
 
     // Configure character movement
     GetCharacterMovement()->bOrientRotationToMovement = true; // Character moves in the direction of input...    
     GetCharacterMovement()->RotationRate = FRotator(0.0f, 540.0f, 0.0f); // ...at this rotation rate
     GetCharacterMovement()->JumpZVelocity = 600.f;
     GetCharacterMovement()->AirControl = 0.2f;
 
     // Create a camera boom (pulls in towards the player if there is a collision)
     CameraBoom = ObjectInitializer.CreateDefaultSubobject<USpringArmComponent>(this, TEXT("CameraBoom"));
     CameraBoom->AttachToComponent(RootComponent, FAttachmentTransformRules::KeepRelativeTransform);
     CameraBoom->TargetArmLength = 300.0f; // The camera follows at this distance behind the character    
     CameraBoom->bUsePawnControlRotation = true; // Rotate the arm based on the controller
     CameraBoom->SetRelativeRotation(FRotator(0.0f, 0.0f, 0.0f));
 
     // Create a follow camera
     FollowCamera = ObjectInitializer.CreateDefaultSubobject<UCameraComponent>(this, TEXT("FollowCamera"));
     FollowCamera->AttachToComponent(CameraBoom, FAttachmentTransformRules::KeepRelativeTransform, USpringArmComponent::SocketName); // Attach the camera to the end of the boom and let the boom adjust to match the controller orientation
     FollowCamera->bUsePawnControlRotation = true; // Rotate the arm based on the controller
 
     // The current camera offset (Up/Down) in third person
     CameraBoomOffsetZ = 0.0f;
     // These values are in DefaultGame.ini
     CameraBoomUpDownIncrement = 25.0f;
     CameraBoomMinOffsetZ = 100.0f;
     CameraBoomMaxOffsetZ = 300.0f;
     CameraBoomTargetArmLengthMax = 500.0f;
 
 
     // Create a camera boom (pulls in towards the player if there is a collision)
     FrontCameraBoom = ObjectInitializer.CreateDefaultSubobject<USpringArmComponent>(this, TEXT("FrontCameraBoom"));
     FrontCameraBoom->AttachToComponent(RootComponent, FAttachmentTransformRules::KeepRelativeTransform);
     FrontCameraBoom->TargetArmLength = 200.0f; // The camera follows at this distance behind the character    
     FrontCameraBoom->bUsePawnControlRotation = false; // Rotate the arm based on the controller
     FrontCameraBoom->SetRelativeRotation(FRotator(0.0f, 180.0f, 0.0f));
 
     // Create a follow camera
     FrontCamera = ObjectInitializer.CreateDefaultSubobject<UCameraComponent>(this, TEXT("FrontCamera"));
     FrontCamera->AttachToComponent(FrontCameraBoom, FAttachmentTransformRules::KeepRelativeTransform, USpringArmComponent::SocketName); // Attach the camera to the end of the boom and let the boom adjust to match the controller orientation
     FrontCamera->bUsePawnControlRotation = false; // Rotate the arm based on the controller
     FrontCamera->Deactivate();
     IsFrontCameraActive = false;
 
     TargetTempSpeedFactor = InitialTempSpeedFactor = 0.0f;
     InitialEnergyLevel = IncEnergyLevel = 0.0f;
     InitialPowerLevel = IncPowerLevel = 0.0f;
 
     LeftPreviousClickedWeaponIndex = -1;
     RightPreviousClickedWeaponIndex = -1;
 
     SpawnedDrone = nullptr;
 }
 
 
 void AKPlayerCharacter::GetLifetimeReplicatedProps(TArray< FLifetimeProperty > & OutLifetimeProps) const
 {
     Super::GetLifetimeReplicatedProps(OutLifetimeProps);
 
     DOREPLIFETIME(AKPlayerCharacter, SpawnedDrone);
 }
 
 void AKPlayerCharacter::PostInitializeComponents()
 {
     Super::PostInitializeComponents();
 }
 
 //////////////////////////////////////////////////////////////////////////
 // Input
 
 void AKPlayerCharacter::SetupPlayerInputComponent(class UInputComponent* InInputComponent)
 {
     // Set up gameplay key bindings
     check(InInputComponent);
 
 
     InInputComponent->BindAxis("MoveForward", this, &AKPlayerCharacter::MoveForward);
     InInputComponent->BindAxis("MoveRight", this, &AKPlayerCharacter::MoveRight);
 
     InInputComponent->BindAxis("DroneMoveForward", this, &AKPlayerCharacter::DroneMoveForward);
     InInputComponent->BindAxis("DroneMoveRight", this, &AKPlayerCharacter::DroneMoveRight);
     InInputComponent->BindAxis("DroneTurnAtRate", this, &AKPlayerCharacter::DroneTurnAtRate);
     InInputComponent->BindAxis("DroneMoveUp", this, &AKPlayerCharacter::DroneMoveUp);
 …..
 }
 
 void AKPlayerCharacter::Restart()
 {
     UE_LOG(LogDebug, Verbose, TEXT("AKPlayerCharacter::Restart  -  Role=%s   IsLocallyControlled=%i   Actor=%s"), NETROLETOSTRING(Role), IsLocallyControlled(), *GetName());
     Super::Restart();
     if (IsLocallyControlled())
     {
         // Create the drone when restarting the player character
         SpawnDrone();
     }
 }
 
 
 void AKPlayerCharacter::OnRep_SpawnedDrone()
 {
     UE_LOG(LogDebug, Verbose, TEXT("AKPlayerCharacter::OnRep_SpawnedDrone  -  Role=%s   IsLocallyControlled=%i   SpawnedDrone=%s"), NETROLETOSTRING(Role), IsLocallyControlled(), *GetNameSafe(SpawnedDrone));
 }
 
 void AKPlayerCharacter::SpawnDrone()
 {
     UE_LOG(LogDebug, Verbose, TEXT("AKPlayerCharacter::SpawnDrone  -  Role=%s   IsLocallyControlled=%i"), NETROLETOSTRING(Role), IsLocallyControlled());
     // If we are on the server, spawn the drone locally
     if (Role == ROLE_Authority)
     {
         LocalSpawnDrone();
     }
     else
     {
         // If we are a client call the server function to stay in sync
         ServerSpawnDrone();
     }
 }
 
 bool AKPlayerCharacter::ServerSpawnDrone_Validate() { return true; }
 void AKPlayerCharacter::ServerSpawnDrone_Implementation()
 {
     UE_LOG(LogDebug, Verbose, TEXT("AKBaseCharacter::ServerSpawnDrone_Implementation  -  Role=%s   IsLocallyControlled=%i   Actor=%s"), NETROLETOSTRING(Role), IsLocallyControlled(), *GetName());
 
     LocalSpawnDrone();
 }
 
 void AKPlayerCharacter::LocalSpawnDrone()
 {
     UE_LOG(LogDebug, Verbose, TEXT("AKBaseCharacter::LocalSpawnDrone  -  Role=%s   IsLocallyControlled=%i"), NETROLETOSTRING(Role), IsLocallyControlled());
 
     // Do we have a Drone ?
     // For an actor only spawned on the server side
     // never on the client.
     UE_LOG(LogDebug, VeryVerbose, TEXT("AKPlayerCharacter::LocalSpawnDrone  -  Drone=%s"), *GetNameSafe(Drone));
     if (Role == ROLE_Authority && Drone)
     {
         // Destroy the drone first, if exists.
         DestroyDrone();
 
         FRotator actorRotation(GetActorRotation());
         FVector actorLocation(GetActorLocation() + actorRotation.Vector() * 200.0f);
         FTransform SpawnTransform(actorRotation, actorLocation);
         UE_LOG(LogDebug, VeryVerbose, TEXT("AKPlayerCharacter::LocalSpawnDrone  -  GetActorRotation=%s  GetActorLocation=%s"), *GetActorRotation().ToString(), *actorLocation.ToString());
 
         AKDroneCharacter* CreatedDrone = GetWorld()->SpawnActorDeferred<AKDroneCharacter>(Drone, SpawnTransform, this);
         if (CreatedDrone)
         {
             // Enable the collision
             CreatedDrone->SetActorEnableCollision(true);
             // Set the instigator
             CreatedDrone->Instigator = Instigator;
             // Set the our controller as a master
             CreatedDrone->MasterController = Cast<AKPlayerController>(Controller);
             UE_LOG(LogDebug, VeryVerbose, TEXT("AKPlayerCharacter::LocalSpawnDrone  -  CreatedDrone=%s   CreatedDrone->Instigator=%s   CreatedDrone->MasterController=%s"), *GetNameSafe(CreatedDrone), *GetNameSafe(CreatedDrone->Instigator), *GetNameSafe(CreatedDrone->MasterController));
 
             FActorSpawnParameters SpawnInfo;
             SpawnInfo.Instigator = CreatedDrone;
             SpawnInfo.ObjectFlags |= RF_Transient;    // We never want to save player controllers into a map
             AKDroneCharacterController* NewPC = GetWorld()->SpawnActor<AKDroneCharacterController>(AKDroneCharacterController::StaticClass(), actorLocation, actorRotation, SpawnInfo);
             if (NewPC)
             {
                 // Complete the spawing
                 UGameplayStatics::FinishSpawningActor(CreatedDrone, SpawnTransform);
                 NewPC->Possess(CreatedDrone);
                 // Assign it once created to avoid replication too soon
                 SpawnedDrone = CreatedDrone;
                 NewPC->SetPawnFromRep(SpawnedDrone);
             }
 
         }
 
     }
 }
 
 void AKPlayerCharacter::DestroyDrone()
 {
     UE_LOG(LogDebug, Verbose, TEXT("AKPlayerCharacter::DestroyDrone  -  Role=%s    Actor=%s    SpawnedDrone=%s   IsLocallyControlled=%i"), NETROLETOSTRING(Role), *GetName(), *GetNameSafe(SpawnedDrone), IsLocallyControlled());
     // If we are not on the server, do nothing
     if (Role < ROLE_Authority)
     {
         return;
     }
     if (SpawnedDrone)
     {
         SpawnedDrone->Destroy();
         SpawnedDrone = nullptr;
     }
 }
 
 void AKPlayerCharacter::DroneMoveForward(float Value)
 {
     if ((SpawnedDrone != nullptr) && (Value != 0.0f))
     {
         UE_LOG(LogDebug, VeryVerbose, TEXT("AKPlayerCharacter::DroneMoveForward  -  Value=%f   SpawnedDrone=%s"), Value, *GetNameSafe(SpawnedDrone));
         SpawnedDrone->DroneMoveForward(Value);
     }
 }
 
 
 void AKPlayerCharacter::DroneTurnAtRate(float Rate)
 {
     if ((SpawnedDrone != NULL) && (Rate != 0.0f))
     {
         UE_LOG(LogDebug, VeryVerbose, TEXT("AKPlayerCharacter::DroneTurnAtRate  -  Rate=%f   SpawnedDrone=%s"), Rate, *GetNameSafe(SpawnedDrone));
         SpawnedDrone->DroneTurnAtRate(Rate);
     }
 }
 
 void AKPlayerCharacter::DroneMoveRight(float Value)
 {
     if ((SpawnedDrone != nullptr) && (Value != 0.0f))
     {
         UE_LOG(LogDebug, VeryVerbose, TEXT("AKPlayerCharacter::DroneMoveRight  -  Value=%f   SpawnedDrone=%s"), Value, *GetNameSafe(SpawnedDrone));
         SpawnedDrone->DroneMoveRight(Value);
     }
 }
 
 void AKPlayerCharacter::DroneMoveUp(float Value)
 {
     if (SpawnedDrone != nullptr && (Value != 0.0f))
     {
         UE_LOG(LogDebug, VeryVerbose, TEXT("AKPlayerCharacter::DroneMoveUp  -  Value=%f   SpawnedDrone=%s"), Value, *GetNameSafe(SpawnedDrone));
         SpawnedDrone->DroneMoveUp(Value);
     }
 }
 
     

If I check the log on the server and the client, one strange this is that the OnRep_Pawn() functions isn't called on client for the drone. It is called for the Player's character. On the client side, I have warning messages:
LogNetPlayerMovement: Warning: CreateSavedMove: Hit limit of 96 saved moves (timing out or very bad ping?)

On the sever side, I have warning messages:
[2018.10.18-14.16.49:079][ 9]LogNetPlayerMovement: TimeStamp expired. 20.774586, CurrentTimeStamp: 20.774586
[2018.10.18-14.16.49:348][ 25]LogNetPlayerMovement: TimeStamp expired. 21.035360, CurrentTimeStamp: 21.053251
[2018.10.18-14.16.49:382][ 27]LogNetPlayerMovement: TimeStamp expired. 21.035360, CurrentTimeStamp: 21.087803
[2018.10.18-14.16.49:415][ 29]LogNetPlayerMovement: TimeStamp expired. 21.035360, CurrentTimeStamp: 21.122499

Log on the server side:

 [2018.10.18-14.16.28:093][ 12]LogGameState: Match State Changed from PlayerIntro to CountdownToBegin
 [2018.10.18-14.16.28:098][ 12]LogDebug: Verbose: AKBaseCharacter::PostInitializeComponents  -  Role=ROLE_Authority   IsLocallyControlled=0   Actor=BP_PlayerCharacter_C_0
 [2018.10.18-14.16.28:108][ 12]LogDebug: Verbose: AKPlayerController::SetPawn   Role=ROLE_Authority   IsLocalPlayerController()=0   InPawn=BP_PlayerCharacter_C_0
 [2018.10.18-14.16.28:119][ 12]LogDebug: AKPlayerController::Possess   PawnToPossess=BP_PlayerCharacter_C_0
 [2018.10.18-14.16.28:130][ 12]LogDebug: Verbose: AKBaseCharacter::PossessedBy  -  this=BP_PlayerCharacter_C_0  NewController=KPlayerController_1
 [2018.10.18-14.16.28:141][ 12]LogDebug: Verbose: AKPlayerController::SetPawn   Role=ROLE_Authority   IsLocalPlayerController()=0   InPawn=BP_PlayerCharacter_C_0
 [2018.10.18-14.16.28:152][ 12]LogDebug: Verbose: AKPlayerCharacter::Restart  -  Role=ROLE_Authority   IsLocallyControlled=0   Actor=BP_PlayerCharacter_C_0
 [2018.10.18-14.16.28:163][ 12]LogDebug: Verbose: AKBaseCharacter::Restart  -  Role=ROLE_Authority   IsLocallyControlled=0   Actor=BP_PlayerCharacter_C_0
 [2018.10.18-14.16.28:176][ 12]LogDebug: Verbose: AKBaseCharacter::PostInitializeComponents  -  Role=ROLE_Authority   IsLocallyControlled=0   Actor=BP_PlayerCharacter_C_1
 [2018.10.18-14.16.28:185][ 12]LogDebug: Verbose: AKPlayerController::SetPawn   Role=ROLE_Authority   IsLocalPlayerController()=0   InPawn=BP_PlayerCharacter_C_1
 [2018.10.18-14.16.28:196][ 12]LogDebug: AKPlayerController::Possess   PawnToPossess=BP_PlayerCharacter_C_1
 [2018.10.18-14.16.28:207][ 12]LogDebug: Verbose: AKBaseCharacter::PossessedBy  -  this=BP_PlayerCharacter_C_1  NewController=KPlayerController_2
 [2018.10.18-14.16.28:218][ 12]LogDebug: Verbose: AKPlayerController::SetPawn   Role=ROLE_Authority   IsLocalPlayerController()=0   InPawn=BP_PlayerCharacter_C_1
 [2018.10.18-14.16.28:229][ 12]LogDebug: Verbose: AKPlayerCharacter::Restart  -  Role=ROLE_Authority   IsLocallyControlled=0   Actor=BP_PlayerCharacter_C_1
 [2018.10.18-14.16.28:240][ 12]LogDebug: Verbose: AKBaseCharacter::Restart  -  Role=ROLE_Authority   IsLocallyControlled=0   Actor=BP_PlayerCharacter_C_1
 [2018.10.18-14.16.28:251][ 12]LogGameMode: AKGameMode::UpdatePlayersPresence  -  MatchState=CountdownToBegin
 [2018.10.18-14.16.28:361][ 14]LogNetPackageMap: Warning: Long net serialize: 60.949299ms, Serialized Object None
 [2018.10.18-14.16.28:515][ 14]LogNetPackageMap: Warning: Long net serialize: 22.566002ms, Serialized Object None
 [2018.10.18-14.16.30:361][ 14]LogDebug: Verbose: AKBaseCharacter::ServerSpawnDrone_Implementation  -  Role=ROLE_Authority   IsLocallyControlled=0   Actor=BP_PlayerCharacter_C_1
 [2018.10.18-14.16.30:372][ 14]LogDebug: Verbose: AKBaseCharacter::LocalSpawnDrone  -  Role=ROLE_Authority   IsLocallyControlled=0
 [2018.10.18-14.16.30:383][ 14]LogDebug: VeryVerbose: AKPlayerCharacter::LocalSpawnDrone  -  Drone=BP_Drone_C
 [2018.10.18-14.16.30:394][ 14]LogDebug: Verbose: AKPlayerCharacter::DestroyDrone  -  Role=ROLE_Authority    Actor=BP_PlayerCharacter_C_1    SpawnedDrone=None   IsLocallyControlled=0
 [2018.10.18-14.16.30:405][ 14]LogDebug: VeryVerbose: AKPlayerCharacter::LocalSpawnDrone  -  GetActorRotation=P=0.000000 Y=90.000114 R=0.000000  GetActorLocation=X=-15485.000 Y=-54050.000 Z=462.063
 [2018.10.18-14.16.30:416][ 14]LogDebug: VeryVerbose: AKPlayerCharacter::LocalSpawnDrone  -  CreatedDrone=BP_Drone_C_0   CreatedDrone->Instigator=BP_PlayerCharacter_C_1   CreatedDrone->MasterController=KPlayerController_2
 [2018.10.18-14.16.30:427][ 14]LogDebug: Verbose: AKDroneCharacter::PostInitializeComponents  -  Role=ROLE_Authority   IsLocallyControlled=0   Actor=BP_Drone_C_0
 [2018.10.18-14.16.30:438][ 14]LogOnline: AKDroneCharacterController::Possess  -  this=KDroneCharacterController_0    InPawn()=BP_Drone_C_0
 [2018.10.18-14.16.30:449][ 14]LogDebug: Verbose: AKDroneCharacter::PossessedBy  -  this=BP_Drone_C_0  NewController=KDroneCharacterController_0
 [2018.10.18-14.16.30:460][ 14]LogOnline: AKDroneCharacterController::SetPawn   this=KDroneCharacterController_0    Role=ROLE_Authority   IsLocalController()=1   InPawn=BP_Drone_C_0
 [2018.10.18-14.16.30:471][ 14]LogOnline: AKDroneCharacterController::SetPawn   this=KDroneCharacterController_0    Role=ROLE_Authority   IsLocalController()=1   InPawn=BP_Drone_C_0
 [2018.10.18-14.16.30:482][ 14]LogDebug: Verbose: AKDroneCharacter::Restart  -  Role=ROLE_Authority   IsLocallyControlled=1   Actor=BP_Drone_C_0
 [2018.10.18-14.16.30:493][ 14]LogOnline: AKDroneCharacterController::OnRep_Pawn  -  this=KDroneCharacterController_0    GetPawn()=BP_Drone_C_0
 [2018.10.18-14.16.30:504][ 14]LogOnline: AKDroneCharacterController::SetPawn   this=KDroneCharacterController_0    Role=ROLE_Authority   IsLocalController()=1   InPawn=BP_Drone_C_0
 [2018.10.18-14.16.32:172][ 14]LogDebug: Verbose: AKBaseCharacter::ServerSpawnDrone_Implementation  -  Role=ROLE_Authority   IsLocallyControlled=0   Actor=BP_PlayerCharacter_C_0
 [2018.10.18-14.16.32:183][ 14]LogDebug: Verbose: AKBaseCharacter::LocalSpawnDrone  -  Role=ROLE_Authority   IsLocallyControlled=0
 [2018.10.18-14.16.32:194][ 14]LogDebug: VeryVerbose: AKPlayerCharacter::LocalSpawnDrone  -  Drone=BP_Drone_C
 [2018.10.18-14.16.32:205][ 14]LogDebug: Verbose: AKPlayerCharacter::DestroyDrone  -  Role=ROLE_Authority    Actor=BP_PlayerCharacter_C_0    SpawnedDrone=None   IsLocallyControlled=0
 [2018.10.18-14.16.32:216][ 14]LogDebug: VeryVerbose: AKPlayerCharacter::LocalSpawnDrone  -  GetActorRotation=P=0.000000 Y=-90.000183 R=0.000000  GetActorLocation=X=-0.001 Y=11350.000 Z=462.063
 [2018.10.18-14.16.32:227][ 14]LogDebug: VeryVerbose: AKPlayerCharacter::LocalSpawnDrone  -  CreatedDrone=BP_Drone_C_1   CreatedDrone->Instigator=BP_PlayerCharacter_C_0   CreatedDrone->MasterController=KPlayerController_1
 [2018.10.18-14.16.32:238][ 14]LogDebug: Verbose: AKDroneCharacter::PostInitializeComponents  -  Role=ROLE_Authority   IsLocallyControlled=0   Actor=BP_Drone_C_1
 [2018.10.18-14.16.32:249][ 14]LogOnline: AKDroneCharacterController::Possess  -  this=KDroneCharacterController_1    InPawn()=BP_Drone_C_1
 [2018.10.18-14.16.32:260][ 14]LogDebug: Verbose: AKDroneCharacter::PossessedBy  -  this=BP_Drone_C_1  NewController=KDroneCharacterController_1
 [2018.10.18-14.16.32:271][ 14]LogOnline: AKDroneCharacterController::SetPawn   this=KDroneCharacterController_1    Role=ROLE_Authority   IsLocalController()=1   InPawn=BP_Drone_C_1
 [2018.10.18-14.16.32:282][ 14]LogOnline: AKDroneCharacterController::SetPawn   this=KDroneCharacterController_1    Role=ROLE_Authority   IsLocalController()=1   InPawn=BP_Drone_C_1
 [2018.10.18-14.16.32:293][ 14]LogDebug: Verbose: AKDroneCharacter::Restart  -  Role=ROLE_Authority   IsLocallyControlled=1   Actor=BP_Drone_C_1
 [2018.10.18-14.16.32:304][ 14]LogOnline: AKDroneCharacterController::OnRep_Pawn  -  this=KDroneCharacterController_1    GetPawn()=BP_Drone_C_1
 [2018.10.18-14.16.32:315][ 14]LogOnline: AKDroneCharacterController::SetPawn   this=KDroneCharacterController_1    Role=ROLE_Authority   IsLocalController()=1   InPawn=BP_Drone_C_1
 

 

Log on one client side (we have two clients connected to the game 1vs1):

 [2018.10.18-14.16.28:272][126]LogDebug: Verbose: AKBaseCharacter::PostInitializeComponents  -  Role=ROLE_SimulatedProxy   IsLocallyControlled=0   Actor=BP_PlayerCharacter_C_0
 [2018.10.18-14.16.28:272][126]LogOnline: AKPlayerController::OnRep_Pawn  -  GetPawn()=BP_PlayerCharacter_C_0
 [2018.10.18-14.16.28:272][126]LogDebug: Verbose: AKPlayerController::SetPawn   Role=ROLE_AutonomousProxy   IsLocalPlayerController()=1   InPawn=BP_PlayerCharacter_C_0
 [2018.10.18-14.16.28:273][126]LogDebug: Verbose: AKPlayerController::SetPawn   Role=ROLE_AutonomousProxy   IsLocalPlayerController()=1   InPawn=BP_PlayerCharacter_C_0
 [2018.10.18-14.16.28:273][126]LogDebug: Verbose: AKPlayerController::SetPawn   Role=ROLE_AutonomousProxy   IsLocalPlayerController()=1   InPawn=BP_PlayerCharacter_C_0
 [2018.10.18-14.16.28:273][126]LogDebug: Verbose: AKPlayerCharacter::Restart  -  Role=ROLE_AutonomousProxy   IsLocallyControlled=1   Actor=BP_PlayerCharacter_C_0
 [2018.10.18-14.16.28:273][126]LogDebug: Verbose: AKBaseCharacter::Restart  -  Role=ROLE_AutonomousProxy   IsLocallyControlled=1   Actor=BP_PlayerCharacter_C_0
 [2018.10.18-14.16.28:273][126]LogDebug: Verbose: AKBaseCharacter::SpawnEquipmentSlots  -  Role=ROLE_AutonomousProxy   IsLocallyControlled=1
 [2018.10.18-14.16.28:273][126]LogDebug: Verbose: AKPlayerCharacter::SpawnDrone  -  Role=ROLE_AutonomousProxy   IsLocallyControlled=1
 [2018.10.18-14.16.31:384][316]LogNetPlayerMovement: Warning: CreateSavedMove: Hit limit of 96 saved moves (timing out or very bad ping?)
 [2018.10.18-14.16.32:383][378]LogOnline: AKPlayerController::OnRep_Pawn  -  GetPawn()=BP_PlayerCharacter_C_0
 [2018.10.18-14.16.32:384][378]LogDebug: Verbose: AKPlayerController::SetPawn   Role=ROLE_AutonomousProxy   IsLocalPlayerController()=1   InPawn=BP_PlayerCharacter_C_0
 [2018.10.18-14.16.32:385][378]LogDebug: Verbose: AKDroneCharacter::PostInitializeComponents  -  Role=ROLE_SimulatedProxy   IsLocallyControlled=0   Actor=BP_Drone_C_0
 [2018.10.18-14.16.32:388][378]LogDebug: Verbose: AKBaseCharacter::PostInitializeComponents  -  Role=ROLE_SimulatedProxy   IsLocallyControlled=0   Actor=BP_PlayerCharacter_C_1
 [2018.10.18-14.16.32:391][378]LogDebug: Verbose: AKDroneCharacter::PostInitializeComponents  -  Role=ROLE_SimulatedProxy   IsLocallyControlled=0   Actor=BP_Drone_C_1
 [2018.10.18-14.16.32:410][378]LogDebug: Verbose: AKPlayerCharacter::OnRep_SpawnedDrone  -  Role=ROLE_SimulatedProxy   IsLocallyControlled=0   SpawnedDrone=BP_Drone_C_1
 [2018.10.18-14.16.33:399][428]LogDebug: Verbose: AKTeamPlayerHUD::InitializePlayerForMatch
 [2018.10.18-14.16.33:399][428]LogDebug: Verbose: SKInGameMenuWidget::OnInitializePlayerForMatch
 [2018.10.18-14.16.33:407][428]LogDebug: Verbose: SKActionBarWidget::RegenerateBottomLeftRow  -  InGame=1
 [2018.10.18-14.16.33:407][428]LogDebug: Verbose: SKActionBarWidget::RegenerateBottomLeftRow  -  ThePawn=BP_PlayerCharacter_C_0   ThePawn->GetLeftHandWeapon()=BasicWeaponBlunt_C_0
 [2018.10.18-14.16.33:407][428]LogDebug: Verbose: SKActionBarWidget::RegenerateBottomLeftRow  -  UID=000062   CurrentLeftWeaponUID=000062
 [2018.10.18-14.16.33:407][428]LogDebug: Verbose: SKActionBarWidget::RegenerateBottomRightRow  -  InGame=1
 [2018.10.18-14.16.33:407][428]LogDebug: Verbose: SKActionBarWidget::RegenerateBottomRightRow  -  ThePawn=BP_PlayerCharacter_C_0   ThePawn->GetRightHandWeapon()=BasicWeaponAxe_C_0
 [2018.10.18-14.16.33:407][428]LogDebug: Verbose: SKActionBarWidget::RegenerateBottomRightRow  -  UID=000296   CurrentRightWeaponUID=000296
 [2018.10.18-14.16.43:322][969]LogDebug: VeryVerbose: AKPlayerCharacter::DroneMoveForward  -  Value=1.000000   SpawnedDrone=BP_Drone_C_0
 [2018.10.18-14.16.43:322][969]LogDebug: VeryVerbose: AKDroneCharacter::DroneMoveForward  -  Value=1.000000
 [2018.10.18-14.16.43:339][970]LogDebug: VeryVerbose: AKPlayerCharacter::DroneMoveForward  -  Value=1.000000   SpawnedDrone=BP_Drone_C_0
 [2018.10.18-14.16.43:339][970]LogDebug: VeryVerbose: AKDroneCharacter::DroneMoveForward  -  Value=1.000000
 [2018.10.18-14.16.43:356][971]LogDebug: VeryVerbose: AKPlayerCharacter::DroneMoveForward  -  Value=1.000000   SpawnedDrone=BP_Drone_C_0
 [2018.10.18-14.16.43:356][971]LogDebug: VeryVerbose: AKDroneCharacter::DroneMoveForward  -  Value=1.000000
 [2018.10.18-14.16.43:375][972]LogDebug: VeryVerbose: AKPlayerCharacter::DroneMoveForward  -  Value=1.000000   SpawnedDrone=BP_Drone_C_0
 [2018.10.18-14.16.43:375][972]LogDebug: VeryVerbose: AKDroneCharacter::DroneMoveForward  -  Value=1.000000
 [2018.10.18-14.16.43:393][973]LogDebug: VeryVerbose: AKPlayerCharacter::DroneMoveForward  -  Value=1.000000   SpawnedDrone=BP_Drone_C_0
 [2018.10.18-14.16.43:393][973]LogDebug: VeryVerbose: AKDroneCharacter::DroneMoveForward  -  Value=1.000000
 

As I can see on the client side, the Pawn of the player is replicated on the client.
LogOnline: AKPlayerController::OnRep_Pawn - GetPawn()=BP_PlayerCharacter_C_0

But for the drone's pawn I don't see the OnRep_Pawn call on the client.
And very strange the OnRep_Pawn is called on the server
LogOnline: AKDroneCharacterController::OnRep_Pawn - this=KDroneCharacterController_0 GetPawn()=BP_Drone_C_0

In addition, I've made one change.
I removed the call NewPC->SetPawnFromRep(SpawnedDrone); from LocalSpawnDrone function in character.

Now In the server log I can notice one strange thing that can explain the replication problem.

 [2018.10.19-07.59.17:994][682]LogGameState: Match State Changed from PlayerIntro to CountdownToBegin
 [2018.10.19-07.59.18:005][682]LogKSGMDebug: Verbose: AKBaseCharacter::PostInitializeComponents  -  Role=ROLE_Authority   IsLocallyControlled=0   Actor=BP_PlayerCharacter_C_0
 [2018.10.19-07.59.18:015][682]LogKSGMDebug: Verbose: AKPlayerController::SetPawn   Role=ROLE_Authority   IsLocalPlayerController()=0   InPawn=BP_PlayerCharacter_C_0
 [2018.10.19-07.59.18:025][682]LogKSGMDebug: AKPlayerController::Possess   PawnToPossess=BP_PlayerCharacter_C_0
 [2018.10.19-07.59.18:036][682]LogKSGMDebug: Verbose: AKBaseCharacter::PossessedBy  -  this=BP_PlayerCharacter_C_0  NewController=KPlayerController_0
 [2018.10.19-07.59.18:047][682]LogKSGMDebug: Verbose: AKPlayerController::SetPawn   Role=ROLE_Authority   IsLocalPlayerController()=0   InPawn=BP_PlayerCharacter_C_0
 [2018.10.19-07.59.18:058][682]LogKSGMDebug: Verbose: AKPlayerCharacter::Restart  -  Role=ROLE_Authority   IsLocallyControlled=0   Actor=BP_PlayerCharacter_C_0
 [2018.10.19-07.59.18:069][682]LogKSGMDebug: Verbose: AKBaseCharacter::Restart  -  Role=ROLE_Authority   IsLocallyControlled=0   Actor=BP_PlayerCharacter_C_0
 [2018.10.19-07.59.18:082][682]LogKSGMDebug: Verbose: AKBaseCharacter::PostInitializeComponents  -  Role=ROLE_Authority   IsLocallyControlled=0   Actor=BP_PlayerCharacter_C_1
 [2018.10.19-07.59.18:091][682]LogKSGMDebug: Verbose: AKPlayerController::SetPawn   Role=ROLE_Authority   IsLocalPlayerController()=0   InPawn=BP_PlayerCharacter_C_1
 [2018.10.19-07.59.18:102][682]LogKSGMDebug: AKPlayerController::Possess   PawnToPossess=BP_PlayerCharacter_C_1
 [2018.10.19-07.59.18:113][682]LogKSGMDebug: Verbose: AKBaseCharacter::PossessedBy  -  this=BP_PlayerCharacter_C_1  NewController=KPlayerController_1
 [2018.10.19-07.59.18:124][682]LogKSGMDebug: Verbose: AKPlayerController::SetPawn   Role=ROLE_Authority   IsLocalPlayerController()=0   InPawn=BP_PlayerCharacter_C_1
 [2018.10.19-07.59.18:135][682]LogKSGMDebug: Verbose: AKPlayerCharacter::Restart  -  Role=ROLE_Authority   IsLocallyControlled=0   Actor=BP_PlayerCharacter_C_1
 [2018.10.19-07.59.18:146][682]LogKSGMDebug: Verbose: AKBaseCharacter::Restart  -  Role=ROLE_Authority   IsLocallyControlled=0   Actor=BP_PlayerCharacter_C_1
 [2018.10.19-07.59.18:157][682]LogGameMode: AKGameMode::UpdatePlayersPresence  -  MatchState=CountdownToBegin
 [2018.10.19-07.59.18:728][684]LogKSGMDebug: Verbose: AKBaseCharacter::ServerSpawnDrone_Implementation  -  Role=ROLE_Authority   IsLocallyControlled=0   Actor=BP_PlayerCharacter_C_1
 [2018.10.19-07.59.18:737][684]LogKSGMDebug: Verbose: AKBaseCharacter::LocalSpawnDrone  -  Role=ROLE_Authority   IsLocallyControlled=0
 [2018.10.19-07.59.18:748][684]LogKSGMDebug: VeryVerbose: AKPlayerCharacter::LocalSpawnDrone  -  Drone=BP_Drone_C
 [2018.10.19-07.59.18:759][684]LogKSGMDebug: Verbose: AKPlayerCharacter::DestroyDrone  -  Role=ROLE_Authority    Actor=BP_PlayerCharacter_C_1    SpawnedDrone=None   IsLocallyControlled=0
 [2018.10.19-07.59.18:769][684]LogKSGMDebug: VeryVerbose: AKPlayerCharacter::LocalSpawnDrone  -  GetActorRotation=P=0.000000 Y=90.000114 R=0.000000  GetActorLocation=X=-15485.000 Y=-54050.000 Z=462.063
 [2018.10.19-07.59.18:780][684]LogKSGMDebug: VeryVerbose: AKPlayerCharacter::LocalSpawnDrone  -  CreatedDrone=BP_Drone_C_0   CreatedDrone->Instigator=BP_PlayerCharacter_C_1   CreatedDrone->MasterController=KPlayerController_1
 [2018.10.19-07.59.18:791][684]LogKSGMDebug: Verbose: AKDroneCharacter::PostInitializeComponents  -  Role=ROLE_Authority   IsLocallyControlled=0   Actor=BP_Drone_C_0
 [2018.10.19-07.59.18:802][684]LogOnline: AKDroneCharacterController::Possess  -  this=KDroneCharacterController_0    InPawn()=BP_Drone_C_0
 [2018.10.19-07.59.18:813][684]LogKSGMDebug: Verbose: AKDroneCharacter::PossessedBy  -  this=BP_Drone_C_0  NewController=KDroneCharacterController_0
 [2018.10.19-07.59.18:824][684]LogOnline: AKDroneCharacterController::SetPawn   this=KDroneCharacterController_0    Role=ROLE_Authority   IsLocalController()=1   InPawn=BP_Drone_C_0
 [2018.10.19-07.59.18:835][684]LogOnline: AKDroneCharacterController::SetPawn   this=KDroneCharacterController_0    Role=ROLE_Authority   IsLocalController()=1   InPawn=BP_Drone_C_0
 [2018.10.19-07.59.18:846][684]LogKSGMDebug: Verbose: AKDroneCharacter::Restart  -  Role=ROLE_Authority   IsLocallyControlled=1   Actor=BP_Drone_C_0
 [2018.10.19-07.59.18:888][686]LogKSGMDebug: Verbose: AKBaseCharacter::ServerSpawnDrone_Implementation  -  Role=ROLE_Authority   IsLocallyControlled=0   Actor=BP_PlayerCharacter_C_0
 [2018.10.19-07.59.18:890][686]LogKSGMDebug: Verbose: AKBaseCharacter::LocalSpawnDrone  -  Role=ROLE_Authority   IsLocallyControlled=0
 [2018.10.19-07.59.18:901][686]LogKSGMDebug: VeryVerbose: AKPlayerCharacter::LocalSpawnDrone  -  Drone=BP_Drone_C
 [2018.10.19-07.59.18:912][686]LogKSGMDebug: Verbose: AKPlayerCharacter::DestroyDrone  -  Role=ROLE_Authority    Actor=BP_PlayerCharacter_C_0    SpawnedDrone=None   IsLocallyControlled=0
 [2018.10.19-07.59.18:923][686]LogKSGMDebug: VeryVerbose: AKPlayerCharacter::LocalSpawnDrone  -  GetActorRotation=P=0.000000 Y=-90.000183 R=0.000000  GetActorLocation=X=-0.001 Y=11350.000 Z=462.063
 [2018.10.19-07.59.18:935][686]LogKSGMDebug: VeryVerbose: AKPlayerCharacter::LocalSpawnDrone  -  CreatedDrone=BP_Drone_C_1   CreatedDrone->Instigator=BP_PlayerCharacter_C_0   CreatedDrone->MasterController=KPlayerController_0
 [2018.10.19-07.59.18:945][686]LogKSGMDebug: Verbose: AKDroneCharacter::PostInitializeComponents  -  Role=ROLE_Authority   IsLocallyControlled=0   Actor=BP_Drone_C_1
 [2018.10.19-07.59.18:956][686]LogOnline: AKDroneCharacterController::Possess  -  this=KDroneCharacterController_1    InPawn()=BP_Drone_C_1
 [2018.10.19-07.59.18:967][686]LogKSGMDebug: Verbose: AKDroneCharacter::PossessedBy  -  this=BP_Drone_C_1  NewController=KDroneCharacterController_1
 [2018.10.19-07.59.18:978][686]LogOnline: AKDroneCharacterController::SetPawn   this=KDroneCharacterController_1    Role=ROLE_Authority   IsLocalController()=1   InPawn=BP_Drone_C_1
 [2018.10.19-07.59.18:989][686]LogOnline: AKDroneCharacterController::SetPawn   this=KDroneCharacterController_1    Role=ROLE_Authority   IsLocalController()=1   InPawn=BP_Drone_C_1
 [2018.10.19-07.59.19:000][686]LogKSGMDebug: Verbose: AKDroneCharacter::Restart  -  Role=ROLE_Authority   IsLocallyControlled=1   Actor=BP_Drone_C_1
 
 

The problem is that the drone spawn on the server is local controlled.

 [2018.10.19-07.59.18:824][684]LogOnline: AKDroneCharacterController::SetPawn   this=KDroneCharacterController_0    Role=ROLE_Authority   IsLocalController()=1   InPawn=BP_Drone_C_0
 [2018.10.19-07.59.18:835][684]LogOnline: AKDroneCharacterController::SetPawn   this=KDroneCharacterController_0    Role=ROLE_Authority   IsLocalController()=1   InPawn=BP_Drone_C_0
 [2018.10.19-07.59.18:978][686]LogOnline: AKDroneCharacterController::SetPawn   this=KDroneCharacterController_1    Role=ROLE_Authority   IsLocalController()=1   InPawn=BP_Drone_C_1
 [2018.10.19-07.59.18:989][686]LogOnline: AKDroneCharacterController::SetPawn   this=KDroneCharacterController_1    Role=ROLE_Authority   IsLocalController()=1   InPawn=BP_Drone_C_1
 

 

For the player's character, it is not locally controlled on the server, but on the client.
Why the drone spawned on the server is set as locally controlled ?

Someone has an idea on what's going on ?

Product Version: UE 4.19
Tags:
more ▼

asked Oct 19 '18 at 01:21 PM in C++ Programming

avatar image

domzorg
690 47 52 125

(comments are locked)
10|2000 characters needed characters left

1 answer: sort voted first

I've solved the problem by removing the controller and calling SetAutonomousProxy(true);

In the DroneCharacter constructor I've sets the bRunPhysicsWithNoController to true.

 AKDroneCharacter::AKDroneCharacter(const FObjectInitializer& ObjectInitializer)
     : Super(ObjectInitializer)
 {    
 .        GetCharacterMovement()->bRunPhysicsWithNoController = true;  
 

and the AIControllerClass to null.

 AutoPossessAI = EAutoPossessAI::Spawned;   
 AIControllerClass = nullptr;  



After object construction in PostInitialize I call the SetAutonomousProxy to change the RemoteRole

 void AKDroneCharacter::PostInitializeComponents()
 {
     Super::PostInitializeComponents();
 
 
     if (GetNetMode() != NM_Standalone && Role == ROLE_Authority)
     {
         SetAutonomousProxy(true);
     }
 

more ▼

answered Nov 29 '18 at 06:23 AM

avatar image

domzorg
690 47 52 125

(comments are locked)
10|2000 characters needed characters left
Your answer
toggle preview:

Up to 5 attachments (including images) can be used with a maximum of 5.2 MB each and 5.2 MB total.

Follow this question

Once you sign in you will be able to subscribe for any updates here

Answers to this question