// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "LyraPawnComponent.h" #include "LyraPawnExtensionComponent.generated.h" class ULyraPawnData; class ULyraAbilitySystemComponent; DECLARE_DYNAMIC_MULTICAST_DELEGATE(FLyraDynamicMulticastDelegate); /** * ULyraPawnExtensionComponent * * Component used to add functionality to all Pawn classes. */ UCLASS() class ULyraPawnExtensionComponent : public ULyraPawnComponent { GENERATED_BODY() public: ULyraPawnExtensionComponent(const FObjectInitializer& ObjectInitializer); // Returns the pawn extension component if one exists on the specified actor. UFUNCTION(BlueprintPure, Category = "Lyra|Pawn") static ULyraPawnExtensionComponent* FindPawnExtensionComponent(const AActor* Actor) { return (Actor ? Actor->FindComponentByClass() : nullptr); } template const T* GetPawnData() const { return Cast(PawnData); } void SetPawnData(const ULyraPawnData* InPawnData); UFUNCTION(BlueprintPure, Category = "Lyra|Pawn") ULyraAbilitySystemComponent* GetLyraAbilitySystemComponent() const { return AbilitySystemComponent; } // Should be called by the owning pawn to become the avatar of the ability system. void InitializeAbilitySystem(ULyraAbilitySystemComponent* InASC, AActor* InOwnerActor); // Should be called by the owning pawn to remove itself as the avatar of the ability system. void UninitializeAbilitySystem(); // Should be called by the owning pawn when the pawn's controller changes. void HandleControllerChanged(); // Should be called by the owning pawn when the player state has been replicated. void HandlePlayerStateReplicated(); // Should be called by the owning pawn when the input component is setup. void SetupPlayerInputComponent(); // Call this anytime the pawn needs to check if it's ready to be initialized (pawn data assigned, possessed, etc..). bool CheckPawnReadyToInitialize(); // Returns true if the pawn is ready to be initialized. UFUNCTION(BlueprintCallable, BlueprintPure = false, Category = "Lyra|Pawn", Meta = (ExpandBoolAsExecs = "ReturnValue")) bool IsPawnReadyToInitialize() const { return bPawnReadyToInitialize; } // Register with the OnPawnReadyToInitialize delegate and broadcast if condition is already met. void OnPawnReadyToInitialize_RegisterAndCall(FSimpleMulticastDelegate::FDelegate Delegate); // Register with the OnAbilitySystemInitialized delegate and broadcast if condition is already met. void OnAbilitySystemInitialized_RegisterAndCall(FSimpleMulticastDelegate::FDelegate Delegate); // Register with the OnAbilitySystemUninitialized delegate. void OnAbilitySystemUninitialized_Register(FSimpleMulticastDelegate::FDelegate Delegate); protected: virtual void OnRegister() override; UFUNCTION() void OnRep_PawnData(); // Delegate fired when pawn has everything needed for initialization. FSimpleMulticastDelegate OnPawnReadyToInitialize; UPROPERTY(BlueprintAssignable, Meta = (DisplayName = "On Pawn Ready To Initialize")) FLyraDynamicMulticastDelegate BP_OnPawnReadyToInitialize; // Delegate fired when our pawn becomes the ability system's avatar actor FSimpleMulticastDelegate OnAbilitySystemInitialized; // Delegate fired when our pawn is removed as the ability system's avatar actor FSimpleMulticastDelegate OnAbilitySystemUninitialized; protected: // Pawn data used to create the pawn. Specified from a spawn function or on a placed instance. UPROPERTY(EditInstanceOnly, ReplicatedUsing = OnRep_PawnData, Category = "Lyra|Pawn") const ULyraPawnData* PawnData; // Pointer to the ability system component that is cached for convenience. UPROPERTY() ULyraAbilitySystemComponent* AbilitySystemComponent; // True when the pawn has everything needed for initialization. int32 bPawnReadyToInitialize : 1; };