// © 2024 Long Ly. All rights reserved. Any unauthorized use, reproduction, or distribution of this trademark is strictly prohibited and may result in legal action. #include "AbilitySystem/OLSGlobaAbilitySubsystem.h" #include "Abilities/GameplayAbility.h" #include "AbilitySystem/OLSAbilitySystemComponent.h" void FOLSGlobalAppliedAbilityList::AddToASC(TSubclassOf ability, UOLSAbilitySystemComponent* asc) { if (FGameplayAbilitySpecHandle* specHandle = Handles.Find(asc)) { RemoveFromASC(asc); } UGameplayAbility* abilityCDO = ability->GetDefaultObject(); FGameplayAbilitySpec abilitySpec(abilityCDO); const FGameplayAbilitySpecHandle abilitySpecHandle = asc->GiveAbility(abilitySpec); Handles.Add(asc, abilitySpecHandle); } void FOLSGlobalAppliedAbilityList::RemoveFromASC(UOLSAbilitySystemComponent* asc) { if (FGameplayAbilitySpecHandle* specHandle = Handles.Find(asc)) { asc->ClearAbility(*specHandle); Handles.Remove(asc); } } void FOLSGlobalAppliedAbilityList::RemoveFromAll() { for (TTuple, FGameplayAbilitySpecHandle>& handle : Handles) { if (handle.Key != nullptr) { handle.Key->ClearAbility(handle.Value); } } Handles.Empty(); } void FOLSGlobalAppliedEffectList::AddToASC(const TSubclassOf& effect, UOLSAbilitySystemComponent* asc) { if (FActiveGameplayEffectHandle* effectHandle = Handles.Find(asc)) { RemoveFromASC(asc); } const UGameplayEffect* gameplayEffectCDO = effect->GetDefaultObject(); const FActiveGameplayEffectHandle gameplayEffectHandle = asc->ApplyGameplayEffectToSelf(gameplayEffectCDO, /*Level=*/ 1, asc->MakeEffectContext()); Handles.Add(asc, gameplayEffectHandle); } void FOLSGlobalAppliedEffectList::RemoveFromASC(UOLSAbilitySystemComponent* asc) { if (FActiveGameplayEffectHandle* effectHandle = Handles.Find(asc)) { asc->RemoveActiveGameplayEffect(*effectHandle); Handles.Remove(asc); } } void FOLSGlobalAppliedEffectList::RemoveFromAll() { for (TTuple, FActiveGameplayEffectHandle>& handle : Handles) { if (handle.Key != nullptr) { handle.Key->RemoveActiveGameplayEffect(handle.Value); } } Handles.Empty(); } void UOLSGlobaAbilitySubsystem::RegisterASC(UOLSAbilitySystemComponent* asc) { check(asc); for (TTuple, FOLSGlobalAppliedAbilityList>& appliedAbility : AppliedAbilities) { appliedAbility.Value.AddToASC(appliedAbility.Key, asc); } for (TTuple, FOLSGlobalAppliedEffectList>& appliedEffect : AppliedEffects) { appliedEffect.Value.AddToASC(appliedEffect.Key, asc); } RegisteredASCs.AddUnique(asc); } void UOLSGlobaAbilitySubsystem::UnregisterASC(UOLSAbilitySystemComponent* asc) { check(asc); for (auto& appliedAbility : AppliedAbilities) { appliedAbility.Value.RemoveFromASC(asc); } for (auto& appliedEffect : AppliedEffects) { appliedEffect.Value.RemoveFromASC(asc); } RegisteredASCs.Remove(asc); }