fix(vendors): Fixes DisplayCache deserialization (#471)

- [X] Fixes a dangerous mobile/item deletion in display caches during deserialization. This is left over from RunUO.

Notes: I broke up the deletion here because I didn't want to have to clear the mobiles list and trim excess. It is easier to just build a list of objects to delete and give the display cache a new list.

Closes #470
This commit is contained in:
Kamron Batman 2021-02-06 19:49:19 -08:00 committed by GitHub
parent 52df92c452
commit 8d8a1b63bd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -282,22 +282,14 @@ namespace Server.Mobiles
var version = reader.ReadInt();
m_Mobiles = reader.ReadEntityList<Mobile>();
List<IEntity> entities = new (Items);
entities.AddRange(reader.ReadEntityList<Mobile>());
for (var i = 0; i < m_Mobiles.Count; ++i)
{
m_Mobiles[i].Delete();
}
m_Mobiles = new List<Mobile>(); // This cannot be null in case it is referenced before disposing
m_Mobiles.Clear();
Timer.DelayCall(DeleteEntities, entities);
for (var i = Items.Count - 1; i >= 0; --i)
{
if (i < Items.Count)
{
Items[i].Delete();
}
}
m_Table = new Dictionary<Type, IEntity>();
if (m_Cache == null)
{
@ -307,8 +299,14 @@ namespace Server.Mobiles
{
Delete();
}
}
m_Table = new Dictionary<Type, IEntity>();
private void DeleteEntities(List<IEntity> entities)
{
foreach (var entity in entities)
{
entity.Delete();
}
}
}
}