53. Gameplay Effect Delegates
This commit is contained in:
@@ -0,0 +1,16 @@
|
|||||||
|
[/Script/GameplayTags.GameplayTagsSettings]
|
||||||
|
ImportTagsFromConfig=True
|
||||||
|
WarnOnInvalidTags=True
|
||||||
|
ClearInvalidTags=False
|
||||||
|
AllowEditorTagUnloading=True
|
||||||
|
AllowGameTagUnloading=False
|
||||||
|
FastReplication=False
|
||||||
|
InvalidTagCharacters="\"\',"
|
||||||
|
+GameplayTagTableList=/Game/Core/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="")
|
||||||
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"ColumnWidths":
|
||||||
|
{
|
||||||
|
"DevComment": 405,
|
||||||
|
"Tag": 381
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -9,79 +9,74 @@
|
|||||||
|
|
||||||
UGasaAttributeSet::UGasaAttributeSet()
|
UGasaAttributeSet::UGasaAttributeSet()
|
||||||
{
|
{
|
||||||
InitHealth(100.f);
|
InitHealth( 100.f );
|
||||||
InitMaxHealth(100.f);
|
InitMaxHealth( 100.f );
|
||||||
InitMana(50.f);
|
InitMana( 50.f );
|
||||||
InitMaxMana(50.f);
|
InitMaxMana( 50.f );
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma region Rep Notifies
|
#pragma region Rep Notifies
|
||||||
void UGasaAttributeSet::Client_OnRep_Health(FGameplayAttributeData& PrevHealth)
|
void UGasaAttributeSet::Client_OnRep_Health( FGameplayAttributeData& PrevHealth )
|
||||||
{
|
{
|
||||||
// From GAMEPLAYATTRIBUTE_REPNOTIFY
|
// From GAMEPLAYATTRIBUTE_REPNOTIFY
|
||||||
static FProperty* UGasaAttributeSetProperty = FindFieldChecked<FProperty>(StaticClass(), GET_MEMBER_NAME_CHECKED(UGasaAttributeSet, Health));
|
static FProperty* UGasaAttributeSetProperty = FindFieldChecked<FProperty>( StaticClass(), GET_MEMBER_NAME_CHECKED( UGasaAttributeSet, Health ) );
|
||||||
GetOwningAbilitySystemComponentChecked()->SetBaseAttributeValueFromReplication(FGameplayAttribute(UGasaAttributeSetProperty), Health, PrevHealth);
|
GetOwningAbilitySystemComponentChecked()->SetBaseAttributeValueFromReplication( FGameplayAttribute( UGasaAttributeSetProperty ), Health, PrevHealth );
|
||||||
}
|
}
|
||||||
|
void UGasaAttributeSet::Client_OnRep_MaxHealth( FGameplayAttributeData& PrevMaxHealth )
|
||||||
void UGasaAttributeSet::Client_OnRep_MaxHealth(FGameplayAttributeData& PrevMaxHealth)
|
|
||||||
{
|
{
|
||||||
// From GAMEPLAYATTRIBUTE_REPNOTIFY
|
// From GAMEPLAYATTRIBUTE_REPNOTIFY
|
||||||
static FProperty* UGasaAttributeSetProperty = FindFieldChecked<FProperty>(StaticClass(), GET_MEMBER_NAME_CHECKED(UGasaAttributeSet, MaxHealth));
|
static FProperty* UGasaAttributeSetProperty = FindFieldChecked<FProperty>( StaticClass(), GET_MEMBER_NAME_CHECKED( UGasaAttributeSet, MaxHealth ) );
|
||||||
GetOwningAbilitySystemComponentChecked()->SetBaseAttributeValueFromReplication(FGameplayAttribute(UGasaAttributeSetProperty), MaxHealth,
|
GetOwningAbilitySystemComponentChecked()->SetBaseAttributeValueFromReplication( FGameplayAttribute( UGasaAttributeSetProperty ), MaxHealth, PrevMaxHealth );
|
||||||
PrevMaxHealth);
|
|
||||||
}
|
}
|
||||||
|
void UGasaAttributeSet::Client_OnRep_Mana( FGameplayAttributeData& PrevMana )
|
||||||
void UGasaAttributeSet::Client_OnRep_Mana(FGameplayAttributeData& PrevMana)
|
|
||||||
{
|
{
|
||||||
// From GAMEPLAYATTRIBUTE_REPNOTIFY
|
// From GAMEPLAYATTRIBUTE_REPNOTIFY
|
||||||
static FProperty* UGasaAttributeSetProperty = FindFieldChecked<FProperty>(StaticClass(), GET_MEMBER_NAME_CHECKED(UGasaAttributeSet, Mana));
|
static FProperty* UGasaAttributeSetProperty = FindFieldChecked<FProperty>( StaticClass(), GET_MEMBER_NAME_CHECKED( UGasaAttributeSet, Mana ) );
|
||||||
GetOwningAbilitySystemComponentChecked()->SetBaseAttributeValueFromReplication(FGameplayAttribute(UGasaAttributeSetProperty), Mana, PrevMana);
|
GetOwningAbilitySystemComponentChecked()->SetBaseAttributeValueFromReplication( FGameplayAttribute( UGasaAttributeSetProperty ), Mana, PrevMana );
|
||||||
}
|
}
|
||||||
|
void UGasaAttributeSet::Client_OnRep_MaxMana( FGameplayAttributeData& PrevMaxMana )
|
||||||
void UGasaAttributeSet::Client_OnRep_MaxMana(FGameplayAttributeData& PrevMaxMana)
|
|
||||||
{
|
{
|
||||||
// From GAMEPLAYATTRIBUTE_REPNOTIFY
|
// From GAMEPLAYATTRIBUTE_REPNOTIFY
|
||||||
static FProperty* UGasaAttributeSetProperty = FindFieldChecked<FProperty>(StaticClass(), GET_MEMBER_NAME_CHECKED(UGasaAttributeSet, MaxMana));
|
static FProperty* UGasaAttributeSetProperty = FindFieldChecked<FProperty>( StaticClass(), GET_MEMBER_NAME_CHECKED( UGasaAttributeSet, MaxMana ) );
|
||||||
GetOwningAbilitySystemComponentChecked()->SetBaseAttributeValueFromReplication(FGameplayAttribute(UGasaAttributeSetProperty), MaxMana,
|
GetOwningAbilitySystemComponentChecked()->SetBaseAttributeValueFromReplication( FGameplayAttribute( UGasaAttributeSetProperty ), MaxMana, PrevMaxMana );
|
||||||
PrevMaxMana);
|
|
||||||
}
|
}
|
||||||
#pragma endregion Rep Notifies
|
#pragma endregion Rep Notifies
|
||||||
|
|
||||||
void UGasaAttributeSet::PostGameplayEffectExecute(FGameplayEffectModCallbackData const& Data)
|
void UGasaAttributeSet::PostGameplayEffectExecute( FGameplayEffectModCallbackData const& Data )
|
||||||
{
|
{
|
||||||
Super::PostGameplayEffectExecute(Data);
|
Super::PostGameplayEffectExecute( Data );
|
||||||
FEffectProperties Props;
|
FEffectProperties Props;
|
||||||
Props.Populate(Data);
|
Props.Populate( Data );
|
||||||
}
|
}
|
||||||
|
|
||||||
void UGasaAttributeSet::PreAttributeChange(FGameplayAttribute const& Attribute, float& NewValue)
|
void UGasaAttributeSet::PreAttributeChange( FGameplayAttribute const& Attribute, float& NewValue )
|
||||||
{
|
{
|
||||||
Super::PreAttributeChange(Attribute, NewValue);
|
Super::PreAttributeChange( Attribute, NewValue );
|
||||||
|
|
||||||
if (Attribute == GetHealthAttribute())
|
if ( Attribute == GetHealthAttribute() )
|
||||||
{
|
{
|
||||||
NewValue = FMath::Clamp(NewValue, 0, GetMaxHealth());
|
NewValue = FMath::Clamp( NewValue, 0, GetMaxHealth() );
|
||||||
}
|
}
|
||||||
if (Attribute == GetMaxHealthAttribute())
|
if ( Attribute == GetMaxHealthAttribute() )
|
||||||
{
|
{
|
||||||
NewValue = FMath::Clamp(NewValue, 0, 99999.000000);
|
NewValue = FMath::Clamp( NewValue, 0, 99999.000000 );
|
||||||
}
|
}
|
||||||
if (Attribute == GetManaAttribute())
|
if ( Attribute == GetManaAttribute() )
|
||||||
{
|
{
|
||||||
NewValue = FMath::Clamp(NewValue, 0, GetMaxMana());
|
NewValue = FMath::Clamp( NewValue, 0, GetMaxMana() );
|
||||||
}
|
}
|
||||||
if (Attribute == GetMaxManaAttribute())
|
if ( Attribute == GetMaxManaAttribute() )
|
||||||
{
|
{
|
||||||
NewValue = FMath::Clamp(NewValue, 0, 99999.000000);
|
NewValue = FMath::Clamp( NewValue, 0, 99999.000000 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void UGasaAttributeSet::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
|
void UGasaAttributeSet::GetLifetimeReplicatedProps( TArray<FLifetimeProperty>& OutLifetimeProps ) const
|
||||||
{
|
{
|
||||||
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
|
Super::GetLifetimeReplicatedProps( OutLifetimeProps );
|
||||||
|
|
||||||
DOREPLIFETIME_DEFAULT_GAS(UGasaAttributeSet, Health);
|
DOREPLIFETIME_DEFAULT_GAS( UGasaAttributeSet, Health );
|
||||||
DOREPLIFETIME_DEFAULT_GAS(UGasaAttributeSet, MaxHealth);
|
DOREPLIFETIME_DEFAULT_GAS( UGasaAttributeSet, MaxHealth );
|
||||||
DOREPLIFETIME_DEFAULT_GAS(UGasaAttributeSet, Mana);
|
DOREPLIFETIME_DEFAULT_GAS( UGasaAttributeSet, Mana );
|
||||||
DOREPLIFETIME_DEFAULT_GAS(UGasaAttributeSet, MaxMana);
|
DOREPLIFETIME_DEFAULT_GAS( UGasaAttributeSet, MaxMana );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,50 +8,46 @@ UCLASS()
|
|||||||
class GASA_API UGasaAttributeSet : public UAttributeSet
|
class GASA_API UGasaAttributeSet : public UAttributeSet
|
||||||
{
|
{
|
||||||
GENERATED_BODY()
|
GENERATED_BODY()
|
||||||
|
|
||||||
public:
|
public:
|
||||||
UGasaAttributeSet();
|
UGasaAttributeSet();
|
||||||
|
|
||||||
UPROPERTY(ReplicatedUsing = Client_OnRep_Health, EditAnywhere, BlueprintReadWrite, Category = "Attributes")
|
UPROPERTY( ReplicatedUsing = Client_OnRep_Health, EditAnywhere, BlueprintReadWrite, Category = "Attributes" )
|
||||||
FGameplayAttributeData Health;
|
FGameplayAttributeData Health;
|
||||||
UPROPERTY(ReplicatedUsing = Client_OnRep_MaxHealth, EditAnywhere, BlueprintReadWrite, Category = "Attributes")
|
UPROPERTY( ReplicatedUsing = Client_OnRep_MaxHealth, EditAnywhere, BlueprintReadWrite, Category = "Attributes" )
|
||||||
FGameplayAttributeData MaxHealth;
|
FGameplayAttributeData MaxHealth;
|
||||||
UPROPERTY(ReplicatedUsing = Client_OnRep_Mana, EditAnywhere, BlueprintReadWrite, Category = "Attributes")
|
UPROPERTY( ReplicatedUsing = Client_OnRep_Mana, EditAnywhere, BlueprintReadWrite, Category = "Attributes" )
|
||||||
FGameplayAttributeData Mana;
|
FGameplayAttributeData Mana;
|
||||||
UPROPERTY(ReplicatedUsing = Client_OnRep_MaxMana, EditAnywhere, BlueprintReadWrite, Category = "Attributes")
|
UPROPERTY( ReplicatedUsing = Client_OnRep_MaxMana, EditAnywhere, BlueprintReadWrite, Category = "Attributes" )
|
||||||
FGameplayAttributeData MaxMana;
|
FGameplayAttributeData MaxMana;
|
||||||
|
|
||||||
UFUNCTION()
|
UFUNCTION()
|
||||||
void Client_OnRep_Health(FGameplayAttributeData& PrevHealth);
|
void Client_OnRep_Health( FGameplayAttributeData& PrevHealth );
|
||||||
UFUNCTION()
|
UFUNCTION()
|
||||||
void Client_OnRep_MaxHealth(FGameplayAttributeData& PrevMaxHealth);
|
void Client_OnRep_MaxHealth( FGameplayAttributeData& PrevMaxHealth );
|
||||||
UFUNCTION()
|
UFUNCTION()
|
||||||
void Client_OnRep_Mana(FGameplayAttributeData& PrevMana);
|
void Client_OnRep_Mana( FGameplayAttributeData& PrevMana );
|
||||||
UFUNCTION()
|
UFUNCTION()
|
||||||
void Client_OnRep_MaxMana(FGameplayAttributeData& PrevMaxMana);
|
void Client_OnRep_MaxMana( FGameplayAttributeData& PrevMaxMana );
|
||||||
|
|
||||||
#pragma region Getters
|
#pragma region Getters
|
||||||
static FGameplayAttribute GetHealthAttribute()
|
static FGameplayAttribute GetHealthAttribute()
|
||||||
{
|
{
|
||||||
static FProperty* Prop = FindFieldChecked<FProperty>(UGasaAttributeSet::StaticClass(), GET_MEMBER_NAME_CHECKED(UGasaAttributeSet, Health));
|
static FProperty* Prop = FindFieldChecked<FProperty>( UGasaAttributeSet::StaticClass(), GET_MEMBER_NAME_CHECKED( UGasaAttributeSet, Health ) );
|
||||||
return Prop;
|
return Prop;
|
||||||
}
|
}
|
||||||
|
|
||||||
static FGameplayAttribute GetMaxHealthAttribute()
|
static FGameplayAttribute GetMaxHealthAttribute()
|
||||||
{
|
{
|
||||||
static FProperty* Prop = FindFieldChecked<FProperty>(UGasaAttributeSet::StaticClass(), GET_MEMBER_NAME_CHECKED(UGasaAttributeSet, MaxHealth));
|
static FProperty* Prop = FindFieldChecked<FProperty>( UGasaAttributeSet::StaticClass(), GET_MEMBER_NAME_CHECKED( UGasaAttributeSet, MaxHealth ) );
|
||||||
return Prop;
|
return Prop;
|
||||||
}
|
}
|
||||||
|
|
||||||
static FGameplayAttribute GetManaAttribute()
|
static FGameplayAttribute GetManaAttribute()
|
||||||
{
|
{
|
||||||
static FProperty* Prop = FindFieldChecked<FProperty>(UGasaAttributeSet::StaticClass(), GET_MEMBER_NAME_CHECKED(UGasaAttributeSet, Mana));
|
static FProperty* Prop = FindFieldChecked<FProperty>( UGasaAttributeSet::StaticClass(), GET_MEMBER_NAME_CHECKED( UGasaAttributeSet, Mana ) );
|
||||||
return Prop;
|
return Prop;
|
||||||
}
|
}
|
||||||
|
|
||||||
static FGameplayAttribute GetMaxManaAttribute()
|
static FGameplayAttribute GetMaxManaAttribute()
|
||||||
{
|
{
|
||||||
static FProperty* Prop = FindFieldChecked<FProperty>(UGasaAttributeSet::StaticClass(), GET_MEMBER_NAME_CHECKED(UGasaAttributeSet, MaxMana));
|
static FProperty* Prop = FindFieldChecked<FProperty>( UGasaAttributeSet::StaticClass(), GET_MEMBER_NAME_CHECKED( UGasaAttributeSet, MaxMana ) );
|
||||||
return Prop;
|
return Prop;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,45 +55,45 @@ public:
|
|||||||
FORCEINLINE float GetMaxHealth() const { return MaxHealth.GetCurrentValue(); }
|
FORCEINLINE float GetMaxHealth() const { return MaxHealth.GetCurrentValue(); }
|
||||||
FORCEINLINE float GetMana() const { return Mana.GetCurrentValue(); }
|
FORCEINLINE float GetMana() const { return Mana.GetCurrentValue(); }
|
||||||
FORCEINLINE float GetMaxMana() const { return MaxMana.GetCurrentValue(); }
|
FORCEINLINE float GetMaxMana() const { return MaxMana.GetCurrentValue(); }
|
||||||
#pragma endregion Getters
|
#pragma endregion Getters
|
||||||
|
|
||||||
#pragma region Setters
|
#pragma region Setters
|
||||||
FORCEINLINE void SetHealth(float NewVal);
|
FORCEINLINE void
|
||||||
FORCEINLINE void SetMaxHealth(float NewVal);
|
SetHealth( float NewVal );
|
||||||
FORCEINLINE void SetMana(float NewVal);
|
FORCEINLINE void SetMaxHealth( float NewVal );
|
||||||
FORCEINLINE void SetMaxMana(float NewVal);
|
FORCEINLINE void SetMana( float NewVal );
|
||||||
|
FORCEINLINE void SetMaxMana( float NewVal );
|
||||||
|
|
||||||
FORCEINLINE void InitHealth(float NewVal)
|
FORCEINLINE void InitHealth( float NewVal )
|
||||||
{
|
{
|
||||||
Health.SetBaseValue(NewVal);
|
Health.SetBaseValue( NewVal );
|
||||||
Health.SetCurrentValue(NewVal);
|
Health.SetCurrentValue( NewVal );
|
||||||
}
|
}
|
||||||
|
FORCEINLINE void InitMaxHealth( float NewVal )
|
||||||
FORCEINLINE void InitMaxHealth(float NewVal)
|
|
||||||
{
|
{
|
||||||
MaxHealth.SetBaseValue(NewVal);
|
MaxHealth.SetBaseValue( NewVal );
|
||||||
MaxHealth.SetCurrentValue(NewVal);
|
MaxHealth.SetCurrentValue( NewVal );
|
||||||
}
|
}
|
||||||
|
FORCEINLINE void InitMana( float NewVal )
|
||||||
FORCEINLINE void InitMana(float NewVal)
|
|
||||||
{
|
{
|
||||||
Mana.SetBaseValue(NewVal);
|
Mana.SetBaseValue( NewVal );
|
||||||
Mana.SetCurrentValue(NewVal);
|
Mana.SetCurrentValue( NewVal );
|
||||||
}
|
}
|
||||||
|
FORCEINLINE void InitMaxMana( float NewVal )
|
||||||
FORCEINLINE void InitMaxMana(float NewVal)
|
|
||||||
{
|
{
|
||||||
MaxMana.SetBaseValue(NewVal);
|
MaxMana.SetBaseValue( NewVal );
|
||||||
MaxMana.SetCurrentValue(NewVal);
|
MaxMana.SetCurrentValue( NewVal );
|
||||||
}
|
}
|
||||||
#pragma endregion Setters
|
#pragma endregion Setters
|
||||||
|
|
||||||
#pragma region AttributeSet
|
#pragma region AttributeSet
|
||||||
void PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue) override;
|
void
|
||||||
void PostGameplayEffectExecute(FGameplayEffectModCallbackData const& Data) override;
|
PreAttributeChange( const FGameplayAttribute& Attribute, float& NewValue ) override;
|
||||||
#pragma endregion AttributeSet
|
void PostGameplayEffectExecute( FGameplayEffectModCallbackData const& Data ) override;
|
||||||
|
#pragma endregion AttributeSet
|
||||||
|
|
||||||
#pragma region UObject
|
#pragma region UObject
|
||||||
void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;
|
void
|
||||||
|
GetLifetimeReplicatedProps( TArray<FLifetimeProperty>& OutLifetimeProps ) const override;
|
||||||
#pragma endregion UObject
|
#pragma endregion UObject
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -10,6 +10,8 @@ AGasaEffectActor::AGasaEffectActor()
|
|||||||
|
|
||||||
RootComponent = CreateDefaultSubobject<USceneComponent>("Root");
|
RootComponent = CreateDefaultSubobject<USceneComponent>("Root");
|
||||||
|
|
||||||
|
Level = 1.f;
|
||||||
|
|
||||||
InstantEffectUsage = EInstantEffectUsagePolicy::DoNotApply;
|
InstantEffectUsage = EInstantEffectUsagePolicy::DoNotApply;
|
||||||
DurationEffectUsage = DefaultEffectUsagePolicy;
|
DurationEffectUsage = DefaultEffectUsagePolicy;
|
||||||
InfiniteEffectUsage = DefaultEffectUsagePolicy;
|
InfiniteEffectUsage = DefaultEffectUsagePolicy;
|
||||||
@@ -24,7 +26,7 @@ void AGasaEffectActor::ApplyEffectToActor(AActor* Actor, TSubclassOf<UGameplayEf
|
|||||||
Context = AS->MakeEffectContext();
|
Context = AS->MakeEffectContext();
|
||||||
Context.AddSourceObject(Actor);
|
Context.AddSourceObject(Actor);
|
||||||
|
|
||||||
FGameplayEffectSpecHandle Spec = AS->MakeOutgoingSpec( EffectClass, 1.0f, Context );
|
FGameplayEffectSpecHandle Spec = AS->MakeOutgoingSpec( EffectClass, Level, Context );
|
||||||
FActiveGameplayEffectHandle ActiveEffect = AS->ApplyGameplayEffectSpecToSelf( * Spec.Data );
|
FActiveGameplayEffectHandle ActiveEffect = AS->ApplyGameplayEffectSpecToSelf( * Spec.Data );
|
||||||
if (bRemoveOnEndOverlap)
|
if (bRemoveOnEndOverlap)
|
||||||
ActiveEffectsToRemove.Add(ActiveEffect, AS);
|
ActiveEffectsToRemove.Add(ActiveEffect, AS);
|
||||||
@@ -39,16 +41,16 @@ void AGasaEffectActor::OnOverlap(AActor* Actor)
|
|||||||
|
|
||||||
if (InstantEffectClass && InstantEffectUsage == EInstantEffectUsagePolicy::ApplyOnOverlap)
|
if (InstantEffectClass && InstantEffectUsage == EInstantEffectUsagePolicy::ApplyOnOverlap)
|
||||||
{
|
{
|
||||||
FGameplayEffectSpecHandle Spec= AS->MakeOutgoingSpec( InstantEffectClass, 1.0f, Context );
|
FGameplayEffectSpecHandle Spec= AS->MakeOutgoingSpec( InstantEffectClass, Level, Context );
|
||||||
AS->ApplyGameplayEffectSpecToSelf( * Spec.Data );
|
AS->ApplyGameplayEffectSpecToSelf( * Spec.Data );
|
||||||
}
|
}
|
||||||
if (DurationEffectClass)
|
if (DurationEffectClass)
|
||||||
{
|
{
|
||||||
if (Bitfield_IsSet(DurationEffectUsage, EEffectUsagePolicy::ApplyOnOverlap))
|
if (Bitfield_IsSet(DurationEffectUsage, EEffectUsagePolicy::ApplyOnOverlap))
|
||||||
{
|
{
|
||||||
FGameplayEffectSpecHandle Spec = AS->MakeOutgoingSpec( DurationEffectClass, 1.0f, Context );
|
FGameplayEffectSpecHandle Spec = AS->MakeOutgoingSpec( DurationEffectClass, Level, Context );
|
||||||
FActiveGameplayEffectHandle ActiveEffect = AS->ApplyGameplayEffectSpecToSelf( * Spec.Data );
|
FActiveGameplayEffectHandle ActiveEffect = AS->ApplyGameplayEffectSpecToSelf( * Spec.Data );
|
||||||
if (Bitfield_IsSet(DurationEffectUsage, (int32)EEffectUsagePolicy::RemoveOnEndOverlap))
|
if (Bitfield_IsSet(DurationEffectUsage, EEffectUsagePolicy::RemoveOnEndOverlap))
|
||||||
ActiveDuration = ActiveEffect;
|
ActiveDuration = ActiveEffect;
|
||||||
}
|
}
|
||||||
if (ActiveDuration.IsValid() && Bitfield_IsSet(DurationEffectUsage, EEffectUsagePolicy::RemoveOnOverlap))
|
if (ActiveDuration.IsValid() && Bitfield_IsSet(DurationEffectUsage, EEffectUsagePolicy::RemoveOnOverlap))
|
||||||
@@ -59,9 +61,9 @@ void AGasaEffectActor::OnOverlap(AActor* Actor)
|
|||||||
bool bApplyOnOverlap = Bitfield_IsSet(InfiniteEffectUsage, EEffectUsagePolicy::ApplyOnOverlap);
|
bool bApplyOnOverlap = Bitfield_IsSet(InfiniteEffectUsage, EEffectUsagePolicy::ApplyOnOverlap);
|
||||||
if (bApplyOnOverlap)
|
if (bApplyOnOverlap)
|
||||||
{
|
{
|
||||||
FGameplayEffectSpecHandle Spec = AS->MakeOutgoingSpec( InfiniteEffectClass, 1.0f, Context );
|
FGameplayEffectSpecHandle Spec = AS->MakeOutgoingSpec( InfiniteEffectClass, Level, Context );
|
||||||
FActiveGameplayEffectHandle ActiveEffect = AS->ApplyGameplayEffectSpecToSelf( * Spec.Data );
|
FActiveGameplayEffectHandle ActiveEffect = AS->ApplyGameplayEffectSpecToSelf( * Spec.Data );
|
||||||
if (Bitfield_IsSet(InfiniteEffectUsage, (int32)EEffectUsagePolicy::RemoveOnEndOverlap))
|
if (Bitfield_IsSet(InfiniteEffectUsage, EEffectUsagePolicy::RemoveOnEndOverlap))
|
||||||
ActiveInfinite = ActiveEffect;
|
ActiveInfinite = ActiveEffect;
|
||||||
}
|
}
|
||||||
if (ActiveInfinite.IsValid() && Bitfield_IsSet(InfiniteEffectUsage, EEffectUsagePolicy::RemoveOnOverlap))
|
if (ActiveInfinite.IsValid() && Bitfield_IsSet(InfiniteEffectUsage, EEffectUsagePolicy::RemoveOnOverlap))
|
||||||
@@ -81,28 +83,28 @@ void AGasaEffectActor::OnEndOverlap(AActor* Actor)
|
|||||||
|
|
||||||
if (InstantEffectClass && InstantEffectUsage == EInstantEffectUsagePolicy::ApplyOnEndOverlap)
|
if (InstantEffectClass && InstantEffectUsage == EInstantEffectUsagePolicy::ApplyOnEndOverlap)
|
||||||
{
|
{
|
||||||
FGameplayEffectSpecHandle Spec= AS->MakeOutgoingSpec( InstantEffectClass, 1.0f, Context );
|
FGameplayEffectSpecHandle Spec= AS->MakeOutgoingSpec( InstantEffectClass, Level, Context );
|
||||||
AS->ApplyGameplayEffectSpecToSelf( * Spec.Data );
|
AS->ApplyGameplayEffectSpecToSelf( * Spec.Data );
|
||||||
}
|
}
|
||||||
if (DurationEffectClass)
|
if (DurationEffectClass)
|
||||||
{
|
{
|
||||||
if (Bitfield_IsSet(DurationEffectUsage, EEffectUsagePolicy::ApplyOnEndOverlap))
|
if (Bitfield_IsSet(DurationEffectUsage, EEffectUsagePolicy::ApplyOnEndOverlap))
|
||||||
{
|
{
|
||||||
FGameplayEffectSpecHandle Spec = AS->MakeOutgoingSpec( DurationEffectClass, 1.0f, Context );
|
FGameplayEffectSpecHandle Spec = AS->MakeOutgoingSpec( DurationEffectClass, Level, Context );
|
||||||
FActiveGameplayEffectHandle ActiveEffect = AS->ApplyGameplayEffectSpecToSelf( * Spec.Data );
|
FActiveGameplayEffectHandle ActiveEffect = AS->ApplyGameplayEffectSpecToSelf( * Spec.Data );
|
||||||
if (Bitfield_IsSet(DurationEffectUsage, (int32)EEffectUsagePolicy::RemoveOnOverlap))
|
if (Bitfield_IsSet(DurationEffectUsage, EEffectUsagePolicy::RemoveOnOverlap))
|
||||||
ActiveDuration = ActiveEffect;
|
ActiveDuration = ActiveEffect;
|
||||||
}
|
}
|
||||||
if (ActiveDuration.IsValid() && Bitfield_IsSet(DurationEffectUsage, (int32)EEffectUsagePolicy::RemoveOnEndOverlap))
|
if (ActiveDuration.IsValid() && Bitfield_IsSet(DurationEffectUsage, EEffectUsagePolicy::RemoveOnEndOverlap))
|
||||||
AS->RemoveActiveGameplayEffect(ActiveDuration);
|
AS->RemoveActiveGameplayEffect(ActiveDuration);
|
||||||
}
|
}
|
||||||
if (InfiniteEffectClass)
|
if (InfiniteEffectClass)
|
||||||
{
|
{
|
||||||
if (Bitfield_IsSet(InfiniteEffectUsage, EEffectUsagePolicy::ApplyOnEndOverlap))
|
if (Bitfield_IsSet(InfiniteEffectUsage, EEffectUsagePolicy::ApplyOnEndOverlap))
|
||||||
{
|
{
|
||||||
FGameplayEffectSpecHandle Spec = AS->MakeOutgoingSpec( InfiniteEffectClass, 1.0f, Context );
|
FGameplayEffectSpecHandle Spec = AS->MakeOutgoingSpec( InfiniteEffectClass, Level, Context );
|
||||||
FActiveGameplayEffectHandle ActiveEffect = AS->ApplyGameplayEffectSpecToSelf( * Spec.Data );
|
FActiveGameplayEffectHandle ActiveEffect = AS->ApplyGameplayEffectSpecToSelf( * Spec.Data );
|
||||||
if (Bitfield_IsSet(InfiniteEffectUsage, (int32)EEffectUsagePolicy::RemoveOnOverlap))
|
if (Bitfield_IsSet(InfiniteEffectUsage, EEffectUsagePolicy::RemoveOnOverlap))
|
||||||
ActiveInfinite = ActiveEffect;
|
ActiveInfinite = ActiveEffect;
|
||||||
}
|
}
|
||||||
if (ActiveInfinite.IsValid() && Bitfield_IsSet(InfiniteEffectUsage, EEffectUsagePolicy::RemoveOnEndOverlap))
|
if (ActiveInfinite.IsValid() && Bitfield_IsSet(InfiniteEffectUsage, EEffectUsagePolicy::RemoveOnEndOverlap))
|
||||||
|
|||||||
@@ -35,6 +35,11 @@ class GASA_API AGasaEffectActor : public AGasaActor
|
|||||||
GENERATED_BODY()
|
GENERATED_BODY()
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
AGasaEffectActor();
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Gameplay Effects")
|
||||||
|
float Level;
|
||||||
|
|
||||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Gameplay Effects")
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Gameplay Effects")
|
||||||
TSubclassOf<UGameplayEffect> InstantEffectClass;
|
TSubclassOf<UGameplayEffect> InstantEffectClass;
|
||||||
|
|
||||||
@@ -62,8 +67,6 @@ public:
|
|||||||
FActiveGameplayEffectHandle ActiveDuration;
|
FActiveGameplayEffectHandle ActiveDuration;
|
||||||
FActiveGameplayEffectHandle ActiveInfinite;
|
FActiveGameplayEffectHandle ActiveInfinite;
|
||||||
|
|
||||||
AGasaEffectActor();
|
|
||||||
|
|
||||||
UFUNCTION(BlueprintCallable, Category = "Gameplay Effects")
|
UFUNCTION(BlueprintCallable, Category = "Gameplay Effects")
|
||||||
void ApplyEffectToActor(AActor* Actor, TSubclassOf<UGameplayEffect> EffectClass, bool bRemoveOnEndOverlap = false);
|
void ApplyEffectToActor(AActor* Actor, TSubclassOf<UGameplayEffect> EffectClass, bool bRemoveOnEndOverlap = false);
|
||||||
|
|
||||||
@@ -73,4 +76,3 @@ public:
|
|||||||
UFUNCTION(BlueprintCallable)
|
UFUNCTION(BlueprintCallable)
|
||||||
void OnEndOverlap(AActor* Actor);
|
void OnEndOverlap(AActor* Actor);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user