void UAchievementWriteCallbackProxy::Activate() { FOnlineSubsystemBPCallHelper Helper(TEXT("WriteAchievementObject"), GEngine->GetWorldFromContextObject(WorldContextObject)); Helper.QueryIDFromPlayerController(PlayerControllerWeakPtr.Get()); if (Helper.IsValid()) { IOnlineAchievementsPtr Achievements = Helper.OnlineSub->GetAchievementsInterface(); if (Achievements.IsValid()) { FOnlineAchievementsWriteRef WriteObjectRef = WriteObject.ToSharedRef(); FOnAchievementsWrittenDelegate WriteFinishedDelegate = FOnAchievementsWrittenDelegate::CreateUObject(this, &ThisClass::OnAchievementWritten); Achievements->WriteAchievements(*Helper.UserID, WriteObjectRef, WriteFinishedDelegate); // OnAchievementWritten will get called, nothing more to do return; } else { FFrame::KismetExecutionMessage(TEXT("WriteAchievementObject - Achievements not supported by Online Subsystem"), ELogVerbosity::Warning); } } // Fail immediately OnFailure.Broadcast(AchievementName, AchievementProgress, UserTag); WriteObject.Reset(); }
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.")); } }