diff --git a/Doc/documentation.html b/Doc/documentation.html index ff9f5e3d..5b732ec0 100644 --- a/Doc/documentation.html +++ b/Doc/documentation.html @@ -5903,7 +5903,7 @@

Values

diff --git a/Doc/img/nd_img_DisableModManagement.png b/Doc/img/nd_img_DisableModManagement.png index 871ccb5c..312725be 100644 Binary files a/Doc/img/nd_img_DisableModManagement.png and b/Doc/img/nd_img_DisableModManagement.png differ diff --git a/Doc/img/nd_img_GetLogoFullSize.png b/Doc/img/nd_img_GetLogoFullSize.png index 58cada6a..4e19f828 100644 Binary files a/Doc/img/nd_img_GetLogoFullSize.png and b/Doc/img/nd_img_GetLogoFullSize.png differ diff --git a/Doc/img/nd_img_GetLogoThumbnailSize.png b/Doc/img/nd_img_GetLogoThumbnailSize.png index 40d14e98..94b400fa 100644 Binary files a/Doc/img/nd_img_GetLogoThumbnailSize.png and b/Doc/img/nd_img_GetLogoThumbnailSize.png differ diff --git a/Doc/img/nd_img_GetProjectEnvironment.png b/Doc/img/nd_img_GetProjectEnvironment.png index de731e12..8c2f38f6 100644 Binary files a/Doc/img/nd_img_GetProjectEnvironment.png and b/Doc/img/nd_img_GetProjectEnvironment.png differ diff --git a/Doc/img/nd_img_IsModManagementBusy.png b/Doc/img/nd_img_IsModManagementBusy.png index da7ea026..ee27ef2c 100644 Binary files a/Doc/img/nd_img_IsModManagementBusy.png and b/Doc/img/nd_img_IsModManagementBusy.png differ diff --git a/Doc/img/nd_img_K2_GetModDependenciesAsync.png b/Doc/img/nd_img_K2_GetModDependenciesAsync.png index f4d3a698..938e9c25 100644 Binary files a/Doc/img/nd_img_K2_GetModDependenciesAsync.png and b/Doc/img/nd_img_K2_GetModDependenciesAsync.png differ diff --git a/Doc/img/nd_img_K2_GetModTagOptionsAsync.png b/Doc/img/nd_img_K2_GetModTagOptionsAsync.png index 376495a4..86eb6a54 100644 Binary files a/Doc/img/nd_img_K2_GetModTagOptionsAsync.png and b/Doc/img/nd_img_K2_GetModTagOptionsAsync.png differ diff --git a/Doc/img/nd_img_K2_UnsubscribeFromModAsync.png b/Doc/img/nd_img_K2_UnsubscribeFromModAsync.png index 2c861ae0..4e66ab0f 100644 Binary files a/Doc/img/nd_img_K2_UnsubscribeFromModAsync.png and b/Doc/img/nd_img_K2_UnsubscribeFromModAsync.png differ diff --git a/Doc/img/nd_img_ListUserSubscriptionAsync.png b/Doc/img/nd_img_ListUserSubscriptionAsync.png index 988366cf..8a28c90a 100644 Binary files a/Doc/img/nd_img_ListUserSubscriptionAsync.png and b/Doc/img/nd_img_ListUserSubscriptionAsync.png differ diff --git a/Doc/img/nd_img_MakeApiKey.png b/Doc/img/nd_img_MakeApiKey.png index 5e6ad782..1f1526a5 100644 Binary files a/Doc/img/nd_img_MakeApiKey.png and b/Doc/img/nd_img_MakeApiKey.png differ diff --git a/Doc/img/nd_img_MakeAuthParams.png b/Doc/img/nd_img_MakeAuthParams.png index 20cec3b9..5487d46d 100644 Binary files a/Doc/img/nd_img_MakeAuthParams.png and b/Doc/img/nd_img_MakeAuthParams.png differ diff --git a/Doc/img/nd_img_QueryUserInstallations.png b/Doc/img/nd_img_QueryUserInstallations.png index 5e64b74a..aa05f6d1 100644 Binary files a/Doc/img/nd_img_QueryUserInstallations.png and b/Doc/img/nd_img_QueryUserInstallations.png differ diff --git a/Source/Modio/GeneratedSource/ModioModCollectionEntry.cpp b/Source/Modio/GeneratedSource/ModioModCollectionEntry.cpp index 3b4d2c64..c37274d1 100644 --- a/Source/Modio/GeneratedSource/ModioModCollectionEntry.cpp +++ b/Source/Modio/GeneratedSource/ModioModCollectionEntry.cpp @@ -1,18 +1,20 @@ -/* +/* * Copyright (C) 2021 mod.io Pty Ltd. - * + * * This file is part of the mod.io SDK. - * - * Distributed under the MIT License. (See accompanying file LICENSE or + * + * Distributed under the MIT License. (See accompanying file LICENSE or * view online at ) - * + * */ #ifdef MODIO_SEPARATE_COMPILATION #include "modio/core/ModioModCollectionEntry.h" #endif +#include "modio/core/ModioErrorCode.h" #include "modio/core/ModioLogger.h" +#include "modio/detail/ModioConstants.h" #include "modio/detail/ModioJsonHelpers.h" #include "nlohmann/json.hpp" #include @@ -24,7 +26,8 @@ namespace Modio CurrentState(Modio::ModState::InstallationPending), ModProfile(ProfileData), LocalUserSubscriptions(), - PathOnDisk(CalculatedModPath) {}; + PathOnDisk(CalculatedModPath), + RetriesRemainingThisSession(Modio::Detail::Constants::Configuration::DefaultNumberOfRetries) {}; ModCollectionEntry::ModCollectionEntry(const ModCollectionEntry& Other) : ID(Other.ID), @@ -32,7 +35,13 @@ namespace Modio ModProfile(Other.ModProfile), LocalUserSubscriptionCount(Other.LocalUserSubscriptionCount.load()), LocalUserSubscriptions(Other.LocalUserSubscriptions), - PathOnDisk(Other.PathOnDisk) {}; + PathOnDisk(Other.PathOnDisk), + RetriesRemainingThisSession(Modio::Detail::Constants::Configuration::DefaultNumberOfRetries) {}; + + uint8_t ModCollectionEntry::GetRetriesRemaining() + { + return RetriesRemainingThisSession; + } void ModCollectionEntry::UpdateModProfile(ModInfo ProfileData) { @@ -76,13 +85,67 @@ namespace Modio void ModCollectionEntry::SetModState(Modio::ModState NewState) { CurrentState = NewState; + if (CurrentState == Modio::ModState::Installed) + { + RetriesRemainingThisSession = Modio::Detail::Constants::Configuration::DefaultNumberOfRetries; + } } - void ModCollectionEntry::MarkModNoRetry() + void ModCollectionEntry::MarkModNoRetryThisSession() { ShouldNotRetry.store(true); } + void ModCollectionEntry::SetLastError(Modio::ErrorCode Reason) + { + // For uninstallations, defer immediately if the error indicates we should defer, else make a number of retry + // attempts then stop + if (GetModState() == ModState::UninstallPending) + { + if (Modio::ErrorCodeMatches(Reason, Modio::ErrorConditionTypes::ModDeleteDeferredError)) + { + MarkModNoRetryThisSession(); + return; + } + else + { + if (RetriesRemainingThisSession > 0) + { + RetriesRemainingThisSession--; + } + if (RetriesRemainingThisSession == 0) + { + MarkModNoRetryThisSession(); + } + } + } + // For installations, if we should retry, make a fixed number of attempts then stop. + // If the error is unrecoverable, prevent future reattempts permanently. + // Otherwise, defer to next startup + else + { + if (Modio::ErrorCodeMatches(Reason, Modio::ErrorConditionTypes::ModInstallRetryableError)) + { + if (RetriesRemainingThisSession > 0) + { + RetriesRemainingThisSession--; + } + if (RetriesRemainingThisSession == 0) + { + MarkModNoRetryThisSession(); + } + } + else if (Modio::ErrorCodeMatches(Reason, Modio::ErrorConditionTypes::ModInstallUnrecoverableError)) + { + NeverRetryReason = Reason; + } + else + { + MarkModNoRetryThisSession(); + } + } + } + void ModCollectionEntry::ClearModNoRetry() { ShouldNotRetry.store(false); @@ -90,7 +153,8 @@ namespace Modio bool ModCollectionEntry::ShouldRetry() { - return !ShouldNotRetry.load(); + // Should only retry if we have don't have a never retry reason AND ShouldNotRetry is not set + return !NeverRetryReason && !ShouldNotRetry.load(); } Modio::ModState ModCollectionEntry::GetModState() const @@ -158,6 +222,7 @@ namespace Modio LocalUserSubscriptions = Other.LocalUserSubscriptions; LocalUserSubscriptionCount.store(Other.LocalUserSubscriptionCount.load()); PathOnDisk = Other.PathOnDisk; + RetriesRemainingThisSession = Other.RetriesRemainingThisSession; return *this; }; @@ -175,9 +240,10 @@ namespace Modio } else { - Modio::Detail::Logger().Log( - Modio::LogLevel::Warning, Modio::LogCategory::ModManagement, - "Mod {0} is in state Downloading or Extracting without a transaction in progress. Saving state as InstallationPending", Entry.ID); + Modio::Detail::Logger().Log(Modio::LogLevel::Warning, Modio::LogCategory::ModManagement, + "Mod {0} is in state Downloading or Extracting without a transaction in " + "progress. Saving state as InstallationPending", + Entry.ID); EntryState = Modio::ModState::InstallationPending; } } @@ -188,7 +254,10 @@ namespace Modio {Modio::Detail::Constants::JSONKeys::ModEntrySubCount, Entry.LocalUserSubscriptions}, {Modio::Detail::Constants::JSONKeys::ModEntryState, EntryState}, {Modio::Detail::Constants::JSONKeys::ModSizeOnDisk, Entry.SizeOnDisk}, - {Modio::Detail::Constants::JSONKeys::ModPathOnDisk, Entry.PathOnDisk.string()}}); + {Modio::Detail::Constants::JSONKeys::ModPathOnDisk, Entry.PathOnDisk.string()}, + {Modio::Detail::Constants::JSONKeys::ModNeverRetryCode, Entry.NeverRetryReason.value()}, + {Modio::Detail::Constants::JSONKeys::ModNeverRetryCategory, + Modio::Detail::ModioErrorCategoryID(Entry.NeverRetryReason.category())}}); } void from_json(const nlohmann::json& j, ModCollectionEntry& Entry) @@ -201,6 +270,14 @@ namespace Modio Modio::Detail::ParseSafe(j, StateTmp, Modio::Detail::Constants::JSONKeys::ModEntryState); Entry.CurrentState.store(StateTmp); Modio::Detail::ParseSafe(j, Entry.PathOnDisk, Modio::Detail::Constants::JSONKeys::ModPathOnDisk); + if (j.contains(Modio::Detail::Constants::JSONKeys::ModNeverRetryCode) && + j.contains(Modio::Detail::Constants::JSONKeys::ModNeverRetryCategory)) + { + Entry.NeverRetryReason = + std::error_code(j.at(Modio::Detail::Constants::JSONKeys::ModNeverRetryCode).get(), + Modio::Detail::GetModioErrorCategoryByID( + j.at(Modio::Detail::Constants::JSONKeys::ModNeverRetryCategory).get())); + } } UserSubscriptionList::UserSubscriptionList(std::vector&& NewIDs) @@ -323,4 +400,24 @@ namespace Modio return false; } + std::vector> ModCollection::SortEntriesByRetryPriority() const + { + std::vector> SortedEntries; + // Copy the entries to the vector + for (const std::pair>& Elem : ModEntries) + { + SortedEntries.push_back(Elem.second); + } + // Sort the entries by priority (that is, entries which can be retried should be first, and entries which + // haven't been retried this session should be higher ) + auto FirstElemWithNoRetry = + std::partition(SortedEntries.begin(), SortedEntries.end(), + [](std::shared_ptr Elem) { return Elem->ShouldRetry(); }); + std::partition( + SortedEntries.begin(), FirstElemWithNoRetry, [](std::shared_ptr Elem) { + return Elem->GetRetriesRemaining() == Modio::Detail::Constants::Configuration::DefaultNumberOfRetries; + }); + return SortedEntries; + } + } // namespace Modio \ No newline at end of file diff --git a/Source/Modio/Modio.Build.cs b/Source/Modio/Modio.Build.cs index 91bd2ee6..b44a3a3b 100644 --- a/Source/Modio/Modio.Build.cs +++ b/Source/Modio/Modio.Build.cs @@ -19,7 +19,6 @@ public Modio(ReadOnlyTargetRules Target) : base(Target) { PCHUsage = ModuleRules.PCHUsageMode.NoSharedPCHs; PrivatePCHHeaderFile = "Private/ModioPrivatePCH.h"; - bEnableUndefinedIdentifierWarnings = false; bEnforceIWYU = true; //bUseUnity = false; diff --git a/Source/Modio/Private/Internal/Convert/FileMetadata.h b/Source/Modio/Private/Internal/Convert/FileMetadata.h index c3bdc76b..69b0427e 100644 --- a/Source/Modio/Private/Internal/Convert/FileMetadata.h +++ b/Source/Modio/Private/Internal/Convert/FileMetadata.h @@ -1,21 +1,19 @@ -/* +/* * Copyright (C) 2021 mod.io Pty Ltd. - * + * * This file is part of the mod.io UE4 Plugin. - * - * Distributed under the MIT License. (See accompanying file LICENSE or + * + * Distributed under the MIT License. (See accompanying file LICENSE or * view online at ) - * + * */ #pragma once +#include "Internal/ModioConvert.h" #include "Internal/ModioPrivateDefines.h" #include "ModioSDK.h" #include "Types/ModioFileMetadata.h" - - - MODIO_BEGIN_CONVERT_SWITCHES FORCEINLINE EModioVirusScanStatus ToUnreal(Modio::FileMetadata::VirusScanStatus VirusScanStatus) { diff --git a/Source/Modio/Private/Internal/Convert/List.h b/Source/Modio/Private/Internal/Convert/List.h new file mode 100644 index 00000000..66b04040 --- /dev/null +++ b/Source/Modio/Private/Internal/Convert/List.h @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2021 mod.io Pty Ltd. + * + * This file is part of the mod.io UE4 Plugin. + * + * Distributed under the MIT License. (See accompanying file LICENSE or + * view online at ) + * + */ + +#pragma once + +#include "Internal/ModioConvert.h" +#include "Types/ModioList.h" +#include "ModioSDK.h" + +/** Convert a Modio::List to a FModioList */ +template typename DestListType, typename DestValueType, typename SourceListType> +FModioList ToUnrealList(SourceListType Value) +{ + FModioList Result; + Result.InternalList = ToUnreal(Value.GetRawList()); + return Result; +} diff --git a/Source/Modio/Private/Internal/ModioConvert.h b/Source/Modio/Private/Internal/ModioConvert.h index 7105d339..ca1763d4 100644 --- a/Source/Modio/Private/Internal/ModioConvert.h +++ b/Source/Modio/Private/Internal/ModioConvert.h @@ -57,6 +57,7 @@ FORCEINLINE Modio::UserID ToModio(const FModioUserID& In); #pragma region Implementation + // @todo: Rename this to ToModio as it doesn't matter that it's the part of STD of modio FORCEINLINE std::string ToSTD(const FString& String) { diff --git a/Source/Modio/Private/ModioSubsystem.cpp b/Source/Modio/Private/ModioSubsystem.cpp index 5f98fa05..cb6fc702 100644 --- a/Source/Modio/Private/ModioSubsystem.cpp +++ b/Source/Modio/Private/ModioSubsystem.cpp @@ -14,6 +14,7 @@ #include "Internal/Convert/ErrorCode.h" #include "Internal/Convert/FilterParams.h" #include "Internal/Convert/InitializeOptions.h" +#include "Internal/Convert/List.h" #include "Internal/Convert/ModCollectionEntry.h" #include "Internal/Convert/ModDependency.h" #include "Internal/Convert/ModInfo.h" @@ -274,7 +275,7 @@ void UModioSubsystem::GetModMediaAsync(FModioModID ModId, EModioAvatarSize Avata }); } -void UModioSubsystem::GetModMediaAsync(FModioModID ModId, EModioGallerySize GallerySize, Modio::GalleryIndex Index, +void UModioSubsystem::GetModMediaAsync(FModioModID ModId, EModioGallerySize GallerySize, int32 Index, FOnGetMediaDelegateFast Callback) { Modio::GetModMediaAsync(ToModio(ModId), ToModio(GallerySize), Index, @@ -557,7 +558,8 @@ MODIO_API void UModioSubsystem::K2_GetModDependenciesAsync(FModioModID ModID, FO { GetModDependenciesAsync(ModID, FOnGetModDependenciesDelegateFast::CreateLambda( [Callback](FModioErrorCode ec, TOptional Dependencies) { - Callback.ExecuteIfBound(ec, FModioOptionalModDependencyList(MoveTempIfPossible(Dependencies))); + Callback.ExecuteIfBound( + ec, FModioOptionalModDependencyList(MoveTempIfPossible(Dependencies))); })); } diff --git a/Source/Modio/Private/Tests/Commands/ModioTestCommandBase.h b/Source/Modio/Private/Tests/Commands/ModioTestCommandBase.h index e87eab52..27bad4d0 100644 --- a/Source/Modio/Private/Tests/Commands/ModioTestCommandBase.h +++ b/Source/Modio/Private/Tests/Commands/ModioTestCommandBase.h @@ -15,6 +15,7 @@ #include "Misc/TVariant.h" #include "ModioSubsystem.h" #include "Types/ModioErrorCode.h" +#include "ModioSDK.h" #if WITH_DEV_AUTOMATION_TESTS diff --git a/Source/Modio/Private/Types/ModioModInfoList.cpp b/Source/Modio/Private/Types/ModioModInfoList.cpp index 9ea87854..b65ff741 100644 --- a/Source/Modio/Private/Types/ModioModInfoList.cpp +++ b/Source/Modio/Private/Types/ModioModInfoList.cpp @@ -1,14 +1,15 @@ -/* +/* * Copyright (C) 2021 mod.io Pty Ltd. - * + * * This file is part of the mod.io UE4 Plugin. - * - * Distributed under the MIT License. (See accompanying file LICENSE or + * + * Distributed under the MIT License. (See accompanying file LICENSE or * view online at ) - * + * */ #include "Types/ModioModInfoList.h" +#include "Internal/Convert/List.h" #include "Internal/Convert/ModInfo.h" #include "ModioSDK.h" diff --git a/Source/Modio/Private/Types/ModioModTagOptions.cpp b/Source/Modio/Private/Types/ModioModTagOptions.cpp index c7955b39..afad7756 100644 --- a/Source/Modio/Private/Types/ModioModTagOptions.cpp +++ b/Source/Modio/Private/Types/ModioModTagOptions.cpp @@ -1,14 +1,15 @@ -/* +/* * Copyright (C) 2021 mod.io Pty Ltd. - * + * * This file is part of the mod.io UE4 Plugin. - * - * Distributed under the MIT License. (See accompanying file LICENSE or + * + * Distributed under the MIT License. (See accompanying file LICENSE or * view online at ) - * + * */ #include "Types/ModioModTagOptions.h" +#include "Internal/Convert/List.h" #include "Internal/Convert/ModTagInfo.h" #include "ModioSDK.h" diff --git a/Source/Modio/Private/Types/ModioURLListUImpl.cpp b/Source/Modio/Private/Types/ModioURLListUImpl.cpp index 6b421127..b6174f41 100644 --- a/Source/Modio/Private/Types/ModioURLListUImpl.cpp +++ b/Source/Modio/Private/Types/ModioURLListUImpl.cpp @@ -1,16 +1,16 @@ -/* +/* * Copyright (C) 2021 mod.io Pty Ltd. - * + * * This file is part of the mod.io UE4 Plugin. - * - * Distributed under the MIT License. (See accompanying file LICENSE or + * + * Distributed under the MIT License. (See accompanying file LICENSE or * view online at ) - * + * */ -#include "Types/ModioURLList.h" +#include "Internal/Convert/List.h" #include "ModioSDK.h" -#include "Internal/ModioConvert.h" +#include "Types/ModioURLList.h" FModioYoutubeURLList::FModioYoutubeURLList(const Modio::YoutubeURLList& URLList) : FModioList(ToUnrealList(URLList)) diff --git a/Source/Modio/Private/UI/ModioExampleLibrary.cpp b/Source/Modio/Private/UI/ModioExampleLibrary.cpp index 0ce4d151..8f8c37a6 100644 --- a/Source/Modio/Private/UI/ModioExampleLibrary.cpp +++ b/Source/Modio/Private/UI/ModioExampleLibrary.cpp @@ -14,6 +14,7 @@ #include "Engine/Engine.h" #include "Kismet/GameplayStatics.h" #include +#include "ModioSDK.h" EModioAvatarSize UModioExampleLibrary::GetAvatarThumbnailSize() { @@ -144,7 +145,7 @@ void UModioExampleLibrary::ListUserSubscriptionAsync(const FModioFilterParams& F if (!IsValid(Subsystem)) { // @todo: Exchange this for a mod.io internal error when we have one in the SDK - Callback.ExecuteIfBound(FModioErrorCode(std::make_error_code(std::errc::not_supported)), {}); + Callback.ExecuteIfBound(FModioErrorCode(Modio::ErrorCode(std::make_error_code(std::errc::not_supported))), {}); return; } diff --git a/Source/Modio/Public/ModioSubsystem.h b/Source/Modio/Public/ModioSubsystem.h index 009b71e5..1148ea1c 100644 --- a/Source/Modio/Public/ModioSubsystem.h +++ b/Source/Modio/Public/ModioSubsystem.h @@ -290,7 +290,7 @@ class UModioSubsystem : public UEngineSubsystem * @errorcategory EntityNotFoundError|Specified mod media does not exist or was deleted * @error FilesystemError::InsufficientSpace|Not enough space for the file **/ - MODIO_API void GetModMediaAsync(FModioModID ModId, EModioGallerySize GallerySize, Modio::GalleryIndex Index, + MODIO_API void GetModMediaAsync(FModioModID ModId, EModioGallerySize GallerySize, int32 Index, FOnGetMediaDelegateFast Callback); /** diff --git a/Source/Modio/Public/Types/ModioList.h b/Source/Modio/Public/Types/ModioList.h index 4e45ccf8..d739f7c8 100644 --- a/Source/Modio/Public/Types/ModioList.h +++ b/Source/Modio/Public/Types/ModioList.h @@ -11,7 +11,6 @@ #pragma once #include "Templates/UnrealTemplate.h" -#include "Internal/ModioConvert.h" #if CPP /** @@ -107,11 +106,3 @@ struct MODIO_API FModioList }; #endif -/** Convert a Modio::List to a FModioList */ -template typename DestListType, typename DestValueType, typename SourceListType> -FModioList ToUnrealList(SourceListType Value) -{ - FModioList Result; - Result.InternalList = ToUnreal(Value.GetRawList()); - return Result; -} diff --git a/Source/Modio/Public/Types/ModioModCollectionEntry.h b/Source/Modio/Public/Types/ModioModCollectionEntry.h index 22490b3e..3c599f12 100644 --- a/Source/Modio/Public/Types/ModioModCollectionEntry.h +++ b/Source/Modio/Public/Types/ModioModCollectionEntry.h @@ -18,6 +18,11 @@ // clang-format on +namespace Modio +{ + class ModCollectionEntry; +} + /// @brief Enum representing the current state of a mod UENUM(BlueprintType) enum class EModioModState : uint8 diff --git a/Source/Modio/Public/Types/ModioModInfoList.h b/Source/Modio/Public/Types/ModioModInfoList.h index eb3ed427..a4020751 100644 --- a/Source/Modio/Public/Types/ModioModInfoList.h +++ b/Source/Modio/Public/Types/ModioModInfoList.h @@ -1,11 +1,11 @@ -/* +/* * Copyright (C) 2021 mod.io Pty Ltd. - * + * * This file is part of the mod.io UE4 Plugin. - * - * Distributed under the MIT License. (See accompanying file LICENSE or + * + * Distributed under the MIT License. (See accompanying file LICENSE or * view online at ) - * + * */ #pragma once @@ -17,6 +17,11 @@ #include "ModioModInfoList.generated.h" // clang-format on +namespace Modio +{ + class ModInfoList; +} + #if CPP // Native version of FModioModInfoList struct MODIO_API FModioModInfoList : public FModioPagedResult, public FModioList @@ -51,4 +56,3 @@ struct MODIO_API FModioOptionalModInfoList TOptional Internal; }; - diff --git a/Source/Modio/Public/Types/ModioModTagOptions.h b/Source/Modio/Public/Types/ModioModTagOptions.h index 3792f7cd..6151ebe5 100644 --- a/Source/Modio/Public/Types/ModioModTagOptions.h +++ b/Source/Modio/Public/Types/ModioModTagOptions.h @@ -16,6 +16,11 @@ #include "ModioModTagOptions.generated.h" +namespace Modio +{ + class ModTagOptions; +} + #if CPP // Native version of FModioModTagOptions struct MODIO_API FModioModTagOptions : public FModioPagedResult, public FModioList diff --git a/Source/Modio/Public/Types/ModioValidationError.h b/Source/Modio/Public/Types/ModioValidationError.h index 1d142f9c..0007192f 100644 --- a/Source/Modio/Public/Types/ModioValidationError.h +++ b/Source/Modio/Public/Types/ModioValidationError.h @@ -9,7 +9,6 @@ */ #pragma once -#include "Internal/ModioConvert.h" #include "Containers/UnrealString.h" #include "ModioValidationError.generated.h" diff --git a/Source/ThirdParty/NativeSDK b/Source/ThirdParty/NativeSDK index 9d09a7c3..6ab4e0e6 160000 --- a/Source/ThirdParty/NativeSDK +++ b/Source/ThirdParty/NativeSDK @@ -1 +1 @@ -Subproject commit 9d09a7c3c2c622dab3419c0e85a4095dff20c6e9 +Subproject commit 6ab4e0e6e0407812889186e181496294cd0295f9