Skip to content

Commit 72925d7

Browse files
committed
Merge pull request #112076 from kevinlam508/custom-node-reference-duplication
Fix duplicating node references of custom node type properties
2 parents 3c87108 + b9cc82d commit 72925d7

File tree

2 files changed

+23
-7
lines changed

2 files changed

+23
-7
lines changed

scene/main/node.cpp

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2932,6 +2932,10 @@ Node *Node::duplicate(int p_flags) const {
29322932

29332933
ERR_FAIL_NULL_V_MSG(dupe, nullptr, "Failed to duplicate node.");
29342934

2935+
if (p_flags & DUPLICATE_SCRIPTS) {
2936+
_duplicate_scripts(this, dupe);
2937+
}
2938+
29352939
_duplicate_properties(this, this, dupe, p_flags);
29362940

29372941
if (p_flags & DUPLICATE_SIGNALS) {
@@ -2952,6 +2956,10 @@ Node *Node::duplicate_from_editor(HashMap<const Node *, Node *> &r_duplimap, con
29522956

29532957
ERR_FAIL_NULL_V_MSG(dupe, nullptr, "Failed to duplicate node.");
29542958

2959+
if (flags & DUPLICATE_SCRIPTS) {
2960+
_duplicate_scripts(this, dupe);
2961+
}
2962+
29552963
_duplicate_properties(this, this, dupe, flags);
29562964

29572965
// This is used by SceneTreeDock's paste functionality. When pasting to foreign scene, resources are duplicated.
@@ -3024,20 +3032,27 @@ void Node::_emit_editor_state_changed() {
30243032
}
30253033
#endif
30263034

3035+
void Node::_duplicate_scripts(const Node *p_original, Node *p_copy) const {
3036+
bool is_valid = false;
3037+
Variant scr = p_original->get(CoreStringName(script), &is_valid);
3038+
if (is_valid) {
3039+
p_copy->set(CoreStringName(script), scr);
3040+
}
3041+
3042+
for (int i = 0; i < p_original->get_child_count(false); i++) {
3043+
Node *copy_child = p_copy->get_child(i, false);
3044+
ERR_FAIL_NULL_MSG(copy_child, "Child node disappeared while duplicating.");
3045+
_duplicate_scripts(p_original->get_child(i, false), copy_child);
3046+
}
3047+
}
3048+
30273049
// Duplicate node's properties.
30283050
// This has to be called after nodes have been duplicated since there might be properties
30293051
// of type Node that can be updated properly only if duplicated node tree is complete.
30303052
void Node::_duplicate_properties(const Node *p_root, const Node *p_original, Node *p_copy, int p_flags) const {
30313053
List<PropertyInfo> props;
30323054
p_original->get_property_list(&props);
30333055
const StringName &script_property_name = CoreStringName(script);
3034-
if (p_flags & DUPLICATE_SCRIPTS) {
3035-
bool is_valid = false;
3036-
Variant scr = p_original->get(script_property_name, &is_valid);
3037-
if (is_valid) {
3038-
p_copy->set(script_property_name, scr);
3039-
}
3040-
}
30413056
for (const PropertyInfo &E : props) {
30423057
if (!(E.usage & PROPERTY_USAGE_STORAGE)) {
30433058
continue;

scene/main/node.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,7 @@ class Node : public Object {
315315
void _propagate_translation_domain_dirty();
316316
Array _get_node_and_resource(const NodePath &p_path);
317317

318+
void _duplicate_scripts(const Node *p_original, Node *p_copy) const;
318319
void _duplicate_properties(const Node *p_root, const Node *p_original, Node *p_copy, int p_flags) const;
319320
void _duplicate_signals(const Node *p_original, Node *p_copy) const;
320321
Node *_duplicate(int p_flags, HashMap<const Node *, Node *> *r_duplimap = nullptr) const;

0 commit comments

Comments
 (0)