diff --git a/Source/ModularGameplayAbilities/ModularGameplayAbilities.Build.cs b/Source/ModularGameplayAbilities/ModularGameplayAbilities.Build.cs index 3ea4cc7..1f2db71 100644 --- a/Source/ModularGameplayAbilities/ModularGameplayAbilities.Build.cs +++ b/Source/ModularGameplayAbilities/ModularGameplayAbilities.Build.cs @@ -26,6 +26,7 @@ public ModularGameplayAbilities(ReadOnlyTargetRules Target) : base(Target) "Core", "GameFeatures", "GameplayAbilities", + "CommonGame", "ModalCamera", "ModularGameplay", "ModularGameplayExperiences" diff --git a/Source/ModularGameplayAbilities/Private/ModularAbilityPlayerController.cpp b/Source/ModularGameplayAbilities/Private/ModularAbilityPlayerController.cpp new file mode 100644 index 0000000..a43717a --- /dev/null +++ b/Source/ModularGameplayAbilities/Private/ModularAbilityPlayerController.cpp @@ -0,0 +1,54 @@ +#include "ModularAbilityPlayerController.h" + +#include "ModularAbilityPlayerState.h" +#include "ActorComponent/ModularAbilitySystemComponent.h" + +#include UE_INLINE_GENERATED_CPP_BY_NAME(ModularAbilityPlayerController) + +AModularAbilityPlayerController::AModularAbilityPlayerController(const FObjectInitializer& ObjectInitializer) + : Super(ObjectInitializer) +{ + AbilitySystemComponent = nullptr; +} + +void AModularAbilityPlayerController::OnPossess(APawn* APawn) +{ + Super::OnPossess(APawn); + + if (auto* PS = GetPlayerState()) + { + AbilitySystemComponent = PS->GetModularAbilitySystemComponent(); + } +} + +void AModularAbilityPlayerController::OnUnPossess() +{ + AbilitySystemComponent = nullptr; + + Super::OnUnPossess(); +} + +void AModularAbilityPlayerController::PostProcessInput(const float DeltaTime, const bool bGamePaused) +{ + if (AbilitySystemComponent.IsValid()) + { + AbilitySystemComponent->ProcessAbilityInput(DeltaTime, bGamePaused); + } + + Super::PostProcessInput(DeltaTime, bGamePaused); +} + +UModularAbilitySystemComponent* AModularAbilityPlayerController::GetAbilitySystemComponent() const +{ + return AbilitySystemComponent.Get(); +} + +void AModularAbilityPlayerController::OnRep_PlayerState() +{ + Super::OnRep_PlayerState(); + + if (const auto* PS = GetPlayerState()) + { + AbilitySystemComponent = PS->GetModularAbilitySystemComponent(); + } +} diff --git a/Source/ModularGameplayAbilities/Public/ModularAbilityPlayerController.h b/Source/ModularGameplayAbilities/Public/ModularAbilityPlayerController.h new file mode 100644 index 0000000..7f6c115 --- /dev/null +++ b/Source/ModularGameplayAbilities/Public/ModularAbilityPlayerController.h @@ -0,0 +1,37 @@ +#pragma once + +#include "CoreMinimal.h" +#include "CommonPlayerController.h" +#include "ModularAbilityPlayerController.generated.h" + + +class UModularAbilitySystemComponent; + +/** + * AModularAbilityPlayerController + * + * Drives ModularAbilitySystemComponent input processing. + * Inherits from ACommonPlayerController to work with CommonUI. + */ +UCLASS() +class MODULARGAMEPLAYABILITIES_API AModularAbilityPlayerController : public ACommonPlayerController +{ + GENERATED_BODY() + +public: + AModularAbilityPlayerController(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get()); + + virtual void OnPossess(APawn* APawn) override; + virtual void OnUnPossess() override; + virtual void PostProcessInput(const float DeltaTime, const bool bGamePaused) override; + + UModularAbilitySystemComponent* GetAbilitySystemComponent() const; + +protected: + virtual void OnRep_PlayerState() override; + +private: + // Cache ASC for input processing purposes + UPROPERTY(BlueprintReadOnly, Category = AbilitySystem, meta=(AllowPrivateAccess="true")) + TWeakObjectPtr AbilitySystemComponent; +};