@@ -387,33 +387,16 @@ void BlackboardPlan::sync_with_base_plan() {
387
387
}
388
388
}
389
389
390
- // Add a variable duplicate to the blackboard, optionally with NodePath prefetch.
391
- inline void bb_add_var_dup_with_prefetch (const Ref<Blackboard> &p_blackboard, const StringName &p_name, const BBVariable &p_var, bool p_prefetch, Node *p_node) {
392
- if (unlikely (p_prefetch && p_var.get_type () == Variant::NODE_PATH)) {
393
- Node *n = p_node->get_node_or_null (p_var.get_value ());
394
- BBVariable var = p_var.duplicate (true );
395
- if (n != nullptr ) {
396
- var.set_value (n);
397
- } else {
398
- ERR_PRINT (vformat (" BlackboardPlan: Prefetch failed for variable $%s with value: %s" , p_name, p_var.get_value ()));
399
- var.set_value (Variant ());
400
- }
401
- p_blackboard->assign_var (p_name, var);
402
- } else {
403
- p_blackboard->assign_var (p_name, p_var.duplicate (true ));
404
- }
405
- }
406
-
407
- Ref<Blackboard> BlackboardPlan::create_blackboard (Node *p_node, const Ref<Blackboard> &p_parent_scope) {
408
- ERR_FAIL_COND_V (p_node == nullptr && prefetch_nodepath_vars, memnew (Blackboard));
390
+ Ref<Blackboard> BlackboardPlan::create_blackboard (Node *p_prefetch_root, const Ref<Blackboard> &p_parent_scope, Node *p_prefetch_root_for_base_plan) {
391
+ ERR_FAIL_COND_V (p_prefetch_root == nullptr && prefetch_nodepath_vars, memnew (Blackboard));
409
392
Ref<Blackboard> bb = memnew (Blackboard);
410
393
bb->set_parent (p_parent_scope);
411
- populate_blackboard (bb, true , p_node );
394
+ populate_blackboard (bb, true , p_prefetch_root, p_prefetch_root_for_base_plan );
412
395
return bb;
413
396
}
414
397
415
- void BlackboardPlan::populate_blackboard (const Ref<Blackboard> &p_blackboard, bool overwrite, Node *p_node ) {
416
- ERR_FAIL_COND (p_node == nullptr && prefetch_nodepath_vars);
398
+ void BlackboardPlan::populate_blackboard (const Ref<Blackboard> &p_blackboard, bool overwrite, Node *p_prefetch_root, Node *p_prefetch_root_for_base_plan ) {
399
+ ERR_FAIL_COND (p_prefetch_root == nullptr && prefetch_nodepath_vars);
417
400
ERR_FAIL_COND (p_blackboard.is_null ());
418
401
for (const Pair<StringName, BBVariable> &p : var_list) {
419
402
if (p_blackboard->has_local_var (p.first ) && !overwrite) {
@@ -429,7 +412,21 @@ void BlackboardPlan::populate_blackboard(const Ref<Blackboard> &p_blackboard, bo
429
412
}
430
413
bool has_mapping = parent_scope_mapping.has (p.first );
431
414
bool do_prefetch = !has_mapping && prefetch_nodepath_vars;
432
- bb_add_var_dup_with_prefetch (p_blackboard, p.first , p.second , do_prefetch, p_node);
415
+
416
+ // Add a variable duplicate to the blackboard, optionally with NodePath prefetch.
417
+ BBVariable var = p.second .duplicate (true );
418
+ if (unlikely (do_prefetch && p.second .get_type () == Variant::NODE_PATH)) {
419
+ Node *prefetch_root = !is_derived () || is_derived_var_changed (p.first ) ? p_prefetch_root : p_prefetch_root_for_base_plan;
420
+ Node *n = prefetch_root->get_node_or_null (p.second .get_value ());
421
+ if (n != nullptr ) {
422
+ var.set_value (n);
423
+ } else {
424
+ ERR_PRINT (vformat (" BlackboardPlan: Prefetch failed for variable $%s with value: %s" , p.first , p.second .get_value ()));
425
+ var.set_value (Variant ());
426
+ }
427
+ }
428
+ p_blackboard->assign_var (p.first , var);
429
+
433
430
if (has_mapping) {
434
431
StringName target_var = parent_scope_mapping[p.first ];
435
432
if (target_var != StringName ()) {
@@ -450,8 +447,8 @@ void BlackboardPlan::_bind_methods() {
450
447
ClassDB::bind_method (D_METHOD (" sync_with_base_plan" ), &BlackboardPlan::sync_with_base_plan);
451
448
ClassDB::bind_method (D_METHOD (" set_parent_scope_plan_provider" , " callable" ), &BlackboardPlan::set_parent_scope_plan_provider);
452
449
ClassDB::bind_method (D_METHOD (" get_parent_scope_plan_provider" ), &BlackboardPlan::get_parent_scope_plan_provider);
453
- ClassDB::bind_method (D_METHOD (" create_blackboard" , " node " , " parent_scope" ), &BlackboardPlan::create_blackboard, DEFVAL (Ref<Blackboard>()));
454
- ClassDB::bind_method (D_METHOD (" populate_blackboard" , " blackboard" , " overwrite" , " node " ), &BlackboardPlan::populate_blackboard);
450
+ ClassDB::bind_method (D_METHOD (" create_blackboard" , " prefetch_root " , " parent_scope" , " prefetch_root_for_base_plan " ), &BlackboardPlan::create_blackboard, DEFVAL (Ref<Blackboard>()), DEFVAL ( Variant ()));
451
+ ClassDB::bind_method (D_METHOD (" populate_blackboard" , " blackboard" , " overwrite" , " prefetch_root " , " prefetch_root_for_base_plan " ), &BlackboardPlan::populate_blackboard, DEFVAL ( Variant ()) );
455
452
456
453
// To avoid cluttering the member namespace, we do not export unnecessary properties in this class.
457
454
ADD_PROPERTY (PropertyInfo (Variant::BOOL, " prefetch_nodepath_vars" , PROPERTY_HINT_NONE, " " , PROPERTY_USAGE_STORAGE), " set_prefetch_nodepath_vars" , " is_prefetching_nodepath_vars" );
0 commit comments