Fix crash on Actor deserialization if parentId is missing but actor already has a parent

This commit is contained in:
Wojtek Figat
2021-03-17 17:14:57 +01:00
parent c4d457d7b7
commit 30615e842d

View File

@@ -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<Actor>(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<Actor>(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