diff --git a/Source/Engine/AI/Behavior.cpp b/Source/Engine/AI/Behavior.cpp
index f496c887d..0c7fb6e67 100644
--- a/Source/Engine/AI/Behavior.cpp
+++ b/Source/Engine/AI/Behavior.cpp
@@ -26,12 +26,12 @@ void Behavior::StartLogic()
_knowledge.InitMemory(tree);
}
-void Behavior::StopLogic()
+void Behavior::StopLogic(BehaviorUpdateResult result)
{
- if (_result != BehaviorUpdateResult::Running)
+ if (_result != BehaviorUpdateResult::Running || result == BehaviorUpdateResult::Running)
return;
_accumulatedTime = 0.0f;
- _result = BehaviorUpdateResult::Success;
+ _result = result;
}
void Behavior::ResetLogic()
@@ -83,8 +83,9 @@ void Behavior::OnLateUpdate()
context.DeltaTime = updateDeltaTime;
const BehaviorUpdateResult result = tree->Graph.Root->InvokeUpdate(context);
if (result != BehaviorUpdateResult::Running)
- {
_result = result;
+ if (_result != BehaviorUpdateResult::Running)
+ {
Finished();
}
}
diff --git a/Source/Engine/AI/Behavior.h b/Source/Engine/AI/Behavior.h
index a98fce4d5..6800eb9a1 100644
--- a/Source/Engine/AI/Behavior.h
+++ b/Source/Engine/AI/Behavior.h
@@ -71,7 +71,8 @@ public:
///
/// Stops the logic.
///
- API_FUNCTION() void StopLogic();
+ /// The logic result.
+ API_FUNCTION() void StopLogic(BehaviorUpdateResult result = BehaviorUpdateResult::Success);
///
/// Resets the behavior logic by clearing knowledge (clears blackboard and removes goals) and resetting execution state (goes back to root).
diff --git a/Source/Engine/AI/BehaviorTreeNodes.cpp b/Source/Engine/AI/BehaviorTreeNodes.cpp
index d4d3ce02f..f7d03fdda 100644
--- a/Source/Engine/AI/BehaviorTreeNodes.cpp
+++ b/Source/Engine/AI/BehaviorTreeNodes.cpp
@@ -246,3 +246,9 @@ BehaviorUpdateResult BehaviorTreeSubTreeNode::Update(BehaviorUpdateContext conte
// Run nested tree
return tree->Graph.Root->InvokeUpdate(context);
}
+
+BehaviorUpdateResult BehaviorTreeForceFinishNode::Update(BehaviorUpdateContext context)
+{
+ context.Behavior->StopLogic(Result);
+ return Result;
+}
diff --git a/Source/Engine/AI/BehaviorTreeNodes.h b/Source/Engine/AI/BehaviorTreeNodes.h
index e28d0b81b..347aa2b49 100644
--- a/Source/Engine/AI/BehaviorTreeNodes.h
+++ b/Source/Engine/AI/BehaviorTreeNodes.h
@@ -141,3 +141,19 @@ public:
BitArray<> RelevantNodes;
};
};
+
+///
+/// Forces behavior execution end with a specific result (eg. force fail).
+///
+API_CLASS(Sealed) class FLAXENGINE_API BehaviorTreeForceFinishNode : public BehaviorTreeNode
+{
+ DECLARE_SCRIPTING_TYPE_WITH_CONSTRUCTOR_IMPL(BehaviorTreeForceFinishNode, BehaviorTreeNode);
+ API_AUTO_SERIALIZATION();
+
+ // Execution result.
+ API_FIELD() BehaviorUpdateResult Result = BehaviorUpdateResult::Success;
+
+public:
+ // [BehaviorTreeNode]
+ BehaviorUpdateResult Update(BehaviorUpdateContext context) override;
+};