// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "OnlineSubsystemTypes.h" #include "OnlineKeyValuePair.h" #define UE_API ONLINESUBSYSTEM_API // typedef FOnlineKeyValuePairs FStatsColumnArray; // Temporary class to assist in deprecation of changing the key from FName to FString. After the deprecation period, the class will be deleted and replaced by the line above. /** Representation of a single column and its data */ class FStatsColumnArray : public FOnlineKeyValuePairs { typedef FOnlineKeyValuePairs Super; public: FORCEINLINE FStatsColumnArray() {} FORCEINLINE FStatsColumnArray(FStatsColumnArray&& Other) : Super(MoveTemp(Other)) {} FORCEINLINE FStatsColumnArray(const FStatsColumnArray& Other) : Super(Other) {} FORCEINLINE FStatsColumnArray& operator=(FStatsColumnArray&& Other) { Super::operator=(MoveTemp(Other)); return *this; } FORCEINLINE FStatsColumnArray& operator=(const FStatsColumnArray& Other) { Super::operator=(Other); return *this; } UE_DEPRECATED(5.5, "FStatsColumnArray now uses FString for the key type instead of FName") FStatsColumnArray(const FOnlineKeyValuePairs< FName, FVariantData >& DeprecatedValues) { Reserve(DeprecatedValues.Num()); for (const TPair< FName, FVariantData >& DeprecatedValue : DeprecatedValues) { Super::Emplace(DeprecatedValue.Key.ToString(), DeprecatedValue.Value); } } UE_DEPRECATED(5.5, "FStatsColumnArray now uses FString for the key type instead of FName") FStatsColumnArray(FOnlineKeyValuePairs< FName, FVariantData >&& DeprecatedValues) { Reserve(DeprecatedValues.Num()); for (TPair< FName, FVariantData >& DeprecatedValue : DeprecatedValues) { Super::Emplace(DeprecatedValue.Key.ToString(), MoveTemp(DeprecatedValue.Value)); } } using Super::Add; UE_DEPRECATED(5.5, "FStatsColumnArray now uses FString for the key type instead of FName") FVariantData& Add(const FName& InKey, const FVariantData& InValue) { return Super::Add(InKey.ToString(), InValue); } using Super::Emplace; UE_DEPRECATED(5.5, "FStatsColumnArray now uses FString for the key type instead of FName") FVariantData& Emplace(const FName& InKey, const FVariantData& InValue) { return Super::Emplace(InKey.ToString(), InValue); } using Super::Find; UE_DEPRECATED(5.5, "FStatsColumnArray now uses FString for the key type instead of FName") FVariantData* Find(const FName& InKey) { return Super::Find(InKey.ToString()); } }; // typedef FOnlineKeyValuePairs FStatPropertyArray; // Temporary class to assist in deprecation of changing the key from FName to FString. After the deprecation period, the class will be deleted and replaced by the line above. /** Representation of a single stat value to post to the backend */ class FStatPropertyArray : public FOnlineKeyValuePairs { typedef FOnlineKeyValuePairs Super; public: FORCEINLINE FStatPropertyArray() {} FORCEINLINE FStatPropertyArray(FStatPropertyArray&& Other) : Super(MoveTemp(Other)) {} FORCEINLINE FStatPropertyArray(const FStatPropertyArray& Other) : Super(Other) {} FORCEINLINE FStatPropertyArray& operator=(FStatPropertyArray&& Other) { Super::operator=(MoveTemp(Other)); return *this; } FORCEINLINE FStatPropertyArray& operator=(const FStatPropertyArray& Other) { Super::operator=(Other); return *this; } UE_DEPRECATED(5.5, "FStatPropertyArray now uses FString for the key type instead of FName") FStatPropertyArray(const FOnlineKeyValuePairs< FName, FVariantData >& DeprecatedValues) { Reserve(DeprecatedValues.Num()); for (const TPair< FName, FVariantData >& DeprecatedValue : DeprecatedValues) { Super::Emplace(DeprecatedValue.Key.ToString(), DeprecatedValue.Value); } } UE_DEPRECATED(5.5, "FStatPropertyArray now uses FString for the key type instead of FName") FStatPropertyArray(FOnlineKeyValuePairs< FName, FVariantData >&& DeprecatedValues) { Reserve(DeprecatedValues.Num()); for (TPair< FName, FVariantData >& DeprecatedValue : DeprecatedValues) { Super::Emplace(DeprecatedValue.Key.ToString(), MoveTemp(DeprecatedValue.Value)); } } using Super::Add; UE_DEPRECATED(5.5, "FStatPropertyArray now uses FString for the key type instead of FName") FVariantData& Add(const FName& InKey, const FVariantData& InValue) { return Super::Add(InKey.ToString(), InValue); } using Super::Emplace; UE_DEPRECATED(5.5, "FStatPropertyArray now uses FString for the key type instead of FName") FVariantData& Emplace(const FName& InKey, const FVariantData& InValue) { return Super::Emplace(InKey.ToString(), InValue); } using Super::Find; UE_DEPRECATED(5.5, "FStatPropertyArray now uses FString for the key type instead of FName") FVariantData* Find(const FName& InKey) { return Super::Find(InKey.ToString()); } }; class FNameArrayDeprecationWrapper : public TArray { typedef TArray Super; public: FORCEINLINE FNameArrayDeprecationWrapper() {} FORCEINLINE FNameArrayDeprecationWrapper(FNameArrayDeprecationWrapper&& Other) : Super(MoveTemp(Other)) {} FORCEINLINE FNameArrayDeprecationWrapper(const FNameArrayDeprecationWrapper& Other) : Super(Other) {} FORCEINLINE FNameArrayDeprecationWrapper& operator=(FNameArrayDeprecationWrapper&& Other) { Super::operator=(MoveTemp(Other)); return *this; } FORCEINLINE FNameArrayDeprecationWrapper& operator=(const FNameArrayDeprecationWrapper& Other) { Super::operator=(Other); return *this; } FORCEINLINE FNameArrayDeprecationWrapper(TArray&& Other) : Super(MoveTemp(Other)) {} FORCEINLINE FNameArrayDeprecationWrapper(const TArray& Other) : Super(Other) {} FORCEINLINE FNameArrayDeprecationWrapper& operator=(TArray&& Other) { Super::operator=(MoveTemp(Other)); return *this; } FORCEINLINE FNameArrayDeprecationWrapper& operator=(const TArray& Other) { Super::operator=(Other); return *this; } using Super::Add; UE_DEPRECATED(5.5, "This variable is now a TArray instead of a TArray.") int32 Add(const FName& InElement) { return Super::Add(InElement.ToString()); } using Super::Emplace; UE_DEPRECATED(5.5, "This variable is now a TArray instead of a TArray.") int32 Emplace(const FName& InElement) { return Super::Emplace(InElement.ToString()); } }; class FNameDeprecationWrapper : public FString { typedef FString Super; public: FORCEINLINE FNameDeprecationWrapper() {} FORCEINLINE FNameDeprecationWrapper(FNameDeprecationWrapper&& Other) : Super(MoveTemp(Other)) {} FORCEINLINE FNameDeprecationWrapper(const FNameDeprecationWrapper& Other) : Super(Other) {} FORCEINLINE FNameDeprecationWrapper& operator=(FNameDeprecationWrapper&& Other) { Super::operator=(MoveTemp(Other)); return *this; } FORCEINLINE FNameDeprecationWrapper& operator=(const FNameDeprecationWrapper& Other) { Super::operator=(Other); return *this; } FORCEINLINE FNameDeprecationWrapper(FString&& Other) : Super(MoveTemp(Other)) {} FORCEINLINE FNameDeprecationWrapper(const FString& Other) : Super(Other) {} FORCEINLINE FNameDeprecationWrapper& operator=(FString&& Other) { Super::operator=(MoveTemp(Other)); return *this; } FORCEINLINE FNameDeprecationWrapper& operator=(const FString& Other) { Super::operator=(Other); return *this; } UE_DEPRECATED(5.5, "This variable is now an FString instead of an FName.") FORCEINLINE FNameDeprecationWrapper(FName&& DeprecatedValue) : Super(DeprecatedValue.ToString()) {} UE_DEPRECATED(5.5, "This variable is now an FString instead of an FName.") FORCEINLINE FNameDeprecationWrapper(const FName& DeprecatedValue) : Super(DeprecatedValue.ToString()) {} UE_DEPRECATED(5.5, "This variable is now an FString instead of an FName.") FORCEINLINE FNameDeprecationWrapper& operator=(FName&& DeprecatedValue) { Super::operator=(DeprecatedValue.ToString()); return *this; } UE_DEPRECATED(5.5, "This variable is now an FString instead of an FName.") FORCEINLINE FNameDeprecationWrapper& operator=(const FName& DeprecatedValue) { Super::operator=(DeprecatedValue.ToString()); return *this; } UE_DEPRECATED(5.5, "This variable is now an FString instead of an FName.") FORCEINLINE FString ToString() const { return *this; } UE_DEPRECATED(5.5, "This variable is now an FString instead of an FName.") FORCEINLINE void ToString(FString& Out) const { Out = *this; } }; /** * An interface used to collect and manage online stats */ class FOnlineStats { public: /** Array of stats we are gathering */ FStatPropertyArray Properties; /** * Get a key value pair by key name * @param StatName key name to search for * @return KeyValuePair if found, NULL otherwise */ UE_API class FVariantData* FindStatByName(const FString& StatName); /** * Sets a stat of type SDT_Float to the value specified. Does nothing * if the stat is not of the right type. * * @param StatName the stat to change the value of * @param Value the new value to assign to the stat */ UE_API virtual void SetFloatStat(const FString& StatName, float Value); /** * Sets a stat of type SDT_Int to the value specified. Does nothing * if the stat is not of the right type. * * @param StatName the stat to change the value of * @param Value the new value to assign to the stat */ UE_API virtual void SetIntStat(const FString& StatName, int32 Value); /** * Increments a stat of type float by the value specified. Does nothing * if the stat is not of the right type. * * @param StatName the stat to increment * @param IncBy the value to increment by */ UE_API virtual void IncrementFloatStat(const FString& StatName, float IncBy = 1.0f); /** * Increments a stat of type int32 by the value specified. Does nothing * if the stat is not of the right type. * * @param StatName the stat to increment * @param IncBy the value to increment by */ UE_API virtual void IncrementIntStat(const FString& StatName, int32 IncBy = 1); /** * Decrements a stat of type float by the value specified. Does nothing * if the stat is not of the right type. * * @param StatName the stat to decrement * @param DecBy the value to decrement by */ UE_API virtual void DecrementFloatStat(const FString& StatName, float DecBy = 1.0f); /** * Decrements a stat of type int32 by the value specified. Does nothing * if the stat is not of the right type. * * @param StatName the stat to decrement * @param DecBy the value to decrement by */ UE_API virtual void DecrementIntStat(const FString& StatName, int32 DecBy = 1); UE_DEPRECATED(5.5, "Use the FString overload instead") FVariantData* FindStatByName(const FName& StatName) { return FindStatByName(StatName.ToString()); } UE_DEPRECATED(5.5, "Use the FString overload instead") virtual void SetFloatStat(const FName& StatName, float Value) { SetFloatStat(StatName.ToString(), Value); } UE_DEPRECATED(5.5, "Use the FString overload instead") virtual void SetIntStat(const FName& StatName, int32 Value) { SetIntStat(StatName.ToString(), Value); } UE_DEPRECATED(5.5, "Use the FString overload instead") virtual void IncrementFloatStat(const FName& StatName, float IncBy = 1.0f) { IncrementFloatStat(StatName.ToString(), IncBy); } UE_DEPRECATED(5.5, "Use the FString overload instead") virtual void IncrementIntStat(const FName& StatName, int32 IncBy = 1) { IncrementIntStat(StatName.ToString(), IncBy); } UE_DEPRECATED(5.5, "Use the FString overload instead") virtual void DecrementFloatStat(const FName& StatName, float DecBy = 1.0f) { DecrementFloatStat(StatName.ToString(), DecBy); } UE_DEPRECATED(5.5, "Use the FString overload instead") virtual void DecrementIntStat(const FName& StatName, int32 DecBy = 1) { DecrementIntStat(StatName.ToString(), DecBy); } /** * Destructor */ virtual ~FOnlineStats() { /** no-op */ } }; /** * Interface for storing/writing data to a leaderboard */ class FOnlineLeaderboardWrite : public FOnlineStats { public: /** Sort Method */ ELeaderboardSort::Type SortMethod; /** Display Type */ ELeaderboardFormat::Type DisplayFormat; /** Update Method */ ELeaderboardUpdateMethod::Type UpdateMethod; /** Names of the leaderboards to write to */ FNameArrayDeprecationWrapper LeaderboardNames; /** Name of the stat that the leaderboard is rated by */ FNameDeprecationWrapper RatedStat; FOnlineLeaderboardWrite() : SortMethod(ELeaderboardSort::None), DisplayFormat(ELeaderboardFormat::Number), UpdateMethod(ELeaderboardUpdateMethod::KeepBest) { } }; /** * Representation of a single row in a retrieved leaderboard */ struct FOnlineStatsRow { private: /** Hidden on purpose */ FOnlineStatsRow() : NickName() {} public: /** Name of player in this row */ const FString NickName; /** Unique Id for the player in this row */ const FUniqueNetIdPtr PlayerId; /** Player's rank in this leaderboard */ int32 Rank; /** All requested data on the leaderboard for this player */ FStatsColumnArray Columns; FOnlineStatsRow(const FString& InNickname, const FUniqueNetIdRef& InPlayerId) : NickName(InNickname), PlayerId(InPlayerId) { } FString ToLogString() const; }; /** * Representation of a single column of data in a leaderboard */ struct FColumnMetaData { private: FColumnMetaData() : DataType(EOnlineKeyValuePairDataType::Empty) {} public: /** Name of the column to retrieve */ const FNameDeprecationWrapper ColumnName; /** Type of data this column represents */ const EOnlineKeyValuePairDataType::Type DataType; UE_DEPRECATED(5.5, "Use the FString overload instead") FColumnMetaData(const FName InColumnName, EOnlineKeyValuePairDataType::Type InDataType) : ColumnName(InColumnName.ToString()), DataType(InDataType) { } FColumnMetaData(const FString& InColumnName, EOnlineKeyValuePairDataType::Type InDataType) : ColumnName(InColumnName), DataType(InDataType) { } }; /** * Interface for reading data from a leaderboard service */ class FOnlineLeaderboardRead { public: /** Name of the leaderboard read */ FNameDeprecationWrapper LeaderboardName; /** Column this leaderboard is sorted by */ FNameDeprecationWrapper SortedColumn; /** Column metadata for this leaderboard */ TArray ColumnMetadata; /** Array of ranked users retrieved (not necessarily sorted yet) */ TArray Rows; /** Indicates an error reading data occurred while processing */ EOnlineAsyncTaskState::Type ReadState; FOnlineLeaderboardRead() : ReadState(EOnlineAsyncTaskState::NotStarted) { } /** * Retrieve a single record from the leaderboard for a given user * * @param UserId user id to retrieve a record for * @return the requested user row or NULL if not found */ FOnlineStatsRow* FindPlayerRecord(const FUniqueNetId& UserId) { for (int32 UserIdx=0; UserIdx FOnlineLeaderboardReadRef; typedef TSharedPtr FOnlineLeaderboardReadPtr; // TODO ONLINE class FOnlinePlayerScore { }; /** * The interface for writing achievement stats to the server. */ class FOnlineAchievementsWrite : public FOnlineStats { public: /** * Constructor */ FOnlineAchievementsWrite() : WriteState(EOnlineAsyncTaskState::NotStarted) { } /** Indicates an error reading data occurred while processing */ EOnlineAsyncTaskState::Type WriteState; }; typedef TSharedRef FOnlineAchievementsWriteRef; typedef TSharedPtr FOnlineAchievementsWritePtr; #undef UE_API