@@ -63,17 +63,21 @@ void BTPlayer::_load_tree() {
63
63
void BTPlayer::_update_blackboard_plan () {
64
64
if (blackboard_plan.is_null ()) {
65
65
blackboard_plan = Ref<BlackboardPlan>(memnew (BlackboardPlan));
66
+ } else if (!RESOURCE_IS_BUILT_IN (blackboard_plan)) {
67
+ WARN_PRINT_ED (" BTPlayer: Using external resource for derived blackboard plan is not supported. Converted to built-in resource." );
68
+ blackboard_plan = blackboard_plan->duplicate ();
66
69
}
70
+
67
71
blackboard_plan->set_base_plan (behavior_tree.is_valid () ? behavior_tree->get_blackboard_plan () : nullptr );
68
72
}
69
73
70
74
void BTPlayer::set_behavior_tree (const Ref<BehaviorTree> &p_tree) {
71
75
if (Engine::get_singleton ()->is_editor_hint ()) {
72
- if (behavior_tree.is_valid () && behavior_tree->is_connected (LW_NAME (changed ), callable_mp (this , &BTPlayer::_update_blackboard_plan))) {
73
- behavior_tree->disconnect (LW_NAME (changed ), callable_mp (this , &BTPlayer::_update_blackboard_plan));
76
+ if (behavior_tree.is_valid () && behavior_tree->is_connected (LW_NAME (plan_changed ), callable_mp (this , &BTPlayer::_update_blackboard_plan))) {
77
+ behavior_tree->disconnect (LW_NAME (plan_changed ), callable_mp (this , &BTPlayer::_update_blackboard_plan));
74
78
}
75
79
if (p_tree.is_valid ()) {
76
- p_tree->connect (LW_NAME (changed ), callable_mp (this , &BTPlayer::_update_blackboard_plan));
80
+ p_tree->connect (LW_NAME (plan_changed ), callable_mp (this , &BTPlayer::_update_blackboard_plan));
77
81
}
78
82
behavior_tree = p_tree;
79
83
_update_blackboard_plan ();
@@ -212,8 +216,8 @@ void BTPlayer::_notification(int p_notification) {
212
216
#endif // DEBUG_ENABLED
213
217
214
218
if (Engine::get_singleton ()->is_editor_hint ()) {
215
- if (behavior_tree.is_valid () && behavior_tree->is_connected (LW_NAME (changed ), callable_mp (this , &BTPlayer::_update_blackboard_plan))) {
216
- behavior_tree->disconnect (LW_NAME (changed ), callable_mp (this , &BTPlayer::_update_blackboard_plan));
219
+ if (behavior_tree.is_valid () && behavior_tree->is_connected (LW_NAME (plan_changed ), callable_mp (this , &BTPlayer::_update_blackboard_plan))) {
220
+ behavior_tree->disconnect (LW_NAME (plan_changed ), callable_mp (this , &BTPlayer::_update_blackboard_plan));
217
221
}
218
222
}
219
223
@@ -244,7 +248,7 @@ void BTPlayer::_bind_methods() {
244
248
ADD_PROPERTY (PropertyInfo (Variant::INT, " update_mode" , PROPERTY_HINT_ENUM, " Idle,Physics,Manual" ), " set_update_mode" , " get_update_mode" );
245
249
ADD_PROPERTY (PropertyInfo (Variant::BOOL, " active" ), " set_active" , " get_active" );
246
250
ADD_PROPERTY (PropertyInfo (Variant::OBJECT, " blackboard" , PROPERTY_HINT_NONE, " Blackboard" , 0 ), " set_blackboard" , " get_blackboard" );
247
- ADD_PROPERTY (PropertyInfo (Variant::OBJECT, " blackboard_plan" , PROPERTY_HINT_RESOURCE_TYPE, " BlackboardPlan" , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_EDITOR_INSTANTIATE_OBJECT), " set_blackboard_plan" , " get_blackboard_plan" );
251
+ ADD_PROPERTY (PropertyInfo (Variant::OBJECT, " blackboard_plan" , PROPERTY_HINT_RESOURCE_TYPE, " BlackboardPlan" , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_EDITOR_INSTANTIATE_OBJECT | PROPERTY_USAGE_ALWAYS_DUPLICATE ), " set_blackboard_plan" , " get_blackboard_plan" );
248
252
249
253
BIND_ENUM_CONSTANT (IDLE);
250
254
BIND_ENUM_CONSTANT (PHYSICS);
0 commit comments