// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "Delegates/Delegate.h" #include "UObject/ObjectMacros.h" #include "UObject/Object.h" #include "GameFeaturesSubsystem.h" #include "GameFeaturesProjectPolicies.h" #include "GameFeatureStateChangeObserver.h" #include "LyraGameFeaturePolicy.generated.h" class UGameFeatureData; /** * Manager to keep track of the state machines that bring a game feature plugin into memory and active * This class discovers plugins either that are built-in and distributed with the game or are reported externally (i.e. by a web service or other endpoint) */ UCLASS(MinimalAPI, Config = Game) class ULyraGameFeaturePolicy : public UDefaultGameFeaturesProjectPolicies { GENERATED_BODY() public: LYRAGAME_API static ULyraGameFeaturePolicy& Get(); ULyraGameFeaturePolicy(const FObjectInitializer& ObjectInitializer); //~UGameFeaturesProjectPolicies interface virtual void InitGameFeatureManager() override; virtual void ShutdownGameFeatureManager() override; virtual bool IsPluginAllowed(const FString& PluginURL) const override; virtual const TArray GetPreloadBundleStateForGameFeature() const override; virtual void GetGameFeatureLoadingMode(bool& bLoadClientData, bool& bLoadServerData) const override; //~End of UGameFeaturesProjectPolicies interface private: UPROPERTY(Transient) TArray> Observers; }; // checked UCLASS() class ULyraGameFeature_HotfixManager : public UObject, public IGameFeatureStateChangeObserver { GENERATED_BODY() public: virtual void OnGameFeatureLoading(const UGameFeatureData* GameFeatureData, const FString& PluginURL) override; }; // checked UCLASS() class ULyraGameFeature_AddGameplayCuePaths : public UObject, public IGameFeatureStateChangeObserver { GENERATED_BODY() public: virtual void OnGameFeatureRegistering(const UGameFeatureData* GameFeatureData, const FString& PluginName, const FString& PluginURL) override; virtual void OnGameFeatureUnregistering(const UGameFeatureData* GameFeatureData, const FString& PluginName, const FString& PluginURL) override; };