Core/Loot: make Loot::AddItem() honor LootItem::AllowedForPlayer() so that items that cannot be looted don't prevent skinning. (#23408)

This commit is contained in:
Wyrserth
2019-06-15 15:37:32 +02:00
committed by Giacomo Pozzoni
parent 00fdf6e99a
commit a1b2aa97fc
2 changed files with 21 additions and 0 deletions

View File

@@ -158,6 +158,24 @@ void Loot::AddItem(LootStoreItem const& item)
lootItems.push_back(generatedLoot);
count -= proto->GetMaxStackSize();
// In some cases, a dropped item should be visible/lootable only for some players in group
bool canSeeItemInLootWindow = false;
if (Player* player = ObjectAccessor::FindPlayer(lootOwnerGUID))
{
if (Group* group = player->GetGroup())
{
for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
if (Player* member = itr->GetSource())
if (generatedLoot.AllowedForPlayer(member))
canSeeItemInLootWindow = true;
}
else if (generatedLoot.AllowedForPlayer(player))
canSeeItemInLootWindow = true;
}
if (!canSeeItemInLootWindow)
continue;
// non-conditional one-player only items are counted here,
// free for all items are counted in FillFFALoot(),
// non-ffa conditionals are counted in FillNonQuestNonFFAConditionalLoot()
@@ -173,6 +191,8 @@ bool Loot::FillLoot(uint32 lootId, LootStore const& store, Player* lootOwner, bo
if (!lootOwner)
return false;
lootOwnerGUID = lootOwner->GetGUID();
LootTemplate const* tab = store.GetLootFor(lootId);
if (!tab)

View File

@@ -213,6 +213,7 @@ struct TC_GAME_API Loot
uint32 gold;
uint8 unlootedCount;
ObjectGuid roundRobinPlayer; // GUID of the player having the Round-Robin ownership for the loot. If 0, round robin owner has released.
ObjectGuid lootOwnerGUID;
LootType loot_type; // required for achievement system
uint8 maxDuplicates; // Max amount of items with the same entry that can drop (default is 1; on 25 man raid mode 3)