102 if (player->
HasSpell(itemEffect.SpellID))
115 if (player->
HasSpell(itemEffect.SpellID))
185 for (
uint32 i = 0; i < stacks && lootItems.size() < limit; ++i)
189 generatedLoot.
itemIndex = lootItems.size();
190 lootItems.push_back(generatedLoot);
194 bool canSeeItemInLootWindow =
false;
197 if (
Group* group = player->GetGroup())
199 for (
GroupReference* itr = group->GetFirstMember(); itr !=
nullptr; itr = itr->next())
200 if (
Player* member = itr->GetSource())
202 canSeeItemInLootWindow =
true;
205 canSeeItemInLootWindow =
true;
208 if (!canSeeItemInLootWindow)
233 TC_LOG_ERROR(
"sql.sql",
"Table '{}' loot id #{} used but it doesn't have records.", store.
GetName(), lootId);
244 if (!personal && group)
249 if (
Player* player = itr->GetSource())
250 if (player->IsInMap(lootOwner))
257 items[i].is_underthreshold =
true;
271 NotNormalLootItemMap::const_iterator qmapitr =
PlayerQuestItems.find(plguid);
284 if (!presentAtLooting)
291 for (
uint32 i = 0; i < max_slot; ++i)
293 if (i <
items.size())
375 if (presentAtLooting)
404 GuidSet::iterator i_next;
410 player->SendNotifyLootItemRemoved(lootIndex);
419 GuidSet::iterator i_next;
425 player->SendNotifyLootMoneyRemoved();
438 GuidSet::iterator i_next;
445 NotNormalLootItemMap::const_iterator pq =
PlayerQuestItems.find(player->GetGUID());
452 for (j = 0; j < pql.size(); ++j)
453 if (pql[j].index == questIndex)
457 player->SendNotifyLootItemRemoved(
items.size() + j);
469 if (maxAmount <= minAmount)
471 else if ((maxAmount - minAmount) < 32700)
481 bool is_looted =
true;
482 if (lootSlot >=
items.size())
497 item = &
items[lootSlot];
504 for (NotNormalLootItemList::const_iterator iter = itr->second->begin(); iter != itr->second->end(); ++iter)
505 if (iter->index == lootSlot)
520 for (NotNormalLootItemList::const_iterator iter = itr->second->begin(); iter != itr->second->end(); ++iter)
522 if (iter->index == lootSlot)
526 *conditem = conditem2;
555 if (!item.is_looted && !item.freeforall && item.
conditions.empty())
564 NotNormalLootItemMap::const_iterator q_itr = lootPlayerQuestItems.find(player->
GetGUID());
565 if (q_itr != lootPlayerQuestItems.end())
568 for (NotNormalLootItemList::const_iterator qi = q_list->begin(); qi != q_list->end(); ++qi)
577 NotNormalLootItemMap::const_iterator ffa_itr = lootPlayerFFAItems.find(player->
GetGUID());
578 if (ffa_itr != lootPlayerFFAItems.end())
581 for (NotNormalLootItemList::const_iterator fi = ffa_list->begin(); fi != ffa_list->end(); ++fi)
590 NotNormalLootItemMap::const_iterator nn_itr = lootPlayerNonQuestNonFFAConditionalItems.find(player->
GetGUID());
591 if (nn_itr != lootPlayerNonQuestNonFFAConditionalItems.end())
594 for (NotNormalLootItemList::const_iterator ci = conditional_list->begin(); ci != conditional_list->end(); ++ci)
610 if (!
items[i].is_looted && !
items[i].is_underthreshold && !
items[i].freeforall)
639 uint8 itemsShown = 0;
643 size_t count_pos = b.
wpos();
660 if (l.
items[i].is_blocked)
682 else if (!l.
items[i].rollWinnerGUID.IsEmpty())
701 b <<
uint8(slot_type);
733 b <<
uint8(slot_type);
745 NotNormalLootItemMap::const_iterator q_itr = lootPlayerQuestItems.find(lv.
viewer->
GetGUID());
746 if (q_itr != lootPlayerQuestItems.end())
749 for (NotNormalLootItemList::const_iterator qi = q_list->begin(); qi != q_list->end(); ++qi)
754 b <<
uint8(l.
items.size() + (qi - q_list->begin()));
756 if (item.follow_loot_rules)
768 if (!item.is_blocked)
774 b <<
uint8(slotType);
779 b <<
uint8(slotType);
786 NotNormalLootItemMap::const_iterator ffa_itr = lootPlayerFFAItems.find(lv.
viewer->
GetGUID());
787 if (ffa_itr != lootPlayerFFAItems.end())
790 for (NotNormalLootItemList::const_iterator fi = ffa_list->begin(); fi != ffa_list->end(); ++fi)
795 b <<
uint8(fi->index);
797 b <<
uint8(slotType);
804 NotNormalLootItemMap::const_iterator nn_itr = lootPlayerNonQuestNonFFAConditionalItems.find(lv.
viewer->
GetGUID());
805 if (nn_itr != lootPlayerNonQuestNonFFAConditionalItems.end())
808 for (NotNormalLootItemList::const_iterator ci = conditional_list->begin(); ci != conditional_list->end(); ++ci)
813 b <<
uint8(ci->index);
825 if (!item.is_blocked)
831 b <<
uint8(slotType);
840 b.
put<
uint8>(count_pos, itemsShown);
#define ASSERT_NOTNULL(pointer)
uint32 GenerateEnchSuffixFactor(uint32 item_id)
int32 GenerateItemRandomPropertyId(uint32 item_id)
@ ITEM_FLAG2_FACTION_HORDE
@ ITEM_FLAG2_FACTION_ALLIANCE
@ ITEM_SPELLTRIGGER_LEARN_SPELL_ID
@ ITEM_FLAG_HIDE_UNUSABLE_RECIPE
@ ITEM_FLAGS_CU_FOLLOW_LOOT_RULES
@ ITEM_FLAGS_CU_IGNORE_QUEST_STATUS
#define TC_LOG_ERROR(filterType__,...)
ByteBuffer & operator<<(ByteBuffer &b, LootItem const &li)
#define MAX_NR_QUEST_ITEMS
@ LOOT_SLOT_TYPE_ROLL_ONGOING
@ LOOT_SLOT_TYPE_ALLOW_LOOT
std::unordered_map< ObjectGuid, NotNormalLootItemList * > NotNormalLootItemMap
std::vector< NotNormalLootItem > NotNormalLootItemList
#define MAX_NR_LOOT_ITEMS
uint32 urand(uint32 min, uint32 max)
void put(std::size_t pos, T value)
ObjectGuid GetMasterLooterGuid() const
ItemQualities GetLootThreshold() const
LootMethod GetLootMethod() const
GroupReference * GetFirstMember()
LootTemplate const * GetLootFor(uint32 loot_id) const
bool IsRatesAllowed() const
char const * GetName() const
void Process(Loot &loot, bool rate, uint16 lootMode, uint8 groupId=0) const
static ObjectGuid const Empty
static ObjectGuid GetGUID(Object const *o)
bool HasQuestForItem(uint32 itemId, uint32 excludeQuestId=0, bool turnIn=false) const
bool HasSkill(uint32 skill) const
void StoreLootItem(uint8 lootSlot, Loot *loot)
QuestStatus GetQuestStatus(uint32 quest_id) const
bool HasSpell(uint32 spell) const override
TC_GAME_API Player * FindPlayer(ObjectGuid const &)
std::array< ItemEffect, MAX_ITEM_PROTO_SPELLS > Effects
uint32 GetMaxStackSize() const
bool IsCurrencyToken() const
bool HasFlag(ItemFlags flag) const
void AddAllowedLooter(Player const *player)
ObjectGuid rollWinnerGUID
ConditionContainer conditions
bool AllowedForPlayer(Player const *player, bool isGivenByMasterLooter, ObjectGuid ownerGuid) const
ConditionContainer conditions
PermissionTypes permission
uint32 GetMaxSlotInLootFor(Player *player) const
NotNormalLootItemMap const & GetPlayerQuestItems() const
NotNormalLootItemList * FillQuestLoot(Player *player)
bool hasOverThresholdItem() const
void NotifyMoneyRemoved()
bool FillLoot(uint32 lootId, LootStore const &store, Player *lootOwner, bool personal, bool noEmptyError=false, uint16 lootMode=LOOT_MODE_DEFAULT)
NotNormalLootItemMap PlayerFFAItems
NotNormalLootItemList * FillFFALoot(Player *player)
void AddItem(LootStoreItem const &item)
ObjectGuid roundRobinPlayer
NotNormalLootItemMap PlayerNonQuestNonFFAConditionalItems
NotNormalLootItemMap const & GetPlayerNonQuestNonFFAConditionalItems() const
void generateMoneyLoot(uint32 minAmount, uint32 maxAmount)
NotNormalLootItemList * FillNonQuestNonFFAConditionalLoot(Player *player, bool presentAtLooting)
bool hasItemFor(Player const *player) const
bool hasItemForAll() const
void NotifyQuestItemRemoved(uint8 questIndex)
LootItem * LootItemInSlot(uint32 lootslot, Player *player, NotNormalLootItem **qitem=nullptr, NotNormalLootItem **ffaitem=nullptr, NotNormalLootItem **conditem=nullptr)
std::vector< LootItem > items
NotNormalLootItemMap PlayerQuestItems
NotNormalLootItemMap const & GetPlayerFFAItems() const
void NotifyItemRemoved(uint8 lootIndex)
void FillNotNormalLootFor(Player *player, bool presentAtLooting)
std::vector< LootItem > quest_items
LootValidatorRefManager i_LootValidatorRefManager