// Copyright (c) Wojciech Figat. All rights reserved. #pragma once #include "Online.h" #include "Engine/Core/Types/Span.h" #include "Engine/Core/Types/String.h" #include "Engine/Core/Types/DateTime.h" /// /// Online platform user presence common states. /// API_ENUM(Namespace="FlaxEngine.Online") enum class OnlinePresenceStates { /// /// User is offline. /// Offline = 0, /// /// User is online. /// Online, /// /// User is online but busy. /// Busy, /// /// User is online but away (no activity for some time). /// Away, }; /// /// Online platform user description. /// API_STRUCT(Namespace="FlaxEngine.Online") struct FLAXENGINE_API OnlineUser { DECLARE_SCRIPTING_TYPE_MINIMAL(OnlineUser); /// /// Unique player identifier. Specific for a certain online platform. /// API_FIELD() Guid Id; /// /// The player name. /// API_FIELD() String Name; /// /// The current player presence state. /// API_FIELD() OnlinePresenceStates PresenceState; }; /// /// Online platform achievement description. /// API_STRUCT(Namespace="FlaxEngine.Online") struct FLAXENGINE_API OnlineAchievement { DECLARE_SCRIPTING_TYPE_MINIMAL(OnlineAchievement); /// /// Unique achievement identifier. Specific for a certain online platform. /// API_FIELD() String Identifier; /// /// Achievement name. Specific for a game. /// API_FIELD() String Name; /// /// The achievement title text. /// API_FIELD() String Title; /// /// The achievement description text. /// API_FIELD() String Description; /// /// True if achievement is hidden from user (eg. can see it once it's unlocked). /// API_FIELD() bool IsHidden = false; /// /// Achievement unlock percentage progress (normalized to 0-100 range). /// API_FIELD() float Progress = 0.0f; /// /// Date and time at which player unlocked the achievement. /// API_FIELD() DateTime UnlockTime = DateTime::MinValue(); }; /// /// Online platform leaderboards sorting modes. /// API_ENUM(Namespace="FlaxEngine.Online") enum class OnlineLeaderboardSortModes { /// /// Don't sort stats. /// None = 0, /// /// Sort ascending, top-score is the lowest number (lower value is better). /// Ascending, /// /// Sort descending, top-score is the highest number (higher value is better). /// Descending, }; /// /// Online platform leaderboards display modes. Defines how leaderboard value should be used. /// API_ENUM(Namespace="FlaxEngine.Online") enum class OnlineLeaderboardValueFormats { /// /// Undefined format. /// Undefined = 0, /// /// Raw numerical score. /// Numeric, /// /// Time in seconds. /// Seconds, /// /// Time in milliseconds. /// Milliseconds, }; /// /// Online platform leaderboard description. /// API_STRUCT(Namespace="FlaxEngine.Online") struct FLAXENGINE_API OnlineLeaderboard { DECLARE_SCRIPTING_TYPE_MINIMAL(OnlineLeaderboard); /// /// Unique leaderboard identifier. Specific for a certain online platform. /// API_FIELD() String Identifier; /// /// Leaderboard name. Specific for a game. /// API_FIELD() String Name; /// /// The leaderboard sorting method. /// API_FIELD() OnlineLeaderboardSortModes SortMode; /// /// The leaderboard values formatting. /// API_FIELD() OnlineLeaderboardValueFormats ValueFormat; /// /// The leaderboard rows count (amount of entries to access). /// API_FIELD() int32 EntriesCount; }; /// /// Online platform leaderboard entry description. /// API_STRUCT(Namespace="FlaxEngine.Online") struct FLAXENGINE_API OnlineLeaderboardEntry { DECLARE_SCRIPTING_TYPE_MINIMAL(OnlineLeaderboardEntry); /// /// The player who holds the entry. /// API_FIELD() OnlineUser User; /// /// The entry rank. Placement of the entry in the leaderboard (starts at 1 for the top-score). /// API_FIELD() int32 Rank; /// /// The entry score set in the leaderboard. /// API_FIELD() int32 Score; }; /// /// Interface for online platform providers for communicating with various multiplayer services such as player info, achievements, game lobby or in-game store. /// API_INTERFACE(Namespace="FlaxEngine.Online") class FLAXENGINE_API IOnlinePlatform { DECLARE_SCRIPTING_TYPE_MINIMAL(IOnlinePlatform); /// /// Finalizes an instance of the class. /// virtual ~IOnlinePlatform() = default; /// /// Initializes the online platform services. /// /// Called only by Online system. /// True if failed, otherwise false. API_FUNCTION() virtual bool Initialize() = 0; /// /// Shutdowns the online platform services. /// /// Called only by Online system. Can be used to destroy the object. API_FUNCTION() virtual void Deinitialize() = 0; public: /// /// Logins the local user into the online platform. /// /// The local user (null if use default one). /// True if failed, otherwise false. API_FUNCTION() virtual bool UserLogin(User* localUser = nullptr) = 0; /// /// Logout the local user from the online platform. /// /// The local user (null if use default one). /// True if failed, otherwise false. API_FUNCTION() virtual bool UserLogout(User* localUser = nullptr) = 0; /// /// Checks if the local user is logged in. /// /// The local user (null if use default one). /// True if user is logged, otherwise false. API_FUNCTION() virtual bool GetUserLoggedIn(User* localUser = nullptr) = 0; /// /// Gets the player from the online platform. /// /// The local player user info. /// The local user (null if use default one). /// True if failed, otherwise false. API_FUNCTION() virtual bool GetUser(API_PARAM(Out) OnlineUser& user, User* localUser = nullptr) = 0; /// /// Gets the list of friends of the user from the online platform. /// /// The result local player friends user infos. /// The local user (null if use default one). /// True if failed, otherwise false. API_FUNCTION() virtual bool GetFriends(API_PARAM(Out) Array& friends, User* localUser = nullptr) = 0; public: /// /// Gets the list of all achievements for this game. /// /// The result achievements list /// The local user (null if use default one). /// True if failed, otherwise false. API_FUNCTION() virtual bool GetAchievements(API_PARAM(Out) Array& achievements, User* localUser = nullptr) = 0; /// /// Unlocks the achievement. /// /// The achievement name. Specific for a game. /// The local user (null if use default one). /// True if failed, otherwise false. API_FUNCTION() virtual bool UnlockAchievement(const StringView& name, User* localUser = nullptr) = 0; /// /// Updates the achievement unlocking progress (in range 0-100). /// /// The achievement name. Specific for a game. /// The achievement unlock progress (in range 0-100). /// The local user (null if use default one). /// True if failed, otherwise false. API_FUNCTION() virtual bool UnlockAchievementProgress(const StringView& name, float progress, User* localUser = nullptr) = 0; #if !BUILD_RELEASE /// /// Resets the all achievements progress for this game. /// /// The local user (null if use default one). /// True if failed, otherwise false. API_FUNCTION() virtual bool ResetAchievements(User* localUser = nullptr) = 0; #endif public: /// /// Gets the online statistical value. /// /// The stat name. /// The result value. /// The local user (null if use default one). /// True if failed, otherwise false. API_FUNCTION() virtual bool GetStat(const StringView& name, API_PARAM(Out) float& value, User* localUser = nullptr) = 0; /// /// Sets the online statistical value. /// /// The stat name. /// The value. /// The local user (null if use default one). /// True if failed, otherwise false. API_FUNCTION() virtual bool SetStat(const StringView& name, float value, User* localUser = nullptr) = 0; public: /// /// Gets the online leaderboard. /// /// The leaderboard name. /// The result value. /// The local user (null if use default one). /// True if failed, otherwise false. API_FUNCTION() virtual bool GetLeaderboard(const StringView& name, API_PARAM(Out) OnlineLeaderboard& value, User* localUser = nullptr) { return true; } /// /// Gets or creates the online leaderboard. It will not create it if already exists. /// /// The leaderboard name. /// The leaderboard sorting mode. /// The leaderboard values formatting. /// The result value. /// The local user (null if use default one). /// True if failed, otherwise false. API_FUNCTION() virtual bool GetOrCreateLeaderboard(const StringView& name, OnlineLeaderboardSortModes sortMode, OnlineLeaderboardValueFormats valueFormat, API_PARAM(Out) OnlineLeaderboard& value, User* localUser = nullptr) { return true; } /// /// Gets the online leaderboard entries. Allows to specify the range for ranks to gather. /// /// The leaderboard. /// The list of result entries. /// The zero-based index to start downloading entries from. For example, to display the top 10 on a leaderboard pass value of 0. /// The amount of entries to read, starting from the first entry at . /// True if failed, otherwise false. API_FUNCTION() virtual bool GetLeaderboardEntries(const OnlineLeaderboard& leaderboard, API_PARAM(Out) Array& entries, int32 start = 0, int32 count = 10) { return true; } /// /// Gets the online leaderboard entries around the player. Allows to specify the range for ranks to gather around the user rank. The current user's entry is always included. /// /// The leaderboard. /// The list of result entries. /// The zero-based index to start downloading entries relative to the user. For example, to display the 4 higher scores on a leaderboard pass value of -4. Value 0 will return current user as the first one. /// The amount of entries to read, starting from the first entry at . /// True if failed, otherwise false. API_FUNCTION() virtual bool GetLeaderboardEntriesAroundUser(const OnlineLeaderboard& leaderboard, API_PARAM(Out) Array& entries, int32 start = -4, int32 count = 10) { return true; } /// /// Gets the online leaderboard entries for player friends. /// /// The leaderboard. /// The list of result entries. /// True if failed, otherwise false. API_FUNCTION() virtual bool GetLeaderboardEntriesForFriends(const OnlineLeaderboard& leaderboard, API_PARAM(Out) Array& entries) { return true; } /// /// Gets the online leaderboard entries for an arbitrary set of users. /// /// The leaderboard. /// The list of result entries. /// The list of users to read their ranks on the leaderboard. /// True if failed, otherwise false. API_FUNCTION() virtual bool GetLeaderboardEntriesForUsers(const OnlineLeaderboard& leaderboard, API_PARAM(Out) Array& entries, const Array& users) { return true; } /// /// Sets the online leaderboard entry for the user. /// /// The leaderboard. /// The score value to set. /// True if store value only if it's better than existing value (if any), otherwise will override any existing score for that user. /// True if failed, otherwise false. API_FUNCTION() virtual bool SetLeaderboardEntry(const OnlineLeaderboard& leaderboard, int32 score, bool keepBest = false) { return true; } public: /// /// Gets the online savegame data. Returns empty if savegame slot is unused. /// /// The savegame slot name. /// The result data. Empty or null for unused slot name. /// The local user (null if use default one). /// True if failed, otherwise false. API_FUNCTION() virtual bool GetSaveGame(const StringView& name, API_PARAM(Out) Array& data, User* localUser = nullptr) = 0; /// /// Sets the online savegame data. /// /// The savegame slot name. /// The data. Empty or null to delete slot (or mark as unused). /// The local user (null if use default one). /// True if failed, otherwise false. API_FUNCTION() virtual bool SetSaveGame(const StringView& name, const Span& data, User* localUser = nullptr) = 0; };