diff options
| -rw-r--r-- | core/string_db.cpp | 3 | ||||
| -rw-r--r-- | scene/main/node.cpp | 3 | ||||
| -rw-r--r-- | scene/resources/packed_scene.cpp | 47 | ||||
| -rw-r--r-- | scene/resources/packed_scene.h | 2 |
4 files changed, 34 insertions, 21 deletions
diff --git a/core/string_db.cpp b/core/string_db.cpp index 02e0b5b26..6cd9ee506 100644 --- a/core/string_db.cpp +++ b/core/string_db.cpp @@ -288,6 +288,9 @@ StringName::StringName(const String& p_name) { ERR_FAIL_COND(!configured); + if (p_name.empty()) + return; + _global_lock(); uint32_t hash = p_name.hash(); diff --git a/scene/main/node.cpp b/scene/main/node.cpp index 92caeae95..5b2879dee 100644 --- a/scene/main/node.cpp +++ b/scene/main/node.cpp @@ -1080,6 +1080,9 @@ void Node::get_owned_by(Node *p_by,List<Node*> *p_owned) { void Node::_set_owner_nocheck(Node* p_owner) { + if (data.owner==p_owner) + return; + ERR_FAIL_COND(data.owner); data.owner=p_owner; data.owner->data.owned.push_back( this ); diff --git a/scene/resources/packed_scene.cpp b/scene/resources/packed_scene.cpp index f320570c2..3bbe5e13b 100644 --- a/scene/resources/packed_scene.cpp +++ b/scene/resources/packed_scene.cpp @@ -1548,34 +1548,41 @@ Array SceneState::get_connection_binds(int p_idx) const { return binds; } -bool SceneState::has_connection(const NodePath& p_node_from, const StringName& p_signal, const NodePath& p_node_to, const StringName& p_method) const { +bool SceneState::has_connection(const NodePath& p_node_from, const StringName& p_signal, const NodePath& p_node_to, const StringName& p_method) { - for(int i=0;i<connections.size();i++) { - const ConnectionData &c = connections[i]; + // this method cannot be const because of this + Ref<SceneState> ss=this; - NodePath np_from; + do { + for(int i=0;i<ss->connections.size();i++) { + const ConnectionData &c = ss->connections[i]; - if (c.from&FLAG_ID_IS_PATH) { - np_from=node_paths[c.from&FLAG_MASK]; - } else { - np_from=get_node_path(c.from); - } + NodePath np_from; - NodePath np_to; + if (c.from&FLAG_ID_IS_PATH) { + np_from=ss->node_paths[c.from&FLAG_MASK]; + } else { + np_from=ss->get_node_path(c.from); + } - if (c.to&FLAG_ID_IS_PATH) { - np_to=node_paths[c.to&FLAG_MASK]; - } else { - np_to=get_node_path(c.to); - } + NodePath np_to; - StringName sn_signal=names[c.signal]; - StringName sn_method=names[c.method]; + if (c.to&FLAG_ID_IS_PATH) { + np_to=ss->node_paths[c.to&FLAG_MASK]; + } else { + np_to=ss->get_node_path(c.to); + } - if (np_from==p_node_from && sn_signal==p_signal && np_to==p_node_to && sn_method==p_method) { - return true; + StringName sn_signal=ss->names[c.signal]; + StringName sn_method=ss->names[c.method]; + + if (np_from==p_node_from && sn_signal==p_signal && np_to==p_node_to && sn_method==p_method) { + return true; + } } - } + + ss=ss->_get_base_scene_state(); + } while (ss.is_valid()); return false; } diff --git a/scene/resources/packed_scene.h b/scene/resources/packed_scene.h index aedc4d70d..c7c30354e 100644 --- a/scene/resources/packed_scene.h +++ b/scene/resources/packed_scene.h @@ -165,7 +165,7 @@ public: int get_connection_flags(int p_idx) const; Array get_connection_binds(int p_idx) const; - bool has_connection(const NodePath &p_node_from, const StringName& p_signal, const NodePath &p_node_to, const StringName& p_method) const; + bool has_connection(const NodePath &p_node_from, const StringName& p_signal, const NodePath &p_node_to, const StringName& p_method); Vector<NodePath> get_editable_instances() const; |
