Advertisement
Guest User

Untitled

a guest
Aug 21st, 2013
43
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 107.71 KB | None | 0 0
  1. /*
  2. * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
  3. * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
  4. *
  5. * This program is free software; you can redistribute it and/or modify it
  6. * under the terms of the GNU General Public License as published by the
  7. * Free Software Foundation; either version 2 of the License, or (at your
  8. * option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful, but WITHOUT
  11. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  12. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  13. * more details.
  14. *
  15. * You should have received a copy of the GNU General Public License along
  16. * with this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18.  
  19. #include "ScriptMgr.h"
  20. #include "ScriptedCreature.h"
  21. #include "SpellScript.h"
  22. #include "SpellAuraEffects.h"
  23. #include "trial_of_the_crusader.h"
  24. #include "Player.h"
  25. #include "GridNotifiers.h"
  26.  
  27. enum Yells
  28. {
  29. SAY_KILL_PLAYER = 6
  30. };
  31.  
  32. enum AIs
  33. {
  34. AI_MELEE = 0,
  35. AI_RANGED = 1,
  36. AI_HEALER = 2,
  37. AI_PET = 3
  38. };
  39.  
  40. enum Spells
  41. {
  42. // generic
  43. SPELL_ANTI_AOE = 68595,
  44. SPELL_PVP_TRINKET = 65547,
  45.  
  46. // druid healer
  47. SPELL_LIFEBLOOM = 66093,
  48. SPELL_NOURISH = 66066,
  49. SPELL_REGROWTH = 66067,
  50. SPELL_REJUVENATION = 66065,
  51. SPELL_TRANQUILITY = 66086,
  52. SPELL_BARKSKIN = 65860,
  53. SPELL_THORNS = 66068,
  54. SPELL_NATURE_GRASP = 66071,
  55.  
  56. // shaman healer
  57. SPELL_HEALING_WAVE = 66055,
  58. SPELL_RIPTIDE = 66053,
  59. SPELL_SPIRIT_CLEANSE = 66056, //friendly only
  60. SPELL_HEROISM = 65983,
  61. SPELL_BLOODLUST = 65980,
  62. SPELL_HEX = 66054,
  63. SPELL_EARTH_SHIELD = 66063,
  64. SPELL_EARTH_SHOCK = 65973,
  65. AURA_EXHAUSTION = 57723,
  66. AURA_SATED = 57724,
  67.  
  68. // paladin healer
  69. SPELL_HAND_OF_FREEDOM = 68757,
  70. SPELL_DIVINE_SHIELD = 66010,
  71. SPELL_CLEANSE = 66116,
  72. SPELL_FLASH_OF_LIGHT = 66113,
  73. SPELL_HOLY_LIGHT = 66112,
  74. SPELL_HOLY_SHOCK = 66114,
  75. SPELL_HAND_OF_PROTECTION = 66009,
  76. SPELL_HAMMER_OF_JUSTICE = 66613,
  77. SPELL_FORBEARANCE = 25771,
  78.  
  79. // priest healer
  80. SPELL_RENEW = 66177,
  81. SPELL_SHIELD = 66099,
  82. SPELL_FLASH_HEAL = 66104,
  83. SPELL_DISPEL = 65546,
  84. SPELL_PSYCHIC_SCREAM = 65543,
  85. SPELL_MANA_BURN = 66100,
  86. SPELL_PENANCE = 66097,
  87.  
  88. // priest dps
  89. SPELL_SILENCE = 65542,
  90. SPELL_VAMPIRIC_TOUCH = 65490,
  91. SPELL_SW_PAIN = 65541,
  92. SPELL_MIND_FLAY = 65488,
  93. SPELL_MIND_BLAST = 65492,
  94. SPELL_HORROR = 65545,
  95. SPELL_DISPERSION = 65544,
  96. SPELL_SHADOWFORM = 16592,
  97.  
  98. // warlock
  99. SPELL_HELLFIRE = 65816,
  100. SPELL_CORRUPTION = 65810,
  101. SPELL_CURSE_OF_AGONY = 65814,
  102. SPELL_CURSE_OF_EXHAUSTION = 65815,
  103. SPELL_FEAR = 65809,
  104. SPELL_SEARING_PAIN = 65819,
  105. SPELL_SHADOW_BOLT = 65821,
  106. SPELL_UNSTABLE_AFFLICTION = 65812,
  107. SPELL_UNSTABLE_AFFLICTION_DISPEL = 65813,
  108. SPELL_SUMMON_FELHUNTER = 67514,
  109.  
  110. // mage
  111. SPELL_ARCANE_BARRAGE = 65799,
  112. SPELL_ARCANE_BLAST = 65791,
  113. SPELL_ARCANE_EXPLOSION = 65800,
  114. SPELL_BLINK = 65793,
  115. SPELL_COUNTERSPELL = 65790,
  116. SPELL_FROST_NOVA = 65792,
  117. SPELL_FROSTBOLT = 65807,
  118. SPELL_ICE_BLOCK = 65802,
  119. SPELL_POLYMORPH = 65801,
  120.  
  121. // hunter
  122. SPELL_AIMED_SHOT = 65883,
  123. SPELL_DETERRENCE = 65871,
  124. SPELL_DISENGAGE = 65869,
  125. SPELL_EXPLOSIVE_SHOT = 65866,
  126. SPELL_FROST_TRAP = 65880,
  127. SPELL_SHOOT = 65868,
  128. SPELL_STEADY_SHOT = 65867,
  129. SPELL_WING_CLIP = 66207,
  130. SPELL_WYVERN_STING = 65877,
  131. SPELL_CALL_PET = 67777,
  132.  
  133. // druid dps
  134. SPELL_CYCLONE = 65859,
  135. SPELL_ENTANGLING_ROOTS = 65857,
  136. SPELL_FAERIE_FIRE = 65863,
  137. SPELL_FORCE_OF_NATURE = 65861,
  138. SPELL_INSECT_SWARM = 65855,
  139. SPELL_MOONFIRE = 65856,
  140. SPELL_STARFIRE = 65854,
  141. SPELL_WRATH = 65862,
  142.  
  143. // warrior
  144. SPELL_BLADESTORM = 65947,
  145. SPELL_INTIMIDATING_SHOUT = 65930,
  146. SPELL_MORTAL_STRIKE = 65926,
  147. SPELL_CHARGE = 68764,
  148. SPELL_DISARM = 65935,
  149. SPELL_OVERPOWER = 65924,
  150. SPELL_SUNDER_ARMOR = 65936,
  151. SPELL_SHATTERING_THROW = 65940,
  152. SPELL_RETALIATION = 65932,
  153.  
  154. // death knight
  155. SPELL_CHAINS_OF_ICE = 66020,
  156. SPELL_DEATH_COIL = 66019,
  157. SPELL_DEATH_GRIP = 66017,
  158. SPELL_FROST_STRIKE = 66047,
  159. SPELL_ICEBOUND_FORTITUDE = 66023,
  160. SPELL_ICY_TOUCH = 66021,
  161. SPELL_STRANGULATE = 66018,
  162. SPELL_DEATH_GRIP_PULL = 64431, // used at spellscript
  163.  
  164. // rogue
  165. SPELL_FAN_OF_KNIVES = 65955,
  166. SPELL_BLIND = 65960,
  167. SPELL_CLOAK = 65961,
  168. SPELL_BLADE_FLURRY = 65956,
  169. SPELL_SHADOWSTEP = 66178,
  170. SPELL_HEMORRHAGE = 65954,
  171. SPELL_EVISCERATE = 65957,
  172. SPELL_WOUND_POISON = 65962,
  173.  
  174. // shaman dps (some spells taken from shaman healer)
  175. SPELL_LAVA_LASH = 65974,
  176. SPELL_STORMSTRIKE = 65970,
  177. SPELL_WINDFURY = 65976,
  178.  
  179. // paladin dps
  180. SPELL_AVENGING_WRATH = 66011,
  181. SPELL_CRUSADER_STRIKE = 66003,
  182. SPELL_DIVINE_STORM = 66006,
  183. SPELL_HAMMER_OF_JUSTICE_RET = 66007,
  184. SPELL_JUDGEMENT_OF_COMMAND = 66005,
  185. SPELL_REPENTANCE = 66008,
  186. SPELL_SEAL_OF_COMMAND = 66004,
  187.  
  188. // warlock pet
  189. SPELL_DEVOUR_MAGIC = 67518,
  190. SPELL_SPELL_LOCK = 67519,
  191.  
  192. // hunter pet
  193. SPELL_CLAW = 67793
  194. };
  195.  
  196. enum Events
  197. {
  198. // generic
  199. EVENT_THREAT = 1,
  200. EVENT_REMOVE_CC = 2,
  201.  
  202. // druid healer
  203. EVENT_LIFEBLOOM = 1,
  204. EVENT_NOURISH = 2,
  205. EVENT_REGROWTH = 3,
  206. EVENT_REJUVENATION = 4,
  207. EVENT_TRANQUILITY = 5,
  208. EVENT_HEAL_BARKSKIN = 6,
  209. EVENT_THORNS = 7,
  210. EVENT_NATURE_GRASP = 8,
  211.  
  212. // shaman healer
  213. EVENT_HEALING_WAVE = 1,
  214. EVENT_RIPTIDE = 2,
  215. EVENT_SPIRIT_CLEANSE = 3,
  216. EVENT_HEAL_BLOODLUST_HEROISM = 4,
  217. EVENT_HEX = 5,
  218. EVENT_EARTH_SHIELD = 6,
  219. EVENT_HEAL_EARTH_SHOCK = 7,
  220.  
  221. // paladin healer
  222. EVENT_HAND_OF_FREEDOM = 1,
  223. EVENT_HEAL_DIVINE_SHIELD = 2,
  224. EVENT_CLEANSE = 3,
  225. EVENT_FLASH_OF_LIGHT = 4,
  226. EVENT_HOLY_LIGHT = 5,
  227. EVENT_HOLY_SHOCK = 6,
  228. EVENT_HEAL_HAND_OF_PROTECTION = 7,
  229. EVENT_HAMMER_OF_JUSTICE = 8,
  230.  
  231. // priest healer
  232. EVENT_RENEW = 1,
  233. EVENT_SHIELD = 2,
  234. EVENT_FLASH_HEAL = 3,
  235. EVENT_HEAL_DISPEL = 4,
  236. EVENT_HEAL_PSYCHIC_SCREAM = 5,
  237. EVENT_MANA_BURN = 6,
  238. EVENT_PENANCE = 7,
  239.  
  240. // priest dps
  241. EVENT_SILENCE = 1,
  242. EVENT_VAMPIRIC_TOUCH = 2,
  243. EVENT_SW_PAIN = 3,
  244. EVENT_MIND_BLAST = 4,
  245. EVENT_HORROR = 5,
  246. EVENT_DISPERSION = 6,
  247. EVENT_DPS_DISPEL = 7,
  248. EVENT_DPS_PSYCHIC_SCREAM = 8,
  249.  
  250. // warlock
  251. EVENT_HELLFIRE = 1,
  252. EVENT_CORRUPTION = 2,
  253. EVENT_CURSE_OF_AGONY = 3,
  254. EVENT_CURSE_OF_EXHAUSTION = 4,
  255. EVENT_FEAR = 5,
  256. EVENT_SEARING_PAIN = 6,
  257. EVENT_UNSTABLE_AFFLICTION = 7,
  258.  
  259. // mage
  260. EVENT_ARCANE_BARRAGE = 1,
  261. EVENT_ARCANE_BLAST = 2,
  262. EVENT_ARCANE_EXPLOSION = 3,
  263. EVENT_BLINK = 4,
  264. EVENT_COUNTERSPELL = 5,
  265. EVENT_FROST_NOVA = 6,
  266. EVENT_ICE_BLOCK = 7,
  267. EVENT_POLYMORPH = 8,
  268.  
  269. // hunter
  270. EVENT_AIMED_SHOT = 1,
  271. EVENT_DETERRENCE = 2,
  272. EVENT_DISENGAGE = 3,
  273. EVENT_EXPLOSIVE_SHOT = 4,
  274. EVENT_FROST_TRAP = 5,
  275. EVENT_STEADY_SHOT = 6,
  276. EVENT_WING_CLIP = 7,
  277. EVENT_WYVERN_STING = 8,
  278.  
  279. // druid dps
  280. EVENT_CYCLONE = 1,
  281. EVENT_ENTANGLING_ROOTS = 2,
  282. EVENT_FAERIE_FIRE = 3,
  283. EVENT_FORCE_OF_NATURE = 4,
  284. EVENT_INSECT_SWARM = 5,
  285. EVENT_MOONFIRE = 6,
  286. EVENT_STARFIRE = 7,
  287. EVENT_DPS_BARKSKIN = 8,
  288.  
  289. // warrior
  290. EVENT_BLADESTORM = 1,
  291. EVENT_INTIMIDATING_SHOUT = 2,
  292. EVENT_MORTAL_STRIKE = 3,
  293. EVENT_WARR_CHARGE = 4,
  294. EVENT_DISARM = 5,
  295. EVENT_OVERPOWER = 6,
  296. EVENT_SUNDER_ARMOR = 7,
  297. EVENT_SHATTERING_THROW = 8,
  298. EVENT_RETALIATION = 9,
  299.  
  300. // death knight
  301. EVENT_CHAINS_OF_ICE = 1,
  302. EVENT_DEATH_COIL = 2,
  303. EVENT_DEATH_GRIP = 3,
  304. EVENT_FROST_STRIKE = 4,
  305. EVENT_ICEBOUND_FORTITUDE = 5,
  306. EVENT_ICY_TOUCH = 6,
  307. EVENT_STRANGULATE = 7,
  308.  
  309. // rogue
  310. EVENT_FAN_OF_KNIVES = 1,
  311. EVENT_BLIND = 2,
  312. EVENT_CLOAK = 3,
  313. EVENT_BLADE_FLURRY = 4,
  314. EVENT_SHADOWSTEP = 5,
  315. EVENT_HEMORRHAGE = 6,
  316. EVENT_EVISCERATE = 7,
  317. EVENT_WOUND_POISON = 8,
  318.  
  319. // shaman dps
  320. EVENT_DPS_EARTH_SHOCK = 1,
  321. EVENT_LAVA_LASH = 2,
  322. EVENT_STORMSTRIKE = 3,
  323. EVENT_DPS_BLOODLUST_HEROISM = 4,
  324. EVENT_DEPLOY_TOTEM = 5,
  325. EVENT_WINDFURY = 6,
  326.  
  327. // paladin dps
  328. EVENT_AVENGING_WRATH = 1,
  329. EVENT_CRUSADER_STRIKE = 2,
  330. EVENT_DIVINE_STORM = 3,
  331. EVENT_HAMMER_OF_JUSTICE_RET = 4,
  332. EVENT_JUDGEMENT_OF_COMMAND = 5,
  333. EVENT_REPENTANCE = 6,
  334. EVENT_DPS_HAND_OF_PROTECTION = 7,
  335. EVENT_DPS_DIVINE_SHIELD = 8,
  336.  
  337. // warlock pet
  338. EVENT_DEVOUR_MAGIC = 1,
  339. EVENT_SPELL_LOCK = 2
  340. };
  341.  
  342. class boss_toc_champion_controller : public CreatureScript
  343. {
  344. public:
  345. boss_toc_champion_controller() : CreatureScript("boss_toc_champion_controller") { }
  346.  
  347. struct boss_toc_champion_controllerAI : public ScriptedAI
  348. {
  349. boss_toc_champion_controllerAI(Creature* creature) : ScriptedAI(creature), _summons(me)
  350. {
  351. _instance = creature->GetInstanceScript();
  352. }
  353.  
  354. void Reset() OVERRIDE
  355. {
  356. _championsNotStarted = 0;
  357. _championsFailed = 0;
  358. _championsKilled = 0;
  359. _inProgress = false;
  360. }
  361.  
  362. std::vector<uint32> SelectChampions(Team playerTeam)
  363. {
  364. std::vector<uint32> vHealersEntries;
  365. vHealersEntries.clear();
  366. vHealersEntries.push_back(playerTeam == ALLIANCE ? NPC_HORDE_DRUID_RESTORATION : NPC_ALLIANCE_DRUID_RESTORATION);
  367. vHealersEntries.push_back(playerTeam == ALLIANCE ? NPC_HORDE_PALADIN_HOLY : NPC_ALLIANCE_PALADIN_HOLY);
  368. vHealersEntries.push_back(playerTeam == ALLIANCE ? NPC_HORDE_PRIEST_DISCIPLINE : NPC_ALLIANCE_PRIEST_DISCIPLINE);
  369. vHealersEntries.push_back(playerTeam == ALLIANCE ? NPC_HORDE_SHAMAN_RESTORATION : NPC_ALLIANCE_SHAMAN_RESTORATION);
  370.  
  371. std::vector<uint32> vOtherEntries;
  372. vOtherEntries.clear();
  373. vOtherEntries.push_back(playerTeam == ALLIANCE ? NPC_HORDE_DEATH_KNIGHT : NPC_ALLIANCE_DEATH_KNIGHT);
  374. vOtherEntries.push_back(playerTeam == ALLIANCE ? NPC_HORDE_HUNTER : NPC_ALLIANCE_HUNTER);
  375. vOtherEntries.push_back(playerTeam == ALLIANCE ? NPC_HORDE_MAGE : NPC_ALLIANCE_MAGE);
  376. vOtherEntries.push_back(playerTeam == ALLIANCE ? NPC_HORDE_ROGUE : NPC_ALLIANCE_ROGUE);
  377. vOtherEntries.push_back(playerTeam == ALLIANCE ? NPC_HORDE_WARLOCK : NPC_ALLIANCE_WARLOCK);
  378. vOtherEntries.push_back(playerTeam == ALLIANCE ? NPC_HORDE_WARRIOR : NPC_ALLIANCE_WARRIOR);
  379.  
  380. uint8 healersSubtracted = 2;
  381. if (_instance->instance->GetSpawnMode() == RAID_DIFFICULTY_25MAN_NORMAL || _instance->instance->GetSpawnMode() == RAID_DIFFICULTY_25MAN_HEROIC)
  382. healersSubtracted = 1;
  383. for (uint8 i = 0; i < healersSubtracted; ++i)
  384. {
  385. uint8 pos = urand(0, vHealersEntries.size() - 1);
  386. switch (vHealersEntries[pos])
  387. {
  388. case NPC_ALLIANCE_DRUID_RESTORATION:
  389. vOtherEntries.push_back(NPC_ALLIANCE_DRUID_BALANCE);
  390. break;
  391. case NPC_HORDE_DRUID_RESTORATION:
  392. vOtherEntries.push_back(NPC_HORDE_DRUID_BALANCE);
  393. break;
  394. case NPC_ALLIANCE_PALADIN_HOLY:
  395. vOtherEntries.push_back(NPC_ALLIANCE_PALADIN_RETRIBUTION);
  396. break;
  397. case NPC_HORDE_PALADIN_HOLY:
  398. vOtherEntries.push_back(NPC_HORDE_PALADIN_RETRIBUTION);
  399. break;
  400. case NPC_ALLIANCE_PRIEST_DISCIPLINE:
  401. vOtherEntries.push_back(NPC_ALLIANCE_PRIEST_SHADOW);
  402. break;
  403. case NPC_HORDE_PRIEST_DISCIPLINE:
  404. vOtherEntries.push_back(NPC_HORDE_PRIEST_SHADOW);
  405. break;
  406. case NPC_ALLIANCE_SHAMAN_RESTORATION:
  407. vOtherEntries.push_back(NPC_ALLIANCE_SHAMAN_ENHANCEMENT);
  408. break;
  409. case NPC_HORDE_SHAMAN_RESTORATION:
  410. vOtherEntries.push_back(NPC_HORDE_SHAMAN_ENHANCEMENT);
  411. break;
  412. default:
  413. break;
  414. }
  415. vHealersEntries.erase(vHealersEntries.begin() + pos);
  416. }
  417.  
  418. if (_instance->instance->GetSpawnMode() == RAID_DIFFICULTY_10MAN_NORMAL || _instance->instance->GetSpawnMode() == RAID_DIFFICULTY_10MAN_HEROIC)
  419. for (uint8 i = 0; i < 4; ++i)
  420. vOtherEntries.erase(vOtherEntries.begin() + urand(0, vOtherEntries.size() - 1));
  421.  
  422. std::vector<uint32> vChampionEntries;
  423. vChampionEntries.clear();
  424. for (uint8 i = 0; i < vHealersEntries.size(); ++i)
  425. vChampionEntries.push_back(vHealersEntries[i]);
  426. for (uint8 i = 0; i < vOtherEntries.size(); ++i)
  427. vChampionEntries.push_back(vOtherEntries[i]);
  428.  
  429. return vChampionEntries;
  430. }
  431.  
  432. void SummonChampions(Team playerTeam)
  433. {
  434. std::vector<Position> vChampionJumpOrigin;
  435. if (playerTeam == ALLIANCE)
  436. for (uint8 i = 0; i < 5; i++)
  437. vChampionJumpOrigin.push_back(FactionChampionLoc[i]);
  438. else
  439. for (uint8 i = 5; i < 10; i++)
  440. vChampionJumpOrigin.push_back(FactionChampionLoc[i]);
  441.  
  442. std::vector<Position> vChampionJumpTarget;
  443. for (uint8 i = 10; i < 20; i++)
  444. vChampionJumpTarget.push_back(FactionChampionLoc[i]);
  445. std::vector<uint32> vChampionEntries = SelectChampions(playerTeam);
  446.  
  447. for (uint8 i = 0; i < vChampionEntries.size(); ++i)
  448. {
  449. uint8 pos = urand(0, vChampionJumpTarget.size()-1);
  450. if (Creature* temp = me->SummonCreature(vChampionEntries[i], vChampionJumpOrigin[urand(0, vChampionJumpOrigin.size()-1)], TEMPSUMMON_MANUAL_DESPAWN))
  451. {
  452. _summons.Summon(temp);
  453. temp->SetReactState(REACT_PASSIVE);
  454. temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC);
  455. if (playerTeam == ALLIANCE)
  456. {
  457. temp->SetHomePosition(vChampionJumpTarget[pos].GetPositionX(), vChampionJumpTarget[pos].GetPositionY(), vChampionJumpTarget[pos].GetPositionZ(), 0);
  458. temp->GetMotionMaster()->MoveJump(vChampionJumpTarget[pos].GetPositionX(), vChampionJumpTarget[pos].GetPositionY(), vChampionJumpTarget[pos].GetPositionZ(), 20.0f, 20.0f);
  459. temp->SetOrientation(0);
  460. }
  461. else
  462. {
  463. temp->SetHomePosition((ToCCommonLoc[1].GetPositionX()*2)-vChampionJumpTarget[pos].GetPositionX(), vChampionJumpTarget[pos].GetPositionY(), vChampionJumpTarget[pos].GetPositionZ(), 3);
  464. temp->GetMotionMaster()->MoveJump((ToCCommonLoc[1].GetPositionX()*2)-vChampionJumpTarget[pos].GetPositionX(), vChampionJumpTarget[pos].GetPositionY(), vChampionJumpTarget[pos].GetPositionZ(), 20.0f, 20.0f);
  465. temp->SetOrientation(3);
  466. }
  467. }
  468. vChampionJumpTarget.erase(vChampionJumpTarget.begin()+pos);
  469. }
  470. }
  471.  
  472. void SetData(uint32 uiType, uint32 uiData) OVERRIDE
  473. {
  474. switch (uiType)
  475. {
  476. case 0:
  477. SummonChampions((Team)uiData);
  478. break;
  479. case 1:
  480. for (std::list<uint64>::iterator i = _summons.begin(); i != _summons.end(); ++i)
  481. {
  482. if (Creature* temp = Unit::GetCreature(*me, *i))
  483. {
  484. temp->SetReactState(REACT_AGGRESSIVE);
  485. temp->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC);
  486. }
  487. }
  488. break;
  489. case 2:
  490. switch (uiData)
  491. {
  492. case FAIL:
  493. _championsFailed++;
  494. if (_championsFailed + _championsKilled >= _summons.size())
  495. {
  496. _instance->SetBossState(BOSS_CRUSADERS, FAIL);
  497. _summons.DespawnAll();
  498. me->DespawnOrUnsummon();
  499. }
  500. break;
  501. case IN_PROGRESS:
  502. if (!_inProgress)
  503. {
  504. _championsNotStarted = 0;
  505. _championsFailed = 0;
  506. _championsKilled = 0;
  507. _inProgress = true;
  508. _summons.DoZoneInCombat();
  509. _instance->SetBossState(BOSS_CRUSADERS, IN_PROGRESS);
  510. }
  511. break;
  512. case DONE:
  513. _championsKilled++;
  514. if (_championsKilled == 1)
  515. _instance->SetBossState(BOSS_CRUSADERS, SPECIAL);
  516. else if (_championsKilled >= _summons.size())
  517. {
  518. _instance->SetBossState(BOSS_CRUSADERS, DONE);
  519. _summons.DespawnAll();
  520. me->DespawnOrUnsummon();
  521. }
  522. break;
  523. default:
  524. break;
  525. }
  526. break;
  527. default:
  528. break;
  529. }
  530. }
  531. private:
  532. InstanceScript* _instance;
  533. SummonList _summons;
  534. uint32 _championsNotStarted;
  535. uint32 _championsFailed;
  536. uint32 _championsKilled;
  537. bool _inProgress;
  538. };
  539.  
  540. CreatureAI* GetAI(Creature* creature) const OVERRIDE
  541. {
  542. return new boss_toc_champion_controllerAI(creature);
  543. }
  544. };
  545.  
  546. struct boss_faction_championsAI : public BossAI
  547. {
  548. boss_faction_championsAI(Creature* creature, uint32 aitype) : BossAI(creature, BOSS_CRUSADERS)
  549. {
  550. _aiType = aitype;
  551. }
  552.  
  553. void Reset() OVERRIDE
  554. {
  555. _events.ScheduleEvent(EVENT_THREAT, 5*IN_MILLISECONDS);
  556. if (IsHeroic() && (_aiType != AI_PET))
  557. _events.ScheduleEvent(EVENT_REMOVE_CC, 5*IN_MILLISECONDS);
  558. }
  559.  
  560. void JustReachedHome() OVERRIDE
  561. {
  562. if (instance)
  563. if (Creature* pChampionController = Unit::GetCreature((*me), instance->GetData64(NPC_CHAMPIONS_CONTROLLER)))
  564. pChampionController->AI()->SetData(2, FAIL);
  565. me->DespawnOrUnsummon();
  566. }
  567.  
  568. float CalculateThreat(float distance, float armor, uint32 health)
  569. {
  570. float dist_mod = (_aiType == AI_MELEE || _aiType == AI_PET) ? 15.0f / (15.0f + distance) : 1.0f;
  571. float armor_mod = (_aiType == AI_MELEE || _aiType == AI_PET) ? armor / 16635.0f : 0.0f;
  572. float eh = (health + 1) * (1.0f + armor_mod);
  573. return dist_mod * 30000.0f / eh;
  574. }
  575.  
  576. void UpdateThreat()
  577. {
  578. std::list<HostileReference*> const& tList = me->getThreatManager().getThreatList();
  579. for (std::list<HostileReference*>::const_iterator itr = tList.begin(); itr != tList.end(); ++itr)
  580. {
  581. Unit* unit = Unit::GetUnit(*me, (*itr)->getUnitGuid());
  582. if (unit && me->getThreatManager().getThreat(unit))
  583. {
  584. if (unit->GetTypeId() == TYPEID_PLAYER)
  585. {
  586. float threat = CalculateThreat(me->GetDistance2d(unit), (float)unit->GetArmor(), unit->GetHealth());
  587. me->getThreatManager().modifyThreatPercent(unit, -100);
  588. me->AddThreat(unit, 1000000.0f * threat);
  589. }
  590. }
  591. }
  592. }
  593.  
  594. void UpdatePower()
  595. {
  596. if (me->getPowerType() == POWER_MANA)
  597. me->ModifyPower(POWER_MANA, me->GetMaxPower(POWER_MANA) / 3);
  598. }
  599.  
  600. void RemoveCC()
  601. {
  602. me->RemoveAurasByType(SPELL_AURA_MOD_STUN);
  603. me->RemoveAurasByType(SPELL_AURA_MOD_FEAR);
  604. me->RemoveAurasByType(SPELL_AURA_MOD_ROOT);
  605. me->RemoveAurasByType(SPELL_AURA_MOD_PACIFY);
  606. me->RemoveAurasByType(SPELL_AURA_MOD_CONFUSE);
  607. //DoCast(me, SPELL_PVP_TRINKET);
  608. }
  609.  
  610. void JustDied(Unit* /*killer*/) OVERRIDE
  611. {
  612. if (_aiType != AI_PET)
  613. if (instance)
  614. if (Creature* pChampionController = Unit::GetCreature((*me), instance->GetData64(NPC_CHAMPIONS_CONTROLLER)))
  615. pChampionController->AI()->SetData(2, DONE);
  616. }
  617.  
  618. void EnterCombat(Unit* /*who*/) OVERRIDE
  619. {
  620. DoCast(me, SPELL_ANTI_AOE, true);
  621. _EnterCombat();
  622. if (instance)
  623. if (Creature* pChampionController = Unit::GetCreature((*me), instance->GetData64(NPC_CHAMPIONS_CONTROLLER)))
  624. pChampionController->AI()->SetData(2, IN_PROGRESS);
  625. }
  626.  
  627. void KilledUnit(Unit* who) OVERRIDE
  628. {
  629. if (who->GetTypeId() == TYPEID_PLAYER)
  630. {
  631. Map::PlayerList const &players = me->GetMap()->GetPlayers();
  632. uint32 TeamInInstance = 0;
  633.  
  634. if (!players.isEmpty())
  635. if (Player* player = players.begin()->GetSource())
  636. TeamInInstance = player->GetTeam();
  637.  
  638. if (instance)
  639. {
  640. if (TeamInInstance == ALLIANCE)
  641. {
  642. if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(NPC_VARIAN)))
  643. temp->AI()->Talk(SAY_KILL_PLAYER);
  644. }
  645. else
  646. if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(NPC_GARROSH)))
  647. temp->AI()->Talk(SAY_KILL_PLAYER);
  648.  
  649.  
  650. instance->SetData(DATA_TRIBUTE_TO_IMMORTALITY_ELIGIBLE, 0);
  651. }
  652. }
  653. }
  654.  
  655. Creature* SelectRandomFriendlyMissingBuff(uint32 spell)
  656. {
  657. std::list<Creature*> lst = DoFindFriendlyMissingBuff(40.0f, spell);
  658. std::list<Creature*>::const_iterator itr = lst.begin();
  659. if (lst.empty())
  660. return NULL;
  661. advance(itr, rand() % lst.size());
  662. return (*itr);
  663. }
  664.  
  665. Unit* SelectEnemyCaster(bool /*casting*/)
  666. {
  667. std::list<HostileReference*> const& tList = me->getThreatManager().getThreatList();
  668. std::list<HostileReference*>::const_iterator iter;
  669. Unit* target;
  670. for (iter = tList.begin(); iter!=tList.end(); ++iter)
  671. {
  672. target = Unit::GetUnit(*me, (*iter)->getUnitGuid());
  673. if (target && target->getPowerType() == POWER_MANA)
  674. return target;
  675. }
  676. return NULL;
  677. }
  678.  
  679. uint32 EnemiesInRange(float distance)
  680. {
  681. std::list<HostileReference*> const& tList = me->getThreatManager().getThreatList();
  682. std::list<HostileReference*>::const_iterator iter;
  683. uint32 count = 0;
  684. Unit* target;
  685. for (iter = tList.begin(); iter != tList.end(); ++iter)
  686. {
  687. target = Unit::GetUnit(*me, (*iter)->getUnitGuid());
  688. if (target && me->GetDistance2d(target) < distance)
  689. ++count;
  690. }
  691. return count;
  692. }
  693.  
  694. void AttackStart(Unit* who) OVERRIDE
  695. {
  696. if (!who)
  697. return;
  698.  
  699. if (me->Attack(who, true))
  700. {
  701. me->AddThreat(who, 10.0f);
  702. me->SetInCombatWith(who);
  703. who->SetInCombatWith(me);
  704.  
  705. if (_aiType == AI_MELEE || _aiType == AI_PET)
  706. DoStartMovement(who);
  707. else
  708. DoStartMovement(who, 20.0f);
  709. SetCombatMovement(true);
  710. }
  711. }
  712.  
  713. void UpdateAI(uint32 diff) OVERRIDE
  714. {
  715. _events.Update(diff);
  716.  
  717. while (uint32 eventId = _events.ExecuteEvent())
  718. {
  719. switch (eventId)
  720. {
  721. case EVENT_THREAT:
  722. UpdatePower();
  723. UpdateThreat();
  724. _events.ScheduleEvent(EVENT_THREAT, 4*IN_MILLISECONDS);
  725. return;
  726. case EVENT_REMOVE_CC:
  727. if (me->HasBreakableByDamageCrowdControlAura())
  728. {
  729. RemoveCC();
  730. _events.RescheduleEvent(EVENT_REMOVE_CC, 2*MINUTE*IN_MILLISECONDS);
  731. }
  732. else
  733. _events.RescheduleEvent(EVENT_REMOVE_CC, 3*IN_MILLISECONDS);
  734. return;
  735. default:
  736. return;
  737. }
  738. }
  739.  
  740. if (_aiType == AI_MELEE || _aiType == AI_PET)
  741. DoMeleeAttackIfReady();
  742. }
  743.  
  744. private:
  745. uint32 _aiType;
  746. // make sure that every bosses separate events dont mix with these _events
  747. EventMap _events;
  748. };
  749.  
  750. /********************************************************************
  751. HEALERS
  752. ********************************************************************/
  753. class npc_toc_druid : public CreatureScript
  754. {
  755. public:
  756. npc_toc_druid() : CreatureScript("npc_toc_druid") { }
  757.  
  758. struct npc_toc_druidAI : public boss_faction_championsAI
  759. {
  760. npc_toc_druidAI(Creature* creature) : boss_faction_championsAI(creature, AI_HEALER) {}
  761.  
  762. void Reset() OVERRIDE
  763. {
  764. boss_faction_championsAI::Reset();
  765. events.ScheduleEvent(EVENT_LIFEBLOOM, urand(5*IN_MILLISECONDS, 15*IN_MILLISECONDS));
  766. events.ScheduleEvent(EVENT_NOURISH, urand(5*IN_MILLISECONDS, 15*IN_MILLISECONDS));
  767. events.ScheduleEvent(EVENT_REGROWTH, urand(5*IN_MILLISECONDS, 15*IN_MILLISECONDS));
  768. events.ScheduleEvent(EVENT_REJUVENATION, urand(5*IN_MILLISECONDS, 15*IN_MILLISECONDS));
  769. events.ScheduleEvent(EVENT_TRANQUILITY, urand(5*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  770. events.ScheduleEvent(EVENT_HEAL_BARKSKIN, urand(15*IN_MILLISECONDS, 25*IN_MILLISECONDS));
  771. events.ScheduleEvent(EVENT_THORNS, 2*IN_MILLISECONDS);
  772. events.ScheduleEvent(EVENT_NATURE_GRASP, urand(3*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  773. SetEquipmentSlots(false, 51799, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE);
  774. }
  775.  
  776. void UpdateAI(uint32 diff) OVERRIDE
  777. {
  778. if (!UpdateVictim())
  779. return;
  780.  
  781. events.Update(diff);
  782. boss_faction_championsAI::UpdateAI(diff);
  783.  
  784. if (me->HasUnitState(UNIT_STATE_CASTING))
  785. return;
  786.  
  787. while (uint32 eventId = events.ExecuteEvent())
  788. {
  789. switch (eventId)
  790. {
  791. case EVENT_LIFEBLOOM:
  792. if (Unit* target = DoSelectLowestHpFriendly(40.0f))
  793. DoCast(target, SPELL_LIFEBLOOM);
  794. events.ScheduleEvent(EVENT_LIFEBLOOM, urand(5*IN_MILLISECONDS, 15*IN_MILLISECONDS));
  795. return;
  796. case EVENT_NOURISH:
  797. if (Unit* target = DoSelectLowestHpFriendly(40.0f))
  798. DoCast(target, SPELL_NOURISH);
  799. events.ScheduleEvent(EVENT_NOURISH, urand(5*IN_MILLISECONDS, 15*IN_MILLISECONDS));
  800. return;
  801. case EVENT_REGROWTH:
  802. if (Unit* target = DoSelectLowestHpFriendly(40.0f))
  803. DoCast(target, SPELL_REGROWTH);
  804. events.ScheduleEvent(EVENT_REGROWTH, urand(5*IN_MILLISECONDS, 15*IN_MILLISECONDS));
  805. return;
  806. case EVENT_REJUVENATION:
  807. if (Unit* target = DoSelectLowestHpFriendly(40.0f))
  808. DoCast(target, SPELL_REJUVENATION);
  809. events.ScheduleEvent(EVENT_REJUVENATION, urand(5*IN_MILLISECONDS, 15*IN_MILLISECONDS));
  810. return;
  811. case EVENT_TRANQUILITY:
  812. DoCastAOE(SPELL_TRANQUILITY);
  813. events.ScheduleEvent(EVENT_TRANQUILITY, urand(15*IN_MILLISECONDS, 40*IN_MILLISECONDS));
  814. return;
  815. case EVENT_HEAL_BARKSKIN:
  816. if (HealthBelowPct(30))
  817. {
  818. DoCast(me, SPELL_BARKSKIN);
  819. events.RescheduleEvent(EVENT_HEAL_BARKSKIN, 60*IN_MILLISECONDS);
  820. }
  821. else
  822. events.RescheduleEvent(EVENT_HEAL_BARKSKIN, 3*IN_MILLISECONDS);
  823. return;
  824. case EVENT_THORNS:
  825. if (Creature* target = SelectRandomFriendlyMissingBuff(SPELL_THORNS))
  826. DoCast(target, SPELL_THORNS);
  827. events.ScheduleEvent(EVENT_THORNS, urand(25*IN_MILLISECONDS, 40*IN_MILLISECONDS));
  828. return;
  829. case EVENT_NATURE_GRASP:
  830. DoCast(me, SPELL_NATURE_GRASP);
  831. events.ScheduleEvent(EVENT_NATURE_GRASP, 60*IN_MILLISECONDS);
  832. return;
  833. default:
  834. return;
  835. }
  836. }
  837. }
  838. };
  839.  
  840. CreatureAI* GetAI(Creature* creature) const OVERRIDE
  841. {
  842. return new npc_toc_druidAI(creature);
  843. }
  844. };
  845.  
  846. class npc_toc_shaman : public CreatureScript
  847. {
  848. public:
  849. npc_toc_shaman() : CreatureScript("npc_toc_shaman") { }
  850.  
  851. struct npc_toc_shamanAI : public boss_faction_championsAI
  852. {
  853. npc_toc_shamanAI(Creature* creature) : boss_faction_championsAI(creature, AI_HEALER) {}
  854.  
  855. void Reset() OVERRIDE
  856. {
  857. boss_faction_championsAI::Reset();
  858. events.ScheduleEvent(EVENT_HEALING_WAVE, urand(5*IN_MILLISECONDS, 10*IN_MILLISECONDS));
  859. events.ScheduleEvent(EVENT_RIPTIDE, urand(5*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  860. events.ScheduleEvent(EVENT_SPIRIT_CLEANSE, urand(15*IN_MILLISECONDS, 25*IN_MILLISECONDS));
  861. events.ScheduleEvent(EVENT_HEAL_BLOODLUST_HEROISM, 20*IN_MILLISECONDS);
  862. events.ScheduleEvent(EVENT_HEX, urand(5*IN_MILLISECONDS, 30*IN_MILLISECONDS));
  863. events.ScheduleEvent(EVENT_EARTH_SHIELD, 1*IN_MILLISECONDS);
  864. events.ScheduleEvent(EVENT_HEAL_EARTH_SHOCK, urand(5*IN_MILLISECONDS, 30*IN_MILLISECONDS));
  865. SetEquipmentSlots(false, 49992, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE);
  866. }
  867.  
  868. void UpdateAI(uint32 diff) OVERRIDE
  869. {
  870. if (!UpdateVictim())
  871. return;
  872.  
  873. events.Update(diff);
  874. boss_faction_championsAI::UpdateAI(diff);
  875.  
  876. if (me->HasUnitState(UNIT_STATE_CASTING))
  877. return;
  878.  
  879. while (uint32 eventId = events.ExecuteEvent())
  880. {
  881. switch (eventId)
  882. {
  883. case EVENT_HEALING_WAVE:
  884. if (Unit* target = DoSelectLowestHpFriendly(40.0f))
  885. DoCast(target, SPELL_HEALING_WAVE);
  886. events.ScheduleEvent(EVENT_HEALING_WAVE, urand(3*IN_MILLISECONDS, 5*IN_MILLISECONDS));
  887. return;
  888. case EVENT_RIPTIDE:
  889. if (Unit* target = DoSelectLowestHpFriendly(40.0f))
  890. DoCast(target, SPELL_RIPTIDE);
  891. events.ScheduleEvent(EVENT_RIPTIDE, urand(5*IN_MILLISECONDS, 15*IN_MILLISECONDS));
  892. return;
  893. case EVENT_SPIRIT_CLEANSE:
  894. if (Unit* target = DoSelectLowestHpFriendly(40.0f))
  895. DoCast(target, SPELL_SPIRIT_CLEANSE);
  896. events.ScheduleEvent(EVENT_SPIRIT_CLEANSE, urand(15*IN_MILLISECONDS, 35*IN_MILLISECONDS));
  897. return;
  898. case EVENT_HEAL_BLOODLUST_HEROISM:
  899. if (me->getFaction()) // alliance = 1
  900. {
  901. if (!me->HasAura(AURA_EXHAUSTION))
  902. DoCastAOE(SPELL_HEROISM);
  903. }
  904. else
  905. {
  906. if (!me->HasAura(AURA_SATED))
  907. DoCastAOE(SPELL_BLOODLUST);
  908. }
  909. events.ScheduleEvent(EVENT_HEAL_BLOODLUST_HEROISM, 5*MINUTE*IN_MILLISECONDS);
  910. return;
  911. case EVENT_HEX:
  912. if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(me)))
  913. DoCast(target, SPELL_HEX);
  914. events.ScheduleEvent(EVENT_HEX, urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS));
  915. return;
  916. case EVENT_EARTH_SHIELD:
  917. if (Creature* target = SelectRandomFriendlyMissingBuff(SPELL_EARTH_SHIELD))
  918. DoCast(target, SPELL_EARTH_SHIELD);
  919. events.ScheduleEvent(EVENT_EARTH_SHIELD, urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS));
  920. return;
  921. case EVENT_HEAL_EARTH_SHOCK:
  922. if (Unit* target = SelectEnemyCaster(true))
  923. DoCast(target, SPELL_EARTH_SHOCK);
  924. events.ScheduleEvent(EVENT_HEAL_EARTH_SHOCK, urand(10*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  925. return;
  926. default:
  927. return;
  928. }
  929. }
  930. }
  931. };
  932.  
  933. CreatureAI* GetAI(Creature* creature) const OVERRIDE
  934. {
  935. return new npc_toc_shamanAI(creature);
  936. }
  937. };
  938.  
  939. class npc_toc_paladin : public CreatureScript
  940. {
  941. public:
  942. npc_toc_paladin() : CreatureScript("npc_toc_paladin") { }
  943.  
  944. struct npc_toc_paladinAI : public boss_faction_championsAI
  945. {
  946. npc_toc_paladinAI(Creature* creature) : boss_faction_championsAI(creature, AI_HEALER) {}
  947.  
  948. void Reset() OVERRIDE
  949. {
  950. boss_faction_championsAI::Reset();
  951. events.ScheduleEvent(EVENT_HAND_OF_FREEDOM, urand(10*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  952. events.ScheduleEvent(EVENT_HEAL_DIVINE_SHIELD, 20*IN_MILLISECONDS);
  953. events.ScheduleEvent(EVENT_CLEANSE, urand(20*IN_MILLISECONDS, 30*IN_MILLISECONDS));
  954. events.ScheduleEvent(EVENT_FLASH_OF_LIGHT, urand(5*IN_MILLISECONDS, 10*IN_MILLISECONDS));
  955. events.ScheduleEvent(EVENT_HOLY_LIGHT, urand(10*IN_MILLISECONDS, 15*IN_MILLISECONDS));
  956. events.ScheduleEvent(EVENT_HOLY_SHOCK, urand(10*IN_MILLISECONDS, 15*IN_MILLISECONDS));
  957. events.ScheduleEvent(EVENT_HEAL_HAND_OF_PROTECTION, urand(30*IN_MILLISECONDS, 60*IN_MILLISECONDS));
  958. events.ScheduleEvent(EVENT_HAMMER_OF_JUSTICE, urand(10*IN_MILLISECONDS, 30*IN_MILLISECONDS));
  959. SetEquipmentSlots(false, 50771, 47079, EQUIP_NO_CHANGE);
  960. }
  961.  
  962. void UpdateAI(uint32 diff) OVERRIDE
  963. {
  964. if (!UpdateVictim())
  965. return;
  966.  
  967. events.Update(diff);
  968. boss_faction_championsAI::UpdateAI(diff);
  969.  
  970. if (me->HasUnitState(UNIT_STATE_CASTING))
  971. return;
  972.  
  973. while (uint32 eventId = events.ExecuteEvent())
  974. {
  975. switch (eventId)
  976. {
  977. case EVENT_HAND_OF_FREEDOM:
  978. if (Unit* target = SelectRandomFriendlyMissingBuff(SPELL_HAND_OF_FREEDOM))
  979. DoCast(target, SPELL_HAND_OF_FREEDOM);
  980. events.ScheduleEvent(EVENT_HAND_OF_FREEDOM, urand(15*IN_MILLISECONDS, 35*IN_MILLISECONDS));
  981. return;
  982. case EVENT_HEAL_DIVINE_SHIELD:
  983. if (HealthBelowPct(30) && !me->HasAura(SPELL_FORBEARANCE))
  984. {
  985. DoCast(me, SPELL_DIVINE_SHIELD);
  986. events.RescheduleEvent(EVENT_HEAL_DIVINE_SHIELD, 5*MINUTE*IN_MILLISECONDS);
  987. }
  988. else
  989. events.RescheduleEvent(EVENT_HEAL_DIVINE_SHIELD, 5*IN_MILLISECONDS);
  990. return;
  991. case EVENT_CLEANSE:
  992. if (Unit* target = DoSelectLowestHpFriendly(40.0f))
  993. DoCast(target, SPELL_CLEANSE);
  994. events.ScheduleEvent(EVENT_CLEANSE, urand(10*IN_MILLISECONDS, 30*IN_MILLISECONDS));
  995. return;
  996. case EVENT_FLASH_OF_LIGHT:
  997. if (Unit* target = DoSelectLowestHpFriendly(40.0f))
  998. DoCast(target, SPELL_FLASH_OF_LIGHT);
  999. events.ScheduleEvent(EVENT_FLASH_OF_LIGHT, urand(3*IN_MILLISECONDS, 5*IN_MILLISECONDS));
  1000. return;
  1001. case EVENT_HOLY_LIGHT:
  1002. if (Unit* target = DoSelectLowestHpFriendly(40.0f))
  1003. DoCast(target, SPELL_HOLY_LIGHT);
  1004. events.ScheduleEvent(EVENT_HOLY_LIGHT, urand(5*IN_MILLISECONDS, 10*IN_MILLISECONDS));
  1005. return;
  1006. case EVENT_HOLY_SHOCK:
  1007. if (Unit* target = DoSelectLowestHpFriendly(40.0f))
  1008. DoCast(target, SPELL_HOLY_SHOCK);
  1009. events.ScheduleEvent(EVENT_HOLY_SHOCK, urand(10*IN_MILLISECONDS, 15*IN_MILLISECONDS));
  1010. return;
  1011. case EVENT_HEAL_HAND_OF_PROTECTION:
  1012. if (Unit* target = DoSelectLowestHpFriendly(30.0f))
  1013. {
  1014. if (!target->HasAura(SPELL_FORBEARANCE))
  1015. {
  1016. DoCast(target, SPELL_HAND_OF_PROTECTION);
  1017. events.RescheduleEvent(EVENT_HEAL_HAND_OF_PROTECTION, 5*MINUTE*IN_MILLISECONDS);
  1018. }
  1019. else
  1020. events.RescheduleEvent(EVENT_HEAL_HAND_OF_PROTECTION, 3*IN_MILLISECONDS);
  1021. }
  1022. else
  1023. events.RescheduleEvent(EVENT_HEAL_HAND_OF_PROTECTION, 10*IN_MILLISECONDS);
  1024. return;
  1025. case EVENT_HAMMER_OF_JUSTICE:
  1026. if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 15.0f, true))
  1027. DoCast(target, SPELL_HAMMER_OF_JUSTICE);
  1028. events.ScheduleEvent(EVENT_HAMMER_OF_JUSTICE, 40*IN_MILLISECONDS);
  1029. return;
  1030. default:
  1031. return;
  1032. }
  1033. }
  1034. }
  1035. };
  1036.  
  1037. CreatureAI* GetAI(Creature* creature) const OVERRIDE
  1038. {
  1039. return new npc_toc_paladinAI(creature);
  1040. }
  1041. };
  1042.  
  1043. class npc_toc_priest : public CreatureScript
  1044. {
  1045. public:
  1046. npc_toc_priest() : CreatureScript("npc_toc_priest") { }
  1047.  
  1048. struct npc_toc_priestAI : public boss_faction_championsAI
  1049. {
  1050. npc_toc_priestAI(Creature* creature) : boss_faction_championsAI(creature, AI_HEALER) {}
  1051.  
  1052. void Reset() OVERRIDE
  1053. {
  1054. boss_faction_championsAI::Reset();
  1055. events.ScheduleEvent(EVENT_RENEW, urand(3*IN_MILLISECONDS, 10*IN_MILLISECONDS));
  1056. events.ScheduleEvent(EVENT_SHIELD, urand(5*IN_MILLISECONDS, 15*IN_MILLISECONDS));
  1057. events.ScheduleEvent(EVENT_FLASH_HEAL, urand(5*IN_MILLISECONDS, 10*IN_MILLISECONDS));
  1058. events.ScheduleEvent(EVENT_HEAL_DISPEL, urand(10*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  1059. events.ScheduleEvent(EVENT_HEAL_PSYCHIC_SCREAM, urand(10*IN_MILLISECONDS, 30*IN_MILLISECONDS));
  1060. events.ScheduleEvent(EVENT_MANA_BURN, urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS));
  1061. events.ScheduleEvent(EVENT_PENANCE, urand(10*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  1062. SetEquipmentSlots(false, 49992, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE);
  1063. }
  1064.  
  1065. void UpdateAI(uint32 diff) OVERRIDE
  1066. {
  1067. if (!UpdateVictim())
  1068. return;
  1069.  
  1070. events.Update(diff);
  1071. boss_faction_championsAI::UpdateAI(diff);
  1072.  
  1073. if (me->HasUnitState(UNIT_STATE_CASTING))
  1074. return;
  1075.  
  1076. while (uint32 eventId = events.ExecuteEvent())
  1077. {
  1078. switch (eventId)
  1079. {
  1080. case EVENT_RENEW:
  1081. if (Unit* target = DoSelectLowestHpFriendly(40.0f))
  1082. DoCast(target, SPELL_RENEW);
  1083. events.ScheduleEvent(EVENT_RENEW, urand(3*IN_MILLISECONDS, 5*IN_MILLISECONDS));
  1084. return;
  1085. case EVENT_SHIELD:
  1086. if (Unit* target = DoSelectLowestHpFriendly(40.0f))
  1087. DoCast(target, SPELL_SHIELD);
  1088. events.ScheduleEvent(EVENT_SHIELD, urand(15*IN_MILLISECONDS, 35*IN_MILLISECONDS));
  1089. return;
  1090. case EVENT_FLASH_HEAL:
  1091. if (Unit* target = DoSelectLowestHpFriendly(40.0f))
  1092. DoCast(target, SPELL_FLASH_HEAL);
  1093. events.ScheduleEvent(EVENT_FLASH_HEAL, urand(3*IN_MILLISECONDS, 5*IN_MILLISECONDS));
  1094. return;
  1095. case EVENT_HEAL_DISPEL:
  1096. if (Unit* target = urand(0, 1) ? SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true) : DoSelectLowestHpFriendly(40.0f))
  1097. DoCast(target, SPELL_DISPEL);
  1098. events.ScheduleEvent(EVENT_HEAL_DISPEL, urand(10*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  1099. return;
  1100. case EVENT_HEAL_PSYCHIC_SCREAM:
  1101. if (EnemiesInRange(10.0f) >= 2)
  1102. DoCastAOE(SPELL_PSYCHIC_SCREAM);
  1103. events.ScheduleEvent(EVENT_HEAL_PSYCHIC_SCREAM, urand(10*IN_MILLISECONDS, 25*IN_MILLISECONDS));
  1104. return;
  1105. case EVENT_MANA_BURN:
  1106. if (Unit* target = SelectEnemyCaster(false))
  1107. DoCast(target, SPELL_MANA_BURN);
  1108. events.ScheduleEvent(EVENT_MANA_BURN, urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS));
  1109. return;
  1110. case EVENT_PENANCE:
  1111. if (Unit* target = DoSelectLowestHpFriendly(40.0f))
  1112. DoCast(target, SPELL_PENANCE);
  1113. events.ScheduleEvent(EVENT_PENANCE, urand(10*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  1114. return;
  1115. default:
  1116. return;
  1117. }
  1118. }
  1119. }
  1120. };
  1121.  
  1122. CreatureAI* GetAI(Creature* creature) const OVERRIDE
  1123. {
  1124. return new npc_toc_priestAI(creature);
  1125. }
  1126. };
  1127.  
  1128. /********************************************************************
  1129. RANGED
  1130. ********************************************************************/
  1131. class npc_toc_shadow_priest : public CreatureScript
  1132. {
  1133. public:
  1134. npc_toc_shadow_priest() : CreatureScript("npc_toc_shadow_priest") { }
  1135.  
  1136. struct npc_toc_shadow_priestAI : public boss_faction_championsAI
  1137. {
  1138. npc_toc_shadow_priestAI(Creature* creature) : boss_faction_championsAI(creature, AI_RANGED) {}
  1139.  
  1140. void Reset() OVERRIDE
  1141. {
  1142. boss_faction_championsAI::Reset();
  1143. events.ScheduleEvent(EVENT_SILENCE, urand(10*IN_MILLISECONDS, 25*IN_MILLISECONDS));
  1144. events.ScheduleEvent(EVENT_VAMPIRIC_TOUCH, urand(5*IN_MILLISECONDS, 15*IN_MILLISECONDS));
  1145. events.ScheduleEvent(EVENT_SW_PAIN, urand(3*IN_MILLISECONDS, 10*IN_MILLISECONDS));
  1146. events.ScheduleEvent(EVENT_MIND_BLAST, urand(5*IN_MILLISECONDS, 15*IN_MILLISECONDS));
  1147. events.ScheduleEvent(EVENT_HORROR, urand(10*IN_MILLISECONDS, 25*IN_MILLISECONDS));
  1148. events.ScheduleEvent(EVENT_DISPERSION, urand(20*IN_MILLISECONDS, 40*IN_MILLISECONDS));
  1149. events.ScheduleEvent(EVENT_DPS_DISPEL, urand(10*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  1150. events.ScheduleEvent(EVENT_DPS_PSYCHIC_SCREAM, urand(10*IN_MILLISECONDS, 30*IN_MILLISECONDS));
  1151. SetEquipmentSlots(false, 50040, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE);
  1152. DoCast(me, SPELL_SHADOWFORM);
  1153. }
  1154.  
  1155. void UpdateAI(uint32 diff) OVERRIDE
  1156. {
  1157. if (!UpdateVictim())
  1158. return;
  1159.  
  1160. events.Update(diff);
  1161. boss_faction_championsAI::UpdateAI(diff);
  1162.  
  1163. if (me->HasUnitState(UNIT_STATE_CASTING))
  1164. return;
  1165.  
  1166. while (uint32 eventId = events.ExecuteEvent())
  1167. {
  1168. switch (eventId)
  1169. {
  1170. case EVENT_SILENCE:
  1171. if (Unit* target = SelectEnemyCaster(true))
  1172. DoCast(target, SPELL_SILENCE);
  1173. events.ScheduleEvent(EVENT_SILENCE, urand(10*IN_MILLISECONDS, 25*IN_MILLISECONDS));
  1174. return;
  1175. case EVENT_VAMPIRIC_TOUCH:
  1176. if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true))
  1177. DoCast(target, SPELL_VAMPIRIC_TOUCH);
  1178. events.ScheduleEvent(EVENT_VAMPIRIC_TOUCH, urand(10*IN_MILLISECONDS, 35*IN_MILLISECONDS));
  1179. return;
  1180. case EVENT_SW_PAIN:
  1181. if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true))
  1182. DoCast(target, SPELL_SW_PAIN);
  1183. events.ScheduleEvent(EVENT_SW_PAIN, urand(10*IN_MILLISECONDS, 35*IN_MILLISECONDS));
  1184. return;
  1185. case EVENT_MIND_BLAST:
  1186. DoCastVictim(SPELL_MIND_BLAST);
  1187. events.ScheduleEvent(EVENT_MIND_BLAST, urand(10*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  1188. return;
  1189. case EVENT_HORROR:
  1190. DoCastVictim(SPELL_HORROR);
  1191. events.ScheduleEvent(EVENT_HORROR, urand(15*IN_MILLISECONDS, 35*IN_MILLISECONDS));
  1192. return;
  1193. case EVENT_DISPERSION:
  1194. if (HealthBelowPct(40))
  1195. {
  1196. DoCast(me, SPELL_DISPERSION);
  1197. events.RescheduleEvent(EVENT_DISPERSION, 180*IN_MILLISECONDS);
  1198. }
  1199. else
  1200. events.RescheduleEvent(EVENT_DISPERSION, 5*IN_MILLISECONDS);
  1201. return;
  1202. case EVENT_DPS_DISPEL:
  1203. if (Unit* target = urand(0, 1) ? SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true) : DoSelectLowestHpFriendly(40.0f))
  1204. DoCast(target, SPELL_DISPEL);
  1205. events.ScheduleEvent(EVENT_DPS_DISPEL, urand(10*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  1206. return;
  1207. case EVENT_DPS_PSYCHIC_SCREAM:
  1208. if (EnemiesInRange(10.0f) >= 2)
  1209. DoCastAOE(SPELL_PSYCHIC_SCREAM);
  1210. events.ScheduleEvent(EVENT_DPS_PSYCHIC_SCREAM, urand(10*IN_MILLISECONDS, 25*IN_MILLISECONDS));
  1211. return;
  1212. default:
  1213. return;
  1214. }
  1215. }
  1216. DoSpellAttackIfReady(SPELL_MIND_FLAY);
  1217. }
  1218. };
  1219.  
  1220. CreatureAI* GetAI(Creature* creature) const OVERRIDE
  1221. {
  1222. return new npc_toc_shadow_priestAI(creature);
  1223. }
  1224. };
  1225.  
  1226. class npc_toc_warlock : public CreatureScript
  1227. {
  1228. public:
  1229. npc_toc_warlock() : CreatureScript("npc_toc_warlock") { }
  1230.  
  1231. struct npc_toc_warlockAI : public boss_faction_championsAI
  1232. {
  1233. npc_toc_warlockAI(Creature* creature) : boss_faction_championsAI(creature, AI_RANGED) {}
  1234.  
  1235. void Reset() OVERRIDE
  1236. {
  1237. boss_faction_championsAI::Reset();
  1238. events.ScheduleEvent(EVENT_HELLFIRE, urand(10*IN_MILLISECONDS, 30*IN_MILLISECONDS));
  1239. events.ScheduleEvent(EVENT_CORRUPTION, urand(2*IN_MILLISECONDS, 5*IN_MILLISECONDS));
  1240. events.ScheduleEvent(EVENT_CURSE_OF_AGONY, urand(5*IN_MILLISECONDS, 10*IN_MILLISECONDS));
  1241. events.ScheduleEvent(EVENT_CURSE_OF_EXHAUSTION, urand(5*IN_MILLISECONDS, 10*IN_MILLISECONDS));
  1242. events.ScheduleEvent(EVENT_FEAR, urand(5*IN_MILLISECONDS, 15*IN_MILLISECONDS));
  1243. events.ScheduleEvent(EVENT_SEARING_PAIN, urand(5*IN_MILLISECONDS, 12*IN_MILLISECONDS));
  1244. events.ScheduleEvent(EVENT_UNSTABLE_AFFLICTION, urand(7*IN_MILLISECONDS, 15*IN_MILLISECONDS));
  1245. SetEquipmentSlots(false, 49992, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE);
  1246. }
  1247.  
  1248. void EnterCombat(Unit* who) OVERRIDE
  1249. {
  1250. boss_faction_championsAI::EnterCombat(who);
  1251. DoCast(SPELL_SUMMON_FELHUNTER);
  1252. }
  1253.  
  1254. void UpdateAI(uint32 diff) OVERRIDE
  1255. {
  1256. if (!UpdateVictim())
  1257. return;
  1258.  
  1259. events.Update(diff);
  1260. boss_faction_championsAI::UpdateAI(diff);
  1261.  
  1262. if (me->HasUnitState(UNIT_STATE_CASTING))
  1263. return;
  1264.  
  1265. while (uint32 eventId = events.ExecuteEvent())
  1266. {
  1267. switch (eventId)
  1268. {
  1269. case EVENT_HELLFIRE:
  1270. if (EnemiesInRange(10.0f) >= 2)
  1271. DoCastAOE(SPELL_HELLFIRE);
  1272. events.ScheduleEvent(EVENT_HELLFIRE, urand(10*IN_MILLISECONDS, 30*IN_MILLISECONDS));
  1273. return;
  1274. case EVENT_CORRUPTION:
  1275. if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f))
  1276. DoCast(target, SPELL_CORRUPTION);
  1277. events.ScheduleEvent(EVENT_CORRUPTION, urand(15*IN_MILLISECONDS, 25*IN_MILLISECONDS));
  1278. return;
  1279. case EVENT_CURSE_OF_AGONY:
  1280. if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f))
  1281. DoCast(target, SPELL_CURSE_OF_AGONY);
  1282. events.ScheduleEvent(EVENT_CURSE_OF_AGONY, urand(20*IN_MILLISECONDS, 35*IN_MILLISECONDS));
  1283. return;
  1284. case EVENT_CURSE_OF_EXHAUSTION:
  1285. if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f))
  1286. DoCast(target, SPELL_CURSE_OF_EXHAUSTION);
  1287. events.ScheduleEvent(EVENT_CURSE_OF_EXHAUSTION, urand(20*IN_MILLISECONDS, 35*IN_MILLISECONDS));
  1288. return;
  1289. case EVENT_FEAR:
  1290. if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 20.0f, true))
  1291. DoCast(target, SPELL_FEAR);
  1292. events.ScheduleEvent(EVENT_FEAR, urand(5*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  1293. return;
  1294. case EVENT_SEARING_PAIN:
  1295. DoCastVictim(SPELL_SEARING_PAIN);
  1296. events.ScheduleEvent(EVENT_SEARING_PAIN, urand(10*IN_MILLISECONDS, 25*IN_MILLISECONDS));
  1297. return;
  1298. case EVENT_UNSTABLE_AFFLICTION:
  1299. if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true))
  1300. DoCast(target, SPELL_UNSTABLE_AFFLICTION);
  1301. events.ScheduleEvent(EVENT_UNSTABLE_AFFLICTION, urand(10*IN_MILLISECONDS, 25*IN_MILLISECONDS));
  1302. return;
  1303. default:
  1304. return;
  1305. }
  1306. }
  1307. DoSpellAttackIfReady(SPELL_SHADOW_BOLT);
  1308. }
  1309. };
  1310.  
  1311. CreatureAI* GetAI(Creature* creature) const OVERRIDE
  1312. {
  1313. return new npc_toc_warlockAI(creature);
  1314. }
  1315. };
  1316.  
  1317. class npc_toc_mage : public CreatureScript
  1318. {
  1319. public:
  1320. npc_toc_mage() : CreatureScript("npc_toc_mage") { }
  1321.  
  1322. struct npc_toc_mageAI : public boss_faction_championsAI
  1323. {
  1324. npc_toc_mageAI(Creature* creature) : boss_faction_championsAI(creature, AI_RANGED) {}
  1325.  
  1326. void Reset() OVERRIDE
  1327. {
  1328. boss_faction_championsAI::Reset();
  1329. events.ScheduleEvent(EVENT_ARCANE_BARRAGE, urand(1*IN_MILLISECONDS, 5*IN_MILLISECONDS));
  1330. events.ScheduleEvent(EVENT_ARCANE_BLAST, urand(3*IN_MILLISECONDS, 5*IN_MILLISECONDS));
  1331. events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, urand(5*IN_MILLISECONDS, 15*IN_MILLISECONDS));
  1332. events.ScheduleEvent(EVENT_BLINK, urand(15*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  1333. events.ScheduleEvent(EVENT_COUNTERSPELL, urand(10*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  1334. events.ScheduleEvent(EVENT_FROST_NOVA, urand(5*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  1335. events.ScheduleEvent(EVENT_ICE_BLOCK, urand(10*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  1336. events.ScheduleEvent(EVENT_POLYMORPH, urand(5*IN_MILLISECONDS, 15*IN_MILLISECONDS));
  1337. SetEquipmentSlots(false, 47524, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE);
  1338. }
  1339.  
  1340. void UpdateAI(uint32 diff) OVERRIDE
  1341. {
  1342. if (!UpdateVictim())
  1343. return;
  1344.  
  1345. events.Update(diff);
  1346. boss_faction_championsAI::UpdateAI(diff);
  1347.  
  1348. if (me->HasUnitState(UNIT_STATE_CASTING))
  1349. return;
  1350.  
  1351. while (uint32 eventId = events.ExecuteEvent())
  1352. {
  1353. switch (eventId)
  1354. {
  1355. case EVENT_ARCANE_BARRAGE:
  1356. DoCastVictim(SPELL_ARCANE_BARRAGE);
  1357. events.ScheduleEvent(EVENT_ARCANE_BARRAGE, urand(5*IN_MILLISECONDS, 7*IN_MILLISECONDS));
  1358. return;
  1359. case EVENT_ARCANE_BLAST:
  1360. DoCastVictim(SPELL_ARCANE_BLAST);
  1361. events.ScheduleEvent(EVENT_ARCANE_BLAST, urand(5*IN_MILLISECONDS, 15*IN_MILLISECONDS));
  1362. return;
  1363. case EVENT_ARCANE_EXPLOSION:
  1364. if (EnemiesInRange(10.0f) >= 2)
  1365. DoCastAOE(SPELL_ARCANE_EXPLOSION);
  1366. events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, urand(10*IN_MILLISECONDS, 30*IN_MILLISECONDS));
  1367. return;
  1368. case EVENT_BLINK:
  1369. if (EnemiesInRange(10.0f) >= 2)
  1370. DoCast(SPELL_BLINK);
  1371. events.ScheduleEvent(EVENT_BLINK, urand(10*IN_MILLISECONDS, 30*IN_MILLISECONDS));
  1372. return;
  1373. case EVENT_COUNTERSPELL:
  1374. if (Unit* target = SelectEnemyCaster(true))
  1375. DoCast(target, SPELL_COUNTERSPELL);
  1376. events.ScheduleEvent(EVENT_COUNTERSPELL, 24*IN_MILLISECONDS);
  1377. return;
  1378. case EVENT_FROST_NOVA:
  1379. if (EnemiesInRange(10.0f) >= 2)
  1380. DoCastAOE(SPELL_FROST_NOVA);
  1381. events.ScheduleEvent(EVENT_FROST_NOVA, 25*IN_MILLISECONDS);
  1382. return;
  1383. case EVENT_ICE_BLOCK:
  1384. if (HealthBelowPct(30))
  1385. {
  1386. DoCast(SPELL_ICE_BLOCK);
  1387. events.RescheduleEvent(EVENT_ICE_BLOCK, 5*MINUTE*IN_MILLISECONDS);
  1388. }
  1389. else
  1390. events.RescheduleEvent(EVENT_ICE_BLOCK, 5*IN_MILLISECONDS);
  1391. return;
  1392. case EVENT_POLYMORPH:
  1393. if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(me)))
  1394. DoCast(target, SPELL_POLYMORPH);
  1395. events.ScheduleEvent(EVENT_POLYMORPH, urand(10*IN_MILLISECONDS, 30*IN_MILLISECONDS));
  1396. return;
  1397. default:
  1398. return;
  1399. }
  1400. }
  1401. DoSpellAttackIfReady(SPELL_FROSTBOLT);
  1402. }
  1403. };
  1404.  
  1405. CreatureAI* GetAI(Creature* creature) const OVERRIDE
  1406. {
  1407. return new npc_toc_mageAI(creature);
  1408. }
  1409. };
  1410.  
  1411. class npc_toc_hunter : public CreatureScript
  1412. {
  1413. public:
  1414. npc_toc_hunter() : CreatureScript("npc_toc_hunter") { }
  1415.  
  1416. struct npc_toc_hunterAI : public boss_faction_championsAI
  1417. {
  1418. npc_toc_hunterAI(Creature* creature) : boss_faction_championsAI(creature, AI_RANGED) {}
  1419.  
  1420. void Reset() OVERRIDE
  1421. {
  1422. boss_faction_championsAI::Reset();
  1423. events.ScheduleEvent(EVENT_AIMED_SHOT, urand(5*IN_MILLISECONDS, 10*IN_MILLISECONDS));
  1424. events.ScheduleEvent(EVENT_DETERRENCE, urand(10*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  1425. events.ScheduleEvent(EVENT_DISENGAGE, urand(10*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  1426. events.ScheduleEvent(EVENT_EXPLOSIVE_SHOT, urand(3*IN_MILLISECONDS, 5*IN_MILLISECONDS));
  1427. events.ScheduleEvent(EVENT_FROST_TRAP, urand(10*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  1428. events.ScheduleEvent(EVENT_STEADY_SHOT, urand(5*IN_MILLISECONDS, 10*IN_MILLISECONDS));
  1429. events.ScheduleEvent(EVENT_WING_CLIP, urand(10*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  1430. events.ScheduleEvent(EVENT_WYVERN_STING, urand(10*IN_MILLISECONDS, 25*IN_MILLISECONDS));
  1431. SetEquipmentSlots(false, 47156, EQUIP_NO_CHANGE, 48711);
  1432. }
  1433.  
  1434. void EnterCombat(Unit* who) OVERRIDE
  1435. {
  1436. boss_faction_championsAI::EnterCombat(who);
  1437. DoCast(SPELL_CALL_PET);
  1438. }
  1439.  
  1440. void UpdateAI(uint32 diff) OVERRIDE
  1441. {
  1442. if (!UpdateVictim())
  1443. return;
  1444.  
  1445. events.Update(diff);
  1446. boss_faction_championsAI::UpdateAI(diff);
  1447.  
  1448. if (me->HasUnitState(UNIT_STATE_CASTING))
  1449. return;
  1450.  
  1451. while (uint32 eventId = events.ExecuteEvent())
  1452. {
  1453. switch (eventId)
  1454. {
  1455. case EVENT_AIMED_SHOT:
  1456. DoCastVictim(SPELL_AIMED_SHOT);
  1457. events.ScheduleEvent(EVENT_AIMED_SHOT, urand(10*IN_MILLISECONDS, 15*IN_MILLISECONDS));
  1458. return;
  1459. case EVENT_DETERRENCE:
  1460. if (HealthBelowPct(30))
  1461. {
  1462. DoCast(SPELL_DETERRENCE);
  1463. events.RescheduleEvent(EVENT_DETERRENCE, 150*IN_MILLISECONDS);
  1464. }
  1465. else
  1466. events.RescheduleEvent(EVENT_DETERRENCE, 10*IN_MILLISECONDS);
  1467. return;
  1468. case EVENT_DISENGAGE:
  1469. if (EnemiesInRange(10.0f) >= 2)
  1470. DoCast(SPELL_DISENGAGE);
  1471. events.ScheduleEvent(EVENT_DISENGAGE, 30*IN_MILLISECONDS);
  1472. return;
  1473. case EVENT_EXPLOSIVE_SHOT:
  1474. DoCastVictim(SPELL_EXPLOSIVE_SHOT);
  1475. events.ScheduleEvent(EVENT_EXPLOSIVE_SHOT, urand(6*IN_MILLISECONDS, 10*IN_MILLISECONDS));
  1476. return;
  1477. case EVENT_FROST_TRAP:
  1478. if (EnemiesInRange(10.0f) >= 2)
  1479. DoCastAOE(SPELL_FROST_TRAP);
  1480. events.ScheduleEvent(EVENT_FROST_TRAP, 30*IN_MILLISECONDS);
  1481. return;
  1482. case EVENT_STEADY_SHOT:
  1483. DoCastVictim(SPELL_STEADY_SHOT);
  1484. events.ScheduleEvent(EVENT_STEADY_SHOT, urand(5*IN_MILLISECONDS, 15*IN_MILLISECONDS));
  1485. return;
  1486. case EVENT_WING_CLIP:
  1487. if (Unit* target = me->GetVictim())
  1488. {
  1489. if (me->GetDistance2d(target) < 6.0f)
  1490. DoCast(target, SPELL_WING_CLIP);
  1491. }
  1492. events.ScheduleEvent(EVENT_WING_CLIP, urand(15*IN_MILLISECONDS, 25*IN_MILLISECONDS));
  1493. return;
  1494. case EVENT_WYVERN_STING:
  1495. if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(me)))
  1496. DoCast(target, SPELL_WYVERN_STING);
  1497. events.ScheduleEvent(EVENT_WYVERN_STING, urand(10*IN_MILLISECONDS, 30*IN_MILLISECONDS));
  1498. return;
  1499. default:
  1500. return;
  1501. }
  1502. }
  1503. DoSpellAttackIfReady(SPELL_SHOOT);
  1504. }
  1505. };
  1506.  
  1507. CreatureAI* GetAI(Creature* creature) const OVERRIDE
  1508. {
  1509. return new npc_toc_hunterAI(creature);
  1510. }
  1511. };
  1512.  
  1513. class npc_toc_boomkin : public CreatureScript
  1514. {
  1515. public:
  1516. npc_toc_boomkin() : CreatureScript("npc_toc_boomkin") { }
  1517.  
  1518. struct npc_toc_boomkinAI : public boss_faction_championsAI
  1519. {
  1520. npc_toc_boomkinAI(Creature* creature) : boss_faction_championsAI(creature, AI_RANGED) {}
  1521.  
  1522. void Reset() OVERRIDE
  1523. {
  1524. boss_faction_championsAI::Reset();
  1525. events.ScheduleEvent(EVENT_CYCLONE, urand(10*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  1526. events.ScheduleEvent(EVENT_ENTANGLING_ROOTS, urand(10*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  1527. events.ScheduleEvent(EVENT_FAERIE_FIRE, urand(2*IN_MILLISECONDS, 5*IN_MILLISECONDS));
  1528. events.ScheduleEvent(EVENT_FORCE_OF_NATURE, urand(20*IN_MILLISECONDS, 30*IN_MILLISECONDS));
  1529. events.ScheduleEvent(EVENT_INSECT_SWARM, urand(5*IN_MILLISECONDS, 10*IN_MILLISECONDS));
  1530. events.ScheduleEvent(EVENT_MOONFIRE, urand(10*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  1531. events.ScheduleEvent(EVENT_STARFIRE, urand(10*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  1532. events.ScheduleEvent(EVENT_DPS_BARKSKIN, urand(20*IN_MILLISECONDS, 30*IN_MILLISECONDS));
  1533.  
  1534. SetEquipmentSlots(false, 50966, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE);
  1535. }
  1536.  
  1537. void UpdateAI(uint32 diff) OVERRIDE
  1538. {
  1539. if (!UpdateVictim())
  1540. return;
  1541.  
  1542. events.Update(diff);
  1543. boss_faction_championsAI::UpdateAI(diff);
  1544.  
  1545. if (me->HasUnitState(UNIT_STATE_CASTING))
  1546. return;
  1547.  
  1548. while (uint32 eventId = events.ExecuteEvent())
  1549. {
  1550. switch (eventId)
  1551. {
  1552. case EVENT_CYCLONE:
  1553. if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(me)))
  1554. DoCast(target, SPELL_CYCLONE);
  1555. events.ScheduleEvent(EVENT_CYCLONE, urand(10*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  1556. return;
  1557. case EVENT_ENTANGLING_ROOTS:
  1558. if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true))
  1559. DoCast(target, SPELL_ENTANGLING_ROOTS);
  1560. events.ScheduleEvent(EVENT_ENTANGLING_ROOTS, urand(10*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  1561. return;
  1562. case EVENT_FAERIE_FIRE:
  1563. DoCastVictim(SPELL_FAERIE_FIRE);
  1564. events.ScheduleEvent(EVENT_FAERIE_FIRE, urand(30*IN_MILLISECONDS, 40*IN_MILLISECONDS));
  1565. return;
  1566. case EVENT_FORCE_OF_NATURE:
  1567. DoCastVictim(SPELL_FORCE_OF_NATURE);
  1568. events.ScheduleEvent(EVENT_FORCE_OF_NATURE, 180*IN_MILLISECONDS);
  1569. return;
  1570. case EVENT_INSECT_SWARM:
  1571. DoCastVictim(SPELL_INSECT_SWARM);
  1572. events.ScheduleEvent(EVENT_INSECT_SWARM, urand(15*IN_MILLISECONDS, 25*IN_MILLISECONDS));
  1573. return;
  1574. case EVENT_MOONFIRE:
  1575. DoCastVictim(SPELL_MOONFIRE);
  1576. events.ScheduleEvent(EVENT_MOONFIRE, urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS));
  1577. return;
  1578. case EVENT_STARFIRE:
  1579. DoCastVictim(SPELL_STARFIRE);
  1580. events.ScheduleEvent(EVENT_STARFIRE, urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS));
  1581. return;
  1582. case EVENT_DPS_BARKSKIN:
  1583. if (HealthBelowPct(30))
  1584. {
  1585. DoCast(me, SPELL_BARKSKIN);
  1586. events.RescheduleEvent(EVENT_DPS_BARKSKIN, 60*IN_MILLISECONDS);
  1587. }
  1588. else
  1589. events.RescheduleEvent(EVENT_DPS_BARKSKIN, 5*IN_MILLISECONDS);
  1590. return;
  1591. default:
  1592. return;
  1593. }
  1594. }
  1595. DoSpellAttackIfReady(SPELL_WRATH);
  1596. }
  1597. };
  1598.  
  1599. CreatureAI* GetAI(Creature* creature) const OVERRIDE
  1600. {
  1601. return new npc_toc_boomkinAI(creature);
  1602. }
  1603. };
  1604.  
  1605. /********************************************************************
  1606. MELEE
  1607. ********************************************************************/
  1608. class npc_toc_warrior : public CreatureScript
  1609. {
  1610. public:
  1611. npc_toc_warrior() : CreatureScript("npc_toc_warrior") { }
  1612.  
  1613. struct npc_toc_warriorAI : public boss_faction_championsAI
  1614. {
  1615. npc_toc_warriorAI(Creature* creature) : boss_faction_championsAI(creature, AI_MELEE) {}
  1616.  
  1617. void Reset() OVERRIDE
  1618. {
  1619. boss_faction_championsAI::Reset();
  1620. events.ScheduleEvent(EVENT_BLADESTORM, urand(10*IN_MILLISECONDS, 15*IN_MILLISECONDS));
  1621. events.ScheduleEvent(EVENT_INTIMIDATING_SHOUT, urand(20*IN_MILLISECONDS, 25*IN_MILLISECONDS));
  1622. events.ScheduleEvent(EVENT_MORTAL_STRIKE, urand(5*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  1623. events.ScheduleEvent(EVENT_WARR_CHARGE, 1*IN_MILLISECONDS);
  1624. events.ScheduleEvent(EVENT_DISARM, urand(5*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  1625. events.ScheduleEvent(EVENT_OVERPOWER, urand(10*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  1626. events.ScheduleEvent(EVENT_SUNDER_ARMOR, urand(5*IN_MILLISECONDS, 10*IN_MILLISECONDS));
  1627. events.ScheduleEvent(EVENT_SHATTERING_THROW, urand(20*IN_MILLISECONDS, 40*IN_MILLISECONDS));
  1628. events.ScheduleEvent(EVENT_RETALIATION, urand(5*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  1629. SetEquipmentSlots(false, 47427, 46964, EQUIP_NO_CHANGE);
  1630. }
  1631.  
  1632. void UpdateAI(uint32 diff) OVERRIDE
  1633. {
  1634. if (!UpdateVictim())
  1635. return;
  1636.  
  1637. events.Update(diff);
  1638. boss_faction_championsAI::UpdateAI(diff);
  1639.  
  1640. if (me->HasUnitState(UNIT_STATE_CASTING))
  1641. return;
  1642.  
  1643. while (uint32 eventId = events.ExecuteEvent())
  1644. {
  1645. switch (eventId)
  1646. {
  1647. case EVENT_BLADESTORM:
  1648. DoCastVictim(SPELL_BLADESTORM);
  1649. events.ScheduleEvent(EVENT_BLADESTORM, 150*IN_MILLISECONDS);
  1650. return;
  1651. case EVENT_INTIMIDATING_SHOUT:
  1652. DoCastAOE(SPELL_INTIMIDATING_SHOUT);
  1653. events.ScheduleEvent(EVENT_INTIMIDATING_SHOUT, 120*IN_MILLISECONDS);
  1654. return;
  1655. case EVENT_MORTAL_STRIKE:
  1656. DoCastVictim(SPELL_MORTAL_STRIKE);
  1657. events.ScheduleEvent(EVENT_MORTAL_STRIKE, urand(10*IN_MILLISECONDS, 25*IN_MILLISECONDS));
  1658. return;
  1659. case EVENT_WARR_CHARGE:
  1660. DoCastVictim(SPELL_CHARGE);
  1661. events.ScheduleEvent(EVENT_WARR_CHARGE, urand(10*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  1662. return;
  1663. case EVENT_DISARM:
  1664. DoCastVictim(SPELL_DISARM);
  1665. events.ScheduleEvent(EVENT_DISARM, urand(15*IN_MILLISECONDS, 35*IN_MILLISECONDS));
  1666. return;
  1667. case EVENT_OVERPOWER:
  1668. DoCastVictim(SPELL_OVERPOWER);
  1669. events.ScheduleEvent(EVENT_OVERPOWER, urand(20*IN_MILLISECONDS, 40*IN_MILLISECONDS));
  1670. return;
  1671. case EVENT_SUNDER_ARMOR:
  1672. DoCastVictim(SPELL_SUNDER_ARMOR);
  1673. events.ScheduleEvent(EVENT_SUNDER_ARMOR, urand(2*IN_MILLISECONDS, 5*IN_MILLISECONDS));
  1674. return;
  1675. case EVENT_SHATTERING_THROW:
  1676. if (Unit* target = me->GetVictim())
  1677. {
  1678. if (target->HasAuraWithMechanic(1 << MECHANIC_IMMUNE_SHIELD))
  1679. {
  1680. DoCast(target, SPELL_SHATTERING_THROW);
  1681. events.RescheduleEvent(EVENT_SHATTERING_THROW, 5*MINUTE*IN_MILLISECONDS);
  1682. return;
  1683. }
  1684. }
  1685. events.RescheduleEvent(EVENT_SHATTERING_THROW, 3*IN_MILLISECONDS);
  1686. return;
  1687. case EVENT_RETALIATION:
  1688. if (HealthBelowPct(50))
  1689. {
  1690. DoCast(SPELL_RETALIATION);
  1691. events.RescheduleEvent(EVENT_RETALIATION, 5*MINUTE*IN_MILLISECONDS);
  1692. }
  1693. else
  1694. events.RescheduleEvent(EVENT_RETALIATION, 5*IN_MILLISECONDS);
  1695. return;
  1696. default:
  1697. return;
  1698. }
  1699. }
  1700. }
  1701. };
  1702.  
  1703. CreatureAI* GetAI(Creature* creature) const OVERRIDE
  1704. {
  1705. return new npc_toc_warriorAI(creature);
  1706. }
  1707. };
  1708.  
  1709. class npc_toc_dk : public CreatureScript
  1710. {
  1711. public:
  1712. npc_toc_dk() : CreatureScript("npc_toc_dk") { }
  1713.  
  1714. struct npc_toc_dkAI : public boss_faction_championsAI
  1715. {
  1716. npc_toc_dkAI(Creature* creature) : boss_faction_championsAI(creature, AI_MELEE) {}
  1717.  
  1718. void Reset() OVERRIDE
  1719. {
  1720. boss_faction_championsAI::Reset();
  1721. events.ScheduleEvent(EVENT_CHAINS_OF_ICE, urand(5*IN_MILLISECONDS, 15*IN_MILLISECONDS));
  1722. events.ScheduleEvent(EVENT_DEATH_COIL, urand(10*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  1723. events.ScheduleEvent(EVENT_DEATH_GRIP, urand(15*IN_MILLISECONDS, 25*IN_MILLISECONDS));
  1724. events.ScheduleEvent(EVENT_FROST_STRIKE, urand(5*IN_MILLISECONDS, 10*IN_MILLISECONDS));
  1725. events.ScheduleEvent(EVENT_ICEBOUND_FORTITUDE, urand(25*IN_MILLISECONDS, 35*IN_MILLISECONDS));
  1726. events.ScheduleEvent(EVENT_ICY_TOUCH, urand(10*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  1727. events.ScheduleEvent(EVENT_STRANGULATE, urand(5*IN_MILLISECONDS, 25*IN_MILLISECONDS));
  1728. SetEquipmentSlots(false, 47518, 51021, EQUIP_NO_CHANGE);
  1729. }
  1730.  
  1731. void UpdateAI(uint32 diff) OVERRIDE
  1732. {
  1733. if (!UpdateVictim())
  1734. return;
  1735.  
  1736. events.Update(diff);
  1737. boss_faction_championsAI::UpdateAI(diff);
  1738.  
  1739. if (me->HasUnitState(UNIT_STATE_CASTING))
  1740. return;
  1741.  
  1742. while (uint32 eventId = events.ExecuteEvent())
  1743. {
  1744. switch (eventId)
  1745. {
  1746. case EVENT_CHAINS_OF_ICE:
  1747. DoCastVictim(SPELL_CHAINS_OF_ICE);
  1748. events.ScheduleEvent(EVENT_CHAINS_OF_ICE, urand(15*IN_MILLISECONDS, 25*IN_MILLISECONDS));
  1749. return;
  1750. case EVENT_DEATH_COIL:
  1751. DoCastVictim(SPELL_DEATH_COIL);
  1752. events.ScheduleEvent(EVENT_DEATH_COIL, urand(5*IN_MILLISECONDS, 15*IN_MILLISECONDS));
  1753. return;
  1754. case EVENT_DEATH_GRIP:
  1755. if (Unit* target = me->GetVictim())
  1756. {
  1757. if (me->IsInRange(target, 5.0f, 30.0f, false))
  1758. {
  1759. DoCast(target, SPELL_DEATH_GRIP);
  1760. events.RescheduleEvent(EVENT_DEATH_GRIP, 35*IN_MILLISECONDS);
  1761. return;
  1762. }
  1763. }
  1764. events.RescheduleEvent(EVENT_DEATH_GRIP, 3*IN_MILLISECONDS);
  1765. return;
  1766. case EVENT_FROST_STRIKE:
  1767. DoCastVictim(SPELL_FROST_STRIKE);
  1768. events.ScheduleEvent(EVENT_FROST_STRIKE, urand(6*IN_MILLISECONDS, 10*IN_MILLISECONDS));
  1769. return;
  1770. case EVENT_ICEBOUND_FORTITUDE:
  1771. if (HealthBelowPct(50))
  1772. {
  1773. DoCast(SPELL_ICEBOUND_FORTITUDE);
  1774. events.RescheduleEvent(EVENT_ICEBOUND_FORTITUDE, 60*IN_MILLISECONDS);
  1775. }
  1776. else
  1777. events.RescheduleEvent(EVENT_ICEBOUND_FORTITUDE, 5*IN_MILLISECONDS);
  1778. return;
  1779. case EVENT_ICY_TOUCH:
  1780. DoCastVictim(SPELL_ICY_TOUCH);
  1781. events.ScheduleEvent(EVENT_ICY_TOUCH, urand(10*IN_MILLISECONDS, 15*IN_MILLISECONDS));
  1782. return;
  1783. case EVENT_STRANGULATE:
  1784. if (Unit* target = SelectEnemyCaster(false))
  1785. {
  1786. DoCast(target, SPELL_STRANGULATE);
  1787. events.RescheduleEvent(EVENT_STRANGULATE, 120*IN_MILLISECONDS);
  1788. }
  1789. else
  1790. events.RescheduleEvent(EVENT_STRANGULATE, 5*IN_MILLISECONDS);
  1791. return;
  1792. default:
  1793. return;
  1794. }
  1795. }
  1796. }
  1797. };
  1798.  
  1799. CreatureAI* GetAI(Creature* creature) const OVERRIDE
  1800. {
  1801. return new npc_toc_dkAI(creature);
  1802. }
  1803. };
  1804.  
  1805. class npc_toc_rogue : public CreatureScript
  1806. {
  1807. public:
  1808. npc_toc_rogue() : CreatureScript("npc_toc_rogue") { }
  1809.  
  1810. struct npc_toc_rogueAI : public boss_faction_championsAI
  1811. {
  1812. npc_toc_rogueAI(Creature* creature) : boss_faction_championsAI(creature, AI_MELEE) {}
  1813.  
  1814. void Reset() OVERRIDE
  1815. {
  1816. boss_faction_championsAI::Reset();
  1817. events.ScheduleEvent(EVENT_FAN_OF_KNIVES, urand(5*IN_MILLISECONDS, 10*IN_MILLISECONDS));
  1818. events.ScheduleEvent(EVENT_BLIND, urand(10*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  1819. events.ScheduleEvent(EVENT_CLOAK, urand(20*IN_MILLISECONDS, 30*IN_MILLISECONDS));
  1820. events.ScheduleEvent(EVENT_BLADE_FLURRY, urand(10*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  1821. events.ScheduleEvent(EVENT_SHADOWSTEP, urand(20*IN_MILLISECONDS, 30*IN_MILLISECONDS));
  1822. events.ScheduleEvent(EVENT_HEMORRHAGE, urand(3*IN_MILLISECONDS, 10*IN_MILLISECONDS));
  1823. events.ScheduleEvent(EVENT_EVISCERATE, urand(20*IN_MILLISECONDS, 40*IN_MILLISECONDS));
  1824. events.ScheduleEvent(EVENT_WOUND_POISON, urand(5*IN_MILLISECONDS, 10*IN_MILLISECONDS));
  1825. SetEquipmentSlots(false, 47422, 49982, EQUIP_NO_CHANGE);
  1826. me->setPowerType(POWER_ENERGY);
  1827. me->SetMaxPower(POWER_ENERGY, 100);
  1828. }
  1829.  
  1830. void UpdateAI(uint32 diff) OVERRIDE
  1831. {
  1832. if (!UpdateVictim())
  1833. return;
  1834.  
  1835. events.Update(diff);
  1836. boss_faction_championsAI::UpdateAI(diff);
  1837.  
  1838. if (me->HasUnitState(UNIT_STATE_CASTING))
  1839. return;
  1840.  
  1841. while (uint32 eventId = events.ExecuteEvent())
  1842. {
  1843. switch (eventId)
  1844. {
  1845. case EVENT_FAN_OF_KNIVES:
  1846. if (EnemiesInRange(10.0f) >= 2)
  1847. DoCastAOE(SPELL_FAN_OF_KNIVES);
  1848. events.ScheduleEvent(EVENT_FAN_OF_KNIVES, urand(10*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  1849. return;
  1850. case EVENT_BLIND:
  1851. if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(me)))
  1852. DoCast(target, SPELL_BLIND);
  1853. events.ScheduleEvent(EVENT_BLIND, urand(10*IN_MILLISECONDS, 30*IN_MILLISECONDS));
  1854. return;
  1855. case EVENT_CLOAK:
  1856. if (HealthBelowPct(50))
  1857. {
  1858. DoCast(SPELL_CLOAK);
  1859. events.RescheduleEvent(EVENT_CLOAK, 90*IN_MILLISECONDS);
  1860. }
  1861. else
  1862. events.RescheduleEvent(EVENT_CLOAK, 5*IN_MILLISECONDS);
  1863. return;
  1864. case EVENT_BLADE_FLURRY:
  1865. if (EnemiesInRange(10.0f) >= 2)
  1866. {
  1867. DoCast(SPELL_BLADE_FLURRY);
  1868. events.RescheduleEvent(EVENT_BLADE_FLURRY, 120*IN_MILLISECONDS);
  1869. }
  1870. else
  1871. events.RescheduleEvent(EVENT_BLADE_FLURRY, 5*IN_MILLISECONDS);
  1872. return;
  1873. case EVENT_SHADOWSTEP:
  1874. if (Unit* target = me->GetVictim())
  1875. {
  1876. if (me->IsInRange(target, 10.0f, 40.0f, false))
  1877. {
  1878. DoCast(target, SPELL_SHADOWSTEP);
  1879. events.RescheduleEvent(EVENT_SHADOWSTEP, 30*IN_MILLISECONDS);
  1880. return;
  1881. }
  1882. }
  1883. events.RescheduleEvent(EVENT_SHADOWSTEP, 5*IN_MILLISECONDS);
  1884. return;
  1885. case EVENT_HEMORRHAGE:
  1886. DoCastVictim(SPELL_HEMORRHAGE);
  1887. events.ScheduleEvent(EVENT_HEMORRHAGE, urand(3*IN_MILLISECONDS, 10*IN_MILLISECONDS));
  1888. return;
  1889. case EVENT_EVISCERATE:
  1890. DoCastVictim(SPELL_EVISCERATE);
  1891. events.ScheduleEvent(EVENT_EVISCERATE, urand(30*IN_MILLISECONDS, 40*IN_MILLISECONDS));
  1892. return;
  1893. case EVENT_WOUND_POISON:
  1894. DoCastVictim(SPELL_WOUND_POISON);
  1895. events.ScheduleEvent(EVENT_WOUND_POISON, urand(10*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  1896. return;
  1897. default:
  1898. return;
  1899. }
  1900. }
  1901. }
  1902. };
  1903.  
  1904. CreatureAI* GetAI(Creature* creature) const OVERRIDE
  1905. {
  1906. return new npc_toc_rogueAI(creature);
  1907. }
  1908. };
  1909.  
  1910. class npc_toc_enh_shaman : public CreatureScript
  1911. {
  1912. public:
  1913. npc_toc_enh_shaman() : CreatureScript("npc_toc_enh_shaman") { }
  1914.  
  1915. struct npc_toc_enh_shamanAI : public boss_faction_championsAI
  1916. {
  1917. npc_toc_enh_shamanAI(Creature* creature) : boss_faction_championsAI(creature, AI_MELEE) {}
  1918.  
  1919. void Reset() OVERRIDE
  1920. {
  1921. boss_faction_championsAI::Reset();
  1922. events.ScheduleEvent(EVENT_DPS_EARTH_SHOCK, urand(5*IN_MILLISECONDS, 10*IN_MILLISECONDS));
  1923. events.ScheduleEvent(EVENT_LAVA_LASH, urand(3*IN_MILLISECONDS, 5*IN_MILLISECONDS));
  1924. events.ScheduleEvent(EVENT_STORMSTRIKE, urand(2*IN_MILLISECONDS, 5*IN_MILLISECONDS));
  1925. events.ScheduleEvent(EVENT_DPS_BLOODLUST_HEROISM, 20*IN_MILLISECONDS);
  1926. events.ScheduleEvent(EVENT_DEPLOY_TOTEM, 1*IN_MILLISECONDS);
  1927. events.ScheduleEvent(EVENT_WINDFURY, urand(20*IN_MILLISECONDS, 50*IN_MILLISECONDS));
  1928.  
  1929. _totemCount = 0;
  1930. _totemOldCenterX = me->GetPositionX();
  1931. _totemOldCenterY = me->GetPositionY();
  1932. SetEquipmentSlots(false, 51803, 48013, EQUIP_NO_CHANGE);
  1933. summons.DespawnAll();
  1934. }
  1935.  
  1936. void JustSummoned(Creature* summoned) OVERRIDE
  1937. {
  1938. summons.Summon(summoned);
  1939. }
  1940.  
  1941. void SummonedCreatureDespawn(Creature* /*pSummoned*/) OVERRIDE
  1942. {
  1943. --_totemCount;
  1944. }
  1945.  
  1946. void DeployTotem()
  1947. {
  1948. _totemCount = 4;
  1949. _totemOldCenterX = me->GetPositionX();
  1950. _totemOldCenterY = me->GetPositionY();
  1951. /*
  1952. -Windfury (16% melee haste)
  1953. -Grounding (redirects one harmful magic spell to the totem)
  1954.  
  1955. -Healing Stream (unable to find amount of healing in our logs)
  1956.  
  1957. -Tremor (prevents fear effects)
  1958. -Strength of Earth (155 strength and agil for the opposing team)
  1959.  
  1960. -Searing (average ~3500 damage on a random target every ~3.5 seconds)
  1961. */
  1962. }
  1963.  
  1964. void JustDied(Unit* killer) OVERRIDE
  1965. {
  1966. boss_faction_championsAI::JustDied(killer);
  1967. summons.DespawnAll();
  1968. }
  1969.  
  1970. void UpdateAI(uint32 diff) OVERRIDE
  1971. {
  1972. if (!UpdateVictim())
  1973. return;
  1974.  
  1975. events.Update(diff);
  1976. boss_faction_championsAI::UpdateAI(diff);
  1977.  
  1978. if (me->HasUnitState(UNIT_STATE_CASTING))
  1979. return;
  1980.  
  1981. while (uint32 eventId = events.ExecuteEvent())
  1982. {
  1983. switch (eventId)
  1984. {
  1985. case EVENT_DPS_EARTH_SHOCK:
  1986. if (Unit* target = SelectEnemyCaster(true))
  1987. DoCast(target, SPELL_EARTH_SHOCK);
  1988. events.ScheduleEvent(EVENT_DPS_EARTH_SHOCK, urand(10*IN_MILLISECONDS, 15*IN_MILLISECONDS));
  1989. return;
  1990. case EVENT_LAVA_LASH:
  1991. DoCastVictim(SPELL_LAVA_LASH);
  1992. events.ScheduleEvent(EVENT_LAVA_LASH, urand(5*IN_MILLISECONDS, 15*IN_MILLISECONDS));
  1993. return;
  1994. case EVENT_STORMSTRIKE:
  1995. DoCastVictim(SPELL_STORMSTRIKE);
  1996. events.ScheduleEvent(EVENT_STORMSTRIKE, urand(8*IN_MILLISECONDS, 10*IN_MILLISECONDS));
  1997. return;
  1998. case EVENT_DPS_BLOODLUST_HEROISM:
  1999. if (me->getFaction()) //Am i alliance?
  2000. {
  2001. if (!me->HasAura(AURA_EXHAUSTION))
  2002. DoCastAOE(SPELL_HEROISM);
  2003. }
  2004. else
  2005. {
  2006. if (!me->HasAura(AURA_SATED))
  2007. DoCastAOE(SPELL_BLOODLUST);
  2008. }
  2009. events.ScheduleEvent(EVENT_DPS_BLOODLUST_HEROISM, 5*MINUTE*IN_MILLISECONDS);
  2010. return;
  2011. case EVENT_DEPLOY_TOTEM:
  2012. if (_totemCount < 4 || me->GetDistance2d(_totemOldCenterX, _totemOldCenterY) > 20.0f)
  2013. DeployTotem();
  2014. events.ScheduleEvent(EVENT_DEPLOY_TOTEM, 1*IN_MILLISECONDS);
  2015. return;
  2016. case EVENT_WINDFURY:
  2017. DoCastVictim(SPELL_WINDFURY);
  2018. events.ScheduleEvent(EVENT_WINDFURY, urand(20*IN_MILLISECONDS, 60*IN_MILLISECONDS));
  2019. return;
  2020. default:
  2021. return;
  2022. }
  2023. }
  2024. }
  2025. private:
  2026. uint8 _totemCount;
  2027. float _totemOldCenterX, _totemOldCenterY;
  2028. };
  2029.  
  2030. CreatureAI* GetAI(Creature* creature) const OVERRIDE
  2031. {
  2032. return new npc_toc_enh_shamanAI(creature);
  2033. }
  2034. };
  2035.  
  2036. class npc_toc_retro_paladin : public CreatureScript
  2037. {
  2038. public:
  2039. npc_toc_retro_paladin() : CreatureScript("npc_toc_retro_paladin") { }
  2040.  
  2041. struct npc_toc_retro_paladinAI : public boss_faction_championsAI
  2042. {
  2043. npc_toc_retro_paladinAI(Creature* creature) : boss_faction_championsAI(creature, AI_MELEE) {}
  2044.  
  2045. void Reset() OVERRIDE
  2046. {
  2047. boss_faction_championsAI::Reset();
  2048. events.ScheduleEvent(EVENT_AVENGING_WRATH, urand(25*IN_MILLISECONDS, 35*IN_MILLISECONDS));
  2049. events.ScheduleEvent(EVENT_CRUSADER_STRIKE, urand(5*IN_MILLISECONDS, 10*IN_MILLISECONDS));
  2050. events.ScheduleEvent(EVENT_DIVINE_STORM, urand(10*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  2051. events.ScheduleEvent(EVENT_HAMMER_OF_JUSTICE_RET, urand(10*IN_MILLISECONDS, 30*IN_MILLISECONDS));
  2052. events.ScheduleEvent(EVENT_JUDGEMENT_OF_COMMAND, urand(5*IN_MILLISECONDS, 15*IN_MILLISECONDS));
  2053. events.ScheduleEvent(EVENT_REPENTANCE, urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS));
  2054. events.ScheduleEvent(EVENT_DPS_HAND_OF_PROTECTION, urand(20*IN_MILLISECONDS, 30*IN_MILLISECONDS));
  2055. events.ScheduleEvent(EVENT_DPS_DIVINE_SHIELD, urand(20*IN_MILLISECONDS, 30*IN_MILLISECONDS));
  2056. SetEquipmentSlots(false, 47519, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE);
  2057. }
  2058.  
  2059. void EnterCombat(Unit* who) OVERRIDE
  2060. {
  2061. boss_faction_championsAI::EnterCombat(who);
  2062. DoCast(SPELL_SEAL_OF_COMMAND);
  2063. }
  2064.  
  2065. void UpdateAI(uint32 diff) OVERRIDE
  2066. {
  2067. if (!UpdateVictim())
  2068. return;
  2069.  
  2070. events.Update(diff);
  2071. boss_faction_championsAI::UpdateAI(diff);
  2072.  
  2073. if (me->HasUnitState(UNIT_STATE_CASTING))
  2074. return;
  2075.  
  2076. while (uint32 eventId = events.ExecuteEvent())
  2077. {
  2078. switch (eventId)
  2079. {
  2080. case EVENT_AVENGING_WRATH:
  2081. DoCast(SPELL_AVENGING_WRATH);
  2082. events.ScheduleEvent(EVENT_AVENGING_WRATH, 180*IN_MILLISECONDS);
  2083. return;
  2084. case EVENT_CRUSADER_STRIKE:
  2085. DoCastVictim(SPELL_CRUSADER_STRIKE);
  2086. events.ScheduleEvent(EVENT_CRUSADER_STRIKE, urand(10*IN_MILLISECONDS, 15*IN_MILLISECONDS));
  2087. return;
  2088. case EVENT_DIVINE_STORM:
  2089. if (EnemiesInRange(10.0f) >= 2)
  2090. DoCast(SPELL_DIVINE_STORM);
  2091. events.ScheduleEvent(EVENT_DIVINE_STORM, urand(10*IN_MILLISECONDS, 20*IN_MILLISECONDS));
  2092. return;
  2093. case EVENT_HAMMER_OF_JUSTICE_RET:
  2094. DoCastVictim(SPELL_HAMMER_OF_JUSTICE_RET);
  2095. events.ScheduleEvent(EVENT_HAMMER_OF_JUSTICE_RET, 40*IN_MILLISECONDS);
  2096. return;
  2097. case EVENT_JUDGEMENT_OF_COMMAND:
  2098. DoCastVictim(SPELL_JUDGEMENT_OF_COMMAND);
  2099. events.ScheduleEvent(EVENT_JUDGEMENT_OF_COMMAND, urand(10*IN_MILLISECONDS, 15*IN_MILLISECONDS));
  2100. return;
  2101. case EVENT_REPENTANCE:
  2102. if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(me)))
  2103. DoCast(target, SPELL_REPENTANCE);
  2104. events.ScheduleEvent(EVENT_REPENTANCE, 60*IN_MILLISECONDS);
  2105. return;
  2106. case EVENT_DPS_HAND_OF_PROTECTION:
  2107. if (Unit* target = DoSelectLowestHpFriendly(30.0f))
  2108. {
  2109. if (!target->HasAura(SPELL_FORBEARANCE))
  2110. {
  2111. DoCast(target, SPELL_HAND_OF_PROTECTION);
  2112. events.RescheduleEvent(EVENT_DPS_HAND_OF_PROTECTION, 5*MINUTE*IN_MILLISECONDS);
  2113. }
  2114. else
  2115. events.RescheduleEvent(EVENT_DPS_HAND_OF_PROTECTION, 5*IN_MILLISECONDS);
  2116. }
  2117. else
  2118. events.RescheduleEvent(EVENT_DPS_HAND_OF_PROTECTION, 5*IN_MILLISECONDS);
  2119. return;
  2120. case EVENT_DPS_DIVINE_SHIELD:
  2121. if (HealthBelowPct(30) && !me->HasAura(SPELL_FORBEARANCE))
  2122. {
  2123. DoCast(me, SPELL_DIVINE_SHIELD);
  2124. events.RescheduleEvent(EVENT_DPS_DIVINE_SHIELD, 5*MINUTE*IN_MILLISECONDS);
  2125. }
  2126. else
  2127. events.RescheduleEvent(EVENT_DPS_DIVINE_SHIELD, 5*IN_MILLISECONDS);
  2128. return;
  2129. default:
  2130. return;
  2131. }
  2132. }
  2133. }
  2134. };
  2135.  
  2136. CreatureAI* GetAI(Creature* creature) const OVERRIDE
  2137. {
  2138. return new npc_toc_retro_paladinAI(creature);
  2139. }
  2140. };
  2141.  
  2142. class npc_toc_pet_warlock : public CreatureScript
  2143. {
  2144. public:
  2145. npc_toc_pet_warlock() : CreatureScript("npc_toc_pet_warlock") { }
  2146.  
  2147. struct npc_toc_pet_warlockAI : public boss_faction_championsAI
  2148. {
  2149. npc_toc_pet_warlockAI(Creature* creature) : boss_faction_championsAI(creature, AI_PET) {}
  2150.  
  2151. void Reset() OVERRIDE
  2152. {
  2153. boss_faction_championsAI::Reset();
  2154. events.ScheduleEvent(EVENT_DEVOUR_MAGIC, urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS));
  2155. events.ScheduleEvent(EVENT_SPELL_LOCK, urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS));
  2156. }
  2157.  
  2158. void UpdateAI(uint32 diff) OVERRIDE
  2159. {
  2160. if (!UpdateVictim())
  2161. return;
  2162.  
  2163. events.Update(diff);
  2164. boss_faction_championsAI::UpdateAI(diff);
  2165.  
  2166. if (me->HasUnitState(UNIT_STATE_CASTING))
  2167. return;
  2168.  
  2169. while (uint32 eventId = events.ExecuteEvent())
  2170. {
  2171. switch (eventId)
  2172. {
  2173. case EVENT_DEVOUR_MAGIC:
  2174. DoCastVictim(SPELL_DEVOUR_MAGIC);
  2175. events.ScheduleEvent(EVENT_DEVOUR_MAGIC, urand(8*IN_MILLISECONDS, 10*IN_MILLISECONDS));
  2176. return;
  2177. case EVENT_SPELL_LOCK:
  2178. DoCast(SPELL_SPELL_LOCK);
  2179. events.ScheduleEvent(EVENT_SPELL_LOCK, urand(24*IN_MILLISECONDS, 30*IN_MILLISECONDS));
  2180. return;
  2181. default:
  2182. return;
  2183. }
  2184. }
  2185. }
  2186. };
  2187.  
  2188. CreatureAI* GetAI(Creature* creature) const OVERRIDE
  2189. {
  2190. return new npc_toc_pet_warlockAI(creature);
  2191. }
  2192. };
  2193.  
  2194. class npc_toc_pet_hunter : public CreatureScript
  2195. {
  2196. public:
  2197. npc_toc_pet_hunter() : CreatureScript("npc_toc_pet_hunter") { }
  2198.  
  2199. struct npc_toc_pet_hunterAI : public boss_faction_championsAI
  2200. {
  2201. npc_toc_pet_hunterAI(Creature* creature) : boss_faction_championsAI(creature, AI_PET) {}
  2202.  
  2203. void Reset() OVERRIDE
  2204. {
  2205. boss_faction_championsAI::Reset();
  2206. _clawTimer = urand(5*IN_MILLISECONDS, 10*IN_MILLISECONDS);
  2207. }
  2208.  
  2209. void UpdateAI(uint32 diff) OVERRIDE
  2210. {
  2211. if (!UpdateVictim())
  2212. return;
  2213.  
  2214. boss_faction_championsAI::UpdateAI(diff);
  2215.  
  2216. if (_clawTimer <= diff)
  2217. {
  2218. DoCastVictim(SPELL_CLAW);
  2219. _clawTimer = urand(5*IN_MILLISECONDS, 10*IN_MILLISECONDS);
  2220. }
  2221. else
  2222. _clawTimer -= diff;
  2223. }
  2224. private:
  2225. uint32 _clawTimer;
  2226. };
  2227.  
  2228. CreatureAI* GetAI(Creature* creature) const OVERRIDE
  2229. {
  2230. return new npc_toc_pet_hunterAI(creature);
  2231. }
  2232. };
  2233.  
  2234. class spell_faction_champion_warl_unstable_affliction : public SpellScriptLoader
  2235. {
  2236. public:
  2237. spell_faction_champion_warl_unstable_affliction() : SpellScriptLoader("spell_faction_champion_warl_unstable_affliction") { }
  2238.  
  2239. class spell_faction_champion_warl_unstable_affliction_AuraScript : public AuraScript
  2240. {
  2241. PrepareAuraScript(spell_faction_champion_warl_unstable_affliction_AuraScript);
  2242.  
  2243. bool Validate(SpellInfo const* /*spell*/) OVERRIDE
  2244. {
  2245. if (!sSpellMgr->GetSpellInfo(SPELL_UNSTABLE_AFFLICTION_DISPEL))
  2246. return false;
  2247. return true;
  2248. }
  2249.  
  2250. void HandleDispel(DispelInfo* dispelInfo)
  2251. {
  2252. if (Unit* caster = GetCaster())
  2253. caster->CastSpell(dispelInfo->GetDispeller(), SPELL_UNSTABLE_AFFLICTION_DISPEL, true, NULL, GetEffect(EFFECT_0));
  2254. }
  2255.  
  2256. void Register() OVERRIDE
  2257. {
  2258. AfterDispel += AuraDispelFn(spell_faction_champion_warl_unstable_affliction_AuraScript::HandleDispel);
  2259. }
  2260. };
  2261.  
  2262. AuraScript* GetAuraScript() const OVERRIDE
  2263. {
  2264. return new spell_faction_champion_warl_unstable_affliction_AuraScript();
  2265. }
  2266. };
  2267.  
  2268. class spell_faction_champion_death_grip : public SpellScriptLoader
  2269. {
  2270. public:
  2271. spell_faction_champion_death_grip() : SpellScriptLoader("spell_faction_champion_death_grip") { }
  2272.  
  2273. class spell_faction_champion_death_grip_SpellScript : public SpellScript
  2274. {
  2275. PrepareSpellScript(spell_faction_champion_death_grip_SpellScript);
  2276.  
  2277. bool Validate(SpellInfo const* /*spell*/) OVERRIDE
  2278. {
  2279. if (!sSpellMgr->GetSpellInfo(SPELL_DEATH_GRIP_PULL))
  2280. return false;
  2281. return true;
  2282. }
  2283.  
  2284. void HandleDummy(SpellEffIndex /*effIndex*/)
  2285. {
  2286. if (Unit* target = GetHitUnit())
  2287. {
  2288. if (Unit* caster = GetCaster())
  2289. target->CastSpell(caster, SPELL_DEATH_GRIP_PULL);
  2290. }
  2291. }
  2292.  
  2293. void Register() OVERRIDE
  2294. {
  2295. OnEffectHitTarget += SpellEffectFn(spell_faction_champion_death_grip_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
  2296. }
  2297.  
  2298. };
  2299.  
  2300. SpellScript* GetSpellScript() const OVERRIDE
  2301. {
  2302. return new spell_faction_champion_death_grip_SpellScript();
  2303. }
  2304. };
  2305.  
  2306. class spell_toc_bloodlust : public SpellScriptLoader
  2307. {
  2308. public:
  2309. spell_toc_bloodlust() : SpellScriptLoader("spell_toc_bloodlust") { }
  2310.  
  2311. class spell_toc_bloodlust_SpellScript : public SpellScript
  2312. {
  2313. PrepareSpellScript(spell_toc_bloodlust_SpellScript);
  2314.  
  2315. bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE
  2316. {
  2317. if (!sSpellMgr->GetSpellInfo(AURA_SATED))
  2318. return false;
  2319. return true;
  2320. }
  2321.  
  2322. void RemoveInvalidTargets(std::list<WorldObject*>& targets)
  2323. {
  2324. targets.remove_if(Trinity::UnitAuraCheck(true, AURA_SATED));
  2325. }
  2326.  
  2327. void ApplyDebuff()
  2328. {
  2329. if (Unit* target = GetHitUnit())
  2330. target->CastSpell(target, AURA_SATED, true);
  2331. }
  2332.  
  2333. void Register() OVERRIDE
  2334. {
  2335. OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_toc_bloodlust_SpellScript::RemoveInvalidTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY);
  2336. OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_toc_bloodlust_SpellScript::RemoveInvalidTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ALLY);
  2337. AfterHit += SpellHitFn(spell_toc_bloodlust_SpellScript::ApplyDebuff);
  2338. }
  2339. };
  2340.  
  2341. SpellScript* GetSpellScript() const OVERRIDE
  2342. {
  2343. return new spell_toc_bloodlust_SpellScript();
  2344. }
  2345. };
  2346.  
  2347. class spell_toc_heroism : public SpellScriptLoader
  2348. {
  2349. public:
  2350. spell_toc_heroism() : SpellScriptLoader("spell_toc_heroism") { }
  2351.  
  2352. class spell_toc_heroism_SpellScript : public SpellScript
  2353. {
  2354. PrepareSpellScript(spell_toc_heroism_SpellScript);
  2355.  
  2356. bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE
  2357. {
  2358. if (!sSpellMgr->GetSpellInfo(AURA_EXHAUSTION))
  2359. return false;
  2360. return true;
  2361. }
  2362.  
  2363. void RemoveInvalidTargets(std::list<WorldObject*>& targets)
  2364. {
  2365. targets.remove_if(Trinity::UnitAuraCheck(true, AURA_EXHAUSTION));
  2366. }
  2367.  
  2368. void ApplyDebuff()
  2369. {
  2370. if (Unit* target = GetHitUnit())
  2371. target->CastSpell(target, AURA_EXHAUSTION, true);
  2372. }
  2373.  
  2374. void Register() OVERRIDE
  2375. {
  2376. OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_toc_heroism_SpellScript::RemoveInvalidTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY);
  2377. OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_toc_heroism_SpellScript::RemoveInvalidTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ALLY);
  2378. AfterHit += SpellHitFn(spell_toc_heroism_SpellScript::ApplyDebuff);
  2379. }
  2380. };
  2381.  
  2382. SpellScript* GetSpellScript() const OVERRIDE
  2383. {
  2384. return new spell_toc_heroism_SpellScript();
  2385. }
  2386. };
  2387.  
  2388. void AddSC_boss_faction_champions()
  2389. {
  2390. new boss_toc_champion_controller();
  2391. new npc_toc_druid();
  2392. new npc_toc_shaman();
  2393. new npc_toc_paladin();
  2394. new npc_toc_priest();
  2395. new npc_toc_shadow_priest();
  2396. new npc_toc_mage();
  2397. new npc_toc_warlock();
  2398. new npc_toc_hunter();
  2399. new npc_toc_boomkin();
  2400. new npc_toc_warrior();
  2401. new npc_toc_dk();
  2402. new npc_toc_rogue();
  2403. new npc_toc_enh_shaman();
  2404. new npc_toc_retro_paladin();
  2405. new npc_toc_pet_warlock();
  2406. new npc_toc_pet_hunter();
  2407.  
  2408. new spell_faction_champion_warl_unstable_affliction();
  2409. new spell_faction_champion_death_grip();
  2410. new spell_toc_bloodlust();
  2411. new spell_toc_heroism();
  2412. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement