@@ -2951,6 +2951,10 @@ Node *Node::duplicate(int p_flags) const {
29512951
29522952 ERR_FAIL_NULL_V_MSG (dupe, nullptr , " Failed to duplicate node." );
29532953
2954+ if (p_flags & DUPLICATE_SCRIPTS) {
2955+ _duplicate_scripts (this , dupe);
2956+ }
2957+
29542958 _duplicate_properties (this , this , dupe, p_flags);
29552959
29562960 if (p_flags & DUPLICATE_SIGNALS) {
@@ -2971,6 +2975,10 @@ Node *Node::duplicate_from_editor(HashMap<const Node *, Node *> &r_duplimap, con
29712975
29722976 ERR_FAIL_NULL_V_MSG (dupe, nullptr , " Failed to duplicate node." );
29732977
2978+ if (flags & DUPLICATE_SCRIPTS) {
2979+ _duplicate_scripts (this , dupe);
2980+ }
2981+
29742982 _duplicate_properties (this , this , dupe, flags);
29752983
29762984 // This is used by SceneTreeDock's paste functionality. When pasting to foreign scene, resources are duplicated.
@@ -3043,20 +3051,27 @@ void Node::_emit_editor_state_changed() {
30433051}
30443052#endif
30453053
3054+ void Node::_duplicate_scripts (const Node *p_original, Node *p_copy) const {
3055+ bool is_valid = false ;
3056+ Variant scr = p_original->get (CoreStringName (script), &is_valid);
3057+ if (is_valid) {
3058+ p_copy->set (CoreStringName (script), scr);
3059+ }
3060+
3061+ for (int i = 0 ; i < p_original->get_child_count (false ); i++) {
3062+ Node *copy_child = p_copy->get_child (i, false );
3063+ ERR_FAIL_NULL_MSG (copy_child, " Child node disappeared while duplicating." );
3064+ _duplicate_scripts (p_original->get_child (i, false ), copy_child);
3065+ }
3066+ }
3067+
30463068// Duplicate node's properties.
30473069// This has to be called after nodes have been duplicated since there might be properties
30483070// of type Node that can be updated properly only if duplicated node tree is complete.
30493071void Node::_duplicate_properties (const Node *p_root, const Node *p_original, Node *p_copy, int p_flags) const {
30503072 List<PropertyInfo> props;
30513073 p_original->get_property_list (&props);
30523074 const StringName &script_property_name = CoreStringName (script);
3053- if (p_flags & DUPLICATE_SCRIPTS) {
3054- bool is_valid = false ;
3055- Variant scr = p_original->get (script_property_name, &is_valid);
3056- if (is_valid) {
3057- p_copy->set (script_property_name, scr);
3058- }
3059- }
30603075 for (const PropertyInfo &E : props) {
30613076 if (!(E.usage & PROPERTY_USAGE_STORAGE)) {
30623077 continue ;
0 commit comments