EBTNodeResult::Type UBTTask_MoveDirectlyToward::AbortTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) { FBTMoveDirectlyTowardMemory* MyMemory = reinterpret_cast<FBTMoveDirectlyTowardMemory*>(NodeMemory); AAIController* MyController = OwnerComp.GetAIOwner(); if (MyController && MyController->GetPathFollowingComponent()) { MyController->GetPathFollowingComponent()->AbortMove(TEXT("BehaviorTree abort"), MyMemory->MoveRequestID); } return Super::AbortTask(OwnerComp, NodeMemory); }
bool UBTDecorator_IsAtLocation::CalculateRawConditionValue(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) const { bool bHasReached = false; AAIController* AIOwner = OwnerComp.GetAIOwner(); UPathFollowingComponent* PathFollowingComponent = AIOwner ? AIOwner->GetPathFollowingComponent() : nullptr; if (PathFollowingComponent) { const UBlackboardComponent* MyBlackboard = OwnerComp.GetBlackboardComponent(); if (BlackboardKey.SelectedKeyType == UBlackboardKeyType_Object::StaticClass()) { UObject* KeyValue = MyBlackboard->GetValue<UBlackboardKeyType_Object>(BlackboardKey.GetSelectedKeyID()); AActor* TargetActor = Cast<AActor>(KeyValue); if (TargetActor) { bHasReached = PathFollowingComponent->HasReached(*TargetActor, AcceptableRadius, false, bUseNavAgentGoalLocation); } } else if (BlackboardKey.SelectedKeyType == UBlackboardKeyType_Vector::StaticClass()) { const FVector TargetLocation = MyBlackboard->GetValue<UBlackboardKeyType_Vector>(BlackboardKey.GetSelectedKeyID()); if (FAISystem::IsValidLocation(TargetLocation)) { bHasReached = PathFollowingComponent->HasReached(TargetLocation, AcceptableRadius); } } } return bHasReached; }
void C_DudeMoveTo::End() { if (cbHandle.IsValid()) { AAIController* controller = CastChecked<AAIController>(m_Dude.GetController()); controller->GetPathFollowingComponent()->OnMoveFinished.Remove(cbHandle); cbHandle.Reset(); } }
void UAIBlueprintHelperLibrary::UnlockAIResourcesWithAnimation(UAnimInstance* AnimInstance, bool bUnlockMovement, bool UnlockAILogic) { if (AnimInstance == NULL) { return; } APawn* PawnOwner = AnimInstance->TryGetPawnOwner(); if (PawnOwner) { AAIController* OwningAI = Cast<AAIController>(PawnOwner->Controller); if (OwningAI) { if (bUnlockMovement && OwningAI->GetPathFollowingComponent()) { OwningAI->GetPathFollowingComponent()->ClearResourceLock(EAIRequestPriority::HardScript); } if (UnlockAILogic && OwningAI->BrainComponent) { OwningAI->BrainComponent->ClearResourceLock(EAIRequestPriority::HardScript); } } } }
//======================================================================== void C_DudeMoveTo::Start() { AAIController* controller = CastChecked<AAIController>(m_Dude.GetController()); auto ret = controller->MoveToLocation(target, -1.f, true, true, false, true, 0, false); //do not allow partial paths! if (ret == EPathFollowingRequestResult::Failed) { m_Dude.ClearActionQueue(); cbHandle.Reset(); } else { cbHandle = controller->GetPathFollowingComponent()->OnMoveFinished.AddRaw(this, &C_DudeMoveTo::OnMoveCompleted); } }