diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp index 5d2bd2b61ff..4e26fbd6cf8 100644 --- a/editor/scene_tree_dock.cpp +++ b/editor/scene_tree_dock.cpp @@ -2809,12 +2809,17 @@ void SceneTreeDock::_new_scene_from(String p_file) { Node *base = selection.front()->get(); HashMap duplimap; + HashMap inverse_duplimap; Node *copy = base->duplicate_from_editor(duplimap); + for (const KeyValue &item : duplimap) { + inverse_duplimap[item.value] = const_cast(item.key); + } + if (copy) { // Handle Unique Nodes. for (int i = 0; i < copy->get_child_count(false); i++) { - _set_node_owner_recursive(copy->get_child(i, false), copy); + _set_node_owner_recursive(copy->get_child(i, false), copy, inverse_duplimap); } // Root node cannot ever be unique name in its own Scene! copy->set_unique_name_in_owner(false); @@ -2848,13 +2853,18 @@ void SceneTreeDock::_new_scene_from(String p_file) { } } -void SceneTreeDock::_set_node_owner_recursive(Node *p_node, Node *p_owner) { - if (!p_node->get_owner()) { - p_node->set_owner(p_owner); +void SceneTreeDock::_set_node_owner_recursive(Node *p_node, Node *p_owner, const HashMap &p_inverse_duplimap) { + HashMap::ConstIterator E = p_inverse_duplimap.find(p_node); + + if (E) { + const Node *original = E->value; + if (original->get_owner()) { + p_node->set_owner(p_owner); + } } for (int i = 0; i < p_node->get_child_count(false); i++) { - _set_node_owner_recursive(p_node->get_child(i, false), p_owner); + _set_node_owner_recursive(p_node->get_child(i, false), p_owner, p_inverse_duplimap); } } diff --git a/editor/scene_tree_dock.h b/editor/scene_tree_dock.h index fc9c271526d..0f1d046e4dc 100644 --- a/editor/scene_tree_dock.h +++ b/editor/scene_tree_dock.h @@ -234,7 +234,7 @@ class SceneTreeDock : public VBoxContainer { virtual void shortcut_input(const Ref &p_event) override; void _new_scene_from(String p_file); - void _set_node_owner_recursive(Node *p_node, Node *p_owner); + void _set_node_owner_recursive(Node *p_node, Node *p_owner, const HashMap &p_inverse_duplimap); bool _validate_no_foreign(); bool _validate_no_instance();