fix(Core/Loot): make Loot::AddItem() honor LootItem::AllowedForPlayer() (#5774)
Original Author: @Wyrserth
This commit is contained in:
@@ -474,6 +474,36 @@ void Loot::AddItem(LootStoreItem const& item)
|
|||||||
lootItems.push_back(generatedLoot);
|
lootItems.push_back(generatedLoot);
|
||||||
count -= proto->GetMaxStackSize();
|
count -= proto->GetMaxStackSize();
|
||||||
|
|
||||||
|
// In some cases, a dropped item should be visible/lootable only for some players in group
|
||||||
|
bool canSeeItemInLootWindow = false;
|
||||||
|
if (auto player = ObjectAccessor::FindPlayer(lootOwnerGUID))
|
||||||
|
{
|
||||||
|
if (auto group = player->GetGroup())
|
||||||
|
{
|
||||||
|
for (auto itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
|
||||||
|
{
|
||||||
|
if (auto member = itr->GetSource())
|
||||||
|
{
|
||||||
|
if (generatedLoot.AllowedForPlayer(member))
|
||||||
|
{
|
||||||
|
canSeeItemInLootWindow = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (generatedLoot.AllowedForPlayer(player))
|
||||||
|
{
|
||||||
|
canSeeItemInLootWindow = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!canSeeItemInLootWindow)
|
||||||
|
{
|
||||||
|
LOG_DEBUG("loot", "Skipping ++unlootedCount for unlootable item: %u", item.itemid);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// non-conditional one-player only items are counted here,
|
// non-conditional one-player only items are counted here,
|
||||||
// free for all items are counted in FillFFALoot(),
|
// free for all items are counted in FillFFALoot(),
|
||||||
// non-ffa conditionals are counted in FillNonQuestNonFFAConditionalLoot()
|
// non-ffa conditionals are counted in FillNonQuestNonFFAConditionalLoot()
|
||||||
@@ -489,6 +519,8 @@ bool Loot::FillLoot(uint32 lootId, LootStore const& store, Player* lootOwner, bo
|
|||||||
if (!lootOwner)
|
if (!lootOwner)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
lootOwnerGUID = lootOwner->GetGUID();
|
||||||
|
|
||||||
LootTemplate const* tab = store.GetLootFor(lootId);
|
LootTemplate const* tab = store.GetLootFor(lootId);
|
||||||
|
|
||||||
if (!tab)
|
if (!tab)
|
||||||
|
|||||||
@@ -309,6 +309,7 @@ struct Loot
|
|||||||
uint32 gold;
|
uint32 gold;
|
||||||
uint8 unlootedCount{0};
|
uint8 unlootedCount{0};
|
||||||
ObjectGuid roundRobinPlayer; // GUID of the player having the Round-Robin ownership for the loot. If 0, round robin owner has released.
|
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{LOOT_NONE}; // required for achievement system
|
LootType loot_type{LOOT_NONE}; // required for achievement system
|
||||||
|
|
||||||
// GUID of container that holds this loot (item_instance.entry), set for items that can be looted
|
// GUID of container that holds this loot (item_instance.entry), set for items that can be looted
|
||||||
|
|||||||
Reference in New Issue
Block a user