// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "Misc/Paths.h" #include "UObject/ObjectMacros.h" #include "UObject/ObjectKey.h" #include "OnlineHotfixManager.h" #include "Engine/EngineTypes.h" #include "TimerManager.h" #include "Tickable.h" #include "Misc/CoreDelegates.h" #include "Containers/Ticker.h" #include "LyraHotfixManager.generated.h" UCLASS() class ULyraHotfixManager : public UOnlineHotfixManager { GENERATED_BODY() public: DECLARE_MULTICAST_DELEGATE_OneParam(FOnPendingGameHotfix, bool); FOnPendingGameHotfix OnPendingGameHotfixChanged; ULyraHotfixManager(); virtual ~ULyraHotfixManager(); void RequestPatchAssetsFromIniFiles(); protected: void OnHotfixCompleted(EHotfixResult HotfixResult); virtual FString GetCachedDirectory() override { return FPaths::ProjectPersistentDownloadDir() / TEXT("Hotfix/"); } virtual void StartHotfixProcess() override; virtual bool WantsHotfixProcessing(const struct FCloudFileHeader& FileHeader) override; virtual bool ApplyHotfixProcessing(const struct FCloudFileHeader& FileHeader) override; virtual bool ShouldWarnAboutMissingWhenPatchingFromIni(const FString& AssetPath) const override; virtual void PatchAssetsFromIniFiles() override; virtual bool PreProcessDownloadedFileData(TArray& FileData) const override; virtual void OnHotfixAvailablityCheck(const TArray& PendingChangedFiles, const TArray& PendingRemoveFiles) override; virtual bool HotfixIniFile(const FString& FileName, const FString& IniData) override; private: #if !UE_BUILD_SHIPPING // Error reporting FDelegateHandle OnScreenMessageHandle; void GetOnScreenMessages(TMultiMap& OutMessages); #endif // !UE_BUILD_SHIPPING private: /** get the current game instance */ template T* GetGameInstance() const { return GetTypedOuter(); } void Init() override; private: FTSTicker::FDelegateHandle RequestPatchAssetsHandle; FDelegateHandle HotfixCompleteDelegateHandle; bool bHasPendingGameHotfix = false; bool bHasPendingDeviceProfileHotfix = false; static int32 GameHotfixCounter; };