From 22385f63bbb936516e97be03e7d194450ecc22da Mon Sep 17 00:00:00 2001 From: Ed_ Date: Fri, 26 Apr 2024 20:08:08 -0400 Subject: [PATCH] 58. Broadcasting Data Table Rows --- .../Win64/UnrealEditor-GasaEditor.dll | 2 +- Project/Config/DefaultGame.ini | 1 + Project/Config/DefaultGameplayTags.ini | 6 +++- .../DT_TaggedMessages.json | 9 ++++++ .../GasaAbilitySystemComponent.cpp | 7 +---- .../GasaAbilitySystemComponent.h | 8 +++++- Project/Source/Gasa/GasaCommon.h | 3 ++ Project/Source/Gasa/GasaContainers.h | 8 ++++++ Project/Source/Gasa/GasaDevOptions.h | 6 +++- Project/Source/Gasa/GasaDevOptionsCache.cpp | 3 ++ Project/Source/Gasa/GasaDevOptionsCache.h | 2 ++ .../Source/Gasa/UI/HostWIdgetController.cpp | 19 +++++++++++++ Project/Source/Gasa/UI/HostWidgetController.h | 8 ++++++ Project/Source/Gasa/UI/TaggedMessageRow.h | 28 +++++++++++++++++++ .../GasaGen/GasaGen_HostWidgetController.cpp | 2 ++ 15 files changed, 102 insertions(+), 10 deletions(-) create mode 100644 Project/Saved/AssetData/DataTableEditorLayout/DT_TaggedMessages.json create mode 100644 Project/Source/Gasa/UI/TaggedMessageRow.h diff --git a/Project/Binaries/Win64/UnrealEditor-GasaEditor.dll b/Project/Binaries/Win64/UnrealEditor-GasaEditor.dll index b0293b3..abd7464 100644 --- a/Project/Binaries/Win64/UnrealEditor-GasaEditor.dll +++ b/Project/Binaries/Win64/UnrealEditor-GasaEditor.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:873a05db7e7d47efe7f28c35f73a556f508724c60c6003f15139c7a183b498a1 +oid sha256:29f79da21a9eb63e3fb29099f298d1685caa74fca443a7fdaf79dc3d0fc6242d size 79360 diff --git a/Project/Config/DefaultGame.ini b/Project/Config/DefaultGame.ini index 830df19..87abe9a 100644 --- a/Project/Config/DefaultGame.ini +++ b/Project/Config/DefaultGame.ini @@ -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 diff --git a/Project/Config/DefaultGameplayTags.ini b/Project/Config/DefaultGameplayTags.ini index 87ede76..2c7ca1e 100644 --- a/Project/Config/DefaultGameplayTags.ini +++ b/Project/Config/DefaultGameplayTags.ini @@ -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="") diff --git a/Project/Saved/AssetData/DataTableEditorLayout/DT_TaggedMessages.json b/Project/Saved/AssetData/DataTableEditorLayout/DT_TaggedMessages.json new file mode 100644 index 0000000..e0fd6bf --- /dev/null +++ b/Project/Saved/AssetData/DataTableEditorLayout/DT_TaggedMessages.json @@ -0,0 +1,9 @@ +{ + "ColumnWidths": + { + "Image": 487, + "Tag": 246, + "Message": 439, + "MessageTemplate": 232 + } +} \ No newline at end of file diff --git a/Project/Source/Gasa/AbilitySystem/GasaAbilitySystemComponent.cpp b/Project/Source/Gasa/AbilitySystem/GasaAbilitySystemComponent.cpp index 99d010c..5390b4e 100644 --- a/Project/Source/Gasa/AbilitySystem/GasaAbilitySystemComponent.cpp +++ b/Project/Source/Gasa/AbilitySystem/GasaAbilitySystemComponent.cpp @@ -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) diff --git a/Project/Source/Gasa/AbilitySystem/GasaAbilitySystemComponent.h b/Project/Source/Gasa/AbilitySystem/GasaAbilitySystemComponent.h index 10bb10f..a258758 100644 --- a/Project/Source/Gasa/AbilitySystem/GasaAbilitySystemComponent.h +++ b/Project/Source/Gasa/AbilitySystem/GasaAbilitySystemComponent.h @@ -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(); diff --git a/Project/Source/Gasa/GasaCommon.h b/Project/Source/Gasa/GasaCommon.h index 8f29e2f..f8ab2ef 100644 --- a/Project/Source/Gasa/GasaCommon.h +++ b/Project/Source/Gasa/GasaCommon.h @@ -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; diff --git a/Project/Source/Gasa/GasaContainers.h b/Project/Source/Gasa/GasaContainers.h index 770212d..ece7845 100644 --- a/Project/Source/Gasa/GasaContainers.h +++ b/Project/Source/Gasa/GasaContainers.h @@ -2,6 +2,14 @@ #include "GasaCommon.h" +template +inline +RowType* GetDataTableRowByTag(UDataTable* DT, FGameplayTag& Tag) +{ + RowType* Row = DT->FindRow(Tag.GetTagName(), TEXT("")); + return Row; +} + template inline void RemoveKeys(TMap Map, TArray Keys) diff --git a/Project/Source/Gasa/GasaDevOptions.h b/Project/Source/Gasa/GasaDevOptions.h index 1f125be..e0e5917 100644 --- a/Project/Source/Gasa/GasaDevOptions.h +++ b/Project/Source/Gasa/GasaDevOptions.h @@ -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 TaggedMessageTable; + UPROPERTY(Config, EditAnywhere, BlueprintReadOnly, Category="UI") TSoftClassPtr Template_PlayerCamera; diff --git a/Project/Source/Gasa/GasaDevOptionsCache.cpp b/Project/Source/Gasa/GasaDevOptionsCache.cpp index f676587..a887f76 100644 --- a/Project/Source/Gasa/GasaDevOptionsCache.cpp +++ b/Project/Source/Gasa/GasaDevOptionsCache.cpp @@ -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++" ) diff --git a/Project/Source/Gasa/GasaDevOptionsCache.h b/Project/Source/Gasa/GasaDevOptionsCache.h index 04d842d..818c7d3 100644 --- a/Project/Source/Gasa/GasaDevOptionsCache.h +++ b/Project/Source/Gasa/GasaDevOptionsCache.h @@ -8,6 +8,8 @@ struct GASA_API FGasaDevOptionsCache { GENERATED_BODY() + UPROPERTY() + UObject* TaggedMessageTable; UPROPERTY() UClass* Template_PlayerCamera; UPROPERTY() diff --git a/Project/Source/Gasa/UI/HostWIdgetController.cpp b/Project/Source/Gasa/UI/HostWIdgetController.cpp index 34c3010..bf8178e 100644 --- a/Project/Source/Gasa/UI/HostWIdgetController.cpp +++ b/Project/Source/Gasa/UI/HostWIdgetController.cpp @@ -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( 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 ); } diff --git a/Project/Source/Gasa/UI/HostWidgetController.h b/Project/Source/Gasa/UI/HostWidgetController.h index 0fd65c3..be54826 100644 --- a/Project/Source/Gasa/UI/HostWidgetController.h +++ b/Project/Source/Gasa/UI/HostWidgetController.h @@ -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; diff --git a/Project/Source/Gasa/UI/TaggedMessageRow.h b/Project/Source/Gasa/UI/TaggedMessageRow.h new file mode 100644 index 0000000..b5471ff --- /dev/null +++ b/Project/Source/Gasa/UI/TaggedMessageRow.h @@ -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 MessageTemplate; + + UPROPERTY(EditAnywhere, BlueprintReadOnly) + UTexture2D* Image; +}; + +DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FTaggedMessageRowSig, FTaggedMessageRow, Message); diff --git a/Project/Source/GasaGen/GasaGen_HostWidgetController.cpp b/Project/Source/GasaGen/GasaGen_HostWidgetController.cpp index f24cc5e..bd1a678 100644 --- a/Project/Source/GasaGen/GasaGen_HostWidgetController.cpp +++ b/Project/Source/GasaGen/GasaGen_HostWidgetController.cpp @@ -209,6 +209,8 @@ void gen_UHostWidgetController() UGasaAttributeSet* GasaAttribs = Cast( Data.Attributes ); + + AbilitySystem->Event_OnEffectAppliedAssetTags.AddUObject(this, & UHostWidgetController::OnEffectAppliedAssetTags); }) )); }