diff options
author | robinsch <robinsch@users.noreply.github.com> | 2020-08-22 23:09:13 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-02-04 00:27:12 +0100 |
commit | 5ba95cb42f9354e5be923629c32be71cf2705324 (patch) | |
tree | 540ea72669bd003913b1cd492ee0b3efeac47f54 /src | |
parent | 1f2c48f8bb2396995c1e37e914ef2f3fa6bca490 (diff) |
Core/Unit: Fixed race condition when loot recipient is in different map (#25312)
(cherry picked from commit aaa089ab7f634b50acfabb5ad312edd5ee82d2e2)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index b339b55e7d1..c5bee109aff 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -10443,8 +10443,30 @@ void Unit::SetMeleeAnimKitId(uint16 animKitId) creature->SetLootRecipient(nullptr); } - if (isRewardAllowed && creature && creature->GetLootRecipient()) - player = creature->GetLootRecipient(); + if (isRewardAllowed && creature) + { + if (Player* lootRecipient = creature->GetLootRecipient()) + { + // Loot recipient can be in a different map + if (!creature->IsInMap(lootRecipient)) + { + if (Group* group = creature->GetLootRecipientGroup()) + { + for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) + { + Player* member = itr->GetSource(); + if (!member || !creature->IsInMap(member)) + continue; + + player = member; + break; + } + } + } + else + player = creature->GetLootRecipient(); + } + } // Exploit fix if (creature && creature->IsPet() && creature->GetOwnerGUID().IsPlayer()) |