43. Instant and Duration Application Policy
This commit is contained in:
		| @@ -28,8 +28,90 @@ void AGasaEffectActor::ApplyEffectToActor(AActor* Actor, TSubclassOf<UGameplayEf | ||||
|  | ||||
| void AGasaEffectActor::OnOverlap(AActor* Actor) | ||||
| { | ||||
| 	UGasaAbilitySystemComp* AS = GetAbilitySystem(Actor, true); | ||||
| 	FGameplayEffectContextHandle | ||||
| 	Context = AS->MakeEffectContext(); | ||||
| 	Context.AddSourceObject(Actor); | ||||
| 	 | ||||
| 	if (InstantEffectClass.Get()) | ||||
| 	{ | ||||
| 		if (Bitfield_IsSet(InstantEffectUsage, (int32)EEffectUsagePolicy::ApplyOnOverlap)) | ||||
| 		{ | ||||
|         	FGameplayEffectSpecHandle Spec = AS->MakeOutgoingSpec( InstantEffectClass, 1.0f, Context ); | ||||
|         	AS->ApplyGameplayEffectSpecToSelf( * Spec.Data );	 | ||||
| 		} | ||||
| 		if (Bitfield_IsSet(InstantEffectUsage, (int32)EEffectUsagePolicy::RemoveOnOverlap)) | ||||
| 		{ | ||||
|         	AS->RemoveActiveGameplayEffectBySourceEffect( InstantEffectClass, AS ); | ||||
| 		} | ||||
| 	} | ||||
| 	if (DurationEffectClass.Get()) | ||||
| 	{ | ||||
| 		if (Bitfield_IsSet(DurationEffectUsage, (int32)EEffectUsagePolicy::ApplyOnOverlap)) | ||||
| 		{ | ||||
|         	FGameplayEffectSpecHandle Spec = AS->MakeOutgoingSpec( InstantEffectClass, 1.0f, Context ); | ||||
|         	AS->ApplyGameplayEffectSpecToSelf( * Spec.Data );	 | ||||
| 		} | ||||
| 		if (Bitfield_IsSet(InstantEffectUsage, (int32)EEffectUsagePolicy::RemoveOnOverlap)) | ||||
| 		{ | ||||
|         	AS->RemoveActiveGameplayEffectBySourceEffect( DurationEffectClass, AS ); | ||||
| 		} | ||||
| 	} | ||||
| 	if (InfiniteEffectClass.Get()) | ||||
| 	{ | ||||
| 		if (Bitfield_IsSet(InfiniteEffectUsage, (int32)EEffectUsagePolicy::ApplyOnOverlap)) | ||||
| 		{ | ||||
|         	FGameplayEffectSpecHandle Spec = AS->MakeOutgoingSpec( InstantEffectClass, 1.0f, Context ); | ||||
|         	AS->ApplyGameplayEffectSpecToSelf( * Spec.Data );	 | ||||
| 		} | ||||
| 		if (Bitfield_IsSet(InstantEffectUsage, (int32)EEffectUsagePolicy::RemoveOnOverlap)) | ||||
| 		{ | ||||
| 			AS->RemoveActiveGameplayEffectBySourceEffect( InfiniteEffectClass, AS ); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void AGasaEffectActor::OnEndOverlap(AActor* Actor) | ||||
| { | ||||
| 	UGasaAbilitySystemComp* AS = GetAbilitySystem(Actor, true); | ||||
| 	FGameplayEffectContextHandle | ||||
| 	Context = AS->MakeEffectContext(); | ||||
| 	Context.AddSourceObject(Actor); | ||||
| 	 | ||||
| 	if (InstantEffectClass.Get()) | ||||
| 	{ | ||||
| 		if (Bitfield_IsSet(InstantEffectUsage, (int32)EEffectUsagePolicy::ApplyOnEndOverlap)) | ||||
| 		{ | ||||
| 			FGameplayEffectSpecHandle Spec = AS->MakeOutgoingSpec( InstantEffectClass, 1.0f, Context ); | ||||
| 			AS->ApplyGameplayEffectSpecToSelf( * Spec.Data );	 | ||||
| 		} | ||||
| 		if (Bitfield_IsSet(InstantEffectUsage, (int32)EEffectUsagePolicy::RemoveOnEndOverlap)) | ||||
| 		{ | ||||
| 			AS->RemoveActiveGameplayEffectBySourceEffect( InstantEffectClass, AS ); | ||||
| 		} | ||||
| 	} | ||||
| 	if (DurationEffectClass.Get()) | ||||
| 	{ | ||||
| 		if (Bitfield_IsSet(DurationEffectUsage, (int32)EEffectUsagePolicy::ApplyOnEndOverlap)) | ||||
| 		{ | ||||
| 			FGameplayEffectSpecHandle Spec = AS->MakeOutgoingSpec( InstantEffectClass, 1.0f, Context ); | ||||
| 			AS->ApplyGameplayEffectSpecToSelf( * Spec.Data );	 | ||||
| 		} | ||||
| 		if (Bitfield_IsSet(InstantEffectUsage, (int32)EEffectUsagePolicy::RemoveOnEndOverlap)) | ||||
| 		{ | ||||
| 			AS->RemoveActiveGameplayEffectBySourceEffect( DurationEffectClass, AS ); | ||||
| 		} | ||||
| 	} | ||||
| 	if (InfiniteEffectClass.Get()) | ||||
| 	{ | ||||
| 		if (Bitfield_IsSet(InfiniteEffectUsage, (int32)EEffectUsagePolicy::ApplyOnEndOverlap)) | ||||
| 		{ | ||||
| 			FGameplayEffectSpecHandle Spec = AS->MakeOutgoingSpec( InstantEffectClass, 1.0f, Context ); | ||||
| 			AS->ApplyGameplayEffectSpecToSelf( * Spec.Data );	 | ||||
| 		} | ||||
| 		if (Bitfield_IsSet(InstantEffectUsage, (int32)EEffectUsagePolicy::RemoveOnEndOverlap)) | ||||
| 		{ | ||||
| 			AS->RemoveActiveGameplayEffectBySourceEffect( InfiniteEffectClass, AS ); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|   | ||||
| @@ -12,13 +12,11 @@ enum class EEffectUsagePolicy : uint8 | ||||
| 	None               = 0 UMETA(Hidden), | ||||
| 	ApplyOnOverlap     = bit(0), | ||||
| 	ApplyOnEndOverlap  = bit(1), | ||||
| 	DoNotApply         = bit(2), | ||||
| 	RemoveOnOverlap    = bit(3), | ||||
| 	RemoveOnEndOverlap = bit(4), | ||||
| 	DoNotRemove        = bit(5), | ||||
| }; | ||||
|  | ||||
| constexpr int32 DefaultEffectUsagePolicy = (int32(EEffectUsagePolicy::DoNotApply) | int32(EEffectUsagePolicy::RemoveOnEndOverlap)); | ||||
| constexpr int32 DefaultEffectUsagePolicy = (int32(EEffectUsagePolicy::RemoveOnEndOverlap)); | ||||
|  | ||||
| UCLASS() | ||||
| class GASA_API AGasaEffectActor : public AGasaActor | ||||
|   | ||||
		Reference in New Issue
	
	Block a user