103 if (player->
HasSpell(itemEffect.SpellID))
116 if (player->
HasSpell(itemEffect.SpellID))
186 for (
uint32 i = 0; i < stacks && lootItems.size() < limit; ++i)
190 generatedLoot.
itemIndex = lootItems.size();
191 lootItems.push_back(generatedLoot);
195 bool canSeeItemInLootWindow =
false;
198 if (
Group* group = player->GetGroup())
200 for (
GroupReference* itr = group->GetFirstMember(); itr !=
nullptr; itr = itr->next())
201 if (
Player* member = itr->GetSource())
203 canSeeItemInLootWindow =
true;
206 canSeeItemInLootWindow =
true;
209 if (!canSeeItemInLootWindow)
234 TC_LOG_ERROR(
"sql.sql",
"Table '{}' loot id #{} used but it doesn't have records.", store.
GetName(), lootId);
245 if (!personal && group)
250 if (
Player* player = itr->GetSource())
251 if (player->IsInMap(lootOwner))
258 items[i].is_underthreshold =
true;
272 NotNormalLootItemMap::const_iterator qmapitr =
PlayerQuestItems.find(plguid);
285 if (!presentAtLooting)
292 for (
uint32 i = 0; i < max_slot; ++i)
294 if (i <
items.size())
301 if (proto->IsCurrencyToken())
376 if (presentAtLooting)
405 GuidSet::iterator i_next;
411 player->SendNotifyLootItemRemoved(lootIndex);
420 GuidSet::iterator i_next;
426 player->SendNotifyLootMoneyRemoved();
439 GuidSet::iterator i_next;
446 NotNormalLootItemMap::const_iterator pq =
PlayerQuestItems.find(player->GetGUID());
453 for (j = 0; j < pql.size(); ++j)
454 if (pql[j].index == questIndex)
458 player->SendNotifyLootItemRemoved(
items.size() + j);
470 if (maxAmount <= minAmount)
472 else if ((maxAmount - minAmount) < 32700)
482 bool is_looted =
true;
483 if (lootSlot >=
items.size())
498 item = &
items[lootSlot];
505 for (NotNormalLootItemList::const_iterator iter = itr->second->begin(); iter != itr->second->end(); ++iter)
506 if (iter->index == lootSlot)
521 for (NotNormalLootItemList::const_iterator iter = itr->second->begin(); iter != itr->second->end(); ++iter)
523 if (iter->index == lootSlot)
527 *conditem = conditem2;
556 if (!item.is_looted && !item.freeforall && item.conditions.empty())
565 NotNormalLootItemMap::const_iterator q_itr = lootPlayerQuestItems.find(player->
GetGUID());
566 if (q_itr != lootPlayerQuestItems.end())
569 for (NotNormalLootItemList::const_iterator qi = q_list->begin(); qi != q_list->end(); ++qi)
578 NotNormalLootItemMap::const_iterator ffa_itr = lootPlayerFFAItems.find(player->
GetGUID());
579 if (ffa_itr != lootPlayerFFAItems.end())
582 for (NotNormalLootItemList::const_iterator fi = ffa_list->begin(); fi != ffa_list->end(); ++fi)
591 NotNormalLootItemMap::const_iterator nn_itr = lootPlayerNonQuestNonFFAConditionalItems.find(player->
GetGUID());
592 if (nn_itr != lootPlayerNonQuestNonFFAConditionalItems.end())
595 for (NotNormalLootItemList::const_iterator ci = conditional_list->begin(); ci != conditional_list->end(); ++ci)
611 if (!
items[i].is_looted && !
items[i].is_underthreshold && !
items[i].freeforall)
621 lootItem.
UIType = slot_type;
650 if (
items[i].is_blocked)
672 else if (!
items[i].rollWinnerGUID.IsEmpty())
725 NotNormalLootItemMap::const_iterator q_itr = lootPlayerQuestItems.find(viewer->
GetGUID());
726 if (q_itr != lootPlayerQuestItems.end())
729 for (NotNormalLootItemList::const_iterator qi = q_list->begin(); qi != q_list->end(); ++qi)
761 NotNormalLootItemMap::const_iterator ffa_itr = lootPlayerFFAItems.find(viewer->
GetGUID());
762 if (ffa_itr != lootPlayerFFAItems.end())
765 for (NotNormalLootItemList::const_iterator fi = ffa_list->begin(); fi != ffa_list->end(); ++fi)
774 NotNormalLootItemMap::const_iterator nn_itr = lootPlayerNonQuestNonFFAConditionalItems.find(viewer->
GetGUID());
775 if (nn_itr != lootPlayerNonQuestNonFFAConditionalItems.end())
778 for (NotNormalLootItemList::const_iterator ci = conditional_list->begin(); ci != conditional_list->end(); ++ci)
#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__,...)
static void FillLootItemData(WorldPackets::Loot::LootItemData &lootItem, uint8 lootListId, LootItem const &li, LootSlotType slot_type)
#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)
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
std::vector< LootItemData > Items
TC_GAME_API Player * FindPlayer(ObjectGuid const &)
std::array< ItemEffect, MAX_ITEM_PROTO_SPELLS > Effects
uint32 GetMaxStackSize() const
ItemBondingType GetBonding() const
uint32 GetStartQuest() const
bool HasFlag(ItemFlags flag) const
uint32 GetRequiredSkill() const
void AddAllowedLooter(Player const *player)
ObjectGuid rollWinnerGUID
uint32 randomPropertySeed
ConditionContainer conditions
bool AllowedForPlayer(Player const *player, bool isGivenByMasterLooter, ObjectGuid ownerGuid) const
ConditionContainer conditions
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
void BuildLootResponse(WorldPackets::Loot::LootResponse &packet, Player const *viewer, PermissionTypes permission) const
NotNormalLootItemMap PlayerQuestItems
NotNormalLootItemMap const & GetPlayerFFAItems() const
void NotifyItemRemoved(uint8 lootIndex)
void FillNotNormalLootFor(Player *player, bool presentAtLooting)
std::vector< LootItem > quest_items
LootValidatorRefManager i_LootValidatorRefManager
int32 RandomPropertiesSeed