void AShooterPlayerController::GameHasEnded(class AActor* EndGameFocus, bool bIsWinner) { // write stats ULocalPlayer* LocalPlayer = Cast<ULocalPlayer>(Player); if (LocalPlayer) { AShooterPlayerState* ShooterPlayerState = Cast<AShooterPlayerState>(PlayerState); if (ShooterPlayerState) { // update local saved profile UShooterPersistentUser* const PersistentUser = GetPersistentUser(); if (PersistentUser) { PersistentUser->AddMatchResult( ShooterPlayerState->GetKills(), ShooterPlayerState->GetDeaths(), ShooterPlayerState->GetNumBulletsFired(), ShooterPlayerState->GetNumRocketsFired(), bIsWinner); PersistentUser->SaveIfDirty(); } // update achievements UpdateAchievementsOnGameEnd(); // update leaderboards IOnlineSubsystem* const OnlineSub = IOnlineSubsystem::Get(); if(OnlineSub) { IOnlineIdentityPtr Identity = OnlineSub->GetIdentityInterface(); if (Identity.IsValid()) { TSharedPtr<FUniqueNetId> UserId = Identity->GetUniquePlayerId(LocalPlayer->ControllerId); if (UserId.IsValid()) { IOnlineLeaderboardsPtr Leaderboards = OnlineSub->GetLeaderboardsInterface(); if (Leaderboards.IsValid()) { FShooterAllTimeMatchResultsWrite WriteObject; WriteObject.SetIntStat(LEADERBOARD_STAT_SCORE, ShooterPlayerState->GetKills()); WriteObject.SetIntStat(LEADERBOARD_STAT_KILLS, ShooterPlayerState->GetKills()); WriteObject.SetIntStat(LEADERBOARD_STAT_DEATHS, ShooterPlayerState->GetDeaths()); WriteObject.SetIntStat(LEADERBOARD_STAT_MATCHESPLAYED, 1); // the call will copy the user id and write object to its own memory Leaderboards->WriteLeaderboards(ShooterPlayerState->SessionName, *UserId, WriteObject); } } } } } } Super::GameHasEnded(EndGameFocus, bIsWinner); }
void ULeaderboardFlushCallbackProxy::RemoveDelegate() { if (!bFailedToEvenSubmit) { if (IOnlineSubsystem* OnlineSub = IOnlineSubsystem::Get()) { IOnlineLeaderboardsPtr Leaderboards = OnlineSub->GetLeaderboardsInterface(); if (Leaderboards.IsValid()) { Leaderboards->ClearOnLeaderboardFlushCompleteDelegate(LeaderboardFlushCompleteDelegate); } } } }
void ULeaderboardFlushCallbackProxy::TriggerFlush(APlayerController* PlayerController, FName InSessionName) { bFailedToEvenSubmit = true; if (APlayerState* PlayerState = (PlayerController != NULL) ? PlayerController->PlayerState : NULL) { TSharedPtr<FUniqueNetId> UserID = PlayerState->UniqueId.GetUniqueNetId(); if (UserID.IsValid()) { if (IOnlineSubsystem* const OnlineSub = IOnlineSubsystem::Get()) { IOnlineLeaderboardsPtr Leaderboards = OnlineSub->GetLeaderboardsInterface(); if (Leaderboards.IsValid()) { // Register the completion callback LeaderboardFlushCompleteDelegate = FOnLeaderboardFlushCompleteDelegate::CreateUObject(this, &ULeaderboardFlushCallbackProxy::OnFlushCompleted); Leaderboards->AddOnLeaderboardFlushCompleteDelegate(LeaderboardFlushCompleteDelegate); // Flush the leaderboard Leaderboards->FlushLeaderboards(InSessionName); } else { FFrame::KismetExecutionMessage(TEXT("ULeaderboardFlushCallbackProxy::TriggerFlush - Leaderboards not supported by Online Subsystem"), ELogVerbosity::Warning); } } else { FFrame::KismetExecutionMessage(TEXT("ULeaderboardFlushCallbackProxy::TriggerFlush - Invalid or uninitialized OnlineSubsystem"), ELogVerbosity::Warning); } } else { FFrame::KismetExecutionMessage(TEXT("ULeaderboardFlushCallbackProxy::TriggerFlush - Cannot map local player to unique net ID"), ELogVerbosity::Warning); } } else { FFrame::KismetExecutionMessage(TEXT("ULeaderboardQueryCallbackProxy::TriggerFlush - Invalid player state"), ELogVerbosity::Warning); } if (bFailedToEvenSubmit) { OnFlushCompleted(InSessionName, false); } }