diff options
author | Juan Linietsky <reduzio@gmail.com> | 2016-01-12 07:07:36 -0300 |
---|---|---|
committer | Juan Linietsky <reduzio@gmail.com> | 2016-01-12 07:07:36 -0300 |
commit | f2ae6f87a448bf65f18eac572732cdf29012d661 (patch) | |
tree | 3eace3a12776ff671a9eb20696d5313e7e67891c | |
parent | a625f7d07317ac4fac21962a99a7896ed13010c7 (diff) |
Fix situation where TSCN format might crash, closes #3062
-rw-r--r-- | scene/resources/packed_scene.h | 5 | ||||
-rw-r--r-- | scene/resources/scene_format_text.cpp | 16 |
2 files changed, 14 insertions, 7 deletions
diff --git a/scene/resources/packed_scene.h b/scene/resources/packed_scene.h index 911ffd2542..415357b61f 100644 --- a/scene/resources/packed_scene.h +++ b/scene/resources/packed_scene.h @@ -50,7 +50,6 @@ class SceneState : public Reference { FLAG_INSTANCE_IS_PLACEHOLDER=(1<<30), FLAG_MASK=(1<<24)-1, NO_PARENT_SAVED=0x7FFFFFFF, - TYPE_INSTANCED=0x7FFFFFFF, }; @@ -106,6 +105,10 @@ class SceneState : public Reference { static bool disable_placeholders; public: + enum { + TYPE_INSTANCED=0x7FFFFFFF + }; + static void set_disable_placeholders(bool p_disable); int find_node_by_path(const NodePath& p_node) const; diff --git a/scene/resources/scene_format_text.cpp b/scene/resources/scene_format_text.cpp index ca85ca957a..2552f682fa 100644 --- a/scene/resources/scene_format_text.cpp +++ b/scene/resources/scene_format_text.cpp @@ -362,18 +362,15 @@ Error ResourceInteractiveLoaderText::poll() { parent=packed_scene->get_state()->add_node_path(next_tag.fields["parent"]); } - if (next_tag.fields.has("owner")) { - owner=packed_scene->get_state()->add_node_path(next_tag.fields["owner"]); - } else { - if (parent!=-1) - owner=0; //if no owner, owner is root - } if (next_tag.fields.has("type")) { type=packed_scene->get_state()->add_name(next_tag.fields["type"]); + } else { + type=SceneState::TYPE_INSTANCED; //no type? assume this was instanced } + if (next_tag.fields.has("instance")) { instance=packed_scene->get_state()->add_value(next_tag.fields["instance"]); @@ -384,6 +381,13 @@ Error ResourceInteractiveLoaderText::poll() { } } + if (next_tag.fields.has("owner")) { + owner=packed_scene->get_state()->add_node_path(next_tag.fields["owner"]); + } else { + if (parent!=-1 && !(type==SceneState::TYPE_INSTANCED && instance==-1)) + owner=0; //if no owner, owner is root + } + int node_id = packed_scene->get_state()->add_node(parent,owner,type,name,instance); |