From 30615e842d3e35cb11ccddfb0989439292450440 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Wed, 17 Mar 2021 17:14:57 +0100 Subject: [PATCH] Fix crash on Actor deserialization if parentId is missing but actor already has a parent --- Source/Engine/Level/Actor.cpp | 44 ++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/Source/Engine/Level/Actor.cpp b/Source/Engine/Level/Actor.cpp index 3753f6140..56aa20fa0 100644 --- a/Source/Engine/Level/Actor.cpp +++ b/Source/Engine/Level/Actor.cpp @@ -945,28 +945,34 @@ void Actor::Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) DESERIALIZE_MEMBER(Name, _name); DESERIALIZE_MEMBER(Transform, _localTransform); - Guid parentId = Guid::Empty; - DESERIALIZE_MEMBER(ParentID, parentId); - const auto parent = Scripting::FindObject(parentId); - if (_parent != parent) { - if (IsDuringPlay()) + const auto member = SERIALIZE_FIND_MEMBER(stream, "ParentID"); + if (member != stream.MemberEnd()) { - SetParent(parent, false, false); + Guid parentId; + Serialization::Deserialize(member->value, parentId, modifier); + const auto parent = Scripting::FindObject(parentId); + if (_parent != parent) + { + if (IsDuringPlay()) + { + SetParent(parent, false, false); + } + else + { + if (_parent) + _parent->Children.RemoveKeepOrder(this); + _parent = parent; + if (_parent) + _parent->Children.Add(this); + OnParentChanged(); + } + } + else if (!parent && parentId.IsValid()) + { + LOG(Warning, "Missing parent actor {0} for \'{1}\'", parentId, ToString()); + } } - else - { - if (_parent) - _parent->Children.RemoveKeepOrder(this); - _parent = parent; - if (_parent) - _parent->Children.Add(this); - OnParentChanged(); - } - } - else if (!parent && parentId.IsValid()) - { - LOG(Warning, "Missing parent actor {0} for \'{1}\'", parentId, ToString()); } // StaticFlags update - added StaticFlags::Navigation