// 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;
};