@@ -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.
30303052void 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 ;
0 commit comments