From 8d8a1b63bd45fb8ff50b26ac56ec6015b919c68e Mon Sep 17 00:00:00 2001 From: Kamron Batman <3953314+kamronbatman@users.noreply.github.com> Date: Sat, 6 Feb 2021 19:49:19 -0800 Subject: [PATCH] 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 --- .../UOContent/Mobiles/Vendors/GenericBuy.cs | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/Projects/UOContent/Mobiles/Vendors/GenericBuy.cs b/Projects/UOContent/Mobiles/Vendors/GenericBuy.cs index 5b5d628b2..6e698eebb 100644 --- a/Projects/UOContent/Mobiles/Vendors/GenericBuy.cs +++ b/Projects/UOContent/Mobiles/Vendors/GenericBuy.cs @@ -282,22 +282,14 @@ namespace Server.Mobiles var version = reader.ReadInt(); - m_Mobiles = reader.ReadEntityList(); + List entities = new (Items); + entities.AddRange(reader.ReadEntityList()); - for (var i = 0; i < m_Mobiles.Count; ++i) - { - m_Mobiles[i].Delete(); - } + m_Mobiles = new List(); // 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(); if (m_Cache == null) { @@ -307,8 +299,14 @@ namespace Server.Mobiles { Delete(); } + } - m_Table = new Dictionary(); + private void DeleteEntities(List entities) + { + foreach (var entity in entities) + { + entity.Delete(); + } } } }