Able Ability System Info and Support Thread

OH and looping doesn’t work for animations that are run as dynamic montage. Also If you have multiple slots in multiple GRPUPS it will take first default group… Lucky for me its the ability group. it finds the slot in that group perfectly… but anim montage works only if I state target as “UpperBody” for example… instead of correctly “Ability.UpperBody”. as it could be “additivePose.UpperBody”

I know of one bug with input conditionals which I have a fix for that sounds eerily similar to the bug you reported. Should be out early next week. I can check the looping on dynamic montages as well. The group name should be working properly, that’s something I just pass along to UE’s animation system. Able doesn’t do anything to that value, but I can double check that as well.

@ Can I cancel ability on input? Similar to channeling check - except channeling is only for Active abilities… Is there anything for passive? For now I have a short ability 0.5s and its looping so I just check on “CanLoopExecuteBP”

I will try to keep my ability count low and test them singleplayer for now until the update.
Please tell me - can I somehow get notified that a new ability is running, so I can add it to HUD in some way? Or I must add this PER ability and copy functionality and jsut use abiltiy start/ability end?

@ I know I can be a pain in the ■■■ but one last question - As I got I think everything working as I wanted :smiley: … If my abilities are previewed od some chracter class - BUT in the execution I use zero casts, zero animations that are one skeleton specific (i dont run animations at all… just gameplay tags) and only call events and interfaces, and ask for variables on interfaces… this ability should work on any character that use the interface… or even pawn… or object as far as it matters right? So an ability made for human will work on a dragon, or magic item - as long as it implements interfaces, or has proper component that the ability use?

You can just have your HUD ask the player for all running Abilities when it updates. That’s how I would do it. That way the HUD is just reading from the player, it doesn’t require any cross communication.

Yea, Abilities will run on whatever, as long as they have an Ability Component. If you are using a common interface for variables, then that code would only work on objects that inherit from that interface. But, to Able, it doesn’t make a difference.

@ For stacking passive abilities I managed to refresh ability time when applied new stack etc… However is it possible to when ability end remove one stack, instead of all at once? For example I have a channeled ability… the longer you hold it - the more stacks of something you gain… when you stop channeling the stacks of passive decay - however one every 6 seconds… Now they all end in 6 seconds.

Sure, I can add that option.

that would be amazing! :slight_smile:

Able v3.30 has been submitted:

Hey,

I’ve come across a strange behaviour when using Able inside an ActorComponent.

UCombatComponent


void UCombatComponent::PerformBasicAttack()
{
    UAblAbilityComponent* AbilityComponent = MyCharacterOwner->GetAbilityComponent();
    if (!ensure(AbilityComponent != nullptr)) return;

    // Create Able Context
    UAblAbility* attack = BasicAttack->GetDefaultObject<UAblAbility>();
    if(attack == nullptr) { UE_LOG(LogTemp, Error, TEXT("BasicAttack couldn't get Ability Object from given class")); return; }

    UAblAbilityContext* context = UAblAbilityContext::MakeContext(attack, AbilityComponent, GetOwner(), GetOwner());
    if(context == nullptr) { UE_LOG(LogTemp, Error, TEXT("Couldn't create AbleAbilityContext")); return; }

    // Execute Ability
    AbilityComponent->ActivateAbility(context);
}

Log


[2020.05.10-12.51.56:607][344]LogWindows: Error: [Callstack] 0x00007ffa30811387 UE4Editor-AbleCore.dll!FAbleLogHelper::GetWorldName() [d:\build\++portal+promotion\sync\localbuilds\plugintemp\hostproject\plugins\able\source\ablecore\private\ablabilityutilities.cpp:103]
[2020.05.10-12.51.56:607][344]LogWindows: Error: [Callstack] 0x00007ffa30814c51 UE4Editor-AbleCore.dll!UAblAbilityComponent::InternalStartAbility() [d:\build\++portal+promotion\sync\localbuilds\plugintemp\hostproject\plugins\able\source\ablecore\private\ablabilitycomponent.cpp:1042]
[2020.05.10-12.51.56:607][344]LogWindows: Error: [Callstack] 0x00007ffa307e5fae UE4Editor-AbleCore.dll!UAblAbilityComponent::ActivateAbility() [d:\build\++portal+promotion\sync\localbuilds\plugintemp\hostproject\plugins\able\source\ablecore\private\ablabilitycomponent.cpp:427]
[2020.05.10-12.51.56:607][344]LogWindows: Error: [Callstack] 0x00007ffab49035f7 UE4Editor-....dll!UCombatComponent::PerformBasicAttack() [E:\...\Core\Character\CombatComponent.cpp:68]
[2020.05.10-12.51.56:607][344]LogWindows: Error: [Callstack] 0x00007ffab4907bc1 UE4Editor-....dll!AMyDefaultController::BasicAttack() [E:\...\Core\Character\MyDefaultController.cpp:88]

Basically moved the code from the Character to it’s own Component. Using it directly from the Character worked fine, but calling it on an ActorComponant results in a crash.

I couldn’t find a flaw in my code (yet), maybe you know more than I do :smiley:

Greetings

That crash is because the GetOwner()->GetWorld() is returning null. I can make that code a bit more resilient, but I’m curious why moving it to an actor component is making the world null. Your overall code looks fine to me.

Running this:


UE_LOG(LogTemp, Warning, TEXT("%d"), GetOwner()->GetWorld()->WorldType.GetValue());

inside the component does actually work. Some Illuminati-Stuff is going on here …

Since this Code is running inside the LogHelper, could I somehow disable Logging in the meantime somehow?

Yup, just turn off “Log Ability Failures” in the Able plugin settings.

Are we able to make something like projectiles following the target actor , like rpg style fireball spell chasing the target and hitting it basicly. @

Yea, I did that in the demo video. All it was a SpawnActor Task with me setting the homing target and activating the projectile movement component in the “On Actor Spawned” callback on the Ability.

Are you able to share the demo video content with a download link ?

Hey there ,

the Output Log gives me these warnings from a while now, can you look at it please?

LogClass: Warning: FAblCompactTaskData::StartTime is not initialized properly
LogClass: Warning: FAblCompactTaskData::EndTime is not initialized properly
LogClass: Warning: BoolProperty FAblCompactTaskData::Verbose is not initialized properly
LogClass: Warning: BoolProperty FAblCompactTaskData::Disabled is not initialized properly
LogClass: Warning: BoolProperty FAblCompactTaskData::OverrideTaskColor is not initialized properly
LogClass: Warning: FAblCompactTaskData::UserTaskColor is not initialized properly

I’ve tried the project building with a fresh TPS 4.25.0 project too with the plugin enabled, but the result is the same, so the warnings are still there. :frowning:

Sure, I’ll look at that. Those warnings shouldn’t stop you or anything, but yea, I’ll clean them up.

That project is so old at this point, that I don’t think so. The flow was this:

1.) Create a “Fireball” actor which just has a Projectile Movement Component.
2.) In Able, make a “Cast Fireball” Ability which uses the Spawn Actor Task to spawn the Fireball, make sure to enable “Fire Event” in the Task.
3.) In the Ability Blueprint for “Cast Fireball”, Overload On Spawned Actor, cast the Actor to your Fireball Actor, get the Projectile Movement Component, and set the homing target to whatever you want (You could grab that target using Able’s Targeting Code, Queries, etc).

Pretty simple overall. The Projectile Movement Component does all the work. Able just feeds it a few parameters.

Ty for fast reply ! @