From a7cb12f597001156750ad7391517c04d27841f63 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Wed, 14 Jul 2021 11:39:32 +0200 Subject: [PATCH] Fix Script deserialization if `ParentID` is not specified in stream --- Source/Engine/Scripting/Script.cpp | 39 ++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/Source/Engine/Scripting/Script.cpp b/Source/Engine/Scripting/Script.cpp index 1860626d5..6c5b4e43f 100644 --- a/Source/Engine/Scripting/Script.cpp +++ b/Source/Engine/Scripting/Script.cpp @@ -324,19 +324,32 @@ void Script::Deserialize(DeserializeStream& stream, ISerializeModifier* modifier DESERIALIZE_BIT_MEMBER(Enabled, _enabled); DESERIALIZE_MEMBER(PrefabID, _prefabID); - Guid parentId = Guid::Empty; - DESERIALIZE_MEMBER(ParentID, parentId); - const auto parent = Scripting::FindObject(parentId); - if (_parent != parent) { - if (_parent) - _parent->Scripts.RemoveKeepOrder(this); - _parent = parent; - if (_parent) - _parent->Scripts.Add(this); - } - else if (!parent && parentId.IsValid()) - { - LOG(Warning, "Missing parent actor {0} for \'{1}\'", parentId, ToString()); + const auto member = SERIALIZE_FIND_MEMBER(stream, "ParentID"); + if (member != stream.MemberEnd()) + { + Guid parentId; + Serialization::Deserialize(member->value, parentId, modifier); + const auto parent = Scripting::FindObject(parentId); + if (_parent != parent) + { + if (IsDuringPlay()) + { + SetParent(parent, false); + } + else + { + if (_parent) + _parent->Scripts.RemoveKeepOrder(this); + _parent = parent; + if (_parent) + _parent->Scripts.Add(this); + } + } + else if (!parent && parentId.IsValid()) + { + LOG(Warning, "Missing parent actor {0} for \'{1}\'", parentId, ToString()); + } + } } }