SetReplicateMovement(false) doesn't happen quick enough

Hi all, sorry if the title is confusing, but I’ll explain.

I have guns in the world that can be picked up, and these have ReplicateMovement set to true so that clients and the server see them in the same place if they knocked around or moved at all. I want it so when they’re picked up, they either attach to the character model, or the first-person viewmodel depending on whether the character picking it up is locally controlled or not. This works great in practice, but there’s a problem.

When we go to pickup the gun, I set ReplicateMovement = false so that it can be in different places on the client and server (attached to viewmodel on client, attached to character hands on server), but the SetReplicateMovement function doesn’t take effect quick enough, and the gun on the client attaches to the character model rather than the 1st person hands. I have to manually add a small delay of .0001 seconds in order for it to work properly. While this works, it’s a workaround and I’d rather work with the engine and understand it rather than around it. I tried doing ForceNetUpdate() after calling SetReplicateMovement(false) but it didn’t do anything. How could I get this to work properly?

void ACharacterBase::Server_PickupWeapon_Implementation(AGunBase* Gun)
{
	Gun->SetOwner(this);
	Gun->SetReplicateMovement(false);
	Gun->ForceNetRelevant();
	Gun->ForceNetUpdate();
	Gun->Mesh->SetSimulatePhysics(false);
	Gun->SetActorEnableCollision(false);
	Gun->SetActorHiddenInGame(false);
	Gun->AttachToComponent(GetMesh(), FAttachmentTransformRules::SnapToTargetNotIncludingScale, "Holster");
	Gun->ForceNetRelevant();
	Gun->ForceNetUpdate();
	
	
	#if WITH_EDITOR
		UE_LOG(LogTemp, Warning, TEXT("%s picked up %s"), *GetActorLabel(), *Gun->GetActorLabel());
	#endif

	
	Gun->OnPickup(this);
	
	if (!EquippedWeapon)
	{
		EquippedWeapon = Gun;
	} else if (!HolsteredWeapon)
	{
		HolsteredWeapon = Gun;
		Gun->SetActorHiddenInGame(true);
	} else
	{
		DropEquippedWeapon();
		EquippedWeapon = Gun;
	}
	if (EquippedWeapon)
	{
		WeaponsUpdated.Broadcast(EquippedWeapon, HolsteredWeapon);
	}
	//If we're the server, then run EquipWeapon since we don't get RepNotifies
	if (HasAuthority())
		OnRep_EquippedWeapon();

}
void ACharacterBase::SetupViewmodel(bool FirstPerson)
{
	if (!EquippedWeapon) return;
	EquippedWeapon->ForceNetUpdate();
	if (FirstPerson && IsLocallyViewed())
	{
		GetMesh1P()->bPauseAnims = false;
		GEngine->AddOnScreenDebugMessage(-1, 5, FColor::Red, TEXT("First person true!"));
		if (EquippedWeapon->DrawSFX) UGameplayStatics::PlaySoundAtLocation(GetWorld(), EquippedWeapon->DrawSFX, GetActorLocation());
		EquippedWeapon->AttachToComponent(GetMesh1P(), FAttachmentTransformRules::SnapToTargetNotIncludingScale, "GripPoint");
		if (EquippedWeapon->DrawAnimation1P)
		{
			GetMesh1P()->GetAnimInstance()->Montage_Play(EquippedWeapon->DrawAnimation1P, EquippedWeapon->DrawAnimation1P->GetPlayLength() / EquippedWeapon->DrawSpeed);
		}
	}
	else
	{
		GetMesh1P()->bPauseAnims = true;
		EquippedWeapon->AttachToComponent(GetMesh(), FAttachmentTransformRules::SnapToTargetNotIncludingScale, "GripPoint");
	}
}