I believe I have the latest version of Able and I have 4.18.1 for UE4. Yeah, I think Standalone is a doozy, but the packaged version does indeed work.
Maybe bug maybe feature:
When I play passive ability in active ability passive ability wonāt finish. OnEnd wonāt trigger.
And another thing:
In behavior tree there is decorator called check gameplay tags which is operating on Character. Any chance to make m_TagContainer public? So I can pass tags from Ability Component without need to duplicate them in Character/AI.
Iāll add that to my list of things to check on Saturday (which Iāve blocked out the entire day to give Able some love). Passives should be calling OnAbilityEnd, the enum will always be āFinishedā (due to Client/Server setup, I donāt pass how the Passive ended as it would be a lot of traffic) but it should definitely be getting called.
And I canāt create build:
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Classes\ablAbilityDebug.h(19): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Classes\ablAbilityDebug.h(19): error C2143: syntax error: missing ',' before '*'
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Classes\ablAbilityDebug.h(22): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Classes\ablAbilityDebug.h(22): error C2143: syntax error: missing ',' before '*'
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Classes\ablAbilityDebug.h(25): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Classes\ablAbilityDebug.h(25): error C2143: syntax error: missing ',' before '*'
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Classes\ablAbilityDebug.h(28): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Classes\ablAbilityDebug.h(28): error C2143: syntax error: missing ',' before '*'
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Classes\ablAbilityDebug.h(31): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Classes\ablAbilityDebug.h(31): error C2143: syntax error: missing ',' before '*'
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Classes\ablAbilityDebug.h(34): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Classes\ablAbilityDebug.h(34): error C2143: syntax error: missing ',' before '*'
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Classes\ablAbilityDebug.h(37): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Classes\ablAbilityDebug.h(37): error C2143: syntax error: missing ',' before '*'
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Classes\ablAbilityDebug.h(40): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Classes\ablAbilityDebug.h(40): error C2143: syntax error: missing ',' before '*'
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Classes\ablAbilityDebug.h(43): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Classes\ablAbilityDebug.h(43): error C2143: syntax error: missing ',' before '*'
UATHelper: Packaging (Windows (64-bit)): ablSettings.gen.cpp
UATHelper: Packaging (Windows (64-bit)): AbleCore.init.gen.cpp
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Private\ablAbilityDebug.cpp(9): error C2143: syntax error: missing ';' before '<'
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Private\ablAbilityDebug.cpp(9): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Private\ablAbilityDebug.cpp(10): error C2143: syntax error: missing ';' before '<'
You should add #include āRuntime/Engine/Classes/Engine/World.hā to this class.
Hmm, Interesting⦠When I package the plugin I donāt get that error (and neither did Epic). Did you make a change to that file? If so, that would break it out of the unity build file and could change the include order.
Alright v1.90 has been submitted. Notes below:
- Fixed an issue where Passives would crash if you tried to cancel them.
- Fixed an issue where sometimes Passives would not fire OnAbilityEnd.
- Added C++ Delegates for OnAbilityStart/OnAbilityEnd (these are called before the Blueprint versions). You can find them on the Ability Component.
- Added GetAbilityCooldownRatio and GetAbilityCooldownTotal to the Ability Component, these methods return the ratio of the provided Abilityās cooldown and what the actual cooldown value that was calculated is. If you want the current Cooldown time in seconds, just multiply them together.
- Selecting a Preview Asset will now try to preload things before loading the window. This will at least give you a warning if you are about to load a lot of assets so you know what to expect.
- Few Non-Unity build fixes.
Big thanks! Any chace you can let us know here when update will be live? I canāt find a method to find plugin version in Marketplace (maybe update description so we will know which version is live?)
Youāll likely know as soon as I do. The marketplace should tell you there are updates available. Right now itās still in processing and there was an issue with the submission for 4.15 that Epic is looking at (bug in the submission page it seems).
Two questions:
- Can I modify single ability or all ability cooldowntime by a ratio? In example if I have a talent or item that reduces cooldowns by 10% or 0.5 sec for all active?
- Can I in any way modify the playrate of the entire ability? For example If I have an ability with anim montage, 3 sounds timed to that montage, and a custm event (reload) - can I make a quick reload by playing this ability 1.2x ? Would it still be in sync?
Iām afraid that answer for both is no
The first answer is yes, there is a Blueprint method called GetCooldown which you can override with whatever logic you want. You can use GetBaseCooldown to return the value you have set on the Ability itself, then check stats/logic/whatever on how you want to modify that value.
The second answer is no, but you could create a quick load version and just have some logic that says āIf I have this buff/stat/whatever, then play the quick reload - otherwise play the normal reloadā. I can look at making that more dynamic in the meantime.
Another issue. In BTTask_PlayAbility you arenāt passing Owning Pawn (which is actually running ability) to Context. Thatās why you canāt target Self in tasks that are played in Behavior Tree. Fixed by just passing Pawn Owner to MakeContext in ExtecuteTask function. Any chance you can fix it as well?
Sure thing. Thanks for the report.
Thanks. Another thing can you make:
private:
/* The Ability being executed. */
UPROPERTY(Transient)
const UAblAbility* m_Ability;
/* The Ability Component running this Ability. */
UPROPERTY(Transient)
UAblAbilityComponent* m_AbilityComponent;
/* The Stack Count. */
UPROPERTY(Transient)
int32 m_StackCount;
/* The Current Time of the Ability. */
UPROPERTY(Transient)
float m_CurrentTime;
/* The Last delta value used to update the Ability. */
UPROPERTY(Transient)
float m_LastDelta;
/* The "Owner" of this ability (may or may not be the same as the AbilityComponent owner).*/
UPROPERTY(Transient)
TWeakObjectPtr<AActor> m_Owner;
/* The Actor that caused this Ability to occur (if there is one).*/
UPROPERTY(Transient)
TWeakObjectPtr<AActor> m_Instigator;
/* The Actor Targets of the Ability. */
UPROPERTY(Transient)
TArray<TWeakObjectPtr<AActor>> m_TargetActors;
/* Map of Task Unique IDs to ScratchPads. */
UPROPERTY(Transient)
TMap<uint32, class UAblAbilityTaskScratchPad*> m_TaskScratchPadMap;
/* Used if our targeting call uses Async instead of Sync queries. */
FTraceHandle m_AsyncHandle;
/* Cached Transform used for our Async transform in case we need to do extra processing once our results come in. Currently only Cone check uses this. */
UPROPERTY(Transient)
FTransform m_AsyncQueryTransform;
protected instead of private in ablAbilityContext.h ? We are extending contexts and will be nice to have access to those variables.
And still something is wrong with playing passive abilities in active abilities:
LogBlueprintUserMessages: [DefaultTestMap] OnTaskStart called for Task AblPlayAbilityTask_0 at time 0.03.
LogBlueprintUserMessages: [DefaultTestMap] Calling ActivateAbility with Actor AICharacter_Regular_Ranged_C_0 with Ability Ability_AttackNotify, Owner AICharacter_Regular_Ranged_C_0, Instigator AICharacter_Regular_Ranged_C_0.
LogBlueprintUserMessages: [DefaultTestMap] OnTaskEnd called for Task AblPlayAbilityTask_0 at time 0.03. Task Result = Successful
My passive ability takes 1 second to complete and here as you can see itās completing in one frameā¦I have added breakpoint OnEnd to my custom task in passive ability and itās still not calling. Tick is calling for like 3 frames.
So basically I have passive ability with one custom task made in c++. This passive ability takes 1 second to complete.
I have active ability that takes 2 second and have Play Ability task with passive ability selected. Only OnTaskStarted is Called, Tick is called for 3 frames. OnTaskEnd isnāt called.
Any chance you can tell me how to fix this internally? I have attack notify passive ability to just spawn ānotifyā mesh before actual attack and this is critical for my prototype.
Sure, I can make those fields protected - I donāt think that will hurt anything.
With regard to your other issue, Play Ability Task is always one frame IIRC (I can check later tonight) - so thatās as expected. The OnEnd should be getting called (there had been an issue were Passives were updated and then removed before getting the OnEnd call), you can place a breakpoint in the AblAbilityContext::FinishAbility (or search for those new C++ delegates) and see where that code is fired from.
Iām in the midst of a new PC build (yay faster compile times) so I wonāt be up and running again till probably late tonight, but if you want to send me a small project with the issue youāre seeing - Iād be more than happy to look things over. Otherwise Iāll try and repro it myself probably Friday (since Thursday is a holiday).
Project sent.
Can you please tell me why cooldown is starting on ability start not end? Any chance to make option to start it on end instead?
And I found another issue.
If you interupt active ability which have collision (copying context) and apply damage on collision context it will be called number of times you have interupted ability earlier. So if you interrupt 3 times active ability next time ability will play it will call 3 times damage.
Cooldown has always been on start in most frameworks Iāve used (and most games, if you look at League or PoE youāll see the cooldown starts the moment you hit the button so itās running even while you are still animating the Ability). You can always adjust your cooldown time to be execution time + whatever you want the cooldown to be.
The interrupt makes no sense to me. If you interrupt an Ability, itās instantly killed. So you shouldnāt be able to interrupt the same Ability multiple timesā¦
- Create Active ability which is taking 2 seconds, doing collision check (with copy to context) and doing damage for those actors,
- Then when this ability is active, cancel it and run another active ability (different than this)
- Then run again first ability you will see that damage is dealt 2 times,
- If you cancel this ability once again after running again it will do 3 times damage task,
Hope you understand now. If not I can send you update of my project to check it out.
When building package:
E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Private\Targeting\ablTargetingSphere.cpp(35): error C2027: use of undefined type 'UWorld'
UATHelper: Packaging (Windows (64-bit)): c:\program files\epic games\ue_4.18\engine\source\runtime\core\public\GenericPlatform/GenericPlatformMisc.h(817): note: see declaration of 'UWorld'
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Private\Targeting\ablTargetingSphere.cpp(35): error C2227: left of '->AsyncOverlapByChannel' must point to class/struct/union/generic type
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Private\Targeting\ablTargetingSphere.cpp(41): error C2027: use of undefined type 'UWorld'
UATHelper: Packaging (Windows (64-bit)): c:\program files\epic games\ue_4.18\engine\source\runtime\core\public\GenericPlatform/GenericPlatformMisc.h(817): note: see declaration of 'UWorld'
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Private\Targeting\ablTargetingSphere.cpp(41): error C2227: left of '->QueryOverlapData' must point to class/struct/union/generic type
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Private\Targeting\ablTargetingSphere.cpp(58): error C2027: use of undefined type 'UWorld'
UATHelper: Packaging (Windows (64-bit)): c:\program files\epic games\ue_4.18\engine\source\runtime\core\public\GenericPlatform/GenericPlatformMisc.h(817): note: see declaration of 'UWorld'
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Private\Targeting\ablTargetingSphere.cpp(58): error C2227: left of '->OverlapMultiByChannel' must point to class/struct/union/generic type
UATHelper: Packaging (Windows (64-bit)): ablTargetingCapsule.cpp
UATHelper: Packaging (Windows (64-bit)): ablTargetingBox.cpp
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Private\Targeting\ablTargetingRaycast.cpp(37): error C2027: use of undefined type 'UWorld'
UATHelper: Packaging (Windows (64-bit)): c:\program files\epic games\ue_4.18\engine\source\runtime\core\public\GenericPlatform/GenericPlatformMisc.h(817): note: see declaration of 'UWorld'
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Private\Targeting\ablTargetingRaycast.cpp(37): error C2227: left of '->AsyncLineTraceByChannel' must point to class/struct/union/generic type
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Private\Targeting\ablTargetingRaycast.cpp(43): error C2027: use of undefined type 'UWorld'
UATHelper: Packaging (Windows (64-bit)): c:\program files\epic games\ue_4.18\engine\source\runtime\core\public\GenericPlatform/GenericPlatformMisc.h(817): note: see declaration of 'UWorld'
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Private\Targeting\ablTargetingRaycast.cpp(43): error C2227: left of '->QueryTraceData' must point to class/struct/union/generic type
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Private\Targeting\ablTargetingRaycast.cpp(64): error C2027: use of undefined type 'UWorld'
UATHelper: Packaging (Windows (64-bit)): c:\program files\epic games\ue_4.18\engine\source\runtime\core\public\GenericPlatform/GenericPlatformMisc.h(817): note: see declaration of 'UWorld'
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Private\Targeting\ablTargetingRaycast.cpp(64): error C2227: left of '->LineTraceSingleByChannel' must point to class/struct/union/generic type
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Private\Targeting\ablTargetingRaycast.cpp(71): error C2027: use of undefined type 'UWorld'
UATHelper: Packaging (Windows (64-bit)): c:\program files\epic games\ue_4.18\engine\source\runtime\core\public\GenericPlatform/GenericPlatformMisc.h(817): note: see declaration of 'UWorld'
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Private\Targeting\ablTargetingRaycast.cpp(71): error C2227: left of '->LineTraceMultiByChannel' must point to class/struct/union/generic type
UATHelper: Packaging (Windows (64-bit)): ablBranchCondition.gen.cpp
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Private\Targeting\ablTargetingCone.cpp(48): error C2027: use of undefined type 'UWorld'
UATHelper: Packaging (Windows (64-bit)): c:\program files\epic games\ue_4.18\engine\source\runtime\core\public\GenericPlatform/GenericPlatformMisc.h(817): note: see declaration of 'UWorld'
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Private\Targeting\ablTargetingCone.cpp(48): error C2227: left of '->AsyncOverlapByChannel' must point to class/struct/union/generic type
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Private\Targeting\ablTargetingCone.cpp(55): error C2027: use of undefined type 'UWorld'
UATHelper: Packaging (Windows (64-bit)): c:\program files\epic games\ue_4.18\engine\source\runtime\core\public\GenericPlatform/GenericPlatformMisc.h(817): note: see declaration of 'UWorld'
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Private\Targeting\ablTargetingCone.cpp(55): error C2227: left of '->QueryOverlapData' must point to class/struct/union/generic type
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Private\Targeting\ablTargetingCone.cpp(79): error C2027: use of undefined type 'UWorld'
UATHelper: Packaging (Windows (64-bit)): c:\program files\epic games\ue_4.18\engine\source\runtime\core\public\GenericPlatform/GenericPlatformMisc.h(817): note: see declaration of 'UWorld'
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Private\Targeting\ablTargetingCone.cpp(79): error C2227: left of '->OverlapMultiByChannel' must point to class/struct/union/generic type
UATHelper: Packaging (Windows (64-bit)): ablTargetingBase.gen.cpp
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Private\Targeting\ablTargetingBox.cpp(43): error C2027: use of undefined type 'UWorld'
UATHelper: Packaging (Windows (64-bit)): c:\program files\epic games\ue_4.18\engine\source\runtime\core\public\GenericPlatform/GenericPlatformMisc.h(817): note: see declaration of 'UWorld'
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Private\Targeting\ablTargetingBox.cpp(43): error C2227: left of '->AsyncOverlapByChannel' must point to class/struct/union/generic type
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Private\Targeting\ablTargetingBox.cpp(49): error C2027: use of undefined type 'UWorld'
UATHelper: Packaging (Windows (64-bit)): c:\program files\epic games\ue_4.18\engine\source\runtime\core\public\GenericPlatform/GenericPlatformMisc.h(817): note: see declaration of 'UWorld'
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Private\Targeting\ablTargetingBox.cpp(49): error C2227: left of '->QueryOverlapData' must point to class/struct/union/generic type
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Private\Targeting\ablTargetingBox.cpp(74): error C2027: use of undefined type 'UWorld'
UATHelper: Packaging (Windows (64-bit)): c:\program files\epic games\ue_4.18\engine\source\runtime\core\public\GenericPlatform/GenericPlatformMisc.h(817): note: see declaration of 'UWorld'E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Private\Targeting\ablTargetingCapsule.cpp(36): error C2027: use of undefined type 'UWorld'
UATHelper: Packaging (Windows (64-bit)):
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Private\Targeting\ablTargetingBox.cpp(74): error C2227: left of '->OverlapMultiByChannel' must point to class/struct/union/generic typec:\program files\epic games\ue_4.18\engine\source\runtime\core\public\GenericPlatform/GenericPlatformMisc.h(817): note: see declaration of
'UWorld'
UATHelper: Packaging (Windows (64-bit)):
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Private\Targeting\ablTargetingCapsule.cpp(36): error C2227: left of '->AsyncOverlapByChannel' must point to class/struct/union/generic type
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Private\Targeting\ablTargetingCapsule.cpp(42): error C2027: use of undefined type 'UWorld'
UATHelper: Packaging (Windows (64-bit)): c:\program files\epic games\ue_4.18\engine\source\runtime\core\public\GenericPlatform/GenericPlatformMisc.h(817): note: see declaration of 'UWorld'
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Private\Targeting\ablTargetingCapsule.cpp(42): error C2227: left of '->QueryOverlapData' must point to class/struct/union/generic type
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Private\Targeting\ablTargetingCapsule.cpp(59): error C2027: use of undefined type 'UWorld'
UATHelper: Packaging (Windows (64-bit)): c:\program files\epic games\ue_4.18\engine\source\runtime\core\public\GenericPlatform/GenericPlatformMisc.h(817): note: see declaration of 'UWorld'
UATHelper: Packaging (Windows (64-bit)): E:\Azure\Rogal\Plugins\Able\Source\AbleCore\Private\Targeting\ablTargetingCapsule.cpp(59): error C2227: left of '->OverlapMultiByChannel' must point to class/struct/union/generic type
I assume you modified something in those files? If so, yea, you may run into these issues where headers are missing when those files arenāt in the Unity build file. Iāll add fixes for those, but otherwise you can simply just make sure the files are marked as read only / checked in to whatever source control you are using - and UBT will put them back in the unity build.
Alright, v1.91 has been submitted. I missed one a couple cases on the passives but thatās fixed now. Also fixed the unity build issues in the collision queries, and moved Instance properties to protected. Should be live soon-ish.