//----------------------------------------------------------------------// // UBTTaskNode IGameplayTaskOwnerInterface //----------------------------------------------------------------------// void UBTTaskNode::OnTaskDeactivated(UGameplayTask& Task) { ensure(Task.GetTaskOwner() == this); UBehaviorTreeComponent* BTComp = GetBTComponentForTask(Task); if (BTComp) { // this is a super-default behavior. Specific task will surely like to // handle this themselves, finishing with specific result const EBTTaskStatus::Type Status = BTComp->GetTaskStatus(this); FinishLatentTask(*BTComp, Status == EBTTaskStatus::Aborting ? EBTNodeResult::Aborted : EBTNodeResult::Succeeded); } }
void UBTTask_GameplayTaskBase::OnGameplayTaskDeactivated(UGameplayTask& Task) { UAITask* AITask = Cast<UAITask>(&Task); if (AITask && AITask->GetAIController() && AITask->GetState() != EGameplayTaskState::Paused) { UBehaviorTreeComponent* BehaviorComp = GetBTComponentForTask(Task); if (BehaviorComp) { uint8* RawMemory = BehaviorComp->GetNodeMemory(this, BehaviorComp->FindInstanceContainingNode(this)); FBTGameplayTaskMemory* MyMemory = reinterpret_cast<FBTGameplayTaskMemory*>(RawMemory); if (MyMemory->bObserverCanFinishTask && (AITask == MyMemory->Task)) { const EBTNodeResult::Type FinishResult = DetermineGameplayTaskResult(*AITask); FinishLatentTask(*BehaviorComp, FinishResult); } } } }