diff options
author | Rémi Verschelde <remi@verschelde.fr> | 2021-02-26 07:51:28 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-02-26 07:51:28 +0100 |
commit | 9e995e081efbb9c046539de9361b9fea35344288 (patch) | |
tree | 267b4149686f4adac5972e556cd2b8a2ea49229d | |
parent | 1f702e35d8b6495c23ff03619c9ebe4d276f4d41 (diff) | |
parent | 04a4828c5ee48ca105e69e00be7c75994d6528d4 (diff) |
Merge pull request #46432 from nmrkr/uncreatable-type-scene-load
Fix crash when loading a scene containing an uncreatable type
-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) { |