Bugfix Expiry Timers Not Getting Invalidated
This commit is contained in:
parent
939d1e8b92
commit
2f47693608
BIN
Content/Dialogue/NPCTest.uasset
(Stored with Git LFS)
BIN
Content/Dialogue/NPCTest.uasset
(Stored with Git LFS)
Binary file not shown.
@ -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<UStatusSystem>(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);
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
};
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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<UImage>(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();
|
||||
}
|
||||
|
@ -65,4 +65,7 @@ public:
|
||||
|
||||
UFUNCTION()
|
||||
void RemoveStatusEffect(UStatusEffect* StatusEffect);
|
||||
|
||||
UFUNCTION()
|
||||
FActiveStatusEffect GetActiveStatusEffect(UStatusEffect* StatusEffect);
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user