From 3c08ab438e2e82e466073a6e8d8ded2899a4e4f9 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Tue, 16 Mar 2021 15:44:01 -0400 Subject: [PATCH] Core/Spells: Fixes a crash when removing or aura expires on a temp weapon enchant. --- Source/Game/Entities/Player/Player.Spells.cs | 31 ++++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/Source/Game/Entities/Player/Player.Spells.cs b/Source/Game/Entities/Player/Player.Spells.cs index 0a1f4296e..74c0a4167 100644 --- a/Source/Game/Entities/Player/Player.Spells.cs +++ b/Source/Game/Entities/Player/Player.Spells.cs @@ -488,21 +488,22 @@ namespace Game.Entities void UpdateEnchantTime(uint time) { - foreach (var enchat in m_enchantDuration) + for (var i = 0; i < m_enchantDuration.Count; ++i) { - if (enchat.item.GetEnchantmentId(enchat.slot) == 0) + var enchantDuration = m_enchantDuration[i]; + if (enchantDuration.item.GetEnchantmentId(enchantDuration.slot) == 0) { - m_enchantDuration.Remove(enchat); + m_enchantDuration.Remove(enchantDuration); } - else if (enchat.leftduration <= time) + else if (enchantDuration.leftduration <= time) { - ApplyEnchantment(enchat.item, enchat.slot, false, false); - enchat.item.ClearEnchantment(enchat.slot); - m_enchantDuration.Remove(enchat); + ApplyEnchantment(enchantDuration.item, enchantDuration.slot, false, false); + enchantDuration.item.ClearEnchantment(enchantDuration.slot); + m_enchantDuration.Remove(enchantDuration); } - else if (enchat.leftduration > time) + else if (enchantDuration.leftduration > time) { - enchat.leftduration -= time; + enchantDuration.leftduration -= time; } } } @@ -889,8 +890,9 @@ namespace Game.Entities if (slot >= EnchantmentSlot.Max) return; - foreach (var enchantDuration in m_enchantDuration) + for (var i = 0; i < m_enchantDuration.Count; ++i) { + var enchantDuration = m_enchantDuration[i]; if (enchantDuration.item == item && enchantDuration.slot == slot) { enchantDuration.item.SetEnchantmentDuration(enchantDuration.slot, enchantDuration.leftduration, this); @@ -906,8 +908,9 @@ namespace Game.Entities } void RemoveEnchantmentDurations(Item item) { - foreach (var enchantDuration in m_enchantDuration) + for (var i = 0; i < m_enchantDuration.Count; ++i) { + var enchantDuration = m_enchantDuration[i]; if (enchantDuration.item == item) { // save duration in item @@ -919,8 +922,9 @@ namespace Game.Entities void RemoveEnchantmentDurationsReferences(Item item) { - foreach (var enchantDuration in m_enchantDuration) + for (var i = 0; i < m_enchantDuration.Count; ++i) { + var enchantDuration = m_enchantDuration[i]; if (enchantDuration.item == item) m_enchantDuration.Remove(enchantDuration); } @@ -929,8 +933,9 @@ namespace Game.Entities public void RemoveArenaEnchantments(EnchantmentSlot slot) { // remove enchantments from equipped items first to clean up the m_enchantDuration list - foreach (var enchantDuration in m_enchantDuration) + for (var i = 0; i < m_enchantDuration.Count; ++i) { + var enchantDuration = m_enchantDuration[i]; if (enchantDuration.slot == slot) { if (enchantDuration.item && enchantDuration.item.GetEnchantmentId(slot) != 0)