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; +};