void AShooterPlayerController::UpdateAchievementProgress( const FString& Id, float Percent ) { ULocalPlayer* LocalPlayer = Cast<ULocalPlayer>(Player); if (LocalPlayer) { IOnlineSubsystem* OnlineSub = IOnlineSubsystem::Get(); if(OnlineSub) { IOnlineIdentityPtr Identity = OnlineSub->GetIdentityInterface(); if (Identity.IsValid()) { TSharedPtr<FUniqueNetId> UserId = Identity->GetUniquePlayerId(LocalPlayer->ControllerId); if (UserId.IsValid()) { IOnlineAchievementsPtr Achievements = OnlineSub->GetAchievementsInterface(); if (Achievements.IsValid() && (!WriteObject.IsValid() || WriteObject->WriteState != EOnlineAsyncTaskState::InProgress)) { WriteObject = MakeShareable(new FOnlineAchievementsWrite()); WriteObject->SetFloatStat(*Id, Percent); FOnlineAchievementsWriteRef WriteObjectRef = WriteObject.ToSharedRef(); Achievements->WriteAchievements(*UserId.Get(), WriteObjectRef); } else { UE_LOG(LogOnline, Warning, TEXT("No valid achievement interface or another write is in progress.")); } } else { UE_LOG(LogOnline, Warning, TEXT("No valid user id for this controller.")); } } else { UE_LOG(LogOnline, Warning, TEXT("No valid identity interface.")); } } else { UE_LOG(LogOnline, Warning, TEXT("No default online subsystem.")); } } else { UE_LOG(LogOnline, Warning, TEXT("No local player, cannot update achievements.")); } }
void AShooterPlayerController::QueryAchievements() { // precache achievements ULocalPlayer* LocalPlayer = Cast<ULocalPlayer>(Player); if (LocalPlayer) { IOnlineSubsystem* OnlineSub = IOnlineSubsystem::Get(); if(OnlineSub) { IOnlineIdentityPtr Identity = OnlineSub->GetIdentityInterface(); if (Identity.IsValid()) { TSharedPtr<FUniqueNetId> UserId = Identity->GetUniquePlayerId(LocalPlayer->ControllerId); if (UserId.IsValid()) { IOnlineAchievementsPtr Achievements = OnlineSub->GetAchievementsInterface(); if (Achievements.IsValid()) { Achievements->QueryAchievements( *UserId.Get(), FOnQueryAchievementsCompleteDelegate::CreateUObject( this, &AShooterPlayerController::OnQueryAchievementsComplete )); } } else { UE_LOG(LogOnline, Warning, TEXT("No valid user id for this controller.")); } } else { UE_LOG(LogOnline, Warning, TEXT("No valid identity interface.")); } } else { UE_LOG(LogOnline, Warning, TEXT("No default online subsystem.")); } } else { UE_LOG(LogOnline, Warning, TEXT("No local player, cannot read achievements.")); } }