Updated StatusSystem for Base UI and Time Functionality

This commit is contained in:
Philip W 2023-02-23 03:05:09 +00:00
parent 56b61bd1d2
commit adba724dba
4 changed files with 77 additions and 16 deletions

View File

@ -3,9 +3,10 @@
#include "StatusEffect.h" #include "StatusEffect.h"
void UStatusEffect::Invoke(ACharacter* Character) void UStatusEffect::Invoke(AActor* Character)
{
}
void UStatusEffect::OnExpiry(AActor* Character)
{ {
} }

View File

@ -15,13 +15,18 @@ class THE_TWILIGHT_ABYSS_API UStatusEffect : public UObject
GENERATED_BODY() GENERATED_BODY()
public: public:
UPROPERTY() UPROPERTY(EditAnywhere, BlueprintReadWrite)
FString Name; FString Name;
UPROPERTY() UPROPERTY(EditAnywhere, BlueprintReadWrite)
FString Description; FString Description;
UPROPERTY() UPROPERTY(EditAnywhere, BlueprintReadWrite)
UStaticMesh* Icon; float BaseDuration;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
UTexture2D* Icon;
UFUNCTION() UFUNCTION()
virtual void Invoke(ACharacter* Character); virtual void Invoke(AActor* Character);
UFUNCTION()
virtual void OnExpiry(AActor* Character);
}; };

View File

@ -4,6 +4,10 @@
#include "StatusSystem.h" #include "StatusSystem.h"
#include <Runtime/Engine/Classes/Kismet/GameplayStatics.h> #include <Runtime/Engine/Classes/Kismet/GameplayStatics.h>
#include "Blueprint/UserWidget.h"
#include "Components/Image.h"
#include "Components/TextBlock.h"
// Sets default values for this component's properties // Sets default values for this component's properties
UStatusSystem::UStatusSystem() UStatusSystem::UStatusSystem()
{ {
@ -11,7 +15,13 @@ UStatusSystem::UStatusSystem()
// off to improve performance if you don't need them. // off to improve performance if you don't need them.
PrimaryComponentTick.bCanEverTick = true; PrimaryComponentTick.bCanEverTick = true;
// ... if (HUDStatusIndicatorsWidget != nullptr)
{
static ConstructorHelpers::FClassFinder<UUserWidget> HUDStatusIndicatorsWidgetClassFinder(TEXT("/Game/Blueprints/Status_UI/StatusIndicator"));
HUDStatusIndicatorsWidget = HUDStatusIndicatorsWidgetClassFinder.Class;
static ConstructorHelpers::FClassFinder<UUserWidget> HUDStatusIconWidgetClassFinder(TEXT("/Game/Blueprints/Status_UI/StatusIcon"));
HUDStatusIconWidget = HUDStatusIconWidgetClassFinder.Class;
}
} }
@ -20,8 +30,9 @@ void UStatusSystem::BeginPlay()
{ {
Super::BeginPlay(); Super::BeginPlay();
// ... HUDStatusIndicators = CreateWidget<UUserWidget>(GetWorld(), HUDStatusIndicatorsWidget);
HUDStatusIndicators->AddToViewport();
StatusIconsBox = Cast<UWrapBox>(HUDStatusIndicators->GetWidgetFromName(TEXT("StatusIndicators")));
} }
@ -30,12 +41,38 @@ void UStatusSystem::TickComponent(float DeltaTime, ELevelTick TickType, FActorCo
{ {
Super::TickComponent(DeltaTime, TickType, ThisTickFunction); Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
for (FActiveStatusEffect StatusEffect : ActiveStatusEffects) for (FActiveStatusEffect ActiveStatusEffect : ActiveStatusEffects)
{ {
if (StatusEffect.TimeTillExpiry > UGameplayStatics::GetRealTimeSeconds(GetWorld())) if (ActiveStatusEffect.TimeTillExpiry >= UGameplayStatics::GetRealTimeSeconds(GetWorld()))
{ {
ActiveStatusEffects.Remove(StatusEffect); ActiveStatusEffect.StatusEffect->OnExpiry(GetOwner());
ActiveStatusEffects.Remove(ActiveStatusEffect);
} }
} }
} }
void UStatusSystem::AddStatusEffect(UStatusEffect* StatusEffect, const float DurationMultiplier)
{
FActiveStatusEffect NewStatusEffect;
NewStatusEffect.StatusEffect = StatusEffect;
NewStatusEffect.TimeInitiated = UGameplayStatics::GetRealTimeSeconds(GetWorld());
NewStatusEffect.TimeTillExpiry = UGameplayStatics::GetRealTimeSeconds(GetWorld()) + StatusEffect->BaseDuration * DurationMultiplier;
NewStatusEffect.StatusIcon = CreateWidget<UUserWidget>(GetWorld(), HUDStatusIconWidget);
UImage* StatusIconImage = Cast<UImage>(NewStatusEffect.StatusIcon->GetWidgetFromName(TEXT("StatusIconImage")));
StatusIconImage->SetBrushFromTexture(StatusEffect->Icon);
StatusIconsBox->AddChild(NewStatusEffect.StatusIcon);
ActiveStatusEffects.Add(NewStatusEffect);
}
void UStatusSystem::RemoveStatusEffect(UStatusEffect* StatusEffect)
{
if (ActiveStatusEffects.Contains(FActiveStatusEffect{0, 0, StatusEffect, nullptr}))
{
ActiveStatusEffects.Remove(FActiveStatusEffect{0, 0, StatusEffect, nullptr});
}
else
{
UE_LOG(LogTemp, Warning, TEXT("StatusEffect not found in ActiveStatusEffects"));
}
}

View File

@ -5,6 +5,8 @@
#include "CoreMinimal.h" #include "CoreMinimal.h"
#include "Components/ActorComponent.h" #include "Components/ActorComponent.h"
#include "StatusEffect.h" #include "StatusEffect.h"
#include "Components/TextBlock.h"
#include "Components/WrapBox.h"
#include "StatusSystem.generated.h" #include "StatusSystem.generated.h"
USTRUCT() USTRUCT()
@ -20,6 +22,9 @@ struct FActiveStatusEffect
UPROPERTY() UPROPERTY()
UStatusEffect* StatusEffect; UStatusEffect* StatusEffect;
UPROPERTY()
UUserWidget* StatusIcon;
bool operator==(const FActiveStatusEffect& Comp) const bool operator==(const FActiveStatusEffect& Comp) const
{ {
return StatusEffect == Comp.StatusEffect; return StatusEffect == Comp.StatusEffect;
@ -35,6 +40,15 @@ public:
// Sets default values for this component's properties // Sets default values for this component's properties
UStatusSystem(); UStatusSystem();
UPROPERTY()
TSubclassOf<UUserWidget> HUDStatusIndicatorsWidget;
UPROPERTY()
TSubclassOf<UUserWidget> HUDStatusIconWidget;
UPROPERTY()
UUserWidget* HUDStatusIndicators;
UPROPERTY()
UWrapBox* StatusIconsBox;
UPROPERTY() UPROPERTY()
TArray<FActiveStatusEffect> ActiveStatusEffects; TArray<FActiveStatusEffect> ActiveStatusEffects;
@ -46,5 +60,9 @@ public:
// Called every frame // Called every frame
virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override; virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
UFUNCTION()
void AddStatusEffect(UStatusEffect* StatusEffect, float DurationMultiplier = 1.0f);
UFUNCTION()
void RemoveStatusEffect(UStatusEffect* StatusEffect);
}; };