LEAP Documentation 40220
Documentation for the LEAP project
StatsTrackingManager.h
Go to the documentation of this file.
1// Copyright Blue Isle Studios Inc 2018. All Rights Reserved.
2
3#pragma once
4
5#include "CoreMinimal.h"
6#include "PlayerStats.h"
7#include "PlayerStructs.h"
10#include "StatsTrackingManager.generated.h"
11
13class UWeaponInstance;
14
15#define NULLSTRING "";
16
17USTRUCT()
19{
20 GENERATED_USTRUCT_BODY()
22
23 FStatEvent(AProjectXPlayerState* InPlayerState, EStatNames InStatName,UObject* InObject = NULL, int32 InValue = 1, EStatUpdateBehaviour InTag = EStatUpdateBehaviour::NONE, int32 DebugMapType = 0, FString DebugMapName = "");
24
25 TWeakObjectPtr<AProjectXPlayerState> PlayerState = NULL;
26 int32 Value = 0;
29 TWeakObjectPtr<UObject> Object = NULL;
30 int32 DebugMapType = 0;
31 FString DebugMapName = "";
32};
33
34USTRUCT(BlueprintType)
36{
37 GENERATED_USTRUCT_BODY()
39 UPROPERTY(BlueprintReadWrite)
40 int32 Value = 0;
41 UPROPERTY(BlueprintReadWrite)
42 int32 GlobalRank = 0;
43 UPROPERTY(BlueprintReadWrite)
44 int32 FriendRank = 0;
45};
46
47USTRUCT(BlueprintType)
49{
50 GENERATED_USTRUCT_BODY()
52 FLeaderBoardEntry(const FString& PlayerIDIn,const FString& DisplayNameIn, int32 ValueIn, const FString& BannerIDIn, const FString& SteamIDIn, uint16 RankIn)
53 {
54 Value = ValueIn;
55 PlayerID = PlayerIDIn;
56 DisplayName = DisplayNameIn;
57 BannerID = BannerIDIn;
58 SteamID = SteamIDIn;
59 Rank = RankIn;
60 }
61
62 UPROPERTY(BlueprintReadWrite)
63 int32 Value = 0;
64 UPROPERTY(BlueprintReadWrite)
65 FString PlayerID = "";
66 UPROPERTY(BlueprintReadWrite)
67 FString DisplayName = "";
68 UPROPERTY(BlueprintReadWrite)
69 FString BannerID = "";
70 UPROPERTY(BlueprintReadWrite)
71 FString SteamID = "";
72 UPROPERTY(BlueprintReadWrite)
73 int32 Rank = 0;
74 UPROPERTY(BlueprintReadWrite)
75 int32 Level = 0;
76
77 bool operator >(const FLeaderBoardEntry& Other) const
78 {
79 if (Value != Other.Value)
80 {
81 return Value > Other.Value;
82 }
83
84 return true;
85 }
86};
87
89
90DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FChallengesSignature, const FTimedChallenges&, Challenges, const FString&, PlayerID);
91DECLARE_DYNAMIC_MULTICAST_DELEGATE_FourParams(FChallengeClaimedSignature, const FString&, ChallengeID, const FString&, ItemID,int, Experience,int, Currency);
92DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FChallengeProgressSignature, const FString&, ChallengeID, int32, Progress);
93DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FLevelUpEventSignature, const FString&, PlayerID, const FString&, ClassID, int, NewLevel);
94DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FLeaderBoardLoadedSignature, bool, bLoadSuccess);
95DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FStatsSaveLoadedSignature, const FString&, PlayerID);
96DECLARE_DYNAMIC_MULTICAST_DELEGATE(FStatsFinishedLoadingSignature);
97DECLARE_DYNAMIC_MULTICAST_DELEGATE(FStatsTrackingManagerInitializedSignature);
98
99UCLASS(Blueprintable)
100class PROJECTX_API UStatsTrackingManager : public UObject
101{
102 GENERATED_BODY()
103
104public:
105
106 UFUNCTION(BlueprintPure, Category = StatTracking, meta = (WorldContext = "WorldContextObject", CallableWithoutWorldContext))
107 static UStatsTrackingManager* GetStatTrackingManager(const UObject* WorldContextObject);
108 UFUNCTION(BlueprintPure, Category = StatsTracking)
109 int GetStat(const FString& PlayerID, const EStatClassifier StatType, const EStatNames StatName,const FString& StatClassName = "");
110 UFUNCTION(BlueprintPure, Category = StatsTracking)
111 int GetStatDelta(const FString& PlayerID, const EStatClassifier StatType, const EStatNames StatName, const FString& StatClassName = "");
112
113 UFUNCTION(BlueprintCallable, Category = StatsTrackingManager)
114 UStatTrackingSave* GetStatInstance(const FString& PlayerID);
115 UFUNCTION(BlueprintCallable, Category = StatsTrackingManager)
116 void SaveAllInstances();
117 UFUNCTION(BlueprintCallable, Category = StatsTrackingManager)
118 void SaveInstance(const FString& PlayerID,bool bChallengesOnly = false);
119 UFUNCTION(BlueprintCallable,BlueprintPure, Category = StatsTrackingManager)
120 void GetChallenges(const FString& PlayerID,FTimedChallenges& Challenges);
121 UFUNCTION(BlueprintCallable, Category = StatsTracking)
122 UStatTrackingSave* LoadStatInstance(const FString& PlayerID);
123 UFUNCTION(BlueprintCallable, Category = StatsTracking)
124 const FLeaderBoardLocalEntry& GetLocalLeaderboardEntry() { return LocalLeaderboardEntry; }
125 UFUNCTION(BlueprintCallable, Category = StatsTracking)
126 void MarkStatSaveForReload(const FString& PlayerID,bool bAuthorityOnly = false);
127 UFUNCTION(BlueprintCallable)
128 void LoadChallenges(const FString& PlayerID);
129 UFUNCTION(BlueprintCallable)
130 void RerollChallenge(const FString& ChallengeID);
131 UFUNCTION(BlueprintCallable)
132 void ClaimChallenge(const FString& ChallengeID);
133 UFUNCTION(BlueprintCallable)
134 void LoadLeaderBoardForStat(EStatNames Name, EStatClassifier Type, const FString& Class, int NumberOfEntries, int PageNumber,bool bFriendsOnly = false);
135 UFUNCTION(BlueprintCallable)
136 const TMap<int32, FLeaderBoardEntry>& GetLeaderboard() const { return CurrentLeaderboard; };
137 UFUNCTION(BlueprintCallable)
138 bool IsValidStatCheck(EStatClassifier Class, EStatNames Name) const;
139 UFUNCTION(BlueprintCallable,BlueprintPure)
140 bool AreStatsSynced(const FString& PlayerID);
141 UFUNCTION(BlueprintPure)
142 bool HasChallengeReroll() const{ return bHasChallengeReroll;}
143 UFUNCTION()
144 void OnNakamaConnected();
145 UFUNCTION(BlueprintCallable, BlueprintPure)
146 const FString& GetNakamaLocalPlayerID() { return LocalPlayerID; }
147 UFUNCTION()
148 void OnPurchaseEvent(bool bPurchaseSucess, const FString& ItemID);
149 UFUNCTION(BlueprintCallable)
150 void BPUpdateStat(AProjectXPlayerState* PlayerState, EStatNames InStatName);
151 UFUNCTION(BlueprintCallable)
152 bool IsValidLeaderboardPage(int32 PageNumber,int32 Entries) const;
153
154 bool IsAuthoritativeState(EStatNames StatName);
155 void LoadAllStats(const FString& PlayerID,bool bForceReload = false);
156 void LoadAuthoritativeStats(const FString& PlayerID, const TArray<FString>& StatNames, bool bForceReload = false);
157
158 UFUNCTION(BlueprintCallable, Category = "Stats")
159 void LoadRequestedPlayerStats(const FString& PlayerID, const TArray<FString>& StatNames, bool bForceReload);
160
161 void UpdateStat(struct FStatEvent const& StatEvent);
162 void ShotComplete(struct FStatEvent const& StatEvent, const uint16 ID);
163 void UpdateChallengeComplete(const FString& PlayerID, const FString& ChallengeID);
164 void UpdateChallengePredictiveProgressFromChallengeNumber(AProjectXPlayerState* const PlayerState, uint8 ChallengeID);
165 void Init(UProjectXGameInstance* GameInstance);
166 void InitStatType(UStatTrackingSave* Save, const TArray<FString>& ClassNames, EStatClassifier Class);
167 void RemoveStatInstance(const FString& PlayerID);
168 void LoadFriendsLeaderboardResponse(const TArray<TSharedPtr<FJsonValue>>& LeaderboardEntryList);
169 void LeaderboardLoadedResponse(const TArray<TSharedPtr<FJsonValue>>& LeaderboardEntryList);
170 void LoadLeaderBoard(const FString& StatKey, int NumberOfEntries, int PageNumber);
171 void LoadPersonalLeaderBoard(const FString& StatKey);
172 void LoadLeaderBoardForFriends(const FString& StatKey, int PageNumber = 0);
173 void ApplyMatchBonus(AProjectXPlayerState* const PlayerState);
174
175 void CheckAchievementList(const FStatEvent AchievementStatEvent);
176 static FString BuildStatKey(EStatClassifier StatClass, const FString& ClassID, EStatNames StatName);
177 static void ParseStatKey(const FString& Key, EStatClassifier& StatClass, FString& ClassID, EStatNames& StatName);
178 void OverrideAuthoritativeStat(const FString& StatKey, int Value);
179 void ForceLevelToTarget(const FString& StatKey, int Value);
180
181 UPROPERTY(BlueprintAssignable)
182 FChallengesSignature OnChallengesLoadedEvent;
183 UPROPERTY(BlueprintAssignable)
184 FChallengeClaimedSignature OnChallengeClaimedEvent;
185 UPROPERTY(BlueprintAssignable)
186 FChallengeProgressSignature OnChallengeProgressUpdated;
187 UPROPERTY(BlueprintAssignable)
188 FLeaderBoardLoadedSignature OnLeaderBoardLoaded;
189 UPROPERTY(BlueprintAssignable)
190 FLeaderBoardLoadedSignature OnLocalLeaderboardUpdatedEvent;
191 UPROPERTY(BlueprintAssignable)
192 FStatsSaveLoadedSignature OnStatsLoaded;
193 UPROPERTY(BlueprintAssignable)
194 FStatsFinishedLoadingSignature OnStatsFinishedLoading;
195 UPROPERTY(BlueprintAssignable)
196 FStatsSaveLoadedSignature OnAuthoritativeStastLoaded;
197 UPROPERTY(BlueprintAssignable)
198 FLevelUpEventSignature OnPlayerLeveledUp;
199 UPROPERTY(BlueprintAssignable)
200 FStatsTrackingManagerInitializedSignature OnStatsTrackingManagerInitialized;
201
202protected:
203 UPROPERTY()
204 TMap<FString, UStatTrackingSave*> StatSaves = TMap<FString, UStatTrackingSave*>();
205 FTimerHandle RetryConnectionHandle;
206
207 void UpdateChallengeProgressFromStat(TWeakObjectPtr<AProjectXPlayerState> PlayerState,const EStatClassifier ClassType, const EStatNames StatName, const FString& ClassName = "");
208 void InitializeAllStats(UStatTrackingSave* StatSaveObject);
209 void InitializeProgressionStats(UStatTrackingSave* StatSaveObject);
210 void LoadChallengesResponse(TSharedPtr<FJsonObject> FoundChallengesJson,const FString& PlayerID);
211 void CheckForLevelUpAchievement(const int32 Level, AProjectXPlayerState* PlayerState);
212 void SaveStatIntance(UStatTrackingSave* const Save);
213 void SaveChallenges(UStatTrackingSave* const Save);
214 void SaveExperience(UStatTrackingSave* const Save);
215 void ConsumeMatchEndBonus(UStatTrackingSave* const Save);
216 void OnExperienceUpdatedResponse(UStatTrackingSave* const Save, const TArray<TSharedPtr<FJsonValue>>& LevelingResults);
217 void ResetCurrentLeaderboard(const FString& StatKey, bool bFriends);
218 TSharedPtr<FJsonObject> MakeExperienceUpdate(EStatClassifier Classifier, const FString& ClassID, const FString& PlayerID);
219 FString GetGameTypeStringFromEnum(EGameType GameTypeEnum);
220
221 int32 GetChallengNumberFromID(const FString& ChallengeID);
222 const FString& GetChallengeIDFromNumber(int32 Number);
223
224 UFUNCTION(BlueprintPure, Category = "Stats")
225 int32 GetPlayerLevelFromPlayerID(const FString& PlayerID);
226
227 std::string LeaderboardCursor;
228 FString CurrentLeaderboardStatKey = "";
229 int32 HighestLoadedLeaderboardPage = 0;
230
231 TMap<EStatClassifier,TSet<EStatNames>> ValidClassStats;
232 TMap <int32, FLeaderBoardEntry> CurrentLeaderboard;
234 TArray<TSharedPtr<FJsonValue>> LeaderboardEntries;
235
236 bool bFriendsOnlyLoaded = false;
237 FString LocalPlayerID = "";
238
239 FString ChallengeComplete = "VO_ChallengeCompleted";
240
241 TMap<FString, float> AnalyticStatsToSend;
242
243 bool bHasChallengeReroll = false;
244
245 FString EmptyChallengeID = "";
246
247 TArray<FString>ChallengeIDs;
248 TSet<FString> AuthoritativeStats = TSet<FString>();
249 TSet<FString> LeaderboardStats = TSet<FString>();
250};
EStatClassifier
Definition: PlayerStats.h:75
EStatUpdateBehaviour
Definition: PlayerStats.h:142
EStatNames
Definition: PlayerStats.h:86
EGameType
Definition: ProjectXGameState.h:40
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FLeaderBoardLoadedSignature, bool, bLoadSuccess)
DECLARE_DYNAMIC_MULTICAST_DELEGATE_FourParams(FChallengeClaimedSignature, const FString &, ChallengeID, const FString &, ItemID, int, Experience, int, Currency)
DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FLevelUpEventSignature, const FString &, PlayerID, const FString &, ClassID, int, NewLevel)
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FChallengesSignature, const FTimedChallenges &, Challenges, const FString &, PlayerID)
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FStatsFinishedLoadingSignature)
Definition: ProjectXPlayerState.h:238
Definition: ProjectXGameInstance.h:507
Definition: StatTrackingSave.h:124
int32 GetStat(const EStatClassifier &ClassStatType, const FString &ClassName, const EStatNames &StatName)
Definition: StatTrackingSave.cpp:27
FString PlayerID
Definition: StatTrackingSave.h:132
FStatsLoadedSignature OnStatsLoaded
Definition: StatTrackingSave.h:140
void InitStatType(const EStatClassifier &StatClass, const TArray< FString > &ClassNames, const TSet< EStatNames > &StatsToTrack)
Definition: StatTrackingSave.cpp:55
int32 GetStatDelta(const EStatClassifier &ClassStatType, const FString &ClassName, const EStatNames &StatName)
Definition: StatTrackingSave.cpp:38
FTimedChallenges & GetChallenges()
Definition: StatTrackingSave.h:137
Definition: StatsTrackingManager.h:101
Definition: WeaponInstance.h:220
Definition: StatsTrackingManager.h:49
FLeaderBoardEntry(const FString &PlayerIDIn, const FString &DisplayNameIn, int32 ValueIn, const FString &BannerIDIn, const FString &SteamIDIn, uint16 RankIn)
Definition: StatsTrackingManager.h:52
Definition: StatsTrackingManager.h:36
Definition: StatsTrackingManager.h:19
Definition: PlayerStats.h:200