From a1cdff2e2ed7ae39cbcea19cf90923042864b6b9 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Tue, 14 May 2024 19:47:05 +0200 Subject: [PATCH] Fix issues with mapping in BTSubtree --- blackboard/blackboard_plan.cpp | 3 +-- bt/behavior_tree.cpp | 1 - bt/tasks/decorators/bt_new_scope.cpp | 23 +++++++++++++++++++---- bt/tasks/decorators/bt_new_scope.h | 2 ++ bt/tasks/decorators/bt_subtree.cpp | 4 ---- 5 files changed, 22 insertions(+), 11 deletions(-) diff --git a/blackboard/blackboard_plan.cpp b/blackboard/blackboard_plan.cpp index 0ea59f7..c05cfd6 100644 --- a/blackboard/blackboard_plan.cpp +++ b/blackboard/blackboard_plan.cpp @@ -28,7 +28,6 @@ bool BlackboardPlan::_set(const StringName &p_name, const Variant &p_value) { // * Mapping if (name_str.begins_with("mapping/")) { StringName mapped_var_name = name_str.get_slicec('/', 1); - ERR_FAIL_COND_V(!has_var(mapped_var_name), false); parent_scope_mapping[mapped_var_name] = p_value; return true; } @@ -382,7 +381,7 @@ Ref BlackboardPlan::create_blackboard(Node *p_node, const Ref bb = memnew(Blackboard); bb->set_parent(p_parent_scope); - populate_blackboard(bb, false, p_node); + populate_blackboard(bb, true, p_node); return bb; } diff --git a/bt/behavior_tree.cpp b/bt/behavior_tree.cpp index 45d403f..3482462 100644 --- a/bt/behavior_tree.cpp +++ b/bt/behavior_tree.cpp @@ -48,7 +48,6 @@ void BehaviorTree::set_blackboard_plan(const Ref &p_plan) { blackboard_plan->connect(LW_NAME(changed), callable_mp(this, &BehaviorTree::_plan_changed)); } - _set_editor_behavior_tree_hint(); _plan_changed(); } diff --git a/bt/tasks/decorators/bt_new_scope.cpp b/bt/tasks/decorators/bt_new_scope.cpp index 5aaa4bc..48a3319 100644 --- a/bt/tasks/decorators/bt_new_scope.cpp +++ b/bt/tasks/decorators/bt_new_scope.cpp @@ -11,28 +11,43 @@ #include "bt_new_scope.h" +#include "../../behavior_tree.h" + void BTNewScope::set_blackboard_plan(const Ref &p_plan) { blackboard_plan = p_plan; if (blackboard_plan.is_null()) { blackboard_plan.instantiate(); } + _update_blackboard_plan(); + +#ifdef TOOLS_ENABLED + if (Engine::get_singleton()->is_editor_hint()) { + callable_mp(this, &BTNewScope::_set_parent_scope_plan_from_bt).call_deferred(); + } +#endif // TOOLS_ENABLED + emit_changed(); } +void BTNewScope::_set_parent_scope_plan_from_bt() { + ERR_FAIL_NULL(get_blackboard_plan()); + Ref bt = get_root()->editor_get_behavior_tree(); + ERR_FAIL_NULL(bt); + get_blackboard_plan()->set_parent_scope_plan(bt->get_blackboard_plan()); +} + void BTNewScope::initialize(Node *p_agent, const Ref &p_blackboard, Node *p_scene_root) { ERR_FAIL_COND(p_agent == nullptr); ERR_FAIL_COND(p_blackboard == nullptr); Ref bb; if (blackboard_plan.is_valid()) { - bb = blackboard_plan->create_blackboard(p_agent); + bb = blackboard_plan->create_blackboard(p_agent, p_blackboard); } else { bb = Ref(memnew(Blackboard)); + bb->set_parent(p_blackboard); } - - bb->set_parent(p_blackboard); - BTDecorator::initialize(p_agent, bb, p_scene_root); } diff --git a/bt/tasks/decorators/bt_new_scope.h b/bt/tasks/decorators/bt_new_scope.h index a7e0020..df2c505 100644 --- a/bt/tasks/decorators/bt_new_scope.h +++ b/bt/tasks/decorators/bt_new_scope.h @@ -23,6 +23,8 @@ class BTNewScope : public BTDecorator { private: Ref blackboard_plan; + void _set_parent_scope_plan_from_bt(); + protected: static void _bind_methods(); diff --git a/bt/tasks/decorators/bt_subtree.cpp b/bt/tasks/decorators/bt_subtree.cpp index 331d538..9124912 100644 --- a/bt/tasks/decorators/bt_subtree.cpp +++ b/bt/tasks/decorators/bt_subtree.cpp @@ -30,10 +30,6 @@ void BTSubtree::_update_blackboard_plan() { set_blackboard_plan(Ref(memnew(BlackboardPlan))); } get_blackboard_plan()->set_base_plan(subtree.is_valid() ? subtree->get_blackboard_plan() : nullptr); - -#ifdef TOOLS_ENABLED - get_blackboard_plan()->set_parent_scope_plan(get_root()->editor_get_behavior_tree()->get_blackboard_plan()); -#endif // TOOLS_ENABLED } String BTSubtree::_generate_name() {