Improvements to watering and some stat forge fixes

This commit is contained in:
2026-09-14 21:15:31 +02:00
parent f7e5adc1cc
commit aad09dbaa5
26 changed files with 282 additions and 151 deletions

View File

@@ -15,7 +15,7 @@ FActiveGameplayStatEffect FActiveGameplayStatEffect::CreateNew(UObject* SourceOb
ActiveEffect.GameplayEffectClass = Effect->GetClass();
ActiveEffect.StackCount = Stacks;
ActiveEffect.GameplayEffectInstance = Effect;
ActiveEffect.RemainingDuration = Effect->Duration;
ActiveEffect.RemainingDuration = Effect->GetDuration();
ActiveEffect.NextTickDuration = Effect->TickPeriod;
ActiveEffect.bIsTicking = ActiveEffect.NextTickDuration > 0.f;
ActiveEffect.Handle = FGuid::NewGuid();
@@ -192,7 +192,7 @@ FGuid UStatForgeComponent::ApplyGameplayStatEffect(const TSubclassOf<UGameplaySt
Effect->AppendDataValueMap(DataValueMap);
FGuid GuidToReturn;
if (Effect->Duration == GameplayStatEffectDuration_Instant)
if (Effect->DurationType == EDurationType::Instant)
{
Internal_ApplyGameplayStatEffect(Effect);
}
@@ -340,21 +340,24 @@ void UStatForgeComponent::TickEffects(float DeltaTime)
for (int32 i = ActiveEffectsArray.Num() - 1; i >= 0; --i)
{
StatNames.Append(GetAffectedStatsFromEffect(ActiveEffectsArray[i].GameplayEffectInstance));
if (!CanTickEffect(ActiveEffectsArray[i].GameplayEffectInstance.Get()))
{
ActiveEffectsArray[i].RemainingDuration = 0;
}
else
{
ActiveEffectsArray[i].RemainingDuration -= DeltaTime;
}
if (ActiveEffectsArray[i].RemainingDuration <= 0.f)
if (ActiveEffectsArray[i].GameplayEffectInstance->DurationType == EDurationType::Duration)
{
RemoveGameplayStatEffect(ActiveEffectsArray[i].Handle);
if (!CanTickEffect(ActiveEffectsArray[i].GameplayEffectInstance.Get()))
{
ActiveEffectsArray[i].RemainingDuration = 0;
}
else
{
ActiveEffectsArray[i].RemainingDuration -= DeltaTime;
}
if (ActiveEffectsArray[i].RemainingDuration <= 0.f)
{
RemoveGameplayStatEffect(ActiveEffectsArray[i].Handle);
continue;
continue;
}
}
if (ActiveEffectsArray[i].GameplayEffectInstance->TickPeriod > 0.f)

View File

@@ -15,8 +15,18 @@ float UStatForgeFunctionLibrary::GetStatValue(const FName StatName, AActor* Acto
return StatForgeComponent->GetStatValue(StatName);
}
bool UStatForgeFunctionLibrary::HasTag(const FGameplayTag& Tag, AActor* Actor)
{
if (!Actor) return false;
const UStatForgeComponent* StatForgeComponent = Actor->GetComponentByClass<UStatForgeComponent>();
if(!StatForgeComponent) return false;
return StatForgeComponent->GetGameplayTags().HasTagExact(Tag);
}
FGuid UStatForgeFunctionLibrary::ApplyGameplayStatEffect(const TSubclassOf<UGameplayStatEffect> EffectClass,
TMap<FName, float> DataValueMap, AActor* Actor, int32 Stacks)
TMap<FName, float> DataValueMap, AActor* Actor, int32 Stacks)
{
if (!EffectClass || !Actor) return FGuid();

View File

@@ -9,6 +9,14 @@
class UGameplayStatEffect;
UENUM(BlueprintType)
enum class EDurationType : uint8
{
Instant,
Duration,
Infinite
};
UENUM(BlueprintType)
enum class EModOperation : uint8
{
@@ -64,9 +72,12 @@ class STATFORGE_API UGameplayStatEffect : public UObject
public:
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Duration")
EDurationType DurationType;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Duration", meta=(EditCondition = "DurationType==EDurationType::Duration", EditConditionHides))
float Duration = 0.f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Duration")
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Duration", meta=(EditCondition = "DurationType==EDurationType::Duration", EditConditionHides))
float TickPeriod = 0.f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Modifiers")
@@ -78,17 +89,30 @@ public:
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Tags")
FGameplayTagContainer CharacterTags;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Tags|Requirements", meta = (EditCondition = "Duration==0"))
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Tags|Requirements", meta = (EditCondition = "DurationType!=EDurationType::Duration"))
FGameplayTagContainer TagsRequiredToApply;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Tags|Requirements", meta = (EditCondition = "Duration!=0"))
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Tags|Requirements", meta = (EditCondition = "DurationType==EDurationType::Duration"))
FGameplayTagContainer TagsRequiredToTick;
UFUNCTION(BlueprintCallable, Category = "Stat Forge|Effect")
void AppendDataValueMap(TMap<FName, float> InDataValueMap) { DataValueMap.Append(InDataValueMap); }
const TMap<FName, float>& GetDataValueMap() { return DataValueMap; }
float GetDuration() const
{
switch (DurationType)
{
case EDurationType::Instant:
return 0.f;
case EDurationType::Duration:
return Duration;
case EDurationType::Infinite:
return -1.f;
}
return 0.f;
}
protected:
UPROPERTY()

View File

@@ -3,6 +3,7 @@
#pragma once
#include "CoreMinimal.h"
#include "GameplayTagContainer.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "StatForgeFunctionLibrary.generated.h"
@@ -14,10 +15,13 @@ UCLASS()
class STATFORGE_API UStatForgeFunctionLibrary : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintPure, Category = "Stat Forge")
static float GetStatValue(UPARAM(meta = (GetOptions = "StatForgeDeveloperSettings.GetStatNames")) const FName StatName, AActor* Actor);
UFUNCTION(BlueprintPure, Category = "Stat Forge")
static bool HasTag(UPARAM(ref) const FGameplayTag& Tag, AActor* Actor);
UFUNCTION(BlueprintCallable, Category = "Stat Forge", meta = (AutoCreateRefTerm = "DataValueMap"))
static FGuid ApplyGameplayStatEffect(const TSubclassOf<UGameplayStatEffect> EffectClass, TMap<FName, float> DataValueMap, AActor* Actor, int32 Stacks = 1);