BenVlodgi

EOSCore WriteAchievements not using stats

Jul 1st, 2021
1,794
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.16 KB | None | 0 0
  1. struct FUnlockAchievements : public EOS_Achievements_UnlockAchievementsOptions
  2. {
  3.     TArray<char*> PointerArray;
  4.  
  5.     FUnlockAchievements(int32 numAchievements, EOS_ProductUserId userId)
  6.         : EOS_Achievements_UnlockAchievementsOptions()
  7.     {
  8.         PointerArray.AddZeroed(numAchievements);
  9.  
  10.         for (int32 i = 0; i < PointerArray.Num(); i++)
  11.         {
  12.             PointerArray[i] = new char[256];
  13.         }
  14.  
  15.         ApiVersion = EOS_ACHIEVEMENTS_UNLOCKACHIEVEMENTS_API_LATEST;
  16.         UserId = userId;
  17.         AchievementsCount = PointerArray.Num();
  18.         AchievementIds = const_cast<const char**>(PointerArray.GetData());
  19.     }
  20. };
  21.  
  22. struct FSubsystemUnlockAchievementsCallback
  23. {
  24. public:
  25.     FOnAchievementsWrittenDelegate m_Callback;
  26.     FUniqueNetIdEOSCorePtr m_PlayerNetId;
  27. public:
  28.     FSubsystemUnlockAchievementsCallback(const FOnAchievementsWrittenDelegate& Callback, FUniqueNetIdEOSCorePtr PlayerNetId)
  29.         : m_Callback(Callback)
  30.         , m_PlayerNetId(PlayerNetId)
  31.     {
  32.     }
  33. };
  34.  
  35. void FOnlineAchievementsEOSCore::WriteAchievements(const FUniqueNetId& PlayerId, FOnlineAchievementsWriteRef& WriteObject, const FOnAchievementsWrittenDelegate& Delegate)
  36. {
  37.     bool bUseStats = false;
  38.  
  39.     TArray<FOnlineStatsUserUpdatedStats> StatsToWrite;
  40.     FUniqueNetIdEOSCorePtr NetId = MakeShared<FUniqueNetIdEOSCore>(PlayerId);
  41.     FOnlineStatsUserUpdatedStats& UpdatedStats = StatsToWrite.Emplace_GetRef(NetId.ToSharedRef());
  42.  
  43.     for (const TPair<FName, FVariantData>& Stat : WriteObject->Properties)
  44.     {
  45.         UpdatedStats.Stats.Add(Stat.Key.ToString(), FOnlineStatUpdate(Stat.Value, FOnlineStatUpdate::EOnlineStatModificationType::Unknown));
  46.     }
  47.  
  48.     if (bUseStats)
  49.     {
  50.  
  51.         EOSSubsystem->m_StatsInterfacePtr->UpdateStats(NetId.ToSharedRef(), StatsToWrite, FOnlineStatsUpdateStatsComplete());
  52.  
  53.         WriteObject->WriteState = EOnlineAsyncTaskState::Done;
  54.         Delegate.ExecuteIfBound(PlayerId, true);
  55.     }
  56.     else
  57.     {
  58.         const EOS_ProductUserId UserId = EOS_ProductUserId_FromString(TCHAR_TO_UTF8(*NetId->m_ProductUserIdStr));
  59.  
  60.         // Pre count how many of these we'll be sending along so we can init the array to the proper size.
  61.         // Only unlock achievements if they are 100% complete
  62.         int32 achievementsUnlockingCount = 0;
  63.         for (const TPair<FName, FVariantData>& Stat : WriteObject->Properties)
  64.         {
  65.             float Percent = 0.0f;
  66.             Stat.Value.GetValue(Percent);
  67.             if (Percent >= 100.0f)
  68.             {
  69.                 achievementsUnlockingCount++;
  70.             }
  71.         }
  72.  
  73.         if (achievementsUnlockingCount <= 0)
  74.         {
  75.             // There were no achievements to write
  76.             LogVerbose("WriteAchievements: No Achievements marked as 100% complete to write. ");
  77.             Delegate.ExecuteIfBound(PlayerId, true);
  78.         }
  79.         else
  80.         {
  81.             // We have atleast one achievement to write.
  82.  
  83.             FUnlockAchievements UnlockAchievementsOperation(achievementsUnlockingCount, UserId);
  84.             for (const TPair<FName, FVariantData>& Stat : WriteObject->Properties)
  85.             {
  86.                 float Percent = 0.0f;
  87.                 Stat.Value.GetValue(Percent);
  88.  
  89.                 int32 i = 0;
  90.                 if (Percent >= 100.0f)
  91.                 {
  92.                     FCStringAnsi::Strncpy(UnlockAchievementsOperation.PointerArray[i], TCHAR_TO_UTF8(*Stat.Key.ToString()), 256);
  93.                     i++;
  94.                 }
  95.             }
  96.  
  97.             FSubsystemUnlockAchievementsCallback* CallbackObj = new FSubsystemUnlockAchievementsCallback({ Delegate, NetId });
  98.             EOS_Achievements_UnlockAchievements(EOSSubsystem->m_AchievementsHandle, &UnlockAchievementsOperation, CallbackObj,
  99.                 [](const EOS_Achievements_OnUnlockAchievementsCompleteCallbackInfo* Data)
  100.                 {
  101.                     LogVerbose("EOS_Achievements_UnlockAchievements Callback with EOS result code (%s)", *FString(EOS_EResult_ToString(Data->ResultCode)));
  102.  
  103.                     bool bWasSuccessful = Data->ResultCode == EOS_EResult::EOS_Success;
  104.                     if (!bWasSuccessful)
  105.                     {
  106.                         UE_LOG_ONLINE_ACHIEVEMENTS(Error, TEXT("EOS_Achievements_UnlockAchievements failed with error code (%s)"), ANSI_TO_TCHAR(EOS_EResult_ToString(Data->ResultCode)));
  107.                     }
  108.  
  109.                     FSubsystemUnlockAchievementsCallback* CallbackObj = static_cast<FSubsystemUnlockAchievementsCallback*>(Data->ClientData);
  110.                     check(CallbackObj);
  111.  
  112.                     if (CallbackObj)
  113.                     {
  114.                         CallbackObj->m_Callback.ExecuteIfBound(*CallbackObj->m_PlayerNetId, bWasSuccessful);
  115.  
  116.                         delete CallbackObj;
  117.                     }
  118.                 }
  119.             );
  120.         }
  121.         WriteObject->WriteState = EOnlineAsyncTaskState::Done;
  122.     }
  123. }
Advertisement
Add Comment
Please, Sign In to add comment