Ver código fonte

Merge pull request #90992 from RadiantUwU/fix_node_duplicate

Fix `Node.duplicate()` crash when duplicating a node that cannot be instantiated.
Rémi Verschelde 11 meses atrás
pai
commit
6d22b8026d
1 arquivos alterados com 5 adições e 1 exclusões
  1. 5 1
      scene/main/node.cpp

+ 5 - 1
scene/main/node.cpp

@@ -2809,9 +2809,11 @@ Node *Node::duplicate(int p_flags) const {
 	ERR_THREAD_GUARD_V(nullptr);
 	ERR_THREAD_GUARD_V(nullptr);
 	Node *dupe = _duplicate(p_flags);
 	Node *dupe = _duplicate(p_flags);
 
 
+	ERR_FAIL_NULL_V_MSG(dupe, nullptr, "Failed to duplicate node.");
+
 	_duplicate_properties(this, this, dupe, p_flags);
 	_duplicate_properties(this, this, dupe, p_flags);
 
 
-	if (dupe && (p_flags & DUPLICATE_SIGNALS)) {
+	if (p_flags & DUPLICATE_SIGNALS) {
 		_duplicate_signals(this, dupe);
 		_duplicate_signals(this, dupe);
 	}
 	}
 
 
@@ -2827,6 +2829,8 @@ Node *Node::duplicate_from_editor(HashMap<const Node *, Node *> &r_duplimap, con
 	int flags = DUPLICATE_SIGNALS | DUPLICATE_GROUPS | DUPLICATE_SCRIPTS | DUPLICATE_USE_INSTANTIATION | DUPLICATE_FROM_EDITOR;
 	int flags = DUPLICATE_SIGNALS | DUPLICATE_GROUPS | DUPLICATE_SCRIPTS | DUPLICATE_USE_INSTANTIATION | DUPLICATE_FROM_EDITOR;
 	Node *dupe = _duplicate(flags, &r_duplimap);
 	Node *dupe = _duplicate(flags, &r_duplimap);
 
 
+	ERR_FAIL_NULL_V_MSG(dupe, nullptr, "Failed to duplicate node.");
+
 	_duplicate_properties(this, this, dupe, flags);
 	_duplicate_properties(this, this, dupe, flags);
 
 
 	// This is used by SceneTreeDock's paste functionality. When pasting to foreign scene, resources are duplicated.
 	// This is used by SceneTreeDock's paste functionality. When pasting to foreign scene, resources are duplicated.