diff options
author | Shauren <shauren.trinity@gmail.com> | 2015-12-08 18:02:10 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2015-12-08 18:02:10 +0100 |
commit | 094f505e404b5a4e4846657031f89ac44626a1f8 (patch) | |
tree | ebc7a1495fcdf94f5ada576411ab77a80e973cc3 /src | |
parent | aa3020c26d54fa63fde16c5a765b1d72649c7e30 (diff) |
Core/Items: Fixed a possible crash with soulbound tradable items
Closes #15700
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 27 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 2 |
2 files changed, 9 insertions, 20 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 13ea11cdc1e..7f1306665e0 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -12586,36 +12586,25 @@ void Player::TradeCancel(bool sendback) void Player::UpdateSoulboundTradeItems() { - if (m_itemSoulboundTradeable.empty()) - return; - // also checks for garbage data - for (ItemDurationList::iterator itr = m_itemSoulboundTradeable.begin(); itr != m_itemSoulboundTradeable.end();) + for (GuidUnorderedSet::iterator itr = m_itemSoulboundTradeable.begin(); itr != m_itemSoulboundTradeable.end();) { - ASSERT(*itr); - if ((*itr)->GetOwnerGUID() != GetGUID()) - { - m_itemSoulboundTradeable.erase(itr++); - continue; - } - if ((*itr)->CheckSoulboundTradeExpire()) - { - m_itemSoulboundTradeable.erase(itr++); - continue; - } - ++itr; + Item* item = GetItemByGuid(*itr); + if (!item || item->GetOwnerGUID() != GetGUID() || item->CheckSoulboundTradeExpire()) + itr = m_itemSoulboundTradeable.erase(itr); + else + ++itr; } } void Player::AddTradeableItem(Item* item) { - m_itemSoulboundTradeable.push_back(item); + m_itemSoulboundTradeable.insert(item->GetGUID()); } -/// @todo should never allow an item to be added to m_itemSoulboundTradeable twice void Player::RemoveTradeableItem(Item* item) { - m_itemSoulboundTradeable.remove(item); + m_itemSoulboundTradeable.erase(item->GetGUID()); } void Player::UpdateItemDuration(uint32 time, bool realtimeonly) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 93a8db6a523..d28d870a777 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2673,7 +2673,7 @@ class Player : public Unit, public GridObject<Player> EnchantDurationList m_enchantDuration; ItemDurationList m_itemDuration; - ItemDurationList m_itemSoulboundTradeable; + GuidUnorderedSet m_itemSoulboundTradeable; void ResetTimeSync(); void SendTimeSync(); |