|
@@ -1954,6 +1954,23 @@ void Node::propagate_notification(int p_notification) {
|
|
|
data.blocked--;
|
|
|
}
|
|
|
|
|
|
+void Node::propagate_call(const StringName &p_method, const Array &p_args, const bool p_parent_first) {
|
|
|
+
|
|
|
+ data.blocked++;
|
|
|
+
|
|
|
+ if (p_parent_first && has_method(p_method))
|
|
|
+ callv(p_method, p_args);
|
|
|
+
|
|
|
+ for (int i = 0; i < data.children.size(); i++) {
|
|
|
+ data.children[i]->propagate_call(p_method, p_args, p_parent_first);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!p_parent_first && has_method(p_method))
|
|
|
+ callv(p_method, p_args);
|
|
|
+
|
|
|
+ data.blocked--;
|
|
|
+}
|
|
|
+
|
|
|
void Node::_propagate_replace_owner(Node *p_owner, Node *p_by_owner) {
|
|
|
if (get_owner() == p_owner)
|
|
|
set_owner(p_by_owner);
|
|
@@ -2761,6 +2778,7 @@ void Node::_bind_methods() {
|
|
|
ClassDB::bind_method(D_METHOD("set_filename", "filename"), &Node::set_filename);
|
|
|
ClassDB::bind_method(D_METHOD("get_filename"), &Node::get_filename);
|
|
|
ClassDB::bind_method(D_METHOD("propagate_notification", "what"), &Node::propagate_notification);
|
|
|
+ ClassDB::bind_method(D_METHOD("propagate_call", "method", "args", "parent_first"), &Node::propagate_call, DEFVAL(Array()), DEFVAL(false));
|
|
|
ClassDB::bind_method(D_METHOD("set_fixed_process", "enable"), &Node::set_fixed_process);
|
|
|
ClassDB::bind_method(D_METHOD("get_fixed_process_delta_time"), &Node::get_fixed_process_delta_time);
|
|
|
ClassDB::bind_method(D_METHOD("is_fixed_processing"), &Node::is_fixed_processing);
|