diff options
| author | Bojidar Marinov | 2017-09-11 12:34:36 +0300 |
|---|---|---|
| committer | Bojidar Marinov | 2017-09-11 12:34:36 +0300 |
| commit | ebee9898ca71a7388412225fccaf460c258c6940 (patch) | |
| tree | fadde7759dfebd6a973c92e8b767143b5e062b3b /scene/main/node.cpp | |
| parent | 5f39f3a2dfba500b6c9cd8f87b0dd35949043822 (diff) | |
| download | godot-ebee9898ca71a7388412225fccaf460c258c6940.tar.gz godot-ebee9898ca71a7388412225fccaf460c258c6940.tar.zst godot-ebee9898ca71a7388412225fccaf460c258c6940.zip | |
Fix duplication of nodes resulting in shared metadata
Fixes #9547
Diffstat (limited to '')
| -rwxr-xr-x | scene/main/node.cpp | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/scene/main/node.cpp b/scene/main/node.cpp index c3d9d97c5..a543dba9c 100755 --- a/scene/main/node.cpp +++ b/scene/main/node.cpp @@ -2117,7 +2117,15 @@ Node *Node::_duplicate(int p_flags) const { if (!(p_flags & DUPLICATE_SCRIPTS) && name == "script/script") continue; - node->set(name, get(name)); + Variant value = get(name); + // Duplicate dictionaries and arrays, mainly needed for __meta__ + if (value.get_type() == Variant::DICTIONARY) { + value = Dictionary(value).copy(); + } else if (value.get_type() == Variant::ARRAY) { + value = Array(value).duplicate(); + } + + node->set(name, value); } node->set_name(get_name()); @@ -2199,7 +2207,16 @@ void Node::_duplicate_and_reown(Node *p_new_parent, const Map<Node *, Node *> &p if (!(E->get().usage & PROPERTY_USAGE_STORAGE)) continue; String name = E->get().name; - node->set(name, get(name)); + + Variant value = get(name); + // Duplicate dictionaries and arrays, mainly needed for __meta__ + if (value.get_type() == Variant::DICTIONARY) { + value = Dictionary(value).copy(); + } else if (value.get_type() == Variant::ARRAY) { + value = Array(value).duplicate(); + } + + node->set(name, value); } node->set_name(get_name()); |
