53 uint8 foundDuplicates = 0;
54 for (std::vector<LootItem>::const_iterator itr =
_loot.items.begin(); itr !=
_loot.items.end(); ++itr)
55 if (itr->itemid == item->
itemid)
56 if (++foundDuplicates ==
_loot.maxDuplicates)
111 i->second->Verify(*
this, i->first);
118 LootTemplateMap::const_iterator tab;
133 Field* fields = result->Fetch();
137 float chanceOrQuestChance = fields[2].
GetFloat();
143 if (maxcount > std::numeric_limits<uint8>::max())
145 SF_LOG_ERROR(
"sql.sql",
"Table '%s' entry %d item %d: maxcount value (%u) to large. must be less %u - skipped",
GetName(), entry, item, maxcount, std::numeric_limits<uint8>::max());
151 SF_LOG_ERROR(
"sql.sql",
"Table '%s' entry %d item %d: group (%u) must be less %u - skipped",
GetName(), entry, item, group, 1 << 7);
157 if (!storeitem->
IsValid(*
this, entry))
179 tab->second->AddEntry(storeitem);
181 }
while (result->NextRow());
213 itr->second->CopyConditions(empty);
242 lootIdSet.insert(tab->first);
256 for (LootIdSet::const_iterator itr = lootIdSet.begin(); itr != lootIdSet.end(); ++itr)
300 SF_LOG_ERROR(
"sql.sql",
"Table '%s' entry %d item %d: item entry not listed in `item_template` - skipped", store.
GetName(), entry,
itemid);
306 SF_LOG_ERROR(
"sql.sql",
"Table '%s' entry %d item %d: equal-chanced grouped entry, but group not defined - skipped", store.
GetName(), entry,
itemid);
312 SF_LOG_ERROR(
"sql.sql",
"Table '%s' entry %d item %d: low chance (%f) - skipped",
326 SF_LOG_ERROR(
"sql.sql",
"Table '%s' entry %d item %d: quest chance will be treated as non-quest chance", store.
GetName(), entry,
itemid);
329 SF_LOG_ERROR(
"sql.sql",
"Table '%s' entry %d item %d: zero chance is specified for a reference, skipped", store.
GetName(), entry,
itemid);
402 for (
uint32 i = 0; i < stacks && lootItems.size() < limit; ++i)
406 lootItems.push_back(generatedLoot);
429 SF_LOG_ERROR(
"sql.sql",
"Table '%s' loot id #%u used but it doesn't have records.", store.
GetName(), lootId);
440 if (!personal && group)
445 if (
Player* player = itr->GetSource())
452 items[i].is_underthreshold =
true;
479 if (!presentAtLooting)
486 for (
uint32 i = 0; i < max_slot; ++i)
488 if (i <
items.size())
495 if (proto->IsCurrencyToken())
574 if (presentAtLooting)
603 std::set<uint64>::iterator i_next;
611 player->SendNotifyLootItemRemoved(lootIndex, notifyGuid);
621 std::set<uint64>::iterator i_next;
629 player->SendNotifyLootMoneyRemoved(notifyGuid);
643 std::set<uint64>::iterator i_next;
650 QuestItemMap::const_iterator pq =
PlayerQuestItems.find(player->GetGUIDLow());
657 for (j = 0; j < pql.size(); ++j)
658 if (pql[j].index == questIndex)
664 player->SendNotifyLootItemRemoved(
items.size() + j, notifyGuid);
677 if (maxAmount <= minAmount)
679 else if ((maxAmount - minAmount) < 32700)
695 for (LootItemList::iterator _itr =
items.begin(); _itr !=
items.end(); ++_itr)
697 if (_itr->itemid != itemID)
700 _itr->canSave =
true;
716 bool is_looted =
true;
717 if (lootSlot >=
items.size())
723 QuestItem* qitem2 = &itr->second->at(questSlot);
732 item = &
items[lootSlot];
739 for (QuestItemList::const_iterator iter = itr->second->begin(); iter != itr->second->end(); ++iter)
740 if (iter->index == lootSlot)
755 for (QuestItemList::const_iterator iter = itr->second->begin(); iter != itr->second->end(); ++iter)
757 if (iter->index == lootSlot)
761 *conditem = conditem2;
786 QuestItemMap::const_iterator q_itr = lootPlayerQuestItems.find(player->
GetGUIDLow());
787 if (q_itr != lootPlayerQuestItems.end())
790 for (QuestItemList::const_iterator qi = q_list->begin(); qi != q_list->end(); ++qi)
799 QuestItemMap::const_iterator ffa_itr = lootPlayerFFAItems.find(player->
GetGUIDLow());
800 if (ffa_itr != lootPlayerFFAItems.end())
803 for (QuestItemList::const_iterator fi = ffa_list->begin(); fi != ffa_list->end(); ++fi)
812 QuestItemMap::const_iterator nn_itr = lootPlayerNonQuestNonFFAConditionalItems.find(player->
GetGUIDLow());
813 if (nn_itr != lootPlayerNonQuestNonFFAConditionalItems.end())
816 for (QuestItemList::const_iterator ci = conditional_list->begin(); ci != conditional_list->end(); ++ci)
832 if (!
items[i].is_looted && !
items[i].is_underthreshold && !
items[i].freeforall)
841 bool hasSlotType = bool(SlotType);
857 bool hasSlotType = bool(SlotType);
859 *buff <<
uint8(SlotType);
862 *buff <<
uint8(slot);
901 *data <<
uint8(lootType);
916 uint8 itemsShown = 0;
917 uint8 currenciesShown = 0;
925 size_t currencyCountPos = data->
bitwpos();
941 size_t itemCountPos = data->
bitwpos();
946 bool hasPermission =
true;
954 for (
uint8 i = 0; i <
loot.items.size(); ++i)
956 if (!
loot.items[i].is_looted && !
loot.items[i].freeforall &&
loot.items[i].conditions.empty() &&
loot.items[i].AllowedForPlayer(
viewer))
960 if (
loot.items[i].is_blocked)
962 else if (
loot.roundRobinPlayer == 0 || !
loot.items[i].is_underthreshold ||
viewer->GetGUID() ==
loot.roundRobinPlayer)
973 loot.items[i].WriteBasicDataPart(slotType, i, &itemBuff);
981 for (
uint8 i = 0; i <
loot.items.size(); ++i)
983 if (!
loot.items[i].is_looted && !
loot.items[i].freeforall &&
loot.items[i].conditions.empty() &&
loot.items[i].AllowedForPlayer(
viewer))
985 if (
loot.roundRobinPlayer != 0 &&
viewer->GetGUID() !=
loot.roundRobinPlayer)
1013 for (
uint8 i = 0; i <
loot.items.size(); ++i)
1015 if (!
loot.items[i].is_looted && !
loot.items[i].freeforall &&
loot.items[i].conditions.empty() &&
loot.items[i].AllowedForPlayer(
viewer))
1018 loot.items[i].WriteBasicDataPart(slotType, i, &itemBuff);
1025 hasPermission =
false;
1033 QuestItemMap::const_iterator q_itr = lootPlayerQuestItems.find(
viewer->GetGUIDLow());
1034 if (q_itr != lootPlayerQuestItems.end())
1037 for (QuestItemList::const_iterator qi = q_list->begin(); qi != q_list->end(); ++qi)
1043 uint8 index =
loot.items.size() + (qi - q_list->begin());
1072 QuestItemMap::const_iterator ffa_itr = lootPlayerFFAItems.find(
viewer->GetGUIDLow());
1073 if (ffa_itr != lootPlayerFFAItems.end())
1076 for (QuestItemList::const_iterator fi = ffa_list->begin(); fi != ffa_list->end(); ++fi)
1088 QuestItemMap const& lootPlayerNonQuestNonFFAConditionalItems =
loot.GetPlayerNonQuestNonFFAConditionalItems();
1089 QuestItemMap::const_iterator nn_itr = lootPlayerNonQuestNonFFAConditionalItems.find(
viewer->GetGUIDLow());
1090 if (nn_itr != lootPlayerNonQuestNonFFAConditionalItems.end())
1093 for (QuestItemList::const_iterator ci = conditional_list->begin(); ci != conditional_list->end(); ++ci)
1141 data->
PutBits(itemCountPos, itemsShown, 19);
1142 data->
PutBits(currencyCountPos, currenciesShown, 20);
1155 *data <<
uint8(lootType);
1159 data->
append(currencyBuff);
1206 if (!possibleLoot.empty())
1210 for (LootStoreItemList::const_iterator itr = possibleLoot.begin(); itr != possibleLoot.end(); ++itr)
1213 if (item->
chance >= 100.0f)
1224 if (!possibleLoot.empty())
1234 if ((*i)->needs_quest)
1238 if ((*i)->needs_quest)
1261 (*i)->conditions.clear();
1264 (*i)->conditions.clear();
1280 if (!(*i)->needs_quest)
1281 result += (*i)->chance;
1300 if (chance > 101.0f)
1301 SF_LOG_ERROR(
"sql.sql",
"Table '%s' entry %u group %d has total chance > 100%% (%f)", lootstore.
GetName(),
id, group_id, chance);
1304 SF_LOG_ERROR(
"sql.sql",
"Table '%s' entry %u group %d has items with chance=0%% but group total chance >= 100%% (%f)", lootstore.
GetName(),
id, group_id, chance);
1340 for (LootStoreItemList::iterator i =
Entries.begin(); i !=
Entries.end(); ++i)
1343 for (
size_t i = 0; i <
Groups.size(); ++i)
1365 for (LootStoreItemList::iterator i =
Entries.begin(); i !=
Entries.end(); ++i)
1366 (*i)->conditions.clear();
1368 for (LootGroups::iterator i =
Groups.begin(); i !=
Groups.end(); ++i)
1370 group->CopyConditions(conditions);
1376 for (LootStoreItemList::const_iterator _iter =
Entries.begin(); _iter !=
Entries.end(); ++_iter)
1392 if (groupId >
Groups.size())
1395 if (!
Groups[groupId - 1])
1398 Groups[groupId - 1]->Process(loot, lootMode);
1403 for (LootStoreItemList::const_iterator i =
Entries.begin(); i !=
Entries.end(); ++i)
1409 if (!item->
Roll(rate))
1419 for (
uint32 loop = 0; loop < maxcount; ++loop)
1420 Referenced->
Process(loot, rate, lootMode, item->
group);
1427 for (LootGroups::const_iterator i =
Groups.begin(); i !=
Groups.end(); ++i)
1429 group->Process(loot, lootMode);
1437 if (groupId >
Groups.size())
1440 if (!
Groups[groupId - 1])
1443 return Groups[groupId - 1]->HasQuestDrop();
1446 for (LootStoreItemList::const_iterator i =
Entries.begin(); i !=
Entries.end(); ++i)
1451 LootTemplateMap::const_iterator Referenced = store.find(-item->
mincountOrRef);
1452 if (Referenced == store.end())
1454 if (Referenced->second->HasQuestDrop(store, item->
group))
1462 for (LootGroups::const_iterator i =
Groups.begin(); i !=
Groups.end(); ++i)
1464 if (group->HasQuestDrop())
1475 if (groupId >
Groups.size())
1478 if (!
Groups[groupId - 1])
1481 return Groups[groupId - 1]->HasQuestDropForPlayer(player);
1485 for (LootStoreItemList::const_iterator i =
Entries.begin(); i !=
Entries.end(); ++i)
1490 LootTemplateMap::const_iterator Referenced = store.find(-item->
mincountOrRef);
1491 if (Referenced == store.end())
1493 if (Referenced->second->HasQuestDropForPlayer(store, player, item->
group))
1501 for (LootGroups::const_iterator i =
Groups.begin(); i !=
Groups.end(); ++i)
1503 if (group->HasQuestDropForPlayer(player))
1515 Groups[i]->Verify(lootstore,
id, i + 1);
1522 for (LootStoreItemList::const_iterator ieItr =
Entries.begin(); ieItr !=
Entries.end(); ++ieItr)
1534 for (LootGroups::const_iterator grItr =
Groups.begin(); grItr !=
Groups.end(); ++grItr)
1536 group->CheckLootRefs(store, ref_set);
1543 SF_LOG_ERROR(
"loot",
"LootTemplate::addConditionItem: condition is null");
1549 for (LootStoreItemList::iterator i =
Entries.begin(); i !=
Entries.end(); ++i)
1553 (*i)->conditions.push_back(cond);
1561 for (LootGroups::iterator groupItr =
Groups.begin(); groupItr !=
Groups.end(); ++groupItr)
1568 if (!itemList->empty())
1570 for (LootStoreItemList::iterator i = itemList->begin(); i != itemList->end(); ++i)
1574 (*i)->conditions.push_back(cond);
1581 if (!itemList->empty())
1583 for (LootStoreItemList::iterator i = itemList->begin(); i != itemList->end(); ++i)
1587 (*i)->conditions.push_back(cond);
1599 for (LootStoreItemList::const_iterator ieItr =
Entries.begin(); ieItr !=
Entries.end(); ++ieItr)
1600 if ((*ieItr)->itemid ==
id && (*ieItr)->mincountOrRef < 0)
1608 SF_LOG_INFO(
"server.loading",
"Loading creature loot templates...");
1617 for (CreatureTemplateContainer::const_iterator itr = ctc->begin(); itr != ctc->end(); ++itr)
1619 if (
uint32 lootid = itr->second.lootid)
1621 if (lootIdSet.find(lootid) == lootIdSet.end())
1624 lootIdSetUsed.insert(lootid);
1628 for (LootIdSet::const_iterator itr = lootIdSetUsed.begin(); itr != lootIdSetUsed.end(); ++itr)
1629 lootIdSet.erase(*itr);
1637 SF_LOG_ERROR(
"server.loading",
">> Loaded 0 creature loot templates. DB table `creature_loot_template` is empty");
1642 SF_LOG_INFO(
"server.loading",
"Loading disenchanting loot templates...");
1656 if (lootIdSet.find(lootid) == lootIdSet.end())
1659 lootIdSetUsed.insert(lootid);
1662 for (LootIdSet::const_iterator itr = lootIdSetUsed.begin(); itr != lootIdSetUsed.end(); ++itr)
1663 lootIdSet.erase(*itr);
1671 SF_LOG_ERROR(
"server.loading",
">> Loaded 0 disenchanting loot templates. DB table `disenchant_loot_template` is empty");
1676 SF_LOG_INFO(
"server.loading",
"Loading fishing loot templates...");
1686 if (lootIdSet.find(areaEntry->m_ID) != lootIdSet.end())
1687 lootIdSet.erase(areaEntry->m_ID);
1695 SF_LOG_ERROR(
"server.loading",
">> Loaded 0 fishing loot templates. DB table `fishing_loot_template` is empty");
1700 SF_LOG_INFO(
"server.loading",
"Loading gameobject loot templates...");
1709 for (GameObjectTemplateContainer::const_iterator itr = gotc->begin(); itr != gotc->end(); ++itr)
1711 if (
uint32 lootid = itr->second.GetLootId())
1713 if (lootIdSet.find(lootid) == lootIdSet.end())
1716 lootIdSetUsed.insert(lootid);
1720 for (LootIdSet::const_iterator itr = lootIdSetUsed.begin(); itr != lootIdSetUsed.end(); ++itr)
1721 lootIdSet.erase(*itr);
1729 SF_LOG_ERROR(
"server.loading",
">> Loaded 0 gameobject loot templates. DB table `gameobject_loot_template` is empty");
1734 SF_LOG_INFO(
"server.loading",
"Loading item loot templates...");
1743 for (ItemTemplateContainer::const_iterator itr = its->begin(); itr != its->end(); ++itr)
1745 lootIdSet.erase(itr->second.ItemId);
1753 SF_LOG_ERROR(
"server.loading",
">> Loaded 0 item loot templates. DB table `item_loot_template` is empty");
1758 SF_LOG_INFO(
"server.loading",
"Loading milling loot templates...");
1767 for (ItemTemplateContainer::const_iterator itr = its->begin(); itr != its->end(); ++itr)
1772 if (lootIdSet.find(itr->second.ItemId) != lootIdSet.end())
1773 lootIdSet.erase(itr->second.ItemId);
1782 SF_LOG_ERROR(
"server.loading",
">> Loaded 0 milling loot templates. DB table `milling_loot_template` is empty");
1787 SF_LOG_INFO(
"server.loading",
"Loading pickpocketing loot templates...");
1796 for (CreatureTemplateContainer::const_iterator itr = ctc->begin(); itr != ctc->end(); ++itr)
1798 if (
uint32 lootid = itr->second.pickpocketLootId)
1800 if (lootIdSet.find(lootid) == lootIdSet.end())
1803 lootIdSetUsed.insert(lootid);
1807 for (LootIdSet::const_iterator itr = lootIdSetUsed.begin(); itr != lootIdSetUsed.end(); ++itr)
1808 lootIdSet.erase(*itr);
1816 SF_LOG_ERROR(
"server.loading",
">> Loaded 0 pickpocketing loot templates. DB table `pickpocketing_loot_template` is empty");
1821 SF_LOG_INFO(
"server.loading",
"Loading prospecting loot templates...");
1830 for (ItemTemplateContainer::const_iterator itr = its->begin(); itr != its->end(); ++itr)
1835 if (lootIdSet.find(itr->second.ItemId) != lootIdSet.end())
1836 lootIdSet.erase(itr->second.ItemId);
1845 SF_LOG_ERROR(
"server.loading",
">> Loaded 0 prospecting loot templates. DB table `prospecting_loot_template` is empty");
1850 SF_LOG_INFO(
"server.loading",
"Loading mail loot templates...");
1868 SF_LOG_ERROR(
"server.loading",
">> Loaded 0 mail loot templates. DB table `mail_loot_template` is empty");
1873 SF_LOG_INFO(
"server.loading",
"Loading skinning loot templates...");
1882 for (CreatureTemplateContainer::const_iterator itr = ctc->begin(); itr != ctc->end(); ++itr)
1884 if (
uint32 lootid = itr->second.SkinLootId)
1886 if (lootIdSet.find(lootid) == lootIdSet.end())
1889 lootIdSetUsed.insert(lootid);
1893 for (LootIdSet::const_iterator itr = lootIdSetUsed.begin(); itr != lootIdSetUsed.end(); ++itr)
1894 lootIdSet.erase(*itr);
1902 SF_LOG_ERROR(
"server.loading",
">> Loaded 0 skinning loot templates. DB table `skinning_loot_template` is empty");
1907 SF_LOG_INFO(
"server.loading",
"Loading spell loot templates...");
1915 for (
uint32 spell_id = 1; spell_id <
sSpellMgr->GetSpellInfoStoreSize(); ++spell_id)
1925 if (lootIdSet.find(spell_id) == lootIdSet.end())
1935 lootIdSet.erase(spell_id);
1944 SF_LOG_ERROR(
"server.loading",
">> Loaded 0 spell loot templates. DB table `spell_loot_template` is empty");
1949 SF_LOG_INFO(
"server.loading",
"Loading reference loot templates...");
@ CHAR_DEL_ITEMCONTAINER_MONEY
@ CHAR_DEL_ITEMCONTAINER_ITEM
std::list< Condition * > ConditionList
UNORDERED_MAP< uint32, CreatureTemplate > CreatureTemplateContainer
DBCStorage< AreaTableEntry > sAreaStore(AreaTableEntryfmt)
DBCStorage< MailTemplateEntry > sMailTemplateStore(MailTemplateEntryfmt)
DBCStorage< ItemDisenchantLootEntry > sItemDisenchantLootStore(ItemDisenchantLootfmt)
UNORDERED_MAP< uint32, GameObjectTemplate > GameObjectTemplateContainer
uint32 GenerateEnchSuffixFactor(uint32 item_id)
UNORDERED_MAP< uint32, ItemTemplate > ItemTemplateContainer
@ ITEM_PROTO_FLAG_SMART_LOOT
@ ITEM_PROTO_FLAG_MILLABLE
@ ITEM_PROTO_FLAG_PROSPECTABLE
@ ITEM_PROTO_FLAG_PARTY_LOOT
@ ITEM_PROTO_FLAG_OPENABLE
@ ITEM_FLAGS_EXTRA_ALLIANCE_ONLY
@ ITEM_FLAGS_EXTRA_HORDE_ONLY
@ ITEM_FLAGS_CU_FOLLOW_LOOT_RULES
@ ITEM_FLAGS_CU_IGNORE_QUEST_STATUS
#define SF_LOG_ERROR(filterType__,...)
#define SF_LOG_INFO(filterType__,...)
LootStore LootTemplates_Spell("spell_loot_template", "spell id (random item creating)", false)
LootStore LootTemplates_Skinning("skinning_loot_template", "creature skinning id", true)
LootStore LootTemplates_Gameobject("gameobject_loot_template", "gameobject entry", true)
LootStore LootTemplates_Item("item_loot_template", "item entry", true)
LootStore LootTemplates_Milling("milling_loot_template", "item entry (herb)", true)
LootStore LootTemplates_Reference("reference_loot_template", "reference id", false)
LootStore LootTemplates_Disenchant("disenchant_loot_template", "item disenchant id", true)
LootStore LootTemplates_Prospecting("prospecting_loot_template", "item entry (ore)", true)
static Rates const qualityToRate[MAX_ITEM_QUALITY]
LootStore LootTemplates_Creature("creature_loot_template", "creature entry", true)
LootStore LootTemplates_Pickpocketing("pickpocketing_loot_template", "creature pickpocket lootid", true)
LootStore LootTemplates_Mail("mail_loot_template", "mail template id", false)
LootStore LootTemplates_Fishing("fishing_loot_template", "area id", true)
void LoadLootTemplates_Pickpocketing()
void LoadLootTemplates_Spell()
void LoadLootTemplates_Milling()
void LoadLootTemplates_Gameobject()
#define MAX_NR_QUEST_ITEMS
LootStore LootTemplates_Reference
void LoadLootTemplates_Creature()
std::map< uint32, QuestItemList * > QuestItemMap
void LoadLootTemplates_Fishing()
@ LOOT_SLOT_TYPE_ROLL_ONGOING
@ LOOT_SLOT_TYPE_ALLOW_LOOT
void LoadLootTemplates_Reference()
void LoadLootTemplates_Prospecting()
void LoadLootTemplates_Mail()
void LoadLootTemplates_Disenchant()
#define MAX_NR_LOOT_ITEMS
void LoadLootTemplates_Item()
std::set< uint32 > LootIdSet
UNORDERED_MAP< uint32, LootTemplate * > LootTemplateMap
std::list< LootStoreItem * > LootStoreItemList
void LoadLootTemplates_Skinning()
std::vector< QuestItem > QuestItemList
Skyfire::AutoPtr< ResultSet, Skyfire::Mutex > QueryResult
@ SPELL_ATTR0_NOT_SHAPESHIFT
uint32 GetMSTimeDiffToNow(uint32 oldMSTime)
#define SF_UNARY_FUNCTION
bool roll_chance_f(float chance)
bool WriteBit(uint32 bit)
size_t bitwpos() const
Returns position of last written bit.
void PutBits(size_t pos, T value, uint32 bitCount)
void WriteBits(T value, size_t bits)
void WriteByteSeq(uint8 b)
ItemQualities GetLootThreshold() const
LootMethod GetLootMethod() const
GroupReference * GetFirstMember()
uint64 GetLooterGuid() const
static int32 GenerateItemRandomPropertyId(uint32 item_id)
uint32 LoadAndCollectLootIds(LootIdSet &ids_set)
LootTemplate const * GetLootFor(uint32 loot_id) const
LootTemplateMap m_LootTemplates
char const * GetEntryName() const
bool HaveQuestLootForPlayer(uint32 loot_id, Player *player) const
void CheckLootRefs(LootIdSet *ref_set=NULL) const
bool HaveQuestLootFor(uint32 loot_id) const
LootTemplate * GetLootForConditionFill(uint32 loot_id)
bool IsRatesAllowed() const
char const * GetName() const
void ReportNotExistedId(uint32 id) const
void ReportUnusedIds(LootIdSet const &ids_set) const
LootGroup(LootGroup const &)
void CheckLootRefs(LootTemplateMap const &store, LootIdSet *ref_set) const
LootStoreItemList ExplicitlyChanced
LootStoreItemList * GetEqualChancedItemList()
void CollectLootIds(LootIdSet &set) const
LootStoreItemList EqualChanced
void Verify(LootStore const &lootstore, uint32 id, uint8 group_id) const
void CopyConditions(ConditionList conditions)
LootStoreItemList * GetExplicitlyChancedItemList()
float RawTotalChance() const
void AddEntry(LootStoreItem *item)
bool HasQuestDropForPlayer(Player const *player) const
LootGroup & operator=(LootGroup const &)
void Process(Loot &loot, uint16 lootMode) const
float TotalChance() const
LootStoreItem const * Roll(Loot &loot, uint16 lootMode) const
bool HasQuestDrop() const
void Process(Loot &loot, bool rate, uint16 lootMode, uint8 groupId=0) const
void CopyConditions(const ConditionList &conditions)
void CheckLootRefs(LootTemplateMap const &store, LootIdSet *ref_set) const
bool isReference(uint32 id)
void AddEntry(LootStoreItem *item)
bool HasQuestDropForPlayer(LootTemplateMap const &store, Player const *player, uint8 groupId=0) const
LootStoreItemList Entries
void Verify(LootStore const &store, uint32 Id) const
bool HasQuestDrop(LootTemplateMap const &store, uint8 groupId=0) const
bool addConditionItem(Condition *cond)
static Player * FindPlayer(uint64)
uint32 GetGUIDLow() const
bool HasQuestForItem(uint32 itemId) const
bool HasSkill(uint32 skill) const
void StoreLootItem(uint8 lootSlot, Loot *loot, uint64 lootGuid=0)
QuestStatus GetQuestStatus(uint32 quest_id) const
bool HasSpell(uint32 spell) const override
void setUInt32(const uint8 index, const uint32 value)
bool IsLootCrafting() const
CharacterDatabaseWorkerPool CharacterDatabase
Accessor to the character database.
WorldDatabaseWorkerPool WorldDatabase
Accessor to the world database.
@ RATE_DROP_ITEM_ARTIFACT
@ RATE_DROP_ITEM_REFERENCED
@ RATE_DROP_ITEM_LEGENDARY
@ RATE_DROP_ITEM_REFERENCED_AMOUNT
@ RATE_DROP_ITEM_UNCOMMON
C::value_type const & SelectRandomContainerElement(C const &container)
uint32 GetMaxStackSize() const
_Spell Spells[MAX_ITEM_PROTO_SPELLS]
bool operator()(LootStoreItem *item) const
LootGroupInvalidSelector(Loot const &loot, uint16 lootMode)
QuestItemList * FillQuestLoot(Player *player)
uint32 GetMaxSlotInLootFor(Player *player) const
QuestItemMap PlayerNonQuestNonFFAConditionalItems
std::set< uint64 > PlayersLooting
bool hasItemFor(Player *player) const
bool hasOverThresholdItem() const
bool FillLoot(uint32 lootId, LootStore const &store, Player *lootOwner, bool personal, bool noEmptyError=false, uint16 lootMode=LOOT_MODE_DEFAULT)
void NotifyQuestItemRemoved(uint8 questIndex, ObjectGuid lootGuid=0)
QuestItemMap PlayerQuestItems
void AddItem(LootStoreItem const &item)
void NotifyMoneyRemoved(ObjectGuid lootGuid=0)
void NotifyItemRemoved(uint8 lootIndex, ObjectGuid lootGuid=0)
QuestItemList * FillNonQuestNonFFAConditionalLoot(Player *player, bool presentAtLooting)
void generateMoneyLoot(uint32 minAmount, uint32 maxAmount)
QuestItemMap PlayerFFAItems
LootItem * LootItemInSlot(uint32 lootslot, Player *player, QuestItem **qitem=NULL, QuestItem **ffaitem=NULL, QuestItem **conditem=NULL)
QuestItemMap const & GetPlayerQuestItems() const
void DeleteLootItemFromContainerItemDB(uint32 itemID)
std::vector< LootItem > items
QuestItemMap const & GetPlayerFFAItems() const
QuestItemList * FillFFALoot(Player *player)
QuestItemMap const & GetPlayerNonQuestNonFFAConditionalItems() const
void DeleteLootMoneyFromContainerItemDB()
void FillNotNormalLootFor(Player *player, bool presentAtLooting)
std::vector< LootItem > quest_items
AllowedLooterSet allowedGUIDs
void AddAllowedLooter(Player const *player)
void WriteBitDataPart(PermissionTypes permission, LootSlotType hasSlotType, ByteBuffer *buff)
bool AllowedForPlayer(Player const *player) const
void WriteBasicDataPart(LootSlotType slotType, uint8 slot, ByteBuffer *buff)
bool Roll(bool rate) const
bool IsValid(LootStore const &store, uint32 entry) const
void WriteData(ObjectGuid guid, LootType lootType, WorldPacket *data, bool isAoE=false)
PermissionTypes permission