// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "Components/GameFrameworkInitStateInterface.h" #include "Components/PawnComponent.h" #include "Containers/Array.h" #include "Engine/EngineTypes.h" #include "GameFramework/Actor.h" #include "GameplayAbilitySpec.h" #include "Input/LyraMappableConfigPair.h" #include "Templates/SubclassOf.h" #include "UObject/NameTypes.h" #include "UObject/UObjectGlobals.h" #include "LyraHeroComponent.generated.h" class UGameFrameworkComponentManager; class UInputComponent; class ULyraCameraMode; class ULyraInputConfig; class UObject; struct FActorInitStateChangedParams; struct FFrame; struct FGameplayTag; struct FInputActionValue; /** * Component that sets up input and camera handling for player controlled pawns (or bots that simulate players). * This depends on a PawnExtensionComponent to coordinate initialization. */ UCLASS(Blueprintable, Meta=(BlueprintSpawnableComponent)) class LYRAGAME_API ULyraHeroComponent : public UPawnComponent, public IGameFrameworkInitStateInterface { GENERATED_BODY() public: ULyraHeroComponent(const FObjectInitializer& ObjectInitializer); /** Returns the hero component if one exists on the specified actor. */ UFUNCTION(BlueprintPure, Category = "Lyra|Hero") static ULyraHeroComponent* FindHeroComponent(const AActor* Actor) { return (Actor ? Actor->FindComponentByClass() : nullptr); } /** Overrides the camera from an active gameplay ability */ void SetAbilityCameraMode(TSubclassOf CameraMode, const FGameplayAbilitySpecHandle& OwningSpecHandle); /** Clears the camera override if it is set */ void ClearAbilityCameraMode(const FGameplayAbilitySpecHandle& OwningSpecHandle); /** Adds mode-specific input config */ void AddAdditionalInputConfig(const ULyraInputConfig* InputConfig); /** Removes a mode-specific input config if it has been added */ void RemoveAdditionalInputConfig(const ULyraInputConfig* InputConfig); /** True if this is controlled by a real player and has progressed far enough in initialization where additional input bindings can be added */ bool IsReadyToBindInputs() const; /** The name of the extension event sent via UGameFrameworkComponentManager when ability inputs are ready to bind */ static const FName NAME_BindInputsNow; /** The name of this component-implemented feature */ static const FName NAME_ActorFeatureName; //~ Begin IGameFrameworkInitStateInterface interface virtual FName GetFeatureName() const override { return NAME_ActorFeatureName; } virtual bool CanChangeInitState(UGameFrameworkComponentManager* Manager, FGameplayTag CurrentState, FGameplayTag DesiredState) const override; virtual void HandleChangeInitState(UGameFrameworkComponentManager* Manager, FGameplayTag CurrentState, FGameplayTag DesiredState) override; virtual void OnActorInitStateChanged(const FActorInitStateChangedParams& Params) override; virtual void CheckDefaultInitialization() override; //~ End IGameFrameworkInitStateInterface interface protected: virtual void OnRegister() override; virtual void BeginPlay() override; virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; virtual void InitializePlayerInput(UInputComponent* PlayerInputComponent); void Input_AbilityInputTagPressed(FGameplayTag InputTag); void Input_AbilityInputTagReleased(FGameplayTag InputTag); void Input_Move(const FInputActionValue& InputActionValue); void Input_LookMouse(const FInputActionValue& InputActionValue); void Input_LookStick(const FInputActionValue& InputActionValue); void Input_Crouch(const FInputActionValue& InputActionValue); void Input_AutoRun(const FInputActionValue& InputActionValue); TSubclassOf DetermineCameraMode() const; void OnInputConfigActivated(const FLoadedMappableConfigPair& ConfigPair); void OnInputConfigDeactivated(const FLoadedMappableConfigPair& ConfigPair); protected: /** * Input Configs that should be added to this player when initializing the input. These configs * will NOT be registered with the settings because they are added at runtime. If you want the config * pair to be in the settings, then add it via the GameFeatureAction_AddInputConfig * * NOTE: You should only add to this if you do not have a game feature plugin accessible to you. * If you do, then use the GameFeatureAction_AddInputConfig instead. */ UPROPERTY(EditAnywhere) TArray DefaultInputConfigs; /** Camera mode set by an ability. */ UPROPERTY() TSubclassOf AbilityCameraMode; /** Spec handle for the last ability to set a camera mode. */ FGameplayAbilitySpecHandle AbilityCameraModeOwningSpecHandle; /** True when player input bindings have been applied, will never be true for non - players */ bool bReadyToBindInputs; };