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.
This commit is contained in:
jackpoz
2016-09-24 14:43:18 +02:00
parent fb76f1b573
commit c4865fe63e
3 changed files with 10 additions and 6 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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);
}