aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Handlers/SpellHandler.cpp1
-rw-r--r--src/server/game/Loot/LootItemStorage.cpp21
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 5953cd8a53d..18280317f85 100644
--- a/src/server/game/Loot/LootItemStorage.cpp
+++ b/src/server/game/Loot/LootItemStorage.cpp
@@ -166,6 +166,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;
@@ -326,7 +345,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;