Browse Source

Fix duplicating sub-scene may get two copies of internal node

Previously, internal node might be mistaken for `hidden_root` and be duplicated again.
Exclude those internal nodes to avoid this case, unless the owner is set intentionally.

(cherry picked from commit f19c4191260041eed72daa8a2633187e71500d10)
风青山 1 year ago
parent
commit
261129496c
1 changed files with 5 additions and 0 deletions
  1. 5 0
      scene/main/node.cpp

+ 5 - 0
scene/main/node.cpp

@@ -2510,6 +2510,11 @@ Node *Node::_duplicate(int p_flags, HashMap<const Node *, Node *> *r_duplimap) c
 		for (List<const Node *>::Element *N = node_tree.front(); N; N = N->next()) {
 			for (int i = 0; i < N->get()->get_child_count(); ++i) {
 				Node *descendant = N->get()->get_child(i);
+
+				if (!descendant->get_owner()) {
+					continue; // Internal nodes or nodes added by scripts.
+				}
+
 				// Skip nodes not really belonging to the instantiated hierarchy; they'll be processed normally later
 				// but remember non-instantiated nodes that are hidden below instantiated ones
 				if (!instance_roots.has(descendant->get_owner())) {