diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 25cd488c3..ff5b9a8f5 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -2546,17 +2546,32 @@ void GameObject::SetLootRecipient(Map* map) bool GameObject::IsLootAllowedFor(Player const* player) const { if (!m_lootRecipient && !m_lootRecipientGroup) + { return true; + } if (player->GetGUID() == m_lootRecipient) + { return true; + } if (player->HasPendingBind()) + { 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(); - if (!playerGroup || playerGroup != GetLootRecipientGroup()) // if we dont have a group we arent the recipient - return false; // if go doesnt have group bound it means it was solo killed by someone else + if (!playerGroup || playerGroup != GetLootRecipientGroup()) + { + return false; + } + + if (!HasAllowedLooter(player->GetGUID())) + { + return false; + } return true; } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp index a36a5290f..a3e11aafc 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp @@ -1154,8 +1154,15 @@ public: go->SetGoState(GO_STATE_ACTIVE); if (!me->GetMap()->GetPlayers().IsEmpty()) + { 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); break; diff --git a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp index 145201998..6a2951841 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp @@ -280,7 +280,10 @@ public: { 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))) diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp index 6ffa0cdc2..40eac39df 100644 --- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp +++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp @@ -1401,8 +1401,15 @@ public: break; case 1: 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); - me->SummonGameObject(HEART_OF_MAGIC, 773.98f, 1275.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)) + { + 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); events.RescheduleEvent(2, 6000); diff --git a/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp index 5c4a802bd..b998bbc06 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp @@ -160,7 +160,17 @@ public: case DATA_EREGOS: m_auiEncounter[DATA_EREGOS] = data; if (data == DONE) + { DoRespawnGameObject(EregosCacheGUID, 7 * DAY); + + if (GameObject* cache = instance->GetGameObject(EregosCacheGUID)) + { + if (Creature* eregos = instance->GetCreature(uiEregosGUID)) + { + cache->SetLootRecipient(eregos); + } + } + } break; case DATA_CC_COUNT: if( CentrifugeCount < 10 ) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp index 13c420021..f8fe9fb6f 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp @@ -739,14 +739,22 @@ public: me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_RENAME); break; case EVENT_OUTRO_2: + { + Player* lootRecipent = me->GetLootRecipient(); _EnterEvadeMode(); + // LootRecipent is cleared in _EnterEvadeMode, restore it + me->SetLootRecipient(lootRecipent); me->GetMotionMaster()->MovePoint(POINT_ALGALON_OUTRO, AlgalonOutroPos); break; + } case EVENT_OUTRO_3: me->CastSpell((Unit*)nullptr, SPELL_KILL_CREDIT); // 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)) + { go->SetUInt32Value(GAMEOBJECT_FLAGS, 0); + go->SetLootRecipient(me); + } break; case EVENT_OUTRO_4: me->CastSpell((Unit*)nullptr, SPELL_SUPERMASSIVE_FAIL); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp index 917ca584e..8322ed085 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp @@ -370,7 +370,10 @@ public: me->DespawnOrUnsummon(5000); 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->SetLootRecipient(me->GetMap()); + } // Defeat credit if (m_pInstance) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp index 1619b72c4..9776efdc6 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp @@ -310,6 +310,7 @@ public: me->RemoveGameObject(go, false); go->SetSpellId(1); // hack to make it despawn go->SetUInt32Value(GAMEOBJECT_FLAGS, 0); + go->SetLootRecipient(me); } if (Creature* arm = ObjectAccessor::GetCreature(*me, _left)) arm->DespawnOrUnsummon(3000); // visual diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp index 9bc1c38b3..fb755a115 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp @@ -818,9 +818,14 @@ public: me->Yell(TEXT_VOLTRON_DEATH, LANG_UNIVERSAL); me->PlayDirectSound(SOUND_VOLTRON_DEATH); // 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( GameObject* go = me->SummonGameObject(chestId, 2744.65f, 2569.46f, 364.397f, 0, 0, 0, 0, 0, 0) ) + 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)) + { go->SetUInt32Value(GAMEOBJECT_FLAGS, 0); + go->SetLootRecipient(me->GetMap()); + } + } events.ScheduleEvent(EVENT_DISAPPEAR, 15000); break; case EVENT_DISAPPEAR: diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp index 106023b6b..fa30eef41 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp @@ -592,7 +592,10 @@ public: chestId += 1; // hard mode offset if ((go = me->SummonGameObject(chestId, 2134.73f, -286.32f, 419.51f, 0.0f, 0, 0, 0, 0, 0))) + { go->SetUInt32Value(GAMEOBJECT_FLAGS, 0); + go->SetLootRecipient(me->GetMap()); + } // Defeat credit if (m_pInstance) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp index 20f02eda0..128c96544 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp @@ -634,10 +634,18 @@ public: { case TYPE_HODIR: if (hmHodir) + { if (GameObject* go = instance->GetGameObject(m_hodirHardmodeChest)) + { go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + go->SetLootRecipient(instance); + } + } if (GameObject* go = instance->GetGameObject(m_hodirNormalChest)) + { go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + go->SetLootRecipient(instance); + } break; } }