EBTNodeResult::Type UChooseNextWaypoint::ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) { // Get the patrol route auto ControlledPawn = OwnerComp.GetAIOwner()->GetPawn(); auto PatrolRoute = ControlledPawn->FindComponentByClass<UPatrolRoute>(); if (!ensure(PatrolRoute)) { return EBTNodeResult::Failed; } // Warn about empty patrol routes auto PatrolPoints = PatrolRoute->GetPatrolPoints(); if (PatrolPoints.Num() == 0) { UE_LOG(LogTemp, Warning, TEXT("A guard is missing patrol points.")); return EBTNodeResult::Failed; } // Set the next waypoint auto BlackboardComp = OwnerComp.GetBlackboardComponent(); auto Index = BlackboardComp->GetValueAsInt(IndexKey.SelectedKeyName); BlackboardComp->SetValueAsObject(WaypointKey.SelectedKeyName, PatrolPoints[Index]); // Cycle the index auto NextIndex = (Index + 1) % PatrolPoints.Num(); BlackboardComp->SetValueAsInt(IndexKey.SelectedKeyName, NextIndex); // UE_LOG(LogTemp, Warning, TEXT("Waypoint index: %i"), Index); return EBTNodeResult::Succeeded; }
EBTNodeResult::Type UBTTaskNode_ChooseNextSpell::ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) { Super::ExecuteTask(OwnerComp, NodeMemory); auto controller = Cast<ABaseAIController>(OwnerComp.GetAIOwner()); auto blackboard = OwnerComp.GetBlackboardComponent(); auto spellData = controller->GetNextSpell(); blackboard->SetValueAsObject("NextSpell", spellData); return EBTNodeResult::Type::Succeeded; }