From 265564c810481e561432a339c619e3f71be9d894 Mon Sep 17 00:00:00 2001 From: Michael Delva Date: Fri, 16 May 2025 18:05:13 +0200 Subject: [PATCH] Fixed GBFOwningPlayerTagsVisibilityBorder to listen on the player controller OnPossessedChangedDelegate when it does not a pawn --- .../GBFOwningPlayerTagsVisibilityBorder.cpp | 87 ++++++++++++------- .../GBFOwningPlayerTagsVisibilityBorder.h | 4 + 2 files changed, 59 insertions(+), 32 deletions(-) diff --git a/Source/GameBaseFramework/Private/UI/Widgets/GBFOwningPlayerTagsVisibilityBorder.cpp b/Source/GameBaseFramework/Private/UI/Widgets/GBFOwningPlayerTagsVisibilityBorder.cpp index 563b883a..f3dd1b81 100644 --- a/Source/GameBaseFramework/Private/UI/Widgets/GBFOwningPlayerTagsVisibilityBorder.cpp +++ b/Source/GameBaseFramework/Private/UI/Widgets/GBFOwningPlayerTagsVisibilityBorder.cpp @@ -1,9 +1,8 @@ #include "UI/Widgets/GBFOwningPlayerTagsVisibilityBorder.h" -#include "AbilitySystemBlueprintLibrary.h" -#include "AbilitySystemComponent.h" -#include "GameFramework/Pawn.h" - +#include +#include +#include #include UGBFOwningPlayerTagsVisibilityBorder::UGBFOwningPlayerTagsVisibilityBorder( const FObjectInitializer & object_initializer ) : @@ -32,17 +31,7 @@ void UGBFOwningPlayerTagsVisibilityBorder::UpdateVisibility() { if ( auto * pc = lp->GetPlayerController( GetWorld() ) ) { - if ( auto * pawn = pc->GetPawn() ) - { - if ( auto * interface = Cast< IGameplayTagAssetInterface >( pawn ) ) - { - FGameplayTagContainer tags; - interface->GetOwnedGameplayTags( tags ); - - const auto is_visible = VisibilityQuery.Matches( tags ); - SetVisibility( is_visible ? VisibleType : HiddenType ); - } - } + RefreshVisibilityForPawn( pc->GetPawn() ); } } } @@ -55,23 +44,12 @@ void UGBFOwningPlayerTagsVisibilityBorder::ListenToTagChanged() { if ( auto * pawn = pc->GetPawn() ) { - if ( auto * asc = UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent( pawn ) ) - { - for ( const auto & [ tag, handle ] : GameplayTagListenerHandles ) - { - asc->UnregisterGameplayTagEvent( handle, tag ); - } - - GameplayTagListenerHandles.Reset(); - - TArray< FGameplayTag > query_tags; - VisibilityQuery.GetGameplayTagArray( query_tags ); - - for ( auto tag : query_tags ) - { - GameplayTagListenerHandles.Add( tag, asc->RegisterGameplayTagEvent( tag ).AddUObject( this, &ThisClass::OnTagsUpdated ) ); - } - } + OnPlayerControllerPawnChanged( nullptr, pawn ); + } + else + { + pc->OnPossessedPawnChanged.RemoveAll( this ); + pc->OnPossessedPawnChanged.AddUniqueDynamic( this, &UGBFOwningPlayerTagsVisibilityBorder::OnPlayerControllerPawnChanged ); } } } @@ -80,4 +58,49 @@ void UGBFOwningPlayerTagsVisibilityBorder::ListenToTagChanged() void UGBFOwningPlayerTagsVisibilityBorder::OnTagsUpdated( FGameplayTag /*gameplay_tag*/, int /*count*/ ) { UpdateVisibility(); +} + +void UGBFOwningPlayerTagsVisibilityBorder::RefreshVisibilityForPawn( APawn * pawn ) +{ + if ( pawn == nullptr ) + { + return; + } + + if ( auto * interface = Cast< IGameplayTagAssetInterface >( pawn ) ) + { + FGameplayTagContainer tags; + interface->GetOwnedGameplayTags( tags ); + + const auto is_visible = VisibilityQuery.Matches( tags ); + SetVisibility( is_visible ? VisibleType : HiddenType ); + } +} + +void UGBFOwningPlayerTagsVisibilityBorder::OnPlayerControllerPawnChanged( APawn * /*old_pawn*/, APawn * new_pawn ) +{ + if ( new_pawn == nullptr ) + { + return; + } + + if ( auto * asc = UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent( new_pawn ) ) + { + for ( const auto & [ tag, handle ] : GameplayTagListenerHandles ) + { + asc->UnregisterGameplayTagEvent( handle, tag ); + } + + GameplayTagListenerHandles.Reset(); + + TArray< FGameplayTag > query_tags; + VisibilityQuery.GetGameplayTagArray( query_tags ); + + for ( auto tag : query_tags ) + { + GameplayTagListenerHandles.Add( tag, asc->RegisterGameplayTagEvent( tag ).AddUObject( this, &ThisClass::OnTagsUpdated ) ); + } + } + + RefreshVisibilityForPawn( new_pawn ); } \ No newline at end of file diff --git a/Source/GameBaseFramework/Public/UI/Widgets/GBFOwningPlayerTagsVisibilityBorder.h b/Source/GameBaseFramework/Public/UI/Widgets/GBFOwningPlayerTagsVisibilityBorder.h index 84c239b9..1e9eb8f9 100644 --- a/Source/GameBaseFramework/Public/UI/Widgets/GBFOwningPlayerTagsVisibilityBorder.h +++ b/Source/GameBaseFramework/Public/UI/Widgets/GBFOwningPlayerTagsVisibilityBorder.h @@ -33,6 +33,10 @@ class GAMEBASEFRAMEWORK_API UGBFOwningPlayerTagsVisibilityBorder : public UCommo private: void OnTagsUpdated( FGameplayTag gameplay_tag, int count ); + void RefreshVisibilityForPawn( APawn * pawn ); + + UFUNCTION() + void OnPlayerControllerPawnChanged( APawn * old_pawn, APawn * new_pawn ); TMap< FGameplayTag, FDelegateHandle > GameplayTagListenerHandles; };