From 2f476936082749308ef2e82eaf10599ba56b8fbd Mon Sep 17 00:00:00 2001 From: PHILIP White Date: Sat, 25 Feb 2023 01:25:32 +0000 Subject: [PATCH] Bugfix Expiry Timers Not Getting Invalidated --- Content/Dialogue/NPCTest.uasset | 4 ++-- .../TurnBasedCombatV2/StatusEffect.cpp | 19 ++++++++++++++- .../TurnBasedCombatV2/StatusEffect.h | 8 ++++++- .../StatusEffects/HealOverTime.cpp | 8 +++---- .../StatusEffects/HealOverTime.h | 2 +- .../TurnBasedCombatV2/StatusSystem.cpp | 23 +++++++++---------- .../TurnBasedCombatV2/StatusSystem.h | 3 +++ 7 files changed, 46 insertions(+), 21 deletions(-) diff --git a/Content/Dialogue/NPCTest.uasset b/Content/Dialogue/NPCTest.uasset index e33f5cc..7ee990d 100644 --- a/Content/Dialogue/NPCTest.uasset +++ b/Content/Dialogue/NPCTest.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3d8d35e08f9a82472293b350e194a815b8e58c85084e33c6211de9f7c59a67a8 -size 47133 +oid sha256:f99fe93ed5bc4534338fea5cabf8e1d078c3b91032f9813339bbc56ac21caf6b +size 46996 diff --git a/Source/the_twilight_abyss/TurnBasedCombatV2/StatusEffect.cpp b/Source/the_twilight_abyss/TurnBasedCombatV2/StatusEffect.cpp index 5ba1bda..97e825f 100644 --- a/Source/the_twilight_abyss/TurnBasedCombatV2/StatusEffect.cpp +++ b/Source/the_twilight_abyss/TurnBasedCombatV2/StatusEffect.cpp @@ -3,10 +3,27 @@ #include "StatusEffect.h" -void UStatusEffect::Invoke(AActor* Character) +#include "StatusSystem.h" +#include "Kismet/GameplayStatics.h" + +void UStatusEffect::Invoke(AActor* Character, float TimeOfExpiry) { + GetWorld()->GetTimerManager().SetTimer(ExpiryTimerHandle, [this, Character, TimeOfExpiry] { CheckForExpiry(TimeOfExpiry, Character); }, 1, true, 0); } void UStatusEffect::OnExpiry(AActor* Character) { + GetWorld()->GetTimerManager().ClearTimer(ExpiryTimerHandle); + UStatusSystem* StatusSystem = Cast(Character->GetComponentByClass(UStatusSystem::StaticClass())); + if (StatusSystem->GetActiveStatusEffect(this).StatusIcon == nullptr) return; + StatusSystem->GetActiveStatusEffect(this).StatusIcon->RemoveFromParent(); + StatusSystem->RemoveStatusEffect(this); +} + +void UStatusEffect::CheckForExpiry(const float TimeOfExpiry, AActor* Character) +{ + if (TimeOfExpiry <= UGameplayStatics::GetRealTimeSeconds(GetWorld())) + { + OnExpiry(Character); + } } diff --git a/Source/the_twilight_abyss/TurnBasedCombatV2/StatusEffect.h b/Source/the_twilight_abyss/TurnBasedCombatV2/StatusEffect.h index a11a1a7..11edd65 100644 --- a/Source/the_twilight_abyss/TurnBasedCombatV2/StatusEffect.h +++ b/Source/the_twilight_abyss/TurnBasedCombatV2/StatusEffect.h @@ -25,8 +25,14 @@ public: UTexture2D* Icon; UFUNCTION() - virtual void Invoke(AActor* Character); + virtual void Invoke(AActor* Character, float TimeOfExpiry); UFUNCTION() virtual void OnExpiry(AActor* Character); + +protected: + UPROPERTY() + FTimerHandle ExpiryTimerHandle; + UFUNCTION() + void CheckForExpiry(float TimeOfExpiry, AActor* Character); }; diff --git a/Source/the_twilight_abyss/TurnBasedCombatV2/StatusEffects/HealOverTime.cpp b/Source/the_twilight_abyss/TurnBasedCombatV2/StatusEffects/HealOverTime.cpp index 31bee82..4e6c2cc 100644 --- a/Source/the_twilight_abyss/TurnBasedCombatV2/StatusEffects/HealOverTime.cpp +++ b/Source/the_twilight_abyss/TurnBasedCombatV2/StatusEffects/HealOverTime.cpp @@ -17,14 +17,14 @@ void UHealOverTime::Heal(AActor* Character, const float Amount) const } } -void UHealOverTime::Invoke(AActor* Character) +void UHealOverTime::Invoke(AActor* Character, float TimeOfExpiry) { - Super::Invoke(Character); - GetWorld()->GetTimerManager().SetTimer(HealTimerHandle, [Character, this] { Heal(Character, 1); }, 1, true, 0); + Super::Invoke(Character, TimeOfExpiry); + GetWorld()->GetTimerManager().SetTimer(HealTimerHandle, [this, Character] { Heal(Character, 1); }, 1, true, 0); } void UHealOverTime::OnExpiry(AActor* Character) { + GetWorld()->GetTimerManager().ClearTimer(HealTimerHandle); Super::OnExpiry(Character); - HealTimerHandle.Invalidate(); } diff --git a/Source/the_twilight_abyss/TurnBasedCombatV2/StatusEffects/HealOverTime.h b/Source/the_twilight_abyss/TurnBasedCombatV2/StatusEffects/HealOverTime.h index 32c2855..74f1850 100644 --- a/Source/the_twilight_abyss/TurnBasedCombatV2/StatusEffects/HealOverTime.h +++ b/Source/the_twilight_abyss/TurnBasedCombatV2/StatusEffects/HealOverTime.h @@ -20,6 +20,6 @@ protected: public: FTimerHandle HealTimerHandle; - virtual void Invoke(AActor* Character) override; + virtual void Invoke(AActor* Character, float TimeOfExpiry) override; virtual void OnExpiry(AActor* Character) override; }; diff --git a/Source/the_twilight_abyss/TurnBasedCombatV2/StatusSystem.cpp b/Source/the_twilight_abyss/TurnBasedCombatV2/StatusSystem.cpp index 0a4432a..52cdf88 100644 --- a/Source/the_twilight_abyss/TurnBasedCombatV2/StatusSystem.cpp +++ b/Source/the_twilight_abyss/TurnBasedCombatV2/StatusSystem.cpp @@ -36,17 +36,6 @@ void UStatusSystem::BeginPlay() void UStatusSystem::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) { Super::TickComponent(DeltaTime, TickType, ThisTickFunction); - - for (FActiveStatusEffect ActiveStatusEffect : ActiveStatusEffects) - { - UE_LOG(LogTemp, Warning, TEXT("TimeTillExpiry: %f"), UGameplayStatics::GetRealTimeSeconds(GetWorld()) - ActiveStatusEffect.TimeTillExpiry); - if (ActiveStatusEffect.TimeTillExpiry >= UGameplayStatics::GetRealTimeSeconds(GetWorld())) - { - ActiveStatusEffect.StatusEffect->OnExpiry(GetOwner()); - ActiveStatusEffects.Remove(ActiveStatusEffect); - ActiveStatusEffect.StatusIcon->RemoveFromParent(); - } - } } void UStatusSystem::AddStatusEffect(UStatusEffect* StatusEffect, const float DurationMultiplier) @@ -59,7 +48,7 @@ void UStatusSystem::AddStatusEffect(UStatusEffect* StatusEffect, const float Dur UImage* StatusIconImage = Cast(NewStatusEffect.StatusIcon->GetWidgetFromName(TEXT("StatusIconImage"))); StatusIconImage->SetBrushFromTexture(StatusEffect->Icon); StatusIconsBox->AddChild(NewStatusEffect.StatusIcon); - NewStatusEffect.StatusEffect->Invoke(GetOwner()); + NewStatusEffect.StatusEffect->Invoke(GetOwner(), NewStatusEffect.TimeTillExpiry); ActiveStatusEffects.Add(NewStatusEffect); } @@ -75,3 +64,13 @@ void UStatusSystem::RemoveStatusEffect(UStatusEffect* StatusEffect) UE_LOG(LogTemp, Warning, TEXT("StatusEffect not found in ActiveStatusEffects")); } } + +FActiveStatusEffect UStatusSystem::GetActiveStatusEffect(UStatusEffect* StatusEffect) +{ + if (ActiveStatusEffects.Contains(FActiveStatusEffect{0, 0, StatusEffect, nullptr})) + { + return ActiveStatusEffects[ActiveStatusEffects.Find(FActiveStatusEffect{0, 0, StatusEffect, nullptr})]; + } + UE_LOG(LogTemp, Warning, TEXT("StatusEffect not found in ActiveStatusEffects")); + return FActiveStatusEffect(); +} diff --git a/Source/the_twilight_abyss/TurnBasedCombatV2/StatusSystem.h b/Source/the_twilight_abyss/TurnBasedCombatV2/StatusSystem.h index 7683878..253dd7b 100644 --- a/Source/the_twilight_abyss/TurnBasedCombatV2/StatusSystem.h +++ b/Source/the_twilight_abyss/TurnBasedCombatV2/StatusSystem.h @@ -65,4 +65,7 @@ public: UFUNCTION() void RemoveStatusEffect(UStatusEffect* StatusEffect); + + UFUNCTION() + FActiveStatusEffect GetActiveStatusEffect(UStatusEffect* StatusEffect); };