diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp | 2970 |
1 files changed, 1369 insertions, 1601 deletions
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp index 0e65c199612..eea736e30d7 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp @@ -364,217 +364,206 @@ Position const FactionChampionLoc[] = { 521.901f, 128.488f, 394.832f, 0 } // 19 - Horde Final Pos 9 }; -class boss_toc_champion_controller : public CreatureScript +struct boss_toc_champion_controller : public BossAI { - public: - boss_toc_champion_controller() : CreatureScript("boss_toc_champion_controller") { } - - struct boss_toc_champion_controllerAI : public BossAI - { - boss_toc_champion_controllerAI(Creature* creature) : BossAI(creature, DATA_FACTION_CRUSADERS) - { - Initialize(); - } + boss_toc_champion_controller(Creature* creature) : BossAI(creature, DATA_FACTION_CRUSADERS) + { + Initialize(); + } - void Initialize() - { - _championsNotStarted = 0; - _championsFailed = 0; - _championsKilled = 0; - _inProgress = false; - } + void Initialize() + { + _championsNotStarted = 0; + _championsFailed = 0; + _championsKilled = 0; + _inProgress = false; + } - void Reset() override - { - Initialize(); - } + void Reset() override + { + Initialize(); + } - void JustSummoned(Creature* /*summon*/) override { } + void JustSummoned(Creature* /*summon*/) override { } - std::vector<uint32> SelectChampions(Team playerTeam) - { - std::vector<uint32> vHealersEntries; - vHealersEntries.clear(); - vHealersEntries.push_back(playerTeam == ALLIANCE ? NPC_HORDE_DRUID_RESTORATION : NPC_ALLIANCE_DRUID_RESTORATION); - vHealersEntries.push_back(playerTeam == ALLIANCE ? NPC_HORDE_PALADIN_HOLY : NPC_ALLIANCE_PALADIN_HOLY); - vHealersEntries.push_back(playerTeam == ALLIANCE ? NPC_HORDE_PRIEST_DISCIPLINE : NPC_ALLIANCE_PRIEST_DISCIPLINE); - vHealersEntries.push_back(playerTeam == ALLIANCE ? NPC_HORDE_SHAMAN_RESTORATION : NPC_ALLIANCE_SHAMAN_RESTORATION); - - std::vector<uint32> vOtherEntries; - vOtherEntries.clear(); - vOtherEntries.push_back(playerTeam == ALLIANCE ? NPC_HORDE_DEATH_KNIGHT : NPC_ALLIANCE_DEATH_KNIGHT); - vOtherEntries.push_back(playerTeam == ALLIANCE ? NPC_HORDE_HUNTER : NPC_ALLIANCE_HUNTER); - vOtherEntries.push_back(playerTeam == ALLIANCE ? NPC_HORDE_MAGE : NPC_ALLIANCE_MAGE); - vOtherEntries.push_back(playerTeam == ALLIANCE ? NPC_HORDE_ROGUE : NPC_ALLIANCE_ROGUE); - vOtherEntries.push_back(playerTeam == ALLIANCE ? NPC_HORDE_WARLOCK : NPC_ALLIANCE_WARLOCK); - vOtherEntries.push_back(playerTeam == ALLIANCE ? NPC_HORDE_WARRIOR : NPC_ALLIANCE_WARRIOR); - - uint8 healersSubtracted = 2; - if (instance->instance->GetSpawnMode() == RAID_DIFFICULTY_25MAN_NORMAL || instance->instance->GetSpawnMode() == RAID_DIFFICULTY_25MAN_HEROIC) - healersSubtracted = 1; - for (uint8 i = 0; i < healersSubtracted; ++i) - { - uint8 pos = urand(0, vHealersEntries.size() - 1); - switch (vHealersEntries[pos]) - { - case NPC_ALLIANCE_DRUID_RESTORATION: - vOtherEntries.push_back(NPC_ALLIANCE_DRUID_BALANCE); - break; - case NPC_HORDE_DRUID_RESTORATION: - vOtherEntries.push_back(NPC_HORDE_DRUID_BALANCE); - break; - case NPC_ALLIANCE_PALADIN_HOLY: - vOtherEntries.push_back(NPC_ALLIANCE_PALADIN_RETRIBUTION); - break; - case NPC_HORDE_PALADIN_HOLY: - vOtherEntries.push_back(NPC_HORDE_PALADIN_RETRIBUTION); - break; - case NPC_ALLIANCE_PRIEST_DISCIPLINE: - vOtherEntries.push_back(NPC_ALLIANCE_PRIEST_SHADOW); - break; - case NPC_HORDE_PRIEST_DISCIPLINE: - vOtherEntries.push_back(NPC_HORDE_PRIEST_SHADOW); - break; - case NPC_ALLIANCE_SHAMAN_RESTORATION: - vOtherEntries.push_back(NPC_ALLIANCE_SHAMAN_ENHANCEMENT); - break; - case NPC_HORDE_SHAMAN_RESTORATION: - vOtherEntries.push_back(NPC_HORDE_SHAMAN_ENHANCEMENT); - break; - default: - break; - } - vHealersEntries.erase(vHealersEntries.begin() + pos); - } + std::vector<uint32> SelectChampions(Team playerTeam) + { + std::vector<uint32> vHealersEntries; + vHealersEntries.clear(); + vHealersEntries.push_back(playerTeam == ALLIANCE ? NPC_HORDE_DRUID_RESTORATION : NPC_ALLIANCE_DRUID_RESTORATION); + vHealersEntries.push_back(playerTeam == ALLIANCE ? NPC_HORDE_PALADIN_HOLY : NPC_ALLIANCE_PALADIN_HOLY); + vHealersEntries.push_back(playerTeam == ALLIANCE ? NPC_HORDE_PRIEST_DISCIPLINE : NPC_ALLIANCE_PRIEST_DISCIPLINE); + vHealersEntries.push_back(playerTeam == ALLIANCE ? NPC_HORDE_SHAMAN_RESTORATION : NPC_ALLIANCE_SHAMAN_RESTORATION); + + std::vector<uint32> vOtherEntries; + vOtherEntries.clear(); + vOtherEntries.push_back(playerTeam == ALLIANCE ? NPC_HORDE_DEATH_KNIGHT : NPC_ALLIANCE_DEATH_KNIGHT); + vOtherEntries.push_back(playerTeam == ALLIANCE ? NPC_HORDE_HUNTER : NPC_ALLIANCE_HUNTER); + vOtherEntries.push_back(playerTeam == ALLIANCE ? NPC_HORDE_MAGE : NPC_ALLIANCE_MAGE); + vOtherEntries.push_back(playerTeam == ALLIANCE ? NPC_HORDE_ROGUE : NPC_ALLIANCE_ROGUE); + vOtherEntries.push_back(playerTeam == ALLIANCE ? NPC_HORDE_WARLOCK : NPC_ALLIANCE_WARLOCK); + vOtherEntries.push_back(playerTeam == ALLIANCE ? NPC_HORDE_WARRIOR : NPC_ALLIANCE_WARRIOR); + + uint8 healersSubtracted = 2; + if (instance->instance->GetSpawnMode() == RAID_DIFFICULTY_25MAN_NORMAL || instance->instance->GetSpawnMode() == RAID_DIFFICULTY_25MAN_HEROIC) + healersSubtracted = 1; + for (uint8 i = 0; i < healersSubtracted; ++i) + { + uint8 pos = urand(0, vHealersEntries.size() - 1); + switch (vHealersEntries[pos]) + { + case NPC_ALLIANCE_DRUID_RESTORATION: + vOtherEntries.push_back(NPC_ALLIANCE_DRUID_BALANCE); + break; + case NPC_HORDE_DRUID_RESTORATION: + vOtherEntries.push_back(NPC_HORDE_DRUID_BALANCE); + break; + case NPC_ALLIANCE_PALADIN_HOLY: + vOtherEntries.push_back(NPC_ALLIANCE_PALADIN_RETRIBUTION); + break; + case NPC_HORDE_PALADIN_HOLY: + vOtherEntries.push_back(NPC_HORDE_PALADIN_RETRIBUTION); + break; + case NPC_ALLIANCE_PRIEST_DISCIPLINE: + vOtherEntries.push_back(NPC_ALLIANCE_PRIEST_SHADOW); + break; + case NPC_HORDE_PRIEST_DISCIPLINE: + vOtherEntries.push_back(NPC_HORDE_PRIEST_SHADOW); + break; + case NPC_ALLIANCE_SHAMAN_RESTORATION: + vOtherEntries.push_back(NPC_ALLIANCE_SHAMAN_ENHANCEMENT); + break; + case NPC_HORDE_SHAMAN_RESTORATION: + vOtherEntries.push_back(NPC_HORDE_SHAMAN_ENHANCEMENT); + break; + default: + break; + } + vHealersEntries.erase(vHealersEntries.begin() + pos); + } - if (instance->instance->GetSpawnMode() == RAID_DIFFICULTY_10MAN_NORMAL || instance->instance->GetSpawnMode() == RAID_DIFFICULTY_10MAN_HEROIC) - for (uint8 i = 0; i < 4; ++i) - vOtherEntries.erase(vOtherEntries.begin() + urand(0, vOtherEntries.size() - 1)); + if (instance->instance->GetSpawnMode() == RAID_DIFFICULTY_10MAN_NORMAL || instance->instance->GetSpawnMode() == RAID_DIFFICULTY_10MAN_HEROIC) + for (uint8 i = 0; i < 4; ++i) + vOtherEntries.erase(vOtherEntries.begin() + urand(0, vOtherEntries.size() - 1)); - std::vector<uint32> vChampionEntries; - vChampionEntries.clear(); - for (uint8 i = 0; i < vHealersEntries.size(); ++i) - vChampionEntries.push_back(vHealersEntries[i]); - for (uint8 i = 0; i < vOtherEntries.size(); ++i) - vChampionEntries.push_back(vOtherEntries[i]); + std::vector<uint32> vChampionEntries; + vChampionEntries.clear(); + for (uint8 i = 0; i < vHealersEntries.size(); ++i) + vChampionEntries.push_back(vHealersEntries[i]); + for (uint8 i = 0; i < vOtherEntries.size(); ++i) + vChampionEntries.push_back(vOtherEntries[i]); - return vChampionEntries; - } + return vChampionEntries; + } - void SummonChampions(Team playerTeam) + void SummonChampions(Team playerTeam) + { + std::vector<Position> vChampionJumpOrigin; + if (playerTeam == ALLIANCE) + for (uint8 i = 0; i < 5; i++) + vChampionJumpOrigin.push_back(FactionChampionLoc[i]); + else + for (uint8 i = 5; i < 10; i++) + vChampionJumpOrigin.push_back(FactionChampionLoc[i]); + + std::vector<Position> vChampionJumpTarget; + for (uint8 i = 10; i < 20; i++) + vChampionJumpTarget.push_back(FactionChampionLoc[i]); + std::vector<uint32> vChampionEntries = SelectChampions(playerTeam); + + for (uint8 i = 0; i < vChampionEntries.size(); ++i) + { + uint8 pos = urand(0, vChampionJumpTarget.size()-1); + if (Creature* champion = me->SummonCreature(vChampionEntries[i], vChampionJumpOrigin[urand(0, vChampionJumpOrigin.size()-1)], TEMPSUMMON_MANUAL_DESPAWN)) { - std::vector<Position> vChampionJumpOrigin; + summons.Summon(champion); + champion->SetReactState(REACT_PASSIVE); + champion->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + champion->SetImmuneToPC(false); if (playerTeam == ALLIANCE) - for (uint8 i = 0; i < 5; i++) - vChampionJumpOrigin.push_back(FactionChampionLoc[i]); + { + champion->SetHomePosition(vChampionJumpTarget[pos].GetPositionX(), vChampionJumpTarget[pos].GetPositionY(), vChampionJumpTarget[pos].GetPositionZ(), 0); + champion->GetMotionMaster()->MoveJump(vChampionJumpTarget[pos], 20.0f, 20.0f); + champion->SetOrientation(0); + } else - for (uint8 i = 5; i < 10; i++) - vChampionJumpOrigin.push_back(FactionChampionLoc[i]); - - std::vector<Position> vChampionJumpTarget; - for (uint8 i = 10; i < 20; i++) - vChampionJumpTarget.push_back(FactionChampionLoc[i]); - std::vector<uint32> vChampionEntries = SelectChampions(playerTeam); + { + champion->SetHomePosition((ToCCommonLoc[1].GetPositionX()*2)-vChampionJumpTarget[pos].GetPositionX(), vChampionJumpTarget[pos].GetPositionY(), vChampionJumpTarget[pos].GetPositionZ(), 3); + champion->GetMotionMaster()->MoveJump((ToCCommonLoc[1].GetPositionX() * 2) - vChampionJumpTarget[pos].GetPositionX(), vChampionJumpTarget[pos].GetPositionY(), vChampionJumpTarget[pos].GetPositionZ(), vChampionJumpTarget[pos].GetOrientation(), 20.0f, 20.0f); + champion->SetOrientation(3); + } + } + vChampionJumpTarget.erase(vChampionJumpTarget.begin()+pos); + } + } - for (uint8 i = 0; i < vChampionEntries.size(); ++i) + void SetData(uint32 uiType, uint32 uiData) override + { + switch (uiType) + { + case 0: + SummonChampions((Team)uiData); + break; + case 1: + for (SummonList::iterator i = summons.begin(); i != summons.end(); ++i) { - uint8 pos = urand(0, vChampionJumpTarget.size()-1); - if (Creature* champion = me->SummonCreature(vChampionEntries[i], vChampionJumpOrigin[urand(0, vChampionJumpOrigin.size()-1)], TEMPSUMMON_MANUAL_DESPAWN)) + if (Creature* summon = ObjectAccessor::GetCreature(*me, *i)) { - summons.Summon(champion); - champion->SetReactState(REACT_PASSIVE); - champion->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - champion->SetImmuneToPC(false); - if (playerTeam == ALLIANCE) - { - champion->SetHomePosition(vChampionJumpTarget[pos].GetPositionX(), vChampionJumpTarget[pos].GetPositionY(), vChampionJumpTarget[pos].GetPositionZ(), 0); - champion->GetMotionMaster()->MoveJump(vChampionJumpTarget[pos], 20.0f, 20.0f); - champion->SetOrientation(0); - } - else - { - champion->SetHomePosition((ToCCommonLoc[1].GetPositionX()*2)-vChampionJumpTarget[pos].GetPositionX(), vChampionJumpTarget[pos].GetPositionY(), vChampionJumpTarget[pos].GetPositionZ(), 3); - champion->GetMotionMaster()->MoveJump((ToCCommonLoc[1].GetPositionX() * 2) - vChampionJumpTarget[pos].GetPositionX(), vChampionJumpTarget[pos].GetPositionY(), vChampionJumpTarget[pos].GetPositionZ(), vChampionJumpTarget[pos].GetOrientation(), 20.0f, 20.0f); - champion->SetOrientation(3); - } + summon->SetReactState(REACT_AGGRESSIVE); + summon->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + summon->SetImmuneToPC(false); } - vChampionJumpTarget.erase(vChampionJumpTarget.begin()+pos); } - } - - void SetData(uint32 uiType, uint32 uiData) override - { - switch (uiType) + break; + case 2: + switch (uiData) { - case 0: - SummonChampions((Team)uiData); + case FAIL: + _championsFailed++; + if (_championsFailed + _championsKilled >= summons.size()) + { + instance->SetBossState(DATA_FACTION_CRUSADERS, FAIL); + summons.DespawnAll(); + me->DespawnOrUnsummon(); + } break; - case 1: - for (SummonList::iterator i = summons.begin(); i != summons.end(); ++i) + case IN_PROGRESS: + if (!_inProgress) { - if (Creature* summon = ObjectAccessor::GetCreature(*me, *i)) - { - summon->SetReactState(REACT_AGGRESSIVE); - summon->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - summon->SetImmuneToPC(false); - } + _championsNotStarted = 0; + _championsFailed = 0; + _championsKilled = 0; + _inProgress = true; + summons.DoZoneInCombat(); + instance->SetBossState(DATA_FACTION_CRUSADERS, IN_PROGRESS); } break; - case 2: - switch (uiData) + case DONE: + { + _championsKilled++; + if (_championsKilled == 1) + instance->SetData(DATA_FACTION_CRUSADERS, 0); // Used in Resilience will Fix Achievement + else if (_championsKilled >= summons.size()) { - case FAIL: - _championsFailed++; - if (_championsFailed + _championsKilled >= summons.size()) - { - instance->SetBossState(DATA_FACTION_CRUSADERS, FAIL); - summons.DespawnAll(); - me->DespawnOrUnsummon(); - } - break; - case IN_PROGRESS: - if (!_inProgress) - { - _championsNotStarted = 0; - _championsFailed = 0; - _championsKilled = 0; - _inProgress = true; - summons.DoZoneInCombat(); - instance->SetBossState(DATA_FACTION_CRUSADERS, IN_PROGRESS); - } - break; - case DONE: - { - _championsKilled++; - if (_championsKilled == 1) - instance->SetData(DATA_FACTION_CRUSADERS, 0); // Used in Resilience will Fix Achievement - else if (_championsKilled >= summons.size()) - { - instance->SetBossState(DATA_FACTION_CRUSADERS, DONE); - summons.DespawnAll(); - me->DespawnOrUnsummon(); - } - break; - } - default: - break; + instance->SetBossState(DATA_FACTION_CRUSADERS, DONE); + summons.DespawnAll(); + me->DespawnOrUnsummon(); } break; + } default: break; } - } - private: - uint32 _championsNotStarted; - uint32 _championsFailed; - uint32 _championsKilled; - bool _inProgress; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetTrialOfTheCrusaderAI<boss_toc_champion_controllerAI>(creature); + break; + default: + break; } + } + private: + uint32 _championsNotStarted; + uint32 _championsFailed; + uint32 _championsKilled; + bool _inProgress; }; struct boss_faction_championsAI : public BossAI @@ -751,1675 +740,1454 @@ struct boss_faction_championsAI : public BossAI /******************************************************************** HEALERS ********************************************************************/ -class npc_toc_druid : public CreatureScript +struct npc_toc_druid : public boss_faction_championsAI { - public: - npc_toc_druid() : CreatureScript("npc_toc_druid") { } + npc_toc_druid(Creature* creature) : boss_faction_championsAI(creature, AI_HEALER) { } - struct npc_toc_druidAI : public boss_faction_championsAI - { - npc_toc_druidAI(Creature* creature) : boss_faction_championsAI(creature, AI_HEALER) { } + void Reset() override + { + boss_faction_championsAI::Reset(); + events.ScheduleEvent(EVENT_LIFEBLOOM, 5s, 15s); + events.ScheduleEvent(EVENT_NOURISH, 5s, 15s); + events.ScheduleEvent(EVENT_REGROWTH, 5s, 15s); + events.ScheduleEvent(EVENT_REJUVENATION, 5s, 15s); + events.ScheduleEvent(EVENT_TRANQUILITY, 5s, 20s); + events.ScheduleEvent(EVENT_HEAL_BARKSKIN, 15s, 25s); + events.ScheduleEvent(EVENT_THORNS, 2s); + events.ScheduleEvent(EVENT_NATURE_GRASP, 3s, 20s); + SetEquipmentSlots(false, 51799, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); + } - void Reset() override - { - boss_faction_championsAI::Reset(); - events.ScheduleEvent(EVENT_LIFEBLOOM, 5s, 15s); - events.ScheduleEvent(EVENT_NOURISH, 5s, 15s); - events.ScheduleEvent(EVENT_REGROWTH, 5s, 15s); - events.ScheduleEvent(EVENT_REJUVENATION, 5s, 15s); - events.ScheduleEvent(EVENT_TRANQUILITY, 5s, 20s); - events.ScheduleEvent(EVENT_HEAL_BARKSKIN, 15s, 25s); - events.ScheduleEvent(EVENT_THORNS, 2s); - events.ScheduleEvent(EVENT_NATURE_GRASP, 3s, 20s); - SetEquipmentSlots(false, 51799, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); - } + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + events.Update(diff); + boss_faction_championsAI::UpdateAI(diff); - events.Update(diff); - boss_faction_championsAI::UpdateAI(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - if (me->HasUnitState(UNIT_STATE_CASTING)) + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_LIFEBLOOM: + if (Unit* target = DoSelectLowestHpFriendly(40.0f)) + DoCast(target, SPELL_LIFEBLOOM); + events.ScheduleEvent(EVENT_LIFEBLOOM, 5s, 15s); return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) + case EVENT_NOURISH: + if (Unit* target = DoSelectLowestHpFriendly(40.0f)) + DoCast(target, SPELL_NOURISH); + events.ScheduleEvent(EVENT_NOURISH, 5s, 15s); + return; + case EVENT_REGROWTH: + if (Unit* target = DoSelectLowestHpFriendly(40.0f)) + DoCast(target, SPELL_REGROWTH); + events.ScheduleEvent(EVENT_REGROWTH, 5s, 15s); + return; + case EVENT_REJUVENATION: + if (Unit* target = DoSelectLowestHpFriendly(40.0f)) + DoCast(target, SPELL_REJUVENATION); + events.ScheduleEvent(EVENT_REJUVENATION, 5s, 15s); + return; + case EVENT_TRANQUILITY: + DoCastAOE(SPELL_TRANQUILITY); + events.ScheduleEvent(EVENT_TRANQUILITY, 15s, 40s); + return; + case EVENT_HEAL_BARKSKIN: + if (HealthBelowPct(30)) { - case EVENT_LIFEBLOOM: - if (Unit* target = DoSelectLowestHpFriendly(40.0f)) - DoCast(target, SPELL_LIFEBLOOM); - events.ScheduleEvent(EVENT_LIFEBLOOM, 5s, 15s); - return; - case EVENT_NOURISH: - if (Unit* target = DoSelectLowestHpFriendly(40.0f)) - DoCast(target, SPELL_NOURISH); - events.ScheduleEvent(EVENT_NOURISH, 5s, 15s); - return; - case EVENT_REGROWTH: - if (Unit* target = DoSelectLowestHpFriendly(40.0f)) - DoCast(target, SPELL_REGROWTH); - events.ScheduleEvent(EVENT_REGROWTH, 5s, 15s); - return; - case EVENT_REJUVENATION: - if (Unit* target = DoSelectLowestHpFriendly(40.0f)) - DoCast(target, SPELL_REJUVENATION); - events.ScheduleEvent(EVENT_REJUVENATION, 5s, 15s); - return; - case EVENT_TRANQUILITY: - DoCastAOE(SPELL_TRANQUILITY); - events.ScheduleEvent(EVENT_TRANQUILITY, 15s, 40s); - return; - case EVENT_HEAL_BARKSKIN: - if (HealthBelowPct(30)) - { - DoCast(me, SPELL_BARKSKIN); - events.RescheduleEvent(EVENT_HEAL_BARKSKIN, 60s); - } - else - events.RescheduleEvent(EVENT_HEAL_BARKSKIN, 3s); - return; - case EVENT_THORNS: - if (Creature* target = SelectRandomFriendlyMissingBuff(SPELL_THORNS)) - DoCast(target, SPELL_THORNS); - events.ScheduleEvent(EVENT_THORNS, 25s, 40s); - return; - case EVENT_NATURE_GRASP: - DoCast(me, SPELL_NATURE_GRASP); - events.ScheduleEvent(EVENT_NATURE_GRASP, 1min); - return; - default: - return; + DoCast(me, SPELL_BARKSKIN); + events.RescheduleEvent(EVENT_HEAL_BARKSKIN, 60s); } - } + else + events.RescheduleEvent(EVENT_HEAL_BARKSKIN, 3s); + return; + case EVENT_THORNS: + if (Creature* target = SelectRandomFriendlyMissingBuff(SPELL_THORNS)) + DoCast(target, SPELL_THORNS); + events.ScheduleEvent(EVENT_THORNS, 25s, 40s); + return; + case EVENT_NATURE_GRASP: + DoCast(me, SPELL_NATURE_GRASP); + events.ScheduleEvent(EVENT_NATURE_GRASP, 1min); + return; + default: + return; } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetTrialOfTheCrusaderAI<npc_toc_druidAI>(creature); } + } }; -class npc_toc_shaman : public CreatureScript +struct npc_toc_shaman : public boss_faction_championsAI { - public: - npc_toc_shaman() : CreatureScript("npc_toc_shaman") { } + npc_toc_shaman(Creature* creature) : boss_faction_championsAI(creature, AI_HEALER) { } - struct npc_toc_shamanAI : public boss_faction_championsAI - { - npc_toc_shamanAI(Creature* creature) : boss_faction_championsAI(creature, AI_HEALER) { } + void Reset() override + { + boss_faction_championsAI::Reset(); + events.ScheduleEvent(EVENT_HEALING_WAVE, 5s, 10s); + events.ScheduleEvent(EVENT_RIPTIDE, 5s, 20s); + events.ScheduleEvent(EVENT_SPIRIT_CLEANSE, 15s, 25s); + events.ScheduleEvent(EVENT_HEAL_BLOODLUST_HEROISM, 20s); + events.ScheduleEvent(EVENT_HEX, 5s, 30s); + events.ScheduleEvent(EVENT_EARTH_SHIELD, 1s); + events.ScheduleEvent(EVENT_HEAL_EARTH_SHOCK, 5s, 30s); + SetEquipmentSlots(false, 49992, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); + } - void Reset() override - { - boss_faction_championsAI::Reset(); - events.ScheduleEvent(EVENT_HEALING_WAVE, 5s, 10s); - events.ScheduleEvent(EVENT_RIPTIDE, 5s, 20s); - events.ScheduleEvent(EVENT_SPIRIT_CLEANSE, 15s, 25s); - events.ScheduleEvent(EVENT_HEAL_BLOODLUST_HEROISM, 20s); - events.ScheduleEvent(EVENT_HEX, 5s, 30s); - events.ScheduleEvent(EVENT_EARTH_SHIELD, 1s); - events.ScheduleEvent(EVENT_HEAL_EARTH_SHOCK, 5s, 30s); - SetEquipmentSlots(false, 49992, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); - } + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + events.Update(diff); + boss_faction_championsAI::UpdateAI(diff); - events.Update(diff); - boss_faction_championsAI::UpdateAI(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - if (me->HasUnitState(UNIT_STATE_CASTING)) + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_HEALING_WAVE: + if (Unit* target = DoSelectLowestHpFriendly(40.0f)) + DoCast(target, SPELL_HEALING_WAVE); + events.ScheduleEvent(EVENT_HEALING_WAVE, 3s, 5s); return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) + case EVENT_RIPTIDE: + if (Unit* target = DoSelectLowestHpFriendly(40.0f)) + DoCast(target, SPELL_RIPTIDE); + events.ScheduleEvent(EVENT_RIPTIDE, 5s, 15s); + return; + case EVENT_SPIRIT_CLEANSE: + if (Unit* target = DoSelectLowestHpFriendly(40.0f)) + DoCast(target, SPELL_SPIRIT_CLEANSE); + events.ScheduleEvent(EVENT_SPIRIT_CLEANSE, 15s, 35s); + return; + case EVENT_HEAL_BLOODLUST_HEROISM: + if (me->GetFaction()) // alliance = 1 { - case EVENT_HEALING_WAVE: - if (Unit* target = DoSelectLowestHpFriendly(40.0f)) - DoCast(target, SPELL_HEALING_WAVE); - events.ScheduleEvent(EVENT_HEALING_WAVE, 3s, 5s); - return; - case EVENT_RIPTIDE: - if (Unit* target = DoSelectLowestHpFriendly(40.0f)) - DoCast(target, SPELL_RIPTIDE); - events.ScheduleEvent(EVENT_RIPTIDE, 5s, 15s); - return; - case EVENT_SPIRIT_CLEANSE: - if (Unit* target = DoSelectLowestHpFriendly(40.0f)) - DoCast(target, SPELL_SPIRIT_CLEANSE); - events.ScheduleEvent(EVENT_SPIRIT_CLEANSE, 15s, 35s); - return; - case EVENT_HEAL_BLOODLUST_HEROISM: - if (me->GetFaction()) // alliance = 1 - { - if (!me->HasAura(AURA_EXHAUSTION)) - DoCastAOE(SPELL_HEROISM); - } - else - { - if (!me->HasAura(AURA_SATED)) - DoCastAOE(SPELL_BLOODLUST); - } - events.ScheduleEvent(EVENT_HEAL_BLOODLUST_HEROISM, 5min); - return; - case EVENT_HEX: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, NonTankTargetSelector(me))) - DoCast(target, SPELL_HEX); - events.ScheduleEvent(EVENT_HEX, 15s, 30s); - return; - case EVENT_EARTH_SHIELD: - if (Creature* target = SelectRandomFriendlyMissingBuff(SPELL_EARTH_SHIELD)) - DoCast(target, SPELL_EARTH_SHIELD); - events.ScheduleEvent(EVENT_EARTH_SHIELD, 15s, 30s); - return; - case EVENT_HEAL_EARTH_SHOCK: - if (Unit* target = SelectEnemyCaster(true)) - DoCast(target, SPELL_EARTH_SHOCK); - events.ScheduleEvent(EVENT_HEAL_EARTH_SHOCK, 10s, 20s); - return; - default: - return; + if (!me->HasAura(AURA_EXHAUSTION)) + DoCastAOE(SPELL_HEROISM); } - } + else + { + if (!me->HasAura(AURA_SATED)) + DoCastAOE(SPELL_BLOODLUST); + } + events.ScheduleEvent(EVENT_HEAL_BLOODLUST_HEROISM, 5min); + return; + case EVENT_HEX: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, NonTankTargetSelector(me))) + DoCast(target, SPELL_HEX); + events.ScheduleEvent(EVENT_HEX, 15s, 30s); + return; + case EVENT_EARTH_SHIELD: + if (Creature* target = SelectRandomFriendlyMissingBuff(SPELL_EARTH_SHIELD)) + DoCast(target, SPELL_EARTH_SHIELD); + events.ScheduleEvent(EVENT_EARTH_SHIELD, 15s, 30s); + return; + case EVENT_HEAL_EARTH_SHOCK: + if (Unit* target = SelectEnemyCaster(true)) + DoCast(target, SPELL_EARTH_SHOCK); + events.ScheduleEvent(EVENT_HEAL_EARTH_SHOCK, 10s, 20s); + return; + default: + return; } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetTrialOfTheCrusaderAI<npc_toc_shamanAI>(creature); } + } }; -class npc_toc_paladin : public CreatureScript +struct npc_toc_paladin : public boss_faction_championsAI { - public: - npc_toc_paladin() : CreatureScript("npc_toc_paladin") { } + npc_toc_paladin(Creature* creature) : boss_faction_championsAI(creature, AI_HEALER) { } - struct npc_toc_paladinAI : public boss_faction_championsAI - { - npc_toc_paladinAI(Creature* creature) : boss_faction_championsAI(creature, AI_HEALER) { } + void Reset() override + { + boss_faction_championsAI::Reset(); + events.ScheduleEvent(EVENT_HAND_OF_FREEDOM, 10s, 20s); + events.ScheduleEvent(EVENT_HEAL_DIVINE_SHIELD, 20s); + events.ScheduleEvent(EVENT_CLEANSE, 20s, 30s); + events.ScheduleEvent(EVENT_FLASH_OF_LIGHT, 5s, 10s); + events.ScheduleEvent(EVENT_HOLY_LIGHT, 10s, 15s); + events.ScheduleEvent(EVENT_HOLY_SHOCK, 10s, 15s); + events.ScheduleEvent(EVENT_HEAL_HAND_OF_PROTECTION, 30s, 60s); + events.ScheduleEvent(EVENT_HAMMER_OF_JUSTICE, 10s, 30s); + SetEquipmentSlots(false, 50771, 47079, EQUIP_NO_CHANGE); + } - void Reset() override - { - boss_faction_championsAI::Reset(); - events.ScheduleEvent(EVENT_HAND_OF_FREEDOM, 10s, 20s); - events.ScheduleEvent(EVENT_HEAL_DIVINE_SHIELD, 20s); - events.ScheduleEvent(EVENT_CLEANSE, 20s, 30s); - events.ScheduleEvent(EVENT_FLASH_OF_LIGHT, 5s, 10s); - events.ScheduleEvent(EVENT_HOLY_LIGHT, 10s, 15s); - events.ScheduleEvent(EVENT_HOLY_SHOCK, 10s, 15s); - events.ScheduleEvent(EVENT_HEAL_HAND_OF_PROTECTION, 30s, 60s); - events.ScheduleEvent(EVENT_HAMMER_OF_JUSTICE, 10s, 30s); - SetEquipmentSlots(false, 50771, 47079, EQUIP_NO_CHANGE); - } + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + events.Update(diff); + boss_faction_championsAI::UpdateAI(diff); - events.Update(diff); - boss_faction_championsAI::UpdateAI(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - if (me->HasUnitState(UNIT_STATE_CASTING)) + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_HAND_OF_FREEDOM: + if (Unit* target = SelectRandomFriendlyMissingBuff(SPELL_HAND_OF_FREEDOM)) + DoCast(target, SPELL_HAND_OF_FREEDOM); + events.ScheduleEvent(EVENT_HAND_OF_FREEDOM, 15s, 35s); return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) + case EVENT_HEAL_DIVINE_SHIELD: + if (HealthBelowPct(30) && !me->HasAura(SPELL_FORBEARANCE)) { - case EVENT_HAND_OF_FREEDOM: - if (Unit* target = SelectRandomFriendlyMissingBuff(SPELL_HAND_OF_FREEDOM)) - DoCast(target, SPELL_HAND_OF_FREEDOM); - events.ScheduleEvent(EVENT_HAND_OF_FREEDOM, 15s, 35s); - return; - case EVENT_HEAL_DIVINE_SHIELD: - if (HealthBelowPct(30) && !me->HasAura(SPELL_FORBEARANCE)) - { - DoCast(me, SPELL_DIVINE_SHIELD); - events.RescheduleEvent(EVENT_HEAL_DIVINE_SHIELD, 5min); - } - else - events.RescheduleEvent(EVENT_HEAL_DIVINE_SHIELD, 5s); - return; - case EVENT_CLEANSE: - if (Unit* target = DoSelectLowestHpFriendly(40.0f)) - DoCast(target, SPELL_CLEANSE); - events.ScheduleEvent(EVENT_CLEANSE, 10s, 30s); - return; - case EVENT_FLASH_OF_LIGHT: - if (Unit* target = DoSelectLowestHpFriendly(40.0f)) - DoCast(target, SPELL_FLASH_OF_LIGHT); - events.ScheduleEvent(EVENT_FLASH_OF_LIGHT, 3s, 5s); - return; - case EVENT_HOLY_LIGHT: - if (Unit* target = DoSelectLowestHpFriendly(40.0f)) - DoCast(target, SPELL_HOLY_LIGHT); - events.ScheduleEvent(EVENT_HOLY_LIGHT, 5s, 10s); - return; - case EVENT_HOLY_SHOCK: - if (Unit* target = DoSelectLowestHpFriendly(40.0f)) - DoCast(target, SPELL_HOLY_SHOCK); - events.ScheduleEvent(EVENT_HOLY_SHOCK, 10s, 15s); - return; - case EVENT_HEAL_HAND_OF_PROTECTION: - if (Unit* target = DoSelectLowestHpFriendly(30.0f)) - { - if (!target->HasAura(SPELL_FORBEARANCE)) - { - DoCast(target, SPELL_HAND_OF_PROTECTION); - events.RescheduleEvent(EVENT_HEAL_HAND_OF_PROTECTION, 5min); - } - else - events.RescheduleEvent(EVENT_HEAL_HAND_OF_PROTECTION, 3s); - } - else - events.RescheduleEvent(EVENT_HEAL_HAND_OF_PROTECTION, 10s); - return; - case EVENT_HAMMER_OF_JUSTICE: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 15.0f, true)) - DoCast(target, SPELL_HAMMER_OF_JUSTICE); - events.ScheduleEvent(EVENT_HAMMER_OF_JUSTICE, 40s); - return; - default: - return; + DoCast(me, SPELL_DIVINE_SHIELD); + events.RescheduleEvent(EVENT_HEAL_DIVINE_SHIELD, 5min); } - } + else + events.RescheduleEvent(EVENT_HEAL_DIVINE_SHIELD, 5s); + return; + case EVENT_CLEANSE: + if (Unit* target = DoSelectLowestHpFriendly(40.0f)) + DoCast(target, SPELL_CLEANSE); + events.ScheduleEvent(EVENT_CLEANSE, 10s, 30s); + return; + case EVENT_FLASH_OF_LIGHT: + if (Unit* target = DoSelectLowestHpFriendly(40.0f)) + DoCast(target, SPELL_FLASH_OF_LIGHT); + events.ScheduleEvent(EVENT_FLASH_OF_LIGHT, 3s, 5s); + return; + case EVENT_HOLY_LIGHT: + if (Unit* target = DoSelectLowestHpFriendly(40.0f)) + DoCast(target, SPELL_HOLY_LIGHT); + events.ScheduleEvent(EVENT_HOLY_LIGHT, 5s, 10s); + return; + case EVENT_HOLY_SHOCK: + if (Unit* target = DoSelectLowestHpFriendly(40.0f)) + DoCast(target, SPELL_HOLY_SHOCK); + events.ScheduleEvent(EVENT_HOLY_SHOCK, 10s, 15s); + return; + case EVENT_HEAL_HAND_OF_PROTECTION: + if (Unit* target = DoSelectLowestHpFriendly(30.0f)) + { + if (!target->HasAura(SPELL_FORBEARANCE)) + { + DoCast(target, SPELL_HAND_OF_PROTECTION); + events.RescheduleEvent(EVENT_HEAL_HAND_OF_PROTECTION, 5min); + } + else + events.RescheduleEvent(EVENT_HEAL_HAND_OF_PROTECTION, 3s); + } + else + events.RescheduleEvent(EVENT_HEAL_HAND_OF_PROTECTION, 10s); + return; + case EVENT_HAMMER_OF_JUSTICE: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 15.0f, true)) + DoCast(target, SPELL_HAMMER_OF_JUSTICE); + events.ScheduleEvent(EVENT_HAMMER_OF_JUSTICE, 40s); + return; + default: + return; } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetTrialOfTheCrusaderAI<npc_toc_paladinAI>(creature); } + } }; -class npc_toc_priest : public CreatureScript +struct npc_toc_priest : public boss_faction_championsAI { - public: - npc_toc_priest() : CreatureScript("npc_toc_priest") { } + npc_toc_priest(Creature* creature) : boss_faction_championsAI(creature, AI_HEALER) { } - struct npc_toc_priestAI : public boss_faction_championsAI - { - npc_toc_priestAI(Creature* creature) : boss_faction_championsAI(creature, AI_HEALER) { } + void Reset() override + { + boss_faction_championsAI::Reset(); + events.ScheduleEvent(EVENT_RENEW, 3s, 10s); + events.ScheduleEvent(EVENT_SHIELD, 5s, 15s); + events.ScheduleEvent(EVENT_FLASH_HEAL, 5s, 10s); + events.ScheduleEvent(EVENT_HEAL_DISPEL, 10s, 20s); + events.ScheduleEvent(EVENT_HEAL_PSYCHIC_SCREAM, 10s, 30s); + events.ScheduleEvent(EVENT_MANA_BURN, 15s, 30s); + events.ScheduleEvent(EVENT_PENANCE, 10s, 20s); + SetEquipmentSlots(false, 49992, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); + } - void Reset() override - { - boss_faction_championsAI::Reset(); - events.ScheduleEvent(EVENT_RENEW, 3s, 10s); - events.ScheduleEvent(EVENT_SHIELD, 5s, 15s); - events.ScheduleEvent(EVENT_FLASH_HEAL, 5s, 10s); - events.ScheduleEvent(EVENT_HEAL_DISPEL, 10s, 20s); - events.ScheduleEvent(EVENT_HEAL_PSYCHIC_SCREAM, 10s, 30s); - events.ScheduleEvent(EVENT_MANA_BURN, 15s, 30s); - events.ScheduleEvent(EVENT_PENANCE, 10s, 20s); - SetEquipmentSlots(false, 49992, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); - } + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + events.Update(diff); + boss_faction_championsAI::UpdateAI(diff); - events.Update(diff); - boss_faction_championsAI::UpdateAI(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - if (me->HasUnitState(UNIT_STATE_CASTING)) + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_RENEW: + if (Unit* target = DoSelectLowestHpFriendly(40.0f)) + DoCast(target, SPELL_RENEW); + events.ScheduleEvent(EVENT_RENEW, 3s, 5s); + return; + case EVENT_SHIELD: + if (Unit* target = DoSelectLowestHpFriendly(40.0f)) + DoCast(target, SPELL_SHIELD); + events.ScheduleEvent(EVENT_SHIELD, 15s, 35s); + return; + case EVENT_FLASH_HEAL: + if (Unit* target = DoSelectLowestHpFriendly(40.0f)) + DoCast(target, SPELL_FLASH_HEAL); + events.ScheduleEvent(EVENT_FLASH_HEAL, 3s, 5s); + return; + case EVENT_HEAL_DISPEL: + if (Unit* target = urand(0, 1) ? SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true) : DoSelectLowestHpFriendly(40.0f)) + DoCast(target, SPELL_DISPEL); + events.ScheduleEvent(EVENT_HEAL_DISPEL, 10s, 20s); + return; + case EVENT_HEAL_PSYCHIC_SCREAM: + if (EnemiesInRange(10.0f) >= 2) + DoCastAOE(SPELL_PSYCHIC_SCREAM); + events.ScheduleEvent(EVENT_HEAL_PSYCHIC_SCREAM, 10s, 25s); + return; + case EVENT_MANA_BURN: + if (Unit* target = SelectEnemyCaster(false)) + DoCast(target, SPELL_MANA_BURN); + events.ScheduleEvent(EVENT_MANA_BURN, 15s, 30s); + return; + case EVENT_PENANCE: + if (Unit* target = DoSelectLowestHpFriendly(40.0f)) + DoCast(target, SPELL_PENANCE); + events.ScheduleEvent(EVENT_PENANCE, 10s, 20s); + return; + default: return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_RENEW: - if (Unit* target = DoSelectLowestHpFriendly(40.0f)) - DoCast(target, SPELL_RENEW); - events.ScheduleEvent(EVENT_RENEW, 3s, 5s); - return; - case EVENT_SHIELD: - if (Unit* target = DoSelectLowestHpFriendly(40.0f)) - DoCast(target, SPELL_SHIELD); - events.ScheduleEvent(EVENT_SHIELD, 15s, 35s); - return; - case EVENT_FLASH_HEAL: - if (Unit* target = DoSelectLowestHpFriendly(40.0f)) - DoCast(target, SPELL_FLASH_HEAL); - events.ScheduleEvent(EVENT_FLASH_HEAL, 3s, 5s); - return; - case EVENT_HEAL_DISPEL: - if (Unit* target = urand(0, 1) ? SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true) : DoSelectLowestHpFriendly(40.0f)) - DoCast(target, SPELL_DISPEL); - events.ScheduleEvent(EVENT_HEAL_DISPEL, 10s, 20s); - return; - case EVENT_HEAL_PSYCHIC_SCREAM: - if (EnemiesInRange(10.0f) >= 2) - DoCastAOE(SPELL_PSYCHIC_SCREAM); - events.ScheduleEvent(EVENT_HEAL_PSYCHIC_SCREAM, 10s, 25s); - return; - case EVENT_MANA_BURN: - if (Unit* target = SelectEnemyCaster(false)) - DoCast(target, SPELL_MANA_BURN); - events.ScheduleEvent(EVENT_MANA_BURN, 15s, 30s); - return; - case EVENT_PENANCE: - if (Unit* target = DoSelectLowestHpFriendly(40.0f)) - DoCast(target, SPELL_PENANCE); - events.ScheduleEvent(EVENT_PENANCE, 10s, 20s); - return; - default: - return; - } - } } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetTrialOfTheCrusaderAI<npc_toc_priestAI>(creature); } + } }; /******************************************************************** RANGED ********************************************************************/ -class npc_toc_shadow_priest : public CreatureScript +struct npc_toc_shadow_priest : public boss_faction_championsAI { - public: - npc_toc_shadow_priest() : CreatureScript("npc_toc_shadow_priest") { } + npc_toc_shadow_priest(Creature* creature) : boss_faction_championsAI(creature, AI_RANGED) { } - struct npc_toc_shadow_priestAI : public boss_faction_championsAI - { - npc_toc_shadow_priestAI(Creature* creature) : boss_faction_championsAI(creature, AI_RANGED) { } + void Reset() override + { + boss_faction_championsAI::Reset(); + events.ScheduleEvent(EVENT_SILENCE, 10s, 25s); + events.ScheduleEvent(EVENT_VAMPIRIC_TOUCH, 5s, 15s); + events.ScheduleEvent(EVENT_SW_PAIN, 3s, 10s); + events.ScheduleEvent(EVENT_MIND_BLAST, 5s, 15s); + events.ScheduleEvent(EVENT_HORROR, 10s, 25s); + events.ScheduleEvent(EVENT_DISPERSION, 20s, 40s); + events.ScheduleEvent(EVENT_DPS_DISPEL, 10s, 20s); + events.ScheduleEvent(EVENT_DPS_PSYCHIC_SCREAM, 10s, 30s); + SetEquipmentSlots(false, 50040, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); + DoCast(me, SPELL_SHADOWFORM); + } - void Reset() override - { - boss_faction_championsAI::Reset(); - events.ScheduleEvent(EVENT_SILENCE, 10s, 25s); - events.ScheduleEvent(EVENT_VAMPIRIC_TOUCH, 5s, 15s); - events.ScheduleEvent(EVENT_SW_PAIN, 3s, 10s); - events.ScheduleEvent(EVENT_MIND_BLAST, 5s, 15s); - events.ScheduleEvent(EVENT_HORROR, 10s, 25s); - events.ScheduleEvent(EVENT_DISPERSION, 20s, 40s); - events.ScheduleEvent(EVENT_DPS_DISPEL, 10s, 20s); - events.ScheduleEvent(EVENT_DPS_PSYCHIC_SCREAM, 10s, 30s); - SetEquipmentSlots(false, 50040, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); - DoCast(me, SPELL_SHADOWFORM); - } + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + events.Update(diff); + boss_faction_championsAI::UpdateAI(diff); - events.Update(diff); - boss_faction_championsAI::UpdateAI(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - if (me->HasUnitState(UNIT_STATE_CASTING)) + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_SILENCE: + if (Unit* target = SelectEnemyCaster(true)) + DoCast(target, SPELL_SILENCE); + events.ScheduleEvent(EVENT_SILENCE, 10s, 25s); return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) + case EVENT_VAMPIRIC_TOUCH: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true)) + DoCast(target, SPELL_VAMPIRIC_TOUCH); + events.ScheduleEvent(EVENT_VAMPIRIC_TOUCH, 10s, 35s); + return; + case EVENT_SW_PAIN: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true)) + DoCast(target, SPELL_SW_PAIN); + events.ScheduleEvent(EVENT_SW_PAIN, 10s, 35s); + return; + case EVENT_MIND_BLAST: + DoCastVictim(SPELL_MIND_BLAST); + events.ScheduleEvent(EVENT_MIND_BLAST, 10s, 20s); + return; + case EVENT_HORROR: + DoCastVictim(SPELL_HORROR); + events.ScheduleEvent(EVENT_HORROR, 15s, 35s); + return; + case EVENT_DISPERSION: + if (HealthBelowPct(40)) { - case EVENT_SILENCE: - if (Unit* target = SelectEnemyCaster(true)) - DoCast(target, SPELL_SILENCE); - events.ScheduleEvent(EVENT_SILENCE, 10s, 25s); - return; - case EVENT_VAMPIRIC_TOUCH: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true)) - DoCast(target, SPELL_VAMPIRIC_TOUCH); - events.ScheduleEvent(EVENT_VAMPIRIC_TOUCH, 10s, 35s); - return; - case EVENT_SW_PAIN: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true)) - DoCast(target, SPELL_SW_PAIN); - events.ScheduleEvent(EVENT_SW_PAIN, 10s, 35s); - return; - case EVENT_MIND_BLAST: - DoCastVictim(SPELL_MIND_BLAST); - events.ScheduleEvent(EVENT_MIND_BLAST, 10s, 20s); - return; - case EVENT_HORROR: - DoCastVictim(SPELL_HORROR); - events.ScheduleEvent(EVENT_HORROR, 15s, 35s); - return; - case EVENT_DISPERSION: - if (HealthBelowPct(40)) - { - DoCast(me, SPELL_DISPERSION); - events.RescheduleEvent(EVENT_DISPERSION, 180s); - } - else - events.RescheduleEvent(EVENT_DISPERSION, 5s); - return; - case EVENT_DPS_DISPEL: - if (Unit* target = urand(0, 1) ? SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true) : DoSelectLowestHpFriendly(40.0f)) - DoCast(target, SPELL_DISPEL); - events.ScheduleEvent(EVENT_DPS_DISPEL, 10s, 20s); - return; - case EVENT_DPS_PSYCHIC_SCREAM: - if (EnemiesInRange(10.0f) >= 2) - DoCastAOE(SPELL_PSYCHIC_SCREAM); - events.ScheduleEvent(EVENT_DPS_PSYCHIC_SCREAM, 10s, 25s); - return; - default: - return; + DoCast(me, SPELL_DISPERSION); + events.RescheduleEvent(EVENT_DISPERSION, 180s); } - } - DoSpellAttackIfReady(SPELL_MIND_FLAY); + else + events.RescheduleEvent(EVENT_DISPERSION, 5s); + return; + case EVENT_DPS_DISPEL: + if (Unit* target = urand(0, 1) ? SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true) : DoSelectLowestHpFriendly(40.0f)) + DoCast(target, SPELL_DISPEL); + events.ScheduleEvent(EVENT_DPS_DISPEL, 10s, 20s); + return; + case EVENT_DPS_PSYCHIC_SCREAM: + if (EnemiesInRange(10.0f) >= 2) + DoCastAOE(SPELL_PSYCHIC_SCREAM); + events.ScheduleEvent(EVENT_DPS_PSYCHIC_SCREAM, 10s, 25s); + return; + default: + return; } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetTrialOfTheCrusaderAI<npc_toc_shadow_priestAI>(creature); } + DoSpellAttackIfReady(SPELL_MIND_FLAY); + } }; -class npc_toc_warlock : public CreatureScript +struct npc_toc_warlock : public boss_faction_championsAI { - public: - npc_toc_warlock() : CreatureScript("npc_toc_warlock") { } + npc_toc_warlock(Creature* creature) : boss_faction_championsAI(creature, AI_RANGED) { } - struct npc_toc_warlockAI : public boss_faction_championsAI - { - npc_toc_warlockAI(Creature* creature) : boss_faction_championsAI(creature, AI_RANGED) { } + void Reset() override + { + boss_faction_championsAI::Reset(); + events.ScheduleEvent(EVENT_HELLFIRE, 10s, 30s); + events.ScheduleEvent(EVENT_CORRUPTION, 2s, 5s); + events.ScheduleEvent(EVENT_CURSE_OF_AGONY, 5s, 10s); + events.ScheduleEvent(EVENT_CURSE_OF_EXHAUSTION, 5s, 10s); + events.ScheduleEvent(EVENT_FEAR, 5s, 15s); + events.ScheduleEvent(EVENT_SEARING_PAIN, 5s, 12s); + events.ScheduleEvent(EVENT_UNSTABLE_AFFLICTION, 7s, 15s); + SetEquipmentSlots(false, 49992, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); + } - void Reset() override - { - boss_faction_championsAI::Reset(); - events.ScheduleEvent(EVENT_HELLFIRE, 10s, 30s); - events.ScheduleEvent(EVENT_CORRUPTION, 2s, 5s); - events.ScheduleEvent(EVENT_CURSE_OF_AGONY, 5s, 10s); - events.ScheduleEvent(EVENT_CURSE_OF_EXHAUSTION, 5s, 10s); - events.ScheduleEvent(EVENT_FEAR, 5s, 15s); - events.ScheduleEvent(EVENT_SEARING_PAIN, 5s, 12s); - events.ScheduleEvent(EVENT_UNSTABLE_AFFLICTION, 7s, 15s); - SetEquipmentSlots(false, 49992, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); - } + void JustEngagedWith(Unit* who) override + { + boss_faction_championsAI::JustEngagedWith(who); + DoCast(SPELL_SUMMON_FELHUNTER); + } - void JustEngagedWith(Unit* who) override - { - boss_faction_championsAI::JustEngagedWith(who); - DoCast(SPELL_SUMMON_FELHUNTER); - } + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + events.Update(diff); + boss_faction_championsAI::UpdateAI(diff); - events.Update(diff); - boss_faction_championsAI::UpdateAI(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - if (me->HasUnitState(UNIT_STATE_CASTING)) + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_HELLFIRE: + if (EnemiesInRange(10.0f) >= 2) + DoCastAOE(SPELL_HELLFIRE); + events.ScheduleEvent(EVENT_HELLFIRE, 10s, 30s); + return; + case EVENT_CORRUPTION: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f)) + DoCast(target, SPELL_CORRUPTION); + events.ScheduleEvent(EVENT_CORRUPTION, 15s, 25s); + return; + case EVENT_CURSE_OF_AGONY: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f)) + DoCast(target, SPELL_CURSE_OF_AGONY); + events.ScheduleEvent(EVENT_CURSE_OF_AGONY, 20s, 35s); + return; + case EVENT_CURSE_OF_EXHAUSTION: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f)) + DoCast(target, SPELL_CURSE_OF_EXHAUSTION); + events.ScheduleEvent(EVENT_CURSE_OF_EXHAUSTION, 20s, 35s); + return; + case EVENT_FEAR: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 20.0f, true)) + DoCast(target, SPELL_FEAR); + events.ScheduleEvent(EVENT_FEAR, 5s, 20s); + return; + case EVENT_SEARING_PAIN: + DoCastVictim(SPELL_SEARING_PAIN); + events.ScheduleEvent(EVENT_SEARING_PAIN, 10s, 25s); + return; + case EVENT_UNSTABLE_AFFLICTION: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true)) + DoCast(target, SPELL_UNSTABLE_AFFLICTION); + events.ScheduleEvent(EVENT_UNSTABLE_AFFLICTION, 10s, 25s); + return; + default: return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_HELLFIRE: - if (EnemiesInRange(10.0f) >= 2) - DoCastAOE(SPELL_HELLFIRE); - events.ScheduleEvent(EVENT_HELLFIRE, 10s, 30s); - return; - case EVENT_CORRUPTION: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f)) - DoCast(target, SPELL_CORRUPTION); - events.ScheduleEvent(EVENT_CORRUPTION, 15s, 25s); - return; - case EVENT_CURSE_OF_AGONY: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f)) - DoCast(target, SPELL_CURSE_OF_AGONY); - events.ScheduleEvent(EVENT_CURSE_OF_AGONY, 20s, 35s); - return; - case EVENT_CURSE_OF_EXHAUSTION: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f)) - DoCast(target, SPELL_CURSE_OF_EXHAUSTION); - events.ScheduleEvent(EVENT_CURSE_OF_EXHAUSTION, 20s, 35s); - return; - case EVENT_FEAR: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 20.0f, true)) - DoCast(target, SPELL_FEAR); - events.ScheduleEvent(EVENT_FEAR, 5s, 20s); - return; - case EVENT_SEARING_PAIN: - DoCastVictim(SPELL_SEARING_PAIN); - events.ScheduleEvent(EVENT_SEARING_PAIN, 10s, 25s); - return; - case EVENT_UNSTABLE_AFFLICTION: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true)) - DoCast(target, SPELL_UNSTABLE_AFFLICTION); - events.ScheduleEvent(EVENT_UNSTABLE_AFFLICTION, 10s, 25s); - return; - default: - return; - } - } - DoSpellAttackIfReady(SPELL_SHADOW_BOLT); } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetTrialOfTheCrusaderAI<npc_toc_warlockAI>(creature); } + DoSpellAttackIfReady(SPELL_SHADOW_BOLT); + } }; -class npc_toc_mage : public CreatureScript +struct npc_toc_mage : public boss_faction_championsAI { - public: - npc_toc_mage() : CreatureScript("npc_toc_mage") { } + npc_toc_mage(Creature* creature) : boss_faction_championsAI(creature, AI_RANGED) { } - struct npc_toc_mageAI : public boss_faction_championsAI - { - npc_toc_mageAI(Creature* creature) : boss_faction_championsAI(creature, AI_RANGED) { } + void Reset() override + { + boss_faction_championsAI::Reset(); + events.ScheduleEvent(EVENT_ARCANE_BARRAGE, 1s, 5s); + events.ScheduleEvent(EVENT_ARCANE_BLAST, 3s, 5s); + events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, 5s, 15s); + events.ScheduleEvent(EVENT_BLINK, 15s, 20s); + events.ScheduleEvent(EVENT_COUNTERSPELL, 10s, 20s); + events.ScheduleEvent(EVENT_FROST_NOVA, 5s, 20s); + events.ScheduleEvent(EVENT_ICE_BLOCK, 10s, 20s); + events.ScheduleEvent(EVENT_POLYMORPH, 5s, 15s); + SetEquipmentSlots(false, 47524, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); + } - void Reset() override - { - boss_faction_championsAI::Reset(); - events.ScheduleEvent(EVENT_ARCANE_BARRAGE, 1s, 5s); - events.ScheduleEvent(EVENT_ARCANE_BLAST, 3s, 5s); - events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, 5s, 15s); - events.ScheduleEvent(EVENT_BLINK, 15s, 20s); - events.ScheduleEvent(EVENT_COUNTERSPELL, 10s, 20s); - events.ScheduleEvent(EVENT_FROST_NOVA, 5s, 20s); - events.ScheduleEvent(EVENT_ICE_BLOCK, 10s, 20s); - events.ScheduleEvent(EVENT_POLYMORPH, 5s, 15s); - SetEquipmentSlots(false, 47524, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); - } + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + events.Update(diff); + boss_faction_championsAI::UpdateAI(diff); - events.Update(diff); - boss_faction_championsAI::UpdateAI(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - if (me->HasUnitState(UNIT_STATE_CASTING)) + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_ARCANE_BARRAGE: + DoCastVictim(SPELL_ARCANE_BARRAGE); + events.ScheduleEvent(EVENT_ARCANE_BARRAGE, 5s, 7s); return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) + case EVENT_ARCANE_BLAST: + DoCastVictim(SPELL_ARCANE_BLAST); + events.ScheduleEvent(EVENT_ARCANE_BLAST, 5s, 15s); + return; + case EVENT_ARCANE_EXPLOSION: + if (EnemiesInRange(10.0f) >= 2) + DoCastAOE(SPELL_ARCANE_EXPLOSION); + events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, 10s, 30s); + return; + case EVENT_BLINK: + if (EnemiesInRange(10.0f) >= 2) + DoCast(SPELL_BLINK); + events.ScheduleEvent(EVENT_BLINK, 10s, 30s); + return; + case EVENT_COUNTERSPELL: + if (Unit* target = SelectEnemyCaster(true)) + DoCast(target, SPELL_COUNTERSPELL); + events.ScheduleEvent(EVENT_COUNTERSPELL, 24s); + return; + case EVENT_FROST_NOVA: + if (EnemiesInRange(10.0f) >= 2) + DoCastAOE(SPELL_FROST_NOVA); + events.ScheduleEvent(EVENT_FROST_NOVA, 25s); + return; + case EVENT_ICE_BLOCK: + if (HealthBelowPct(30)) { - case EVENT_ARCANE_BARRAGE: - DoCastVictim(SPELL_ARCANE_BARRAGE); - events.ScheduleEvent(EVENT_ARCANE_BARRAGE, 5s, 7s); - return; - case EVENT_ARCANE_BLAST: - DoCastVictim(SPELL_ARCANE_BLAST); - events.ScheduleEvent(EVENT_ARCANE_BLAST, 5s, 15s); - return; - case EVENT_ARCANE_EXPLOSION: - if (EnemiesInRange(10.0f) >= 2) - DoCastAOE(SPELL_ARCANE_EXPLOSION); - events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, 10s, 30s); - return; - case EVENT_BLINK: - if (EnemiesInRange(10.0f) >= 2) - DoCast(SPELL_BLINK); - events.ScheduleEvent(EVENT_BLINK, 10s, 30s); - return; - case EVENT_COUNTERSPELL: - if (Unit* target = SelectEnemyCaster(true)) - DoCast(target, SPELL_COUNTERSPELL); - events.ScheduleEvent(EVENT_COUNTERSPELL, 24s); - return; - case EVENT_FROST_NOVA: - if (EnemiesInRange(10.0f) >= 2) - DoCastAOE(SPELL_FROST_NOVA); - events.ScheduleEvent(EVENT_FROST_NOVA, 25s); - return; - case EVENT_ICE_BLOCK: - if (HealthBelowPct(30)) - { - DoCast(SPELL_ICE_BLOCK); - events.RescheduleEvent(EVENT_ICE_BLOCK, 5min); - } - else - events.RescheduleEvent(EVENT_ICE_BLOCK, 5s); - return; - case EVENT_POLYMORPH: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, NonTankTargetSelector(me))) - DoCast(target, SPELL_POLYMORPH); - events.ScheduleEvent(EVENT_POLYMORPH, 10s, 30s); - return; - default: - return; + DoCast(SPELL_ICE_BLOCK); + events.RescheduleEvent(EVENT_ICE_BLOCK, 5min); } - } - DoSpellAttackIfReady(SPELL_FROSTBOLT); + else + events.RescheduleEvent(EVENT_ICE_BLOCK, 5s); + return; + case EVENT_POLYMORPH: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, NonTankTargetSelector(me))) + DoCast(target, SPELL_POLYMORPH); + events.ScheduleEvent(EVENT_POLYMORPH, 10s, 30s); + return; + default: + return; } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetTrialOfTheCrusaderAI<npc_toc_mageAI>(creature); } + DoSpellAttackIfReady(SPELL_FROSTBOLT); + } }; -class npc_toc_hunter : public CreatureScript +struct npc_toc_hunter : public boss_faction_championsAI { - public: - npc_toc_hunter() : CreatureScript("npc_toc_hunter") { } + npc_toc_hunter(Creature* creature) : boss_faction_championsAI(creature, AI_RANGED) { } - struct npc_toc_hunterAI : public boss_faction_championsAI - { - npc_toc_hunterAI(Creature* creature) : boss_faction_championsAI(creature, AI_RANGED) { } + void Reset() override + { + boss_faction_championsAI::Reset(); + events.ScheduleEvent(EVENT_AIMED_SHOT, 5s, 10s); + events.ScheduleEvent(EVENT_DETERRENCE, 10s, 20s); + events.ScheduleEvent(EVENT_DISENGAGE, 10s, 20s); + events.ScheduleEvent(EVENT_EXPLOSIVE_SHOT, 3s, 5s); + events.ScheduleEvent(EVENT_FROST_TRAP, 10s, 20s); + events.ScheduleEvent(EVENT_STEADY_SHOT, 5s, 10s); + events.ScheduleEvent(EVENT_WING_CLIP, 10s, 20s); + events.ScheduleEvent(EVENT_WYVERN_STING, 10s, 25s); + SetEquipmentSlots(false, 47156, EQUIP_NO_CHANGE, 48711); + } - void Reset() override - { - boss_faction_championsAI::Reset(); - events.ScheduleEvent(EVENT_AIMED_SHOT, 5s, 10s); - events.ScheduleEvent(EVENT_DETERRENCE, 10s, 20s); - events.ScheduleEvent(EVENT_DISENGAGE, 10s, 20s); - events.ScheduleEvent(EVENT_EXPLOSIVE_SHOT, 3s, 5s); - events.ScheduleEvent(EVENT_FROST_TRAP, 10s, 20s); - events.ScheduleEvent(EVENT_STEADY_SHOT, 5s, 10s); - events.ScheduleEvent(EVENT_WING_CLIP, 10s, 20s); - events.ScheduleEvent(EVENT_WYVERN_STING, 10s, 25s); - SetEquipmentSlots(false, 47156, EQUIP_NO_CHANGE, 48711); - } + void JustEngagedWith(Unit* who) override + { + boss_faction_championsAI::JustEngagedWith(who); + DoCast(SPELL_CALL_PET); + } - void JustEngagedWith(Unit* who) override - { - boss_faction_championsAI::JustEngagedWith(who); - DoCast(SPELL_CALL_PET); - } + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + events.Update(diff); + boss_faction_championsAI::UpdateAI(diff); - events.Update(diff); - boss_faction_championsAI::UpdateAI(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - if (me->HasUnitState(UNIT_STATE_CASTING)) + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_AIMED_SHOT: + DoCastVictim(SPELL_AIMED_SHOT); + events.ScheduleEvent(EVENT_AIMED_SHOT, 10s, 15s); return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) + case EVENT_DETERRENCE: + if (HealthBelowPct(30)) { - case EVENT_AIMED_SHOT: - DoCastVictim(SPELL_AIMED_SHOT); - events.ScheduleEvent(EVENT_AIMED_SHOT, 10s, 15s); - return; - case EVENT_DETERRENCE: - if (HealthBelowPct(30)) - { - DoCast(SPELL_DETERRENCE); - events.RescheduleEvent(EVENT_DETERRENCE, 150s); - } - else - events.RescheduleEvent(EVENT_DETERRENCE, 10s); - return; - case EVENT_DISENGAGE: - if (EnemiesInRange(10.0f) >= 2) - DoCast(SPELL_DISENGAGE); - events.ScheduleEvent(EVENT_DISENGAGE, 30s); - return; - case EVENT_EXPLOSIVE_SHOT: - DoCastVictim(SPELL_EXPLOSIVE_SHOT); - events.ScheduleEvent(EVENT_EXPLOSIVE_SHOT, 6s, 10s); - return; - case EVENT_FROST_TRAP: - if (EnemiesInRange(10.0f) >= 2) - DoCastAOE(SPELL_FROST_TRAP); - events.ScheduleEvent(EVENT_FROST_TRAP, 30s); - return; - case EVENT_STEADY_SHOT: - DoCastVictim(SPELL_STEADY_SHOT); - events.ScheduleEvent(EVENT_STEADY_SHOT, 5s, 15s); - return; - case EVENT_WING_CLIP: - if (Unit* target = me->GetVictim()) - { - if (me->GetDistance2d(target) < 6.0f) - DoCast(target, SPELL_WING_CLIP); - } - events.ScheduleEvent(EVENT_WING_CLIP, 15s, 25s); - return; - case EVENT_WYVERN_STING: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, NonTankTargetSelector(me))) - DoCast(target, SPELL_WYVERN_STING); - events.ScheduleEvent(EVENT_WYVERN_STING, 10s, 30s); - return; - default: - return; + DoCast(SPELL_DETERRENCE); + events.RescheduleEvent(EVENT_DETERRENCE, 150s); } - } - DoSpellAttackIfReady(SPELL_SHOOT); + else + events.RescheduleEvent(EVENT_DETERRENCE, 10s); + return; + case EVENT_DISENGAGE: + if (EnemiesInRange(10.0f) >= 2) + DoCast(SPELL_DISENGAGE); + events.ScheduleEvent(EVENT_DISENGAGE, 30s); + return; + case EVENT_EXPLOSIVE_SHOT: + DoCastVictim(SPELL_EXPLOSIVE_SHOT); + events.ScheduleEvent(EVENT_EXPLOSIVE_SHOT, 6s, 10s); + return; + case EVENT_FROST_TRAP: + if (EnemiesInRange(10.0f) >= 2) + DoCastAOE(SPELL_FROST_TRAP); + events.ScheduleEvent(EVENT_FROST_TRAP, 30s); + return; + case EVENT_STEADY_SHOT: + DoCastVictim(SPELL_STEADY_SHOT); + events.ScheduleEvent(EVENT_STEADY_SHOT, 5s, 15s); + return; + case EVENT_WING_CLIP: + if (Unit* target = me->GetVictim()) + { + if (me->GetDistance2d(target) < 6.0f) + DoCast(target, SPELL_WING_CLIP); + } + events.ScheduleEvent(EVENT_WING_CLIP, 15s, 25s); + return; + case EVENT_WYVERN_STING: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, NonTankTargetSelector(me))) + DoCast(target, SPELL_WYVERN_STING); + events.ScheduleEvent(EVENT_WYVERN_STING, 10s, 30s); + return; + default: + return; } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetTrialOfTheCrusaderAI<npc_toc_hunterAI>(creature); } + DoSpellAttackIfReady(SPELL_SHOOT); + } }; -class npc_toc_boomkin : public CreatureScript +struct npc_toc_boomkin : public boss_faction_championsAI { - public: - npc_toc_boomkin() : CreatureScript("npc_toc_boomkin") { } + npc_toc_boomkin(Creature* creature) : boss_faction_championsAI(creature, AI_RANGED) { } - struct npc_toc_boomkinAI : public boss_faction_championsAI - { - npc_toc_boomkinAI(Creature* creature) : boss_faction_championsAI(creature, AI_RANGED) { } + void Reset() override + { + boss_faction_championsAI::Reset(); + events.ScheduleEvent(EVENT_CYCLONE, 10s, 20s); + events.ScheduleEvent(EVENT_ENTANGLING_ROOTS, 10s, 20s); + events.ScheduleEvent(EVENT_FAERIE_FIRE, 2s, 5s); + events.ScheduleEvent(EVENT_FORCE_OF_NATURE, 20s, 30s); + events.ScheduleEvent(EVENT_INSECT_SWARM, 5s, 10s); + events.ScheduleEvent(EVENT_MOONFIRE, 10s, 20s); + events.ScheduleEvent(EVENT_STARFIRE, 10s, 20s); + events.ScheduleEvent(EVENT_DPS_BARKSKIN, 20s, 30s); + + SetEquipmentSlots(false, 50966, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); + } - void Reset() override - { - boss_faction_championsAI::Reset(); - events.ScheduleEvent(EVENT_CYCLONE, 10s, 20s); - events.ScheduleEvent(EVENT_ENTANGLING_ROOTS, 10s, 20s); - events.ScheduleEvent(EVENT_FAERIE_FIRE, 2s, 5s); - events.ScheduleEvent(EVENT_FORCE_OF_NATURE, 20s, 30s); - events.ScheduleEvent(EVENT_INSECT_SWARM, 5s, 10s); - events.ScheduleEvent(EVENT_MOONFIRE, 10s, 20s); - events.ScheduleEvent(EVENT_STARFIRE, 10s, 20s); - events.ScheduleEvent(EVENT_DPS_BARKSKIN, 20s, 30s); - - SetEquipmentSlots(false, 50966, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); - } + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + events.Update(diff); + boss_faction_championsAI::UpdateAI(diff); - events.Update(diff); - boss_faction_championsAI::UpdateAI(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - if (me->HasUnitState(UNIT_STATE_CASTING)) + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_CYCLONE: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, NonTankTargetSelector(me))) + DoCast(target, SPELL_CYCLONE); + events.ScheduleEvent(EVENT_CYCLONE, 10s, 20s); return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) + case EVENT_ENTANGLING_ROOTS: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true)) + DoCast(target, SPELL_ENTANGLING_ROOTS); + events.ScheduleEvent(EVENT_ENTANGLING_ROOTS, 10s, 20s); + return; + case EVENT_FAERIE_FIRE: + DoCastVictim(SPELL_FAERIE_FIRE); + events.ScheduleEvent(EVENT_FAERIE_FIRE, 30s, 40s); + return; + case EVENT_FORCE_OF_NATURE: + DoCastVictim(SPELL_FORCE_OF_NATURE); + events.ScheduleEvent(EVENT_FORCE_OF_NATURE, 2min); + return; + case EVENT_INSECT_SWARM: + DoCastVictim(SPELL_INSECT_SWARM); + events.ScheduleEvent(EVENT_INSECT_SWARM, 15s, 25s); + return; + case EVENT_MOONFIRE: + DoCastVictim(SPELL_MOONFIRE); + events.ScheduleEvent(EVENT_MOONFIRE, 15s, 30s); + return; + case EVENT_STARFIRE: + DoCastVictim(SPELL_STARFIRE); + events.ScheduleEvent(EVENT_STARFIRE, 15s, 30s); + return; + case EVENT_DPS_BARKSKIN: + if (HealthBelowPct(30)) { - case EVENT_CYCLONE: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, NonTankTargetSelector(me))) - DoCast(target, SPELL_CYCLONE); - events.ScheduleEvent(EVENT_CYCLONE, 10s, 20s); - return; - case EVENT_ENTANGLING_ROOTS: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true)) - DoCast(target, SPELL_ENTANGLING_ROOTS); - events.ScheduleEvent(EVENT_ENTANGLING_ROOTS, 10s, 20s); - return; - case EVENT_FAERIE_FIRE: - DoCastVictim(SPELL_FAERIE_FIRE); - events.ScheduleEvent(EVENT_FAERIE_FIRE, 30s, 40s); - return; - case EVENT_FORCE_OF_NATURE: - DoCastVictim(SPELL_FORCE_OF_NATURE); - events.ScheduleEvent(EVENT_FORCE_OF_NATURE, 2min); - return; - case EVENT_INSECT_SWARM: - DoCastVictim(SPELL_INSECT_SWARM); - events.ScheduleEvent(EVENT_INSECT_SWARM, 15s, 25s); - return; - case EVENT_MOONFIRE: - DoCastVictim(SPELL_MOONFIRE); - events.ScheduleEvent(EVENT_MOONFIRE, 15s, 30s); - return; - case EVENT_STARFIRE: - DoCastVictim(SPELL_STARFIRE); - events.ScheduleEvent(EVENT_STARFIRE, 15s, 30s); - return; - case EVENT_DPS_BARKSKIN: - if (HealthBelowPct(30)) - { - DoCast(me, SPELL_BARKSKIN); - events.RescheduleEvent(EVENT_DPS_BARKSKIN, 60s); - } - else - events.RescheduleEvent(EVENT_DPS_BARKSKIN, 5s); - return; - default: - return; + DoCast(me, SPELL_BARKSKIN); + events.RescheduleEvent(EVENT_DPS_BARKSKIN, 60s); } - } - DoSpellAttackIfReady(SPELL_WRATH); + else + events.RescheduleEvent(EVENT_DPS_BARKSKIN, 5s); + return; + default: + return; } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetTrialOfTheCrusaderAI<npc_toc_boomkinAI>(creature); } + DoSpellAttackIfReady(SPELL_WRATH); + } }; /******************************************************************** MELEE ********************************************************************/ -class npc_toc_warrior : public CreatureScript +struct npc_toc_warrior : public boss_faction_championsAI { - public: - npc_toc_warrior() : CreatureScript("npc_toc_warrior") { } + npc_toc_warrior(Creature* creature) : boss_faction_championsAI(creature, AI_MELEE) { } - struct npc_toc_warriorAI : public boss_faction_championsAI - { - npc_toc_warriorAI(Creature* creature) : boss_faction_championsAI(creature, AI_MELEE) { } + void Reset() override + { + boss_faction_championsAI::Reset(); + events.ScheduleEvent(EVENT_BLADESTORM, 10s, 15s); + events.ScheduleEvent(EVENT_INTIMIDATING_SHOUT, 20s, 25s); + events.ScheduleEvent(EVENT_MORTAL_STRIKE, 5s, 20s); + events.ScheduleEvent(EVENT_WARR_CHARGE, 1s); + events.ScheduleEvent(EVENT_DISARM, 5s, 20s); + events.ScheduleEvent(EVENT_OVERPOWER, 10s, 20s); + events.ScheduleEvent(EVENT_SUNDER_ARMOR, 5s, 10s); + events.ScheduleEvent(EVENT_SHATTERING_THROW, 20s, 40s); + events.ScheduleEvent(EVENT_RETALIATION, 5s, 20s); + SetEquipmentSlots(false, 47427, 46964, EQUIP_NO_CHANGE); + } - void Reset() override - { - boss_faction_championsAI::Reset(); - events.ScheduleEvent(EVENT_BLADESTORM, 10s, 15s); - events.ScheduleEvent(EVENT_INTIMIDATING_SHOUT, 20s, 25s); - events.ScheduleEvent(EVENT_MORTAL_STRIKE, 5s, 20s); - events.ScheduleEvent(EVENT_WARR_CHARGE, 1s); - events.ScheduleEvent(EVENT_DISARM, 5s, 20s); - events.ScheduleEvent(EVENT_OVERPOWER, 10s, 20s); - events.ScheduleEvent(EVENT_SUNDER_ARMOR, 5s, 10s); - events.ScheduleEvent(EVENT_SHATTERING_THROW, 20s, 40s); - events.ScheduleEvent(EVENT_RETALIATION, 5s, 20s); - SetEquipmentSlots(false, 47427, 46964, EQUIP_NO_CHANGE); - } + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + events.Update(diff); + boss_faction_championsAI::UpdateAI(diff); - events.Update(diff); - boss_faction_championsAI::UpdateAI(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - if (me->HasUnitState(UNIT_STATE_CASTING)) + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_BLADESTORM: + DoCastVictim(SPELL_BLADESTORM); + events.ScheduleEvent(EVENT_BLADESTORM, 150s); return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) + case EVENT_INTIMIDATING_SHOUT: + DoCastAOE(SPELL_INTIMIDATING_SHOUT); + events.ScheduleEvent(EVENT_INTIMIDATING_SHOUT, 120s); + return; + case EVENT_MORTAL_STRIKE: + DoCastVictim(SPELL_MORTAL_STRIKE); + events.ScheduleEvent(EVENT_MORTAL_STRIKE, 10s, 25s); + return; + case EVENT_WARR_CHARGE: + DoCastVictim(SPELL_CHARGE); + events.ScheduleEvent(EVENT_WARR_CHARGE, 10s, 20s); + return; + case EVENT_DISARM: + DoCastVictim(SPELL_DISARM); + events.ScheduleEvent(EVENT_DISARM, 15s, 35s); + return; + case EVENT_OVERPOWER: + DoCastVictim(SPELL_OVERPOWER); + events.ScheduleEvent(EVENT_OVERPOWER, 20s, 40s); + return; + case EVENT_SUNDER_ARMOR: + DoCastVictim(SPELL_SUNDER_ARMOR); + events.ScheduleEvent(EVENT_SUNDER_ARMOR, 2s, 5s); + return; + case EVENT_SHATTERING_THROW: + if (Unit* target = me->GetVictim()) { - case EVENT_BLADESTORM: - DoCastVictim(SPELL_BLADESTORM); - events.ScheduleEvent(EVENT_BLADESTORM, 150s); - return; - case EVENT_INTIMIDATING_SHOUT: - DoCastAOE(SPELL_INTIMIDATING_SHOUT); - events.ScheduleEvent(EVENT_INTIMIDATING_SHOUT, 120s); - return; - case EVENT_MORTAL_STRIKE: - DoCastVictim(SPELL_MORTAL_STRIKE); - events.ScheduleEvent(EVENT_MORTAL_STRIKE, 10s, 25s); - return; - case EVENT_WARR_CHARGE: - DoCastVictim(SPELL_CHARGE); - events.ScheduleEvent(EVENT_WARR_CHARGE, 10s, 20s); - return; - case EVENT_DISARM: - DoCastVictim(SPELL_DISARM); - events.ScheduleEvent(EVENT_DISARM, 15s, 35s); - return; - case EVENT_OVERPOWER: - DoCastVictim(SPELL_OVERPOWER); - events.ScheduleEvent(EVENT_OVERPOWER, 20s, 40s); - return; - case EVENT_SUNDER_ARMOR: - DoCastVictim(SPELL_SUNDER_ARMOR); - events.ScheduleEvent(EVENT_SUNDER_ARMOR, 2s, 5s); - return; - case EVENT_SHATTERING_THROW: - if (Unit* target = me->GetVictim()) - { - if (target->HasAuraWithMechanic(1 << MECHANIC_IMMUNE_SHIELD)) - { - DoCast(target, SPELL_SHATTERING_THROW); - events.RescheduleEvent(EVENT_SHATTERING_THROW, 5min); - return; - } - } - events.RescheduleEvent(EVENT_SHATTERING_THROW, 3s); - return; - case EVENT_RETALIATION: - if (HealthBelowPct(50)) - { - DoCast(SPELL_RETALIATION); - events.RescheduleEvent(EVENT_RETALIATION, 5min); - } - else - events.RescheduleEvent(EVENT_RETALIATION, 5s); - return; - default: + if (target->HasAuraWithMechanic(1 << MECHANIC_IMMUNE_SHIELD)) + { + DoCast(target, SPELL_SHATTERING_THROW); + events.RescheduleEvent(EVENT_SHATTERING_THROW, 5min); return; + } } - } + events.RescheduleEvent(EVENT_SHATTERING_THROW, 3s); + return; + case EVENT_RETALIATION: + if (HealthBelowPct(50)) + { + DoCast(SPELL_RETALIATION); + events.RescheduleEvent(EVENT_RETALIATION, 5min); + } + else + events.RescheduleEvent(EVENT_RETALIATION, 5s); + return; + default: + return; } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetTrialOfTheCrusaderAI<npc_toc_warriorAI>(creature); } + } }; -class npc_toc_dk : public CreatureScript +struct npc_toc_dk : public boss_faction_championsAI { - public: - npc_toc_dk() : CreatureScript("npc_toc_dk") { } + npc_toc_dk(Creature* creature) : boss_faction_championsAI(creature, AI_MELEE) { } - struct npc_toc_dkAI : public boss_faction_championsAI - { - npc_toc_dkAI(Creature* creature) : boss_faction_championsAI(creature, AI_MELEE) { } + void Reset() override + { + boss_faction_championsAI::Reset(); + events.ScheduleEvent(EVENT_CHAINS_OF_ICE, 5s, 15s); + events.ScheduleEvent(EVENT_DEATH_COIL, 10s, 20s); + events.ScheduleEvent(EVENT_DEATH_GRIP, 15s, 25s); + events.ScheduleEvent(EVENT_FROST_STRIKE, 5s, 10s); + events.ScheduleEvent(EVENT_ICEBOUND_FORTITUDE, 25s, 35s); + events.ScheduleEvent(EVENT_ICY_TOUCH, 10s, 20s); + events.ScheduleEvent(EVENT_STRANGULATE, 5s, 25s); + SetEquipmentSlots(false, 47518, 51021, EQUIP_NO_CHANGE); + } - void Reset() override - { - boss_faction_championsAI::Reset(); - events.ScheduleEvent(EVENT_CHAINS_OF_ICE, 5s, 15s); - events.ScheduleEvent(EVENT_DEATH_COIL, 10s, 20s); - events.ScheduleEvent(EVENT_DEATH_GRIP, 15s, 25s); - events.ScheduleEvent(EVENT_FROST_STRIKE, 5s, 10s); - events.ScheduleEvent(EVENT_ICEBOUND_FORTITUDE, 25s, 35s); - events.ScheduleEvent(EVENT_ICY_TOUCH, 10s, 20s); - events.ScheduleEvent(EVENT_STRANGULATE, 5s, 25s); - SetEquipmentSlots(false, 47518, 51021, EQUIP_NO_CHANGE); - } + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + events.Update(diff); + boss_faction_championsAI::UpdateAI(diff); - events.Update(diff); - boss_faction_championsAI::UpdateAI(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - if (me->HasUnitState(UNIT_STATE_CASTING)) + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_CHAINS_OF_ICE: + DoCastVictim(SPELL_CHAINS_OF_ICE); + events.ScheduleEvent(EVENT_CHAINS_OF_ICE, 15s, 25s); return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) + case EVENT_DEATH_COIL: + DoCastVictim(SPELL_DEATH_COIL); + events.ScheduleEvent(EVENT_DEATH_COIL, 5s, 15s); + return; + case EVENT_DEATH_GRIP: + if (Unit* target = me->GetVictim()) { - case EVENT_CHAINS_OF_ICE: - DoCastVictim(SPELL_CHAINS_OF_ICE); - events.ScheduleEvent(EVENT_CHAINS_OF_ICE, 15s, 25s); - return; - case EVENT_DEATH_COIL: - DoCastVictim(SPELL_DEATH_COIL); - events.ScheduleEvent(EVENT_DEATH_COIL, 5s, 15s); - return; - case EVENT_DEATH_GRIP: - if (Unit* target = me->GetVictim()) - { - if (me->IsInRange(target, 5.0f, 30.0f, false)) - { - DoCast(target, SPELL_DEATH_GRIP); - events.RescheduleEvent(EVENT_DEATH_GRIP, 35s); - return; - } - } - events.RescheduleEvent(EVENT_DEATH_GRIP, 3s); - return; - case EVENT_FROST_STRIKE: - DoCastVictim(SPELL_FROST_STRIKE); - events.ScheduleEvent(EVENT_FROST_STRIKE, 6s, 10s); - return; - case EVENT_ICEBOUND_FORTITUDE: - if (HealthBelowPct(50)) - { - DoCast(SPELL_ICEBOUND_FORTITUDE); - events.RescheduleEvent(EVENT_ICEBOUND_FORTITUDE, 60s); - } - else - events.RescheduleEvent(EVENT_ICEBOUND_FORTITUDE, 5s); - return; - case EVENT_ICY_TOUCH: - DoCastVictim(SPELL_ICY_TOUCH); - events.ScheduleEvent(EVENT_ICY_TOUCH, 10s, 15s); - return; - case EVENT_STRANGULATE: - if (Unit* target = SelectEnemyCaster(false)) - { - DoCast(target, SPELL_STRANGULATE); - events.RescheduleEvent(EVENT_STRANGULATE, 120s); - } - else - events.RescheduleEvent(EVENT_STRANGULATE, 5s); - return; - default: + if (me->IsInRange(target, 5.0f, 30.0f, false)) + { + DoCast(target, SPELL_DEATH_GRIP); + events.RescheduleEvent(EVENT_DEATH_GRIP, 35s); return; + } } - } + events.RescheduleEvent(EVENT_DEATH_GRIP, 3s); + return; + case EVENT_FROST_STRIKE: + DoCastVictim(SPELL_FROST_STRIKE); + events.ScheduleEvent(EVENT_FROST_STRIKE, 6s, 10s); + return; + case EVENT_ICEBOUND_FORTITUDE: + if (HealthBelowPct(50)) + { + DoCast(SPELL_ICEBOUND_FORTITUDE); + events.RescheduleEvent(EVENT_ICEBOUND_FORTITUDE, 60s); + } + else + events.RescheduleEvent(EVENT_ICEBOUND_FORTITUDE, 5s); + return; + case EVENT_ICY_TOUCH: + DoCastVictim(SPELL_ICY_TOUCH); + events.ScheduleEvent(EVENT_ICY_TOUCH, 10s, 15s); + return; + case EVENT_STRANGULATE: + if (Unit* target = SelectEnemyCaster(false)) + { + DoCast(target, SPELL_STRANGULATE); + events.RescheduleEvent(EVENT_STRANGULATE, 120s); + } + else + events.RescheduleEvent(EVENT_STRANGULATE, 5s); + return; + default: + return; } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetTrialOfTheCrusaderAI<npc_toc_dkAI>(creature); } + } }; -class npc_toc_rogue : public CreatureScript +struct npc_toc_rogue : public boss_faction_championsAI { - public: - npc_toc_rogue() : CreatureScript("npc_toc_rogue") { } + npc_toc_rogue(Creature* creature) : boss_faction_championsAI(creature, AI_MELEE) { } - struct npc_toc_rogueAI : public boss_faction_championsAI - { - npc_toc_rogueAI(Creature* creature) : boss_faction_championsAI(creature, AI_MELEE) { } + void Reset() override + { + boss_faction_championsAI::Reset(); + events.ScheduleEvent(EVENT_FAN_OF_KNIVES, 5s, 10s); + events.ScheduleEvent(EVENT_BLIND, 10s, 20s); + events.ScheduleEvent(EVENT_CLOAK, 20s, 30s); + events.ScheduleEvent(EVENT_BLADE_FLURRY, 10s, 20s); + events.ScheduleEvent(EVENT_SHADOWSTEP, 20s, 30s); + events.ScheduleEvent(EVENT_HEMORRHAGE, 3s, 10s); + events.ScheduleEvent(EVENT_EVISCERATE, 20s, 40s); + events.ScheduleEvent(EVENT_WOUND_POISON, 5s, 10s); + SetEquipmentSlots(false, 47422, 49982, EQUIP_NO_CHANGE); + me->SetPowerType(POWER_ENERGY); + me->SetFullPower(POWER_ENERGY); + } - void Reset() override - { - boss_faction_championsAI::Reset(); - events.ScheduleEvent(EVENT_FAN_OF_KNIVES, 5s, 10s); - events.ScheduleEvent(EVENT_BLIND, 10s, 20s); - events.ScheduleEvent(EVENT_CLOAK, 20s, 30s); - events.ScheduleEvent(EVENT_BLADE_FLURRY, 10s, 20s); - events.ScheduleEvent(EVENT_SHADOWSTEP, 20s, 30s); - events.ScheduleEvent(EVENT_HEMORRHAGE, 3s, 10s); - events.ScheduleEvent(EVENT_EVISCERATE, 20s, 40s); - events.ScheduleEvent(EVENT_WOUND_POISON, 5s, 10s); - SetEquipmentSlots(false, 47422, 49982, EQUIP_NO_CHANGE); - me->SetPowerType(POWER_ENERGY); - me->SetFullPower(POWER_ENERGY); - } + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + events.Update(diff); + boss_faction_championsAI::UpdateAI(diff); - events.Update(diff); - boss_faction_championsAI::UpdateAI(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - if (me->HasUnitState(UNIT_STATE_CASTING)) + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_FAN_OF_KNIVES: + if (EnemiesInRange(10.0f) >= 2) + DoCastAOE(SPELL_FAN_OF_KNIVES); + events.ScheduleEvent(EVENT_FAN_OF_KNIVES, 10s, 20s); return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) + case EVENT_BLIND: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, NonTankTargetSelector(me))) + DoCast(target, SPELL_BLIND); + events.ScheduleEvent(EVENT_BLIND, 10s, 30s); + return; + case EVENT_CLOAK: + if (HealthBelowPct(50)) { - case EVENT_FAN_OF_KNIVES: - if (EnemiesInRange(10.0f) >= 2) - DoCastAOE(SPELL_FAN_OF_KNIVES); - events.ScheduleEvent(EVENT_FAN_OF_KNIVES, 10s, 20s); - return; - case EVENT_BLIND: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, NonTankTargetSelector(me))) - DoCast(target, SPELL_BLIND); - events.ScheduleEvent(EVENT_BLIND, 10s, 30s); - return; - case EVENT_CLOAK: - if (HealthBelowPct(50)) - { - DoCast(SPELL_CLOAK); - events.RescheduleEvent(EVENT_CLOAK, 90s); - } - else - events.RescheduleEvent(EVENT_CLOAK, 5s); - return; - case EVENT_BLADE_FLURRY: - if (EnemiesInRange(10.0f) >= 2) - { - DoCast(SPELL_BLADE_FLURRY); - events.RescheduleEvent(EVENT_BLADE_FLURRY, 120s); - } - else - events.RescheduleEvent(EVENT_BLADE_FLURRY, 5s); - return; - case EVENT_SHADOWSTEP: - if (Unit* target = me->GetVictim()) - { - if (me->IsInRange(target, 10.0f, 40.0f, false)) - { - DoCast(target, SPELL_SHADOWSTEP); - events.RescheduleEvent(EVENT_SHADOWSTEP, 30s); - return; - } - } - events.RescheduleEvent(EVENT_SHADOWSTEP, 5s); - return; - case EVENT_HEMORRHAGE: - DoCastVictim(SPELL_HEMORRHAGE); - events.ScheduleEvent(EVENT_HEMORRHAGE, 3s, 10s); - return; - case EVENT_EVISCERATE: - DoCastVictim(SPELL_EVISCERATE); - events.ScheduleEvent(EVENT_EVISCERATE, 30s, 40s); - return; - case EVENT_WOUND_POISON: - DoCastVictim(SPELL_WOUND_POISON); - events.ScheduleEvent(EVENT_WOUND_POISON, 10s, 20s); - return; - default: + DoCast(SPELL_CLOAK); + events.RescheduleEvent(EVENT_CLOAK, 90s); + } + else + events.RescheduleEvent(EVENT_CLOAK, 5s); + return; + case EVENT_BLADE_FLURRY: + if (EnemiesInRange(10.0f) >= 2) + { + DoCast(SPELL_BLADE_FLURRY); + events.RescheduleEvent(EVENT_BLADE_FLURRY, 120s); + } + else + events.RescheduleEvent(EVENT_BLADE_FLURRY, 5s); + return; + case EVENT_SHADOWSTEP: + if (Unit* target = me->GetVictim()) + { + if (me->IsInRange(target, 10.0f, 40.0f, false)) + { + DoCast(target, SPELL_SHADOWSTEP); + events.RescheduleEvent(EVENT_SHADOWSTEP, 30s); return; + } } - } + events.RescheduleEvent(EVENT_SHADOWSTEP, 5s); + return; + case EVENT_HEMORRHAGE: + DoCastVictim(SPELL_HEMORRHAGE); + events.ScheduleEvent(EVENT_HEMORRHAGE, 3s, 10s); + return; + case EVENT_EVISCERATE: + DoCastVictim(SPELL_EVISCERATE); + events.ScheduleEvent(EVENT_EVISCERATE, 30s, 40s); + return; + case EVENT_WOUND_POISON: + DoCastVictim(SPELL_WOUND_POISON); + events.ScheduleEvent(EVENT_WOUND_POISON, 10s, 20s); + return; + default: + return; } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetTrialOfTheCrusaderAI<npc_toc_rogueAI>(creature); } + } }; -class npc_toc_enh_shaman : public CreatureScript +struct npc_toc_enh_shaman : public boss_faction_championsAI { - public: - npc_toc_enh_shaman() : CreatureScript("npc_toc_enh_shaman") { } + npc_toc_enh_shaman(Creature* creature) : boss_faction_championsAI(creature, AI_MELEE) + { + Initialize(); + } - struct npc_toc_enh_shamanAI : public boss_faction_championsAI - { - npc_toc_enh_shamanAI(Creature* creature) : boss_faction_championsAI(creature, AI_MELEE) - { - Initialize(); - } + void Initialize() + { + _totemCount = 0; + _totemOldCenterX = me->GetPositionX(); + _totemOldCenterY = me->GetPositionY(); + } - void Initialize() - { - _totemCount = 0; - _totemOldCenterX = me->GetPositionX(); - _totemOldCenterY = me->GetPositionY(); - } + void Reset() override + { + boss_faction_championsAI::Reset(); + events.ScheduleEvent(EVENT_DPS_EARTH_SHOCK, 5s, 10s); + events.ScheduleEvent(EVENT_LAVA_LASH, 3s, 5s); + events.ScheduleEvent(EVENT_STORMSTRIKE, 2s, 5s); + events.ScheduleEvent(EVENT_DPS_BLOODLUST_HEROISM, 20s); + events.ScheduleEvent(EVENT_DEPLOY_TOTEM, 1s); + events.ScheduleEvent(EVENT_WINDFURY, 20s, 50s); + + Initialize(); + SetEquipmentSlots(false, 51803, 48013, EQUIP_NO_CHANGE); + summons.DespawnAll(); + } - void Reset() override - { - boss_faction_championsAI::Reset(); - events.ScheduleEvent(EVENT_DPS_EARTH_SHOCK, 5s, 10s); - events.ScheduleEvent(EVENT_LAVA_LASH, 3s, 5s); - events.ScheduleEvent(EVENT_STORMSTRIKE, 2s, 5s); - events.ScheduleEvent(EVENT_DPS_BLOODLUST_HEROISM, 20s); - events.ScheduleEvent(EVENT_DEPLOY_TOTEM, 1s); - events.ScheduleEvent(EVENT_WINDFURY, 20s, 50s); - - Initialize(); - SetEquipmentSlots(false, 51803, 48013, EQUIP_NO_CHANGE); - summons.DespawnAll(); - } + void JustSummoned(Creature* summoned) override + { + summons.Summon(summoned); + } - void JustSummoned(Creature* summoned) override - { - summons.Summon(summoned); - } + void SummonedCreatureDespawn(Creature* /*pSummoned*/) override + { + --_totemCount; + } - void SummonedCreatureDespawn(Creature* /*pSummoned*/) override - { - --_totemCount; - } + void DeployTotem() + { + _totemCount = 4; + _totemOldCenterX = me->GetPositionX(); + _totemOldCenterY = me->GetPositionY(); + /* + -Windfury (16% melee haste) + -Grounding (redirects one harmful magic spell to the totem) - void DeployTotem() - { - _totemCount = 4; - _totemOldCenterX = me->GetPositionX(); - _totemOldCenterY = me->GetPositionY(); - /* - -Windfury (16% melee haste) - -Grounding (redirects one harmful magic spell to the totem) + -Healing Stream (unable to find amount of healing in our logs) - -Healing Stream (unable to find amount of healing in our logs) + -Tremor (prevents fear effects) + -Strength of Earth (155 strength and agil for the opposing team) - -Tremor (prevents fear effects) - -Strength of Earth (155 strength and agil for the opposing team) + -Searing (average ~3500 damage on a random target every ~3.5 seconds) + */ + } - -Searing (average ~3500 damage on a random target every ~3.5 seconds) - */ - } + void JustDied(Unit* killer) override + { + boss_faction_championsAI::JustDied(killer); + summons.DespawnAll(); + } - void JustDied(Unit* killer) override - { - boss_faction_championsAI::JustDied(killer); - summons.DespawnAll(); - } + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + events.Update(diff); + boss_faction_championsAI::UpdateAI(diff); - events.Update(diff); - boss_faction_championsAI::UpdateAI(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - if (me->HasUnitState(UNIT_STATE_CASTING)) + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_DPS_EARTH_SHOCK: + if (Unit* target = SelectEnemyCaster(true)) + DoCast(target, SPELL_EARTH_SHOCK); + events.ScheduleEvent(EVENT_DPS_EARTH_SHOCK, 10s, 15s); return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) + case EVENT_LAVA_LASH: + DoCastVictim(SPELL_LAVA_LASH); + events.ScheduleEvent(EVENT_LAVA_LASH, 5s, 15s); + return; + case EVENT_STORMSTRIKE: + DoCastVictim(SPELL_STORMSTRIKE); + events.ScheduleEvent(EVENT_STORMSTRIKE, 8s, 10s); + return; + case EVENT_DPS_BLOODLUST_HEROISM: + if (me->GetFaction()) //Am i alliance? { - case EVENT_DPS_EARTH_SHOCK: - if (Unit* target = SelectEnemyCaster(true)) - DoCast(target, SPELL_EARTH_SHOCK); - events.ScheduleEvent(EVENT_DPS_EARTH_SHOCK, 10s, 15s); - return; - case EVENT_LAVA_LASH: - DoCastVictim(SPELL_LAVA_LASH); - events.ScheduleEvent(EVENT_LAVA_LASH, 5s, 15s); - return; - case EVENT_STORMSTRIKE: - DoCastVictim(SPELL_STORMSTRIKE); - events.ScheduleEvent(EVENT_STORMSTRIKE, 8s, 10s); - return; - case EVENT_DPS_BLOODLUST_HEROISM: - if (me->GetFaction()) //Am i alliance? - { - if (!me->HasAura(AURA_EXHAUSTION)) - DoCastAOE(SPELL_HEROISM); - } - else - { - if (!me->HasAura(AURA_SATED)) - DoCastAOE(SPELL_BLOODLUST); - } - events.ScheduleEvent(EVENT_DPS_BLOODLUST_HEROISM, 5min); - return; - case EVENT_DEPLOY_TOTEM: - if (_totemCount < 4 || me->GetDistance2d(_totemOldCenterX, _totemOldCenterY) > 20.0f) - DeployTotem(); - events.ScheduleEvent(EVENT_DEPLOY_TOTEM, 1s); - return; - case EVENT_WINDFURY: - DoCastVictim(SPELL_WINDFURY); - events.ScheduleEvent(EVENT_WINDFURY, 20s, 60s); - return; - default: - return; + if (!me->HasAura(AURA_EXHAUSTION)) + DoCastAOE(SPELL_HEROISM); } - } + else + { + if (!me->HasAura(AURA_SATED)) + DoCastAOE(SPELL_BLOODLUST); + } + events.ScheduleEvent(EVENT_DPS_BLOODLUST_HEROISM, 5min); + return; + case EVENT_DEPLOY_TOTEM: + if (_totemCount < 4 || me->GetDistance2d(_totemOldCenterX, _totemOldCenterY) > 20.0f) + DeployTotem(); + events.ScheduleEvent(EVENT_DEPLOY_TOTEM, 1s); + return; + case EVENT_WINDFURY: + DoCastVictim(SPELL_WINDFURY); + events.ScheduleEvent(EVENT_WINDFURY, 20s, 60s); + return; + default: + return; } - private: - uint8 _totemCount; - float _totemOldCenterX, _totemOldCenterY; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetTrialOfTheCrusaderAI<npc_toc_enh_shamanAI>(creature); } + } + private: + uint8 _totemCount; + float _totemOldCenterX, _totemOldCenterY; }; -class npc_toc_retro_paladin : public CreatureScript +struct npc_toc_retro_paladin : public boss_faction_championsAI { - public: - npc_toc_retro_paladin() : CreatureScript("npc_toc_retro_paladin") { } + npc_toc_retro_paladin(Creature* creature) : boss_faction_championsAI(creature, AI_MELEE) { } - struct npc_toc_retro_paladinAI : public boss_faction_championsAI - { - npc_toc_retro_paladinAI(Creature* creature) : boss_faction_championsAI(creature, AI_MELEE) { } + void Reset() override + { + boss_faction_championsAI::Reset(); + events.ScheduleEvent(EVENT_AVENGING_WRATH, 25s, 35s); + events.ScheduleEvent(EVENT_CRUSADER_STRIKE, 5s, 10s); + events.ScheduleEvent(EVENT_DIVINE_STORM, 10s, 20s); + events.ScheduleEvent(EVENT_HAMMER_OF_JUSTICE_RET, 10s, 30s); + events.ScheduleEvent(EVENT_JUDGEMENT_OF_COMMAND, 5s, 15s); + events.ScheduleEvent(EVENT_REPENTANCE, 15s, 30s); + events.ScheduleEvent(EVENT_DPS_HAND_OF_PROTECTION, 20s, 30s); + events.ScheduleEvent(EVENT_DPS_DIVINE_SHIELD, 20s, 30s); + SetEquipmentSlots(false, 47519, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); + } - void Reset() override - { - boss_faction_championsAI::Reset(); - events.ScheduleEvent(EVENT_AVENGING_WRATH, 25s, 35s); - events.ScheduleEvent(EVENT_CRUSADER_STRIKE, 5s, 10s); - events.ScheduleEvent(EVENT_DIVINE_STORM, 10s, 20s); - events.ScheduleEvent(EVENT_HAMMER_OF_JUSTICE_RET, 10s, 30s); - events.ScheduleEvent(EVENT_JUDGEMENT_OF_COMMAND, 5s, 15s); - events.ScheduleEvent(EVENT_REPENTANCE, 15s, 30s); - events.ScheduleEvent(EVENT_DPS_HAND_OF_PROTECTION, 20s, 30s); - events.ScheduleEvent(EVENT_DPS_DIVINE_SHIELD, 20s, 30s); - SetEquipmentSlots(false, 47519, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); - } + void JustEngagedWith(Unit* who) override + { + boss_faction_championsAI::JustEngagedWith(who); + DoCast(SPELL_SEAL_OF_COMMAND); + } - void JustEngagedWith(Unit* who) override - { - boss_faction_championsAI::JustEngagedWith(who); - DoCast(SPELL_SEAL_OF_COMMAND); - } + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + events.Update(diff); + boss_faction_championsAI::UpdateAI(diff); - events.Update(diff); - boss_faction_championsAI::UpdateAI(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - if (me->HasUnitState(UNIT_STATE_CASTING)) + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_AVENGING_WRATH: + DoCast(SPELL_AVENGING_WRATH); + events.ScheduleEvent(EVENT_AVENGING_WRATH, 2min); return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) + case EVENT_CRUSADER_STRIKE: + DoCastVictim(SPELL_CRUSADER_STRIKE); + events.ScheduleEvent(EVENT_CRUSADER_STRIKE, 10s, 15s); + return; + case EVENT_DIVINE_STORM: + if (EnemiesInRange(10.0f) >= 2) + DoCast(SPELL_DIVINE_STORM); + events.ScheduleEvent(EVENT_DIVINE_STORM, 10s, 20s); + return; + case EVENT_HAMMER_OF_JUSTICE_RET: + DoCastVictim(SPELL_HAMMER_OF_JUSTICE_RET); + events.ScheduleEvent(EVENT_HAMMER_OF_JUSTICE_RET, 40s); + return; + case EVENT_JUDGEMENT_OF_COMMAND: + DoCastVictim(SPELL_JUDGEMENT_OF_COMMAND); + events.ScheduleEvent(EVENT_JUDGEMENT_OF_COMMAND, 10s, 15s); + return; + case EVENT_REPENTANCE: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, NonTankTargetSelector(me))) + DoCast(target, SPELL_REPENTANCE); + events.ScheduleEvent(EVENT_REPENTANCE, 1min); + return; + case EVENT_DPS_HAND_OF_PROTECTION: + if (Unit* target = DoSelectLowestHpFriendly(30.0f)) { - case EVENT_AVENGING_WRATH: - DoCast(SPELL_AVENGING_WRATH); - events.ScheduleEvent(EVENT_AVENGING_WRATH, 2min); - return; - case EVENT_CRUSADER_STRIKE: - DoCastVictim(SPELL_CRUSADER_STRIKE); - events.ScheduleEvent(EVENT_CRUSADER_STRIKE, 10s, 15s); - return; - case EVENT_DIVINE_STORM: - if (EnemiesInRange(10.0f) >= 2) - DoCast(SPELL_DIVINE_STORM); - events.ScheduleEvent(EVENT_DIVINE_STORM, 10s, 20s); - return; - case EVENT_HAMMER_OF_JUSTICE_RET: - DoCastVictim(SPELL_HAMMER_OF_JUSTICE_RET); - events.ScheduleEvent(EVENT_HAMMER_OF_JUSTICE_RET, 40s); - return; - case EVENT_JUDGEMENT_OF_COMMAND: - DoCastVictim(SPELL_JUDGEMENT_OF_COMMAND); - events.ScheduleEvent(EVENT_JUDGEMENT_OF_COMMAND, 10s, 15s); - return; - case EVENT_REPENTANCE: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, NonTankTargetSelector(me))) - DoCast(target, SPELL_REPENTANCE); - events.ScheduleEvent(EVENT_REPENTANCE, 1min); - return; - case EVENT_DPS_HAND_OF_PROTECTION: - if (Unit* target = DoSelectLowestHpFriendly(30.0f)) - { - if (!target->HasAura(SPELL_FORBEARANCE)) - { - DoCast(target, SPELL_HAND_OF_PROTECTION); - events.RescheduleEvent(EVENT_DPS_HAND_OF_PROTECTION, 5min); - } - else - events.RescheduleEvent(EVENT_DPS_HAND_OF_PROTECTION, 5s); - } - else - events.RescheduleEvent(EVENT_DPS_HAND_OF_PROTECTION, 5s); - return; - case EVENT_DPS_DIVINE_SHIELD: - if (HealthBelowPct(30) && !me->HasAura(SPELL_FORBEARANCE)) - { - DoCast(me, SPELL_DIVINE_SHIELD); - events.RescheduleEvent(EVENT_DPS_DIVINE_SHIELD, 5min); - } - else - events.RescheduleEvent(EVENT_DPS_DIVINE_SHIELD, 5s); - return; - default: - return; + if (!target->HasAura(SPELL_FORBEARANCE)) + { + DoCast(target, SPELL_HAND_OF_PROTECTION); + events.RescheduleEvent(EVENT_DPS_HAND_OF_PROTECTION, 5min); + } + else + events.RescheduleEvent(EVENT_DPS_HAND_OF_PROTECTION, 5s); } - } + else + events.RescheduleEvent(EVENT_DPS_HAND_OF_PROTECTION, 5s); + return; + case EVENT_DPS_DIVINE_SHIELD: + if (HealthBelowPct(30) && !me->HasAura(SPELL_FORBEARANCE)) + { + DoCast(me, SPELL_DIVINE_SHIELD); + events.RescheduleEvent(EVENT_DPS_DIVINE_SHIELD, 5min); + } + else + events.RescheduleEvent(EVENT_DPS_DIVINE_SHIELD, 5s); + return; + default: + return; } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetTrialOfTheCrusaderAI<npc_toc_retro_paladinAI>(creature); } + } }; -class npc_toc_pet_warlock : public CreatureScript +struct npc_toc_pet_warlock : public boss_faction_championsAI { - public: - npc_toc_pet_warlock() : CreatureScript("npc_toc_pet_warlock") { } + npc_toc_pet_warlock(Creature* creature) : boss_faction_championsAI(creature, AI_PET) { } - struct npc_toc_pet_warlockAI : public boss_faction_championsAI - { - npc_toc_pet_warlockAI(Creature* creature) : boss_faction_championsAI(creature, AI_PET) { } + void Reset() override + { + boss_faction_championsAI::Reset(); + events.ScheduleEvent(EVENT_DEVOUR_MAGIC, 15s, 30s); + events.ScheduleEvent(EVENT_SPELL_LOCK, 15s, 30s); + } - void Reset() override - { - boss_faction_championsAI::Reset(); - events.ScheduleEvent(EVENT_DEVOUR_MAGIC, 15s, 30s); - events.ScheduleEvent(EVENT_SPELL_LOCK, 15s, 30s); - } + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + events.Update(diff); + boss_faction_championsAI::UpdateAI(diff); - events.Update(diff); - boss_faction_championsAI::UpdateAI(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - if (me->HasUnitState(UNIT_STATE_CASTING)) + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_DEVOUR_MAGIC: + DoCastVictim(SPELL_DEVOUR_MAGIC); + events.ScheduleEvent(EVENT_DEVOUR_MAGIC, 8s, 10s); + return; + case EVENT_SPELL_LOCK: + DoCast(SPELL_SPELL_LOCK); + events.ScheduleEvent(EVENT_SPELL_LOCK, 24s, 30s); + return; + default: return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_DEVOUR_MAGIC: - DoCastVictim(SPELL_DEVOUR_MAGIC); - events.ScheduleEvent(EVENT_DEVOUR_MAGIC, 8s, 10s); - return; - case EVENT_SPELL_LOCK: - DoCast(SPELL_SPELL_LOCK); - events.ScheduleEvent(EVENT_SPELL_LOCK, 24s, 30s); - return; - default: - return; - } - } } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetTrialOfTheCrusaderAI<npc_toc_pet_warlockAI>(creature); } + } }; -class npc_toc_pet_hunter : public CreatureScript +struct npc_toc_pet_hunter : public boss_faction_championsAI { - public: - npc_toc_pet_hunter() : CreatureScript("npc_toc_pet_hunter") { } - - struct npc_toc_pet_hunterAI : public boss_faction_championsAI - { - npc_toc_pet_hunterAI(Creature* creature) : boss_faction_championsAI(creature, AI_PET) - { - Initialize(); - } - - void Initialize() - { - _clawTimer = urand(5 * IN_MILLISECONDS, 10 * IN_MILLISECONDS); - } + npc_toc_pet_hunter(Creature* creature) : boss_faction_championsAI(creature, AI_PET) + { + Initialize(); + } - void Reset() override - { - boss_faction_championsAI::Reset(); - Initialize(); - } + void Initialize() + { + _clawTimer = urand(5 * IN_MILLISECONDS, 10 * IN_MILLISECONDS); + } - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + void Reset() override + { + boss_faction_championsAI::Reset(); + Initialize(); + } - boss_faction_championsAI::UpdateAI(diff); + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - if (_clawTimer <= diff) - { - DoCastVictim(SPELL_CLAW); - _clawTimer = urand(5*IN_MILLISECONDS, 10*IN_MILLISECONDS); - } - else - _clawTimer -= diff; - } - private: - uint32 _clawTimer; - }; + boss_faction_championsAI::UpdateAI(diff); - CreatureAI* GetAI(Creature* creature) const override + if (_clawTimer <= diff) { - return GetTrialOfTheCrusaderAI<npc_toc_pet_hunterAI>(creature); + DoCastVictim(SPELL_CLAW); + _clawTimer = urand(5*IN_MILLISECONDS, 10*IN_MILLISECONDS); } + else + _clawTimer -= diff; + } + private: + uint32 _clawTimer; }; // 65812, 68154, 68155, 68156 - Unstable Affliction -class spell_faction_champion_warl_unstable_affliction : public SpellScriptLoader +class spell_faction_champion_warl_unstable_affliction : public AuraScript { - public: - spell_faction_champion_warl_unstable_affliction() : SpellScriptLoader("spell_faction_champion_warl_unstable_affliction") { } - - class spell_faction_champion_warl_unstable_affliction_AuraScript : public AuraScript - { - PrepareAuraScript(spell_faction_champion_warl_unstable_affliction_AuraScript); + PrepareAuraScript(spell_faction_champion_warl_unstable_affliction); - bool Validate(SpellInfo const* /*spell*/) override - { - return ValidateSpellInfo({ SPELL_UNSTABLE_AFFLICTION_DISPEL }); - } - - void HandleDispel(DispelInfo* dispelInfo) - { - if (Unit* caster = GetCaster()) - caster->CastSpell(dispelInfo->GetDispeller(), SPELL_UNSTABLE_AFFLICTION_DISPEL, GetEffect(EFFECT_0)); - } + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo({ SPELL_UNSTABLE_AFFLICTION_DISPEL }); + } - void Register() override - { - AfterDispel += AuraDispelFn(spell_faction_champion_warl_unstable_affliction_AuraScript::HandleDispel); - } - }; + void HandleDispel(DispelInfo* dispelInfo) + { + if (Unit* caster = GetCaster()) + caster->CastSpell(dispelInfo->GetDispeller(), SPELL_UNSTABLE_AFFLICTION_DISPEL, GetEffect(EFFECT_0)); + } - AuraScript* GetAuraScript() const override - { - return new spell_faction_champion_warl_unstable_affliction_AuraScript(); - } + void Register() override + { + AfterDispel += AuraDispelFn(spell_faction_champion_warl_unstable_affliction::HandleDispel); + } }; // 66017, 68753, 68754, 68755 - Death Grip -class spell_faction_champion_death_grip : public SpellScriptLoader +class spell_faction_champion_death_grip : public SpellScript { - public: - spell_faction_champion_death_grip() : SpellScriptLoader("spell_faction_champion_death_grip") { } + PrepareSpellScript(spell_faction_champion_death_grip); - class spell_faction_champion_death_grip_SpellScript : public SpellScript - { - PrepareSpellScript(spell_faction_champion_death_grip_SpellScript); - - bool Validate(SpellInfo const* /*spell*/) override - { - return ValidateSpellInfo({ SPELL_DEATH_GRIP_PULL }); - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - { - if (Unit* caster = GetCaster()) - target->CastSpell(caster, SPELL_DEATH_GRIP_PULL); - } - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_faction_champion_death_grip_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - - }; + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo({ SPELL_DEATH_GRIP_PULL }); + } - SpellScript* GetSpellScript() const override + void HandleDummy(SpellEffIndex /*effIndex*/) + { + if (Unit* target = GetHitUnit()) { - return new spell_faction_champion_death_grip_SpellScript(); + if (Unit* caster = GetCaster()) + target->CastSpell(caster, SPELL_DEATH_GRIP_PULL); } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_faction_champion_death_grip::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } }; // 65980 - Bloodlust -class spell_toc_bloodlust : public SpellScriptLoader +class spell_toc_bloodlust : public SpellScript { - public: - spell_toc_bloodlust() : SpellScriptLoader("spell_toc_bloodlust") { } - - class spell_toc_bloodlust_SpellScript : public SpellScript - { - PrepareSpellScript(spell_toc_bloodlust_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ AURA_SATED }); - } + PrepareSpellScript(spell_toc_bloodlust); - void RemoveInvalidTargets(std::list<WorldObject*>& targets) - { - targets.remove_if(Trinity::UnitAuraCheck(true, AURA_SATED)); - } + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ AURA_SATED }); + } - void ApplyDebuff() - { - if (Unit* target = GetHitUnit()) - target->CastSpell(target, AURA_SATED, true); - } + void RemoveInvalidTargets(std::list<WorldObject*>& targets) + { + targets.remove_if(Trinity::UnitAuraCheck(true, AURA_SATED)); + } - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_toc_bloodlust_SpellScript::RemoveInvalidTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_toc_bloodlust_SpellScript::RemoveInvalidTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ALLY); - AfterHit += SpellHitFn(spell_toc_bloodlust_SpellScript::ApplyDebuff); - } - }; + void ApplyDebuff() + { + if (Unit* target = GetHitUnit()) + target->CastSpell(target, AURA_SATED, true); + } - SpellScript* GetSpellScript() const override - { - return new spell_toc_bloodlust_SpellScript(); - } + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_toc_bloodlust::RemoveInvalidTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_toc_bloodlust::RemoveInvalidTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ALLY); + AfterHit += SpellHitFn(spell_toc_bloodlust::ApplyDebuff); + } }; // 65983 - Heroism -class spell_toc_heroism : public SpellScriptLoader +class spell_toc_heroism : public SpellScript { - public: - spell_toc_heroism() : SpellScriptLoader("spell_toc_heroism") { } + PrepareSpellScript(spell_toc_heroism); - class spell_toc_heroism_SpellScript : public SpellScript - { - PrepareSpellScript(spell_toc_heroism_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ AURA_EXHAUSTION }); - } - - void RemoveInvalidTargets(std::list<WorldObject*>& targets) - { - targets.remove_if(Trinity::UnitAuraCheck(true, AURA_EXHAUSTION)); - } + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ AURA_EXHAUSTION }); + } - void ApplyDebuff() - { - if (Unit* target = GetHitUnit()) - target->CastSpell(target, AURA_EXHAUSTION, true); - } + void RemoveInvalidTargets(std::list<WorldObject*>& targets) + { + targets.remove_if(Trinity::UnitAuraCheck(true, AURA_EXHAUSTION)); + } - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_toc_heroism_SpellScript::RemoveInvalidTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_toc_heroism_SpellScript::RemoveInvalidTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ALLY); - AfterHit += SpellHitFn(spell_toc_heroism_SpellScript::ApplyDebuff); - } - }; + void ApplyDebuff() + { + if (Unit* target = GetHitUnit()) + target->CastSpell(target, AURA_EXHAUSTION, true); + } - SpellScript* GetSpellScript() const override - { - return new spell_toc_heroism_SpellScript(); - } + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_toc_heroism::RemoveInvalidTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_toc_heroism::RemoveInvalidTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ALLY); + AfterHit += SpellHitFn(spell_toc_heroism::ApplyDebuff); + } }; void AddSC_boss_faction_champions() { - new boss_toc_champion_controller(); - new npc_toc_druid(); - new npc_toc_shaman(); - new npc_toc_paladin(); - new npc_toc_priest(); - new npc_toc_shadow_priest(); - new npc_toc_mage(); - new npc_toc_warlock(); - new npc_toc_hunter(); - new npc_toc_boomkin(); - new npc_toc_warrior(); - new npc_toc_dk(); - new npc_toc_rogue(); - new npc_toc_enh_shaman(); - new npc_toc_retro_paladin(); - new npc_toc_pet_warlock(); - new npc_toc_pet_hunter(); - - new spell_faction_champion_warl_unstable_affliction(); - new spell_faction_champion_death_grip(); - new spell_toc_bloodlust(); - new spell_toc_heroism(); + RegisterTrialOfTheCrusaderCreatureAI(boss_toc_champion_controller); + RegisterTrialOfTheCrusaderCreatureAI(npc_toc_druid); + RegisterTrialOfTheCrusaderCreatureAI(npc_toc_shaman); + RegisterTrialOfTheCrusaderCreatureAI(npc_toc_paladin); + RegisterTrialOfTheCrusaderCreatureAI(npc_toc_priest); + RegisterTrialOfTheCrusaderCreatureAI(npc_toc_shadow_priest); + RegisterTrialOfTheCrusaderCreatureAI(npc_toc_mage); + RegisterTrialOfTheCrusaderCreatureAI(npc_toc_warlock); + RegisterTrialOfTheCrusaderCreatureAI(npc_toc_hunter); + RegisterTrialOfTheCrusaderCreatureAI(npc_toc_boomkin); + RegisterTrialOfTheCrusaderCreatureAI(npc_toc_warrior); + RegisterTrialOfTheCrusaderCreatureAI(npc_toc_dk); + RegisterTrialOfTheCrusaderCreatureAI(npc_toc_rogue); + RegisterTrialOfTheCrusaderCreatureAI(npc_toc_enh_shaman); + RegisterTrialOfTheCrusaderCreatureAI(npc_toc_retro_paladin); + RegisterTrialOfTheCrusaderCreatureAI(npc_toc_pet_warlock); + RegisterTrialOfTheCrusaderCreatureAI(npc_toc_pet_hunter); + + RegisterSpellScript(spell_faction_champion_warl_unstable_affliction); + RegisterSpellScript(spell_faction_champion_death_grip); + RegisterSpellScript(spell_toc_bloodlust); + RegisterSpellScript(spell_toc_heroism); } |