aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoroffl <11556157+offl@users.noreply.github.com>2021-07-17 02:36:38 +0300
committerGitHub <noreply@github.com>2021-07-17 02:36:38 +0300
commit60f9847f667d1c485663c5c34b3f550a50ecb60f (patch)
treeaa9ecf85c17d776832e53b86be7b72747348d95c
parentfa85face475fef883c1284d8af824d51072f736d (diff)
Scripts/ToC: Update Faction Champions to new register model (#26706)
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp2970
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);
}