Merge pull request #46432 from nmrkr/uncreatable-type-scene-load

Fix crash when loading a scene containing an uncreatable type
This commit is contained in:
Rémi Verschelde 2021-02-26 07:51:28 +01:00 committed by GitHub
commit 9e995e081e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 9 additions and 8 deletions

View File

@ -147,15 +147,20 @@ Node *SceneState::instance(GenEditState p_edit_state) const {
} }
#endif #endif
} }
} else if (ClassDB::is_class_enabled(snames[n.type])) { } else {
Object *obj = nullptr;
if (ClassDB::is_class_enabled(snames[n.type])) {
//node belongs to this scene and must be created //node belongs to this scene and must be created
Object *obj = ClassDB::instance(snames[n.type]); obj = ClassDB::instance(snames[n.type]);
}
if (!Object::cast_to<Node>(obj)) { if (!Object::cast_to<Node>(obj)) {
if (obj) { if (obj) {
memdelete(obj); memdelete(obj);
obj = nullptr; obj = nullptr;
} }
WARN_PRINT(String("Warning node of type " + snames[n.type].operator String() + " does not exist.").ascii().get_data()); WARN_PRINT(vformat("Node %s of type %s cannot be created. A placeholder will be created instead.", snames[n.name], snames[n.type]).ascii().get_data());
if (n.parent >= 0 && n.parent < nc && ret_nodes[n.parent]) { if (n.parent >= 0 && n.parent < nc && ret_nodes[n.parent]) {
if (Object::cast_to<Node3D>(ret_nodes[n.parent])) { if (Object::cast_to<Node3D>(ret_nodes[n.parent])) {
obj = memnew(Node3D); obj = memnew(Node3D);
@ -172,10 +177,6 @@ Node *SceneState::instance(GenEditState p_edit_state) const {
} }
node = Object::cast_to<Node>(obj); node = Object::cast_to<Node>(obj);
} else {
//print_line("Class is disabled for: " + itos(n.type));
//print_line("name: " + String(snames[n.type]));
} }
if (node) { if (node) {