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. ///