diff options
author | Treeston <treeston.mmoc@gmail.com> | 2016-06-17 12:46:13 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-06-17 12:46:13 +0200 |
commit | a49544cc187d3a156b4615907d6b82057364fcc4 (patch) | |
tree | 9f3c5b841d54b885a2a7fc7727051c4de8407c52 /src | |
parent | b785242101f7be0cc6e29e86986b2184db1e43d6 (diff) |
Creature/Loot: Do not display "lootable" sparkles for player even if others in the group still have quest items to be looted from creature. (#16265)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Handlers/LootHandler.cpp | 7 | ||||
-rw-r--r-- | src/server/game/Loot/LootMgr.cpp | 9 | ||||
-rw-r--r-- | src/server/game/Loot/LootMgr.h | 1 |
4 files changed, 14 insertions, 5 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 200611cb232..dfa9190efeb 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -17571,6 +17571,8 @@ bool Player::isAllowedToLoot(const Creature* creature) const Loot* loot = &creature->loot; if (loot->isLooted()) // nothing to loot or everything looted. return false; + if (!loot->hasItemForAll() && !loot->hasItemFor(this)) // no loot in creature for this player + return false; if (loot->loot_type == LOOT_SKINNING) return creature->GetSkinner() == GetGUID(); diff --git a/src/server/game/Handlers/LootHandler.cpp b/src/server/game/Handlers/LootHandler.cpp index ad5d8259e15..b0b06b517c8 100644 --- a/src/server/game/Handlers/LootHandler.cpp +++ b/src/server/game/Handlers/LootHandler.cpp @@ -370,13 +370,10 @@ void WorldSession::DoLootRelease(ObjectGuid lguid) loot->roundRobinPlayer.Clear(); if (Group* group = player->GetGroup()) - { group->SendLooter(creature, NULL); - - // force update of dynamic flags, otherwise other group's players still not able to loot. - creature->ForceValuesUpdateAtIndex(UNIT_DYNAMIC_FLAGS); - } } + // force dynflag update to update looter and lootable info + creature->ForceValuesUpdateAtIndex(UNIT_DYNAMIC_FLAGS); } } diff --git a/src/server/game/Loot/LootMgr.cpp b/src/server/game/Loot/LootMgr.cpp index ebdeb4016dd..9c468e9f9f1 100644 --- a/src/server/game/Loot/LootMgr.cpp +++ b/src/server/game/Loot/LootMgr.cpp @@ -786,6 +786,15 @@ uint32 Loot::GetMaxSlotInLootFor(Player* player) const return items.size() + (itr != PlayerQuestItems.end() ? itr->second->size() : 0); } +// return true if there is any item that is lootable for any player (not quest item, FFA or conditional) +bool Loot::hasItemForAll() const +{ + for (LootItem const& item : items) + if (!item.is_looted && !item.freeforall && item.conditions.empty()) + return true; + return false; +} + // return true if there is any FFA, quest or conditional item for the player. bool Loot::hasItemFor(Player* player) const { diff --git a/src/server/game/Loot/LootMgr.h b/src/server/game/Loot/LootMgr.h index 0afb327d7f0..a66b8f0b4c5 100644 --- a/src/server/game/Loot/LootMgr.h +++ b/src/server/game/Loot/LootMgr.h @@ -382,6 +382,7 @@ struct TC_GAME_API Loot LootItem* LootItemInSlot(uint32 lootslot, Player* player, QuestItem** qitem = NULL, QuestItem** ffaitem = NULL, QuestItem** conditem = NULL); uint32 GetMaxSlotInLootFor(Player* player) const; + bool hasItemForAll() const; bool hasItemFor(Player* player) const; bool hasOverThresholdItem() const; |