// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "GameFeatureAction_WorldActionBase.h" #include "GameFeatureAction_AddInputContextMapping.generated.h" class AActor; class UInputMappingContext; class UPlayer; class APlayerController; struct FComponentRequestHandle; USTRUCT() struct FInputMappingContextAndPriority { GENERATED_BODY() UPROPERTY(EditAnywhere, Category="Input", meta=(AssetBundles="Client,Server")) TSoftObjectPtr InputMapping; // Higher priority input mappings will be prioritized over mappings with a lower priority. UPROPERTY(EditAnywhere, Category="Input") int32 Priority = 0; }; /** * Adds InputMappingContext to local players' EnhancedInput system. * Expects that local players are set up to use the EnhancedInput system. */ UCLASS(MinimalAPI, meta = (DisplayName = "Add Input Mapping")) class UGameFeatureAction_AddInputContextMapping final : public UGameFeatureAction_WorldActionBase { GENERATED_BODY() public: //~UGameFeatureAction interface virtual void OnGameFeatureActivating(FGameFeatureActivatingContext& Context) override; virtual void OnGameFeatureDeactivating(FGameFeatureDeactivatingContext& Context) override; //~End of UGameFeatureAction interface //~UObject interface #if WITH_EDITOR virtual EDataValidationResult IsDataValid(TArray& ValidationErrors) override; #endif //~End of UObject interface UPROPERTY(EditAnywhere, Category="Input") TArray InputMappings; private: struct FPerContextData { TArray> ExtensionRequestHandles; TArray> ControllersAddedTo; }; TMap ContextData; //~UGameFeatureAction_WorldActionBase interface virtual void AddToWorld(const FWorldContext& WorldContext, const FGameFeatureStateChangeContext& ChangeContext) override; //~End of UGameFeatureAction_WorldActionBase interface void Reset(FPerContextData& ActiveData); void HandleControllerExtension(AActor* Actor, FName EventName, FGameFeatureStateChangeContext ChangeContext); void AddInputMappingForPlayer(UPlayer* Player, FPerContextData& ActiveData); void RemoveInputMapping(APlayerController* PlayerController, FPerContextData& ActiveData); };