aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormaximius <none@none>2009-11-04 19:14:10 -0800
committermaximius <none@none>2009-11-04 19:14:10 -0800
commitc15a8e201bab900e29cbc260e17451808e3dc897 (patch)
tree56da6033b88d866dd7c0da2325f2428dbd402e53 /src
parent6aba32bd2bf506cb61d775c52895d389a0997385 (diff)
*Never add the same loot item twice.
--HG-- branch : trunk
Diffstat (limited to 'src')
-rw-r--r--src/game/LootMgr.cpp24
-rw-r--r--src/game/LootMgr.h3
2 files changed, 16 insertions, 11 deletions
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<QuestItem> QuestItemList;
+typedef std::vector<LootItem> LootItemList;
typedef std::map<uint32, QuestItemList *> QuestItemMap;
typedef std::vector<LootStoreItem> LootStoreItemList;
typedef UNORDERED_MAP<uint32, LootTemplate*> 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;