aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Player/Player.cpp16
-rw-r--r--src/server/game/Entities/Player/Player.h2
-rw-r--r--src/server/game/Handlers/LootHandler.cpp5
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()