SSO/External authentication
Nintendo Switch
PlayStation™ Network
+PlayStation™Network
Steam
@@ -2367,12 +2393,15 @@SSO/External authentication
Xbox Live
Oculus
+OpenID
diff --git a/Config/Defaultmodio.ini b/Config/Defaultmodio.ini index f185736..d13f503 100644 --- a/Config/Defaultmodio.ini +++ b/Config/Defaultmodio.ini @@ -3,4 +3,7 @@ +PropertyRedirects=(OldName="/Script/ModioUI5.ModioCommonUISettings.FeaturedAdditionalParams",NewName="/Script/ModioUI5.ModioCommonUISettings.FeaturedParams") +PackageRedirects=(OldName="/Script/ModioUI5", NewName="/Script/ModioUI") +FunctionRedirects=(OldName="/Script/ModioUICore.ModioUISubsystem.ExecuteOnModBrowserClosedDelegate",NewName="/Script/ModioUICore.ModioUISubsystem.ExecuteOnModBrowserCloseRequestedDelegate") -+PropertyRedirects=(OldName="ModioUISubsystem.ShowModBrowserUIForPlayer.BrowserClosedDelegate",NewName="OnModBrowserCloseRequestedDelegate") \ No newline at end of file ++PropertyRedirects=(OldName="ModioUISubsystem.ShowModBrowserUIForPlayer.BrowserClosedDelegate",NewName="OnModBrowserCloseRequestedDelegate") ++ClassRedirects=(OldName="/Script/Modio.ModioMapPreview",NewName="/Script/Modio.ModioModChangeMap") ++ClassRedirects=(OldName="/Script/Modio.ModioOptionalMapPreview",NewName="/Script/Modio.ModioOptionalModChangeMap") + diff --git a/Content/Data/ST_ModioStaticLocData.uasset b/Content/Data/ST_ModioStaticLocData.uasset new file mode 100644 index 0000000..b51f032 Binary files /dev/null and b/Content/Data/ST_ModioStaticLocData.uasset differ diff --git a/Content/ST_ModioStaticLocData.uasset b/Content/ST_ModioStaticLocData.uasset new file mode 100644 index 0000000..5913a5a Binary files /dev/null and b/Content/ST_ModioStaticLocData.uasset differ diff --git a/Doc/documentation.html b/Doc/documentation.html index 4934642..538e41e 100644 --- a/Doc/documentation.html +++ b/Doc/documentation.html @@ -838,6 +838,19 @@
When you are ready to initialize the plugin for the current user, you’ll need to call InitializeAsync, passing in an instance of FModioInitializeOptions
, and a delegate so you know when the plugin is initialized correctly. Here, you can specify your Game ID, API Key, Environment, and Portal. You can get the default portal for the current platform using Get Default Portal for Current Platform function.
When you are ready to initialize the plugin for the current user, you’ll need to call InitializeAsync, passing in an instance of FModioInitializeOptions
, and a delegate so you know when the plugin is initialized correctly. Here, you can specify your Game ID, API Key, Environment, and Portal. You can get the default portal for the current platform using Get Default Portal for Current Platform function.
Nintendo Switch
PlayStation™ Network
+PlayStation™Network
Steam
@@ -2367,12 +2393,15 @@Xbox Live
Oculus
+OpenID
Please note that the ability to authenticate players using OpenID is feature for advanced partners only. If you are interested in becoming an advanced partner, please contact developers@mod.io
+Please note that the ability to authenticate players using OpenID is a premium feature. If you are interested in mod.io premium features, please contact developers@mod.io.
To use SSO with mod.io, a user must have accepted the mod.io Terms of Use in order to create an account.
@@ -3317,6 +3346,212 @@The Mod.io Unreal Engine Plugin supports a range of Monetization features, allowing you to sell a per-game virtual currency to your players that they can use to purchase mods, with a share of the revenue split between creators and your studio. Visit here for an overview of the mod.io monetization system.
+Every platform requires specific setup for monetization features to work, with regards to the virtual currency configuration and API calls, however the following documentation is generically applicable, with only small differences per-platform that are documented within the platform-specific monetization documentation.
+The mod.io monetization features are enabled as part of the onboarding process on your game profile. Once that is setup, there is nothing further you need to do for initialization in the Plugin.
+Ensure that you have set the appropriate Portal when initializing the SDK for the portal you are using for purchasing - for instance, on Steam, you must initialize with Modio::Portal::Steam in order to redeem entitlements for Steam.
+On startup, you can make a call to UModioSubsystem::GetUserWalletBalanceAsync
to get the balance of the current user’s wallet. If no wallet exists for the user, one will be created for them automatically. This call returns the users wallet balance for the current game. The only time you need to make this call is on startup.
We recommend that you cache the value of this result in your game code rather than making consistent calls to UModioSubsystem::GetUserWalletBalanceAsync
and update your local state from the return values of other calls that affect wallet balance.
void UModioManager::GetUserWallet()
+{
+ if (GEngine->GetEngineSubsystem<UModioSubsystem>())
+ {
+ GEngine->GetEngineSubsystem<UModioSubsystem>()->GetUserWalletBalanceAsync(FOnGetUserWalletBalanceDelegate::CreateUObject(this, &UModioManager::OnGetUserWalletCallback));
+ }
+}
+
+void UModioManager::OnGetUserWalletCallback(FModioErrorCode ErrorCode, FModioOptionalUInt64 WalletBalance)
+{
+ if (ErrorCode == false)
+ {
+ // Wallet Balance Successfully Retrieved
+ }
+}
+As part UModioSubsystem::ListAllModsAsync
, you can include an additional filter for whether you list paid mods. By default, only free mods are shown, but you can set RevenueType
on the [ModioFilterParams](#ModioFilterParams) object passed to UModioSubsystem::ListAllModsAsync
to include free and paid content, or just paid content. All mods returned will have a Price
property, indicating the virtual currency price that must be paid in order to purchase.
Currently filtering for Paid/Unpaid content is not exposed to Blueprint.
+You can call UModioSubsystem::PurchaseModAsync
to purchase a given mod. PurchaseModAsync takes two parameters = the ModID of the mod to purchase, and the ExpectedPrice, which is the price displayed to the user from UModioSubsystem::ListAllModsAsync
. You must include this parameter for safety, so the user is not charged more or less than the price displayed to them in case the price of the mod has changed between the call to ListAllModsAsync and purchase time.
Once a mod is purchased, it is automatically subscribed to for the user.
+You should validate that the user has enough virtual currency to make the purchase by comparing it to the balance you received from UModioSubsystem::GetUserWalletBalanceAsync
. Note this is purely for user experience (ie for graying out the purchase button in the UI, or upselling the user a virtual currenct pack), and UModioSubsystem::PurchaseModAsync
will return an error if the user does not have enough in their wallet.
The updated wallet balance after the purchase amount is subtracted is returned in the callback of UModioSubsystem::PurchaseModAsync
.
void UModioManager::PurchaseMod(FModioModID ModId, FModioUnsigned64 ExpectedPrice)
+{
+ if (GEngine->GetEngineSubsystem<UModioSubsystem>())
+ {
+ GEngine->GetEngineSubsystem<UModioSubsystem>()->PurchaseModAsync(ModId, ExpectedPrice, FOnPurchaseModDelegate::CreateUObject(this, &UModioManager::OnPurchaseModCallback));
+ }
+}
+
+void UModioManager::OnPurchaseModCallback(FModioErrorCode ErrorCode, FModioOptionalTransactionRecord Transaction)
+{
+ if (ErrorCode == false)
+ {
+ // Mod Purchase Successful
+ }
+}
+Even though all purchased mods are automatically subscribed, the user can still unsubscribe from them and uninstall them; however, they still remain owned and purchased by the user. They must re-subscribe to the mod in order to have it installed. This is facilitated by UModioSubsystem::FetchUserPurchasesAsync
, which will fetch a list of a users purchased mods. After a successful call, you can then display them with UModioSubsystem::QueryUserPurchasedMods
, allowing re-subscription if necessary.
void UModioManager::FetchUserPurchases()
+{
+ if (GEngine->GetEngineSubsystem<UModioSubsystem>())
+ {
+ GEngine->GetEngineSubsystem<UModioSubsystem>()->FetchUserPurchasesAsync(FOnFetchUserPurchasesDelegate::CreateUObject(this, &UModioManager::OnFetchUserPurchasesCallback));
+ }
+}
+
+void UModioManager::OnFetchUserPurchasesCallback(FModioErrorCode ErrorCode)
+{
+ if (ErrorCode == false)
+ {
+ // Purchases Successfully Fetched
+ if (GEngine->GetEngineSubsystem<UModioSubsystem>())
+ {
+ // We can now access the list of purchased mods directly
+ TMap<FModioModID, FModioModInfo> PurchasedMods = GEngine->GetEngineSubsystem<UModioSubsystem>()->QueryUserPurchasedMods();
+ }
+ }
+}
+User Delegation Tokens can be used by a backend server for S2S (Server to Server) transactions/functionality. You can get one for the current user by calling UModioSubsystem::GetUserDelegationTokenAsync
, the callback for which contains the Token as a FString
.
void UModioManager::GetUserDelegationToken()
+{
+ if (GEngine->GetEngineSubsystem<UModioSubsystem>())
+ {
+ GEngine->GetEngineSubsystem<UModioSubsystem>()->GetUserDelegationTokenAsync(FOnGetUserDelegationTokenDelegateFast::CreateUObject(this, &UModioManager::OnGetUserDelegationTokenCallback));
+ }
+}
+
+void UModioManager::OnGetUserDelegationTokenCallback(FModioErrorCode ErrorCode, FString UserDelegationToken)
+{
+ if (ErrorCode == false)
+ {
+ // Successfully got User Delegation Token
+ }
+}
+Locale
Language to set
void K2_GetUserDerivedTokenAsync(FOnGetUserDerivedTokenDelegate Callback)
+void K2_GetUserDelegationTokenAsync(FOnGetUserDelegationTokenDelegate Callback)
Get a User Derived Token that can be used for S2S service calls
+Get a User Delegation Token that can be used for S2S service calls
EModioLanguage K2_GetLanguage()
+Get the currently applied language
+Target |
+Modio Subsystem Object Reference |
+
Return Value |
+Current language |
+
Current language
+Error code indicating the status of the TempModSet. Will be empty if it was successful
Error code indicating the status of the TempModSet. Will be empty if it was successful
Checks if the automatic management process is currently installing or removing mods
True if automatic management is currently performing an operation
Collection of FModioValidationError objects, or empty collection if there were no validation failures
Disables automatic installation or uninstallation of mods based on the user’s subscriptions. Allows currently processing installation to complete; will cancel any pending operations when called.
Array with its corresponding info tags
Call this to pass in a delegate that will receive operation state change notifications
Size of the file in bytes. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ | FilesizeUncompressed |
+Total size of all files in the mod after installation. |
+|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Filename |
Filename including extension. |
@@ -15082,7 +15360,7 @@
+ | PresetName |
++ |
+ | Tags |
++ |
+ | ExcludedTags |
++ |
+ | Direction |
++ |
+ | SortField |
++ |
+ | Count |
++ |
ImagePath |
@@ -15226,7 +15548,7 @@ |
+ | Changes |
++ |
ModName |
+ | |
+ | DateAdded |
++ |
+ | DateUpdated |
++ |
+ | DependencyDepth |
++ |
+ | Logo |
++ |
+ | FileInfo |
++ |
+ | Status |
++ |
+ | Visibility |
++ |
InternalList |
+ | |
+ | TotalFilesize |
++ |
+ | TotalFilesizeUncompressed |
++ |
ManageLink |
Link to the mod.io Manage User Account page |
+|
+ | TermsText |
+The plaintext version of the mod.io terms of use |
+
- | TabId |
++ | ModMemory |
- | TabText |
++ | ErrorCode |
|
- | TabButtonType |
++ | NotificationContextObject |
|
- | TabButtonStyle |
++ | Duration |
- | CharacterBorderBrushBase |
++ | CategoryName |
|
- | CharacterBorderBrushFocused |
++ | Tags |
|
- | CharacterBorderPadding |
++ | ExcludedTags |
|
- | FakeCaretBrush |
++ | Direction |
|
- | FakeCaretHorizontalAlignment |
++ | SortField |
|
- | FakeCaretVerticalAlignment |
++ | Count |
|
- | CharacterPadding |
++ | SearchKeywords |
|
- | CharacterSpacing |
++ | InstalledField |
|
- | MinimumCharacterWidth |
++ | QueuedField |
|
- | HintText |
++ | EnabledFilter |
|
+ | + | ManualSortField |
++ |
+ | TabId |
++ |
+ | TabText |
++ |
+ | TabButtonType |
++ |
+ | TabButtonStyle |
++ |
+ | CharacterBorderBrushBase |
++ | |
+ | CharacterBorderBrushFocused |
++ | |
+ | CharacterBorderPadding |
++ | |
+ | FakeCaretBrush |
++ | |
+ | FakeCaretHorizontalAlignment |
++ | |
+ | FakeCaretVerticalAlignment |
++ | |
+ | CharacterPadding |
++ | |
+ | CharacterSpacing |
++ | |
+ | MinimumCharacterWidth |
++ | |
+ | HintText |
++ | |
Font |
- | ErrorCode |
-- |
- | NotificationContextObject |
-- |
- | Duration |
-- |
- | CategoryName |
-- |
- | Tags |
-- |
- | ExcludedTags |
-- |
- | Direction |
-- |
- | SortField |
-- |
- | Count |
-- |
- | SearchKeywords |
-- |
- | InstalledField |
-- |
- | QueuedField |
-- |
- | EnabledFilter |
-- |
- | ManualSortField |
-- |
Changes the session identifier for the provided set of initialization options
New Initialization Options object with the session identifier set to the desired value
Changes the portal for the provided set of initialization options
New Initialization Options object with the portal set to the desired value
Compares two ModioModIDs, returning true if not equal
The constructed FModioAuthenticationParams object for use with AuthenticateUserExternalAsync
Create a ApiKey id from a string, should only be used in conjunction with InitializeAsync
The underlying value
Compares two ModioModIDs, returning true if equal
Enum Name |
+The Name from a given enum value |
+
Return Value |
+localized Text for the specified enum value, or dummy FText if not found |
+
localized Text for the specified enum value, or dummy FText if not found
void SetInitialVisibility(FModioCreateModParams In, EModioObjectVisibilityFlags InitialVisibility)
+FText FileSizeUnsigned64_ToText(FModioUnsigned64 FileSize, int32 MinDecimals, int32 MaxDecimals, TEnumAsByte<EFileSizeUnit> Unit, bool bIncludeUnitName)
File Size |
+Filesize in bytes |
+
Min Decimals |
++ |
Max Decimals |
+Maximum amount of decimals to display of the filesize |
+
Unit |
+If Largest, then it tries to display the size in the largest unit that will have a integral part > 0, else it displays the filesize in the specified unit |
+
Include Unit Name |
++ |
Return Value |
+A text formatted from your specifications |
+
A text formatted from your specifications
+void SetHomepageURL(FModioCreateModParams In, FString HomepageURL)
+FText GetLocalizedTextFromDefaultTableByKey(FString StringKey)
Returns the string table FText for a given string key //
+String Key |
+The key to look up in the table |
+
Return Value |
+localized Text for the specified key, or StringKey if not found |
+
localized Text for the specified key, or StringKey if not found
+void SetDescription(FModioCreateModParams In, FString Description)
+FModioErrorCode ReconstructError(int32 Value, int32 Category)
Value |
+The numeric value of the code |
+
Category |
+The category ID (populated by native code) |
+
Return Value |
++ |
void SetChangelogString(FModioCreateModFileParams In, FString Changelog)
+bool IsErrorAsExec(FModioErrorCode Error)
+Error |
++ |
true if the error code is a error
int32 GetValue(FModioErrorCode Error)
-0 if there is no error
FString GetMessage(FModioErrorCode Error)
-Checks if the passed-in ErrorCode matches the specified error condition
true if the code matches the condition
Runs a filter over the user’s subscription list
Dimensions of the logo if displayed in a 1:1 pixel ratio
FVector2D GetGallerySize(UTexture* GalleryImage, EModioGallerySize GallerySize)
Dimensions of the gallery image if displayed in a 1:1 pixel ratio
FVector2D GetAvatarSize(UTexture* Avatar, EModioAvatarSize AvatarSize)
-Dimensions of the avatar if displayed in a 1:1 pixel ratio
FString GetPath(FModioModCollectionEntry Entry)
-Path to the mod’s installation folder on disk NOTE: If the mod is not yet installed this path may not yet exist. Check Get Mod State before trying to load files in this location
EModioModState GetModState(FModioModCollectionEntry Entry)
-EModioModState enum representing current state of the mod
FModioModInfo GetModProfile(FModioModCollectionEntry Entry)
-FModioModInfo containing mod profile data
FModioModID GetID(FModioModCollectionEntry Entry)
-Mod ID
FModioUnsigned64 GetTotalProgress(FModioModProgressInfo Info, EModioModProgressState State)
+Retrieves the total amount of progress required for the specified state.
+Info |
+the progress struct to query |
+
State |
+which state to query total progress for |
+
Return Value |
+Modio::FileSize for total progress in bytes |
+
Modio::FileSize for total progress in bytes
+EModioModProgressState GetCurrentState(FModioModProgressInfo Info)
+Returns a EModioModProgressState indicating which state the mod operation is in
+Info |
+the progress struct to query |
+
Return Value |
++ |
FModioUnsigned64 GetTotalProgress(FModioModProgressInfo Info, EModioModProgressState State)
+FModioUnsigned64 GetCurrentProgress(FModioModProgressInfo Info, EModioModProgressState State)
Retrieves the total amount of progress required for the specified state.
+Retrieves the progress value for the specified state. CurrentProgress == TotalProgress
for states which have completed, for example if a mod is currently Extracting, then passing in Downloading would give you a value equal to the total download size because the download has completed
State |
-which state to query total progress for |
+which state to query progress information for |
Return Value |
-Modio::FileSize for total progress in bytes |
+FModioUnsigned64 containing current progress in bytes |
Modio::FileSize for total progress in bytes
+FModioUnsigned64 containing current progress in bytes
EModioModProgressState GetCurrentState(FModioModProgressInfo Info)
-TArray<FModioModTagInfo> GetTags(FModioModTagOptions ModTags)
Returns a EModioModProgressState indicating which state the mod operation is in
Info |
-the progress struct to query |
+Mod Tags |
+|
Return Value |
@@ -16968,24 +17636,22 @@
FModioUnsigned64 GetCurrentProgress(FModioModProgressInfo Info, EModioModProgressState State)
+FModioPagedResult GetPagedResult(FModioModTagOptions ModTags)
Retrieves the progress value for the specified state. CurrentProgress == TotalProgress
for states which have completed, for example if a mod is currently Extracting, then passing in Downloading would give you a value equal to the total download size because the download has completed
Info |
-the progress struct to query |
-||
State |
-which state to query progress information for |
+Mod Tags |
+|
Return Value |
-FModioUnsigned64 containing current progress in bytes |
+
FModioUnsigned64 containing current progress in bytes
-Get the default portal for the platform the game is running on.
EModioPortal of the portal to use
Get the default Authentication Provider for the current platform the game is running on
EModioAuthenticationProvider to use for authentication calls
Gets the current platform that the game is running on
Sets the correct decimals depending on the file size or speed