diff options
author | Delf Neumärker <delf@nmrkr.de> | 2021-02-25 23:58:15 +0100 |
---|---|---|
committer | Delf Neumärker <delf@nmrkr.de> | 2021-02-25 23:58:30 +0100 |
commit | 04a4828c5ee48ca105e69e00be7c75994d6528d4 (patch) | |
tree | 7a0310b8ad4e60fd3637536919c5226b84871c00 /scene | |
parent | 94f78f276b530d2ff0ed6735b346bb726cfb1e15 (diff) |
Fix crash when loading a scene containing an uncreatable type
Diffstat (limited to 'scene')
-rw-r--r-- | scene/resources/packed_scene.cpp | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/scene/resources/packed_scene.cpp b/scene/resources/packed_scene.cpp index 5d351f51f7..ab8a4b7934 100644 --- a/scene/resources/packed_scene.cpp +++ b/scene/resources/packed_scene.cpp @@ -147,15 +147,20 @@ Node *SceneState::instance(GenEditState p_edit_state) const { } #endif } - } else if (ClassDB::is_class_enabled(snames[n.type])) { - //node belongs to this scene and must be created - Object *obj = ClassDB::instance(snames[n.type]); + } else { + Object *obj = nullptr; + + if (ClassDB::is_class_enabled(snames[n.type])) { + //node belongs to this scene and must be created + obj = ClassDB::instance(snames[n.type]); + } + if (!Object::cast_to<Node>(obj)) { if (obj) { memdelete(obj); 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 (Object::cast_to<Node3D>(ret_nodes[n.parent])) { obj = memnew(Node3D); @@ -172,10 +177,6 @@ Node *SceneState::instance(GenEditState p_edit_state) const { } 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) { |