Able Ability System Info and Support Thread

No problem, glad you’re getting better.

I’m not that much into c++ coding but I found the “ShouldCancelAbility” at the end of the class inside a *“#if WITH_EDITOR” wrapper and it’s getting called above twice.


*// Copyright (c) 2016 - 2018 Extra Life Studios, LLC. All rights reserved.

#include "Tasks/ablCancelAbilityTask.h"

#include "ablAbility.h"
#include "ablAbilityComponent.h"
#include "ablAbilityContext.h"
#include "AbleCorePrivate.h"

#define LOCTEXT_NAMESPACE "AblAbilityTask"

UAblCancelAbilityTask::UAblCancelAbilityTask(const FObjectInitializer& ObjectInitializer)
    : Super(ObjectInitializer),
    m_Ability(),
    m_TagQuery(),
    m_PassiveBehavior(RemoveOneStack),
    m_CancelResult(Interrupted)
{

}

UAblCancelAbilityTask::~UAblCancelAbilityTask()
{

}

void UAblCancelAbilityTask::OnTaskStart(const TWeakObjectPtr<const UAblAbilityContext>& Context) const
{
    check(Context.IsValid());

    Super::OnTaskStart(Context);

    TArray<TWeakObjectPtr<AActor>> TaskTargets;
    GetActorsForTask(Context, TaskTargets);

    for (TWeakObjectPtr<AActor> TargetActor : TaskTargets)
    {
        if (TargetActor.IsValid())
        {
            continue;
        }

        if (UAblAbilityComponent* AbilityComponent = TargetActor->FindComponentByClass<UAblAbilityComponent>())
        {
            if (const UAblAbility* ActiveAbility = AbilityComponent->GetActiveAbility())
            {
                if (**ShouldCancelAbility(*ActiveAbility))**
                {
#if !(UE_BUILD_SHIPPING)
                    if (IsVerbose())
                    {
                        PrintVerbose(FString::Printf(TEXT("Cancelling Ability %s on Actor %s."), *ActiveAbility->GetDisplayName(),
                            *TargetActor->GetName()));
                    }
#endif
                    AbilityComponent->CancelAbility(ActiveAbility, m_CancelResult.GetValue());
                }
            }

            TArray<UAblAbility*> CurrentPassives;
            AbilityComponent->GetCurrentPassiveAbilities(CurrentPassives);

            for (UAblAbility* Passive : CurrentPassives)
            {
                if (**ShouldCancelAbility(*Passive))**
                {
                    switch (m_PassiveBehavior.GetValue())
                    {
                    case RemoveOneStack:
                    case RemoveOneStackWithRefresh:
                    {
                        int32 StackCount = AbilityComponent->GetCurrentStackCountForPassiveAbility(Passive);
                        int32 NewStackCount = FMath::Max(StackCount - 1, 0);

#if !(UE_BUILD_SHIPPING)
                        if (IsVerbose())
                        {
                            PrintVerbose(FString::Printf(TEXT("Setting Passive Ability %s Stack on Actor %s from %d to %d."), *Passive->GetDisplayName(),
                                *TargetActor->GetName(), StackCount, NewStackCount));
                        }
#endif

                        AbilityComponent->SetPassiveStackCount(Passive, NewStackCount, m_PassiveBehavior.GetValue() == RemoveOneStackWithRefresh, m_CancelResult.GetValue());
                    }
                    break;
                    case RemoveEntireStack:
                    default:
                    {
#if !(UE_BUILD_SHIPPING)
                        if (IsVerbose())
                        {
                            PrintVerbose(FString::Printf(TEXT("Cancelling Passive Ability %s on Actor %s."), *Passive->GetDisplayName(),
                                *TargetActor->GetName()));
                        }
#endif
                        AbilityComponent->CancelAbility(Passive, m_CancelResult.GetValue());
                    }
                    break;
                    }
                }
            }
        }
    }

}

TStatId UAblCancelAbilityTask::GetStatId() const
{
    RETURN_QUICK_DECLARE_CYCLE_STAT(UAblCancelAbilityTask, STATGROUP_Able);
}

#if WITH_EDITOR

FText UAblCancelAbilityTask::GetDescriptiveTaskName() const
{
    const FText FormatText = LOCTEXT("AblCancelAbilityTaskFormat", "{0}: {1}");
    FString AbilityName = TEXT("<null>");
    if (*m_Ability)
    {
        if (UAblAbility* Ability = Cast<UAblAbility>(m_Ability->GetDefaultObject()))
        {
            AbilityName = Ability->GetDisplayName();
        }
    }
    else if (!m_TagQuery.IsEmpty())
    {
        AbilityName = m_TagQuery.GetDescription();
    }

    return FText::FormatOrdered(FormatText, GetTaskName(), FText::FromString(AbilityName));
}

**bool UAblCancelAbilityTask::ShouldCancelAbility(const UAblAbility& Ability) cons**t
{
    if (*m_Ability && m_Ability->GetDefaultObject<UAblAbility>()->GetAbilityNameHash() == Ability.GetAbilityNameHash())
    {
        return true;
    }

    if (!m_TagQuery.IsEmpty())
    {
        return Ability.GetAbilityTagContainer().MatchesQuery(m_TagQuery);
    }

    return false;
}

#endif

#undef LOCTEXT_NAMESPACE*

Hope that was what you were asking for!?