void UBTDecorator_ConditionalLoop::OnNodeDeactivation(struct FBehaviorTreeSearchData& SearchData, EBTNodeResult::Type NodeResult) { if (NodeResult != EBTNodeResult::Aborted && SearchData.OwnerComp) { const bool bEvalResult = EvaluateOnBlackboard(SearchData.OwnerComp->GetBlackboardComponent()); UE_VLOG(SearchData.OwnerComp->GetOwner(), LogBehaviorTree, Verbose, TEXT("Loop condition: %s -> %s"), bEvalResult ? TEXT("true") : TEXT("false"), (bEvalResult != IsInversed()) ? TEXT("run again!") : TEXT("break")); if (bEvalResult != IsInversed()) { GetParentNode()->SetChildOverride(SearchData, GetChildIndex()); } } }
void UBTDecorator_KeepInCone::TickNode(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory, float DeltaSeconds) { TNodeInstanceMemory* DecoratorMemory = reinterpret_cast<TNodeInstanceMemory*>(NodeMemory); FVector CurrentDir(1.0f, 0, 0); if (CalculateCurrentDirection(OwnerComp, CurrentDir)) { const float Angle = DecoratorMemory->InitialDirection.CosineAngle2D(CurrentDir); if (Angle < ConeHalfAngleDot || (IsInversed() && Angle > ConeHalfAngleDot)) { OwnerComp.RequestExecution(this); } } }
FString UBTDecorator::GetStaticDescription() const { FString FlowAbortDesc; if (FlowAbortMode != EBTFlowAbortMode::None) { FlowAbortDesc = FString::Printf(TEXT("aborts %s"), *UBehaviorTreeTypes::DescribeFlowAbortMode(FlowAbortMode).ToLower()); } FString InversedDesc; if (bShowInverseConditionDesc && IsInversed()) { InversedDesc = TEXT("inversed"); } FString AdditionalDesc; if (FlowAbortDesc.Len() || InversedDesc.Len()) { AdditionalDesc = FString::Printf(TEXT("( %s%s%s )\n"), *FlowAbortDesc, (FlowAbortDesc.Len() > 0) && (InversedDesc.Len() > 0) ? TEXT(", ") : TEXT(""), *InversedDesc); } return FString::Printf(TEXT("%s%s"), *AdditionalDesc, *UBehaviorTreeTypes::GetShortTypeName(this)); }
bool UBTDecorator_BlueprintBase::GetShouldAbort(UBehaviorTreeComponent& OwnerComp) const { // if there's no condition-checking function implemented we always want to abort on any change if (PerformConditionCheckImplementations == 0) { return true; } const bool bIsOnActiveBranch = OwnerComp.IsExecutingBranch(GetMyNode(), GetChildIndex()); bool bShouldAbort = false; if (bIsOnActiveBranch) { bShouldAbort = (FlowAbortMode == EBTFlowAbortMode::Self || FlowAbortMode == EBTFlowAbortMode::Both) && CalculateRawConditionValueImpl(OwnerComp) == IsInversed(); } else { bShouldAbort = (FlowAbortMode == EBTFlowAbortMode::LowerPriority || FlowAbortMode == EBTFlowAbortMode::Both) && CalculateRawConditionValueImpl(OwnerComp) != IsInversed(); } return bShouldAbort; }
bool UBTDecorator::WrappedCanExecute(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) const { const UBTDecorator* NodeOb = bCreateNodeInstance ? (const UBTDecorator*)GetNodeInstance(OwnerComp, NodeMemory) : this; return NodeOb ? (IsInversed() != NodeOb->CalculateRawConditionValue(OwnerComp, NodeMemory)) : false; }