From 003853d79d9f7aeb40acf24fe8e9685086536337 Mon Sep 17 00:00:00 2001 From: Viktor Blomme Date: Sat, 24 May 2025 12:21:20 +0200 Subject: [PATCH 1/2] First iteration --- .../Components/GBFHeroComponent.cpp | 48 ++++++++++++++++++- .../Characters/Components/GBFHeroComponent.h | 4 ++ 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/Source/GameBaseFramework/Private/Characters/Components/GBFHeroComponent.cpp b/Source/GameBaseFramework/Private/Characters/Components/GBFHeroComponent.cpp index f1f0a831..9fe621ab 100644 --- a/Source/GameBaseFramework/Private/Characters/Components/GBFHeroComponent.cpp +++ b/Source/GameBaseFramework/Private/Characters/Components/GBFHeroComponent.cpp @@ -117,11 +117,12 @@ void UGBFHeroComponent::HandleChangeInitState( UGameFrameworkComponentManager * pawn_ext_comp->InitializeAbilitySystem( player_state->GetGBFAbilitySystemComponent(), player_state ); } - if ( const auto * pc = GetController< AGBFPlayerController >() ) + if ( auto * pc = GetController< AGBFPlayerController >() ) { if ( pawn->InputComponent != nullptr ) { InitializePlayerInput( pawn->InputComponent ); + pc->OnPossessedPawnChanged.AddDynamic( this, &ThisClass::OnPossessedPawnChanged ); } // Hook up the delegate for all pawns, in case we spectate later @@ -255,6 +256,25 @@ void UGBFHeroComponent::OnRegister() } } +void UGBFHeroComponent::OnUnregister() +{ + Super::OnUnregister(); + + const auto * pawn = GetPawn< APawn >(); + if ( pawn == nullptr ) + { + return; + } + + auto * pc = pawn->GetController< APlayerController >(); + if ( pc == nullptr ) + { + return; + } + + pc->OnPossessedPawnChanged.RemoveDynamic( this, &ThisClass::OnPossessedPawnChanged ); +} + void UGBFHeroComponent::BindToRequiredOnActorInitStateChanged() { BindOnActorInitStateChanged( UGBFPawnExtensionComponent::NAME_ActorFeatureName, GBFTag_InitState_DataInitialized, false ); @@ -394,4 +414,30 @@ TSubclassOf< UGBFCameraMode > UGBFHeroComponent::DetermineCameraMode() const } return nullptr; +} + +void UGBFHeroComponent::OnPossessedPawnChanged( APawn * old_pawn, APawn * new_pawn ) +{ + if ( new_pawn == nullptr ) + { + bReadyToBindInputs = false; + return; + } + + if ( new_pawn->InputComponent == nullptr ) + { + return; + } + + if ( bReadyToBindInputs ) + { + return; + } + + if ( !HasReachedInitState( GBFTag_InitState_DataInitialized ) ) + { + return; + } + + InitializePlayerInput( new_pawn->InputComponent ); } \ No newline at end of file diff --git a/Source/GameBaseFramework/Public/Characters/Components/GBFHeroComponent.h b/Source/GameBaseFramework/Public/Characters/Components/GBFHeroComponent.h index a59300e3..6d70ee99 100644 --- a/Source/GameBaseFramework/Public/Characters/Components/GBFHeroComponent.h +++ b/Source/GameBaseFramework/Public/Characters/Components/GBFHeroComponent.h @@ -62,6 +62,7 @@ class GAMEBASEFRAMEWORK_API UGBFHeroComponent : public UGBFPawnComponent protected: void OnRegister() override; + void OnUnregister() override; void BindToRequiredOnActorInitStateChanged() override; void InitializePlayerInput( UInputComponent * player_input_component ); void Input_AbilityInputTagPressed( FGameplayTag input_tag ); @@ -70,6 +71,9 @@ class GAMEBASEFRAMEWORK_API UGBFHeroComponent : public UGBFPawnComponent TSubclassOf< UGBFCameraMode > DetermineCameraMode() const; private: + UFUNCTION() + void OnPossessedPawnChanged( APawn * old_pawn, APawn * new_pawn ); + FSimpleMulticastDelegate::FDelegate OnPawnReadyToInitializeDelegate; // True when player input bindings have been applyed, will never be true for non-players From 6e450c8459a6a535c39f3de18e2a206b01ac345e Mon Sep 17 00:00:00 2001 From: Viktor Blomme Date: Sat, 24 May 2025 12:51:55 +0200 Subject: [PATCH 2/2] Fixup issues --- .../Private/Characters/Components/GBFHeroComponent.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Source/GameBaseFramework/Private/Characters/Components/GBFHeroComponent.cpp b/Source/GameBaseFramework/Private/Characters/Components/GBFHeroComponent.cpp index 9fe621ab..22421000 100644 --- a/Source/GameBaseFramework/Private/Characters/Components/GBFHeroComponent.cpp +++ b/Source/GameBaseFramework/Private/Characters/Components/GBFHeroComponent.cpp @@ -416,10 +416,11 @@ TSubclassOf< UGBFCameraMode > UGBFHeroComponent::DetermineCameraMode() const return nullptr; } -void UGBFHeroComponent::OnPossessedPawnChanged( APawn * old_pawn, APawn * new_pawn ) +void UGBFHeroComponent::OnPossessedPawnChanged( APawn * /*old_pawn*/, APawn * new_pawn ) { if ( new_pawn == nullptr ) { + BoundActionsByInputConfig.Empty(); bReadyToBindInputs = false; return; }