diff options
| author | jackpoz <giacomopoz@gmail.com> | 2016-09-24 14:43:18 +0200 |
|---|---|---|
| committer | jackpoz <giacomopoz@gmail.com> | 2016-09-24 14:43:18 +0200 |
| commit | c4865fe63ee4bb9d401d09cb9543acaf9c853b56 (patch) | |
| tree | 0dfcee75da3973154df9a57bb872bb73a0a7a03f /src | |
| parent | fb76f1b5734caaa40719b194aaf7b6e9a9d80aae (diff) | |
Scripts/ICC: Fix chest loot exploit
Fix an exploit at chest loot bosses Valithria and Deathbringer that allowed the first played to hit them to leave party at low hp % and loot the whole chest alone, without the party being able to loot anything.
Diffstat (limited to 'src')
3 files changed, 10 insertions, 6 deletions
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index b495b02ee72..8c43d287c91 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -2187,7 +2187,7 @@ Group* GameObject::GetLootRecipientGroup() const return sGroupMgr->GetGroupByGUID(m_lootRecipientGroup); } -void GameObject::SetLootRecipient(Unit* unit) +void GameObject::SetLootRecipient(Unit* unit, Group* group) { // set the player whose group should receive the right // to loot the creature after it dies @@ -2196,7 +2196,7 @@ void GameObject::SetLootRecipient(Unit* unit) if (!unit) { m_lootRecipient.Clear(); - m_lootRecipientGroup = 0; + m_lootRecipientGroup = group ? group->GetLowGUID() : 0; return; } @@ -2208,8 +2208,12 @@ void GameObject::SetLootRecipient(Unit* unit) return; m_lootRecipient = player->GetGUID(); - if (Group* group = player->GetGroup()) + + // either get the group from the passed parameter or from unit's one + if (group) m_lootRecipientGroup = group->GetLowGUID(); + else if (Group* unitGroup = player->GetGroup()) + m_lootRecipientGroup = unitGroup->GetLowGUID(); } bool GameObject::IsLootAllowedFor(Player const* player) const diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h index 842d5400fb2..85b37abaf3c 100644 --- a/src/server/game/Entities/GameObject/GameObject.h +++ b/src/server/game/Entities/GameObject/GameObject.h @@ -812,7 +812,7 @@ class TC_GAME_API GameObject : public WorldObject, public GridObject<GameObject> Player* GetLootRecipient() const; Group* GetLootRecipientGroup() const; - void SetLootRecipient(Unit* unit); + void SetLootRecipient(Unit* unit, Group* group = nullptr); bool IsLootAllowedFor(Player const* player) const; bool HasLootRecipient() const { return !m_lootRecipient.IsEmpty() || m_lootRecipientGroup; } uint32 m_groupLootTimer; // (msecs)timer used for group loot diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp index 684e5866386..575c498ead3 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp @@ -639,7 +639,7 @@ class instance_icecrown_citadel : public InstanceMapScript case GO_CACHE_OF_THE_DREAMWALKER_10H: case GO_CACHE_OF_THE_DREAMWALKER_25H: if (Creature* valithria = instance->GetCreature(ValithriaDreamwalkerGUID)) - go->SetLootRecipient(valithria->GetLootRecipient()); + go->SetLootRecipient(valithria->GetLootRecipient(), valithria->GetLootRecipientGroup()); go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED | GO_FLAG_NOT_SELECTABLE | GO_FLAG_NODESPAWN); break; case GO_ARTHAS_PLATFORM: @@ -875,7 +875,7 @@ class instance_icecrown_citadel : public InstanceMapScript if (GameObject* loot = instance->GetGameObject(DeathbringersCacheGUID)) { if (Creature* deathbringer = instance->GetCreature(DeathbringerSaurfangGUID)) - loot->SetLootRecipient(deathbringer->GetLootRecipient()); + loot->SetLootRecipient(deathbringer->GetLootRecipient(), deathbringer->GetLootRecipientGroup()); loot->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED | GO_FLAG_NOT_SELECTABLE | GO_FLAG_NODESPAWN); } |
