diff --git a/Source/Engine/AI/BehaviorTreeNodes.cpp b/Source/Engine/AI/BehaviorTreeNodes.cpp
index a1e8089db..c6dbd461f 100644
--- a/Source/Engine/AI/BehaviorTreeNodes.cpp
+++ b/Source/Engine/AI/BehaviorTreeNodes.cpp
@@ -706,6 +706,14 @@ bool BehaviorTreeKnowledgeValuesConditionalDecorator::CanUpdate(const BehaviorUp
return BehaviorKnowledge::CompareValues((float)ValueA.Get(context.Knowledge), (float)ValueB.Get(context.Knowledge), Comparison);
}
+bool BehaviorTreeKnowledgeBooleanDecorator::CanUpdate(const BehaviorUpdateContext& context)
+{
+ Variant value = Value.Get(context.Knowledge);
+ bool result = (bool)value;
+ result ^= Invert;
+ return result;
+}
+
bool BehaviorTreeHasTagDecorator::CanUpdate(const BehaviorUpdateContext& context)
{
bool result = false;
diff --git a/Source/Engine/AI/BehaviorTreeNodes.h b/Source/Engine/AI/BehaviorTreeNodes.h
index 2c2405c8c..af5191f2e 100644
--- a/Source/Engine/AI/BehaviorTreeNodes.h
+++ b/Source/Engine/AI/BehaviorTreeNodes.h
@@ -445,6 +445,27 @@ public:
bool CanUpdate(const BehaviorUpdateContext& context) override;
};
+///
+/// Checks certain knowledge value to conditionally enter the node if the value is set (eg. not-null object reference or boolean value).
+///
+API_CLASS(Sealed) class FLAXENGINE_API BehaviorTreeKnowledgeBooleanDecorator : public BehaviorTreeDecorator
+{
+ DECLARE_SCRIPTING_TYPE_WITH_CONSTRUCTOR_IMPL(BehaviorTreeKnowledgeBooleanDecorator, BehaviorTreeDecorator);
+ API_AUTO_SERIALIZATION();
+
+ // The value from behavior's knowledge (blackboard, goal or sensor) to check if it's set (eg. not-null object reference or boolean value).
+ API_FIELD(Attributes="EditorOrder(0)")
+ BehaviorKnowledgeSelectorAny Value;
+
+ // If checked, the condition will be inverted.
+ API_FIELD(Attributes="EditorOrder(10)")
+ bool Invert = false;
+
+public:
+ // [BehaviorTreeNode]
+ bool CanUpdate(const BehaviorUpdateContext& context) override;
+};
+
///
/// Checks if certain actor (from knowledge) has a given tag assigned.
///