mirror of
https://github.com/liyunfan1223/azerothcore-wotlk.git
synced 2026-08-09 08:17:56 +00:00
fix(Core/Loot): Fixed some chests inside dungeons not being bound only to participants. (#10995)
This commit is contained in:
@@ -2546,17 +2546,32 @@ void GameObject::SetLootRecipient(Map* map)
|
|||||||
bool GameObject::IsLootAllowedFor(Player const* player) const
|
bool GameObject::IsLootAllowedFor(Player const* player) const
|
||||||
{
|
{
|
||||||
if (!m_lootRecipient && !m_lootRecipientGroup)
|
if (!m_lootRecipient && !m_lootRecipientGroup)
|
||||||
|
{
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (player->GetGUID() == m_lootRecipient)
|
if (player->GetGUID() == m_lootRecipient)
|
||||||
|
{
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (player->HasPendingBind())
|
if (player->HasPendingBind())
|
||||||
|
{
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if we dont have a group we arent the recipient
|
||||||
|
// if go doesnt have group bound it means it was solo killed by someone else
|
||||||
Group const* playerGroup = player->GetGroup();
|
Group const* playerGroup = player->GetGroup();
|
||||||
if (!playerGroup || playerGroup != GetLootRecipientGroup()) // if we dont have a group we arent the recipient
|
if (!playerGroup || playerGroup != GetLootRecipientGroup())
|
||||||
return false; // if go doesnt have group bound it means it was solo killed by someone else
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!HasAllowedLooter(player->GetGUID()))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1154,8 +1154,15 @@ public:
|
|||||||
go->SetGoState(GO_STATE_ACTIVE);
|
go->SetGoState(GO_STATE_ACTIVE);
|
||||||
|
|
||||||
if (!me->GetMap()->GetPlayers().IsEmpty())
|
if (!me->GetMap()->GetPlayers().IsEmpty())
|
||||||
|
{
|
||||||
if (Player* player = me->GetMap()->GetPlayers().getFirst()->GetSource())
|
if (Player* player = me->GetMap()->GetPlayers().getFirst()->GetSource())
|
||||||
player->SummonGameObject(DUNGEON_MODE(GO_MALGANIS_CHEST_N, GO_MALGANIS_CHEST_H), 2288.35f, 1498.73f, 128.414f, -0.994837f, 0, 0, 0, 0, 0);
|
{
|
||||||
|
if (GameObject* chest = player->SummonGameObject(DUNGEON_MODE(GO_MALGANIS_CHEST_N, GO_MALGANIS_CHEST_H), 2288.35f, 1498.73f, 128.414f, -0.994837f, 0, 0, 0, 0, 0))
|
||||||
|
{
|
||||||
|
chest->SetLootRecipient(me->GetMap());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ScheduleNextEvent(currentEvent, 10000);
|
ScheduleNextEvent(currentEvent, 10000);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -280,7 +280,10 @@ public:
|
|||||||
{
|
{
|
||||||
if (Player* player = me->GetMap()->GetPlayers().getFirst()->GetSource())
|
if (Player* player = me->GetMap()->GetPlayers().getFirst()->GetSource())
|
||||||
{
|
{
|
||||||
player->SummonGameObject(RAID_MODE(GO_HORSEMEN_CHEST_10, GO_HORSEMEN_CHEST_25), 2514.8f, -2944.9f, 245.55f, 5.51f, 0, 0, 0, 0, 0);
|
if (GameObject* chest = player->SummonGameObject(RAID_MODE(GO_HORSEMEN_CHEST_10, GO_HORSEMEN_CHEST_25), 2514.8f, -2944.9f, 245.55f, 5.51f, 0, 0, 0, 0, 0))
|
||||||
|
{
|
||||||
|
chest->SetLootRecipient(me);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_HORSEMEN_GATE)))
|
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_HORSEMEN_GATE)))
|
||||||
|
|||||||
@@ -1401,8 +1401,15 @@ public:
|
|||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
me->CastSpell(773.98f, 1285.97f, 266.254f, SPELL_ALEXSTRASZA_GIFT, true);
|
me->CastSpell(773.98f, 1285.97f, 266.254f, SPELL_ALEXSTRASZA_GIFT, true);
|
||||||
me->SummonGameObject(ALEXSTRASZA_GIFT, 773.98f, 1285.97f, 266.254f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0);
|
if (GameObject* chest = me->SummonGameObject(ALEXSTRASZA_GIFT, 773.98f, 1285.97f, 266.254f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0))
|
||||||
me->SummonGameObject(HEART_OF_MAGIC, 773.98f, 1275.97f, 266.254f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0);
|
{
|
||||||
|
chest->SetLootRecipient(me->GetMap());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GameObject* heart = me->SummonGameObject(HEART_OF_MAGIC, 773.98f, 1275.97f, 266.254f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0))
|
||||||
|
{
|
||||||
|
heart->SetLootRecipient(me->GetMap());
|
||||||
|
}
|
||||||
|
|
||||||
Talk(SAY_ALEXSTRASZA_ONE);
|
Talk(SAY_ALEXSTRASZA_ONE);
|
||||||
events.RescheduleEvent(2, 6000);
|
events.RescheduleEvent(2, 6000);
|
||||||
|
|||||||
@@ -160,7 +160,17 @@ public:
|
|||||||
case DATA_EREGOS:
|
case DATA_EREGOS:
|
||||||
m_auiEncounter[DATA_EREGOS] = data;
|
m_auiEncounter[DATA_EREGOS] = data;
|
||||||
if (data == DONE)
|
if (data == DONE)
|
||||||
|
{
|
||||||
DoRespawnGameObject(EregosCacheGUID, 7 * DAY);
|
DoRespawnGameObject(EregosCacheGUID, 7 * DAY);
|
||||||
|
|
||||||
|
if (GameObject* cache = instance->GetGameObject(EregosCacheGUID))
|
||||||
|
{
|
||||||
|
if (Creature* eregos = instance->GetCreature(uiEregosGUID))
|
||||||
|
{
|
||||||
|
cache->SetLootRecipient(eregos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case DATA_CC_COUNT:
|
case DATA_CC_COUNT:
|
||||||
if( CentrifugeCount < 10 )
|
if( CentrifugeCount < 10 )
|
||||||
|
|||||||
@@ -739,14 +739,22 @@ public:
|
|||||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_RENAME);
|
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_RENAME);
|
||||||
break;
|
break;
|
||||||
case EVENT_OUTRO_2:
|
case EVENT_OUTRO_2:
|
||||||
|
{
|
||||||
|
Player* lootRecipent = me->GetLootRecipient();
|
||||||
_EnterEvadeMode();
|
_EnterEvadeMode();
|
||||||
|
// LootRecipent is cleared in _EnterEvadeMode, restore it
|
||||||
|
me->SetLootRecipient(lootRecipent);
|
||||||
me->GetMotionMaster()->MovePoint(POINT_ALGALON_OUTRO, AlgalonOutroPos);
|
me->GetMotionMaster()->MovePoint(POINT_ALGALON_OUTRO, AlgalonOutroPos);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case EVENT_OUTRO_3:
|
case EVENT_OUTRO_3:
|
||||||
me->CastSpell((Unit*)nullptr, SPELL_KILL_CREDIT);
|
me->CastSpell((Unit*)nullptr, SPELL_KILL_CREDIT);
|
||||||
// Summon Chest
|
// Summon Chest
|
||||||
if (GameObject* go = me->SummonGameObject(RAID_MODE(GO_ALGALON_CHEST, GO_ALGALON_CHEST_HERO), 1632.1f, -306.561f, 417.321f, 4.69494f, 0, 0, 0, 1, 0))
|
if (GameObject* go = me->SummonGameObject(RAID_MODE(GO_ALGALON_CHEST, GO_ALGALON_CHEST_HERO), 1632.1f, -306.561f, 417.321f, 4.69494f, 0, 0, 0, 1, 0))
|
||||||
|
{
|
||||||
go->SetUInt32Value(GAMEOBJECT_FLAGS, 0);
|
go->SetUInt32Value(GAMEOBJECT_FLAGS, 0);
|
||||||
|
go->SetLootRecipient(me);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case EVENT_OUTRO_4:
|
case EVENT_OUTRO_4:
|
||||||
me->CastSpell((Unit*)nullptr, SPELL_SUPERMASSIVE_FAIL);
|
me->CastSpell((Unit*)nullptr, SPELL_SUPERMASSIVE_FAIL);
|
||||||
|
|||||||
@@ -370,7 +370,10 @@ public:
|
|||||||
|
|
||||||
me->DespawnOrUnsummon(5000);
|
me->DespawnOrUnsummon(5000);
|
||||||
if (GameObject* go = me->SummonGameObject(chestId, 2345.61f, -71.20f, 425.104f, 3.0f, 0, 0, 0, 0, 0))
|
if (GameObject* go = me->SummonGameObject(chestId, 2345.61f, -71.20f, 425.104f, 3.0f, 0, 0, 0, 0, 0))
|
||||||
|
{
|
||||||
go->SetUInt32Value(GAMEOBJECT_FLAGS, 0);
|
go->SetUInt32Value(GAMEOBJECT_FLAGS, 0);
|
||||||
|
go->SetLootRecipient(me->GetMap());
|
||||||
|
}
|
||||||
|
|
||||||
// Defeat credit
|
// Defeat credit
|
||||||
if (m_pInstance)
|
if (m_pInstance)
|
||||||
|
|||||||
@@ -310,6 +310,7 @@ public:
|
|||||||
me->RemoveGameObject(go, false);
|
me->RemoveGameObject(go, false);
|
||||||
go->SetSpellId(1); // hack to make it despawn
|
go->SetSpellId(1); // hack to make it despawn
|
||||||
go->SetUInt32Value(GAMEOBJECT_FLAGS, 0);
|
go->SetUInt32Value(GAMEOBJECT_FLAGS, 0);
|
||||||
|
go->SetLootRecipient(me);
|
||||||
}
|
}
|
||||||
if (Creature* arm = ObjectAccessor::GetCreature(*me, _left))
|
if (Creature* arm = ObjectAccessor::GetCreature(*me, _left))
|
||||||
arm->DespawnOrUnsummon(3000); // visual
|
arm->DespawnOrUnsummon(3000); // visual
|
||||||
|
|||||||
@@ -818,9 +818,14 @@ public:
|
|||||||
me->Yell(TEXT_VOLTRON_DEATH, LANG_UNIVERSAL);
|
me->Yell(TEXT_VOLTRON_DEATH, LANG_UNIVERSAL);
|
||||||
me->PlayDirectSound(SOUND_VOLTRON_DEATH);
|
me->PlayDirectSound(SOUND_VOLTRON_DEATH);
|
||||||
// spawn chest
|
// spawn chest
|
||||||
if( uint32 chestId = (hardmode ? RAID_MODE(GO_MIMIRON_CHEST_HARD, GO_MIMIRON_CHEST_HERO_HARD) : RAID_MODE(GO_MIMIRON_CHEST, GO_MIMIRON_CHEST_HERO)) )
|
if (uint32 chestId = (hardmode ? RAID_MODE(GO_MIMIRON_CHEST_HARD, GO_MIMIRON_CHEST_HERO_HARD) : RAID_MODE(GO_MIMIRON_CHEST, GO_MIMIRON_CHEST_HERO)))
|
||||||
if( GameObject* go = me->SummonGameObject(chestId, 2744.65f, 2569.46f, 364.397f, 0, 0, 0, 0, 0, 0) )
|
{
|
||||||
|
if (GameObject* go = me->SummonGameObject(chestId, 2744.65f, 2569.46f, 364.397f, 0, 0, 0, 0, 0, 0))
|
||||||
|
{
|
||||||
go->SetUInt32Value(GAMEOBJECT_FLAGS, 0);
|
go->SetUInt32Value(GAMEOBJECT_FLAGS, 0);
|
||||||
|
go->SetLootRecipient(me->GetMap());
|
||||||
|
}
|
||||||
|
}
|
||||||
events.ScheduleEvent(EVENT_DISAPPEAR, 15000);
|
events.ScheduleEvent(EVENT_DISAPPEAR, 15000);
|
||||||
break;
|
break;
|
||||||
case EVENT_DISAPPEAR:
|
case EVENT_DISAPPEAR:
|
||||||
|
|||||||
@@ -592,7 +592,10 @@ public:
|
|||||||
chestId += 1; // hard mode offset
|
chestId += 1; // hard mode offset
|
||||||
|
|
||||||
if ((go = me->SummonGameObject(chestId, 2134.73f, -286.32f, 419.51f, 0.0f, 0, 0, 0, 0, 0)))
|
if ((go = me->SummonGameObject(chestId, 2134.73f, -286.32f, 419.51f, 0.0f, 0, 0, 0, 0, 0)))
|
||||||
|
{
|
||||||
go->SetUInt32Value(GAMEOBJECT_FLAGS, 0);
|
go->SetUInt32Value(GAMEOBJECT_FLAGS, 0);
|
||||||
|
go->SetLootRecipient(me->GetMap());
|
||||||
|
}
|
||||||
|
|
||||||
// Defeat credit
|
// Defeat credit
|
||||||
if (m_pInstance)
|
if (m_pInstance)
|
||||||
|
|||||||
@@ -634,10 +634,18 @@ public:
|
|||||||
{
|
{
|
||||||
case TYPE_HODIR:
|
case TYPE_HODIR:
|
||||||
if (hmHodir)
|
if (hmHodir)
|
||||||
|
{
|
||||||
if (GameObject* go = instance->GetGameObject(m_hodirHardmodeChest))
|
if (GameObject* go = instance->GetGameObject(m_hodirHardmodeChest))
|
||||||
|
{
|
||||||
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||||
|
go->SetLootRecipient(instance);
|
||||||
|
}
|
||||||
|
}
|
||||||
if (GameObject* go = instance->GetGameObject(m_hodirNormalChest))
|
if (GameObject* go = instance->GetGameObject(m_hodirNormalChest))
|
||||||
|
{
|
||||||
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||||
|
go->SetLootRecipient(instance);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user