diff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp index c97a6a59f..03c307bea 100644 --- a/src/server/game/Instances/InstanceScript.cpp +++ b/src/server/game/Instances/InstanceScript.cpp @@ -612,6 +612,35 @@ void InstanceScript::DoCastSpellOnPlayers(uint32 spell) player->CastSpell(player, spell, true); } +void InstanceScript::DoCastSpellOnPlayer(Player* player, uint32 spell, bool includePets /*= false*/, bool includeControlled /*= false*/) +{ + if (!player) + return; + + player->CastSpell(player, spell, true); + + if (!includePets) + return; + + for (uint8 itr2 = 0; itr2 < MAX_SUMMON_SLOT; ++itr2) + { + ObjectGuid summonGUID = player->m_SummonSlot[itr2]; + if (!summonGUID.IsEmpty()) + if (Creature* summon = instance->GetCreature(summonGUID)) + summon->CastSpell(player, spell, true); + } + + if (!includeControlled) + return; + + for (auto itr2 = player->m_Controlled.begin(); itr2 != player->m_Controlled.end(); ++itr2) + { + if (Unit* controlled = *itr2) + if (controlled->IsInWorld() && controlled->GetTypeId() == TYPEID_UNIT) + controlled->CastSpell(player, spell, true); + } +} + bool InstanceScript::CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* /*source*/, Unit const* /*target*/ /*= nullptr*/, uint32 /*miscvalue1*/ /*= 0*/) { LOG_ERROR("scripts.ai", "Achievement system call InstanceScript::CheckAchievementCriteriaMeet but instance script for map {} not have implementation for achievement criteria {}", diff --git a/src/server/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h index 158ccced2..f5b255ebf 100644 --- a/src/server/game/Instances/InstanceScript.h +++ b/src/server/game/Instances/InstanceScript.h @@ -220,6 +220,9 @@ public: // Cast spell on all players in instance void DoCastSpellOnPlayers(uint32 spell); + // Cast spell on player + void DoCastSpellOnPlayer(Player* player, uint32 spell, bool includePets /*= false*/, bool includeControlled /*= false*/); + // Return wether server allow two side groups or not bool ServerAllowsTwoSideGroups() { return sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP); } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp index 673a26936..09f4d47f8 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp @@ -252,6 +252,22 @@ public: if (GetBossState(DATA_LADY_DEATHWHISPER) == DONE && GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != DONE) SpawnGunship(); + + if (IsBuffAvailable) + { + SpellAreaForAreaMapBounds saBounds = sSpellMgr->GetSpellAreaForAreaMapBounds(4812); + for (SpellAreaForAreaMap::const_iterator itr = saBounds.first; itr != saBounds.second; ++itr) + if ((itr->second->raceMask & player->getRaceMask()) && !player->HasAura(itr->second->spellId)) + { + if (SpellInfo const* si = sSpellMgr->GetSpellInfo(itr->second->spellId)) + { + if (si->HasAura(SPELL_AURA_MOD_INCREASE_HEALTH_PERCENT)) + { + DoCastSpellOnPlayer(player, itr->second->spellId, false, false); + } + } + } + } } void OnCreatureCreate(Creature* creature) override @@ -1210,40 +1226,39 @@ public: IsBuffAvailable = !!data; if (!IsBuffAvailable) { - Map::PlayerList const& plrList = instance->GetPlayers(); - for (Map::PlayerList::const_iterator itr = plrList.begin(); itr != plrList.end(); ++itr) - if (Player* plr = itr->GetSource()) + instance->DoForAllPlayers([&](Player* player) + { + player->UpdateAreaDependentAuras(player->GetAreaId()); + for (Unit::ControlSet::const_iterator itr = player->m_Controlled.begin(); itr != player->m_Controlled.end(); ++itr) { - plr->UpdateAreaDependentAuras(plr->GetAreaId()); - for (Unit::ControlSet::const_iterator itr = plr->m_Controlled.begin(); itr != plr->m_Controlled.end(); ++itr) - { - Unit::AuraMap& am = (*itr)->GetOwnedAuras(); - for (Unit::AuraMap::iterator itra = am.begin(); itra != am.end();) - switch (itra->second->GetId()) - { - // Hellscream's Warsong - case 73816: - case 73818: - case 73819: - case 73820: - case 73821: - case 73822: + Unit::AuraMap& am = (*itr)->GetOwnedAuras(); + for (Unit::AuraMap::iterator itra = am.begin(); itra != am.end();) + switch (itra->second->GetId()) + { + // Hellscream's Warsong + case 73816: + case 73818: + case 73819: + case 73820: + case 73821: + case 73822: // Strength of Wrynn - case 73762: - case 73824: - case 73825: - case 73826: - case 73827: - case 73828: - (*itr)->RemoveOwnedAura(itra); - break; - default: - ++itra; - break; - } - } + case 73762: + case 73824: + case 73825: + case 73826: + case 73827: + case 73828: + (*itr)->RemoveOwnedAura(itra); + break; + default: + ++itra; + break; + } } + }); } + SaveToDB(); break; case DATA_WEEKLY_QUEST_ID: for (uint8 i = 0; i < WeeklyNPCs; ++i) @@ -1593,7 +1608,6 @@ public: ColdflameJetsState = temp ? DONE : NOT_STARTED; } - data >> temp; data >> BloodQuickeningState; data >> BloodQuickeningMinutes; @@ -1607,11 +1621,10 @@ public: data >> WeeklyQuestId10; data >> PutricideEventProgress; PutricideEventProgress &= ~PUTRICIDE_EVENT_FLAG_TRAP_INPROGRESS; - data >> temp; - LichKingHeroicAvailable = !!temp; + data >> LichKingHeroicAvailable; data >> BloodPrinceTrashCount; - data >> temp; - SetData(DATA_BUFF_AVAILABLE, !!temp); + data >> IsBuffAvailable; + SetData(DATA_BUFF_AVAILABLE, IsBuffAvailable); } void WriteSaveDataMore(std::ostringstream& data) override