Announcement

Collapse
No announcement yet.

Able Ability System Info and Support Thread

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    Hey,

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

    UCombatComponent
    Code:
    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
    Code:
    [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

    Greetings

    Comment


      Originally posted by Contractchiller View Post
      Hey,

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

      UCombatComponent
      Code:
      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
      Code:
      [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

      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.
      Able Ability System - A high performance, robust ability system for UE4. Now Available!

      Comment


        Originally posted by ExtraLifeMatt View Post

        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:
        Code:
        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?

        Comment


          Originally posted by Contractchiller View Post

          Running this:
          Code:
          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.
          Able Ability System - A high performance, robust ability system for UE4. Now Available!

          Comment


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

            Comment


              Originally posted by GeoBoyka View Post
              Are we able to make something like projectiles following the target actor , like rpg style fireball spell chasing the target and hitting it basicly. @ExtraLifeMatt
              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.
              Able Ability System - A high performance, robust ability system for UE4. Now Available!

              Comment


                Originally posted by ExtraLifeMatt View Post

                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 ?

                Comment


                  Hey there Matt,

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

                  HTML Code:
                  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.

                  Comment





                    Originally posted by JimPhoenix View Post
                    Hey there Matt,

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

                    HTML Code:
                    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.
                    Sure, I'll look at that. Those warnings shouldn't stop you or anything, but yea, I'll clean them up.
                    Originally posted by GeoBoyka View Post

                    Are you able to share the demo video content with a download link ?
                    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.
                    Able Ability System - A high performance, robust ability system for UE4. Now Available!

                    Comment


                      Ty for fast reply ! ExtraLifeMatt

                      Comment


                        How would I go about instantiating a Context / Ability with additional / pre-set variables? Currently, I need the Player to be able to set the Target beforehand, which would work in a Singleplayer environment since I could just retrieve it from any Blueprint. Looking at 3.29, this should be possible now? But I also cannot renounce client-side prediction. What's the reasoning for Replicated Instances to break prediction?

                        Comment


                          Originally posted by Pwnographyzqt View Post
                          How would I go about instantiating a Context / Ability with additional / pre-set variables? Currently, I need the Player to be able to set the Target beforehand, which would work in a Singleplayer environment since I could just retrieve it from any Blueprint. Looking at 3.29, this should be possible now? But I also cannot renounce client-side prediction. What's the reasoning for Replicated Instances to break prediction?
                          There's an "Target Custom" which asks BP for the targets, or you can use scene query tasks to add them. If you have the Player settings the Target on their end, just forward that Target to the server so the Server can also use it.

                          Replicated Instances are replicated from the server down to the client. They are one object shared between both (so server writes to Targets or such, will be visible to the client). They can't be predicted because of that. They came from a request to allow instancing like GAS, which has the same options. I could see it being useful if you wanted to replicate down all the info from the server to display on some UI, but even that seems a bit heavy handed IMO.
                          Able Ability System - A high performance, robust ability system for UE4. Now Available!

                          Comment


                            I've started running into this issue where abilities with certain custom tasks added will crash UE4 when activated. It's a nullptr error. One of my team's engineers thinks it might be data corruption, because my custom tasks were not doing this one changelist previous and there were no changes to the custom tasks between those two CLs. The error I see says"Cast of nullptr to AblAbilityTaskScratchPad failed".

                            The weird thing is that if I open an ability that causes a crash and resave it, it no longer crashes the engine until I revert the file in source control or check it in. Here's a callstack he provided me:

                            I'm using the latest Able version and UE4 version 4.24.3

                            log
                            Code:
                            UE4Editor-Engine.dll!FTickFunctionTask::DoTask(ENamedThreads::Type CurrentThread, const TRefCountPtr<FGraphEvent> & MyCompletionGraphEvent) Line 285 C++
                            5:54
                            here is the call stack:
                              [Inline Frame] UE4Editor-CoreUObject.dll!CastLogError::__l11::<lambda_85a69443e79372a632c30a14da020d5f>::operator()() Line 10 C++
                              UE4Editor-CoreUObject.dll!CastLogError(const wchar_t * FromType, const wchar_t * ToType) Line 10 C++
                              [Inline Frame] UE4Editor-AbleCore.dll!CastChecked(UAblCustomTaskScratchPad * Src) Line 213 C++
                              UE4Editor-AbleCore.dll!UAblCustomTask::CreateScratchPad(const TWeakObjectPtr<UAblAbilityContext,FWeakObjectPtr> & Context) Line 73 C++
                              UE4Editor-AbleCore.dll!UAblAbilityContext::AllocateScratchPads() Line 101 C++
                              UE4Editor-AbleCore.dll!UAblAbilityComponent::InternalStartAbility(UAblAbilityContext * Context, bool ServerActivatedAbility) Line 1054 C++
                              UE4Editor-AbleCore.dll!UAblAbilityComponent::HandlePendingContexts() Line 1186 C++
                              UE4Editor-AbleCore.dll!UAblAbilityComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction * ThisTickFunction) Line 168 C++
                            > [Inline Frame] UE4Editor-Engine.dll!FActorComponentTickFunction::ExecuteTick::__l2::<lambda_8b87dc54ce1db8ca3e3fdcfa35a4582b>::operator()(float) Line 892 C++
                              UE4Editor-Engine.dll!FActorComponentTickFunction::ExecuteTickHelper<<lambda_8b87dc54ce1db8ca3e3fdcfa35a4582b> >(UActorComponent * Target, bool bTickInEditor, float DeltaTime, ELevelTick TickType, const FActorComponentTickFunction::ExecuteTick::__l2::<lambda_8b87dc54ce1db8ca3e3fdcfa35a4582b> & ExecuteTickFunc) Line 3388 C++
                              UE4Editor-Engine.dll!FActorComponentTickFunction::ExecuteTick(float DeltaTime, ELevelTick TickType, ENamedThreads::Type CurrentThread, const TRefCountPtr<FGraphEvent> & MyCompletionGraphEvent) Line 894 C++
                              UE4Editor-Engine.dll!FTickFunctionTask::DoTask(ENamedThreads::Type CurrentThread, const TRefCountPtr<FGraphEvent> & MyCompletionGraphEvent) Line 285 C++
                              UE4Editor-Engine.dll!TGraphTask<FTickFunctionTask>::ExecuteTask(TArray<FBaseGraphTask *,TSizedDefaultAllocator<32> > & NewTasks, ENamedThreads::Type CurrentThread) Line 847 C++
                              [Inline Frame] UE4Editor-Core.dll!FBaseGraphTask::Execute(TArray<FBaseGraphTask *,TSizedDefaultAllocator<32> > & CurrentThread, ENamedThreads::Type) Line 514 C++
                              UE4Editor-Core.dll!FNamedTaskThread::ProcessTasksNamedThread(int QueueIndex, bool bAllowStall) Line 686 C++
                              UE4Editor-Core.dll!FNamedTaskThread::ProcessTasksUntilIdle(int QueueIndex) Line 594 C++
                              UE4Editor-Engine.dll!FTickTaskSequencer::ReleaseTickGroup(ETickingGroup WorldTickGroup, bool bBlockTillComplete) Line 577 C++
                              UE4Editor-Engine.dll!FTickTaskManager::RunTickGroup(ETickingGroup Group, bool bBlockTillComplete) Line 1528 C++
                              UE4Editor-Engine.dll!UWorld::RunTickGroup(ETickingGroup Group, bool bBlockTillComplete) Line 782 C++
                              UE4Editor-Engine.dll!UWorld::Tick(ELevelTick TickType, float DeltaSeconds) Line 1567 C++
                              UE4Editor-UnrealEd.dll!UEditorEngine::Tick(float DeltaSeconds, bool bIdleMode) Line 1683 C++
                              UE4Editor-UnrealEd.dll!UUnrealEdEngine::Tick(float DeltaSeconds, bool bIdleMode) Line 410 C++
                              UE4Editor.exe!FEngineLoop::Tick() Line 4485 C++
                              [Inline Frame] UE4Editor.exe!EngineTick() Line 62 C++
                              UE4Editor.exe!GuardedMain(const wchar_t * CmdLine, HINSTANCE__ * hInInstance, HINSTANCE__ * hPrevInstance, int nCmdShow) Line 173 C++
                              UE4Editor.exe!WinMain(HINSTANCE__ * hInInstance, HINSTANCE__ * hPrevInstance, char * __formal, int nCmdShow) Line 252 C++
                              [External Code]
                            The moment this started to happen was when I created a new ability, new custom task specifically for that ability, and a scratchpad for that custom task. At some point I made some changes to everything and other abilities without that custom task started to fail. The only common link was this particular ability had a custom task that the other abilities used.

                            here's the log on my end:

                            Code:
                            [2020.05.19-21.11.35:838][161]LogWindows: Error: === Critical error: ===
                            [2020.05.19-21.11.35:838][161]LogWindows: Error:
                            [2020.05.19-21.11.35:838][161]LogWindows: Error: Fatal error: [File:D:/WDI/Acn/UE4/Engine/Source/Runtime/CoreUObject/Private/Templates/Casts.cpp] [Line: 10]
                            [2020.05.19-21.11.35:838][161]LogWindows: Error: Cast of nullptr to AblAbilityTaskScratchPad failed
                            [2020.05.19-21.11.35:838][161]LogWindows: Error:
                            [2020.05.19-21.11.35:838][161]LogWindows: Error:
                            [2020.05.19-21.11.35:838][161]LogWindows: Error: [Callstack] 0x00007fff63f0a799 KERNELBASE.dll!UnknownFunction []
                            [2020.05.19-21.11.35:838][161]LogWindows: Error: [Callstack] 0x00007fff0851df56 UE4Editor-Core.dll!ReportAssert() [d:\wdi\acn\ue4\engine\source\runtime\core\private\windows\windowsplatformcrashcontext.cpp:1341]
                            [2020.05.19-21.11.35:838][161]LogWindows: Error: [Callstack] 0x00007fff08520db1 UE4Editor-Core.dll!FWindowsErrorOutputDevice::Serialize() [d:\wdi\acn\ue4\engine\source\runtime\core\private\windows\windowserroroutputdevice.cpp:79]
                            [2020.05.19-21.11.35:838][161]LogWindows: Error: [Callstack] 0x00007fff0830449d UE4Editor-Core.dll!FOutputDevice::LogfImpl() [d:\wdi\acn\ue4\engine\source\runtime\core\private\misc\outputdevice.cpp:71]
                            [2020.05.19-21.11.35:838][161]LogWindows: Error: [Callstack] 0x00007fff06b3e363 UE4Editor-CoreUObject.dll!CastLogError() [d:\wdi\acn\ue4\engine\source\runtime\coreuobject\private\templates\casts.cpp:11]
                            [2020.05.19-21.11.35:838][161]LogWindows: Error: [Callstack] 0x00007ffee615ec14 UE4Editor-AbleCore.dll!UAblCustomTask::CreateScratchPad() [d:\wdi\acn\ue4\engine\plugins\able\source\ablecore\private\tasks\ablcustomtask.cpp:73]
                            [2020.05.19-21.11.35:838][161]LogWindows: Error: [Callstack] 0x00007ffee6157c20 UE4Editor-AbleCore.dll!UAblAbilityContext::AllocateScratchPads() [d:\wdi\acn\ue4\engine\plugins\able\source\ablecore\private\ablabilitycontext.cpp:101]
                            [2020.05.19-21.11.35:838][161]LogWindows: Error: [Callstack] 0x00007ffee6184d74 UE4Editor-AbleCore.dll!UAblAbilityComponent::InternalStartAbility() [d:\wdi\acn\ue4\engine\plugins\able\source\ablecore\private\ablabilitycomponent.cpp:1054]
                            [2020.05.19-21.11.35:838][161]LogWindows: Error: [Callstack] 0x00007ffee61827dd UE4Editor-AbleCore.dll!UAblAbilityComponent::HandlePendingContexts() [d:\wdi\acn\ue4\engine\plugins\able\source\ablecore\private\ablabilitycomponent.cpp:1186]
                            [2020.05.19-21.11.35:838][161]LogWindows: Error: [Callstack] 0x00007ffee61ada39 UE4Editor-AbleCore.dll!UAblAbilityComponent::TickComponent() [d:\wdi\acn\ue4\engine\plugins\able\source\ablecore\private\ablabilitycomponent.cpp:168]
                            [2020.05.19-21.11.35:838][161]LogWindows: Error: [Callstack] 0x00007fff04091588 UE4Editor-Engine.dll!FActorComponentTickFunction::ExecuteTickHelper<<lambda_b80b67805432a32119ae0b418e9a4616> >() [d:\wdi\acn\ue4\engine\source\runtime\engine\classes\gameframework\actor.h:3388]
                            [2020.05.19-21.11.35:838][161]LogWindows: Error: [Callstack] 0x00007fff040c2534 UE4Editor-Engine.dll!FActorComponentTickFunction::ExecuteTick() [d:\wdi\acn\ue4\engine\source\runtime\engine\private\components\actorcomponent.cpp:894]
                            [2020.05.19-21.11.35:838][161]LogWindows: Error: [Callstack] 0x00007fff04e372e3 UE4Editor-Engine.dll!FTickFunctionTask::DoTask() [d:\wdi\acn\ue4\engine\source\runtime\engine\private\ticktaskmanager.cpp:285]
                            [2020.05.19-21.11.35:838][161]LogWindows: Error: [Callstack] 0x00007fff04e45316 UE4Editor-Engine.dll!TGraphTask<FTickFunctionTask>::ExecuteTask() [d:\wdi\acn\ue4\engine\source\runtime\core\public\async\taskgraphinterfaces.h:847]
                            [2020.05.19-21.11.35:838][161]LogWindows: Error: [Callstack] 0x00007fff080ca152 UE4Editor-Core.dll!FNamedTaskThread::ProcessTasksNamedThread() [d:\wdi\acn\ue4\engine\source\runtime\core\private\async\taskgraph.cpp:686]
                            [2020.05.19-21.11.35:838][161]LogWindows: Error: [Callstack] 0x00007fff080ca40a UE4Editor-Core.dll!FNamedTaskThread::ProcessTasksUntilIdle() [d:\wdi\acn\ue4\engine\source\runtime\core\private\async\taskgraph.cpp:594]
                            [2020.05.19-21.11.35:838][161]LogWindows: Error: [Callstack] 0x00007fff04e6376d UE4Editor-Engine.dll!FTickTaskSequencer::ReleaseTickGroup() [d:\wdi\acn\ue4\engine\source\runtime\engine\private\ticktaskmanager.cpp:577]
                            [2020.05.19-21.11.35:838][161]LogWindows: Error: [Callstack] 0x00007fff04e69882 UE4Editor-Engine.dll!FTickTaskManager::RunTickGroup() [d:\wdi\acn\ue4\engine\source\runtime\engine\private\ticktaskmanager.cpp:1528]
                            [2020.05.19-21.11.35:838][161]LogWindows: Error: [Callstack] 0x00007fff045e9a1f UE4Editor-Engine.dll!UWorld::RunTickGroup() [d:\wdi\acn\ue4\engine\source\runtime\engine\private\leveltick.cpp:782]
                            [2020.05.19-21.11.35:838][161]LogWindows: Error: [Callstack] 0x00007fff045f50ce UE4Editor-Engine.dll!UWorld::Tick() [d:\wdi\acn\ue4\engine\source\runtime\engine\private\leveltick.cpp:1567]
                            [2020.05.19-21.11.35:838][161]LogWindows: Error: [Callstack] 0x00007fff01dcae90 UE4Editor-UnrealEd.dll!UEditorEngine::Tick() [d:\wdi\acn\ue4\engine\source\editor\unrealed\private\editorengine.cpp:1683]
                            [2020.05.19-21.11.35:838][161]LogWindows: Error: [Callstack] 0x00007fff02632576 UE4Editor-UnrealEd.dll!UUnrealEdEngine::Tick() [d:\wdi\acn\ue4\engine\source\editor\unrealed\private\unrealedengine.cpp:410]
                            [2020.05.19-21.11.35:838][161]LogWindows: Error: [Callstack] 0x00007ff62c267f62 UE4Editor.exe!FEngineLoop::Tick() [d:\wdi\acn\ue4\engine\source\runtime\launch\private\launchengineloop.cpp:4485]
                            [2020.05.19-21.11.35:838][161]LogWindows: Error: [Callstack] 0x00007ff62c27c3ec UE4Editor.exe!GuardedMain() [d:\wdi\acn\ue4\engine\source\runtime\launch\private\launch.cpp:173]
                            [2020.05.19-21.11.35:838][161]LogWindows: Error: [Callstack] 0x00007ff62c27c4ca UE4Editor.exe!GuardedMainWrapper() [d:\wdi\acn\ue4\engine\source\runtime\launch\private\windows\launchwindows.cpp:134]
                            [2020.05.19-21.11.35:838][161]LogWindows: Error: [Callstack] 0x00007ff62c28ceae UE4Editor.exe!WinMain() [d:\wdi\acn\ue4\engine\source\runtime\launch\private\windows\launchwindows.cpp:263]
                            [2020.05.19-21.11.35:838][161]LogWindows: Error: [Callstack] 0x00007ff62c28fcbe UE4Editor.exe!__scrt_common_main_seh() [d:\agent\_work\2\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288]
                            [2020.05.19-21.11.35:838][161]LogWindows: Error: [Callstack] 0x00007fff64bd7bd4 KERNEL32.DLL!UnknownFunction []
                            [2020.05.19-21.11.35:838][161]LogWindows: Error: [Callstack] 0x00007fff661cce51 ntdll.dll!UnknownFunction []

                            Comment


                              Hello,

                              How would you go about setting up "multiple branches" based on target distance (or any other variable other than a bool)?
                              For instance, if distance is less than 400, branch to ability A; if distance is greater than 400 but less than 600, branch to ability B; If distance is greater than 600, do nothing.

                              My second question is if there's a way to determine the end of a combo and feed that info into a behavior tree?
                              My current behavior tree set up gets the length of the chosen ability and delays by that length and finish execute after.
                              The problem I'm having with that set up is it leaves no room for branching combo abilities since the behavior tree will move on to the next thing.
                              I was hoping to use "On ability end" as a delegate of some kind, but i cannot bind to it. I'm pretty sure It's just me being ignorant about the system.

                              Comment


                                DrTasty Looks like it's failing to cast your scratch pad. I've seen this crash before, but never been able to repro it. I'll see if I can't through some extra info and try and make that code a bit more flexible in the meantime (I'm working on an update for later today).
                                Originally posted by bruize10 View Post
                                Hello,

                                How would you go about setting up "multiple branches" based on target distance (or any other variable other than a bool)?
                                For instance, if distance is less than 400, branch to ability A; if distance is greater than 400 but less than 600, branch to ability B; If distance is greater than 600, do nothing.

                                My second question is if there's a way to determine the end of a combo and feed that info into a behavior tree?
                                My current behavior tree set up gets the length of the chosen ability and delays by that length and finish execute after.
                                The problem I'm having with that set up is it leaves no room for branching combo abilities since the behavior tree will move on to the next thing.
                                I was hoping to use "On ability end" as a delegate of some kind, but i cannot bind to it. I'm pretty sure It's just me being ignorant about the system.
                                You can add a Custom Branch condition and just get the distance, or add a dynamic delegate to the Custom Branch Ability, and do the distance check there and return the appropriate ability.
                                There is a Behavior Tree "Is Playing Ability" decorator you can use which would work in your case. There is also a "On Ability End" delegate on the Able Ability System Component that you should be able to hook into.
                                Able Ability System - A high performance, robust ability system for UE4. Now Available!

                                Comment

                                Working...
                                X