diff options
-rw-r--r-- | src/server/game/Handlers/SpellHandler.cpp | 1 | ||||
-rw-r--r-- | src/server/game/Loot/LootItemStorage.cpp | 21 |
2 files changed, 21 insertions, 1 deletions
diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index 1204a90755a..aaf74f89acc 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -141,6 +141,7 @@ void WorldSession::HandleOpenItemOpcode(WorldPackets::Spells::OpenItem& packet) { Loot* loot = new Loot(player->GetMap(), item->GetGUID(), LOOT_ITEM, nullptr); item->m_loot.reset(loot); + item->m_lootGenerated = true; loot->generateMoneyLoot(item->GetTemplate()->MinMoneyLoot, item->GetTemplate()->MaxMoneyLoot); loot->FillLoot(item->GetEntry(), LootTemplates_Item, player, true, loot->gold != 0); diff --git a/src/server/game/Loot/LootItemStorage.cpp b/src/server/game/Loot/LootItemStorage.cpp index 152afcc2e76..9dc8cae1de6 100644 --- a/src/server/game/Loot/LootItemStorage.cpp +++ b/src/server/game/Loot/LootItemStorage.cpp @@ -169,6 +169,25 @@ bool LootItemStorage::LoadStoredLoot(Item* item, Player* player) } } + if (!loot->items.empty()) + { + std::sort(loot->items.begin(), loot->items.end(), [](LootItem const& left, LootItem const& right) { return left.LootListId < right.LootListId; }); + + uint32 lootListId = 0; + // add dummy loot items to ensure items are indexable by their LootListId + while (loot->items.size() <= loot->items.back().LootListId) + { + if (loot->items[lootListId].LootListId != lootListId) + { + auto li = loot->items.emplace(loot->items.begin() + lootListId); + li->LootListId = lootListId; + li->is_looted = true; + } + + ++lootListId; + } + } + // Mark the item if it has loot so it won't be generated again on open item->m_loot.reset(loot); item->m_lootGenerated = true; @@ -332,7 +351,7 @@ void StoredLootContainer::RemoveItem(uint32 itemId, uint32 count, uint32 itemInd auto bounds = _lootItems.equal_range(itemId); for (auto itr = bounds.first; itr != bounds.second; ++itr) { - if (itr->second.Count == count) + if (itr->second.ItemIndex == itemIndex) { _lootItems.erase(itr); break; |