diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 16 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.h | 2 | ||||
| -rw-r--r-- | src/server/game/Handlers/LootHandler.cpp | 5 |
3 files changed, 14 insertions, 9 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 21a3d787310..917fb3f362d 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -8645,9 +8645,14 @@ ObjectGuid Player::GetLootWorldObjectGUID(ObjectGuid const& lootObjectGuid) cons return ObjectGuid::Empty; } -void Player::RemoveAELootedObject(ObjectGuid const& lootObjectGuid) +void Player::RemoveAELootedWorldObject(ObjectGuid const& lootWorldObjectGuid) { - m_AELootView.erase(lootObjectGuid); + auto itr = std::find_if(m_AELootView.begin(), m_AELootView.end(), [&lootWorldObjectGuid](std::pair<ObjectGuid const, ObjectGuid> const& lootView) + { + return lootView.second == lootWorldObjectGuid; + }); + if (itr != m_AELootView.end()) + m_AELootView.erase(itr); } bool Player::HasLootWorldObjectGUID(ObjectGuid const& lootWorldObjectGuid) const @@ -8707,9 +8712,8 @@ void Player::SendLootReleaseAll() const void Player::SendLoot(ObjectGuid guid, LootType loot_type, bool aeLooting/* = false*/) { - ObjectGuid currentLootGuid = GetLootGUID(); - if (!currentLootGuid.IsEmpty() && !aeLooting) - m_session->DoLootRelease(currentLootGuid); + if (!GetLootGUID().IsEmpty() && !aeLooting) + m_session->DoLootReleaseAll(); Loot* loot; PermissionTypes permission = ALL_PERMISSION; @@ -26515,7 +26519,7 @@ void Player::StoreLootItem(uint8 lootSlot, Loot* loot, AELootResult* aeResult/* // dont allow protected item to be looted by someone else if (!item->rollWinnerGUID.IsEmpty() && item->rollWinnerGUID != GetGUID()) { - SendLootRelease(GetLootGUID()); + SendLootReleaseAll(); return; } diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 8124399b1f3..13114628a13 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1877,7 +1877,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> ObjectGuid const& GetLootGUID() const { return m_playerData->LootTargetGUID; } void SetLootGUID(ObjectGuid const& guid) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::LootTargetGUID), guid); } ObjectGuid GetLootWorldObjectGUID(ObjectGuid const& lootObjectGuid) const; - void RemoveAELootedObject(ObjectGuid const& lootObjectGuid); + void RemoveAELootedWorldObject(ObjectGuid const& lootWorldObjectGuid); bool HasLootWorldObjectGUID(ObjectGuid const& lootWorldObjectGuid) const; std::unordered_map<ObjectGuid, ObjectGuid> const& GetAELootView() const { return m_AELootView; } diff --git a/src/server/game/Handlers/LootHandler.cpp b/src/server/game/Handlers/LootHandler.cpp index 111cfd892a8..c9404dc1be2 100644 --- a/src/server/game/Handlers/LootHandler.cpp +++ b/src/server/game/Handlers/LootHandler.cpp @@ -314,7 +314,9 @@ void WorldSession::DoLootRelease(ObjectGuid lguid) if (player->GetLootGUID() == lguid) player->SetLootGUID(ObjectGuid::Empty); + player->SendLootRelease(lguid); + player->RemoveAELootedWorldObject(lguid); player->RemoveUnitFlag(UNIT_FLAG_LOOTING); @@ -384,7 +386,7 @@ void WorldSession::DoLootRelease(ObjectGuid lguid) ItemTemplate const* proto = pItem->GetTemplate(); // destroy only 5 items from stack in case prospecting and milling - if (proto->GetFlags() & (ITEM_FLAG_IS_PROSPECTABLE | ITEM_FLAG_IS_MILLABLE)) + if (pItem->loot.loot_type == LOOT_PROSPECTING || pItem->loot.loot_type == LOOT_MILLING) { pItem->m_lootGenerated = false; pItem->loot.clear(); @@ -441,7 +443,6 @@ void WorldSession::DoLootRelease(ObjectGuid lguid) //Player is not looking at loot list, he doesn't need to see updates on the loot list loot->RemoveLooter(player->GetGUID()); - player->RemoveAELootedObject(loot->GetGUID()); } void WorldSession::DoLootReleaseAll() |
