Able Ability System Info and Support Thread

What if the only options I see have the default tag?

Because you’re asking specifically for the default object. Admittedly, Able doesn’t care because it uses the default under the hood, so anything besides SKEL should be fine.

is able build from the ground up or is it similiar or using UE4 Gameplay Ability System

Seems like UAblCustomTask aren’t working in the latest code.

The UAblCustomTask::OnTaskStartBP finds a function, but there is no script associated with the function, even though my blueprint has the OnTaskStartBP implemented. Any ideas?

Built from the ground up. It has some similarities to GAS but that’s mainly coincidence. GAS was pretty opaque when I started Able.

Define “no script associated with the function”. If you have “OnTaskStart” overridden in the blueprint - then it should be fine. If you’re trying to do it through code then you need to inherit from OnTaskStart as OnTaskStartBP isn’t virtual (on the C++ level).

I have a blueprint class that extends AblCustomTask that implements the OnTaskStart override, I add the task to the timeline of an ability, the blueprint task OnTaskStart doesn’t trigger. When I debug the code, I can see the UAblCustomTask::OnTaskStartBP gets called, FindFunctionChecked finds a function, but the Script field of the function is empty, so it doesn’t execute anything, just early outs. I can’t seem to get any of my blueprint tasks to work.

Alright Able v3.15 submitted. Notes below:

As always, your feedback is super important and please let me know if you run into any issues.

I just verified it by making a simply custom task, overriding OnTaskStart and telling it print a string. I can give you the project if you want to see what I did and where you may be going wrong. You can grab it here.

Does it still work if the blueprint task is inherited from another blueprint class?

Are you saying you have it setup “UAblCustomTask -> MyCustomTask -> MyCustomTaskChild”?

I could see that potentially failing? I’m not sure what UE does under the hood for childs of BlueprintImplementable functions. It may be as simple as marking the BlueprintImplementable methods in UAblCustomTask as virtual (and hope that flag persists in child classes).

Yes that was the situation I was in, though I didn’t realize until after I had refactored away from the custom task to try and see if it worked without the extra child class.

So I just picked Able back up after a long break. Got a fire ball going and I have an issue.
Engine Version: 4.21 fresh download of Able

Skill:
PlayAnimation
SpawnActor

if an enemy/wall etc that is collidable with the project that spawns is too close, UE4 crashes and I get an error shown here:
Assertion failed: SpawnedActor [File:D:\Build++Portal+Dev-Marketplace+Full\Sync\LocalBuilds\PluginTemp\HostProject\Plugins\Able\Source\AbleCore\Private\Tasks\ablSpawnActorTask.cpp] [Line: 116]

i am 99% positive it’s got something to do with potentially trying to destroy the projectile before the spawn actor task can finish firing?
I’m off work tomorrow so I was going to take a look at it tomorrow because it’s 1:20 in the morning and I need some sleep :slight_smile:

Hmmm… maybe? I’ll take a look tonight. I have to re-submit the patch anyway so I might sneak this fix in.

so if this helps, here’s the two lines that look to be the issue (solid on the assertion checks if i read this correctly btw)
line 116 of SpawnActor (per the stack trace)

AActor* SpawnedActor = ActorWorld->SpawnActor<AActor>(ActorClass, SpawnTransform, SpawnParams);
check(SpawnedActor);

I’m destroying the projectile when it collides with 2 types of actors.
If i remove any destroy reference in the projectile everything works fine.
This only occurs when I stand right on top of what will destroy the projectile. If i stand across the room, the projectile destroys just fine.

I don’t know if that helps you think through (and it could completely be something i’m doing, i’m open to that suggestion… this is the first skill i’ve created in like a year)

What’s your Spawn Collision set to on that Task? Likely it’s failing to spawn because the projectile is inside some other object and the Spawn Collision isn’t set to “Always Spawn”.

@ It’s set to Try To Adjust Location But Always Spawn. I tried setting it to always spawn ignore collision and it did the same thing.

Just to make sure I removed the spawn actor task and created a new starting with “Always Spawn Ignore Collision” and it did it again…

Hmmm, you have a class specified I assume? The issue is definitely the SpawnActor is failing for some reason… I can make it a bit more tolerant and just report an error when it fails to spawn (rather than crashing), but that likely won’t fix your underlying issue.

let me actually answer the question since you asked while i was typing my last novel.
the class is specified and when i break point on the destroy actor methods in the projectile blueprint (On Begin Overlap), it hits that function. if i F11 past, it crashes after it destroys the actor?

now, my character is replicated using a controller and character server side then a pawn and pawn controller client side.
This could obviously lead to “lag” and it’s fairly safe to say that it works normally when the destroy request is not so immediate to its being spawned.
so i guess that’s a wordy way of saying, i wonder of because of auth check on the character->controller etc architecture, it’s not done “spawning” before it runs the assert because it was destroyed?

Maybe? I would expect it to still exist when the assert happens, just marked for GC. However there may be some “optimization” where if you spawn an actor and immediately call for it’s destruction, that the GC happens immediately - in which case it would return nullptr and the assert would fail.

I’ll turn that assert into a warning. It’s likely what is happening is fine, it’s just not expected from Able’s end.

Seems to be a bug with channel conditions. UAblAbilityComponent::InternalCancelAbility gets called, but since the ability IsProcessingUpdate() it gets deferred into the m_PendingCancels. Problem is, the // Check for Channeling… block in ablAbilityComponent.cpp goes ahead and sets m_ActiveAbilityInstance to null, so in HandlePendingCancels it’s null and isn’t able to appropriately finish the ability.

I’m guessing that // Check for Channeling… block should not be nulling the active ability instance?

Edit: Ok this was only a problem because we had a local modification that set m_IsProcessingUpdate at the top of the tick.

:wink: Yea, careful with that. That flag is set at a very specific time.