From c15a8e201bab900e29cbc260e17451808e3dc897 Mon Sep 17 00:00:00 2001 From: maximius Date: Wed, 4 Nov 2009 19:14:10 -0800 Subject: *Never add the same loot item twice. --HG-- branch : trunk --- src/game/LootMgr.cpp | 24 ++++++++++++++---------- src/game/LootMgr.h | 3 ++- 2 files changed, 16 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/game/LootMgr.cpp b/src/game/LootMgr.cpp index e1b6b0c5a21..9a035896cf3 100644 --- a/src/game/LootMgr.cpp +++ b/src/game/LootMgr.cpp @@ -381,7 +381,7 @@ void Loot::AddItem(LootStoreItem const & item) if( !item.conditionId ) { ItemPrototype const* proto = objmgr.GetItemPrototype(item.itemid); - if( !proto || (proto->Flags & ITEM_FLAGS_PARTY_LOOT)==0 ) + if (!proto || (proto->Flags & ITEM_FLAGS_PARTY_LOOT) == 0) ++unlootedCount; } } @@ -508,7 +508,7 @@ QuestItemList* Loot::FillNonQuestNonFFAConditionalLoot(Player* player) if(!item.is_counted) { ++unlootedCount; - item.is_counted=true; + item.is_counted = true; } } } @@ -957,26 +957,30 @@ void LootTemplate::Process(Loot& loot, LootStore const& store, bool rate, uint16 } // Rolling non-grouped items - for (LootStoreItemList::const_iterator i = Entries.begin() ; i != Entries.end() ; ++i ) + for (LootStoreItemList::const_iterator i = Entries.begin(); i != Entries.end(); ++i) { - if (i->lootmode &~ lootMode) // Do not add if mode mismatch + if (i->lootmode &~ lootMode) // Do not add if mode mismatch continue; if (!i->Roll(rate)) - continue; // Bad luck for the entry + continue; // Bad luck for the entry - if (i->mincountOrRef < 0) // References processing + for (LootItemList::const_iterator _item = loot.items.begin(); _item != loot.items.end(); ++_item) + if (_item->itemid == i->itemid) + continue; // Never add the same item twice + + if (i->mincountOrRef < 0) // References processing { LootTemplate const* Referenced = LootTemplates_Reference.GetLootFor(-i->mincountOrRef); if(!Referenced) - continue; // Error message already printed at loading stage + continue; // Error message already printed at loading stage - for (uint32 loop=0; loop < i->maxcount; ++loop) // Ref multiplicator + for (uint32 loop = 0; loop < i->maxcount; ++loop) // Ref multiplicator Referenced->Process(loot, store, rate, lootMode, i->group); } - else // Plain entries (not a reference, not grouped) - loot.AddItem(*i); // Chance is already checked, just add + else // Plain entries (not a reference, not grouped) + loot.AddItem(*i); // Chance is already checked, just add } // Now processing groups diff --git a/src/game/LootMgr.h b/src/game/LootMgr.h index 5758242368e..2bb2b15f99b 100644 --- a/src/game/LootMgr.h +++ b/src/game/LootMgr.h @@ -137,6 +137,7 @@ struct Loot; class LootTemplate; typedef std::vector QuestItemList; +typedef std::vector LootItemList; typedef std::map QuestItemMap; typedef std::vector LootStoreItemList; typedef UNORDERED_MAP LootTemplateMap; @@ -153,7 +154,7 @@ class LootStore void Verify() const; void LoadAndCollectLootIds(LootIdSet& ids_set); - void CheckLootRefs(LootIdSet* ref_set = NULL) const;// check existence reference and remove it from ref_set + void CheckLootRefs(LootIdSet* ref_set = NULL) const; // check existence reference and remove it from ref_set void ReportUnusedIds(LootIdSet const& ids_set) const; void ReportNotExistedId(uint32 id) const; -- cgit v1.2.3