58. Broadcasting Data Table Rows
This commit is contained in:
		
							
								
								
									
										
											BIN
										
									
								
								Project/Binaries/Win64/UnrealEditor-GasaEditor.dll
									 (Stored with Git LFS)
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Project/Binaries/Win64/UnrealEditor-GasaEditor.dll
									 (Stored with Git LFS)
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							| @@ -10,6 +10,7 @@ Tag_GlobalPPV=Global_PPV | ||||
| Template_PlayerCamera=/Game/Actors/BP_CameraMount.BP_CameraMount_C | ||||
| Template_HUD_HostUI=/Game/UI/UI_Host.UI_Host_C | ||||
| Template_HostWidgetController=/Game/UI/BP_HostWidgetController.BP_HostWidgetController_C | ||||
| TaggedMessageTable=/Game/Core/Tables/DT_TaggedMessages.DT_TaggedMessages | ||||
|  | ||||
| [/Script/GameplayAbilities.AbilitySystemGlobals] | ||||
| bUseDebugTargetFromHud=true | ||||
|   | ||||
| @@ -6,11 +6,15 @@ AllowEditorTagUnloading=True | ||||
| AllowGameTagUnloading=False | ||||
| FastReplication=False | ||||
| InvalidTagCharacters="\"\'," | ||||
| +GameplayTagTableList=/Game/Core/DT_PrimaryAttributes.DT_PrimaryAttributes | ||||
| +GameplayTagTableList=/Game/Core/Tables/DT_PrimaryAttributes.DT_PrimaryAttributes | ||||
| NumBitsForContainerSize=6 | ||||
| NetIndexFirstBitSegment=16 | ||||
| +GameplayTagList=(Tag="Attributes.Vital.Health",DevComment="") | ||||
| +GameplayTagList=(Tag="Attributes.Vital.Mana",DevComment="") | ||||
| +GameplayTagList=(Tag="Attributes.Vital.MaxHealth",DevComment="") | ||||
| +GameplayTagList=(Tag="Attributes.Vital.MaxMana",DevComment="") | ||||
| +GameplayTagList=(Tag="Message.Crystal.Health",DevComment="") | ||||
| +GameplayTagList=(Tag="Message.Crystal.Mana",DevComment="") | ||||
| +GameplayTagList=(Tag="Message.Potion.Health",DevComment="") | ||||
| +GameplayTagList=(Tag="Message.Potion.Mana",DevComment="") | ||||
|  | ||||
|   | ||||
| @@ -0,0 +1,9 @@ | ||||
| { | ||||
| 	"ColumnWidths": | ||||
| 	{ | ||||
| 		"Image": 487, | ||||
| 		"Tag": 246, | ||||
| 		"Message": 439, | ||||
| 		"MessageTemplate": 232 | ||||
| 	} | ||||
| } | ||||
| @@ -21,12 +21,7 @@ void UGasaAbilitySystemComp::EffectApplied(UAbilitySystemComponent* AbilitySyste | ||||
| { | ||||
| 	FGameplayTagContainer Tags; | ||||
| 	Spec.GetAllAssetTags(Tags); | ||||
| 	for (FGameplayTag const& Tag : Tags) | ||||
| 	{ | ||||
| 		// TODO(Ed): Broadcast the tag to the widget controller | ||||
| 		FString Msg = FString::Printf(TEXT("GE Tag: %s"), * Tag.ToString()); | ||||
| 		Log(Msg); | ||||
| 	} | ||||
| 	Event_OnEffectAppliedAssetTags.Broadcast(Tags); | ||||
| } | ||||
|  | ||||
| void UGasaAbilitySystemComp::InitAbilityActorInfo(AActor* InOwnerActor, AActor* InAvatarActor) | ||||
|   | ||||
| @@ -1,16 +1,22 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include "AbilitySystemComponent.h" | ||||
|  | ||||
| #include "GasaCommon.h" | ||||
|  | ||||
| #include "GasaAbilitySystemComponent.generated.h" | ||||
|  | ||||
|  | ||||
| DECLARE_MULTICAST_DELEGATE_OneParam(FEffectAssetTagsSig, FGameplayTagContainer const& /*Tags*/); | ||||
|  | ||||
|  | ||||
| UCLASS(BlueprintType) | ||||
| class GASA_API UGasaAbilitySystemComp : public UAbilitySystemComponent | ||||
| { | ||||
| 	GENERATED_BODY() | ||||
| public: | ||||
|  | ||||
| 	FEffectAssetTagsSig Event_OnEffectAppliedAssetTags; | ||||
| 	 | ||||
| 	// TODO(Ed): If hes only using this to bind the EffectApplied to a delegate, then just use the init override instead. | ||||
| 	void OnAbilityActorInfoSet(); | ||||
|  | ||||
|   | ||||
| @@ -23,6 +23,7 @@ | ||||
| struct FInputActionValue; | ||||
| struct FGameplayEffectContextHandle; | ||||
| struct FGameplayEffectModCallbackData; | ||||
| struct FGameplayTagContainer; | ||||
| struct FOnAttributeChangeData; | ||||
| struct FReplicationFlags; | ||||
|  | ||||
| @@ -44,6 +45,7 @@ class UInputAction; | ||||
| class UInputMappingContext; | ||||
| class USphereComponent; | ||||
| class USpringArmComponent; | ||||
| class UTexture2D; | ||||
| #pragma endregion Engine Forwards | ||||
|  | ||||
| #pragma region Engine Plugin Forwards | ||||
| @@ -72,6 +74,7 @@ class UGasaObject; | ||||
| class UGasaOverlay; | ||||
| class UGasaProgressBar; | ||||
| class UGasaSizeBox; | ||||
| class UGasaUserWidget; | ||||
| class UHostWidgetController; | ||||
| class UHUDHostWidget; | ||||
| class UWidgetController; | ||||
|   | ||||
| @@ -2,6 +2,14 @@ | ||||
|  | ||||
| #include "GasaCommon.h" | ||||
|  | ||||
| template<typename RowType> | ||||
| inline | ||||
| RowType* GetDataTableRowByTag(UDataTable* DT, FGameplayTag& Tag) | ||||
| { | ||||
| 	RowType* Row = DT->FindRow<RowType>(Tag.GetTagName(), TEXT("")); | ||||
| 	return Row; | ||||
| } | ||||
|  | ||||
| template<typename KeyType, typename ValueType> | ||||
| inline | ||||
| void RemoveKeys(TMap<KeyType, ValueType> Map, TArray<KeyType> Keys) | ||||
|   | ||||
| @@ -1,11 +1,12 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include "Engine/DataTable.h" | ||||
| #include "Engine/DeveloperSettings.h" | ||||
|  | ||||
| #include "GasaCommon.h" | ||||
|  | ||||
| #include "GasaDevOptions.generated.h" | ||||
|  | ||||
|  | ||||
| UCLASS(Config=Game, DefaultConfig, meta=(DisplayName="Gasa")) | ||||
| class GASA_API UGasaDevOptions : public UDeveloperSettings | ||||
| { | ||||
| @@ -15,6 +16,9 @@ public: | ||||
| 	// NOTE(Ed): Any Soft-References must have their includes defined in GasaDevOptions.cpp | ||||
| 	// They are used by GasaGen for the GasaDevOptionsCache | ||||
|  | ||||
| 	UPROPERTY(Config, EditAnywhere, BlueprintReadOnly, Category="UI") | ||||
| 	TSoftObjectPtr<UDataTable> TaggedMessageTable; | ||||
|  | ||||
| 	UPROPERTY(Config, EditAnywhere, BlueprintReadOnly, Category="UI") | ||||
| 	TSoftClassPtr<ACameraMount> Template_PlayerCamera; | ||||
|  | ||||
|   | ||||
| @@ -11,6 +11,9 @@ void FGasaDevOptionsCache::CachedDevOptions() | ||||
| { | ||||
| 	UGasaDevOptions* DevOpts = GetMutDevOptions(); | ||||
|  | ||||
| 	TaggedMessageTable = DevOpts->TaggedMessageTable.LoadSynchronous(); | ||||
| 	ensureMsgf( TaggedMessageTable != nullptr, TEXT( "TaggedMessageTable is null, DO NOT RUN PIE or else you may get a crash if not handled in BP or C++" ) ); | ||||
|  | ||||
| 	Template_PlayerCamera = DevOpts->Template_PlayerCamera.LoadSynchronous(); | ||||
| 	ensureMsgf( | ||||
| 	    Template_PlayerCamera != nullptr, TEXT( "Template_PlayerCamera is null, DO NOT RUN PIE or else you may get a crash if not handled in BP or C++" ) | ||||
|   | ||||
| @@ -8,6 +8,8 @@ struct GASA_API FGasaDevOptionsCache | ||||
| { | ||||
| 	GENERATED_BODY() | ||||
|  | ||||
| 	UPROPERTY() | ||||
| 	UObject* TaggedMessageTable; | ||||
| 	UPROPERTY() | ||||
| 	UClass* Template_PlayerCamera; | ||||
| 	UPROPERTY() | ||||
|   | ||||
| @@ -2,6 +2,9 @@ | ||||
| #include "AbilitySystem/GasaAbilitySystemComponent_Inlines.h" | ||||
| #include "AbilitySystem/GasaAttributeSet.h" | ||||
| #include "GameplayEffectTypes.h" | ||||
| #include "GasaDevOptions.h" | ||||
| #include "TaggedMessageRow.h" | ||||
| using namespace Gasa; | ||||
|  | ||||
|  | ||||
|  | ||||
| @@ -30,6 +33,20 @@ void UHostWidgetController::MaxManaChanged( FOnAttributeChangeData const& Attrib | ||||
| } | ||||
| #pragma endregion Attribute Changed Callbacks | ||||
|  | ||||
| void UHostWidgetController::OnEffectAppliedAssetTags( FGameplayTagContainer const& AssetTags ) | ||||
| { | ||||
| 	UDataTable* TaggedMessages = GetDevOptions()->TaggedMessageTable.Get(); | ||||
| 	for ( FGameplayTag const& Tag : AssetTags ) | ||||
| 	{ | ||||
| 		FGameplayTag MessageTagCategory = FGameplayTag::RequestGameplayTag( FName( "Message" ) ); | ||||
| 		if ( ! Tag.MatchesTag( MessageTagCategory ) ) | ||||
| 			continue; | ||||
|  | ||||
| 		FTaggedMessageRow* Row = TaggedMessages->FindRow<FTaggedMessageRow>( Tag.GetTagName(), TEXT( "" ) ); | ||||
| 		OnTaggedAssetMessage.Broadcast( *Row ); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void UHostWidgetController::BroadcastInitialValues() | ||||
| { | ||||
| 	// This function is managed by: GenGasa/GenGasa_HostWidgetController.cpp | ||||
| @@ -66,4 +83,6 @@ void UHostWidgetController::BindCallbacksToDependencies() | ||||
| 	FOnGameplayAttributeValueChange& MaxManaAttributeChangedDelegate = | ||||
| 	    AbilitySystem->GetGameplayAttributeValueChangeDelegate( GasaAttribs->GetMaxManaAttribute() ); | ||||
| 	MaxManaAttributeChangedDelegate.AddUObject( this, &ThisClass::MaxManaChanged ); | ||||
|  | ||||
| 	AbilitySystem->Event_OnEffectAppliedAssetTags.AddUObject( this, &UHostWidgetController::OnEffectAppliedAssetTags ); | ||||
| } | ||||
|   | ||||
| @@ -1,7 +1,10 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include "GasaCommon.h" | ||||
| #include "TaggedMessageRow.h" | ||||
| #include "WidgetController.h" | ||||
| #include "HostWidgetController.generated.h" | ||||
|  | ||||
| DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam( FAttributeFloatChangedSig, float, NewValue ); | ||||
|  | ||||
| UCLASS( Blueprintable, BlueprintType ) | ||||
| @@ -30,6 +33,11 @@ public: | ||||
| 	void MaxManaChanged( FOnAttributeChangeData const& Data ); | ||||
| #pragma endregion Attribute Events | ||||
|  | ||||
| 	UPROPERTY( BlueprintAssignable, Category = "Messages" ) | ||||
| 	FTaggedMessageRowSig OnTaggedAssetMessage; | ||||
|  | ||||
| 	void OnEffectAppliedAssetTags( FGameplayTagContainer const& AssetTags ); | ||||
|  | ||||
| #pragma region WidgetController | ||||
| 	void BroadcastInitialValues() override; | ||||
| 	void BindCallbacksToDependencies() override; | ||||
|   | ||||
							
								
								
									
										28
									
								
								Project/Source/Gasa/UI/TaggedMessageRow.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								Project/Source/Gasa/UI/TaggedMessageRow.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include "GameplayTagContainer.h" | ||||
| #include "GasaCommon.h" | ||||
| #include "Engine/DataTable.h" | ||||
| #include "Templates/SubclassOf.h" | ||||
|  | ||||
| #include "TaggedMessageRow.generated.h" | ||||
|  | ||||
| USTRUCT(BlueprintType) | ||||
| struct FTaggedMessageRow : public FTableRowBase | ||||
| { | ||||
| 	GENERATED_BODY() | ||||
| 	 | ||||
| 	UPROPERTY(EditAnywhere, BlueprintReadOnly) | ||||
| 	FGameplayTag Tag; | ||||
|  | ||||
| 	UPROPERTY(EditAnywhere, BlueprintReadOnly) | ||||
| 	FText Message; | ||||
|  | ||||
| 	UPROPERTY(EditAnywhere, BlueprintReadOnly) | ||||
| 	TSubclassOf<UGasaUserWidget> MessageTemplate; | ||||
|  | ||||
| 	UPROPERTY(EditAnywhere, BlueprintReadOnly) | ||||
| 	UTexture2D* Image; | ||||
| }; | ||||
|  | ||||
| DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FTaggedMessageRowSig, FTaggedMessageRow, Message); | ||||
| @@ -209,6 +209,8 @@ void gen_UHostWidgetController() | ||||
| 					UGasaAttributeSet*      GasaAttribs   = Cast<UGasaAttributeSet>( Data.Attributes ); | ||||
|  | ||||
| 					<bindings> | ||||
|  | ||||
| 					AbilitySystem->Event_OnEffectAppliedAssetTags.AddUObject(this, & UHostWidgetController::OnEffectAppliedAssetTags); | ||||
| 				}) | ||||
| 			)); | ||||
| 		} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user