Advertisement
Guest User

Trial of the Champion

a guest
Mar 25th, 2015
702
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 236.14 KB | None | 0 0
  1. diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp
  2. index 6d70e56..fd5ea2b 100644
  3. --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp
  4. +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp
  5. @@ -15,53 +15,24 @@
  6.   * with this program. If not, see <http://www.gnu.org/licenses/>.
  7.   */
  8.  
  9. -/* ScriptData
  10. -SDName: Argent Challenge Encounter.
  11. -SD%Complete: 50 %
  12. -SDComment: AI for Argent Soldiers are not implemented. AI from bosses need more improvements.
  13. -SDCategory: Trial of the Champion
  14. -EndScriptData */
  15. -
  16. -#include "ScriptMgr.h"
  17. -#include "ScriptedCreature.h"
  18. -#include "SpellScript.h"
  19. +#include "ScriptPCH.h"
  20.  #include "trial_of_the_champion.h"
  21.  #include "ScriptedEscortAI.h"
  22. -/*
  23. -enum Yells
  24. -{
  25. -    // Eadric the Pure
  26. -    SAY_INTRO                   = 0,
  27. -    SAY_AGGRO                   = 1,
  28. -    EMOTE_RADIANCE              = 2,
  29. -    EMOTE_HAMMER_RIGHTEOUS      = 3,
  30. -    SAY_HAMMER_RIGHTEOUS        = 4,
  31. -    SAY_KILL_PLAYER             = 5,
  32. -    SAY_DEFEATED                = 6,
  33. -
  34. -    // Argent Confessor Paletress
  35. -    SAY_INTRO_1                 = 0,
  36. -    SAY_INTRO_2                 = 1,
  37. -    SAY_AGGRO                   = 2,
  38. -    SAY_MEMORY_SUMMON           = 3,
  39. -    SAY_MEMORY_DEATH            = 4,
  40. -    SAY_KILL_PLAYER             = 5,
  41. -    SAY_DEFEATED                = 6,
  42. -
  43. -    // Memory of X
  44. -    EMOTE_WAKING_NIGHTMARE      = 0
  45. -};
  46. -*/
  47. +
  48.  enum Spells
  49.  {
  50. -    // Eadric the Pure
  51. +    //Eadric
  52.      SPELL_EADRIC_ACHIEVEMENT    = 68197,
  53.      SPELL_HAMMER_JUSTICE        = 66863,
  54. +    SPELL_HAMMER_JUSTICE_STUN   = 66940,
  55.      SPELL_HAMMER_RIGHTEOUS      = 66867,
  56. +    SPELL_HAMMER_OVERRIDE_BAR   = 66904, // overrides players cast bar
  57. +    SPELL_HAMMER_THROWBACK_DMG  = 66905, // the hammer that is thrown back by the player
  58.      SPELL_RADIANCE              = 66935,
  59.      SPELL_VENGEANCE             = 66865,
  60.  
  61. -    // Paletress
  62. +    //Paletress
  63. +    SPELL_CONFESSOR_ACHIEVEMENT = 68206,
  64.      SPELL_SMITE                 = 66536,
  65.      SPELL_SMITE_H               = 67674,
  66.      SPELL_HOLY_FIRE             = 66538,
  67. @@ -72,35 +43,27 @@ enum Spells
  68.      SPELL_SHIELD                = 66515,
  69.      SPELL_CONFESS               = 66680,
  70.      SPELL_SUMMON_MEMORY         = 66545,
  71. -
  72. -    // Memory of X (Summon)
  73. -    SPELL_MEMORY_ALGALON        = 66715,
  74. -    SPELL_MEMORY_ARCHIMONDE     = 66704,
  75. -    SPELL_MEMORY_CHROMAGGUS     = 66697,
  76. -    SPELL_MEMORY_CYANIGOSA      = 66709,
  77. -    SPELL_MEMORY_DELRISSA       = 66706,
  78. -    SPELL_MEMORY_ECK            = 66710,
  79. -    SPELL_MEMORY_ENTROPIUS      = 66707,
  80. -    SPELL_MEMORY_GRUUL          = 66702,
  81. -    SPELL_MEMORY_HAKKAR         = 66698,
  82. -    SPELL_MEMORY_HEIGAN         = 66712,
  83. -    SPELL_MEMORY_HEROD          = 66694,
  84. -    SPELL_MEMORY_HOGGER         = 66543,
  85. -    SPELL_MEMORY_IGNIS          = 66713,
  86. -    SPELL_MEMORY_ILLIDAN        = 66705,
  87. -    SPELL_MEMORY_INGVAR         = 66708,
  88. -    SPELL_MEMORY_KALITHRESH     = 66700,
  89. -    SPELL_MEMORY_LUCIFRON       = 66695,
  90. -    SPELL_MEMORY_MALCHEZAAR     = 66701,
  91. -    SPELL_MEMORY_MUTANUS        = 66692,
  92. -    SPELL_MEMORY_ONYXIA         = 66711,
  93. -    SPELL_MEMORY_THUNDERAAN     = 66696,
  94. -    SPELL_MEMORY_VANCLEEF       = 66691,
  95. -    SPELL_MEMORY_VASHJ          = 66703,
  96. -    SPELL_MEMORY_VEKNILASH      = 66699,
  97. -    SPELL_MEMORY_VEZAX          = 66714,
  98. -
  99. -    // Memory
  100. +    
  101. +    // Monk soldier
  102. +    SPELL_PUMMEL                = 67235,
  103. +    SPELL_FLURRY                = 67233,
  104. +    SPELL_FINAL                 = 67255,
  105. +    SPELL_DIVINE                = 67251,
  106. +  
  107. +    // Lightwielder soldier
  108. +    SPELL_LIGHT                 = 67247,
  109. +    SPELL_CLEAVE                = 15284,
  110. +    SPELL_STRIKE                = 67237,
  111. +  
  112. +    // Priest soldier
  113. +    SPELL_HOLY_SMITE            = 36176,
  114. +    SPELL_HOLY_SMITE_H          = 67289,
  115. +    SPELL_SHADOW_WORD_PAIN      = 34941,
  116. +    SPELL_SHADOW_WORD_PAIN_H    = 34942,
  117. +    SPELL_MIND                  = 67229,
  118. +    SPELL_FOUNTAIN_OF_LIGHT     = 67194,
  119. +
  120. +    //Memory
  121.      SPELL_OLD_WOUNDS            = 66620,
  122.      SPELL_OLD_WOUNDS_H          = 67679,
  123.      SPELL_SHADOWS_PAST          = 66619,
  124. @@ -109,11 +72,53 @@ enum Spells
  125.      SPELL_WAKING_NIGHTMARE_H    = 67677
  126.  };
  127.  
  128. -class OrientationCheck : public std::unary_function<Unit*, bool>
  129. +enum Misc
  130. +{
  131. +    DATA_FACEROLLER             = 1,
  132. +    ACHIEV_CONF                 = 3802
  133. +};
  134. +
  135. +enum Talk
  136. +{
  137. +    SAY_ARGENT_ENTERS           = 19,
  138. +    SAY_ARGENT_READY            = 20,
  139. +    SAY_MEMORY_NIGHTMARE        = 0,
  140. +
  141. +    // Paletress
  142. +    SAY_PALETRESS_AGGRO         = 2,
  143. +    SAY_PALETRESS_SUMMON_MEMORY = 3,
  144. +    SAY_PALETRESS_MEMORY_DIES   = 4,
  145. +    SAY_PALETRESS_PLAYER_DIES   = 5,
  146. +    SAY_PALETRESS_DEFEATED      = 6,
  147. +
  148. +    // Eadric
  149. +    SAY_EADRIC_AGGRO            = 1,
  150. +    SAY_EADRIC_RADIATE_LIGHT    = 2,
  151. +    SAY_EADRIC_HAMMER_TARGET    = 3,
  152. +    SAY_EADRIC_HAMMER           = 4,
  153. +    SAY_EADRIC_PLAYER_DIES      = 5,
  154. +    SAY_EADRIC_DEFEATED         = 6
  155. +};
  156. +
  157. +enum Events
  158. +{
  159. +    EVENT_HOLYSMITE,
  160. +    // Argent Soldiers
  161. +    EVENT_CLEAVE,
  162. +    EVENT_STRIKE,
  163. +    EVENT_BLAZINGLIGHT,
  164. +    EVENT_FLURRY,
  165. +    EVENT_PUMMEL,
  166. +    EVENT_MINDCONTROL,
  167. +    EVENT_PAIN,
  168. +    EVENT_FOUNTAIN
  169. +};
  170. +
  171. +class OrientationCheck
  172.  {
  173.      public:
  174.          explicit OrientationCheck(Unit* _caster) : caster(_caster) { }
  175. -        bool operator()(WorldObject* object)
  176. +        bool operator() (WorldObject* object)
  177.          {
  178.              return !object->isInFront(caster, 2.5f) || !object->IsWithinDist(caster, 40.0f);
  179.          }
  180. @@ -122,10 +127,11 @@ class OrientationCheck : public std::unary_function<Unit*, bool>
  181.          Unit* caster;
  182.  };
  183.  
  184. -class spell_eadric_radiance : public SpellScriptLoader
  185. +class spell_eadric_radiance: public SpellScriptLoader
  186.  {
  187.      public:
  188. -        spell_eadric_radiance() : SpellScriptLoader("spell_eadric_radiance") { }
  189. +        spell_eadric_radiance(): SpellScriptLoader("spell_eadric_radiance") { }
  190. +
  191.          class spell_eadric_radiance_SpellScript : public SpellScript
  192.          {
  193.              PrepareSpellScript(spell_eadric_radiance_SpellScript);
  194. @@ -135,41 +141,112 @@ class spell_eadric_radiance : public SpellScriptLoader
  195.                  unitList.remove_if(OrientationCheck(GetCaster()));
  196.              }
  197.  
  198. -            void Register() override
  199. +            void Register()
  200.              {
  201.                  OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_eadric_radiance_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
  202.                  OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_eadric_radiance_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY);
  203.              }
  204.          };
  205.  
  206. -        SpellScript* GetSpellScript() const override
  207. +        SpellScript* GetSpellScript() const
  208.          {
  209.              return new spell_eadric_radiance_SpellScript();
  210.          }
  211.  };
  212.  
  213. +class spell_eadric_hammer_missile: public SpellScriptLoader
  214. +{
  215. +    public:
  216. +        spell_eadric_hammer_missile(): SpellScriptLoader("spell_eadric_hammer_missile") { }
  217. +
  218. +        class spell_eadric_hammer_missile_SpellScript : public SpellScript
  219. +        {
  220. +            PrepareSpellScript(spell_eadric_hammer_missile_SpellScript);
  221. +
  222. +            bool Validate(SpellInfo const* /*spellInfo*/)
  223. +            {
  224. +                if (!sSpellMgr->GetSpellInfo(SPELL_HAMMER_OVERRIDE_BAR))
  225. +                    return false;
  226. +
  227. +                return true;
  228. +            }
  229. +
  230. +            void HandleTriggerMissile(SpellEffIndex /*effIndex*/)
  231. +            {
  232. +                Unit* caster = GetCaster();
  233. +                Unit* target = GetHitUnit();
  234. +
  235. +                if (caster && target && !target->HasAura(SPELL_HAMMER_JUSTICE_STUN))
  236. +                {
  237. +                    PreventHitDefaultEffect(EFFECT_0);
  238. +                    caster->CastSpell(target, SPELL_HAMMER_OVERRIDE_BAR, true);
  239. +                }
  240. +            }
  241. +
  242. +            void Register()
  243. +            {
  244. +                OnEffectHitTarget += SpellEffectFn(spell_eadric_hammer_missile_SpellScript::HandleTriggerMissile, EFFECT_0, SPELL_EFFECT_TRIGGER_MISSILE);
  245. +            }
  246. +        };
  247. +
  248. +        SpellScript* GetSpellScript() const
  249. +        {
  250. +            return new spell_eadric_hammer_missile_SpellScript();
  251. +        }
  252. +};
  253. +
  254. +class spell_eadric_hammer_throw_back: public SpellScriptLoader
  255. +{
  256. +    public:
  257. +        spell_eadric_hammer_throw_back(): SpellScriptLoader("spell_eadric_hammer_throw_back") { }
  258. +
  259. +        class spell_eadric_hammer_throw_back_SpellScript : public SpellScript
  260. +        {
  261. +            PrepareSpellScript(spell_eadric_hammer_throw_back_SpellScript);
  262. +
  263. +            void RemoveAura()
  264. +            {
  265. +                GetCaster()->RemoveAurasDueToSpell(SPELL_HAMMER_OVERRIDE_BAR);
  266. +            }
  267. +
  268. +            void CheckDamage()
  269. +            {
  270. +                Creature* target = GetHitCreature();
  271. +                if (!target)
  272. +                    return;
  273. +
  274. +                if (GetHitDamage() >= int32(target->GetHealth()))
  275. +                    target->AI()->SetData(DATA_FACEROLLER, 1);
  276. +            }
  277. +
  278. +            void Register()
  279. +            {
  280. +                AfterCast += SpellCastFn(spell_eadric_hammer_throw_back_SpellScript::RemoveAura);
  281. +                OnHit += SpellHitFn(spell_eadric_hammer_throw_back_SpellScript::CheckDamage);
  282. +            }
  283. +        };
  284. +
  285. +        SpellScript* GetSpellScript() const
  286. +        {
  287. +            return new spell_eadric_hammer_throw_back_SpellScript();
  288. +        }
  289. +};
  290. +
  291.  class boss_eadric : public CreatureScript
  292.  {
  293. -public:
  294. -    boss_eadric() : CreatureScript("boss_eadric") { }
  295. -    struct boss_eadricAI : public ScriptedAI
  296. +    public:
  297. +        boss_eadric(): CreatureScript("boss_eadric") { }
  298. +
  299. +    struct boss_eadricAI : public BossAI
  300.      {
  301. -        boss_eadricAI(Creature* creature) : ScriptedAI(creature)
  302. +        boss_eadricAI(Creature* creature) : BossAI(creature, BOSS_ARGENT_CHALLENGE_E)
  303.          {
  304. -            Initialize();
  305.              instance = creature->GetInstanceScript();
  306.              creature->SetReactState(REACT_PASSIVE);
  307.              creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  308. -        }
  309. -
  310. -        void Initialize()
  311. -        {
  312. -            uiVenganceTimer = 10000;
  313. -            uiRadianceTimer = 16000;
  314. -            uiHammerJusticeTimer = 25000;
  315. -            uiResetTimer = 5000;
  316.  
  317. -            bDone = false;
  318. +            hasBeenInCombat = false;
  319. +            bCredit = false;
  320.          }
  321.  
  322.          InstanceScript* instance;
  323. @@ -179,40 +256,123 @@ public:
  324.          uint32 uiHammerJusticeTimer;
  325.          uint32 uiResetTimer;
  326.  
  327. +        uint64 uiBasePoints;
  328. +
  329.          bool bDone;
  330. +        bool hasBeenInCombat;
  331. +        bool bCredit;
  332. +        bool _theFaceRoller;
  333.  
  334. -        void Reset() override
  335. +        void Reset()
  336.          {
  337. -            Initialize();
  338. +            uiVenganceTimer = 10000;
  339. +            uiRadianceTimer = 16000;
  340. +            uiHammerJusticeTimer = 25000;
  341. +            uiResetTimer = 5000;
  342. +            uiBasePoints = 0;
  343. +
  344. +            _theFaceRoller = false;
  345. +            bDone = false;
  346. +            Map* pMap = me->GetMap();
  347. +            if (hasBeenInCombat && pMap && pMap->IsDungeon())
  348. +            {
  349. +                Map::PlayerList const &players = pMap->GetPlayers();
  350. +                for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
  351. +                {
  352. +                     if (itr->GetSource() && itr->GetSource()->IsAlive() && !itr->GetSource()->IsGameMaster())
  353. +                         return;
  354. +                }
  355. +                
  356. +                if (instance)
  357. +                {
  358. +                    GameObject* GO = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_MAIN_GATE1));
  359. +                    if (GO)
  360. +                        instance->HandleGameObject(GO->GetGUID(),true);
  361. +                    Creature* announcer=pMap->GetCreature(instance->GetGuidData(DATA_ANNOUNCER));
  362. +                    instance->SetData(DATA_ARGENT_SOLDIER_DEFEATED,0);
  363. +                    announcer->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
  364. +                }
  365. +
  366. +                me->RemoveFromWorld();
  367. +            }
  368.          }
  369.  
  370. -        void DamageTaken(Unit* /*done_by*/, uint32 &damage) override
  371. +        void DamageTaken(Unit* /*who*/, uint32& damage)
  372.          {
  373.              if (damage >= me->GetHealth())
  374.              {
  375.                  damage = 0;
  376. +                if (!bCredit)
  377. +                {
  378. +                    bCredit = true;
  379. +                    HandleSpellOnPlayersInInstanceToC5(me, 68575);
  380. +                }
  381.                  EnterEvadeMode();
  382. +                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  383. +                Talk(SAY_EADRIC_DEFEATED);
  384.                  me->setFaction(35);
  385.                  bDone = true;
  386. +                if (GameObject* pGO = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_MAIN_GATE)))
  387. +                    instance->HandleGameObject(pGO->GetGUID(),true);
  388. +                if (GameObject* pGO = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_MAIN_GATE1)))
  389. +                    instance->HandleGameObject(pGO->GetGUID(),true);
  390. +                if (instance)
  391. +                    instance->SetData(BOSS_ARGENT_CHALLENGE_E, DONE);
  392. +                HandleKillCreditForAllPlayers(me);
  393. +                HandleInstanceBind(me);
  394.              }
  395.          }
  396.  
  397. -        void MovementInform(uint32 MovementType, uint32 /*Data*/) override
  398. +        void MovementInform(uint32 MovementType, uint32 /*Data*/)
  399.          {
  400.              if (MovementType != POINT_MOTION_TYPE)
  401.                  return;
  402. +        }
  403.  
  404. -            instance->SetData(BOSS_ARGENT_CHALLENGE_E, DONE);
  405. +        void EnterCombat(Unit* /*who*/)
  406. +        {
  407. +            me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  408. +            _EnterCombat();
  409. +            me->SetHomePosition(746.843f, 665.000f, 412.339f, 4.670f);
  410. +            Talk(SAY_EADRIC_AGGRO);
  411. +            hasBeenInCombat = true;
  412. +        }
  413.  
  414. -            me->DisappearAndDie();
  415. +        void SetData(uint32 type, uint32 /*value*/)
  416. +        {
  417. +            if (type == DATA_FACEROLLER)
  418. +                _theFaceRoller = true;
  419. +        }
  420. +
  421. +        void SpellHit(Unit* caster, SpellInfo const* spell)
  422. +        {
  423. +            if (IsHeroic() && !bDone && spell->Id == SPELL_HAMMER_THROWBACK_DMG && caster->GetTypeId() == TYPEID_PLAYER)
  424. +            {            
  425. +                uiBasePoints = spell->Effects[0].BasePoints;
  426. +                if (me->GetHealth() <= uiBasePoints)
  427. +                {
  428. +                    _theFaceRoller = true;
  429. +                    HandleSpellOnPlayersInInstanceToC5(me, SPELL_EADRIC_ACHIEVEMENT);
  430. +                }
  431. +            }
  432. +        }
  433. +
  434. +        uint32 GetData(uint32 type) const override
  435. +        {
  436. +            if (type == DATA_THE_FACEROLLER)
  437. +                return _theFaceRoller;
  438. +
  439. +            return 0;
  440.          }
  441.  
  442.          void UpdateAI(uint32 uiDiff) override
  443.          {
  444.              if (bDone && uiResetTimer <= uiDiff)
  445.              {
  446. -                me->GetMotionMaster()->MovePoint(0, 746.87f, 665.87f, 411.75f);
  447. +                me->GetMotionMaster()->MovePoint(0,746.843f, 695.68f, 412.339f);
  448.                  bDone = false;
  449. +                if (GameObject* pGO = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_MAIN_GATE)))
  450. +                    instance->HandleGameObject(pGO->GetGUID(),false);
  451.              } else uiResetTimer -= uiDiff;
  452.  
  453.              if (!UpdateVictim())
  454. @@ -226,6 +386,8 @@ public:
  455.                  {
  456.                      if (target && target->IsAlive())
  457.                      {
  458. +                        Talk(SAY_EADRIC_HAMMER);
  459. +                        Talk(SAY_EADRIC_HAMMER_TARGET, target);
  460.                          DoCast(target, SPELL_HAMMER_JUSTICE);
  461.                          DoCast(target, SPELL_HAMMER_RIGHTEOUS);
  462.                      }
  463. @@ -243,7 +405,7 @@ public:
  464.              if (uiRadianceTimer <= uiDiff)
  465.              {
  466.                  DoCastAOE(SPELL_RADIANCE);
  467. -
  468. +                Talk(SAY_EADRIC_RADIATE_LIGHT);
  469.                  uiRadianceTimer = 16000;
  470.              } else uiRadianceTimer -= uiDiff;
  471.  
  472. @@ -253,94 +415,144 @@ public:
  473.  
  474.      CreatureAI* GetAI(Creature* creature) const override
  475.      {
  476. -        return GetInstanceAI<boss_eadricAI>(creature);
  477. -    }
  478. +        return new boss_eadricAI(creature);
  479. +    };
  480.  };
  481.  
  482.  class boss_paletress : public CreatureScript
  483.  {
  484. -public:
  485. -    boss_paletress() : CreatureScript("boss_paletress") { }
  486. +    public:
  487. +        boss_paletress(): CreatureScript("boss_paletress") { }
  488.  
  489. -    struct boss_paletressAI : public ScriptedAI
  490. +    struct boss_paletressAI : public BossAI
  491.      {
  492. -        boss_paletressAI(Creature* creature) : ScriptedAI(creature)
  493. +        boss_paletressAI(Creature* creature) : BossAI(creature, BOSS_ARGENT_CHALLENGE_P)
  494.          {
  495. -            Initialize();
  496.              instance = creature->GetInstanceScript();
  497.  
  498. +            hasBeenInCombat = false;
  499. +            bCredit = false;
  500. +
  501.              creature->SetReactState(REACT_PASSIVE);
  502. -            creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  503. +            creature->SetFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_NON_ATTACKABLE);
  504.              creature->RestoreFaction();
  505.          }
  506.  
  507. -        void Initialize()
  508. -        {
  509. -            uiHolyFireTimer = urand(9000, 12000);
  510. -            uiHolySmiteTimer = urand(5000, 7000);
  511. -            uiRenewTimer = urand(2000, 5000);
  512. -
  513. -            uiResetTimer = 7000;
  514. -
  515. -            bHealth = false;
  516. -            bDone = false;
  517. -        }
  518. -
  519.          InstanceScript* instance;
  520. +
  521. +        Creature* pMemory;
  522.          ObjectGuid MemoryGUID;
  523.  
  524.          bool bHealth;
  525.          bool bDone;
  526. +        bool hasBeenInCombat;
  527. +        bool bCredit;
  528.  
  529.          uint32 uiHolyFireTimer;
  530.          uint32 uiHolySmiteTimer;
  531.          uint32 uiRenewTimer;
  532.          uint32 uiResetTimer;
  533.  
  534. -        void Reset() override
  535. +        void Reset()
  536.          {
  537.              me->RemoveAllAuras();
  538.  
  539. -            Initialize();
  540. +            uiHolyFireTimer     = urand(9000,12000);
  541. +            uiHolySmiteTimer    = urand(5000,7000);
  542. +            uiRenewTimer        = urand(2000,5000);
  543. +
  544. +            uiResetTimer        = 7000;
  545. +
  546. +            bHealth = false;
  547. +            bDone = false;
  548.  
  549.              if (Creature* pMemory = ObjectAccessor::GetCreature(*me, MemoryGUID))
  550.                  if (pMemory->IsAlive())
  551.                      pMemory->RemoveFromWorld();
  552. +
  553. +            Map* pMap = me->GetMap();
  554. +            if (hasBeenInCombat && pMap && pMap->IsDungeon())
  555. +            {
  556. +                Map::PlayerList const &players = pMap->GetPlayers();
  557. +                for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
  558. +                {
  559. +                    if (itr->GetSource() && itr->GetSource()->IsAlive() && !itr->GetSource()->IsGameMaster())
  560. +                        return;
  561. +                }
  562. +
  563. +                if (instance)
  564. +                {
  565. +                    GameObject* GO = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_MAIN_GATE1));
  566. +                    if(GO)
  567. +                       instance->HandleGameObject(GO->GetGUID(),true);
  568. +                    Creature* announcer = pMap->GetCreature(instance->GetGuidData(DATA_ANNOUNCER));
  569. +                    instance->SetData(DATA_ARGENT_SOLDIER_DEFEATED, 0);
  570. +                    announcer->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
  571. +                }
  572. +
  573. +                me->RemoveFromWorld();
  574. +            }
  575. +        }
  576. +
  577. +        void EnterCombat(Unit* /*who*/)
  578. +        {
  579. +            me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  580. +            _EnterCombat();
  581. +            me->SetHomePosition(746.843f, 665.000f, 412.339f, 4.670f);
  582. +            hasBeenInCombat = true;
  583. +            Talk(SAY_PALETRESS_AGGRO);
  584.          }
  585.  
  586. -        void SetData(uint32 uiId, uint32 /*uiValue*/) override
  587. +        void SetData(uint32 uiId, uint32 /*uiValue*/)
  588.          {
  589.              if (uiId == 1)
  590.                  me->RemoveAura(SPELL_SHIELD);
  591. +                Talk(SAY_PALETRESS_MEMORY_DIES);
  592.          }
  593.  
  594. -        void DamageTaken(Unit* /*done_by*/, uint32 &damage) override
  595. +        void DamageTaken(Unit* /*who*/, uint32& damage)
  596.          {
  597.              if (damage >= me->GetHealth())
  598.              {
  599.                  damage = 0;
  600. +                if (!bCredit)
  601. +                {
  602. +                    bCredit = true;
  603. +                    HandleSpellOnPlayersInInstanceToC5(me, 68574);
  604. +                }
  605.                  EnterEvadeMode();
  606. +                me->SetFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_NON_ATTACKABLE);
  607. +                Talk(SAY_PALETRESS_DEFEATED);
  608.                  me->setFaction(35);
  609.                  bDone = true;
  610. +                if (GameObject* pGO = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_MAIN_GATE)))
  611. +                    instance->HandleGameObject(pGO->GetGUID(),true);
  612. +                if (GameObject* pGO = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_MAIN_GATE1)))
  613. +                    instance->HandleGameObject(pGO->GetGUID(),true);
  614. +                instance->SetData(BOSS_ARGENT_CHALLENGE_P, DONE);
  615. +                HandleKillCreditForAllPlayers(me);
  616. +                HandleInstanceBind(me);
  617. +
  618. +                if (Creature* memory = me->GetMap()->ToInstanceMap()->GetCreature(MemoryGUID))
  619. +                    HandleSpellOnPlayersInInstanceToC5(memory, SPELL_CONFESSOR_ACHIEVEMENT);
  620.              }
  621.          }
  622.  
  623. -        void MovementInform(uint32 MovementType, uint32 Point) override
  624. +        void MovementInform(uint32 MovementType, uint32 /*Data*/)
  625.          {
  626. -            if (MovementType != POINT_MOTION_TYPE || Point != 0)
  627. +            if (MovementType != POINT_MOTION_TYPE)
  628.                  return;
  629.  
  630. -            instance->SetData(BOSS_ARGENT_CHALLENGE_P, DONE);
  631. -
  632. -            me->DisappearAndDie();
  633.          }
  634.  
  635. -        void UpdateAI(uint32 uiDiff) override
  636. +        void UpdateAI(uint32 uiDiff)
  637.          {
  638.              if (bDone && uiResetTimer <= uiDiff)
  639.              {
  640. -                me->GetMotionMaster()->MovePoint(0, 746.87f, 665.87f, 411.75f);
  641. +                me->GetMotionMaster()->MovePoint(0, 746.843f, 695.68f, 412.339f);
  642.                  bDone = false;
  643. +                if (GameObject* pGO = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_MAIN_GATE)))
  644. +                    instance->HandleGameObject(pGO->GetGUID(),false);
  645.              } else uiResetTimer -= uiDiff;
  646.  
  647.              if (!UpdateVictim())
  648. @@ -351,12 +563,12 @@ public:
  649.                  if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 250, true))
  650.                  {
  651.                      if (target && target->IsAlive())
  652. -                        DoCast(target, SPELL_HOLY_FIRE);
  653. +                        DoCast(target,DUNGEON_MODE(SPELL_HOLY_FIRE,SPELL_HOLY_FIRE_H));
  654.                  }
  655. -                 if (me->HasAura(SPELL_SHIELD))
  656. +                if (me->HasAura(SPELL_SHIELD))
  657.                      uiHolyFireTimer = 13000;
  658.                  else
  659. -                    uiHolyFireTimer = urand(9000, 12000);
  660. +                    uiHolyFireTimer = urand(9000,12000);
  661.              } else uiHolyFireTimer -= uiDiff;
  662.  
  663.              if (uiHolySmiteTimer <= uiDiff)
  664. @@ -364,12 +576,12 @@ public:
  665.                  if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 250, true))
  666.                  {
  667.                      if (target && target->IsAlive())
  668. -                        DoCast(target, SPELL_SMITE);
  669. +                        DoCast(target,DUNGEON_MODE(SPELL_SMITE,SPELL_SMITE_H));
  670.                  }
  671.                  if (me->HasAura(SPELL_SHIELD))
  672.                      uiHolySmiteTimer = 9000;
  673.                  else
  674. -                    uiHolySmiteTimer = urand(5000, 7000);
  675. +                    uiHolySmiteTimer = urand(5000,7000);
  676.              } else uiHolySmiteTimer -= uiDiff;
  677.  
  678.              if (me->HasAura(SPELL_SHIELD))
  679. @@ -377,31 +589,32 @@ public:
  680.                  if (uiRenewTimer <= uiDiff)
  681.                  {
  682.                      me->InterruptNonMeleeSpells(true);
  683. -                    uint8 uiTarget = urand(0, 1);
  684. -                    switch (uiTarget)
  685. +                    uint8 uiTarget = urand(0,1);
  686. +                    switch(uiTarget)
  687.                      {
  688.                          case 0:
  689. -                            DoCast(me, SPELL_RENEW);
  690. +                            DoCast(me,DUNGEON_MODE(SPELL_RENEW,SPELL_RENEW_H));
  691.                              break;
  692.                          case 1:
  693.                              if (Creature* pMemory = ObjectAccessor::GetCreature(*me, MemoryGUID))
  694.                                  if (pMemory->IsAlive())
  695. -                                    DoCast(pMemory, SPELL_RENEW);
  696. +                                    DoCast(pMemory, DUNGEON_MODE(SPELL_RENEW,SPELL_RENEW_H));
  697.                              break;
  698.                      }
  699. -                    uiRenewTimer = urand(15000, 17000);
  700. +                    uiRenewTimer = urand(15000,17000);
  701.                  } else uiRenewTimer -= uiDiff;
  702.              }
  703.  
  704. -            if (!bHealth && !HealthAbovePct(25))
  705. +            if (!bHealth && me->HealthBelowPct(25))
  706.              {
  707. +                Talk(SAY_PALETRESS_SUMMON_MEMORY);
  708.                  me->InterruptNonMeleeSpells(true);
  709.                  DoCastAOE(SPELL_HOLY_NOVA, false);
  710.                  DoCast(me, SPELL_SHIELD);
  711. -                DoCastAOE(SPELL_SUMMON_MEMORY, false);
  712.                  DoCastAOE(SPELL_CONFESS, false);
  713.  
  714.                  bHealth = true;
  715. +                DoCast(SPELL_SUMMON_MEMORY);
  716.              }
  717.  
  718.              DoMeleeAttackIfReady();
  719. @@ -413,38 +626,30 @@ public:
  720.          }
  721.      };
  722.  
  723. -    CreatureAI* GetAI(Creature* creature) const override
  724. +    CreatureAI* GetAI(Creature* creature) const
  725.      {
  726. -        return GetInstanceAI<boss_paletressAI>(creature);
  727. -    }
  728. +        return new boss_paletressAI(creature);
  729. +    };
  730.  };
  731.  
  732.  class npc_memory : public CreatureScript
  733.  {
  734. -public:
  735. -    npc_memory() : CreatureScript("npc_memory") { }
  736. +    public:
  737. +        npc_memory(): CreatureScript("npc_memory") { }
  738.  
  739.      struct npc_memoryAI : public ScriptedAI
  740.      {
  741. -        npc_memoryAI(Creature* creature) : ScriptedAI(creature)
  742. -        {
  743. -            Initialize();
  744. -        }
  745. -
  746. -        void Initialize()
  747. -        {
  748. -            uiOldWoundsTimer = 12000;
  749. -            uiShadowPastTimer = 5000;
  750. -            uiWakingNightmare = 7000;
  751. -        }
  752. +        npc_memoryAI(Creature* creature) : ScriptedAI(creature) { }
  753.  
  754.          uint32 uiOldWoundsTimer;
  755.          uint32 uiShadowPastTimer;
  756.          uint32 uiWakingNightmare;
  757.  
  758. -        void Reset() override
  759. +        void Reset()
  760.          {
  761. -            Initialize();
  762. +            uiOldWoundsTimer = 12000;
  763. +            uiShadowPastTimer = 5000;
  764. +            uiWakingNightmare = 7000;
  765.          }
  766.  
  767.          void UpdateAI(uint32 uiDiff) override
  768. @@ -454,242 +659,441 @@ public:
  769.  
  770.              if (uiOldWoundsTimer <= uiDiff)
  771.              {
  772. -                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
  773. +                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM,0))
  774.                  {
  775.                      if (target && target->IsAlive())
  776. -                        DoCast(target, SPELL_OLD_WOUNDS);
  777. +                        DoCast(target, DUNGEON_MODE(SPELL_OLD_WOUNDS,SPELL_OLD_WOUNDS_H));
  778.                  }
  779. -                uiOldWoundsTimer = 12000;
  780. -            }else uiOldWoundsTimer -= uiDiff;
  781. +                uiOldWoundsTimer = 23000;
  782. +            } else uiOldWoundsTimer -= uiDiff;
  783.  
  784.              if (uiWakingNightmare <= uiDiff)
  785.              {
  786. -                DoCast(me, SPELL_WAKING_NIGHTMARE);
  787. -                uiWakingNightmare = 7000;
  788. -            }else uiWakingNightmare -= uiDiff;
  789. +                Talk(SAY_MEMORY_NIGHTMARE);
  790. +                DoCast(me, DUNGEON_MODE(SPELL_WAKING_NIGHTMARE,SPELL_WAKING_NIGHTMARE_H));
  791. +                uiWakingNightmare = 15000;
  792. +            } else uiWakingNightmare -= uiDiff;
  793.  
  794.              if (uiShadowPastTimer <= uiDiff)
  795.              {
  796. -                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1))
  797. +                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM,1))
  798.                  {
  799.                      if (target && target->IsAlive())
  800. -                        DoCast(target, SPELL_SHADOWS_PAST);
  801. +                        DoCast(target, DUNGEON_MODE(SPELL_SHADOWS_PAST,SPELL_SHADOWS_PAST_H));
  802.                  }
  803. -                uiShadowPastTimer = 5000;
  804. -            }else uiShadowPastTimer -= uiDiff;
  805. +                uiShadowPastTimer = 20000;
  806. +            } else uiShadowPastTimer -= uiDiff;
  807.  
  808.              DoMeleeAttackIfReady();
  809.          }
  810.  
  811.          void JustDied(Unit* /*killer*/) override
  812.          {
  813. -            if (TempSummon* summ = me->ToTempSummon())
  814. -                if (Unit* summoner = summ->GetSummoner())
  815. -                    if (summoner->IsAlive())
  816. -                        summoner->GetAI()->SetData(1, 0);
  817. +            if (me->IsSummon())
  818. +            {
  819. +                if (Unit* summoner = me->ToTempSummon()->GetSummoner())
  820. +                {
  821. +                    if (summoner && summoner->IsAlive() && summoner->GetTypeId() == TYPEID_UNIT)
  822. +                        summoner->ToCreature()->AI()->SetData(1,0);
  823. +                }
  824. +            }
  825.          }
  826.      };
  827.  
  828. -    CreatureAI* GetAI(Creature* creature) const override
  829. +    CreatureAI* GetAI(Creature* creature) const
  830.      {
  831.          return new npc_memoryAI(creature);
  832. -    }
  833. +    };
  834.  };
  835.  
  836.  class npc_argent_soldier : public CreatureScript
  837.  {
  838. -public:
  839. -    npc_argent_soldier() : CreatureScript("npc_argent_soldier") { }
  840. +    public:
  841. +        npc_argent_soldier(): CreatureScript("npc_argent_soldier") { }
  842.  
  843. -    // THIS AI NEEDS MORE IMPROVEMENTS
  844. -    struct npc_argent_soldierAI : public npc_escortAI
  845. -    {
  846. -        npc_argent_soldierAI(Creature* creature) : npc_escortAI(creature)
  847. +        struct npc_argent_soldierAI : public npc_escortAI
  848.          {
  849. -            instance = creature->GetInstanceScript();
  850. -            me->SetReactState(REACT_DEFENSIVE);
  851. -            SetDespawnAtEnd(false);
  852. -            uiWaypoint = 0;
  853. -        }
  854. -
  855. -        InstanceScript* instance;
  856. +            npc_argent_soldierAI(Creature* creature) : npc_escortAI(creature)
  857. +            {
  858. +                instance = creature->GetInstanceScript();
  859. +                me->SetReactState(REACT_DEFENSIVE);
  860. +                SetDespawnAtEnd(false);
  861. +                uiWaypoint = 0;
  862. +            }
  863.  
  864. -        uint8 uiWaypoint;
  865. +            void Reset()
  866. +            {
  867. +                _shielded = false;
  868. +                _events.Reset();
  869. +            }
  870.  
  871. -        void WaypointReached(uint32 waypointId) override
  872. -        {
  873. -            if (waypointId == 0)
  874. +            void EnterCombat(Unit* /*who*/)
  875.              {
  876. -                switch (uiWaypoint)
  877. +                switch (me->GetEntry())
  878.                  {
  879. -                    case 0:
  880. -                        me->SetFacingTo(5.81f);
  881. +                    case NPC_ARGENT_LIGHWIELDER:
  882. +                        _events.ScheduleEvent(EVENT_CLEAVE, urand(4000, 8000));
  883. +                        _events.ScheduleEvent(EVENT_BLAZINGLIGHT, urand(7000, 10000));
  884. +                        if (IsHeroic())
  885. +                            _events.ScheduleEvent(EVENT_STRIKE, urand(9000, 12000));
  886.                          break;
  887. -                    case 1:
  888. -                        me->SetFacingTo(4.60f);
  889. +                    case NPC_ARGENT_MONK:
  890. +                        _events.ScheduleEvent(EVENT_FLURRY, urand(8000, 12000));
  891. +                        _events.ScheduleEvent(EVENT_PUMMEL, urand(5000, 6000));
  892.                          break;
  893. -                    case 2:
  894. -                        me->SetFacingTo(2.79f);
  895. +                    case NPC_PRIESTESS:
  896. +                        _events.ScheduleEvent(EVENT_PAIN, urand(3000, 6000));
  897. +                        _events.ScheduleEvent(EVENT_FOUNTAIN, urand(15000, 20000));
  898. +                        _events.ScheduleEvent(EVENT_HOLYSMITE, urand(4000, 8000));
  899. +                        if (IsHeroic())
  900. +                            _events.ScheduleEvent(EVENT_MINDCONTROL, urand(17000, 25000));
  901.                          break;
  902.                  }
  903.              }
  904. -        }
  905.  
  906. -        void SetData(uint32 uiType, uint32 /*uiData*/) override
  907. -        {
  908. -            switch (me->GetEntry())
  909. +            void WaypointReached(uint32 uiPoint) override
  910.              {
  911. -                case NPC_ARGENT_LIGHWIELDER:
  912. -                    switch (uiType)
  913. +                if (uiPoint == 0)
  914. +                {
  915. +                    switch (uiWaypoint)
  916.                      {
  917.                          case 0:
  918. -                            AddWaypoint(0, 712.14f, 628.42f, 411.88f);
  919. +                            me->SetOrientation(5.81f);
  920.                              break;
  921.                          case 1:
  922. -                            AddWaypoint(0, 742.44f, 650.29f, 411.79f);
  923. +                            me->SetOrientation(4.60f);
  924.                              break;
  925.                          case 2:
  926. -                            AddWaypoint(0, 783.33f, 615.29f, 411.84f);
  927. +                            me->SetOrientation(2.79f);
  928.                              break;
  929.                      }
  930. -                    break;
  931. -                case NPC_ARGENT_MONK:
  932. -                    switch (uiType)
  933. +
  934. +                    me->SendMovementFlagUpdate();
  935. +                }
  936. +            }
  937. +
  938. +            void SetData(uint32 uiType, uint32 /*uiData*/) override
  939. +            {
  940. +                switch (me->GetEntry())
  941. +                {
  942. +                    case NPC_ARGENT_LIGHWIELDER:
  943. +                        switch (uiType)
  944. +                        {
  945. +                            case 0:
  946. +                                AddWaypoint(0, 712.14f, 628.42f, 411.88f);
  947. +                                break;
  948. +                            case 1:
  949. +                                AddWaypoint(0, 742.44f, 650.29f, 411.79f);
  950. +                                break;
  951. +                            case 2:
  952. +                                AddWaypoint(0, 783.33f, 615.29f, 411.84f);
  953. +                                break;
  954. +                        }
  955. +                        break;
  956. +                    case NPC_ARGENT_MONK:
  957. +                        switch (uiType)
  958. +                        {
  959. +                            case 0:
  960. +                                AddWaypoint(0, 713.12f, 632.97f, 411.90f);
  961. +                                break;
  962. +                            case 1:
  963. +                                AddWaypoint(0, 746.73f, 650.24f, 411.56f);
  964. +                                break;
  965. +                            case 2:
  966. +                                AddWaypoint(0, 781.32f, 610.54f, 411.82f);
  967. +                                break;
  968. +                        }
  969. +                        break;
  970. +                    case NPC_PRIESTESS:
  971. +                        switch (uiType)
  972. +                        {
  973. +                            case 0:
  974. +                                AddWaypoint(0, 715.06f, 637.07f, 411.91f);
  975. +                                break;
  976. +                            case 1:
  977. +                                AddWaypoint(0, 750.72f, 650.20f, 411.77f);
  978. +                                break;
  979. +                            case 2:
  980. +                                AddWaypoint(0, 779.77f, 607.03f, 411.81f);
  981. +                                break;
  982. +                        }
  983. +                        break;
  984. +                }
  985. +
  986. +                Start(false, true);
  987. +                uiWaypoint = uiType;
  988. +            }
  989. +
  990. +            void DamageTaken(Unit* /*attacker*/, uint32 &damage)
  991. +            {
  992. +                if (!IsHeroic() || _shielded || me->GetEntry() != NPC_ARGENT_MONK)
  993. +                    return;
  994. +
  995. +                if (damage >= me->GetHealth())
  996. +                {
  997. +                    DoCast(me, SPELL_FINAL);
  998. +                    DoCast(me, SPELL_DIVINE, true);
  999. +                    me->SetHealth(1);
  1000. +                    damage = 0;
  1001. +                    _shielded = true;
  1002. +                }
  1003. +            }
  1004. +
  1005. +            void UpdateAI(uint32 uiDiff) override
  1006. +            {
  1007. +                npc_escortAI::UpdateAI(uiDiff);
  1008. +
  1009. +                if (!UpdateVictim())
  1010. +                    return;
  1011. +
  1012. +                _events.Update(uiDiff);
  1013. +
  1014. +                if (me->HasUnitState(UNIT_STATE_CASTING))
  1015. +                    return;
  1016. +
  1017. +                while (uint32 eventId = _events.ExecuteEvent())
  1018. +                {
  1019. +                    switch (eventId)
  1020.                      {
  1021. -                        case 0:
  1022. -                            AddWaypoint(0, 713.12f, 632.97f, 411.90f);
  1023. +                        case EVENT_CLEAVE:
  1024. +                            DoCastVictim(SPELL_CLEAVE);
  1025. +                            _events.ScheduleEvent(EVENT_CLEAVE, urand(5000, 8000));
  1026.                              break;
  1027. -                        case 1:
  1028. -                            AddWaypoint(0, 746.73f, 650.24f, 411.56f);
  1029. +                        case EVENT_STRIKE:
  1030. +                            DoCastVictim(SPELL_STRIKE);
  1031. +                            _events.ScheduleEvent(EVENT_STRIKE, urand(10000, 12000));
  1032.                              break;
  1033. -                        case 2:
  1034. -                            AddWaypoint(0, 781.32f, 610.54f, 411.82f);
  1035. +                        case EVENT_BLAZINGLIGHT:
  1036. +                            DoCast(me, SPELL_LIGHT);
  1037. +                            _events.ScheduleEvent(EVENT_BLAZINGLIGHT, urand(9000, 13000));
  1038.                              break;
  1039. -                    }
  1040. -                    break;
  1041. -                case NPC_PRIESTESS:
  1042. -                    switch (uiType)
  1043. -                    {
  1044. -                        case 0:
  1045. -                            AddWaypoint(0, 715.06f, 637.07f, 411.91f);
  1046. +                        case EVENT_FLURRY:
  1047. +                            DoCast(me, SPELL_FLURRY);
  1048. +                            _events.ScheduleEvent(EVENT_FLURRY, urand(13000, 15000));
  1049.                              break;
  1050. -                        case 1:
  1051. -                            AddWaypoint(0, 750.72f, 650.20f, 411.77f);
  1052. +                        case EVENT_PUMMEL:
  1053. +                            DoCastVictim(SPELL_PUMMEL);
  1054. +                            _events.ScheduleEvent(EVENT_PUMMEL, urand(4000, 7000));
  1055.                              break;
  1056. -                        case 2:
  1057. -                            AddWaypoint(0, 779.77f, 607.03f, 411.81f);
  1058. +                        case EVENT_HOLYSMITE:
  1059. +                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f))
  1060. +                                DoCast(target, DUNGEON_MODE(SPELL_HOLY_SMITE, SPELL_HOLY_SMITE_H));
  1061. +                            _events.ScheduleEvent(EVENT_HOLYSMITE, urand(5000, 7000));
  1062. +                            break;
  1063. +                        case EVENT_MINDCONTROL:
  1064. +                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 30.0f))
  1065. +                                DoCast(target, SPELL_MIND);
  1066. +                            _events.ScheduleEvent(EVENT_MINDCONTROL, urand(20000, 25000));
  1067. +                            break;
  1068. +                        case EVENT_PAIN:
  1069. +                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, false, DUNGEON_MODE(-SPELL_SHADOW_WORD_PAIN, -SPELL_SHADOW_WORD_PAIN_H)))
  1070. +                                DoCast(target, DUNGEON_MODE(SPELL_SHADOW_WORD_PAIN, SPELL_SHADOW_WORD_PAIN_H));
  1071. +                            _events.ScheduleEvent(EVENT_PAIN, urand(7000, 90000));
  1072. +                            break;
  1073. +                        case EVENT_FOUNTAIN:
  1074. +                            DoCast(SPELL_FOUNTAIN_OF_LIGHT);
  1075. +                            _events.ScheduleEvent(EVENT_FOUNTAIN, urand(20000, 30000));
  1076.                              break;
  1077.                      }
  1078. -                    break;
  1079. -            }
  1080. -
  1081. -            Start(false, true);
  1082. -            uiWaypoint = uiType;
  1083. -        }
  1084. +                }
  1085.  
  1086. -        void UpdateAI(uint32 uiDiff) override
  1087. -        {
  1088. -            npc_escortAI::UpdateAI(uiDiff);
  1089. +                DoMeleeAttackIfReady();
  1090. +            }
  1091.  
  1092. -            if (!UpdateVictim())
  1093. -                return;
  1094. +            void JustDied(Unit* /*killer*/) override
  1095. +            {
  1096. +                if (instance)
  1097. +                    instance->SetData(DATA_ARGENT_SOLDIER_DEFEATED, instance->GetData(DATA_ARGENT_SOLDIER_DEFEATED) + 1);
  1098. +            }
  1099.  
  1100. -            DoMeleeAttackIfReady();
  1101. -        }
  1102. +        private:
  1103. +            InstanceScript* instance;
  1104. +            EventMap _events;
  1105. +            bool _shielded;
  1106. +            uint8 uiWaypoint;
  1107. +        };
  1108.  
  1109. -        void JustDied(Unit* /*killer*/) override
  1110. +        CreatureAI* GetAI(Creature* creature) const
  1111.          {
  1112. -            instance->SetData(DATA_ARGENT_SOLDIER_DEFEATED, instance->GetData(DATA_ARGENT_SOLDIER_DEFEATED) + 1);
  1113. +            return new npc_argent_soldierAI(creature);
  1114.          }
  1115. -    };
  1116. -
  1117. -    CreatureAI* GetAI(Creature* creature) const override
  1118. -    {
  1119. -        return GetInstanceAI<npc_argent_soldierAI>(creature);
  1120. -    }
  1121.  };
  1122.  
  1123. -uint32 const memorySpellId[25] =
  1124. +enum ReflectiveShield
  1125.  {
  1126. -    SPELL_MEMORY_ALGALON,
  1127. -    SPELL_MEMORY_ARCHIMONDE,
  1128. -    SPELL_MEMORY_CHROMAGGUS,
  1129. -    SPELL_MEMORY_CYANIGOSA,
  1130. -    SPELL_MEMORY_DELRISSA,
  1131. -    SPELL_MEMORY_ECK,
  1132. -    SPELL_MEMORY_ENTROPIUS,
  1133. -    SPELL_MEMORY_GRUUL,
  1134. -    SPELL_MEMORY_HAKKAR,
  1135. -    SPELL_MEMORY_HEIGAN,
  1136. -    SPELL_MEMORY_HEROD,
  1137. -    SPELL_MEMORY_HOGGER,
  1138. -    SPELL_MEMORY_IGNIS,
  1139. -    SPELL_MEMORY_ILLIDAN,
  1140. -    SPELL_MEMORY_INGVAR,
  1141. -    SPELL_MEMORY_KALITHRESH,
  1142. -    SPELL_MEMORY_LUCIFRON,
  1143. -    SPELL_MEMORY_MALCHEZAAR,
  1144. -    SPELL_MEMORY_MUTANUS,
  1145. -    SPELL_MEMORY_ONYXIA,
  1146. -    SPELL_MEMORY_THUNDERAAN,
  1147. -    SPELL_MEMORY_VANCLEEF,
  1148. -    SPELL_MEMORY_VASHJ,
  1149. -    SPELL_MEMORY_VEKNILASH,
  1150. -    SPELL_MEMORY_VEZAX
  1151. +    SPELL_REFLECTIVE_SHIELD_TRIGGERED = 33619
  1152.  };
  1153.  
  1154. -// 66545 - Summon Memory
  1155. -class spell_paletress_summon_memory : public SpellScriptLoader
  1156. +// Reflective Shield 66515
  1157. +class spell_gen_reflective_shield : public SpellScriptLoader
  1158.  {
  1159.      public:
  1160. -        spell_paletress_summon_memory() : SpellScriptLoader("spell_paletress_summon_memory") { }
  1161. +        spell_gen_reflective_shield() : SpellScriptLoader("spell_gen_reflective_shield") { }
  1162.  
  1163. -        class spell_paletress_summon_memory_SpellScript : public SpellScript
  1164. +        class spell_gen_reflective_shield_AuraScript : public AuraScript
  1165.          {
  1166. -            PrepareSpellScript(spell_paletress_summon_memory_SpellScript);
  1167. +            PrepareAuraScript(spell_gen_reflective_shield_AuraScript);
  1168.  
  1169. -            bool Validate(SpellInfo const* /*spellInfo*/) override
  1170. +            bool Validate(SpellInfo const* /*spell*/) override
  1171.              {
  1172. -                for (uint8 i = 0; i < 25; ++i)
  1173. -                    if (!sSpellMgr->GetSpellInfo(memorySpellId[i]))
  1174. -                        return false;
  1175. +                if (!sSpellStore.LookupEntry(SPELL_REFLECTIVE_SHIELD_TRIGGERED))
  1176. +                    return false;
  1177. +
  1178.                  return true;
  1179.              }
  1180.  
  1181. -            void FilterTargets(std::list<WorldObject*>& targets)
  1182. +            void Trigger(AuraEffect * aurEff, DamageInfo & dmgInfo, uint32 & absorbAmount)
  1183.              {
  1184. -                if (targets.empty())
  1185. +                Unit * target = dmgInfo.GetAttacker();
  1186. +                if (!target)
  1187.                      return;
  1188. +                Unit * caster = GetCaster();
  1189. +                if (!caster)
  1190. +                    return;
  1191. +                int32 bp = CalculatePct(absorbAmount, 25);
  1192. +                target->CastCustomSpell(target, SPELL_REFLECTIVE_SHIELD_TRIGGERED, &bp, NULL, NULL, true, NULL, aurEff);
  1193. +            }
  1194.  
  1195. -                WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets);
  1196. -                targets.clear();
  1197. -                targets.push_back(target);
  1198. +            void Register()
  1199. +            {
  1200. +                 AfterEffectAbsorb += AuraEffectAbsorbFn(spell_gen_reflective_shield_AuraScript::Trigger, EFFECT_0);
  1201.              }
  1202. +        };
  1203.  
  1204. -            void HandleScript(SpellEffIndex /*effIndex*/)
  1205. +        AuraScript *GetAuraScript() const
  1206. +        {
  1207. +            return new spell_gen_reflective_shield_AuraScript();
  1208. +        }
  1209. +};
  1210. +
  1211. +class achievement_toc5_argent_challenge : public AchievementCriteriaScript
  1212. +{
  1213. +    public:
  1214. +        uint32 creature_entry;
  1215. +
  1216. +        achievement_toc5_argent_challenge(const char* name, uint32 original_entry) : AchievementCriteriaScript(name) {
  1217. +            creature_entry = original_entry;
  1218. +        }
  1219. +
  1220. +        bool OnCheck(Player* /*source*/, Unit* target) override
  1221. +        {
  1222. +            if (!target)
  1223. +                return false;
  1224. +
  1225. +            if (Creature* creature = target->ToCreature())
  1226. +                if (creature->GetOriginalEntry() == creature_entry)
  1227. +                    return true;
  1228. +
  1229. +            return false;
  1230. +        }
  1231. +};
  1232. +
  1233. +class achievement_toc5_argent_confessor : public AchievementCriteriaScript
  1234. +{
  1235. +    public:
  1236. +        uint32 creature_entry;
  1237. +
  1238. +        achievement_toc5_argent_confessor(const char* name, uint32 original_entry) : AchievementCriteriaScript(name)
  1239. +        {
  1240. +            creature_entry = original_entry;
  1241. +        }
  1242. +
  1243. +        bool OnCheck(Player* /*source*/, Unit* target) override
  1244. +        {
  1245. +            if (!target)
  1246. +                return false;
  1247. +
  1248. +            if (Creature* creature = target->ToCreature())
  1249. +                if (creature->GetEntry() == creature_entry && creature->GetMap()->ToInstanceMap()->IsHeroic())
  1250. +                    return true;
  1251. +
  1252. +            return false;
  1253. +        }
  1254. +};
  1255. +
  1256. +class achievement_toc5_the_faceroller : public AchievementCriteriaScript
  1257. +{
  1258. +    public:
  1259. +        achievement_toc5_the_faceroller(const char* name) : AchievementCriteriaScript(name) {}
  1260. +
  1261. +        bool OnCheck(Player* /*source*/, Unit* target) override
  1262. +        {
  1263. +            if (target && target->GetMap()->ToInstanceMap()->IsHeroic())
  1264. +                return target->GetAI()->GetData(DATA_THE_FACEROLLER);
  1265. +
  1266. +            return false;
  1267. +        }
  1268. +};
  1269. +
  1270. +class spell_light_rain: public SpellScriptLoader
  1271. +{
  1272. +    public:
  1273. +        spell_light_rain(): SpellScriptLoader("spell_light_rain") { }
  1274. +
  1275. +        class spell_light_rain_SpellScript : public SpellScript
  1276. +        {
  1277. +            PrepareSpellScript(spell_light_rain_SpellScript);
  1278. +
  1279. +            void SelectTarget(std::list<WorldObject*>& unitList)
  1280.              {
  1281. -                GetHitUnit()->CastSpell(GetHitUnit(), memorySpellId[urand(0, 24)], true, NULL, NULL, GetCaster()->GetGUID());
  1282. +                if (unitList.empty())
  1283. +                    return;
  1284. +
  1285. +                unitList.sort(Trinity::HealthPctOrderPred());
  1286. +                unitList.resize(1);
  1287.              }
  1288.  
  1289. -            void Register() override
  1290. +            void Register()
  1291.              {
  1292. -                OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_paletress_summon_memory_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
  1293. -                OnEffectHitTarget += SpellEffectFn(spell_paletress_summon_memory_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
  1294. +                OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_light_rain_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY);
  1295.              }
  1296.          };
  1297.  
  1298. -        SpellScript* GetSpellScript() const override
  1299. +        SpellScript* GetSpellScript() const
  1300.          {
  1301. -            return new spell_paletress_summon_memory_SpellScript();
  1302. +            return new spell_light_rain_SpellScript();
  1303.          }
  1304.  };
  1305.  
  1306.  void AddSC_boss_argent_challenge()
  1307.  {
  1308.      new boss_eadric();
  1309. -    new spell_eadric_radiance();
  1310.      new boss_paletress();
  1311.      new npc_memory();
  1312.      new npc_argent_soldier();
  1313. -    new spell_paletress_summon_memory();
  1314. -}
  1315. +    new spell_gen_reflective_shield();
  1316. +    new spell_light_rain();
  1317. +    new spell_eadric_radiance();
  1318. +    new spell_eadric_hammer_missile();
  1319. +    new spell_eadric_hammer_throw_back();
  1320. +    new achievement_toc5_argent_challenge("achievement_toc5_paletress", NPC_PALETRESS);
  1321. +    new achievement_toc5_argent_challenge("achievement_toc5_eadric", NPC_EADRIC);
  1322. +    
  1323. +    new achievement_toc5_argent_confessor("achivement_toc5_argent_confessor_hogger", MEMORY_HOGGER);
  1324. +    new achievement_toc5_argent_confessor("achivement_toc5_argent_confessor_vancleef", MEMORY_VANCLEEF);
  1325. +    new achievement_toc5_argent_confessor("achivement_toc5_argent_confessor_mutanus", MEMORY_MUTANUS);
  1326. +    new achievement_toc5_argent_confessor("achivement_toc5_argent_confessor_herod", MEMORY_HEROD);
  1327. +    new achievement_toc5_argent_confessor("achivement_toc5_argent_confessor_lucifron", MEMORY_LUCIFRON);
  1328. +    new achievement_toc5_argent_confessor("achivement_toc5_argent_confessor_thunderaan", MEMORY_THUNDERAAN);
  1329. +    new achievement_toc5_argent_confessor("achivement_toc5_argent_confessor_chromaggus", MEMORY_CHROMAGGUS);
  1330. +    new achievement_toc5_argent_confessor("achivement_toc5_argent_confessor_hakkar", MEMORY_HAKKAR);
  1331. +    new achievement_toc5_argent_confessor("achivement_toc5_argent_confessor_veknilash", MEMORY_VEKNILASH);
  1332. +    new achievement_toc5_argent_confessor("achivement_toc5_argent_confessor_kalithresh", MEMORY_KALITHRESH);
  1333. +    new achievement_toc5_argent_confessor("achivement_toc5_argent_confessor_malchezar", MEMORY_MALCHEZAAR);
  1334. +    new achievement_toc5_argent_confessor("achivement_toc5_argent_confessor_gruul", MEMORY_GRUUL);
  1335. +    new achievement_toc5_argent_confessor("achivement_toc5_argent_confessor_vashj", MEMORY_VASHJ);
  1336. +    new achievement_toc5_argent_confessor("achivement_toc5_argent_confessor_archimonde", MEMORY_ARCHIMONDE);
  1337. +    new achievement_toc5_argent_confessor("achivement_toc5_argent_confessor_illidan", MEMORY_ILLIDAN);
  1338. +    new achievement_toc5_argent_confessor("achivement_toc5_argent_confessor_delrissa", MEMORY_DELRISSA);
  1339. +    new achievement_toc5_argent_confessor("achivement_toc5_argent_confessor_muru", MEMORY_ENTROPIUS);
  1340. +    new achievement_toc5_argent_confessor("achivement_toc5_argent_confessor_ingvar", MEMORY_INGVAR);
  1341. +    new achievement_toc5_argent_confessor("achivement_toc5_argent_confessor_cyanigosa", MEMORY_CYANIGOSA);
  1342. +    new achievement_toc5_argent_confessor("achivement_toc5_argent_confessor_eck", MEMORY_ECK);
  1343. +    new achievement_toc5_argent_confessor("achivement_toc5_argent_confessor_onyxia", MEMORY_ONYXIA);
  1344. +    new achievement_toc5_argent_confessor("achivement_toc5_argent_confessor_heigan", MEMORY_HEIGAN);
  1345. +    new achievement_toc5_argent_confessor("achivement_toc5_argent_confessor_ignis", MEMORY_IGNIS);
  1346. +    new achievement_toc5_argent_confessor("achivement_toc5_argent_confessor_vezax", MEMORY_VEZAX);
  1347. +    new achievement_toc5_argent_confessor("achivement_toc5_argent_confessor_algalon", MEMORY_ALGALON);
  1348. +
  1349. +    new achievement_toc5_the_faceroller("achievement_toc5_the_faceroller");
  1350. +}
  1351. \ No newline at end of file
  1352. diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp
  1353. index e375a0a..ea744ba 100644
  1354. --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp
  1355. +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp
  1356. @@ -15,50 +15,64 @@
  1357.   * with this program. If not, see <http://www.gnu.org/licenses/>.
  1358.   */
  1359.  
  1360. -/* ScriptData
  1361. -SDName: Boss Black Knight
  1362. -SD%Complete: 80%
  1363. -SDComment: missing yells. not sure about timers.
  1364. -SDCategory: Trial of the Champion
  1365. -EndScriptData */
  1366. -
  1367. -#include "ScriptMgr.h"
  1368. -#include "ScriptedCreature.h"
  1369. +#include "ScriptPCH.h"
  1370.  #include "ScriptedEscortAI.h"
  1371.  #include "trial_of_the_champion.h"
  1372. +#include "Vehicle.h"
  1373. +
  1374. +enum Talk
  1375. +{
  1376. +   SAY_INTRO_1                             = 0, // You spoiled my grand entrance, Rat.
  1377. +   SAY_INTRO_2                             = 56, // What is the meaning of this? -Tirion
  1378. +   SAY_INTRO_3                             = 1, // Did you honestly think an agent of the Lich King would be bested on the field of your pathetic little tournament?
  1379. +   SAY_INTRO_4                             = 2, // I have come to finish my task
  1380. +   SAY_AGGRO                               = 3, // This farce ends here!
  1381. +   SAY_AGGRO_OUTRO                         = 51, // Varian - Don't just stand there; kill him! | Garrosh - Tear him apart!
  1382. +   SAY_KILLED_PLAYER                       = 6, // Pathetic | A waste of flesh.
  1383. +   SAY_PHASE_1                             = 4, // My roting flash was just getting in the way!
  1384. +   SAY_PHASE_2                             = 5, // I have no need for bones to best you!
  1385. +   SAY_DEATH                               = 7  // No! I must not fail...again...
  1386. +};
  1387. +
  1388.  
  1389.  enum Spells
  1390.  {
  1391.      //phase 1
  1392. -    SPELL_PLAGUE_STRIKE     = 67884,
  1393. -    SPELL_PLAGUE_STRIKE_2   = 67724,
  1394. -    SPELL_ICY_TOUCH_H       = 67881,
  1395. +    SPELL_PLAGUE_STRIKE     = 67724,
  1396.      SPELL_ICY_TOUCH         = 67718,
  1397. +    SPELL_ICY_TOUCH_H       = 67881,
  1398.      SPELL_DEATH_RESPITE     = 67745,
  1399. -    SPELL_DEATH_RESPITE_2   = 68306,
  1400. -    SPELL_DEATH_RESPITE_3   = 66798,
  1401. -    SPELL_OBLITERATE_H      = 67883,
  1402. +    SPELL_DEATH_RESPITE_H   = 68306,
  1403.      SPELL_OBLITERATE        = 67725,
  1404. -    //in this phase should rise herald (the spell is missing)
  1405. +    SPELL_OBLITERATE_H      = 67883,
  1406. +    ZOMBIE_JAEREN           = 67715,
  1407. +    ZOMBIE_ARELAS           = 67705,
  1408. +    KILL_HERALD             = 66804,
  1409. +    SPELL_RESPITE_HERALD    = 66798,
  1410.  
  1411.      //phase 2 - During this phase, the Black Knight will use the same abilities as in phase 1, except for Death's Respite
  1412.      SPELL_ARMY_DEAD         = 67761,
  1413. -    SPELL_DESECRATION       = 67778,
  1414. -    SPELL_DESECRATION_2     = 67778,
  1415. +    SPELL_DESECRATION       = 68766,
  1416.      SPELL_GHOUL_EXPLODE     = 67751,
  1417.  
  1418.      //phase 3
  1419. -    SPELL_DEATH_BITE_H      = 67875,
  1420.      SPELL_DEATH_BITE        = 67808,
  1421. +    SPELL_DEATH_BITE_H      = 67875,
  1422.      SPELL_MARKED_DEATH      = 67882,
  1423. -    SPELL_MARKED_DEATH_2    = 67823,
  1424.  
  1425.      SPELL_BLACK_KNIGHT_RES  = 67693,
  1426.  
  1427.      SPELL_LEAP              = 67749,
  1428.      SPELL_LEAP_H            = 67880,
  1429. +    SPELL_CLAW              = 67774,
  1430. +    SPELL_CLAW_H            = 67879,
  1431. +
  1432. +    GHOUL_EXPLODE_DAMAGE    = 67729,
  1433. +    H_GHOUL_EXPLODE_DAMAGE  = 67886,
  1434.  
  1435. -    SPELL_KILL_CREDIT       = 68663
  1436. +    SPELL_KILL_CREDIT       = 68663,
  1437. +
  1438. +    SPELL_MOUNT_VEHICLE     = 46598
  1439.  };
  1440.  
  1441.  enum Models
  1442. @@ -67,13 +81,35 @@ enum Models
  1443.      MODEL_GHOST    = 21300
  1444.  };
  1445.  
  1446. +enum Equip
  1447. +{
  1448. +     EQUIP_SWORD   = 40343
  1449. +};
  1450. +
  1451. +enum IntroPhase
  1452. +{
  1453. +    IDLE,
  1454. +    INTRO,
  1455. +    NORMAL,
  1456. +    FINISHED
  1457. +};
  1458. +
  1459.  enum Phases
  1460.  {
  1461. -    PHASE_UNDEAD    = 1,
  1462. -    PHASE_SKELETON  = 2,
  1463. -    PHASE_GHOST     = 3
  1464. +    PHASE_UNDEAD    = 3,
  1465. +    PHASE_SKELETON  = 4,
  1466. +    PHASE_GHOST     = 5
  1467. +
  1468. +};
  1469. +
  1470. +enum Creatures
  1471. +{
  1472. +    CREATURE_HIGHLORD                     = 34996,
  1473. +    CREATURE_ANNOUNCER                    = 35004
  1474.  };
  1475.  
  1476. +const Position MoveKnightPos         = {746.993286f, 622.990784f, 411.417237f, 4.712464f};
  1477. +
  1478.  class boss_black_knight : public CreatureScript
  1479.  {
  1480.  public:
  1481. @@ -81,49 +117,43 @@ public:
  1482.  
  1483.      struct boss_black_knightAI : public ScriptedAI
  1484.      {
  1485. -        boss_black_knightAI(Creature* creature) : ScriptedAI(creature), summons(creature)
  1486. +        boss_black_knightAI(Creature* creature) : ScriptedAI(creature)
  1487.          {
  1488. -            Initialize();
  1489.              instance = creature->GetInstanceScript();
  1490. -        }
  1491. -
  1492. -        void Initialize()
  1493. -        {
  1494. -            bEventInProgress = false;
  1495. -            bEvent = false;
  1496. -            bSummonArmy = false;
  1497. -            bDeathArmyDone = false;
  1498. -
  1499. -            uiPhase = PHASE_UNDEAD;
  1500. -
  1501. -            uiIcyTouchTimer = urand(5000, 9000);
  1502. -            uiPlagueStrikeTimer = urand(10000, 13000);
  1503. -            uiDeathRespiteTimer = urand(15000, 16000);
  1504. -            uiObliterateTimer = urand(17000, 19000);
  1505. -            uiDesecration = urand(15000, 16000);
  1506. -            uiDeathArmyCheckTimer = 7000;
  1507. -            uiResurrectTimer = 4000;
  1508. -            uiGhoulExplodeTimer = 8000;
  1509. -            uiDeathBiteTimer = urand(2000, 4000);
  1510. -            uiMarkedDeathTimer = urand(5000, 7000);
  1511. +            Phase = IDLE;
  1512. +            bCredit = false;
  1513.          }
  1514.  
  1515.          InstanceScript* instance;
  1516.  
  1517. -        SummonList summons;
  1518. +        GuidList SummonList;
  1519.  
  1520.          bool bEventInProgress;
  1521.          bool bEvent;
  1522.          bool bSummonArmy;
  1523.          bool bDeathArmyDone;
  1524. +        bool bEventInBattle;
  1525. +        bool bFight;
  1526. +        bool bCredit;
  1527. +        bool iveHadWorse;
  1528.  
  1529.          uint8 uiPhase;
  1530. +        uint8 uiIntroPhase;
  1531. +
  1532. +        Creature* pHighlord;
  1533. +        Creature* pAnnouncer;
  1534.  
  1535. +        IntroPhase Phase;
  1536. +
  1537. +        uint32 uiIntroTimer;
  1538.          uint32 uiPlagueStrikeTimer;
  1539. +        uint32 uiPlagueStrike1Timer;
  1540.          uint32 uiIcyTouchTimer;
  1541. +        uint32 uiIcyTouch1Timer;
  1542.          uint32 uiDeathRespiteTimer;
  1543.          uint32 uiObliterateTimer;
  1544. -        uint32 uiDesecration;
  1545. +        uint32 uiObliterate1Timer;
  1546. +        uint32 uiDesecrationTimer;
  1547.          uint32 uiResurrectTimer;
  1548.          uint32 uiDeathArmyCheckTimer;
  1549.          uint32 uiGhoulExplodeTimer;
  1550. @@ -132,28 +162,154 @@ public:
  1551.  
  1552.          void Reset() override
  1553.          {
  1554. -            summons.DespawnAll();
  1555. +            RemoveSummons();
  1556.              me->SetDisplayId(me->GetNativeDisplayId());
  1557.              me->ClearUnitState(UNIT_STATE_ROOT | UNIT_STATE_STUNNED);
  1558.  
  1559. -            Initialize();
  1560. +            bEventInProgress = false;
  1561. +            bEvent = false;
  1562. +            bSummonArmy = false;
  1563. +            bDeathArmyDone = false;
  1564. +            bFight = false;
  1565. +            iveHadWorse = true;
  1566. +            pAnnouncer = NULL;
  1567. +
  1568. +            if (instance)
  1569. +            {
  1570. +                if (GameObject* go = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_MAIN_GATE)))
  1571. +                    instance->HandleGameObject(go->GetGUID(), false);
  1572. +
  1573. +                if (GameObject* go = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_MAIN_GATE1)))
  1574. +                    instance->HandleGameObject(go->GetGUID(), true);
  1575. +            }
  1576. +
  1577. +            if (bEventInBattle)
  1578. +            {
  1579. +                me->GetMotionMaster()->MovePoint(1, 743.396f, 635.411f, 411.575f);
  1580. +                me->setFaction(14);
  1581. +                me->SetReactState(REACT_AGGRESSIVE);
  1582. +                me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
  1583. +            }
  1584. +
  1585. +            uiPhase = PHASE_UNDEAD;
  1586. +            uiIcyTouchTimer = urand(5000, 9000);
  1587. +            uiIcyTouch1Timer = urand(15000, 15000);
  1588. +            uiPlagueStrikeTimer = urand(10000, 13000);
  1589. +            uiDeathRespiteTimer = 17000;
  1590. +            uiPlagueStrike1Timer = urand(14000, 14000);
  1591. +            uiObliterateTimer = urand(17000, 19000);
  1592. +            uiObliterate1Timer = urand(15000, 15000);
  1593. +            uiDesecrationTimer = urand(15000, 16000);
  1594. +            uiDesecrationTimer = 22000;
  1595. +            uiDeathArmyCheckTimer = 7000;
  1596. +            uiResurrectTimer = 4000;
  1597. +            uiGhoulExplodeTimer = 8000;
  1598. +            uiDeathBiteTimer = urand (2000, 4000);
  1599. +            uiMarkedDeathTimer = urand (5000, 7000);
  1600. +            uiIntroTimer = 15000;
  1601. +            uiIntroPhase = 0;
  1602. +            Phase = IDLE;
  1603.          }
  1604.  
  1605. -        void JustSummoned(Creature* summon) override
  1606. +        void MoveInLineOfSight(Unit* who) override
  1607.          {
  1608. -            summons.Summon(summon);
  1609. -            summon->AI()->AttackStart(me->GetVictim());
  1610. +            if (!who)
  1611. +                return;
  1612. +
  1613. +            if (Phase == IDLE && me->IsValidAttackTarget(who) && me->IsWithinDistInMap(who, 200.0f))
  1614. +            {
  1615. +                me->SetReactState(REACT_PASSIVE);
  1616. +                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  1617. +                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
  1618. +                Phase = INTRO;
  1619. +            }
  1620.          }
  1621.  
  1622. -        void SummonedCreatureDespawn(Creature* summon) override
  1623. +        void RemoveSummons()
  1624.          {
  1625. -            summons.Despawn(summon);
  1626. +            if (SummonList.empty())
  1627. +                return;
  1628. +
  1629. +            for(GuidList::const_iterator itr = SummonList.begin(); itr != SummonList.end(); ++itr)
  1630. +            {
  1631. +                if (Creature* temp = ObjectAccessor::GetCreature(*me, *itr))
  1632. +                {
  1633. +                    if (temp)
  1634. +                    {
  1635. +                        // Let all remaining ghouls explode
  1636. +                        if ((temp->GetEntry() == 35590 || temp->GetEntry() == 12444) && temp->IsAlive())
  1637. +                        {
  1638. +                            me->CastSpell(temp, SPELL_GHOUL_EXPLODE, true);
  1639. +                        }
  1640. +                        else
  1641. +                            temp->DisappearAndDie();
  1642. +                    }
  1643. +                }
  1644. +            }
  1645. +            SummonList.clear();
  1646. +        }
  1647. +
  1648. +        void JustSummoned(Creature* summon) override
  1649. +        {
  1650. +            SummonList.push_back(summon->GetGUID());
  1651.          }
  1652.  
  1653.          void UpdateAI(uint32 uiDiff) override
  1654.          {
  1655. -            //Return since we have no target
  1656. -            if (!UpdateVictim())
  1657. +            if (Phase == IDLE)
  1658. +                return;
  1659. +
  1660. +            if (Phase == INTRO)
  1661. +            {
  1662. +                if (uiIntroTimer <= uiDiff)
  1663. +                {
  1664. +                    switch (uiIntroPhase)
  1665. +                    {
  1666. +                        case 0:
  1667. +                            ++uiIntroPhase;
  1668. +                            uiIntroTimer = 3000;
  1669. +                            break;
  1670. +                        case 1: // MEH
  1671. +                            ++uiIntroPhase;
  1672. +                            uiIntroTimer = 2000;
  1673. +                            break;
  1674. +                        case 2:
  1675. +                            if (Creature* announcer = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ANNOUNCER)))
  1676. +                                announcer->DisappearAndDie();
  1677. +
  1678. +                            me->SetUnitMovementFlags(MOVEMENTFLAG_WALKING);
  1679. +                            me->GetMotionMaster()->MovePoint(0, MoveKnightPos);
  1680. +                            ++uiIntroPhase;
  1681. +                            uiIntroTimer = 2000;
  1682. +                            break;
  1683. +                        case 3:
  1684. +                            Talk(SAY_INTRO_3);
  1685. +                            ++uiIntroPhase;
  1686. +                            uiIntroTimer = 6000;
  1687. +                            break;
  1688. +                        case 4:
  1689. +                            Talk(SAY_INTRO_4);
  1690. +                            ++uiIntroPhase;
  1691. +                            uiIntroTimer = 3000;
  1692. +                            break;
  1693. +                        case 5:
  1694. +                            me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NON_ATTACKABLE);
  1695. +                            me->SetReactState(REACT_AGGRESSIVE);
  1696. +                            ++uiIntroPhase;
  1697. +                            uiIntroTimer = 3000;
  1698. +                            if (Unit* unit = me->SelectNearestTarget())
  1699. +                                AttackStart(unit);
  1700. +                            DoZoneInCombat();
  1701. +                            Phase = NORMAL;
  1702. +                            break;
  1703. +                    }
  1704. +                }
  1705. +                else
  1706. +                    uiIntroTimer -= uiDiff;
  1707. +                return;
  1708. +            }
  1709. +
  1710. +            if (!UpdateVictim() || me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT) || me->GetVehicle())
  1711.                  return;
  1712.  
  1713.              if (bEventInProgress)
  1714. @@ -161,9 +317,22 @@ public:
  1715.                  if (uiResurrectTimer <= uiDiff)
  1716.                  {
  1717.                      me->SetFullHealth();
  1718. +                    me->AttackStop();
  1719. +
  1720. +                    switch (uiPhase)
  1721. +                    {
  1722. +                        case PHASE_UNDEAD:
  1723. +                            Talk(SAY_PHASE_1);
  1724. +                            break;
  1725. +                        case PHASE_SKELETON:
  1726. +                            Talk(SAY_PHASE_2);
  1727. +                            break;
  1728. +                    }
  1729. +
  1730.                      DoCast(me, SPELL_BLACK_KNIGHT_RES, true);
  1731. +                    me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  1732.                      uiPhase++;
  1733. -                    uiResurrectTimer = 4000;
  1734. +                    uiResurrectTimer = 3000;
  1735.                      bEventInProgress = false;
  1736.                      me->ClearUnitState(UNIT_STATE_ROOT | UNIT_STATE_STUNNED);
  1737.                  } else uiResurrectTimer -= uiDiff;
  1738. @@ -172,82 +341,125 @@ public:
  1739.              switch (uiPhase)
  1740.              {
  1741.                  case PHASE_UNDEAD:
  1742. -                case PHASE_SKELETON:
  1743.                  {
  1744. -                    if (uiIcyTouchTimer <= uiDiff)
  1745. -                    {
  1746. -                        DoCastVictim(SPELL_ICY_TOUCH);
  1747. -                        uiIcyTouchTimer = urand(5000, 7000);
  1748. -                    } else uiIcyTouchTimer -= uiDiff;
  1749.                      if (uiPlagueStrikeTimer <= uiDiff)
  1750.                      {
  1751. -                        DoCastVictim(SPELL_ICY_TOUCH);
  1752. +                        DoCastVictim(SPELL_PLAGUE_STRIKE);
  1753.                          uiPlagueStrikeTimer = urand(12000, 15000);
  1754.                      } else uiPlagueStrikeTimer -= uiDiff;
  1755. +                    
  1756.                      if (uiObliterateTimer <= uiDiff)
  1757.                      {
  1758. -                        DoCastVictim(SPELL_OBLITERATE);
  1759. +                        DoCastVictim(DUNGEON_MODE(SPELL_OBLITERATE, SPELL_OBLITERATE_H));
  1760.                          uiObliterateTimer = urand(17000, 19000);
  1761.                      } else uiObliterateTimer -= uiDiff;
  1762. -                    switch (uiPhase)
  1763. +                    
  1764. +                    if (uiIcyTouchTimer <= uiDiff)
  1765.                      {
  1766. -                        case PHASE_UNDEAD:
  1767. +                        DoCastVictim(DUNGEON_MODE(SPELL_ICY_TOUCH, SPELL_ICY_TOUCH_H));
  1768. +                        uiIcyTouchTimer = urand(5000, 7000);
  1769. +                    } else uiIcyTouchTimer -= uiDiff;
  1770. +                    break;
  1771. +                }
  1772. +                case PHASE_SKELETON:
  1773. +                {
  1774. +                    if (!bSummonArmy)
  1775. +                    {
  1776. +                        bSummonArmy = true;
  1777. +                        me->AddUnitState(UNIT_STATE_ROOT | UNIT_STATE_STUNNED);
  1778. +                        me->SetFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_NON_ATTACKABLE);
  1779. +                        DoCast(me, SPELL_ARMY_DEAD);
  1780. +                    }
  1781. +
  1782. +                    if (!bDeathArmyDone)
  1783. +                    {
  1784. +                        if (uiDeathArmyCheckTimer <= uiDiff)
  1785.                          {
  1786. -                            if (uiDeathRespiteTimer <= uiDiff)
  1787. -                            {
  1788. -                                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
  1789. -                                {
  1790. -                                    if (target && target->IsAlive())
  1791. -                                        DoCast(target, SPELL_DEATH_RESPITE);
  1792. -                                }
  1793. -                                uiDeathRespiteTimer = urand(15000, 16000);
  1794. -                            } else uiDeathRespiteTimer -= uiDiff;
  1795. -                            break;
  1796. +                            me->ClearUnitState(UNIT_STATE_ROOT | UNIT_STATE_STUNNED);
  1797. +                            me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  1798. +                            uiDeathArmyCheckTimer = 0;
  1799. +                            bDeathArmyDone = true;
  1800. +                        } else uiDeathArmyCheckTimer -= uiDiff;
  1801. +                    }
  1802. +                          
  1803. +                    if (uiDesecrationTimer <= uiDiff)
  1804. +                    {
  1805. +                        if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
  1806. +                        {
  1807. +                            if (target->IsAlive())
  1808. +                                DoCast(target, SPELL_DESECRATION);
  1809.                          }
  1810. -                        case PHASE_SKELETON:
  1811. +                        uiDesecrationTimer = urand(15000,16000);
  1812. +                    } else uiDesecrationTimer -= uiDiff;
  1813. +                        
  1814. +                    if (uiGhoulExplodeTimer <= uiDiff)
  1815. +                    {
  1816. +                        if (!SummonList.empty())
  1817.                          {
  1818. -                            if (!bSummonArmy)
  1819. -                            {
  1820. -                                bSummonArmy = true;
  1821. -                                me->AddUnitState(UNIT_STATE_ROOT | UNIT_STATE_STUNNED);
  1822. -                                DoCast(me, SPELL_ARMY_DEAD);
  1823. -                            }
  1824. -                            if (!bDeathArmyDone)
  1825. -                            {
  1826. -                                if (uiDeathArmyCheckTimer <= uiDiff)
  1827. -                                {
  1828. -                                    me->ClearUnitState(UNIT_STATE_ROOT | UNIT_STATE_STUNNED);
  1829. -                                    uiDeathArmyCheckTimer = 0;
  1830. -                                    bDeathArmyDone = true;
  1831. -                                } else uiDeathArmyCheckTimer -= uiDiff;
  1832. -                            }
  1833. -                            if (uiDesecration <= uiDiff)
  1834. +                            for(GuidList::const_iterator itr = SummonList.begin(); itr != SummonList.end(); ++itr)
  1835.                              {
  1836. -                                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
  1837. +                                if (Creature* temp = ObjectAccessor::GetCreature(*me, *itr))
  1838.                                  {
  1839. -                                    if (target && target->IsAlive())
  1840. -                                        DoCast(target, SPELL_DESECRATION);
  1841. +                                    if (temp)
  1842. +                                    {
  1843. +                                        // Let all remaining ghouls explode
  1844. +                                        if (temp->GetEntry() == 35590 || temp->GetEntry() == 12444)
  1845. +                                        {
  1846. +                                            if (temp->IsAlive())
  1847. +                                            {
  1848. +                                                me->CastSpell(temp, SPELL_GHOUL_EXPLODE, true);
  1849. +                                                break;
  1850. +                                            }
  1851. +                                            else
  1852. +                                                continue;
  1853. +                                        }
  1854. +                                    }
  1855.                                  }
  1856. -                                uiDesecration = urand(15000, 16000);
  1857. -                            } else uiDesecration -= uiDiff;
  1858. -                            if (uiGhoulExplodeTimer <= uiDiff)
  1859. -                            {
  1860. -                                DoCast(me, SPELL_GHOUL_EXPLODE);
  1861. -                                uiGhoulExplodeTimer = 8000;
  1862. -                            } else uiGhoulExplodeTimer -= uiDiff;
  1863. -                            break;
  1864. +                            }
  1865.                          }
  1866. -                        break;
  1867. -                    }
  1868. +
  1869. +                        uiGhoulExplodeTimer = 8000;
  1870. +                    } else uiGhoulExplodeTimer -= uiDiff;
  1871. +                    
  1872. +                    if (uiPlagueStrike1Timer <= uiDiff)
  1873. +                    {
  1874. +                        DoCastVictim(SPELL_PLAGUE_STRIKE);
  1875. +                        uiPlagueStrike1Timer = urand(12000, 15000);
  1876. +                    } else uiPlagueStrike1Timer -= uiDiff;
  1877. +                    
  1878. +                    if (uiObliterate1Timer <= uiDiff)
  1879. +                    {
  1880. +                        DoCastVictim(SPELL_OBLITERATE);
  1881. +                        uiObliterate1Timer = urand(17000, 19000);
  1882. +                    } else uiObliterate1Timer -= uiDiff;
  1883. +                    
  1884. +                    if (uiIcyTouch1Timer <= uiDiff)
  1885. +                    {
  1886. +                        DoCastVictim(SPELL_ICY_TOUCH);
  1887. +                        uiIcyTouch1Timer = urand(5000, 7000);
  1888. +                    } else uiIcyTouch1Timer -= uiDiff;
  1889. +                    
  1890. +                    if (uiDeathRespiteTimer <= uiDiff)
  1891. +                    {
  1892. +                        if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
  1893. +                        {
  1894. +                            if (target && target->IsAlive())
  1895. +                            DoCast(target, SPELL_DEATH_RESPITE);
  1896. +                        }
  1897. +                        uiDeathRespiteTimer = urand(15000, 16000);
  1898. +                    } else uiDeathRespiteTimer -= uiDiff;
  1899.                      break;
  1900.                  }
  1901. +
  1902.                  case PHASE_GHOST:
  1903.                  {
  1904.                      if (uiDeathBiteTimer <= uiDiff)
  1905.                      {
  1906. -                        DoCastAOE(SPELL_DEATH_BITE);
  1907. -                        uiDeathBiteTimer = urand(2000, 4000);
  1908. +                        SetEquipmentSlots(false, EQUIP_UNEQUIP, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE);
  1909. +                        DoCast(me, DUNGEON_MODE(SPELL_DEATH_BITE, SPELL_DEATH_BITE_H));
  1910. +                        uiDeathBiteTimer = urand (2000, 4000);
  1911.                      } else uiDeathBiteTimer -= uiDiff;
  1912. +                
  1913.                      if (uiMarkedDeathTimer <= uiDiff)
  1914.                      {
  1915.                          if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
  1916. @@ -255,7 +467,7 @@ public:
  1917.                              if (target && target->IsAlive())
  1918.                                  DoCast(target, SPELL_MARKED_DEATH);
  1919.                          }
  1920. -                        uiMarkedDeathTimer = urand(5000, 7000);
  1921. +                        uiMarkedDeathTimer = urand (10000, 12000);
  1922.                      } else uiMarkedDeathTimer -= uiDiff;
  1923.                      break;
  1924.                  }
  1925. @@ -265,14 +477,52 @@ public:
  1926.                  DoMeleeAttackIfReady();
  1927.          }
  1928.  
  1929. -        void DamageTaken(Unit* /*pDoneBy*/, uint32& uiDamage) override
  1930. +        void EnterCombat(Unit* /*who*/) override
  1931.          {
  1932. -            if (uiDamage > me->GetHealth() && uiPhase <= PHASE_SKELETON)
  1933. +            bEventInBattle = true;
  1934. +            Talk(SAY_AGGRO);
  1935. +
  1936. +            SetEquipmentSlots(false, EQUIP_SWORD, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE);
  1937. +
  1938. +            if (instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE)
  1939. +            {
  1940. +                DoCast(me, ZOMBIE_JAEREN);
  1941. +                if (Creature* garrosh = me->FindNearestCreature(NPC_GARROSH, 200.0f))
  1942. +                    garrosh->AI()->Talk(SAY_AGGRO_OUTRO);
  1943. +            }
  1944. +            else
  1945. +            {
  1946. +                DoCast(me, ZOMBIE_ARELAS);
  1947. +                if (Creature* varian = me->FindNearestCreature(NPC_VARIAN, 200.0f))
  1948. +                    varian->AI()->Talk(SAY_AGGRO_OUTRO);
  1949. +            }
  1950. +
  1951. +            if (instance)
  1952.              {
  1953. -                uiDamage = 0;
  1954. +                if (GameObject* go = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_MAIN_GATE1)))
  1955. +                    instance->HandleGameObject(go->GetGUID(), false);
  1956. +
  1957. +                if (GameObject* go = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_MAIN_GATE)))
  1958. +                    instance->HandleGameObject(go->GetGUID(), false);
  1959. +
  1960. +                instance->SetData(BOSS_BLACK_KNIGHT, IN_PROGRESS);
  1961. +            }
  1962. +        }
  1963. +
  1964. +        void KilledUnit(Unit* /*victim*/) override
  1965. +        {
  1966. +            Talk(SAY_KILLED_PLAYER);
  1967. +        }
  1968. +
  1969. +        void DamageTaken(Unit* /*who*/, uint32& damage) override
  1970. +        {
  1971. +            if (damage >= me->GetHealth() && uiPhase <= PHASE_SKELETON)
  1972. +            {
  1973. +                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  1974. +                damage = 0;
  1975.                  me->SetHealth(0);
  1976.                  me->AddUnitState(UNIT_STATE_ROOT | UNIT_STATE_STUNNED);
  1977. -                summons.DespawnAll();
  1978. +                RemoveSummons();
  1979.                  switch (uiPhase)
  1980.                  {
  1981.                      case PHASE_UNDEAD:
  1982. @@ -280,24 +530,61 @@ public:
  1983.                          break;
  1984.                      case PHASE_SKELETON:
  1985.                          me->SetDisplayId(MODEL_GHOST);
  1986. +                        SetEquipmentSlots(false, EQUIP_UNEQUIP, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE);
  1987.                          break;
  1988.                  }
  1989.                  bEventInProgress = true;
  1990.              }
  1991. +            else if (damage >= me->GetHealth() && uiPhase == PHASE_GHOST && !bCredit)
  1992. +            {
  1993. +                bCredit = true;
  1994. +                HandleSpellOnPlayersInInstanceToC5(me, 68663);
  1995. +            }
  1996. +        }
  1997. +
  1998. +        uint32 GetData(uint32 type) const override
  1999. +        {
  2000. +            if (type == DATA_IVE_HAD_WORSE)
  2001. +                return iveHadWorse;
  2002. +
  2003. +            return 0;
  2004. +        }
  2005. +
  2006. +        void SetData(uint32 uiType, uint32 uiData) override
  2007. +        {
  2008. +            if (uiType == DATA_IVE_HAD_WORSE)
  2009. +                iveHadWorse = uiData;
  2010.          }
  2011.  
  2012.          void JustDied(Unit* /*killer*/) override
  2013.          {
  2014.              DoCast(me, SPELL_KILL_CREDIT);
  2015. +            Talk(SAY_DEATH);
  2016. +            if (TempSummon* summ = me->ToTempSummon())
  2017. +                summ->SetTempSummonType(TEMPSUMMON_DEAD_DESPAWN);
  2018. +
  2019. +            if (instance)
  2020. +            {
  2021. +                instance->SetData(BOSS_BLACK_KNIGHT, DONE);
  2022. +
  2023. +                instance->DoCastSpellOnPlayers(SPELL_KILL_CREDIT);
  2024.  
  2025. -            instance->SetData(BOSS_BLACK_KNIGHT, DONE);
  2026. +                // Instance encounter counting mechanics
  2027. +                //instance->UpdateEncounterState(ENCOUNTER_CREDIT_CAST_SPELL, 68663, me);
  2028. +
  2029. +                if (GameObject* go = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_MAIN_GATE1)))
  2030. +                    instance->HandleGameObject(go->GetGUID(), true);
  2031. +            }
  2032.          }
  2033. +        private:
  2034. +            EventMap _events;
  2035.      };
  2036.  
  2037. -    CreatureAI* GetAI(Creature* creature) const override
  2038. +    CreatureAI* GetAI(Creature* creature) const
  2039.      {
  2040. -        return GetInstanceAI<boss_black_knightAI>(creature);
  2041. +        return new boss_black_knightAI (creature);
  2042.      }
  2043. +
  2044.  };
  2045.  
  2046.  class npc_risen_ghoul : public CreatureScript
  2047. @@ -307,37 +594,91 @@ public:
  2048.  
  2049.      struct npc_risen_ghoulAI : public ScriptedAI
  2050.      {
  2051. -        npc_risen_ghoulAI(Creature* creature) : ScriptedAI(creature)
  2052. +        npc_risen_ghoulAI(Creature* creature) : ScriptedAI(creature) { }
  2053. +
  2054. +        uint32 uiAttackTimer;
  2055. +        InstanceScript* instance;
  2056. +
  2057. +        void Reset() override
  2058. +        {
  2059. +            uiAttackTimer = 3500;
  2060. +        }
  2061. +
  2062. +        void UpdateAI(uint32 diff) override
  2063.          {
  2064. -            Initialize();
  2065. +            if (!UpdateVictim())
  2066. +                return;
  2067. +
  2068. +            if (uiAttackTimer <= diff)
  2069. +            {
  2070. +                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true))
  2071. +                {
  2072. +                    if (target && target->IsAlive())
  2073. +                        DoCast(target, DUNGEON_MODE(SPELL_LEAP, SPELL_LEAP_H));
  2074. +                }
  2075. +                uiAttackTimer = 3500;
  2076. +            } else uiAttackTimer -= diff;
  2077. +
  2078. +            DoMeleeAttackIfReady();
  2079.          }
  2080.  
  2081. -        void Initialize()
  2082. +        void SpellHitTarget(Unit* target, const SpellInfo* spell) override
  2083.          {
  2084. -            uiAttackTimer = 3500;
  2085. +            if (target->GetTypeId() == TYPEID_PLAYER && (spell->Id == GHOUL_EXPLODE_DAMAGE || spell->Id == H_GHOUL_EXPLODE_DAMAGE || spell->Id == SPELL_GHOUL_EXPLODE))
  2086. +                if (Creature* knight = me->FindNearestCreature(NPC_BLACK_KNIGHT, 200.0f))
  2087. +                    knight->AI()->SetData(DATA_IVE_HAD_WORSE, false);
  2088.          }
  2089. +    };
  2090.  
  2091. -        uint32 uiAttackTimer;
  2092. +    CreatureAI* GetAI(Creature* creature) const override
  2093. +    {
  2094. +        return new npc_risen_ghoulAI(creature);
  2095. +    }
  2096. +};
  2097. +
  2098. +class npc_risen_announcer : public CreatureScript
  2099. +{
  2100. +public:
  2101. +    npc_risen_announcer() : CreatureScript("npc_risen_announcer") { }
  2102. +
  2103. +    struct npc_risen_announcerAI : public ScriptedAI
  2104. +    {
  2105. +        npc_risen_announcerAI(Creature* creature) : ScriptedAI(creature)
  2106. +        {
  2107. +            me->setFaction(14);
  2108. +        }
  2109. +
  2110. +        uint32 uiLeapTimer;
  2111. +        uint32 uiClawTimer;
  2112.  
  2113.          void Reset() override
  2114.          {
  2115. -            Initialize();
  2116. +            uiLeapTimer = 10000;
  2117. +            uiClawTimer = 1000;
  2118.          }
  2119.  
  2120. -        void UpdateAI(uint32 uiDiff) override
  2121. +        void UpdateAI(uint32 diff) override
  2122.          {
  2123.              if (!UpdateVictim())
  2124.                  return;
  2125.  
  2126. -            if (uiAttackTimer <= uiDiff)
  2127. +            if (uiLeapTimer <= diff)
  2128.              {
  2129.                  if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true))
  2130.                  {
  2131.                      if (target && target->IsAlive())
  2132. -                        DoCast(target, (SPELL_LEAP));
  2133. +                        DoCast(target, DUNGEON_MODE(SPELL_LEAP, SPELL_LEAP_H));
  2134.                  }
  2135. -                uiAttackTimer = 3500;
  2136. -            } else uiAttackTimer -= uiDiff;
  2137. +                uiLeapTimer = 10000;
  2138. +            } else uiLeapTimer -= diff;
  2139. +
  2140. +            if (uiClawTimer <= diff)
  2141. +            {
  2142. +                DoCastVictim(DUNGEON_MODE(SPELL_CLAW, SPELL_CLAW_H));
  2143. +                uiClawTimer = 1000;
  2144. +            } else uiClawTimer -= diff;
  2145. +
  2146. +
  2147.  
  2148.              DoMeleeAttackIfReady();
  2149.          }
  2150. @@ -345,7 +686,7 @@ public:
  2151.  
  2152.      CreatureAI* GetAI(Creature* creature) const override
  2153.      {
  2154. -        return new npc_risen_ghoulAI(creature);
  2155. +        return new npc_risen_announcerAI(creature);
  2156.      }
  2157.  };
  2158.  
  2159. @@ -359,17 +700,61 @@ public:
  2160.          npc_black_knight_skeletal_gryphonAI(Creature* creature) : npc_escortAI(creature)
  2161.          {
  2162.              Start(false, true);
  2163. +            instance = creature->GetInstanceScript();
  2164. +        }
  2165. +
  2166. +        Creature* pHighlord;
  2167. +        InstanceScript* instance;
  2168. +
  2169. +        void Reset() override
  2170. +        {
  2171. +            pHighlord = NULL;
  2172.          }
  2173.  
  2174. -        void WaypointReached(uint32 /*waypointId*/) override { }
  2175. +        void WaypointReached(uint32 uiPointId) override
  2176. +        {
  2177. +            switch (uiPointId)
  2178. +            {
  2179. +                case 1:
  2180. +                    me->SetSpeed(MOVE_FLIGHT, 2.0f);
  2181. +                    break;
  2182. +                case 2:
  2183. +                    me->SetSpeed(MOVE_FLIGHT, 2.0f);
  2184. +                    if (Creature* blackknight = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_BLACK_KNIGHT)))
  2185. +                        blackknight->AI()->Talk(SAY_INTRO_1);
  2186. +                    break;
  2187. +                case 3:
  2188. +                case 4:
  2189. +                case 5:
  2190. +                    me->SetSpeed(MOVE_FLIGHT, 2.0f);
  2191. +                    break;
  2192. +                case 6:
  2193. +                    me->SetSpeed(MOVE_FLIGHT, 2.0f);
  2194. +                    if (Creature* tirion = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_HIGHLORD)))
  2195. +                        tirion->AI()->Talk(SAY_INTRO_2);
  2196. +                    break;
  2197. +                case 7:
  2198. +                case 8:
  2199. +                case 9:
  2200. +                    me->SetSpeed(MOVE_FLIGHT, 2.0f);
  2201. +                    break;
  2202. +                case 10:
  2203. +                    me->SetUnitMovementFlags(MOVEMENTFLAG_WALKING);
  2204. +                    me->SetSpeed(MOVE_RUN, 2.0f);
  2205. +                    if (!me->FindNearestCreature(NPC_BLACK_KNIGHT, 200.0f))
  2206. +                        if (Creature* announcer = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ANNOUNCER)))
  2207. +                            announcer->AI()->DoAction(ACTION_RESET_BLACK_KNIGHT);
  2208. +                    break;
  2209. +            }
  2210. +        }
  2211.  
  2212.          void UpdateAI(uint32 uiDiff) override
  2213.          {
  2214.              npc_escortAI::UpdateAI(uiDiff);
  2215.  
  2216. -            UpdateVictim();
  2217. +            if (!UpdateVictim())
  2218. +                return;
  2219.          }
  2220. -
  2221.      };
  2222.  
  2223.      CreatureAI* GetAI(Creature* creature) const override
  2224. @@ -378,9 +763,29 @@ public:
  2225.      }
  2226.  };
  2227.  
  2228. +class achievement_ive_had_worse : public AchievementCriteriaScript
  2229. +{
  2230. +    public:
  2231. +        achievement_ive_had_worse() : AchievementCriteriaScript("TW_achievement_ive_had_worse") { }
  2232. +
  2233. +        bool OnCheck(Player* /*player*/, Unit* target) override
  2234. +        {
  2235. +            if (!target)
  2236. +                return false;
  2237. +
  2238. +            if (Creature* Knight = target->ToCreature())
  2239. +                if (Knight->AI()->GetData(DATA_IVE_HAD_WORSE) && Knight->GetMap()->ToInstanceMap()->IsHeroic())
  2240. +                    return true;
  2241. +
  2242. +            return false;
  2243. +        }
  2244. +};
  2245. +
  2246.  void AddSC_boss_black_knight()
  2247.  {
  2248.      new boss_black_knight();
  2249.      new npc_risen_ghoul();
  2250. +    new npc_risen_announcer();
  2251.      new npc_black_knight_skeletal_gryphon();
  2252. -}
  2253. +    new achievement_ive_had_worse();
  2254. +}
  2255. \ No newline at end of file
  2256. diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp
  2257. index c375e5c..4cf5d8b 100644
  2258. --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp
  2259. +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp
  2260. @@ -1,6 +1,5 @@
  2261.  /*
  2262.   * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
  2263. - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
  2264.   *
  2265.   * This program is free software; you can redistribute it and/or modify it
  2266.   * under the terms of the GNU General Public License as published by the
  2267. @@ -16,15 +15,7 @@
  2268.   * with this program. If not, see <http://www.gnu.org/licenses/>.
  2269.   */
  2270.  
  2271. -/* ScriptData
  2272. -SDName: boss_grand_champions
  2273. -SD%Complete: 50 %
  2274. -SDComment: Is missing the ai to make the npcs look for a new mount and use it.
  2275. -SDCategory: Trial Of the Champion
  2276. -EndScriptData */
  2277. -
  2278. -#include "ScriptMgr.h"
  2279. -#include "ScriptedCreature.h"
  2280. +#include "ScriptPCH.h"
  2281.  #include "ScriptedEscortAI.h"
  2282.  #include "Vehicle.h"
  2283.  #include "trial_of_the_champion.h"
  2284. @@ -32,10 +23,22 @@ EndScriptData */
  2285.  
  2286.  enum Spells
  2287.  {
  2288. -    //Vehicle
  2289. +    // Defend
  2290. +    SPELL_DEFEND_2                  = 66482,
  2291. +    SPELL_VISUAL_SHIELD_1           = 63130,
  2292. +    SPELL_VISUAL_SHIELD_2           = 63131,
  2293. +    SPELL_VISUAL_SHIELD_3           = 63132,
  2294. +
  2295. +    // Shield break
  2296. +    SPELL_THROW_VISUAL              = 45827,
  2297. +
  2298. +    // Vehicle
  2299. +    SPELL_SHIELD_BREAKER            = 62575,
  2300. +    SPELL_SHIELD                    = 62544,
  2301. +    SPELL_THRUST                    = 68505,
  2302. +    SPELL_SHIELD_1                  = 66482,
  2303.      SPELL_CHARGE                    = 63010,
  2304. -    SPELL_SHIELD_BREAKER            = 68504,
  2305. -    SPELL_SHIELD                    = 66482,
  2306. +    SPELL_DEFEND                    = 62719,
  2307.  
  2308.      // Marshal Jacob Alerius && Mokra the Skullcrusher || Warrior
  2309.      SPELL_MORTAL_STRIKE             = 68783,
  2310. @@ -60,11 +63,12 @@ enum Spells
  2311.      SPELL_HEALING_WAVE              = 67528,
  2312.      SPELL_HEALING_WAVE_H            = 68318,
  2313.      SPELL_HEX_OF_MENDING            = 67534,
  2314. +    SPELL_HEX_OF_MENDING_HEAL       = 67535,
  2315.  
  2316.      // Jaelyne Evensong && Zul'tore || Hunter
  2317.      SPELL_DISENGAGE                 = 68340, //not implemented in the AI yet...
  2318.      SPELL_LIGHTNING_ARROWS          = 66083,
  2319. -    SPELL_MULTI_SHOT                = 66081,
  2320. +    SPELL_MULTI_SHOT                = 49047,
  2321.      SPELL_SHOOT                     = 65868,
  2322.      SPELL_SHOOT_H                   = 67988,
  2323.  
  2324. @@ -72,35 +76,83 @@ enum Spells
  2325.      SPELL_EVISCERATE                = 67709,
  2326.      SPELL_EVISCERATE_H              = 68317,
  2327.      SPELL_FAN_OF_KNIVES             = 67706,
  2328. -    SPELL_POISON_BOTTLE             = 67701
  2329. +    SPELL_POISON_BOTTLE             = 67701,
  2330. +
  2331. +    // Achievement Credit
  2332. +    SPELL_GRAND_CHAMPIONS_CREDIT    = 68572
  2333.  };
  2334.  
  2335. -enum Seats
  2336. +enum Talk
  2337. +{
  2338. +    SAY_CHAMPION_DEFEAT             = 0,
  2339. +    WARNING_WEAPONS                 = 1
  2340. +};
  2341. +
  2342. +enum Seat
  2343.  {
  2344.      SEAT_ID_0                       = 0
  2345.  };
  2346.  
  2347. +enum Events
  2348. +{
  2349. +    // Warrior
  2350. +    EVENT_BLADESTORM                = 1,
  2351. +    EVENT_MORTAL_STRIKE             = 2,
  2352. +
  2353. +    // Mage
  2354. +    EVENT_FIREBALL                  = 3,
  2355. +    EVENT_BLASTWAVE                 = 4,
  2356. +    EVENT_HASTE                     = 5,
  2357. +    EVENT_POLYMORPH                 = 6,
  2358. +
  2359. +    // Shaman
  2360. +    EVENT_EARTH_SHIELD              = 7,
  2361. +    EVENT_CHAIN_LIGHTNING           = 8,
  2362. +    EVENT_HEALING_WAVE              = 9,
  2363. +    EVENT_HEX                       = 10,
  2364. +
  2365. +    // Hunter
  2366. +    EVENT_SHOOT                     = 11,
  2367. +    EVENT_MULTI_SHOOT               = 12,
  2368. +    EVENT_DISENGAGE                 = 13,
  2369. +    EVENT_LIGHTNING_ARROWS          = 14,
  2370. +
  2371. +    // Rogue
  2372. +    EVENT_EVISCERATE                = 15,
  2373. +    EVENT_FAN_OF_KNIVES             = 16,
  2374. +    EVENT_POISON_BOTTLE             = 17,
  2375. +
  2376. +    EVENT_PHASE_SWITCH
  2377. +};
  2378. +
  2379. +enum Phases
  2380. +{
  2381. +    PHASE_IDLE                      = 1,
  2382. +    PHASE_COMBAT                    = 2
  2383. +};
  2384. +
  2385.  /*
  2386.  struct Point
  2387.  {
  2388. -    float x, y, z;
  2389. +    float x,y,z;
  2390.  };
  2391.  
  2392.  const Point MovementPoint[] =
  2393.  {
  2394. -  {746.84f, 623.15f, 411.41f},
  2395. -  {747.96f, 620.29f, 411.09f},
  2396. -  {750.23f, 618.35f, 411.09f}
  2397. +  {746.84f,623.15f,411.41f},
  2398. +  {747.96f,620.29f,411.09f},
  2399. +  {750.23f,618.35f,411.09f}
  2400.  };
  2401.  */
  2402. +
  2403.  void AggroAllPlayers(Creature* temp)
  2404.  {
  2405.      Map::PlayerList const &PlList = temp->GetMap()->GetPlayers();
  2406.  
  2407.      if (PlList.isEmpty())
  2408. -            return;
  2409. +        return;
  2410.  
  2411. -    for (Map::PlayerList::const_iterator i = PlList.begin(); i != PlList.end(); ++i)
  2412. +    for(Map::PlayerList::const_iterator i = PlList.begin(); i != PlList.end(); ++i)
  2413.      {
  2414.          if (Player* player = i->GetSource())
  2415.          {
  2416. @@ -109,7 +161,7 @@ void AggroAllPlayers(Creature* temp)
  2417.  
  2418.              if (player->IsAlive())
  2419.              {
  2420. -                temp->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC);
  2421. +                temp->RemoveFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC);
  2422.                  temp->SetReactState(REACT_AGGRESSIVE);
  2423.                  temp->SetInCombatWith(player);
  2424.                  player->SetInCombatWith(temp);
  2425. @@ -133,8 +185,11 @@ bool GrandChampionsOutVehicle(Creature* me)
  2426.      if (pGrandChampion1 && pGrandChampion2 && pGrandChampion3)
  2427.      {
  2428.          if (!pGrandChampion1->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT) &&
  2429. +            !pGrandChampion1->GetVehicle() &&
  2430.              !pGrandChampion2->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT) &&
  2431. -            !pGrandChampion3->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT))
  2432. +            !pGrandChampion2->GetVehicle() &&
  2433. +            !pGrandChampion3->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT) &&
  2434. +            !pGrandChampion3->GetVehicle())
  2435.              return true;
  2436.      }
  2437.  
  2438. @@ -148,211 +203,362 @@ bool GrandChampionsOutVehicle(Creature* me)
  2439.  
  2440.  class generic_vehicleAI_toc5 : public CreatureScript
  2441.  {
  2442. -public:
  2443. -    generic_vehicleAI_toc5() : CreatureScript("generic_vehicleAI_toc5") { }
  2444. +    public:
  2445. +        generic_vehicleAI_toc5(): CreatureScript("generic_vehicleAI_toc5") { }
  2446.  
  2447.      struct generic_vehicleAI_toc5AI : public npc_escortAI
  2448.      {
  2449.          generic_vehicleAI_toc5AI(Creature* creature) : npc_escortAI(creature)
  2450.          {
  2451. -            Initialize();
  2452. +            hasBeenInCombat = false;
  2453.              SetDespawnAtEnd(false);
  2454.              uiWaypointPath = 0;
  2455. -
  2456. +            uiCheckTimer = 5000;
  2457.              instance = creature->GetInstanceScript();
  2458.          }
  2459.  
  2460. -        void Initialize()
  2461. -        {
  2462. -            uiChargeTimer = 5000;
  2463. -            uiShieldBreakerTimer = 8000;
  2464. -            uiBuffTimer = urand(30000, 60000);
  2465. -        }
  2466. -
  2467.          InstanceScript* instance;
  2468.  
  2469. -        uint32 uiChargeTimer;
  2470. +        bool hasBeenInCombat;
  2471. +        bool combatEntered;
  2472. +
  2473. +        uint32 combatCheckTimer;
  2474.          uint32 uiShieldBreakerTimer;
  2475. +        uint32 uiTimerSpell1;
  2476. +        uint32 uiTimerSpell2;
  2477. +        uint32 uiTimerSpell3;
  2478.          uint32 uiBuffTimer;
  2479. -
  2480. +        uint32 uiCheckTimer;
  2481. +        uint32 uiDefendTimer;
  2482. +        uint32 uiChargeTimer;
  2483. +        uint32 uiThrustTimer;
  2484.          uint32 uiWaypointPath;
  2485.  
  2486.          void Reset() override
  2487.          {
  2488. -            Initialize();
  2489. +            combatCheckTimer = 500;
  2490. +            uiShieldBreakerTimer = 8000;
  2491. +            uiBuffTimer = urand(30000,60000);
  2492. +            uiTimerSpell1= urand(4000,10000);
  2493. +            uiTimerSpell2= urand(4000,10000);
  2494. +            uiTimerSpell3= urand(1000,2000);
  2495. +            uiDefendTimer = urand(30000, 60000);
  2496.          }
  2497.  
  2498. -        void SetData(uint32 uiType, uint32 /*uiData*/) override
  2499. +        void SetData(uint32 uiType, uint32 /*uiData8*/) override
  2500.          {
  2501. -            switch (uiType)
  2502. +            switch(uiType)
  2503.              {
  2504.                  case 1:
  2505. -                    AddWaypoint(0, 747.36f, 634.07f, 411.572f);
  2506. -                    AddWaypoint(1, 780.43f, 607.15f, 411.82f);
  2507. -                    AddWaypoint(2, 785.99f, 599.41f, 411.92f);
  2508. -                    AddWaypoint(3, 778.44f, 601.64f, 411.79f);
  2509. +                    AddWaypoint(0, 746.45f, 647.03f, 411.57f);
  2510. +                    AddWaypoint(1, 771.434f, 642.606f, 411.9f);
  2511. +                    AddWaypoint(2, 779.807f, 617.535f, 411.716f);
  2512. +                    AddWaypoint(3, 771.098f, 594.635f, 411.625f);
  2513. +                    AddWaypoint(4, 746.887f, 583.425f, 411.668f);
  2514. +                    AddWaypoint(5, 715.176f, 583.782f, 412.394f);
  2515. +                    AddWaypoint(6, 720.719f, 591.141f, 411.737f);
  2516.                      uiWaypointPath = 1;
  2517.                      break;
  2518.                  case 2:
  2519. -                    AddWaypoint(0, 747.35f, 634.07f, 411.57f);
  2520. -                    AddWaypoint(1, 768.72f, 581.01f, 411.92f);
  2521. -                    AddWaypoint(2, 763.55f, 590.52f, 411.71f);
  2522. +                    AddWaypoint(0, 746.45f, 647.03f, 411.57f);
  2523. +                    AddWaypoint(1, 771.434f, 642.606f, 411.9f);
  2524. +                    AddWaypoint(2, 779.807f, 617.535f, 411.716f);
  2525. +                    AddWaypoint(3, 771.098f, 594.635f, 411.625f);
  2526. +                    AddWaypoint(4, 746.887f, 583.425f, 411.668f);
  2527. +                    AddWaypoint(5, 746.16f, 571.678f, 412.389f);
  2528. +                    AddWaypoint(6, 746.887f, 583.425f, 411.668f);
  2529.                      uiWaypointPath = 2;
  2530.                      break;
  2531.                  case 3:
  2532. -                    AddWaypoint(0, 747.35f, 634.07f, 411.57f);
  2533. -                    AddWaypoint(1, 784.02f, 645.33f, 412.39f);
  2534. -                    AddWaypoint(2, 775.67f, 641.91f, 411.91f);
  2535. +                    AddWaypoint(0, 746.45f, 647.03f, 411.57f);
  2536. +                    AddWaypoint(1, 771.434f, 642.606f, 411.9f);
  2537. +                    AddWaypoint(2, 779.807f, 617.535f, 411.716f);
  2538. +                    AddWaypoint(3, 771.098f, 594.635f, 411.625f);
  2539. +                    AddWaypoint(4, 777.759f, 584.577f, 412.393f);
  2540. +                    AddWaypoint(5, 772.48f, 592.99f, 411.68f);
  2541.                      uiWaypointPath = 3;
  2542.                      break;
  2543. +                 case 4:
  2544. +                    combatEntered = true;
  2545. +                    break;
  2546.              }
  2547.  
  2548.              if (uiType <= 3)
  2549.                  Start(false, true);
  2550.          }
  2551.  
  2552. -        void WaypointReached(uint32 waypointId) override
  2553. +        void WaypointReached(uint32 i) override
  2554.          {
  2555. -            switch (waypointId)
  2556. +            if (!instance)
  2557. +                return;
  2558. +
  2559. +            switch(i)
  2560.              {
  2561.                  case 2:
  2562.                      if (uiWaypointPath == 3 || uiWaypointPath == 2)
  2563.                          instance->SetData(DATA_MOVEMENT_DONE, instance->GetData(DATA_MOVEMENT_DONE)+1);
  2564.                      break;
  2565.                  case 3:
  2566. -                    instance->SetData(DATA_MOVEMENT_DONE, instance->GetData(DATA_MOVEMENT_DONE)+1);
  2567. +                        instance->SetData(DATA_MOVEMENT_DONE, instance->GetData(DATA_MOVEMENT_DONE)+1);
  2568.                      break;
  2569.              }
  2570.          }
  2571.  
  2572.          void EnterCombat(Unit* /*who*/) override
  2573.          {
  2574. -            DoCastSpellShield();
  2575. +            hasBeenInCombat = true;
  2576. +            DoCastSpellDefend();
  2577.          }
  2578.  
  2579. -        void DoCastSpellShield()
  2580. +        void DoCastSpellDefend()
  2581.          {
  2582. -            for (uint8 i = 0; i < 3; ++i)
  2583. -                DoCast(me, SPELL_SHIELD, true);
  2584. +            for(uint8 i = 0; i < 3; ++i)
  2585. +                DoCast(me, SPELL_DEFEND, true);
  2586.          }
  2587.  
  2588. -        void UpdateAI(uint32 uiDiff) override
  2589. +        void SpellHit(Unit* source, const SpellInfo* spell) override
  2590.          {
  2591. -            npc_escortAI::UpdateAI(uiDiff);
  2592.  
  2593. -            if (!UpdateVictim())
  2594. -                return;
  2595. +            uint32 defendAuraStackAmount = 0;
  2596. +
  2597. +            if (me->HasAura(SPELL_DEFEND))
  2598. +                if (Aura* defendAura = me->GetAura(SPELL_DEFEND))
  2599. +                    defendAuraStackAmount = defendAura->GetStackAmount();
  2600. +
  2601. +            // Shield-Break by player vehicle
  2602. +            if (spell->Id == 62575)
  2603. +            {
  2604. +                source->DealDamage(me, uint32(2000 * (1 - 0.3f * defendAuraStackAmount)));
  2605. +                source->SendSpellNonMeleeDamageLog(me, 62575, uint32(2000 * (1 - 0.3f * defendAuraStackAmount)), SPELL_SCHOOL_MASK_NORMAL, 0, 0, true, 0, false);
  2606.  
  2607. -            if (uiBuffTimer <= uiDiff)
  2608. +                if (me->HasAura(SPELL_DEFEND))
  2609. +                    me->RemoveAuraFromStack(SPELL_DEFEND);
  2610. +            }
  2611. +    
  2612. +            // Charge by player vehicle
  2613. +            if (spell->Id == 68282)
  2614.              {
  2615. -                if (!me->HasAura(SPELL_SHIELD))
  2616. -                    DoCastSpellShield();
  2617. +                source->DealDamage(me, uint32(20000 * (1 - 0.3f * defendAuraStackAmount)));
  2618. +                source->SendSpellNonMeleeDamageLog(me, 68282, uint32(20000 * (1 - 0.3f * defendAuraStackAmount)), SPELL_SCHOOL_MASK_NORMAL, 0, 0, true, 0, false);
  2619.  
  2620. -                uiBuffTimer = urand(30000, 45000);
  2621. -            }else uiBuffTimer -= uiDiff;
  2622. +                if (source->GetMotionMaster())
  2623. +                    source->GetMotionMaster()->MoveCharge(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ());
  2624.  
  2625. -            if (uiChargeTimer <= uiDiff)
  2626. +                if (me->HasAura(SPELL_DEFEND))
  2627. +                    me->RemoveAuraFromStack(SPELL_DEFEND);
  2628. +            }
  2629. +        }
  2630. +
  2631. +        bool StayInCombatAndCleanup(bool combat, bool cleanup)
  2632. +        {
  2633. +            if (me->GetMap())
  2634.              {
  2635.                  Map::PlayerList const& players = me->GetMap()->GetPlayers();
  2636. +                bool foundtarget = false;
  2637. +
  2638.                  if (me->GetMap()->IsDungeon() && !players.isEmpty())
  2639.                  {
  2640.                      for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
  2641.                      {
  2642.                          Player* player = itr->GetSource();
  2643. -                        if (player && !player->IsGameMaster() && me->IsInRange(player, 8.0f, 25.0f, false))
  2644. +                        if (player && !player->IsGameMaster() && player->IsAlive())
  2645.                          {
  2646. -                            DoResetThreat();
  2647. -                            me->AddThreat(player, 1.0f);
  2648. -                            DoCast(player, SPELL_CHARGE);
  2649. -                            break;
  2650. +                            // Handle combat variable
  2651. +                            if (combat)
  2652. +                            {
  2653. +                                if (combatEntered)
  2654. +                                {
  2655. +                                    me->SetInCombatWith(player);
  2656. +                                    player->SetInCombatWith(me);
  2657. +                                    me->AddThreat(player, 0.0f);
  2658. +
  2659. +                                    foundtarget = true;
  2660. +
  2661. +                                    if (Vehicle* pVehicle = player->GetVehicle()) // If no mounted player is found, first encounter bugs. This might cause it, needs further tests
  2662. +                                    {
  2663. +                                        if (Unit* vehicleCreature = pVehicle->GetBase())
  2664. +                                        {
  2665. +                                            me->SetInCombatWith(vehicleCreature);
  2666. +                                            vehicleCreature->SetInCombatWith(me);
  2667. +                                            me->AddThreat(vehicleCreature, 0.0f);
  2668. +                                        }
  2669. +                                    }
  2670. +                                }
  2671. +                            }
  2672. +
  2673. +                            // Handle cleanup variable
  2674. +                            if (cleanup)
  2675. +                                if (player->HasAura(SPELL_DEFEND))
  2676. +                                    player->RemoveAurasDueToSpell(SPELL_DEFEND);
  2677.                          }
  2678.                      }
  2679.                  }
  2680. -                uiChargeTimer = 5000;
  2681. -            }else uiChargeTimer -= uiDiff;
  2682.  
  2683. -            //dosen't work at all
  2684. +                if (combatEntered && combat && !foundtarget)
  2685. +                {
  2686. +                    me->SetFullHealth();
  2687. +                    return false;
  2688. +                }
  2689. +            }
  2690. +
  2691. +            return true;
  2692. +        }
  2693. +
  2694. +        void EnterEvadeMode() override
  2695. +        {
  2696. +            // Try to stay in combat, otherwise reset
  2697. +            if (!StayInCombatAndCleanup(true, false))
  2698. +                ScriptedAI::EnterEvadeMode();
  2699. +        }
  2700. +
  2701. +        bool CheckPlayersAlive()
  2702. +        {
  2703. +            Map* pMap = me->GetMap();
  2704. +            if (pMap && pMap->IsDungeon())
  2705. +            {
  2706. +                Map::PlayerList const &players = pMap->GetPlayers();
  2707. +                for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
  2708. +                {
  2709. +                    if (itr->GetSource() && itr->GetSource()->IsAlive() && !itr->GetSource()->IsGameMaster())
  2710. +                        return true;
  2711. +                }
  2712. +            }
  2713. +            return false;
  2714. +        }
  2715. +
  2716. +        void DoCastSpellShield()
  2717. +        {
  2718. +            for(uint8 i = 0; i < 3; ++i)
  2719. +                DoCast(me,SPELL_SHIELD,true);
  2720. +        }
  2721. +
  2722. +        void UpdateAI(uint32 uiDiff) override
  2723. +        {
  2724. +            // Try to keep players clean of defend aura
  2725. +            if (combatEntered)
  2726. +            {
  2727. +                if (combatCheckTimer <= uiDiff)
  2728. +                {
  2729. +                    StayInCombatAndCleanup(false, true);
  2730. +                    combatCheckTimer = 1000;
  2731. +                } else combatCheckTimer -= uiDiff;
  2732. +            }
  2733. +
  2734. +            npc_escortAI::UpdateAI(uiDiff);
  2735. +
  2736. +            if (!UpdateVictim())
  2737. +                return;
  2738. +
  2739. +            if (uiDefendTimer <= uiDiff)
  2740. +            {
  2741. +                DoCastSpellDefend();
  2742. +                uiDefendTimer = urand(30000, 45000);
  2743. +            } else uiDefendTimer -= uiDiff;
  2744. +
  2745.              if (uiShieldBreakerTimer <= uiDiff)
  2746.              {
  2747. -                Vehicle* pVehicle = me->GetVehicleKit();
  2748. -                if (!pVehicle)
  2749. -                    return;
  2750. +                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
  2751. +                {
  2752. +                    if (target->GetTypeId() == TYPEID_PLAYER && me->GetDistance(target) > 10.0f && me->GetDistance(target) < 30.0f)
  2753. +                    {
  2754. +                        if (target->GetVehicle())
  2755. +                        {
  2756. +                            if (Unit* vehTarget = target->GetVehicle()->GetBase())
  2757. +                            {
  2758. +                                DoCast(vehTarget, SPELL_SHIELD_BREAKER);
  2759. +                                vehTarget->RemoveAuraFromStack(SPELL_DEFEND);
  2760. +                            }
  2761. +                        }
  2762. +                    }
  2763. +                    else if (target->GetTypeId() == TYPEID_UNIT && me->GetDistance(target) > 8.0f && me->GetDistance(target) < 25.0f)
  2764. +                    {
  2765. +                        DoCast(target, SPELL_SHIELD_BREAKER);
  2766. +                        target->RemoveAuraFromStack(SPELL_DEFEND);
  2767. +                    }
  2768. +                }
  2769. +
  2770. +                uiShieldBreakerTimer = urand(15000, 20000);
  2771. +            } else uiShieldBreakerTimer -= uiDiff;
  2772.  
  2773. -                if (Unit* pPassenger = pVehicle->GetPassenger(SEAT_ID_0))
  2774. +            if (uiChargeTimer <= uiDiff)
  2775. +            {
  2776. +                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
  2777.                  {
  2778. -                    Map::PlayerList const& players = me->GetMap()->GetPlayers();
  2779. -                    if (me->GetMap()->IsDungeon() && !players.isEmpty())
  2780. +                    if (target->GetTypeId() == TYPEID_PLAYER && me->GetDistance(target) > 8.0f && me->GetDistance(target) < 25.0f)
  2781.                      {
  2782. -                        for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
  2783. +                        if (target->GetVehicle())
  2784.                          {
  2785. -                            Player* player = itr->GetSource();
  2786. -                            if (player && !player->IsGameMaster() && me->IsInRange(player, 10.0f, 30.0f, false))
  2787. +                            if (Unit* vehTarget = target->GetVehicle()->GetBase())
  2788.                              {
  2789. -                                pPassenger->CastSpell(player, SPELL_SHIELD_BREAKER, true);
  2790. -                                break;
  2791. +                                DoCast(vehTarget, SPELL_CHARGE);
  2792. +
  2793. +                                if (vehTarget->HasAura(SPELL_DEFEND))
  2794. +                                    vehTarget->RemoveAuraFromStack(SPELL_DEFEND);
  2795.                              }
  2796.                          }
  2797.                      }
  2798. +                    else if (target->GetTypeId() == TYPEID_UNIT && me->GetDistance(target) > 8.0f && me->GetDistance(target) < 25.0f)
  2799. +                    {
  2800. +                        DoCast(target, SPELL_CHARGE);
  2801. +
  2802. +                        if (target->HasAura(SPELL_DEFEND))
  2803. +                            target->RemoveAuraFromStack(SPELL_DEFEND);
  2804. +                    }
  2805.                  }
  2806. -                uiShieldBreakerTimer = 7000;
  2807. -            }else uiShieldBreakerTimer -= uiDiff;
  2808. +
  2809. +                uiChargeTimer = urand(10000, 30000);
  2810. +            } else uiChargeTimer -= uiDiff;
  2811. +
  2812. +            if (uiThrustTimer <= uiDiff)
  2813. +            {
  2814. +                if (me->GetVictim() && me->GetDistance(me->GetVictim()) < 5.0f)
  2815. +                    DoCast(me->GetVictim(), SPELL_THRUST);
  2816. +
  2817. +                uiThrustTimer = urand(8000, 14000);
  2818. +            } else uiThrustTimer -= uiDiff;
  2819.  
  2820.              DoMeleeAttackIfReady();
  2821.          }
  2822.      };
  2823.  
  2824. -    CreatureAI* GetAI(Creature* creature) const override
  2825. +    CreatureAI* GetAI(Creature* creature) const
  2826.      {
  2827. -        return GetInstanceAI<generic_vehicleAI_toc5AI>(creature);
  2828. +        return new generic_vehicleAI_toc5AI(creature);
  2829.      }
  2830.  };
  2831.  
  2832. +// Marshal Jacob Alerius && Mokra the Skullcrusher || Warrior
  2833.  class boss_warrior_toc5 : public CreatureScript
  2834.  {
  2835. -public:
  2836. -    boss_warrior_toc5() : CreatureScript("boss_warrior_toc5") { }
  2837. +    public:
  2838. +        boss_warrior_toc5(): CreatureScript("boss_warrior_toc5") {}
  2839.  
  2840. -    // Marshal Jacob Alerius && Mokra the Skullcrusher || Warrior
  2841. -    struct boss_warrior_toc5AI : public ScriptedAI
  2842. +    struct boss_warrior_toc5AI : public BossAI
  2843.      {
  2844. -        boss_warrior_toc5AI(Creature* creature) : ScriptedAI(creature)
  2845. +        boss_warrior_toc5AI(Creature* creature) : BossAI(creature, BOSS_GRAND_CHAMPIONS)
  2846.          {
  2847. -            Initialize();
  2848.              instance = creature->GetInstanceScript();
  2849.  
  2850.              bDone = false;
  2851.              bHome = false;
  2852. -
  2853. -            uiPhase = 0;
  2854. -            uiPhaseTimer = 0;
  2855. -
  2856. -            me->SetReactState(REACT_PASSIVE);
  2857. -            // THIS IS A HACK, SHOULD BE REMOVED WHEN THE EVENT IS FULL SCRIPTED
  2858. -            me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC);
  2859. -        }
  2860. -
  2861. -        void Initialize()
  2862. -        {
  2863. -            uiBladeStormTimer = urand(15000, 20000);
  2864. -            uiInterceptTimer = 7000;
  2865. -            uiMortalStrikeTimer = urand(8000, 12000);
  2866. +            bCredit = false;
  2867. +            hasBeenInCombat = false;
  2868.          }
  2869.  
  2870.          InstanceScript* instance;
  2871.  
  2872. -        uint8 uiPhase;
  2873. -        uint32 uiPhaseTimer;
  2874. -
  2875. -        uint32 uiBladeStormTimer;
  2876.          uint32 uiInterceptTimer;
  2877. -        uint32 uiMortalStrikeTimer;
  2878.  
  2879.          bool bDone;
  2880.          bool bHome;
  2881. +        bool bCredit;
  2882. +        bool hasBeenInCombat;
  2883.  
  2884.          void Reset() override
  2885.          {
  2886. -            Initialize();
  2887. +            uiInterceptTimer  = 7000;     
  2888. +            me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  2889. +            events.SetPhase(PHASE_IDLE);
  2890.          }
  2891.  
  2892.          void JustReachedHome() override
  2893. @@ -362,47 +568,54 @@ public:
  2894.              if (!bHome)
  2895.                  return;
  2896.  
  2897. -            uiPhaseTimer = 15000;
  2898. -            uiPhase = 1;
  2899. +            events.ScheduleEvent(EVENT_PHASE_SWITCH, 15000, 0, PHASE_IDLE);
  2900.  
  2901.              bHome = false;
  2902.          }
  2903.  
  2904. +        void EnterCombat(Unit* /*who*/) override
  2905. +        {
  2906. +            _EnterCombat();
  2907. +            hasBeenInCombat = true;
  2908. +            events.ScheduleEvent(EVENT_BLADESTORM, urand(15000, 25000), 0, PHASE_COMBAT);
  2909. +            events.ScheduleEvent(EVENT_MORTAL_STRIKE, urand(8000,12000), 0, PHASE_COMBAT);
  2910. +            events.SetPhase(PHASE_COMBAT);
  2911. +        }
  2912. +
  2913.          void UpdateAI(uint32 uiDiff) override
  2914.          {
  2915. +            if (!me->GetVehicle())
  2916. +                me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  2917. +            
  2918. +            if (!UpdateVictim())
  2919. +                return;
  2920. +
  2921. +            events.Update(uiDiff);
  2922. +
  2923.              if (!bDone && GrandChampionsOutVehicle(me))
  2924.              {
  2925.                  bDone = true;
  2926. +                Talk(WARNING_WEAPONS);
  2927. +                me->RemoveAura(64723); // [DND] ReadyJoust Pose Effect
  2928.  
  2929. -                if (me->GetGUID() == instance->GetGuidData(DATA_GRAND_CHAMPION_1))
  2930. -                    me->SetHomePosition(739.678f, 662.541f, 412.393f, 4.49f);
  2931. -                else if (me->GetGUID() == instance->GetGuidData(DATA_GRAND_CHAMPION_2))
  2932. -                    me->SetHomePosition(746.71f, 661.02f, 411.69f, 4.6f);
  2933. -                else if (me->GetGUID() == instance->GetGuidData(DATA_GRAND_CHAMPION_3))
  2934. -                    me->SetHomePosition(754.34f, 660.70f, 412.39f, 4.79f);
  2935. +                if (instance && me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_1))
  2936. +                    me->SetHomePosition(739.678f, 662.541f, 413.395f, 4.49f);
  2937. +                else if (instance && me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_2))
  2938. +                         me->SetHomePosition(746.71f, 661.02f, 412.695f, 4.6f);
  2939. +                else if (instance && me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_3))
  2940. +                         me->SetHomePosition(754.34f, 660.70f, 413.395f, 4.79f);
  2941.  
  2942. +                me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  2943.                  EnterEvadeMode();
  2944.                  bHome = true;
  2945.              }
  2946.  
  2947. -            if (uiPhaseTimer <= uiDiff)
  2948. -            {
  2949. -                if (uiPhase == 1)
  2950. -                {
  2951. -                    AggroAllPlayers(me);
  2952. -                    uiPhase = 0;
  2953. -                }
  2954. -            }else uiPhaseTimer -= uiDiff;
  2955. -
  2956. -            if (!UpdateVictim() || me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT))
  2957. -                return;
  2958. -
  2959. -            if (uiInterceptTimer <= uiDiff)
  2960. +            if (uiInterceptTimer <= uiDiff && events.GetPhaseMask() == PHASE_COMBAT)
  2961.              {
  2962.                  Map::PlayerList const& players = me->GetMap()->GetPlayers();
  2963.                  if (me->GetMap()->IsDungeon() && !players.isEmpty())
  2964.                  {
  2965. -                    for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
  2966. +                    for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
  2967.                      {
  2968.                          Player* player = itr->GetSource();
  2969.                          if (player && !player->IsGameMaster() && me->IsInRange(player, 8.0f, 25.0f, false))
  2970. @@ -417,81 +630,102 @@ public:
  2971.                  uiInterceptTimer = 7000;
  2972.              } else uiInterceptTimer -= uiDiff;
  2973.  
  2974. -            if (uiBladeStormTimer <= uiDiff)
  2975. +            while (uint32 eventID = events.ExecuteEvent())
  2976.              {
  2977. -                DoCastVictim(SPELL_BLADESTORM);
  2978. -                uiBladeStormTimer = urand(15000, 20000);
  2979. -            } else uiBladeStormTimer -= uiDiff;
  2980. +                switch (eventID)
  2981. +                {
  2982. +                    case EVENT_BLADESTORM:
  2983. +                        DoCastVictim(SPELL_BLADESTORM);
  2984. +                        events.ScheduleEvent(EVENT_BLADESTORM, urand(15000, 25000), 0, PHASE_COMBAT);
  2985. +                        break;
  2986. +                    case EVENT_MORTAL_STRIKE:
  2987. +                        DoCastVictim(SPELL_MORTAL_STRIKE);
  2988. +                        events.ScheduleEvent(EVENT_MORTAL_STRIKE, urand(8000,12000), 0, PHASE_COMBAT);
  2989. +                        break;
  2990. +                    case EVENT_PHASE_SWITCH:
  2991. +                        if (events.GetPhaseMask() == PHASE_IDLE)
  2992. +                        {
  2993. +                            AggroAllPlayers(me);
  2994. +                            events.SetPhase(PHASE_COMBAT);
  2995. +                        }
  2996. +                        break;
  2997. +                }
  2998. +            }
  2999. +            
  3000. +            if (events.GetPhaseMask() == PHASE_COMBAT)
  3001. +                DoMeleeAttackIfReady();
  3002. +        }
  3003.  
  3004. -            if (uiMortalStrikeTimer <= uiDiff)
  3005. +        void DamageTaken(Unit* /*who*/, uint32& damage) override
  3006. +        {
  3007. +            if (damage >= me->GetHealth())
  3008.              {
  3009. -                DoCastVictim(SPELL_MORTAL_STRIKE);
  3010. -                uiMortalStrikeTimer = urand(8000, 12000);
  3011. -            } else uiMortalStrikeTimer -= uiDiff;
  3012. +                damage = 0;
  3013. +                hasBeenInCombat = false;
  3014. +                Talk(SAY_CHAMPION_DEFEAT);
  3015.  
  3016. -            DoMeleeAttackIfReady();
  3017. +                if (instance)
  3018. +                    instance->SetData(BOSS_GRAND_CHAMPIONS, DONE);
  3019. +
  3020. +                // Instance encounter counting mechanics
  3021. +                if (!bCredit)
  3022. +                {
  3023. +                    bCredit = true;
  3024. +                    HandleSpellOnPlayersInInstanceToC5(me, SPELL_GRAND_CHAMPIONS_CREDIT);
  3025. +                }
  3026. +
  3027. +                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  3028. +                me->setFaction(35);
  3029. +                me->GetMotionMaster()->MovePoint(0,746.843f, 695.68f, 412.339f);
  3030. +                HandleKillCreditForAllPlayers(me);
  3031. +                HandleInstanceBind(me);
  3032. +            }
  3033.          }
  3034.  
  3035. -        void JustDied(Unit* /*killer*/) override
  3036. +        void JustDied(Unit* /*killer*/)
  3037.          {
  3038. -            instance->SetData(BOSS_GRAND_CHAMPIONS, DONE);
  3039. +           if (instance)
  3040. +                instance->SetData(BOSS_GRAND_CHAMPIONS, DONE);
  3041.          }
  3042.      };
  3043.  
  3044. -    CreatureAI* GetAI(Creature* creature) const override
  3045. +    CreatureAI* GetAI(Creature* creature) const
  3046.      {
  3047. -        return GetInstanceAI<boss_warrior_toc5AI>(creature);
  3048. +        return new boss_warrior_toc5AI(creature);
  3049.      }
  3050.  };
  3051.  
  3052. +// Ambrose Boltspark && Eressea Dawnsinger || Mage
  3053.  class boss_mage_toc5 : public CreatureScript
  3054.  {
  3055. -public:
  3056. -    boss_mage_toc5() : CreatureScript("boss_mage_toc5") { }
  3057. +    public:
  3058. +        boss_mage_toc5(): CreatureScript("boss_mage_toc5") {}
  3059.  
  3060. -    // Ambrose Boltspark && Eressea Dawnsinger || Mage
  3061. -    struct boss_mage_toc5AI : public ScriptedAI
  3062. +    struct boss_mage_toc5AI : public BossAI
  3063.      {
  3064. -        boss_mage_toc5AI(Creature* creature) : ScriptedAI(creature)
  3065. +        boss_mage_toc5AI(Creature* creature) : BossAI(creature, BOSS_GRAND_CHAMPIONS)
  3066.          {
  3067. -            Initialize();
  3068.              instance = creature->GetInstanceScript();
  3069.  
  3070.              bDone = false;
  3071.              bHome = false;
  3072. +            bCredit = false;
  3073.  
  3074. -            uiPhase = 0;
  3075. -            uiPhaseTimer = 0;
  3076. +            hasBeenInCombat = false;
  3077.  
  3078. -            me->SetReactState(REACT_PASSIVE);
  3079. -            // THIS IS A HACK, SHOULD BE REMOVED WHEN THE EVENT IS FULL SCRIPTED
  3080. -            me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC);
  3081. -        }
  3082. -
  3083. -        void Initialize()
  3084. -        {
  3085. -            uiFireBallTimer = 5000;
  3086. -            uiPolymorphTimer = 8000;
  3087. -            uiBlastWaveTimer = 12000;
  3088. -            uiHasteTimer = 22000;
  3089. +            me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  3090.          }
  3091.  
  3092.          InstanceScript* instance;
  3093.  
  3094. -        uint8 uiPhase;
  3095. -        uint32 uiPhaseTimer;
  3096. -
  3097. -        uint32 uiFireBallTimer;
  3098. -        uint32 uiBlastWaveTimer;
  3099. -        uint32 uiHasteTimer;
  3100. -        uint32 uiPolymorphTimer;
  3101. -
  3102.          bool bDone;
  3103.          bool bHome;
  3104. +        bool hasBeenInCombat;
  3105. +        bool bCredit;
  3106.  
  3107.          void Reset() override
  3108.          {
  3109. -            Initialize();
  3110. +            events.SetPhase(PHASE_IDLE);
  3111.          }
  3112.  
  3113.          void JustReachedHome() override
  3114. @@ -501,146 +735,167 @@ public:
  3115.              if (!bHome)
  3116.                  return;
  3117.  
  3118. -            uiPhaseTimer = 15000;
  3119. -            uiPhase = 1;
  3120. +            events.ScheduleEvent(EVENT_PHASE_SWITCH, 15000, 0, PHASE_IDLE);
  3121.  
  3122.              bHome = false;
  3123.          }
  3124.  
  3125. +        void EnterCombat(Unit* /*who*/) override
  3126. +        {
  3127. +            _EnterCombat();
  3128. +            hasBeenInCombat = true;
  3129. +            events.ScheduleEvent(EVENT_FIREBALL, 5000, 0, PHASE_COMBAT);
  3130. +            events.ScheduleEvent(EVENT_POLYMORPH, 8000, 0, PHASE_COMBAT);
  3131. +            events.ScheduleEvent(EVENT_BLASTWAVE, 12000, 0, PHASE_COMBAT);
  3132. +            events.ScheduleEvent(EVENT_HASTE, 22000, 0, PHASE_COMBAT);
  3133. +            events.SetPhase(PHASE_COMBAT);
  3134. +        }
  3135. +
  3136.          void UpdateAI(uint32 uiDiff) override
  3137.          {
  3138. +            if (!me->GetVehicle())
  3139. +                me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  3140. +
  3141.              if (!bDone && GrandChampionsOutVehicle(me))
  3142.              {
  3143.                  bDone = true;
  3144. +                me->RemoveAura(64723); // [DND] ReadyJoust Pose Effect
  3145.  
  3146. -                if (me->GetGUID() == instance->GetGuidData(DATA_GRAND_CHAMPION_1))
  3147. -                    me->SetHomePosition(739.678f, 662.541f, 412.393f, 4.49f);
  3148. -                else if (me->GetGUID() == instance->GetGuidData(DATA_GRAND_CHAMPION_2))
  3149. -                    me->SetHomePosition(746.71f, 661.02f, 411.69f, 4.6f);
  3150. -                else if (me->GetGUID() == instance->GetGuidData(DATA_GRAND_CHAMPION_3))
  3151. -                    me->SetHomePosition(754.34f, 660.70f, 412.39f, 4.79f);
  3152. +                if (instance && me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_1))
  3153. +                    me->SetHomePosition(739.678f, 662.541f, 413.395f, 4.49f);
  3154. +                else if (instance && me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_2))
  3155. +                         me->SetHomePosition(746.71f, 661.02f, 412.695f, 4.6f);
  3156. +                else if (instance && me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_3))
  3157. +                         me->SetHomePosition(754.34f, 660.70f, 413.395f, 4.79f);
  3158.  
  3159. -                instance->SetData(BOSS_GRAND_CHAMPIONS, IN_PROGRESS);
  3160. +                if (instance)
  3161. +                    instance->SetData(BOSS_GRAND_CHAMPIONS, IN_PROGRESS);
  3162. +
  3163. +                me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  3164.  
  3165.                  EnterEvadeMode();
  3166.                  bHome = true;
  3167.              }
  3168.  
  3169. -            if (uiPhaseTimer <= uiDiff)
  3170. -            {
  3171. -                if (uiPhase == 1)
  3172. -                {
  3173. -                    AggroAllPlayers(me);
  3174. -                    uiPhase = 0;
  3175. -                }
  3176. -            }else uiPhaseTimer -= uiDiff;
  3177. -
  3178. -            if (uiFireBallTimer <= uiDiff)
  3179. -            {
  3180. -                if (me->GetVictim())
  3181. -                    DoCastVictim(SPELL_FIREBALL);
  3182. -                uiFireBallTimer = 5000;
  3183. -            } else uiFireBallTimer -= uiDiff;
  3184. -
  3185. -            if (!UpdateVictim() || me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT))
  3186. +            if (!UpdateVictim() || me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT) || me->GetVehicle())
  3187.                  return;
  3188.  
  3189. -            if (uiFireBallTimer <= uiDiff)
  3190. -            {
  3191. -                DoCastVictim(SPELL_FIREBALL);
  3192. -                uiFireBallTimer = 5000;
  3193. -            } else uiFireBallTimer -= uiDiff;
  3194. -
  3195. -            if (uiPolymorphTimer <= uiDiff)
  3196. -            {
  3197. -                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
  3198. -                    DoCast(target, SPELL_POLYMORPH);
  3199. -                uiPolymorphTimer = 8000;
  3200. -            } else uiPolymorphTimer -= uiDiff;
  3201. +            events.Update(uiDiff);
  3202.  
  3203. -            if (uiBlastWaveTimer <= uiDiff)
  3204. +            while (uint32 eventID = events.ExecuteEvent())
  3205.              {
  3206. -                DoCastAOE(SPELL_BLAST_WAVE, false);
  3207. -                uiBlastWaveTimer = 13000;
  3208. -            } else uiBlastWaveTimer -= uiDiff;
  3209. +                switch (eventID)
  3210. +                {
  3211. +                    case EVENT_FIREBALL:
  3212. +                        DoCastVictim(DUNGEON_MODE(SPELL_FIREBALL,SPELL_FIREBALL_H));
  3213. +                        events.ScheduleEvent(EVENT_FIREBALL, 17000, 0, PHASE_COMBAT);
  3214. +                        break;
  3215. +                    case EVENT_POLYMORPH:
  3216. +                        if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM,0))
  3217. +                            DoCast(target, DUNGEON_MODE(SPELL_POLYMORPH,SPELL_POLYMORPH_H));
  3218. +                        events.ScheduleEvent(EVENT_POLYMORPH, 22000, 0, PHASE_COMBAT);
  3219. +                        break;
  3220. +                    case EVENT_BLASTWAVE:
  3221. +                        DoCastAOE(DUNGEON_MODE(SPELL_BLAST_WAVE,SPELL_BLAST_WAVE_H),false);
  3222. +                        events.ScheduleEvent(EVENT_BLADESTORM, 30000, 0, PHASE_COMBAT);
  3223. +                        break;
  3224. +                    case EVENT_HASTE:
  3225. +                        me->InterruptNonMeleeSpells(true);
  3226. +                        DoCast(me,SPELL_HASTE);
  3227. +                        events.ScheduleEvent(EVENT_HASTE, 40000, 0, PHASE_COMBAT);
  3228. +                        break;
  3229. +                    case EVENT_PHASE_SWITCH:
  3230. +                        if (events.GetPhaseMask() == PHASE_IDLE)
  3231. +                        {
  3232. +                            AggroAllPlayers(me);
  3233. +                            events.SetPhase(PHASE_COMBAT);
  3234. +                        }
  3235. +                        break;
  3236. +                }
  3237. +            }
  3238. +            if (events.GetPhaseMask() == PHASE_COMBAT)
  3239. +                DoMeleeAttackIfReady();
  3240. +        }
  3241.  
  3242. -            if (uiHasteTimer <= uiDiff)
  3243. +        void DamageTaken(Unit* /*who*/, uint32& damage) override
  3244. +        {
  3245. +            if (damage >= me->GetHealth())
  3246.              {
  3247. -                me->InterruptNonMeleeSpells(true);
  3248. +                damage = 0;
  3249. +                hasBeenInCombat = false;
  3250. +                Talk(SAY_CHAMPION_DEFEAT);
  3251.  
  3252. -                DoCast(me, SPELL_HASTE);
  3253. -                uiHasteTimer = 22000;
  3254. -            } else uiHasteTimer -= uiDiff;
  3255. +                if (instance)
  3256. +                    instance->SetData(BOSS_GRAND_CHAMPIONS, DONE);
  3257.  
  3258. -            DoMeleeAttackIfReady();
  3259. -        }
  3260. -
  3261. -        void JustDied(Unit* /*killer*/) override
  3262. -        {
  3263. -            instance->SetData(BOSS_GRAND_CHAMPIONS, DONE);
  3264. +                // Instance encounter counting mechanics
  3265. +                if (!bCredit)
  3266. +                {
  3267. +                    bCredit = true;
  3268. +                    HandleSpellOnPlayersInInstanceToC5(me, SPELL_GRAND_CHAMPIONS_CREDIT);
  3269. +                }
  3270. +                me->SetFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_NON_ATTACKABLE);
  3271. +                me->setFaction(35);
  3272. +                me->GetMotionMaster()->MovePoint(0,746.843f, 695.68f, 412.339f);
  3273. +                HandleKillCreditForAllPlayers(me);
  3274. +                HandleInstanceBind(me);
  3275. +            }
  3276.          }
  3277.      };
  3278.  
  3279. -    CreatureAI* GetAI(Creature* creature) const override
  3280. +    CreatureAI* GetAI(Creature* creature) const
  3281.      {
  3282. -        return GetInstanceAI<boss_mage_toc5AI>(creature);
  3283. -    }
  3284. +        return new boss_mage_toc5AI(creature);
  3285. +    };
  3286.  };
  3287.  
  3288. +// Colosos && Runok Wildmane || Shaman
  3289.  class boss_shaman_toc5 : public CreatureScript
  3290.  {
  3291. -public:
  3292. -    boss_shaman_toc5() : CreatureScript("boss_shaman_toc5") { }
  3293. +    public:
  3294. +        boss_shaman_toc5(): CreatureScript("boss_shaman_toc5") {}
  3295.  
  3296. -    // Colosos && Runok Wildmane || Shaman
  3297. -    struct boss_shaman_toc5AI : public ScriptedAI
  3298. +    struct boss_shaman_toc5AI : public BossAI
  3299.      {
  3300. -        boss_shaman_toc5AI(Creature* creature) : ScriptedAI(creature)
  3301. +        boss_shaman_toc5AI(Creature* creature) : BossAI(creature, BOSS_GRAND_CHAMPIONS)
  3302.          {
  3303. -            Initialize();
  3304.              instance = creature->GetInstanceScript();
  3305.  
  3306.              bDone = false;
  3307.              bHome = false;
  3308. +            bCredit = false;
  3309. +            hasBeenInCombat = false;
  3310.  
  3311. -            uiPhase = 0;
  3312. -            uiPhaseTimer = 0;
  3313. -
  3314. -            me->SetReactState(REACT_PASSIVE);
  3315. -            // THIS IS A HACK, SHOULD BE REMOVED WHEN THE EVENT IS FULL SCRIPTED
  3316. -            me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC);
  3317. -        }
  3318. -
  3319. -        void Initialize()
  3320. -        {
  3321. -            uiChainLightningTimer = 16000;
  3322. -            uiHealingWaveTimer = 12000;
  3323. -            uiEartShieldTimer = urand(30000, 35000);
  3324. -            uiHexMendingTimer = urand(20000, 25000);
  3325. +            me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);        
  3326.          }
  3327.  
  3328.          InstanceScript* instance;
  3329.  
  3330. -        uint8 uiPhase;
  3331. -        uint32 uiPhaseTimer;
  3332. -
  3333. -        uint32 uiChainLightningTimer;
  3334. -        uint32 uiEartShieldTimer;
  3335. -        uint32 uiHealingWaveTimer;
  3336. -        uint32 uiHexMendingTimer;
  3337. -
  3338.          bool bDone;
  3339.          bool bHome;
  3340. +        bool hasBeenInCombat;
  3341. +        bool bCredit;
  3342. +        bool bChance;
  3343.  
  3344.          void Reset() override
  3345.          {
  3346. -            Initialize();
  3347. +            events.SetPhase(PHASE_IDLE);
  3348.          }
  3349.  
  3350.          void EnterCombat(Unit* who) override
  3351.          {
  3352. -            DoCast(me, SPELL_EARTH_SHIELD);
  3353. -            DoCast(who, SPELL_HEX_OF_MENDING);
  3354. +            _EnterCombat();
  3355. +            hasBeenInCombat = true;
  3356. +            if (!me->GetVehicle())
  3357. +            {
  3358. +                DoCast(me, SPELL_EARTH_SHIELD);
  3359. +                DoCast(who, SPELL_HEX_OF_MENDING);
  3360. +            }
  3361. +            events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 16000, 0, PHASE_COMBAT);
  3362. +            events.ScheduleEvent(EVENT_HEALING_WAVE, 12000, 0, PHASE_COMBAT);
  3363. +            events.ScheduleEvent(EVENT_EARTH_SHIELD, urand(30000, 35000), 0, PHASE_COMBAT);
  3364. +            events.ScheduleEvent(EVENT_HEX, urand(20000, 25000), 0, PHASE_COMBAT);
  3365. +            events.SetPhase(PHASE_COMBAT);
  3366.          };
  3367.  
  3368.          void JustReachedHome() override
  3369. @@ -650,147 +905,174 @@ public:
  3370.              if (!bHome)
  3371.                  return;
  3372.  
  3373. -            uiPhaseTimer = 15000;
  3374. -            uiPhase = 1;
  3375. +            events.ScheduleEvent(EVENT_PHASE_SWITCH, 15000, 0, PHASE_IDLE);
  3376.  
  3377.              bHome = false;
  3378.          }
  3379.  
  3380.          void UpdateAI(uint32 uiDiff) override
  3381.          {
  3382. +            if (!me->GetVehicle())
  3383. +                me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  3384. +
  3385.              if (!bDone && GrandChampionsOutVehicle(me))
  3386.              {
  3387.                  bDone = true;
  3388.  
  3389. -                if (me->GetGUID() == instance->GetGuidData(DATA_GRAND_CHAMPION_1))
  3390. -                    me->SetHomePosition(739.678f, 662.541f, 412.393f, 4.49f);
  3391. -                else if (me->GetGUID() == instance->GetGuidData(DATA_GRAND_CHAMPION_2))
  3392. -                    me->SetHomePosition(746.71f, 661.02f, 411.69f, 4.6f);
  3393. -                else if (me->GetGUID() == instance->GetGuidData(DATA_GRAND_CHAMPION_3))
  3394. -                    me->SetHomePosition(754.34f, 660.70f, 412.39f, 4.79f);
  3395. +                me->RemoveAura(64723); // [DND] ReadyJoust Pose Effect
  3396.  
  3397. -                instance->SetData(BOSS_GRAND_CHAMPIONS, IN_PROGRESS);
  3398. +                if (instance && me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_1))
  3399. +                    me->SetHomePosition(739.678f,662.541f,413.395f,4.49f);
  3400. +                else if (instance && me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_2))
  3401. +                        me->SetHomePosition(746.71f,661.02f,412.695f,4.6f);
  3402. +                else if (instance && me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_3))
  3403. +                        me->SetHomePosition(754.34f,660.70f,413.395f,4.79f);
  3404. +
  3405. +                if (instance)
  3406. +                    instance->SetData(BOSS_GRAND_CHAMPIONS, IN_PROGRESS);
  3407.  
  3408.                  EnterEvadeMode();
  3409.                  bHome = true;
  3410.              }
  3411.  
  3412. -            if (uiPhaseTimer <= uiDiff)
  3413. -            {
  3414. -                if (uiPhase == 1)
  3415. -                {
  3416. -                    AggroAllPlayers(me);
  3417. -                    uiPhase = 0;
  3418. -                }
  3419. -            }else uiPhaseTimer -= uiDiff;
  3420. -
  3421. -            if (!UpdateVictim() || me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT))
  3422. +            if (!UpdateVictim() || me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT) || me->GetVehicle())
  3423.                  return;
  3424.  
  3425. -            if (uiChainLightningTimer <= uiDiff)
  3426. -            {
  3427. -                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
  3428. -                    DoCast(target, SPELL_CHAIN_LIGHTNING);
  3429. -
  3430. -                uiChainLightningTimer = 16000;
  3431. -            } else uiChainLightningTimer -= uiDiff;
  3432. +            events.Update(uiDiff);
  3433.  
  3434. -            if (uiHealingWaveTimer <= uiDiff)
  3435. +            while (uint32 eventId = events.ExecuteEvent())
  3436.              {
  3437. -                bool bChance = roll_chance_i(50);
  3438. -
  3439. -                if (!bChance)
  3440. +                switch (eventId)
  3441.                  {
  3442. -                    if (Unit* pFriend = DoSelectLowestHpFriendly(40))
  3443. -                        DoCast(pFriend, SPELL_HEALING_WAVE);
  3444. -                } else
  3445. -                    DoCast(me, SPELL_HEALING_WAVE);
  3446. -
  3447. -                uiHealingWaveTimer = 12000;
  3448. -            } else uiHealingWaveTimer -= uiDiff;
  3449. -
  3450. -            if (uiEartShieldTimer <= uiDiff)
  3451. -            {
  3452. -                DoCast(me, SPELL_EARTH_SHIELD);
  3453. -
  3454. -                uiEartShieldTimer = urand(30000, 35000);
  3455. -            } else uiEartShieldTimer -= uiDiff;
  3456. +                    case EVENT_EARTH_SHIELD:
  3457. +                        DoCast(me, SPELL_EARTH_SHIELD);
  3458. +                        events.ScheduleEvent(EVENT_EARTH_SHIELD, urand(40000,45000), 0, PHASE_COMBAT);
  3459. +                        break;
  3460. +                    case EVENT_CHAIN_LIGHTNING:
  3461. +                        if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM,0))
  3462. +                            DoCast(target, DUNGEON_MODE(SPELL_CHAIN_LIGHTNING,SPELL_CHAIN_LIGHTNING_H));
  3463. +                        events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 23000, 0, PHASE_COMBAT);
  3464. +                        break;
  3465. +                    case EVENT_HEALING_WAVE:
  3466. +                        bChance = urand(0,1);
  3467. +                        if (!bChance)
  3468. +                        {
  3469. +                            if (Unit* pFriend = DoSelectLowestHpFriendly(40))
  3470. +                                DoCast(pFriend, DUNGEON_MODE(SPELL_HEALING_WAVE, SPELL_HEALING_WAVE_H));
  3471. +                        } else
  3472. +                            DoCast(me, DUNGEON_MODE(SPELL_HEALING_WAVE, SPELL_HEALING_WAVE_H));
  3473. +                        events.ScheduleEvent(EVENT_HEALING_WAVE, 19000, 0, PHASE_COMBAT);
  3474. +                        break;
  3475. +                    case EVENT_HEX:
  3476. +                        DoCastVictim(SPELL_HEX_OF_MENDING, true);
  3477. +                        events.ScheduleEvent(EVENT_HEX, urand(30000,35000), 0, PHASE_COMBAT);
  3478. +                        break;
  3479. +                    case EVENT_PHASE_SWITCH:
  3480. +                        if (events.GetPhaseMask() == PHASE_IDLE)
  3481. +                        {
  3482. +                            AggroAllPlayers(me);
  3483. +                            events.SetPhase(PHASE_COMBAT);
  3484. +                        }
  3485. +                        break;
  3486. +                }
  3487. +            }
  3488. +            
  3489. +            if (events.GetPhaseMask() == PHASE_COMBAT)
  3490. +                DoMeleeAttackIfReady();
  3491. +        }
  3492.  
  3493. -            if (uiHexMendingTimer <= uiDiff)
  3494. +        void DamageTaken(Unit* /*who*/, uint32& damage) override
  3495. +        {
  3496. +            if (damage >= me->GetHealth())
  3497.              {
  3498. -                DoCastVictim(SPELL_HEX_OF_MENDING, true);
  3499. +                damage = 0;
  3500. +                hasBeenInCombat = false;
  3501. +                Talk(SAY_CHAMPION_DEFEAT);
  3502.  
  3503. -                uiHexMendingTimer = urand(20000, 25000);
  3504. -            } else uiHexMendingTimer -= uiDiff;
  3505. -
  3506. -            DoMeleeAttackIfReady();
  3507. -        }
  3508. +                if (instance)
  3509. +                    instance->SetData(BOSS_GRAND_CHAMPIONS, DONE);
  3510.  
  3511. -        void JustDied(Unit* /*killer*/) override
  3512. -        {
  3513. -            instance->SetData(BOSS_GRAND_CHAMPIONS, DONE);
  3514. +                // Instance encounter counting mechanics
  3515. +                if (!bCredit)
  3516. +                {
  3517. +                    bCredit = true;
  3518. +                    HandleSpellOnPlayersInInstanceToC5(me, SPELL_GRAND_CHAMPIONS_CREDIT);
  3519. +                }
  3520. +                EnterEvadeMode();
  3521. +                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  3522. +                me->setFaction(35);
  3523. +                me->GetMotionMaster()->MovePoint(0,746.843f, 695.68f, 412.339f);
  3524. +                HandleKillCreditForAllPlayers(me);
  3525. +                HandleInstanceBind(me);
  3526. +            }
  3527.          }
  3528.      };
  3529.  
  3530. -    CreatureAI* GetAI(Creature* creature) const override
  3531. +    CreatureAI* GetAI(Creature* creature) const
  3532.      {
  3533. -        return GetInstanceAI<boss_shaman_toc5AI>(creature);
  3534. +        return new boss_shaman_toc5AI(creature);
  3535.      }
  3536.  };
  3537.  
  3538. +// Jaelyne Evensong && Zul'tore || Hunter
  3539.  class boss_hunter_toc5 : public CreatureScript
  3540.  {
  3541. -public:
  3542. -    boss_hunter_toc5() : CreatureScript("boss_hunter_toc5") { }
  3543. +    public:
  3544. +        boss_hunter_toc5(): CreatureScript("boss_hunter_toc5") {}
  3545.  
  3546. -        // Jaelyne Evensong && Zul'tore || Hunter
  3547. -    struct boss_hunter_toc5AI : public ScriptedAI
  3548. +    struct boss_hunter_toc5AI : public BossAI
  3549.      {
  3550. -        boss_hunter_toc5AI(Creature* creature) : ScriptedAI(creature)
  3551. +        boss_hunter_toc5AI(Creature* creature) : BossAI(creature, BOSS_GRAND_CHAMPIONS)
  3552.          {
  3553. -            Initialize();
  3554.              instance = creature->GetInstanceScript();
  3555.  
  3556.              bDone = false;
  3557.              bHome = false;
  3558. +            hasBeenInCombat = false;
  3559. +            bCredit = false;
  3560.  
  3561. -            uiPhase = 0;
  3562. -            uiPhaseTimer = 0;
  3563. -
  3564. -            me->SetReactState(REACT_PASSIVE);
  3565. -            // THIS IS A HACK, SHOULD BE REMOVED WHEN THE EVENT IS FULL SCRIPTED
  3566. -            me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC);
  3567. -        }
  3568. -
  3569. -        void Initialize()
  3570. -        {
  3571. -            uiShootTimer = 12000;
  3572. -            uiMultiShotTimer = 0;
  3573. -            uiLightningArrowsTimer = 7000;
  3574. -
  3575. -            uiTargetGUID.Clear();
  3576. -
  3577. -            bShoot = false;
  3578. +            me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  3579.          }
  3580.  
  3581.          InstanceScript* instance;
  3582.  
  3583. -        uint8 uiPhase;
  3584. -        uint32 uiPhaseTimer;
  3585. -
  3586. -        uint32 uiShootTimer;
  3587. -        uint32 uiMultiShotTimer;
  3588. -        uint32 uiLightningArrowsTimer;
  3589. -
  3590.          ObjectGuid uiTargetGUID;
  3591.  
  3592.          bool bShoot;
  3593.          bool bDone;
  3594.          bool bHome;
  3595. +        bool hasBeenInCombat;
  3596. +        bool bCredit;
  3597.  
  3598.          void Reset() override
  3599.          {
  3600. -            Initialize();
  3601. +            uiTargetGUID.Clear();
  3602. +
  3603. +            bShoot = false;
  3604. +
  3605. +            Map* pMap = me->GetMap();
  3606. +            if (hasBeenInCombat && pMap && pMap->IsDungeon())
  3607. +            {
  3608. +                Map::PlayerList const &players = pMap->GetPlayers();
  3609. +                for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
  3610. +                {
  3611. +                    if (itr->GetSource() && itr->GetSource()->IsAlive() && !itr->GetSource()->IsGameMaster())
  3612. +                        return;
  3613. +                }
  3614. +
  3615. +                if (instance)
  3616. +                    instance->SetData(BOSS_GRAND_CHAMPIONS, FAIL);
  3617. +
  3618. +                if (instance)
  3619. +                {
  3620. +                    GameObject* GO = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_MAIN_GATE1));
  3621. +                    if (GO)
  3622. +                        instance->HandleGameObject(GO->GetGUID(),true);
  3623. +                }
  3624. +
  3625. +                me->RemoveFromWorld();
  3626. +                events.SetPhase(PHASE_IDLE);
  3627. +            }
  3628.          }
  3629.  
  3630.          void JustReachedHome() override
  3631. @@ -800,149 +1082,205 @@ public:
  3632.              if (!bHome)
  3633.                  return;
  3634.  
  3635. -            uiPhaseTimer = 15000;
  3636. -            uiPhase = 1;
  3637. +            events.ScheduleEvent(EVENT_PHASE_SWITCH, 15000, 0, PHASE_IDLE);
  3638.  
  3639.              bHome = false;
  3640.          }
  3641.  
  3642. +        void EnterCombat(Unit* /*who*/) override
  3643. +        {
  3644. +            _EnterCombat();
  3645. +            hasBeenInCombat = true;
  3646. +            events.ScheduleEvent(EVENT_SHOOT, 12000, 0, PHASE_COMBAT);
  3647. +            events.ScheduleEvent(EVENT_LIGHTNING_ARROWS, 7000, 0, PHASE_COMBAT);
  3648. +            events.ScheduleEvent(EVENT_DISENGAGE, 10000, 0, PHASE_COMBAT);
  3649. +            events.SetPhase(PHASE_COMBAT);
  3650. +        }
  3651. +
  3652.          void UpdateAI(uint32 uiDiff) override
  3653.          {
  3654. +            if (!me->GetVehicle())
  3655. +                me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  3656. +
  3657.              if (!bDone && GrandChampionsOutVehicle(me))
  3658.              {
  3659.                  bDone = true;
  3660.  
  3661. -                if (me->GetGUID() == instance->GetGuidData(DATA_GRAND_CHAMPION_1))
  3662. -                    me->SetHomePosition(739.678f, 662.541f, 412.393f, 4.49f);
  3663. -                else if (me->GetGUID() == instance->GetGuidData(DATA_GRAND_CHAMPION_2))
  3664. -                    me->SetHomePosition(746.71f, 661.02f, 411.69f, 4.6f);
  3665. -                else if (me->GetGUID() == instance->GetGuidData(DATA_GRAND_CHAMPION_3))
  3666. -                    me->SetHomePosition(754.34f, 660.70f, 412.39f, 4.79f);
  3667. +                me->RemoveAura(64723); // [DND] ReadyJoust Pose Effect
  3668. +
  3669. +                if (instance && me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_1))
  3670. +                    me->SetHomePosition(739.678f,662.541f,413.395f,4.49f);
  3671. +                else if (instance && me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_2))
  3672. +                         me->SetHomePosition(746.71f,661.02f,412.695f,4.6f);
  3673. +                else if (instance && me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_3))
  3674. +                         me->SetHomePosition(754.34f,660.70f,413.395f,4.79f);
  3675.  
  3676. -                instance->SetData(BOSS_GRAND_CHAMPIONS, IN_PROGRESS);
  3677. +                if (instance)
  3678. +                    instance->SetData(BOSS_GRAND_CHAMPIONS, IN_PROGRESS);
  3679.  
  3680.                  EnterEvadeMode();
  3681.                  bHome = true;
  3682.              }
  3683.  
  3684. -            if (uiPhaseTimer <= uiDiff)
  3685. -            {
  3686. -                if (uiPhase == 1)
  3687. -                {
  3688. -                    AggroAllPlayers(me);
  3689. -                    uiPhase = 0;
  3690. -                }
  3691. -            }else uiPhaseTimer -= uiDiff;
  3692. -
  3693. -            if (!UpdateVictim() || me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT))
  3694. +            if (!UpdateVictim() || me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT) || me->GetVehicle())
  3695.                  return;
  3696.  
  3697. -            if (uiLightningArrowsTimer <= uiDiff)
  3698. -            {
  3699. -                DoCastAOE(SPELL_LIGHTNING_ARROWS, false);
  3700. -                uiLightningArrowsTimer = 7000;
  3701. -            } else uiLightningArrowsTimer -= uiDiff;
  3702. +            events.Update(uiDiff);
  3703.  
  3704. -            if (uiShootTimer <= uiDiff)
  3705. +            while (uint32 eventId = events.ExecuteEvent())
  3706.              {
  3707. -                if (Unit* target = SelectTarget(SELECT_TARGET_FARTHEST, 0, 30.0f))
  3708. +                switch (eventId)
  3709.                  {
  3710. -                    uiTargetGUID = target->GetGUID();
  3711. -                    DoCast(target, SPELL_SHOOT);
  3712. -                }
  3713. -                uiShootTimer = 12000;
  3714. -                uiMultiShotTimer = 3000;
  3715. -                bShoot = true;
  3716. -            } else uiShootTimer -= uiDiff;
  3717. -
  3718. -            if (bShoot && uiMultiShotTimer <= uiDiff)
  3719. -            {
  3720. -                me->InterruptNonMeleeSpells(true);
  3721. -                Unit* target = ObjectAccessor::GetUnit(*me, uiTargetGUID);
  3722. -
  3723. -                if (target && me->IsInRange(target, 5.0f, 30.0f, false))
  3724. -                {
  3725. -                    DoCast(target, SPELL_MULTI_SHOT);
  3726. -                }
  3727. -                else
  3728. -                {
  3729. -                    Map::PlayerList const& players = me->GetMap()->GetPlayers();
  3730. -                    if (me->GetMap()->IsDungeon() && !players.isEmpty())
  3731. -                    {
  3732. -                        for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
  3733. +                    case EVENT_SHOOT:
  3734. +                        if (Unit* target = SelectTarget(SELECT_TARGET_FARTHEST, 0, 30.0f))
  3735.                          {
  3736. -                            Player* player = itr->GetSource();
  3737. -                            if (player && !player->IsGameMaster() && me->IsInRange(player, 5.0f, 30.0f, false))
  3738. +                            uiTargetGUID = target->GetGUID();
  3739. +                            DoCast(target, DUNGEON_MODE(SPELL_SHOOT, SPELL_SHOOT_H));
  3740. +                        }
  3741. +                        bShoot = true;
  3742. +                        events.ScheduleEvent(EVENT_SHOOT, 19000, 0, PHASE_COMBAT);
  3743. +                        events.ScheduleEvent(EVENT_MULTI_SHOOT, 8000, 0, PHASE_COMBAT);
  3744. +                        break;
  3745. +                    case EVENT_MULTI_SHOOT:
  3746. +                        if (bShoot)
  3747. +                        {
  3748. +                            me->InterruptNonMeleeSpells(true);
  3749. +                            Unit* target = ObjectAccessor::GetUnit(*me, uiTargetGUID);
  3750. +
  3751. +                            if (target && me->IsInRange(target, 5.0f, 30.0f, false))
  3752. +                                DoCast(target, SPELL_MULTI_SHOT);
  3753. +                            else
  3754.                              {
  3755. -                                DoCast(player, SPELL_MULTI_SHOT);
  3756. -                                break;
  3757. +                                Map::PlayerList const& players = me->GetMap()->GetPlayers();
  3758. +                                if (me->GetMap()->IsDungeon() && !players.isEmpty())
  3759. +                                {
  3760. +                                    for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
  3761. +                                    {
  3762. +                                        Player* player = itr->GetSource();
  3763. +                                        if (player && me->IsInRange(player, 5.0f, 30.0f, false))
  3764. +                                        {
  3765. +                                            DoCast(target, SPELL_MULTI_SHOT);
  3766. +                                            break;
  3767. +                                        }
  3768. +                                    }
  3769. +                                }
  3770.                              }
  3771. +                            bShoot = false;
  3772.                          }
  3773. -                    }
  3774. +                        break;
  3775. +                    case EVENT_DISENGAGE:
  3776. +                        if (me->IsWithinDistInMap(me->GetVictim(), 5))
  3777. +                        {
  3778. +                            DoCast(me, SPELL_DISENGAGE);
  3779. +                            events.ScheduleEvent(EVENT_DISENGAGE, 20000, 0, PHASE_COMBAT);
  3780. +                        }
  3781. +                        else
  3782. +                            events.ScheduleEvent(EVENT_DISENGAGE, 10000, 0, PHASE_COMBAT);
  3783. +                        break;
  3784. +                    case EVENT_LIGHTNING_ARROWS:
  3785. +                        DoCastAOE(SPELL_LIGHTNING_ARROWS, false);
  3786. +                        events.ScheduleEvent(EVENT_LIGHTNING_ARROWS, 15000, 0, PHASE_COMBAT);
  3787. +                        break;
  3788. +                    case EVENT_PHASE_SWITCH:
  3789. +                        if (events.GetPhaseMask() == PHASE_IDLE)
  3790. +                        {
  3791. +                            AggroAllPlayers(me);
  3792. +                            events.SetPhase(PHASE_COMBAT);
  3793. +                        }
  3794. +                        break;
  3795.                  }
  3796. -                bShoot = false;
  3797. -            } else uiMultiShotTimer -= uiDiff;
  3798. -
  3799. -            DoMeleeAttackIfReady();
  3800. +            }
  3801. +            if (events.GetPhaseMask() == PHASE_COMBAT)
  3802. +                DoMeleeAttackIfReady();
  3803.          }
  3804.  
  3805. -        void JustDied(Unit* /*killer*/) override
  3806. +        void DamageTaken(Unit* /*who*/, uint32& damage) override
  3807.          {
  3808. -            instance->SetData(BOSS_GRAND_CHAMPIONS, DONE);
  3809. +            if (damage >= me->GetHealth())
  3810. +            {
  3811. +                damage = 0;
  3812. +                hasBeenInCombat = false;
  3813. +                Talk(SAY_CHAMPION_DEFEAT);
  3814. +
  3815. +                if (instance)
  3816. +                    instance->SetData(BOSS_GRAND_CHAMPIONS, DONE);
  3817. +
  3818. +                // Instance encounter counting mechanics
  3819. +                if (!bCredit)
  3820. +                {
  3821. +                    bCredit = true;
  3822. +                    HandleSpellOnPlayersInInstanceToC5(me, SPELL_GRAND_CHAMPIONS_CREDIT);
  3823. +                }
  3824. +                EnterEvadeMode();
  3825. +                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  3826. +                me->setFaction(35);
  3827. +                me->GetMotionMaster()->MovePoint(0, 746.843f, 695.68f, 412.339f);
  3828. +                HandleKillCreditForAllPlayers(me);
  3829. +                HandleInstanceBind(me);
  3830. +            }
  3831.          }
  3832.      };
  3833.  
  3834. -    CreatureAI* GetAI(Creature* creature) const override
  3835. +    CreatureAI* GetAI(Creature* creature) const
  3836.      {
  3837. -        return GetInstanceAI<boss_hunter_toc5AI>(creature);
  3838. +        return new boss_hunter_toc5AI(creature);
  3839.      }
  3840.  };
  3841.  
  3842. -class boss_rouge_toc5 : public CreatureScript
  3843. +// Lana Stouthammer Evensong && Deathstalker Visceri || Rogue
  3844. +class boss_rogue_toc5 : public CreatureScript
  3845.  {
  3846. -public:
  3847. -    boss_rouge_toc5() : CreatureScript("boss_rouge_toc5") { }
  3848. +    public:
  3849. +        boss_rogue_toc5(): CreatureScript("boss_rogue_toc5") { }
  3850.  
  3851. -    // Lana Stouthammer Evensong && Deathstalker Visceri || Rouge
  3852. -    struct boss_rouge_toc5AI : public ScriptedAI
  3853. +    struct boss_rogue_toc5AI : public BossAI
  3854.      {
  3855. -        boss_rouge_toc5AI(Creature* creature) : ScriptedAI(creature)
  3856. +        boss_rogue_toc5AI(Creature* creature) : BossAI(creature, BOSS_GRAND_CHAMPIONS)
  3857.          {
  3858. -            Initialize();
  3859.              instance = creature->GetInstanceScript();
  3860.  
  3861.              bDone = false;
  3862.              bHome = false;
  3863. +            bCredit = false;
  3864.  
  3865. -            uiPhase = 0;
  3866. -            uiPhaseTimer = 0;
  3867. -
  3868. -            me->SetReactState(REACT_PASSIVE);
  3869. -            // THIS IS A HACK, SHOULD BE REMOVED WHEN THE EVENT IS FULL SCRIPTED
  3870. -            me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC);
  3871. -        }
  3872. -
  3873. -        void Initialize()
  3874. -        {
  3875. -            uiEviscerateTimer = 8000;
  3876. -            uiFanKivesTimer = 14000;
  3877. -            uiPosionBottleTimer = 19000;
  3878. +            hasBeenInCombat = false;
  3879. +            me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  3880.          }
  3881.  
  3882.          InstanceScript* instance;
  3883.  
  3884. -        uint8 uiPhase;
  3885. -        uint32 uiPhaseTimer;
  3886. -        uint32 uiEviscerateTimer;
  3887. -        uint32 uiFanKivesTimer;
  3888. -        uint32 uiPosionBottleTimer;
  3889. -
  3890.          bool bDone;
  3891.          bool bHome;
  3892. +        bool hasBeenInCombat;
  3893. +        bool bCredit;
  3894.  
  3895.          void Reset() override
  3896.          {
  3897. -            Initialize();
  3898. +
  3899. +            Map* pMap = me->GetMap();
  3900. +
  3901. +            if (hasBeenInCombat && pMap && pMap->IsDungeon())
  3902. +            {
  3903. +                Map::PlayerList const &players = pMap->GetPlayers();
  3904. +                for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
  3905. +                {
  3906. +                    if (itr->GetSource() && itr->GetSource()->IsAlive() && !itr->GetSource()->IsGameMaster())
  3907. +                        return;
  3908. +                }
  3909. +
  3910. +                if (instance)
  3911. +                    instance->SetData(BOSS_GRAND_CHAMPIONS, FAIL);
  3912. +
  3913. +                if (instance)
  3914. +                {
  3915. +                    GameObject* GO = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_MAIN_GATE1));
  3916. +                    if (GO)
  3917. +                        instance->HandleGameObject(GO->GetGUID(),true);
  3918. +                }
  3919. +
  3920. +                events.SetPhase(PHASE_IDLE);
  3921. +                me->RemoveFromWorld();
  3922. +            }
  3923.          }
  3924.  
  3925.          void JustReachedHome() override
  3926. @@ -952,75 +1290,339 @@ public:
  3927.              if (!bHome)
  3928.                  return;
  3929.  
  3930. -            uiPhaseTimer = 15000;
  3931. -            uiPhase = 1;
  3932. +            events.ScheduleEvent(EVENT_PHASE_SWITCH, 15000, 0, PHASE_IDLE);
  3933.  
  3934.              bHome = false;
  3935.          }
  3936.  
  3937. +        void EnterCombat(Unit* /*who*/) override
  3938. +        {
  3939. +            _EnterCombat();
  3940. +            hasBeenInCombat = true;
  3941. +            events.ScheduleEvent(EVENT_EVISCERATE, 8000, 0, PHASE_COMBAT);
  3942. +            events.ScheduleEvent(EVENT_FAN_OF_KNIVES, 14000, 0, PHASE_COMBAT);
  3943. +            events.ScheduleEvent(EVENT_POISON_BOTTLE, 19000, 0, PHASE_COMBAT);
  3944. +            events.SetPhase(PHASE_COMBAT);
  3945. +        }
  3946. +
  3947.          void UpdateAI(uint32 uiDiff) override
  3948.          {
  3949.              if (!bDone && GrandChampionsOutVehicle(me))
  3950.              {
  3951.                  bDone = true;
  3952.  
  3953. -                if (me->GetGUID() == instance->GetGuidData(DATA_GRAND_CHAMPION_1))
  3954. -                    me->SetHomePosition(739.678f, 662.541f, 412.393f, 4.49f);
  3955. -                else if (me->GetGUID() == instance->GetGuidData(DATA_GRAND_CHAMPION_2))
  3956. -                    me->SetHomePosition(746.71f, 661.02f, 411.69f, 4.6f);
  3957. -                else if (me->GetGUID() == instance->GetGuidData(DATA_GRAND_CHAMPION_3))
  3958. -                    me->SetHomePosition(754.34f, 660.70f, 412.39f, 4.79f);
  3959. +                me->RemoveAura(64723); // [DND] ReadyJoust Pose Effect
  3960. +
  3961. +                if (instance && me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_1))
  3962. +                    me->SetHomePosition(739.678f,662.541f,413.395f,4.49f);
  3963. +                else if (instance && me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_2))
  3964. +                        me->SetHomePosition(746.71f,661.02f,412.695f,4.6f);
  3965. +                else if (instance && me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_3))
  3966. +                        me->SetHomePosition(754.34f,660.70f,413.395f,4.79f);
  3967.  
  3968. -                instance->SetData(BOSS_GRAND_CHAMPIONS, IN_PROGRESS);
  3969. +                if (instance)
  3970. +                    instance->SetData(BOSS_GRAND_CHAMPIONS, IN_PROGRESS);
  3971.  
  3972.                  EnterEvadeMode();
  3973.                  bHome = true;
  3974.              }
  3975.  
  3976. -            if (uiPhaseTimer <= uiDiff)
  3977. +            if (!UpdateVictim() || me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT) || me->GetVehicle())
  3978. +                return;
  3979. +
  3980. +            events.Update(uiDiff);
  3981. +
  3982. +            while (uint32 eventId = events.ExecuteEvent())
  3983.              {
  3984. -                if (uiPhase == 1)
  3985. +                switch (eventId)
  3986.                  {
  3987. -                    AggroAllPlayers(me);
  3988. -                    uiPhase = 0;
  3989. +                    case EVENT_EVISCERATE:
  3990. +                        DoCast(me->GetVictim(),DUNGEON_MODE(SPELL_EVISCERATE, SPELL_EVISCERATE_H));
  3991. +                        events.ScheduleEvent(EVENT_EVISCERATE, 12000, 0, PHASE_COMBAT);
  3992. +                        break;
  3993. +                    case EVENT_FAN_OF_KNIVES:
  3994. +                        DoCastAOE(SPELL_FAN_OF_KNIVES, false);
  3995. +                        events.ScheduleEvent(EVENT_FAN_OF_KNIVES, 20000, 0, PHASE_COMBAT);
  3996. +                        break;
  3997. +                    case EVENT_POISON_BOTTLE:
  3998. +                        if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
  3999. +                            DoCast(target, SPELL_POISON_BOTTLE);
  4000. +                        events.ScheduleEvent(EVENT_POISON_BOTTLE, 19000, 0, PHASE_COMBAT);
  4001. +                        break;
  4002. +                    case EVENT_PHASE_SWITCH:
  4003. +                        if (events.GetPhaseMask() == PHASE_IDLE)
  4004. +                        {
  4005. +                            AggroAllPlayers(me);
  4006. +                            events.SetPhase(PHASE_COMBAT);
  4007. +                        }
  4008. +                        break;
  4009.                  }
  4010. -            } else uiPhaseTimer -= uiDiff;
  4011. +            }
  4012. +            if (events.GetPhaseMask() == PHASE_COMBAT)
  4013. +                DoMeleeAttackIfReady();
  4014. +        }
  4015.  
  4016. -            if (!UpdateVictim() || me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT))
  4017. -                return;
  4018. +        void DamageTaken(Unit* /*who*/, uint32& damage) override
  4019. +        {
  4020. +            if (damage >= me->GetHealth())
  4021. +            {
  4022. +                damage = 0;
  4023. +                hasBeenInCombat = false;
  4024. +                Talk(SAY_CHAMPION_DEFEAT);
  4025. +
  4026. +                if (instance)
  4027. +                    instance->SetData(BOSS_GRAND_CHAMPIONS, DONE);
  4028.  
  4029. -            if (uiEviscerateTimer <= uiDiff)
  4030. +                // Instance encounter counting mechanics
  4031. +                if (!bCredit)
  4032. +                {
  4033. +                    bCredit = true;
  4034. +                    HandleSpellOnPlayersInInstanceToC5(me, SPELL_GRAND_CHAMPIONS_CREDIT);
  4035. +                }
  4036. +                EnterEvadeMode();
  4037. +                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  4038. +                me->setFaction(35);
  4039. +                me->GetMotionMaster()->MovePoint(0, 746.843f, 695.68f, 412.339f);
  4040. +                HandleKillCreditForAllPlayers(me);
  4041. +                HandleInstanceBind(me);
  4042. +            }
  4043. +        }
  4044. +    };
  4045. +
  4046. +    CreatureAI* GetAI(Creature* creature) const
  4047. +    {
  4048. +        return new boss_rogue_toc5AI(creature);
  4049. +    }
  4050. +};
  4051. +
  4052. +class achievement_toc5_grand_champions : public AchievementCriteriaScript
  4053. +{
  4054. +    public:
  4055. +        uint32 creature_entry;
  4056. +
  4057. +        achievement_toc5_grand_champions(const char* name, uint32 original_entry) : AchievementCriteriaScript(name)
  4058. +        {
  4059. +            creature_entry = original_entry;
  4060. +        }
  4061. +
  4062. +        bool OnCheck(Player* /*source*/, Unit* target) override
  4063. +        {
  4064. +            if (!target)
  4065. +                return false;
  4066. +
  4067. +            if (Creature* creature = target->ToCreature())
  4068. +                if (creature->GetEntry() == creature_entry)
  4069. +                    return true;
  4070. +
  4071. +            return false;
  4072. +        }
  4073. +};
  4074. +
  4075. +void HandleInstanceBind(Creature* source)
  4076. +{
  4077. +    Map::PlayerList const& players = source->GetMap()->GetPlayers();
  4078. +    if (!players.isEmpty() && source->GetMap()->ToInstanceMap()->IsHeroic())
  4079. +    {
  4080. +        for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
  4081. +        {
  4082. +            Player* player = itr->GetSource();
  4083. +            if (player)
  4084. +                source->GetMap()->ToInstanceMap()->PermBindAllPlayers(player);
  4085. +        }
  4086. +    }
  4087. +}
  4088. +
  4089. +void HandleKillCreditForAllPlayers(Creature* credit)
  4090. +{
  4091. +    InstanceScript* instance = credit->GetInstanceScript();
  4092. +    if (instance)
  4093. +    {
  4094. +        Map::PlayerList const &PlayerList = instance->instance->GetPlayers();
  4095. +        for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
  4096. +            if (Player* player = i->GetSource())
  4097. +                player->KilledMonsterCredit(credit->GetEntry());
  4098. +    }
  4099. +}
  4100. +
  4101. +class spell_toc5_ride_mount : public SpellScriptLoader
  4102. +{
  4103. +    public:
  4104. +        spell_toc5_ride_mount() : SpellScriptLoader("spell_toc5_ride_mount") {}
  4105. +
  4106. +        class spell_toc5_ride_mount_SpellScript : public SpellScript
  4107. +        {
  4108. +            PrepareSpellScript(spell_toc5_ride_mount_SpellScript);
  4109. +
  4110. +            SpellCastResult CheckRequirement()
  4111.              {
  4112. -                DoCastVictim(SPELL_EVISCERATE);
  4113. -                uiEviscerateTimer = 8000;
  4114. -            } else uiEviscerateTimer -= uiDiff;
  4115. +                if(GetCaster()->GetUInt32Value(PLAYER_VISIBLE_ITEM_16_ENTRYID) == 46106)
  4116. +                {
  4117. +                    GetCaster()->RemoveAurasByType(SPELL_AURA_MOD_SHAPESHIFT);
  4118. +                    return SPELL_CAST_OK;
  4119. +                } else {
  4120. +                    SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_MUST_HAVE_LANCE_EQUIPPED);
  4121. +                    return SPELL_FAILED_CUSTOM_ERROR;
  4122. +                }
  4123. +            }
  4124.  
  4125. -            if (uiFanKivesTimer <= uiDiff)
  4126. +            void Register()
  4127.              {
  4128. -                DoCastAOE(SPELL_FAN_OF_KNIVES, false);
  4129. -                uiFanKivesTimer = 14000;
  4130. -            } else uiFanKivesTimer -= uiDiff;
  4131. +                OnCheckCast += SpellCheckCastFn(spell_toc5_ride_mount_SpellScript::CheckRequirement);
  4132. +            }
  4133. +        };
  4134.  
  4135. -            if (uiPosionBottleTimer <= uiDiff)
  4136. +        class spell_toc5_ride_mount_AuraScript : public AuraScript
  4137. +        {
  4138. +            PrepareAuraScript(spell_toc5_ride_mount_AuraScript);
  4139. +
  4140. +            void HandleOnEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
  4141.              {
  4142. -                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
  4143. -                    DoCast(target, SPELL_POISON_BOTTLE);
  4144. -                uiPosionBottleTimer = 19000;
  4145. -            } else uiPosionBottleTimer -= uiDiff;
  4146. +                if (Unit* target = GetTarget())
  4147. +                    target->RemoveAurasDueToSpell(SPELL_DEFEND_2);
  4148. +                if (Unit* caster = GetCaster())
  4149. +                {
  4150. +                    caster->RemoveAurasDueToSpell(SPELL_DEFEND_2);
  4151. +                    for (uint8 i = 0; i < 3; i++)
  4152. +                        caster->RemoveAurasDueToSpell(SPELL_VISUAL_SHIELD_1 + i);
  4153. +                }
  4154. +            }
  4155.  
  4156. -            DoMeleeAttackIfReady();
  4157. +            void Register()
  4158. +            {
  4159. +                OnEffectApply += AuraEffectApplyFn(spell_toc5_ride_mount_AuraScript::HandleOnEffect, EFFECT_0, SPELL_AURA_CONTROL_VEHICLE, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
  4160. +                OnEffectRemove += AuraEffectRemoveFn(spell_toc5_ride_mount_AuraScript::HandleOnEffect, EFFECT_0, SPELL_AURA_CONTROL_VEHICLE, AURA_EFFECT_HANDLE_REAL);
  4161. +            }
  4162. +        };
  4163. +
  4164. +        AuraScript* GetAuraScript() const
  4165. +        {
  4166. +            return new spell_toc5_ride_mount_AuraScript();
  4167.          }
  4168.  
  4169. -        void JustDied(Unit* /*killer*/) override
  4170. +        SpellScript* GetSpellScript() const
  4171.          {
  4172. -            instance->SetData(BOSS_GRAND_CHAMPIONS, DONE);
  4173. +            return new spell_toc5_ride_mount_SpellScript();
  4174.          }
  4175. -    };
  4176. +};
  4177.  
  4178. -    CreatureAI* GetAI(Creature* creature) const override
  4179. -    {
  4180. -        return GetInstanceAI<boss_rouge_toc5AI>(creature);
  4181. -    }
  4182. +class spell_toc5_defend : public SpellScriptLoader
  4183. +{
  4184. +    public:
  4185. +        spell_toc5_defend() : SpellScriptLoader("spell_toc5_defend") { }
  4186. +
  4187. +        class spell_toc5_defendAuraScript : public AuraScript
  4188. +        {
  4189. +            PrepareAuraScript(spell_toc5_defendAuraScript);
  4190. +
  4191. +            bool Validate(SpellInfo const* /*spellEntry*/)
  4192. +            {
  4193. +                if (!sSpellMgr->GetSpellInfo(SPELL_VISUAL_SHIELD_1))
  4194. +                    return false;
  4195. +                if (!sSpellMgr->GetSpellInfo(SPELL_VISUAL_SHIELD_2))
  4196. +                    return false;
  4197. +                if (!sSpellMgr->GetSpellInfo(SPELL_VISUAL_SHIELD_3))
  4198. +                    return false;
  4199. +                return true;
  4200. +            }
  4201. +
  4202. +            void RefreshVisualShields(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
  4203. +            {
  4204. +                Unit* caster = GetCaster();
  4205. +
  4206. +                if(!caster)
  4207. +                    return;
  4208. +
  4209. +                if(Unit* rider = caster->GetCharmer())
  4210. +                {
  4211. +                    for(uint8 i = 0; i < 3; ++i)
  4212. +                        rider->RemoveAurasDueToSpell(SPELL_VISUAL_SHIELD_1 + i);
  4213. +
  4214. +                    if(Aura* defend = caster->GetAura(GetId()))
  4215. +                        rider->CastSpell(rider, SPELL_VISUAL_SHIELD_1 + (defend->GetStackAmount()-1), true);
  4216. +                }else
  4217. +                {
  4218. +                    for(uint8 i = 0; i < 3; ++i)
  4219. +                        caster->RemoveAurasDueToSpell(SPELL_VISUAL_SHIELD_1 + i);
  4220. +
  4221. +                    if(Aura* defend = caster->GetAura(GetId()))
  4222. +                        caster->CastSpell(caster, SPELL_VISUAL_SHIELD_1 + (defend->GetStackAmount()-1), true);
  4223. +                }
  4224. +            }
  4225. +
  4226. +            void Register()
  4227. +            {
  4228. +                OnEffectApply += AuraEffectApplyFn(spell_toc5_defendAuraScript::RefreshVisualShields, EFFECT_FIRST_FOUND, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_CHANGE_AMOUNT_SEND_FOR_CLIENT_MASK);
  4229. +                OnEffectRemove += AuraEffectRemoveFn(spell_toc5_defendAuraScript::RefreshVisualShields, EFFECT_FIRST_FOUND, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_CHANGE_AMOUNT_SEND_FOR_CLIENT_MASK);
  4230. +            }
  4231. +        };
  4232. +
  4233. +        AuraScript* GetAuraScript() const
  4234. +        {
  4235. +            return new spell_toc5_defendAuraScript();
  4236. +        }
  4237. +};
  4238. +
  4239. +class player_hex_mendingAI : public PlayerAI
  4240. +{
  4241. +    public:
  4242. +        player_hex_mendingAI(Player* player) : PlayerAI(player) { }
  4243. +
  4244. +        void HealReceived(Unit* healer, uint32 & addHealth)
  4245. +        {
  4246. +            PlayerAI::HealReceived(healer, addHealth);
  4247. +            me->CastCustomSpell(SPELL_HEX_OF_MENDING_HEAL, SPELLVALUE_BASE_POINT0, int32(addHealth*2.0f), me, true);
  4248. +        }
  4249. +
  4250. +        void UpdateAI(const uint32 /*diff*/) { }
  4251. +
  4252. +    private:
  4253. +        ObjectGuid casterGUID;
  4254. +};
  4255. +
  4256. +class spell_toc5_hex_mending : public SpellScriptLoader
  4257. +{
  4258. +    public:
  4259. +        spell_toc5_hex_mending() : SpellScriptLoader("spell_toc5_hex_mending") { }
  4260. +
  4261. +        class spell_toc5_hex_mending_AuraScript : public AuraScript
  4262. +        {
  4263. +            PrepareAuraScript(spell_toc5_hex_mending_AuraScript);
  4264. +
  4265. +            void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
  4266. +            {
  4267. +                if (GetTarget()->GetTypeId() != TYPEID_PLAYER)
  4268. +                    return;
  4269. +
  4270. +                oldAI = GetTarget()->GetAI();
  4271. +                GetTarget()->SetAI(new player_hex_mendingAI(GetTarget()->ToPlayer()));
  4272. +                oldAIState = GetTarget()->IsAIEnabled;
  4273. +                GetTarget()->IsAIEnabled = true;
  4274. +            }
  4275. +
  4276. +            void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
  4277. +            {
  4278. +                if (GetTarget()->GetTypeId() != TYPEID_PLAYER)
  4279. +                    return;
  4280. +
  4281. +                delete GetTarget()->GetAI();
  4282. +                GetTarget()->SetAI(oldAI);
  4283. +                GetTarget()->IsAIEnabled = oldAIState;
  4284. +            }
  4285. +
  4286. +            void Register()
  4287. +            {
  4288. +                AfterEffectApply += AuraEffectApplyFn(spell_toc5_hex_mending_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
  4289. +                AfterEffectRemove += AuraEffectRemoveFn(spell_toc5_hex_mending_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
  4290. +            }
  4291. +
  4292. +            UnitAI* oldAI;
  4293. +            bool oldAIState;
  4294. +        };
  4295. +
  4296. +        AuraScript* GetAuraScript() const
  4297. +        {
  4298. +            return new spell_toc5_hex_mending_AuraScript();
  4299. +        }
  4300.  };
  4301.  
  4302.  void AddSC_boss_grand_champions()
  4303. @@ -1030,5 +1632,19 @@ void AddSC_boss_grand_champions()
  4304.      new boss_mage_toc5();
  4305.      new boss_shaman_toc5();
  4306.      new boss_hunter_toc5();
  4307. -    new boss_rouge_toc5();
  4308. -}
  4309. +    new boss_rogue_toc5();
  4310. +    new achievement_toc5_grand_champions("achievement_toc5_champions_mokra", NPC_MOKRA);
  4311. +    new achievement_toc5_grand_champions("achievement_toc5_champions_eressea", NPC_ERESSEA);
  4312. +    new achievement_toc5_grand_champions("achievement_toc5_champions_runok", NPC_RUNOK);
  4313. +    new achievement_toc5_grand_champions("achievement_toc5_champions_zultore", NPC_ZULTORE);
  4314. +    new achievement_toc5_grand_champions("achievement_toc5_champions_visceri", NPC_VISCERI);
  4315. +    new achievement_toc5_grand_champions("achievement_toc5_champions_alerius", NPC_JACOB);
  4316. +    new achievement_toc5_grand_champions("achievement_toc5_champions_ambrose", NPC_AMBROSE);
  4317. +    new achievement_toc5_grand_champions("achievement_toc5_champions_colosos", NPC_COLOSOS);
  4318. +    new achievement_toc5_grand_champions("achievement_toc5_champions_jaelyne", NPC_JAELYNE);
  4319. +    new achievement_toc5_grand_champions("achievement_toc5_champions_lana", NPC_LANA);
  4320. +
  4321. +    new spell_toc5_ride_mount();
  4322. +    new spell_toc5_defend();
  4323. +    new spell_toc5_hex_mending();
  4324. +};
  4325. \ No newline at end of file
  4326. diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp
  4327. index cacef99..b366a50 100644
  4328. --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp
  4329. +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp
  4330. @@ -15,52 +15,56 @@
  4331.   * with this program. If not, see <http://www.gnu.org/licenses/>.
  4332.   */
  4333.  
  4334. -/* ScriptData
  4335. -SDName: Instance Trial of the Champion
  4336. -SDComment:
  4337. -SDCategory: Trial Of the Champion
  4338. -EndScriptData */
  4339. -
  4340. -#include "ScriptMgr.h"
  4341. -#include "ScriptedCreature.h"
  4342. -#include "InstanceScript.h"
  4343. +#include "ScriptPCH.h"
  4344.  #include "trial_of_the_champion.h"
  4345.  #include "Player.h"
  4346.  
  4347.  #define MAX_ENCOUNTER  4
  4348.  
  4349. +enum Events
  4350. +{
  4351. +    EVENT_OUTRO_1               = 1,
  4352. +    EVENT_OUTRO_2               = 2,
  4353. +    EVENT_OUTRO_3               = 3
  4354. +};
  4355. +
  4356. +enum Texts
  4357. +{
  4358. +    SAY_OUTRO_1_TIRION                      = 57,
  4359. +    SAY_OUTRO_2_TIRION                      = 58,
  4360. +    SAY_OUTRO_3_ALLY                        = 53,
  4361. +    SAY_OUTRO_3_HORDE                       = 1
  4362. +};
  4363. +
  4364.  class instance_trial_of_the_champion : public InstanceMapScript
  4365.  {
  4366.  public:
  4367.      instance_trial_of_the_champion() : InstanceMapScript("instance_trial_of_the_champion", 650) { }
  4368.  
  4369. -    InstanceScript* GetInstanceScript(InstanceMap* map) const override
  4370. +    InstanceScript* GetInstanceScript(InstanceMap* pMap) const
  4371.      {
  4372. -        return new instance_trial_of_the_champion_InstanceMapScript(map);
  4373. +        return new instance_trial_of_the_champion_InstanceMapScript(pMap);
  4374.      }
  4375.  
  4376.      struct instance_trial_of_the_champion_InstanceMapScript : public InstanceScript
  4377.      {
  4378. -        instance_trial_of_the_champion_InstanceMapScript(Map* map) : InstanceScript(map)
  4379. -        {
  4380. -            SetHeaders(DataHeader);
  4381. -            uiMovementDone = 0;
  4382. -            uiGrandChampionsDeaths = 0;
  4383. -            uiArgentSoldierDeaths = 0;
  4384. -
  4385. -            bDone = false;
  4386. -
  4387. -            memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
  4388. -        }
  4389. +        instance_trial_of_the_champion_InstanceMapScript(Map* pMap) : InstanceScript(pMap) { }
  4390.  
  4391.          uint32 m_auiEncounter[MAX_ENCOUNTER];
  4392. +        uint32 TeamInInstance;
  4393.  
  4394.          uint16 uiMovementDone;
  4395.          uint16 uiGrandChampionsDeaths;
  4396.          uint8 uiArgentSoldierDeaths;
  4397. +        uint8 uiAggroDone;
  4398.  
  4399.          ObjectGuid uiAnnouncerGUID;
  4400. +        ObjectGuid blackknightGUID;
  4401. +        ObjectGuid uiThrallGUID;
  4402. +        ObjectGuid uiVarianGUID;
  4403. +        ObjectGuid uiHighlordGUID;
  4404.          ObjectGuid uiMainGateGUID;
  4405. +        ObjectGuid uiMainGate1GUID;
  4406.          ObjectGuid uiGrandChampionVehicle1GUID;
  4407.          ObjectGuid uiGrandChampionVehicle2GUID;
  4408.          ObjectGuid uiGrandChampionVehicle3GUID;
  4409. @@ -74,11 +78,29 @@ public:
  4410.  
  4411.          std::string str_data;
  4412.  
  4413. +        EventMap events;
  4414. +
  4415.          bool bDone;
  4416. +        bool HasChestSpawned;
  4417.  
  4418. -        bool IsEncounterInProgress() const override
  4419. +        void Initialize() override
  4420.          {
  4421. -            for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
  4422. +            uiMovementDone                = 0;
  4423. +            uiGrandChampionsDeaths        = 0;
  4424. +            uiArgentSoldierDeaths         = 0;
  4425. +            TeamInInstance                = 0;
  4426. +
  4427. +            bDone = false;
  4428. +            HasChestSpawned = false;
  4429. +
  4430. +            VehicleList.clear();
  4431. +
  4432. +            memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
  4433. +        }
  4434. +
  4435. +        bool IsEncounterInProgress() const
  4436. +        {
  4437. +            for(uint8 i = 0; i < MAX_ENCOUNTER; ++i)
  4438.              {
  4439.                  if (m_auiEncounter[i] == IN_PROGRESS)
  4440.                      return true;
  4441. @@ -87,10 +109,9 @@ public:
  4442.              return false;
  4443.          }
  4444.  
  4445. -        void OnCreatureCreate(Creature* creature) override
  4446. +        void OnCreatureCreate(Creature* creature)  override
  4447.          {
  4448.              Map::PlayerList const &players = instance->GetPlayers();
  4449. -            uint32 TeamInInstance = 0;
  4450.  
  4451.              if (!players.isEmpty())
  4452.              {
  4453. @@ -98,34 +119,99 @@ public:
  4454.                      TeamInInstance = player->GetTeam();
  4455.              }
  4456.  
  4457. -            switch (creature->GetEntry())
  4458. +            switch(creature->GetEntry())
  4459.              {
  4460. -                // Champions
  4461. +                // Gran Champions
  4462.                  case VEHICLE_MOKRA_SKILLCRUSHER_MOUNT:
  4463.                      if (TeamInInstance == HORDE)
  4464.                          creature->UpdateEntry(VEHICLE_MARSHAL_JACOB_ALERIUS_MOUNT);
  4465.                      break;
  4466. +                case NPC_MOKRA:
  4467. +                    if (TeamInInstance == HORDE)
  4468. +                        creature->UpdateEntry(NPC_JACOB);
  4469. +                    break;
  4470.                  case VEHICLE_ERESSEA_DAWNSINGER_MOUNT:
  4471.                      if (TeamInInstance == HORDE)
  4472.                          creature->UpdateEntry(VEHICLE_AMBROSE_BOLTSPARK_MOUNT);
  4473.                      break;
  4474. +                case NPC_ERESSEA:
  4475. +                    if (TeamInInstance == HORDE)
  4476. +                        creature->UpdateEntry(NPC_AMBROSE);
  4477. +                    break;
  4478.                  case VEHICLE_RUNOK_WILDMANE_MOUNT:
  4479.                      if (TeamInInstance == HORDE)
  4480.                          creature->UpdateEntry(VEHICLE_COLOSOS_MOUNT);
  4481.                      break;
  4482. +                case NPC_RUNOK:
  4483. +                    if (TeamInInstance == HORDE)
  4484. +                        creature->UpdateEntry(NPC_COLOSOS);
  4485. +                    break;
  4486.                  case VEHICLE_ZUL_TORE_MOUNT:
  4487.                      if (TeamInInstance == HORDE)
  4488.                          creature->UpdateEntry(VEHICLE_EVENSONG_MOUNT);
  4489.                      break;
  4490. +                case NPC_ZULTORE:
  4491. +                    if (TeamInInstance == HORDE)
  4492. +                        creature->UpdateEntry(NPC_JAELYNE);
  4493. +                    break;
  4494.                  case VEHICLE_DEATHSTALKER_VESCERI_MOUNT:
  4495.                      if (TeamInInstance == HORDE)
  4496.                          creature->UpdateEntry(VEHICLE_LANA_STOUTHAMMER_MOUNT);
  4497.                      break;
  4498. +                case NPC_VISCERI:
  4499. +                    if (TeamInInstance == HORDE)
  4500. +                        creature->UpdateEntry(NPC_LANA);
  4501. +                    break;
  4502. +                // Faction champions vehicles
  4503. +                case VEHICLE_FORSAKE_WARHORSE:
  4504. +                    if (TeamInInstance == HORDE)
  4505. +                        creature->UpdateEntry(VEHICLE_IRONFORGE_RAM);
  4506. +                    break;
  4507. +                case VEHICLE_THUNDER_BLUFF_KODO:
  4508. +                    if (TeamInInstance == HORDE)
  4509. +                        creature->UpdateEntry(VEHICLE_EXODAR_ELEKK);
  4510. +                    break;                
  4511. +                case VEHICLE_ORGRIMMAR_WOLF:
  4512. +                    if (TeamInInstance == HORDE)
  4513. +                        creature->UpdateEntry(VEHICLE_STORMWIND_STEED);
  4514. +                    break;                
  4515. +                case VEHICLE_SILVERMOON_HAWKSTRIDER:
  4516. +                    if (TeamInInstance == HORDE)
  4517. +                        creature->UpdateEntry(VEHICLE_GNOMEREGAN_MECHANOSTRIDER);
  4518. +                    break;
  4519. +                case VEHICLE_DARKSPEAR_RAPTOR:
  4520. +                    if (TeamInInstance == HORDE)
  4521. +                        creature->UpdateEntry(VEHICLE_DARNASSIA_NIGHTSABER);
  4522. +                    break;
  4523. +                // Faction champios
  4524. +                case NPC_ORGRIMAR_CHAMPION:
  4525. +                    if (TeamInInstance == HORDE)
  4526. +                        creature->UpdateEntry(NPC_STORMWIND_CHAMPION);
  4527. +                    break;
  4528. +                case NPC_SILVERMOON_CHAMPION:
  4529. +                    if (TeamInInstance == HORDE)
  4530. +                        creature->UpdateEntry(NPC_GNOMERAGN_CHAMPION);
  4531. +                    break;
  4532. +                case NPC_THUNDER_CHAMPION:
  4533. +                    if (TeamInInstance == HORDE)
  4534. +                        creature->UpdateEntry(NPC_EXODAR_CHAMPION);
  4535. +                    break;
  4536. +                case NPC_TROLL_CHAMPION:
  4537. +                    if (TeamInInstance == HORDE)
  4538. +                        creature->UpdateEntry(NPC_DRNASSUS_CHAMPION);
  4539. +                    break;
  4540. +                case NPC_UNDERCITY_CHAMPION:
  4541. +                    if (TeamInInstance == HORDE)
  4542. +                        creature->UpdateEntry(NPC_IRONFORGE_CHAMPION);
  4543. +                    break;
  4544.                  // Coliseum Announcer || Just NPC_JAEREN must be spawned.
  4545. +                case NPC_HIGHLORD:
  4546. +                    uiHighlordGUID = creature->GetGUID();
  4547. +                    break;
  4548.                  case NPC_JAEREN:
  4549. -                    uiAnnouncerGUID = creature->GetGUID();
  4550.                      if (TeamInInstance == ALLIANCE)
  4551.                          creature->UpdateEntry(NPC_ARELAS);
  4552. +                    uiAnnouncerGUID = creature->GetGUID();
  4553.                      break;
  4554.                  case VEHICLE_ARGENT_WARHORSE:
  4555.                  case VEHICLE_ARGENT_BATTLEWORG:
  4556. @@ -135,16 +221,43 @@ public:
  4557.                  case NPC_PALETRESS:
  4558.                      uiArgentChampionGUID = creature->GetGUID();
  4559.                      break;
  4560. +                case NPC_BLACK_KNIGHT:
  4561. +                    blackknightGUID = creature->GetGUID();
  4562. +                    break;
  4563. +                case NPC_THRALL:
  4564. +                    uiThrallGUID = creature->GetGUID();
  4565. +                    break;
  4566. +                case NPC_VARIAN:
  4567. +                    uiVarianGUID = creature->GetGUID();
  4568. +                    break;
  4569. +            }
  4570. +        }
  4571. +
  4572. +        bool CheckAchievementCriteriaMeet(uint32 criteriaId, Player const*, Unit const* /* = NULL */, uint32 /* = 0 */) override
  4573. +        {
  4574. +            switch (criteriaId)
  4575. +            {
  4576. +                case CRITERIA_IVE_HAD_WORSE:
  4577. +                    if (Creature* knight = instance->GetCreature(blackknightGUID))
  4578. +                        return knight->AI()->GetData(DATA_IVE_HAD_WORSE);
  4579. +                    break;
  4580. +                default:
  4581. +                    break;
  4582.              }
  4583. +
  4584. +            return false;
  4585.          }
  4586.  
  4587.          void OnGameObjectCreate(GameObject* go) override
  4588.          {
  4589. -            switch (go->GetEntry())
  4590. +            switch(go->GetEntry())
  4591.              {
  4592.                  case GO_MAIN_GATE:
  4593.                      uiMainGateGUID = go->GetGUID();
  4594.                      break;
  4595. +                case GO_MAIN_GATE1:
  4596. +                    uiMainGate1GUID = go->GetGUID();
  4597. +                    break;
  4598.                  case GO_CHAMPIONS_LOOT:
  4599.                  case GO_CHAMPIONS_LOOT_H:
  4600.                      uiChampionLootGUID = go->GetGUID();
  4601. @@ -154,7 +267,7 @@ public:
  4602.  
  4603.          void SetData(uint32 uiType, uint32 uiData) override
  4604.          {
  4605. -            switch (uiType)
  4606. +            switch(uiType)
  4607.              {
  4608.                  case DATA_MOVEMENT_DONE:
  4609.                      uiMovementDone = uiData;
  4610. @@ -171,16 +284,24 @@ public:
  4611.                          for (GuidList::const_iterator itr = VehicleList.begin(); itr != VehicleList.end(); ++itr)
  4612.                              if (Creature* summon = instance->GetCreature(*itr))
  4613.                                  summon->RemoveFromWorld();
  4614. -                    }else if (uiData == DONE)
  4615. +                    } else if (uiData == DONE)
  4616.                      {
  4617.                          ++uiGrandChampionsDeaths;
  4618. -                        if (uiGrandChampionsDeaths == 3)
  4619. +                        if (uiGrandChampionsDeaths >= 3 && !HasChestSpawned)
  4620.                          {
  4621.                              if (Creature* pAnnouncer =  instance->GetCreature(uiAnnouncerGUID))
  4622.                              {
  4623. +                                HasChestSpawned = true;
  4624. +                                pAnnouncer->AI()->SetData(DATA_RESET,0);
  4625. +                                m_auiEncounter[0] = uiData;
  4626.                                  pAnnouncer->GetMotionMaster()->MovePoint(0, 748.309f, 619.487f, 411.171f);
  4627.                                  pAnnouncer->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
  4628. -                                pAnnouncer->SummonGameObject(instance->IsHeroic()? GO_CHAMPIONS_LOOT_H : GO_CHAMPIONS_LOOT, 746.59f, 618.49f, 411.09f, 1.42f, 0, 0, 0, 0, 90000);
  4629. +                                pAnnouncer->SummonGameObject(instance->IsHeroic()? GO_CHAMPIONS_LOOT_H : GO_CHAMPIONS_LOOT, 746.59f, 618.49f, 411.09f, 1.42f, 0, 0, 0, 0, 90000000);
  4630. +
  4631. +                                for (GuidList::const_iterator itr = VehicleList.begin(); itr != VehicleList.end(); ++itr)
  4632. +                                    if (Creature* unit = instance->GetCreature(*itr))
  4633. +                                        if (unit->GetEntry() == NPC_ARGENT_WARHORSE || unit->GetEntry() == NPC_ARGENT_BATTLEWORG)
  4634. +                                            unit->DespawnOrUnsummon();
  4635.                              }
  4636.                          }
  4637.                      }
  4638. @@ -194,36 +315,64 @@ public:
  4639.                              pBoss->GetMotionMaster()->MovePoint(0, 746.88f, 618.74f, 411.06f);
  4640.                              pBoss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  4641.                              pBoss->SetReactState(REACT_AGGRESSIVE);
  4642. +                            pBoss->setFaction(16);
  4643.                          }
  4644.                      }
  4645.                      break;
  4646.                  case BOSS_ARGENT_CHALLENGE_E:
  4647.                      m_auiEncounter[1] = uiData;
  4648. -                    if (Creature* pAnnouncer = instance->GetCreature(uiAnnouncerGUID))
  4649. +                    if (uiData == IN_PROGRESS)
  4650. +                    {
  4651. +                    for(GuidList::const_iterator itr = VehicleList.begin(); itr != VehicleList.end(); ++itr)
  4652. +                        if (Creature* pSummon = instance->GetCreature(*itr))
  4653. +                            pSummon->RemoveFromWorld();
  4654. +                    } else if (uiData == DONE)
  4655.                      {
  4656. -                        pAnnouncer->GetMotionMaster()->MovePoint(0, 748.309f, 619.487f, 411.171f);
  4657. -                        pAnnouncer->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
  4658. -                        pAnnouncer->SummonGameObject(instance->IsHeroic()? GO_EADRIC_LOOT_H : GO_EADRIC_LOOT, 746.59f, 618.49f, 411.09f, 1.42f, 0, 0, 0, 0, 90000);
  4659. +                        if (Creature* pAnnouncer = instance->GetCreature(uiAnnouncerGUID))
  4660. +                        {
  4661. +                            pAnnouncer->GetMotionMaster()->MovePoint(0,748.309f, 619.487f, 411.171f);
  4662. +                            pAnnouncer->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
  4663. +                            pAnnouncer->SummonGameObject(instance->IsHeroic()? GO_EADRIC_LOOT_H : GO_EADRIC_LOOT,746.59f, 618.49f, 411.09f, 1.42f, 0, 0, 0, 0,90000000);
  4664. +                        }
  4665. +                    }
  4666. +                    break;
  4667. +                case DATA_AGRO_DONE:
  4668. +                    uiAggroDone = uiData;
  4669. +                    if (Creature* pAnnouncer = instance->GetCreature(uiAnnouncerGUID))
  4670. +                    {  
  4671. +                        pAnnouncer->SetVisible(false);                          
  4672.                      }
  4673.                      break;
  4674.                  case BOSS_ARGENT_CHALLENGE_P:
  4675.                      m_auiEncounter[2] = uiData;
  4676. -                    if (Creature* pAnnouncer = instance->GetCreature(uiAnnouncerGUID))
  4677. +                    if (uiData == IN_PROGRESS)
  4678.                      {
  4679. -                        pAnnouncer->GetMotionMaster()->MovePoint(0, 748.309f, 619.487f, 411.171f);
  4680. -                        pAnnouncer->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
  4681. -                        pAnnouncer->SummonGameObject(instance->IsHeroic()? GO_PALETRESS_LOOT_H : GO_PALETRESS_LOOT, 746.59f, 618.49f, 411.09f, 1.42f, 0, 0, 0, 0, 90000);
  4682. +                        for(GuidList::const_iterator itr = VehicleList.begin(); itr != VehicleList.end(); ++itr)
  4683. +                            if (Creature* pSummon = instance->GetCreature(*itr))
  4684. +                                pSummon->RemoveFromWorld();
  4685. +                    } else if (uiData == DONE)
  4686. +                    {
  4687. +                        if (Creature* pAnnouncer = instance->GetCreature(uiAnnouncerGUID))
  4688. +                        {
  4689. +                            pAnnouncer->GetMotionMaster()->MovePoint(0,748.309f, 619.487f, 411.171f);
  4690. +                            pAnnouncer->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
  4691. +                            pAnnouncer->SummonGameObject(instance->IsHeroic()? GO_PALETRESS_LOOT_H : GO_PALETRESS_LOOT,746.59f, 618.49f, 411.09f, 1.42f, 0, 0, 0, 0,90000000);
  4692. +                        }
  4693.                      }
  4694.                      break;
  4695. +                case BOSS_BLACK_KNIGHT:
  4696. +                    if (uiData == DONE)
  4697. +                        events.ScheduleEvent(EVENT_OUTRO_1, 4000);
  4698. +                    break;
  4699.              }
  4700.  
  4701.              if (uiData == DONE)
  4702.                  SaveToDB();
  4703.          }
  4704.  
  4705. -        uint32 GetData(uint32 uiData) const override
  4706. +        uint32 GetData(uint32 uiData) const
  4707.          {
  4708. -            switch (uiData)
  4709. +            switch(uiData)
  4710.              {
  4711.                  case BOSS_GRAND_CHAMPIONS:  return m_auiEncounter[0];
  4712.                  case BOSS_ARGENT_CHALLENGE_E: return m_auiEncounter[1];
  4713. @@ -232,6 +381,7 @@ public:
  4714.  
  4715.                  case DATA_MOVEMENT_DONE: return uiMovementDone;
  4716.                  case DATA_ARGENT_SOLDIER_DEFEATED: return uiArgentSoldierDeaths;
  4717. +                case DATA_TEAM_IN_INSTANCE: return TeamInInstance;
  4718.              }
  4719.  
  4720.              return 0;
  4721. @@ -239,10 +389,14 @@ public:
  4722.  
  4723.          ObjectGuid GetGuidData(uint32 uiData) const override
  4724.          {
  4725. -            switch (uiData)
  4726. +            switch(uiData)
  4727.              {
  4728.                  case DATA_ANNOUNCER: return uiAnnouncerGUID;
  4729. +                case DATA_ARGENT_CHAMPION: return uiArgentChampionGUID;
  4730. +                case DATA_BLACK_KNIGHT: return blackknightGUID;
  4731. +                case DATA_HIGHLORD:  return uiHighlordGUID;
  4732.                  case DATA_MAIN_GATE: return uiMainGateGUID;
  4733. +                case DATA_MAIN_GATE1: return uiMainGate1GUID;
  4734.  
  4735.                  case DATA_GRAND_CHAMPION_1: return uiGrandChampion1GUID;
  4736.                  case DATA_GRAND_CHAMPION_2: return uiGrandChampion2GUID;
  4737. @@ -254,7 +408,7 @@ public:
  4738.  
  4739.          void SetGuidData(uint32 uiType, ObjectGuid uiData) override
  4740.          {
  4741. -            switch (uiType)
  4742. +            switch(uiType)
  4743.              {
  4744.                  case DATA_GRAND_CHAMPION_1:
  4745.                      uiGrandChampion1GUID = uiData;
  4746. @@ -268,18 +422,18 @@ public:
  4747.              }
  4748.          }
  4749.  
  4750. -        std::string GetSaveData() override
  4751. +        std::string GetSaveData()
  4752.          {
  4753.              OUT_SAVE_INST_DATA;
  4754.  
  4755.              std::ostringstream saveStream;
  4756.  
  4757.              saveStream << "T C " << m_auiEncounter[0]
  4758. -                << ' ' << m_auiEncounter[1]
  4759. -                << ' ' << m_auiEncounter[2]
  4760. -                << ' ' << m_auiEncounter[3]
  4761. -                << ' ' << uiGrandChampionsDeaths
  4762. -                << ' ' << uiMovementDone;
  4763. +                << " " << m_auiEncounter[1]
  4764. +                << " " << m_auiEncounter[2]
  4765. +                << " " << m_auiEncounter[3]
  4766. +                << " " << uiGrandChampionsDeaths
  4767. +                << " " << uiMovementDone;
  4768.  
  4769.              str_data = saveStream.str();
  4770.  
  4771. @@ -287,7 +441,7 @@ public:
  4772.              return str_data;
  4773.          }
  4774.  
  4775. -        void Load(const char* in) override
  4776. +        void Load(const char* in)
  4777.          {
  4778.              if (!in)
  4779.              {
  4780. @@ -310,7 +464,7 @@ public:
  4781.                  m_auiEncounter[2] = data2;
  4782.                  m_auiEncounter[3] = data3;
  4783.  
  4784. -                for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
  4785. +                for(uint8 i = 0; i < MAX_ENCOUNTER; ++i)
  4786.                      if (m_auiEncounter[i] == IN_PROGRESS)
  4787.                          m_auiEncounter[i] = NOT_STARTED;
  4788.  
  4789. @@ -320,11 +474,62 @@ public:
  4790.  
  4791.              OUT_LOAD_INST_DATA_COMPLETE;
  4792.          }
  4793. +
  4794. +        void Update(uint32 uiDiff) override
  4795. +        {
  4796. +            events.Update(uiDiff);
  4797. +
  4798. +            while (uint32 eventId = events.ExecuteEvent())
  4799. +            {
  4800. +                switch (eventId)
  4801. +                {
  4802. +                    case EVENT_OUTRO_1:
  4803. +                        if (Creature* tirion = instance->GetCreature(uiHighlordGUID))
  4804. +                            tirion->AI()->Talk(SAY_OUTRO_1_TIRION);
  4805. +                        events.ScheduleEvent(EVENT_OUTRO_2, 5000);
  4806. +                        break;
  4807. +                    case EVENT_OUTRO_2:
  4808. +                        if (Creature* tirion = instance->GetCreature(uiHighlordGUID))
  4809. +                            tirion->AI()->Talk(SAY_OUTRO_2_TIRION);
  4810. +                        events.ScheduleEvent(EVENT_OUTRO_3, 5000);
  4811. +                        break;
  4812. +                    case EVENT_OUTRO_3:
  4813. +                        if (GetData(DATA_TEAM_IN_INSTANCE) == HORDE)
  4814. +                        {
  4815. +                            if (Creature* thrall = instance->GetCreature(uiThrallGUID))
  4816. +                                thrall->AI()->Talk(SAY_OUTRO_3_HORDE);
  4817. +                        }
  4818. +                        else
  4819. +                            if (Creature* varian = instance->GetCreature(uiVarianGUID))
  4820. +                                varian->AI()->Talk(SAY_OUTRO_3_ALLY);
  4821. +                        break;
  4822. +                }
  4823. +            }
  4824. +        }
  4825.      };
  4826.  
  4827.  };
  4828.  
  4829. +void HandleSpellOnPlayersInInstanceToC5(Unit* caller, uint32 spellId)
  4830. +{
  4831. +    if (spellId <= 0 || !caller)
  4832. +        return;
  4833. +
  4834. +    Map* map = caller->GetMap();
  4835. +    if (map && map->IsDungeon())
  4836. +    {
  4837. +        Map::PlayerList const &PlayerList = map->GetPlayers();
  4838. +
  4839. +        if (PlayerList.isEmpty())
  4840. +            return;
  4841. +
  4842. +        for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
  4843. +            if (i->GetSource() && i->GetSource()->IsAlive() && !i->GetSource()->IsGameMaster())
  4844. +                caller->CastSpell(i->GetSource(), spellId);
  4845. +    }
  4846. +}
  4847. +
  4848.  void AddSC_instance_trial_of_the_champion()
  4849.  {
  4850.      new instance_trial_of_the_champion();
  4851. -}
  4852. +}
  4853. \ No newline at end of file
  4854. diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp
  4855. index 96dc372..58c6dcb 100644
  4856. --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp
  4857. +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp
  4858. @@ -1,5 +1,6 @@
  4859.  /*
  4860.   * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
  4861.   *
  4862.   * This program is free software; you can redistribute it and/or modify it
  4863.   * under the terms of the GNU General Public License as published by the
  4864. @@ -15,124 +16,266 @@
  4865.   * with this program. If not, see <http://www.gnu.org/licenses/>.
  4866.   */
  4867.  
  4868. -/* ScriptData
  4869. -SDName: Trial Of the Champion
  4870. -SD%Complete:
  4871. -SDComment:
  4872. -SDCategory: trial_of_the_champion
  4873. -EndScriptData */
  4874. -
  4875. -/* ContentData
  4876. -npc_announcer_toc5
  4877. -EndContentData */
  4878. -
  4879. -#include "ScriptMgr.h"
  4880. -#include "ScriptedCreature.h"
  4881. -#include "ScriptedGossip.h"
  4882. +#include "ScriptPCH.h"
  4883.  #include "trial_of_the_champion.h"
  4884.  #include "Vehicle.h"
  4885.  #include "Player.h"
  4886.  
  4887. -enum Yells
  4888. -{
  4889. -    SAY_INTRO_1         = 0,
  4890. -    SAY_INTRO_2         = 1,
  4891. -    SAY_INTRO_3         = 2,
  4892. -    SAY_AGGRO           = 3,
  4893. -    SAY_PHASE_2         = 4,
  4894. -    SAY_PHASE_3         = 5,
  4895. -    SAY_KILL_PLAYER     = 6,
  4896. -    SAY_DEATH           = 7
  4897. -};
  4898. -
  4899. -#define GOSSIP_START_EVENT1     "I'm ready to start challenge."
  4900. -#define GOSSIP_START_EVENT2     "I'm ready for the next challenge."
  4901. +#define GOSSIP_START_EVENT1     "Я готов начать испытание."
  4902. +#define GOSSIP_START_EVENT2     "Я готов к следующему испытанию."
  4903.  
  4904.  #define ORIENTATION             4.714f
  4905.  
  4906.  /*######
  4907. -## npc_announcer_toc5
  4908. +## npc_herald_toc5
  4909.  ######*/
  4910.  
  4911. -const Position SpawnPosition = {746.261f, 657.401f, 411.681f, 4.65f};
  4912. +const Position SpawnPosition  = {746.843f, 695.68f, 412.339f, 4.70776f};
  4913. +const Position SpawnPosition1 = {746.71f, 661.02f, 411.69f, 4.66995f};
  4914.  
  4915. -class npc_announcer_toc5 : public CreatureScript
  4916. +enum Texts
  4917.  {
  4918. -public:
  4919. -    npc_announcer_toc5() : CreatureScript("npc_announcer_toc5") { }
  4920. +    // Starts when you enter toc
  4921. +    SAY_INTRO_HERALD_1          = 27,
  4922. +    SAY_INTRO_HERALD_2          = 50,
  4923. +    H_SAY_INTRO_HERALD_3        = 0,
  4924. +    A_SAY_INTRO_HERALD_3        = 50,
  4925. +    H_SAY_INTRO_HERALD_4        = 50,
  4926. +    A_SAY_INTRO_HERALD_4        = 10,
  4927. +    SAY_INTRO_HERALD_5          = 52,
  4928. +    H_SAY_INTRO_HERALD_6        = 11,
  4929. +    A_SAY_INTRO_HERALD_6        = 2,
  4930. +    SAY_INTRO_HERALD_7          = 51,
  4931. +
  4932. +    //  Horde - Announcing the fighters
  4933. +    H_SAY_WARRIOR_ENTERS          = 6,
  4934. +    H_SAY_MAGE_ENTERS             = 5,
  4935. +    H_SAY_SHAMAN_ENTERS           = 3,
  4936. +    H_SAY_ROGUE_ENTERS            = 7,
  4937. +
  4938. +    //  Alliance - Announcing the fighters
  4939. +    A_SAY_WARRIOR_ENTERS          = 5,
  4940. +    A_SAY_MAGE_ENTERS             = 3,
  4941. +    A_SAY_SHAMAN_ENTERS           = 7,
  4942. +    A_SAY_ROGUE_ENTERS            = 6,
  4943. +
  4944. +    // Shared emotes - announcer
  4945. +    SAY_WARRIOR_CHEER           = 20,
  4946. +    SAY_MAGE_CHEER              = 21,
  4947. +    SAY_SHAMAN_CHEER            = 22,
  4948. +    SAY_HUNTER_CHEER            = 23,
  4949. +    SAY_ROGUE_CHEER             = 24,
  4950. +    SAY_HUNTER_ENTERS           = 4,
  4951. +
  4952. +    // Argent Champion
  4953. +    SAY_ARGENT_CHAMP_ENTERS     = 53,
  4954. +    SAY_PALETRESS_INTRO_1       = 1,
  4955. +    SAY_PALETRESS_INTRO_2       = 25,
  4956. +    SAY_PALETRESS_INTRO_3       = 0,
  4957. +    SAY_PALETRESS_INTRO_4       = 1,
  4958. +    SAY_EADRIC_INTRO_1          = 0,
  4959. +    SAY_EADRIC_INTRO_2          = 26,
  4960. +    SAY_EADRIC_INTRO_3          = 0,
  4961. +
  4962. +    // Black Knight
  4963. +    SAY_INTRO_BLACK_KNIGHT_TIRION   = 55,
  4964. +    SAY_HERALD_RAFTERS              = 8
  4965. +};
  4966. +
  4967. +enum Gossip
  4968. +{
  4969. +    GOSSIP_NOT_MOUNTED_A  = 14757,
  4970. +    GOSSIP_NOT_MOUNTED_H  = 15043
  4971. +};
  4972. +
  4973. +enum Events
  4974. +{
  4975. +    EVENT_INTRO_1               = 1,
  4976. +    EVENT_INTRO_2               = 2,
  4977. +    EVENT_INTRO_3               = 3,
  4978. +    EVENT_INTRO_4               = 4,
  4979. +    EVENT_INTRO_5               = 5,
  4980. +    EVENT_INTRO_6               = 6,
  4981. +    EVENT_INTRO_7               = 7,
  4982. +    EVENT_INTRO_8               = 8,
  4983. +    EVENT_SUMMON_FACTION_2      = 9,
  4984. +    EVENT_SUMMON_FACTION_3      = 10,
  4985. +    EVENT_AGGRO_FACTION         = 11,
  4986. +    EVENT_PALETRESS_1           = 12,
  4987. +    EVENT_PALETRESS_2           = 13,
  4988. +    EVENT_PALETRESS_3           = 14,
  4989. +    EVENT_EADRIC_1              = 15,
  4990. +    EVENT_EADRIC_2              = 16
  4991. +};
  4992. +
  4993. +enum Phases
  4994. +{
  4995. +    PHASE_INTRO                 = 1,
  4996. +    PHASE_INPROGRESS            = 2,
  4997. +
  4998. +    PHASE_INTRO_MASK            = 1 << PHASE_INTRO,
  4999. +    PHASE_INPROGRESS_MASK       = 2 << PHASE_INPROGRESS
  5000. +};
  5001. +
  5002. +enum Spells
  5003. +{
  5004. +    SPELL_FACE_BLACKKNIGHT                = 67482,
  5005. +    SPELL_HERALD_ARGENT                   = 64787
  5006. +};
  5007. +
  5008. +class npc_herald_toc5 : public CreatureScript
  5009. +{
  5010. +    public:
  5011. +        npc_herald_toc5(): CreatureScript("npc_herald_toc5") { }
  5012. +
  5013. +    bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
  5014. +    {
  5015. +        player->PlayerTalkClass->ClearMenus();
  5016. +        if (action == GOSSIP_ACTION_INFO_DEF + 1)
  5017. +        {
  5018. +            player->CLOSE_GOSSIP_MENU();
  5019. +            CAST_AI(npc_herald_toc5::npc_herald_toc5AI, creature->AI())->StartEncounter();
  5020. +        }
  5021.  
  5022. -    struct npc_announcer_toc5AI : public ScriptedAI
  5023. +        return true;
  5024. +    }
  5025. +        
  5026. +    bool OnGossipHello(Player* player, Creature* creature) override
  5027.      {
  5028. -        npc_announcer_toc5AI(Creature* creature) : ScriptedAI(creature)
  5029. +        InstanceScript* instance = creature->GetInstanceScript();
  5030. +
  5031. +        if (!player->GetVehicle() && instance->GetData(BOSS_GRAND_CHAMPIONS) == NOT_STARTED)
  5032. +        {
  5033. +            if (instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE)
  5034. +                player->SEND_GOSSIP_MENU(GOSSIP_NOT_MOUNTED_H, creature->GetGUID());
  5035. +            else
  5036. +                player->SEND_GOSSIP_MENU(GOSSIP_NOT_MOUNTED_A, creature->GetGUID());
  5037. +
  5038. +            return true;
  5039. +        }
  5040. +
  5041. +        else
  5042. +        {
  5043. +            if (instance &&
  5044. +                instance->GetData(BOSS_GRAND_CHAMPIONS) == DONE &&
  5045. +                instance->GetData(BOSS_BLACK_KNIGHT) == DONE &&
  5046. +                (instance->GetData(BOSS_ARGENT_CHALLENGE_E) == DONE ||
  5047. +                instance->GetData(BOSS_ARGENT_CHALLENGE_P) == DONE))
  5048. +
  5049. +                return false;
  5050. +
  5051. +            if (instance &&
  5052. +                instance->GetData(BOSS_GRAND_CHAMPIONS) == NOT_STARTED &&
  5053. +                instance->GetData(BOSS_ARGENT_CHALLENGE_E) == NOT_STARTED &&
  5054. +                instance->GetData(BOSS_ARGENT_CHALLENGE_P) == NOT_STARTED &&
  5055. +                instance->GetData(BOSS_BLACK_KNIGHT) == NOT_STARTED)
  5056. +                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_START_EVENT1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
  5057. +            else if (instance)
  5058. +                     player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_START_EVENT2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
  5059. +    
  5060. +            player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
  5061. +    
  5062. +            return true;
  5063. +        }
  5064. +    }
  5065. +
  5066. +    struct npc_herald_toc5AI : public ScriptedAI
  5067. +    {
  5068. +        npc_herald_toc5AI(Creature *creature) : ScriptedAI(creature)
  5069.          {
  5070.              instance = creature->GetInstanceScript();
  5071.  
  5072.              uiSummonTimes = 0;
  5073.              uiPosition = 0;
  5074.              uiLesserChampions = 0;
  5075. +            uiDefeatedGrandChampions = 0;
  5076.  
  5077.              uiFirstBoss = 0;
  5078.              uiSecondBoss = 0;
  5079.              uiThirdBoss = 0;
  5080.  
  5081. -            uiArgentChampion = 0;
  5082. +            ArgentChampion = 0;
  5083.  
  5084. -            uiPhase = 0;
  5085. -            uiTimer = 0;
  5086. +            Champion1List.clear();
  5087. +            Champion2List.clear();
  5088. +            Champion3List.clear();
  5089.  
  5090. -            me->SetReactState(REACT_PASSIVE);
  5091.              me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  5092.              me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
  5093. -
  5094.              SetGrandChampionsForEncounter();
  5095.              SetArgentChampion();
  5096.          }
  5097.  
  5098. +        EventMap events;
  5099.          InstanceScript* instance;
  5100. +        Creature* vehicle_black_knight;
  5101.  
  5102.          uint8 uiSummonTimes;
  5103.          uint8 uiPosition;
  5104.          uint8 uiLesserChampions;
  5105. +        uint8 uiIntroPhase;
  5106. +        uint8 uiDefeatedGrandChampions;
  5107.  
  5108. -        uint32 uiArgentChampion;
  5109. -
  5110. +        uint32 ArgentChampion;
  5111.          uint32 uiFirstBoss;
  5112.          uint32 uiSecondBoss;
  5113.          uint32 uiThirdBoss;
  5114.  
  5115. -        uint32 uiPhase;
  5116. -        uint32 uiTimer;
  5117. +        ObjectGuid thrallGUID;
  5118. +        ObjectGuid garroshGUID;
  5119. +        ObjectGuid varianGUID;
  5120. +        ObjectGuid proudmooreGUID;
  5121. +        ObjectGuid tirionGUID;
  5122.  
  5123. +        ObjectGuid BlackKnightGUID;
  5124.          ObjectGuid uiVehicle1GUID;
  5125.          ObjectGuid uiVehicle2GUID;
  5126.          ObjectGuid uiVehicle3GUID;
  5127. +        ObjectGuid GrandChampionBoss;
  5128.  
  5129.          GuidList Champion1List;
  5130.          GuidList Champion2List;
  5131.          GuidList Champion3List;
  5132.  
  5133. -        void NextStep(uint32 uiTimerStep, bool bNextStep = true, uint8 uiPhaseStep = 0)
  5134. +        bool _introDone;
  5135. +
  5136. +        void Reset() override
  5137.          {
  5138. -            uiTimer = uiTimerStep;
  5139. -            if (bNextStep)
  5140. -                ++uiPhase;
  5141. -            else
  5142. -                uiPhase = uiPhaseStep;
  5143. +            _introDone = false;
  5144. +            me->SetFlag(UNIT_FIELD_FLAGS, UNIT_NPC_FLAG_GOSSIP);
  5145.          }
  5146.  
  5147. -        void SetData(uint32 uiType, uint32 /*uiData*/) override
  5148. +        void MoveInLineOfSight(Unit* who) override
  5149. +        {
  5150. +            if (!_introDone && (instance->GetData(BOSS_GRAND_CHAMPIONS) != DONE && instance->GetData(BOSS_GRAND_CHAMPIONS) != FAIL) && me->IsWithinDistInMap(who, 75.0f))
  5151. +            {
  5152. +                _introDone = true;
  5153. +                me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
  5154. +                
  5155. +                events.SetPhase(PHASE_INTRO);
  5156. +                events.ScheduleEvent(EVENT_INTRO_1, 10000, 0, PHASE_INTRO);
  5157. +
  5158. +                SummonNpcs();
  5159. +            }
  5160. +        }
  5161. +
  5162. +        void SetData(uint32 uiType, uint32 uiData) override
  5163.          {
  5164.              switch (uiType)
  5165.              {
  5166.                  case DATA_START:
  5167. +                    if (GameObject* pGO = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_MAIN_GATE)))
  5168. +                        instance->HandleGameObject(pGO->GetGUID(),true);
  5169. +                    if (GameObject* pGO = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_MAIN_GATE1)))
  5170. +                        instance->HandleGameObject(pGO->GetGUID(),false);
  5171.                      DoSummonGrandChampion(uiFirstBoss);
  5172. -                    NextStep(10000, false, 1);
  5173. +                    events.ScheduleEvent(EVENT_SUMMON_FACTION_2, 10000, 0, PHASE_INPROGRESS);
  5174.                      break;
  5175. -                case DATA_IN_POSITION: //movement done.
  5176. -                    me->GetMotionMaster()->MovePoint(1, 735.81f, 661.92f, 412.39f);
  5177. -                    if (GameObject* go = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_MAIN_GATE)))
  5178. -                        instance->HandleGameObject(go->GetGUID(), false);
  5179. -                    NextStep(10000, false, 3);
  5180. +                case DATA_IN_POSITION:
  5181. +                    me->GetMotionMaster()->MovePoint(1, 735.898f, 651.961f, 411.93f);
  5182. +                    if (GameObject* pGO = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_MAIN_GATE)))
  5183. +                        instance->HandleGameObject(pGO->GetGUID(),false);
  5184. +                    events.ScheduleEvent(EVENT_AGGRO_FACTION, 15000, 0, PHASE_INPROGRESS);
  5185.                      break;
  5186.                  case DATA_LESSER_CHAMPIONS_DEFEATED:
  5187.                  {
  5188. @@ -140,7 +283,7 @@ public:
  5189.                      GuidList TempList;
  5190.                      if (uiLesserChampions == 3 || uiLesserChampions == 6)
  5191.                      {
  5192. -                        switch (uiLesserChampions)
  5193. +                        switch(uiLesserChampions)
  5194.                          {
  5195.                              case 3:
  5196.                                  TempList = Champion2List;
  5197. @@ -150,17 +293,49 @@ public:
  5198.                                  break;
  5199.                          }
  5200.  
  5201. -                        for (GuidList::const_iterator itr = TempList.begin(); itr != TempList.end(); ++itr)
  5202. +                        for(GuidList::const_iterator itr = TempList.begin(); itr != TempList.end(); ++itr)
  5203.                              if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr))
  5204.                                  AggroAllPlayers(summon);
  5205. -                    }else if (uiLesserChampions == 9)
  5206. +                    } else if (uiLesserChampions == 9)
  5207.                          StartGrandChampionsAttack();
  5208. -
  5209.                      break;
  5210.                  }
  5211. +                case DATA_GRAND_CHAMPIONS_DEFEATED:
  5212. +                    uiDefeatedGrandChampions = uiData;
  5213. +                    if (uiDefeatedGrandChampions == 3)
  5214. +                    {
  5215. +                        for (uint8 i = 0; i < 3; ++i)
  5216. +                            if (Creature* GrandChampion = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_GRAND_CHAMPION_1 + i)))
  5217. +                            {
  5218. +                                switch (i)
  5219. +                                {
  5220. +                                    case 0:
  5221. +                                        GrandChampion->SetHomePosition(739.678f, 662.541f, 412.393f, 4.6f);
  5222. +                                        break;
  5223. +                                    case 1:
  5224. +                                        GrandChampion->SetHomePosition(746.71f, 661.02f, 411.69f, 4.6f);
  5225. +                                        break;
  5226. +                                    case 2:
  5227. +                                        GrandChampion->SetHomePosition(754.34f, 660.70f, 412.39f, 4.6f);
  5228. +                                        break;
  5229. +                                }
  5230. +                                GrandChampion->AI()->SetData(10, 0);
  5231. +                            }
  5232. +
  5233. +                        instance->SetData(BOSS_GRAND_CHAMPIONS, IN_PROGRESS);
  5234. +                    }
  5235. +                    break;
  5236.              }
  5237.          }
  5238.  
  5239. +        uint32 GetData(uint32 type)
  5240. +        {
  5241. +            if (type == DATA_GRAND_CHAMPIONS_DEFEATED)
  5242. +                return uiDefeatedGrandChampions;
  5243. +
  5244. +            return 0;
  5245. +        }
  5246. +
  5247.          void StartGrandChampionsAttack()
  5248.          {
  5249.              Creature* pGrandChampion1 = ObjectAccessor::GetCreature(*me, uiVehicle1GUID);
  5250. @@ -175,15 +350,46 @@ public:
  5251.              }
  5252.          }
  5253.  
  5254. -        void MovementInform(uint32 uiType, uint32 uiPointId) override
  5255. +        void MovementInform(uint32 uiType, uint32 uiPointId) override
  5256.          {
  5257.              if (uiType != POINT_MOTION_TYPE)
  5258.                  return;
  5259.  
  5260.              if (uiPointId == 1)
  5261. -                me->SetFacingTo(ORIENTATION);
  5262. +            {
  5263. +                me->SetOrientation(ORIENTATION);
  5264. +                me->SendMovementFlagUpdate();
  5265. +            }
  5266. +        }
  5267. +
  5268. +        void JustSummoned(Creature* summon) override
  5269. +        {
  5270. +            if (instance && instance->GetData(BOSS_GRAND_CHAMPIONS) == NOT_STARTED)
  5271. +            {
  5272. +                summon->SetFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_NON_ATTACKABLE);
  5273. +                summon->SetReactState(REACT_PASSIVE);
  5274. +            }
  5275.          }
  5276.  
  5277. +        void SummonedCreatureDespawn(Creature* summon) override
  5278. +        {
  5279. +            switch(summon->GetEntry())
  5280. +            {
  5281. +                case VEHICLE_DARNASSIA_NIGHTSABER:
  5282. +                case VEHICLE_EXODAR_ELEKK:
  5283. +                case VEHICLE_STORMWIND_STEED:
  5284. +                case VEHICLE_GNOMEREGAN_MECHANOSTRIDER:
  5285. +                case VEHICLE_IRONFORGE_RAM:
  5286. +                case VEHICLE_FORSAKE_WARHORSE:
  5287. +                case VEHICLE_THUNDER_BLUFF_KODO:
  5288. +                case VEHICLE_ORGRIMMAR_WOLF:
  5289. +                case VEHICLE_SILVERMOON_HAWKSTRIDER:
  5290. +                case VEHICLE_DARKSPEAR_RAPTOR:
  5291. +                    me->AI()->SetData(DATA_LESSER_CHAMPIONS_DEFEATED, 0);
  5292. +                    break;
  5293. +            }
  5294. +        }
  5295. +        
  5296.          void DoSummonGrandChampion(uint32 uiBoss)
  5297.          {
  5298.              ++uiSummonTimes;
  5299. @@ -192,22 +398,44 @@ public:
  5300.              switch (uiBoss)
  5301.              {
  5302.                  case 0:
  5303. +                    if (instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE)
  5304. +                        Talk(H_SAY_WARRIOR_ENTERS);
  5305. +                    else
  5306. +                        Talk(A_SAY_WARRIOR_ENTERS);
  5307. +                    Talk(SAY_WARRIOR_CHEER);
  5308.                      VEHICLE_TO_SUMMON1 = VEHICLE_MOKRA_SKILLCRUSHER_MOUNT;
  5309.                      VEHICLE_TO_SUMMON2 = VEHICLE_ORGRIMMAR_WOLF;
  5310.                      break;
  5311.                  case 1:
  5312. +                    if (instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE)
  5313. +                        Talk(H_SAY_MAGE_ENTERS);
  5314. +                    else
  5315. +                        Talk(A_SAY_MAGE_ENTERS);
  5316. +                    Talk(SAY_MAGE_CHEER);
  5317.                      VEHICLE_TO_SUMMON1 = VEHICLE_ERESSEA_DAWNSINGER_MOUNT;
  5318.                      VEHICLE_TO_SUMMON2 = VEHICLE_SILVERMOON_HAWKSTRIDER;
  5319.                      break;
  5320.                  case 2:
  5321. +                    if (instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE)
  5322. +                        Talk(H_SAY_SHAMAN_ENTERS);
  5323. +                    else
  5324. +                        Talk(A_SAY_SHAMAN_ENTERS);
  5325. +                    Talk(SAY_SHAMAN_CHEER);
  5326.                      VEHICLE_TO_SUMMON1 = VEHICLE_RUNOK_WILDMANE_MOUNT;
  5327.                      VEHICLE_TO_SUMMON2 = VEHICLE_THUNDER_BLUFF_KODO;
  5328.                      break;
  5329.                  case 3:
  5330. +                    Talk(SAY_HUNTER_ENTERS);
  5331. +                    Talk(SAY_HUNTER_CHEER);
  5332.                      VEHICLE_TO_SUMMON1 = VEHICLE_ZUL_TORE_MOUNT;
  5333.                      VEHICLE_TO_SUMMON2 = VEHICLE_DARKSPEAR_RAPTOR;
  5334.                      break;
  5335.                  case 4:
  5336. +                    if (instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE)
  5337. +                        Talk(H_SAY_ROGUE_ENTERS);
  5338. +                    else
  5339. +                        Talk(A_SAY_ROGUE_ENTERS);
  5340. +                    Talk(SAY_ROGUE_CHEER);
  5341.                      VEHICLE_TO_SUMMON1 = VEHICLE_DEATHSTALKER_VESCERI_MOUNT;
  5342.                      VEHICLE_TO_SUMMON2 = VEHICLE_FORSAKE_WARHORSE;
  5343.                      break;
  5344. @@ -215,43 +443,55 @@ public:
  5345.                      return;
  5346.              }
  5347.  
  5348. -            if (Creature* pBoss = me->SummonCreature(VEHICLE_TO_SUMMON1, SpawnPosition))
  5349. +            if (Creature* pBoss = me->SummonCreature(VEHICLE_TO_SUMMON1,SpawnPosition))
  5350.              {
  5351. -                switch (uiSummonTimes)
  5352. +                switch(uiSummonTimes)
  5353.                  {
  5354.                      case 1:
  5355.                      {
  5356.                          uiVehicle1GUID = pBoss->GetGUID();
  5357. -                        ObjectGuid uiGrandChampionBoss1;
  5358. -                        if (Vehicle* pVehicle = pBoss->GetVehicleKit())
  5359. -                            if (Unit* unit = pVehicle->GetPassenger(0))
  5360. -                                uiGrandChampionBoss1 = unit->GetGUID();
  5361. -                        instance->SetGuidData(DATA_GRAND_CHAMPION_VEHICLE_1, uiVehicle1GUID);
  5362. -                        instance->SetGuidData(DATA_GRAND_CHAMPION_1, uiGrandChampionBoss1);
  5363. -                        pBoss->AI()->SetData(1, 0);
  5364. +                        uint64 uiGrandChampionBoss1 = 0;
  5365. +                        if (Creature* pBoss = ObjectAccessor::GetCreature(*me, uiVehicle1GUID))
  5366. +                            if (Vehicle* pVehicle = pBoss->GetVehicleKit())
  5367. +                                if (Unit* pUnit = pVehicle->GetPassenger(0))
  5368. +                                    uiGrandChampionBoss1 = pUnit->GetGUID();
  5369. +                        if (instance)
  5370. +                        {
  5371. +                            instance->SetData64(DATA_GRAND_CHAMPION_VEHICLE_1, uiVehicle1GUID);
  5372. +                            instance->SetData64(DATA_GRAND_CHAMPION_1, uiGrandChampionBoss1);
  5373. +                        }
  5374. +                        pBoss->AI()->SetData(1,0);
  5375.                          break;
  5376.                      }
  5377.                      case 2:
  5378.                      {
  5379.                          uiVehicle2GUID = pBoss->GetGUID();
  5380. -                        ObjectGuid uiGrandChampionBoss2;
  5381. -                        if (Vehicle* pVehicle = pBoss->GetVehicleKit())
  5382. -                            if (Unit* unit = pVehicle->GetPassenger(0))
  5383. -                                uiGrandChampionBoss2 = unit->GetGUID();
  5384. -                        instance->SetGuidData(DATA_GRAND_CHAMPION_VEHICLE_2, uiVehicle2GUID);
  5385. -                        instance->SetGuidData(DATA_GRAND_CHAMPION_2, uiGrandChampionBoss2);
  5386. +                        uint64 uiGrandChampionBoss2 = 0;
  5387. +                        if (Creature* pBoss = ObjectAccessor::GetCreature(*me, uiVehicle2GUID))
  5388. +                            if (Vehicle* pVehicle = pBoss->GetVehicleKit())
  5389. +                                if (Unit* pUnit = pVehicle->GetPassenger(0))
  5390. +                                    uiGrandChampionBoss2 = pUnit->GetGUID();
  5391. +                        if (instance)
  5392. +                        {
  5393. +                            instance->SetData64(DATA_GRAND_CHAMPION_VEHICLE_2, uiVehicle2GUID);
  5394. +                            instance->SetData64(DATA_GRAND_CHAMPION_2, uiGrandChampionBoss2);
  5395. +                        }
  5396.                          pBoss->AI()->SetData(2, 0);
  5397.                          break;
  5398.                      }
  5399.                      case 3:
  5400.                      {
  5401.                          uiVehicle3GUID = pBoss->GetGUID();
  5402. -                        ObjectGuid uiGrandChampionBoss3;
  5403. -                        if (Vehicle* pVehicle = pBoss->GetVehicleKit())
  5404. -                            if (Unit* unit = pVehicle->GetPassenger(0))
  5405. -                                uiGrandChampionBoss3 = unit->GetGUID();
  5406. -                        instance->SetGuidData(DATA_GRAND_CHAMPION_VEHICLE_3, uiVehicle3GUID);
  5407. -                        instance->SetGuidData(DATA_GRAND_CHAMPION_3, uiGrandChampionBoss3);
  5408. +                        uint64 uiGrandChampionBoss3 = 0;
  5409. +                        if (Creature* pBoss = ObjectAccessor::GetCreature(*me, uiVehicle3GUID))
  5410. +                            if (Vehicle* pVehicle = pBoss->GetVehicleKit())
  5411. +                                if (Unit* pUnit = pVehicle->GetPassenger(0))
  5412. +                                    uiGrandChampionBoss3 = pUnit->GetGUID();
  5413. +                        if (instance)
  5414. +                        {
  5415. +                            instance->SetData64(DATA_GRAND_CHAMPION_VEHICLE_3, uiVehicle3GUID);
  5416. +                            instance->SetData64(DATA_GRAND_CHAMPION_3, uiGrandChampionBoss3);
  5417. +                        }
  5418.                          pBoss->AI()->SetData(3, 0);
  5419.                          break;
  5420.                      }
  5421. @@ -261,7 +501,7 @@ public:
  5422.  
  5423.                  for (uint8 i = 0; i < 3; ++i)
  5424.                  {
  5425. -                    if (Creature* pAdd = me->SummonCreature(VEHICLE_TO_SUMMON2, SpawnPosition, TEMPSUMMON_CORPSE_DESPAWN))
  5426. +                    if (Creature* pAdd = me->SummonCreature(VEHICLE_TO_SUMMON2,SpawnPosition,TEMPSUMMON_CORPSE_DESPAWN))
  5427.                      {
  5428.                          switch (uiSummonTimes)
  5429.                          {
  5430. @@ -279,95 +519,130 @@ public:
  5431.                          switch (i)
  5432.                          {
  5433.                              case 0:
  5434. -                                pAdd->GetMotionMaster()->MoveFollow(pBoss, 2.0f, float(M_PI));
  5435. +                                pAdd->GetMotionMaster()->MoveFollow(pBoss, 2.5f, M_PI);
  5436.                                  break;
  5437.                              case 1:
  5438. -                                pAdd->GetMotionMaster()->MoveFollow(pBoss, 2.0f, float(M_PI) / 2);
  5439. +                                pAdd->GetMotionMaster()->MoveFollow(pBoss, 2.5f, M_PI / 2);
  5440.                                  break;
  5441.                              case 2:
  5442. -                                pAdd->GetMotionMaster()->MoveFollow(pBoss, 2.0f, float(M_PI) / 2 + float(M_PI));
  5443. +                                pAdd->GetMotionMaster()->MoveFollow(pBoss, 2.5f, M_PI / 2 + M_PI);
  5444.                                  break;
  5445.                          }
  5446.                      }
  5447. -
  5448.                  }
  5449.              }
  5450.          }
  5451.  
  5452.          void DoStartArgentChampionEncounter()
  5453.          {
  5454. -            me->GetMotionMaster()->MovePoint(1, 735.81f, 661.92f, 412.39f);
  5455. +            if (Creature* tirion = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_HIGHLORD)))
  5456. +                tirion->AI()->Talk(SAY_ARGENT_CHAMP_ENTERS);
  5457. +
  5458. +            if (ArgentChampion == NPC_PALETRESS)
  5459. +                events.ScheduleEvent(EVENT_PALETRESS_1, 5000);
  5460. +            else
  5461. +                events.ScheduleEvent(EVENT_EADRIC_1, 5000);
  5462.  
  5463. -            if (me->SummonCreature(uiArgentChampion, SpawnPosition))
  5464. +            if (Creature* pBoss = me->SummonCreature(ArgentChampion,SpawnPosition))
  5465.              {
  5466. +                pBoss->GetMotionMaster()->MovePoint(1,746.71f,661.02f,411.69f);
  5467.                  for (uint8 i = 0; i < 3; ++i)
  5468.                  {
  5469. -                    if (Creature* pTrash = me->SummonCreature(NPC_ARGENT_LIGHWIELDER, SpawnPosition))
  5470. -                        pTrash->AI()->SetData(i, 0);
  5471. -                    if (Creature* pTrash = me->SummonCreature(NPC_ARGENT_MONK, SpawnPosition))
  5472. -                        pTrash->AI()->SetData(i, 0);
  5473. -                    if (Creature* pTrash = me->SummonCreature(NPC_PRIESTESS, SpawnPosition))
  5474. -                        pTrash->AI()->SetData(i, 0);
  5475. +                    if (Creature* pTrash = me->SummonCreature(NPC_ARGENT_LIGHWIELDER,SpawnPosition))
  5476. +                        pTrash->AI()->SetData(i,0);
  5477. +                    if (Creature* pTrash = me->SummonCreature(NPC_ARGENT_MONK,SpawnPosition))
  5478. +                        pTrash->AI()->SetData(i,0);
  5479. +                    if (Creature* pTrash = me->SummonCreature(NPC_PRIESTESS,SpawnPosition))
  5480. +                        pTrash->AI()->SetData(i,0);
  5481.                  }
  5482.              }
  5483.          }
  5484. +        
  5485. +        void DoAction(int32 actionID)
  5486. +        {
  5487. +            if (actionID == ACTION_RESET_BLACK_KNIGHT)
  5488. +                StartEncounter();
  5489. +        }
  5490. +
  5491. +        void EnterCombat(Unit* /*who*/) override
  5492. +        {
  5493. +            me->SetReactState(REACT_PASSIVE);
  5494. +            if (Creature* pGhoul = me->SummonCreature(NPC_RISEN_JAEREN, 742.835f, 639.134f, 411.571f, 1.05731f))
  5495. +            {
  5496. +                pGhoul->setFaction(14);
  5497. +            }
  5498. +            if (instance)
  5499. +                instance->SetData(DATA_AGRO_DONE,DONE);
  5500. +        }
  5501.  
  5502.          void SetGrandChampionsForEncounter()
  5503.          {
  5504. -            uiFirstBoss = urand(0, 4);
  5505. +            uiFirstBoss = urand(0,4);
  5506.  
  5507. -            while (uiSecondBoss == uiFirstBoss || uiThirdBoss == uiFirstBoss || uiThirdBoss == uiSecondBoss)
  5508. +            while(uiSecondBoss == uiFirstBoss || uiThirdBoss == uiFirstBoss || uiThirdBoss == uiSecondBoss)
  5509.              {
  5510. -                uiSecondBoss = urand(0, 4);
  5511. -                uiThirdBoss = urand(0, 4);
  5512. +                uiSecondBoss = urand(0,4);
  5513. +                uiThirdBoss = urand(0,4);
  5514.              }
  5515.          }
  5516.  
  5517.          void SetArgentChampion()
  5518.          {
  5519. -           uint8 uiTempBoss = urand(0, 1);
  5520. +           uint8 uiTempBoss = urand(0,1);
  5521.  
  5522. -           switch (uiTempBoss)
  5523. -           {
  5524. +            switch(uiTempBoss)
  5525. +            {
  5526.                  case 0:
  5527. -                    uiArgentChampion = NPC_EADRIC;
  5528. +                    ArgentChampion = NPC_EADRIC;
  5529.                      break;
  5530.                  case 1:
  5531. -                    uiArgentChampion = NPC_PALETRESS;
  5532. +                    ArgentChampion = NPC_PALETRESS;
  5533.                      break;
  5534. -           }
  5535. +            }
  5536.          }
  5537.  
  5538.          void StartEncounter()
  5539.          {
  5540. +            if (!instance)
  5541. +                return;
  5542. +
  5543.              me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
  5544. +            if (GameObject* pGO = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_MAIN_GATE1)))
  5545. +                instance->HandleGameObject(pGO->GetGUID(),false);
  5546.  
  5547.              if (instance->GetData(BOSS_BLACK_KNIGHT) == NOT_STARTED)
  5548.              {
  5549.                  if (instance->GetData(BOSS_ARGENT_CHALLENGE_E) == NOT_STARTED && instance->GetData(BOSS_ARGENT_CHALLENGE_P) == NOT_STARTED)
  5550.                  {
  5551.                      if (instance->GetData(BOSS_GRAND_CHAMPIONS) == NOT_STARTED)
  5552. -                        SetData(DATA_START, 0);
  5553. +                        me->AI()->SetData(DATA_START,NOT_STARTED);
  5554.  
  5555.                      if (instance->GetData(BOSS_GRAND_CHAMPIONS) == DONE)
  5556.                          DoStartArgentChampionEncounter();
  5557.                  }
  5558.  
  5559. -               if ((instance->GetData(BOSS_GRAND_CHAMPIONS) == DONE &&
  5560. -                   instance->GetData(BOSS_ARGENT_CHALLENGE_E) == DONE) ||
  5561. -                   instance->GetData(BOSS_ARGENT_CHALLENGE_P) == DONE)
  5562. -                    me->SummonCreature(VEHICLE_BLACK_KNIGHT, 769.834f, 651.915f, 447.035f, 0);
  5563. +                if (instance->GetData(BOSS_GRAND_CHAMPIONS) == DONE && (instance->GetData(BOSS_ARGENT_CHALLENGE_E) == DONE || instance->GetData(BOSS_ARGENT_CHALLENGE_P) == DONE))
  5564. +                {
  5565. +                    SummonNpcs();
  5566. +                    me->SummonCreature(VEHICLE_BLACK_KNIGHT, 801.369507f, 640.574280f, 469.314362f, 3.97124f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000);
  5567. +                    me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  5568. +                    me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
  5569. +                    me->SetReactState(REACT_AGGRESSIVE);
  5570. +                    if (Creature* tirion = ObjectAccessor::GetCreature(*me, tirionGUID))
  5571. +                        tirion->AI()->Talk(SAY_INTRO_BLACK_KNIGHT_TIRION);
  5572. +                    Talk(SAY_HERALD_RAFTERS);
  5573. +                }
  5574.              }
  5575.          }
  5576.  
  5577. -        void AggroAllPlayers(Creature* temp)
  5578. +        void AggroAllPlayers(Creature* pTemp)
  5579.          {
  5580.              Map::PlayerList const &PlList = me->GetMap()->GetPlayers();
  5581.  
  5582.              if (PlList.isEmpty())
  5583.                  return;
  5584.  
  5585. -            for (Map::PlayerList::const_iterator i = PlList.begin(); i != PlList.end(); ++i)
  5586. +            for(Map::PlayerList::const_iterator i = PlList.begin(); i != PlList.end(); ++i)
  5587.              {
  5588.                  if (Player* player = i->GetSource())
  5589.                  {
  5590. @@ -376,122 +651,185 @@ public:
  5591.  
  5592.                      if (player->IsAlive())
  5593.                      {
  5594. -                        temp->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
  5595. -                        temp->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  5596. -                        temp->SetReactState(REACT_AGGRESSIVE);
  5597. -                        temp->SetInCombatWith(player);
  5598. -                        player->SetInCombatWith(temp);
  5599. -                        temp->AddThreat(player, 0.0f);
  5600. +                        pTemp->SetHomePosition(me->GetPositionX(),me->GetPositionY(),me->GetPositionZ(),me->GetOrientation());
  5601. +                        pTemp->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  5602. +                        pTemp->SetReactState(REACT_AGGRESSIVE);
  5603. +                        pTemp->SetInCombatWith(player);
  5604. +                        player->SetInCombatWith(pTemp);
  5605. +                        pTemp->AddThreat(player, 0.0f);
  5606.                      }
  5607.                  }
  5608.              }
  5609.          }
  5610.  
  5611. -       void UpdateAI(uint32 uiDiff) override
  5612. +        // Why can't these be pre-spawned already? -- Something to look forward...
  5613. +        void SummonNpcs()
  5614.          {
  5615. -            ScriptedAI::UpdateAI(uiDiff);
  5616. +            if (!me->FindNearestCreature(NPC_THRALL, 200.0f))
  5617. +                if (Creature* Thrall = me->SummonCreature(NPC_THRALL, 685.569f, 615.103f, 435.396f, 6.23544f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000))
  5618. +                {
  5619. +                    thrallGUID = Thrall->GetGUID();
  5620. +                    Thrall->SetReactState(REACT_PASSIVE);
  5621. +                    Thrall->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  5622. +                }
  5623.  
  5624. -            if (uiTimer <= uiDiff)
  5625. +            if (!me->FindNearestCreature(NPC_GARROSH, 200.0f))
  5626. +                if (Creature* Garrosh = me->SummonCreature(NPC_GARROSH, 685.7f, 621.134f, 435.396f, 6.259f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000))
  5627. +                {
  5628. +                    garroshGUID = Garrosh->GetGUID();
  5629. +                    Garrosh->SetReactState(REACT_PASSIVE);
  5630. +                    Garrosh->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  5631. +                }
  5632. +
  5633. +            if (!me->FindNearestCreature(NPC_VARIAN, 200.0f))
  5634. +                if (Creature* Varian = me->SummonCreature(NPC_VARIAN, 807.724f, 617.9f, 435.396f, 3.18416f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000))
  5635. +                {
  5636. +                    varianGUID = Varian->GetGUID();
  5637. +                    Varian->SetReactState(REACT_PASSIVE);
  5638. +                    Varian->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  5639. +                }
  5640. +
  5641. +            if (!me->FindNearestCreature(NPC_JAINA_PROUDMOORE, 200.0f))
  5642. +                if (Creature* Proudmoore = me->SummonCreature(NPC_JAINA_PROUDMOORE, 807.401f, 613.667f, 435.397f, 3.0585f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000))
  5643. +                {
  5644. +                    proudmooreGUID = Proudmoore->GetGUID();
  5645. +                    Proudmoore->SetReactState(REACT_PASSIVE);
  5646. +                    Proudmoore->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  5647. +                }
  5648. +
  5649. +            if (!me->FindNearestCreature(NPC_HIGHLORD, 200.0f))
  5650. +                if (Creature* Tirion = me->SummonCreature(NPC_HIGHLORD, 746.482f, 556.857f, 435.396f, 1.5898f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000))
  5651. +                {
  5652. +                    tirionGUID = Tirion->GetGUID();
  5653. +                    Tirion->SetReactState(REACT_PASSIVE);
  5654. +                    Tirion->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  5655. +                }
  5656. +        }
  5657. +
  5658. +        void UpdateAI(uint32 diff) override
  5659. +        {
  5660. +            if (!(thrallGUID || garroshGUID || varianGUID || proudmooreGUID || tirionGUID))
  5661. +                return;
  5662. +                
  5663. +            events.Update(diff);
  5664. +                
  5665. +            while (uint32 eventId = events.ExecuteEvent())
  5666.              {
  5667. -                switch (uiPhase)
  5668. +                switch (eventId)
  5669.                  {
  5670. -                    case 1:
  5671. +                    case EVENT_INTRO_1:
  5672. +                        instance->DoCastSpellOnPlayers(SPELL_HERALD_ARGENT);
  5673. +                        Talk(SAY_INTRO_HERALD_1);
  5674. +                        events.ScheduleEvent(EVENT_INTRO_2, 5000, 0, PHASE_INTRO);
  5675. +                        break;
  5676. +                    case EVENT_INTRO_2:
  5677. +                        if (Creature* tirion = ObjectAccessor::GetCreature(*me, tirionGUID))
  5678. +                            tirion->AI()->Talk(SAY_INTRO_HERALD_2);
  5679. +                        events.ScheduleEvent(EVENT_INTRO_3, 13000, 0, PHASE_INTRO);
  5680. +                        break;
  5681. +                    case EVENT_INTRO_3:
  5682. +                        if (instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE)
  5683. +                        {
  5684. +                            if (Creature* thrall = ObjectAccessor::GetCreature(*me, thrallGUID))
  5685. +                                thrall->AI()->Talk(H_SAY_INTRO_HERALD_3);
  5686. +                        }
  5687. +                        else
  5688. +                            if (Creature* varian = ObjectAccessor::GetCreature(*me, varianGUID))
  5689. +                                varian->AI()->Talk(A_SAY_INTRO_HERALD_3);
  5690. +                        events.ScheduleEvent(EVENT_INTRO_4, 4000, 0, PHASE_INTRO);
  5691. +                        break;
  5692. +                    case EVENT_INTRO_4:
  5693. +                        if (instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE)
  5694. +                        {
  5695. +                            if (Creature* garrosh = ObjectAccessor::GetCreature(*me, garroshGUID))
  5696. +                                garrosh->AI()->Talk(H_SAY_INTRO_HERALD_4);
  5697. +                        }
  5698. +                        else
  5699. +                            if (Creature* proudmoore = ObjectAccessor::GetCreature(*me, proudmooreGUID))
  5700. +                                proudmoore->AI()->Talk(A_SAY_INTRO_HERALD_4);
  5701. +                        events.ScheduleEvent(EVENT_INTRO_5, 4000, 0, PHASE_INTRO);
  5702. +                        break;
  5703. +                    case EVENT_INTRO_5:
  5704. +                        if (instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE)
  5705. +                        {
  5706. +                            if (Creature* varian = ObjectAccessor::GetCreature(*me, varianGUID))
  5707. +                                varian->AI()->Talk(SAY_INTRO_HERALD_5);
  5708. +                        }
  5709. +                        else
  5710. +                            if (Creature* garrosh = ObjectAccessor::GetCreature(*me, garroshGUID))
  5711. +                                garrosh->AI()->Talk(SAY_INTRO_HERALD_5);
  5712. +                        events.ScheduleEvent(EVENT_INTRO_6, 6000, 0, PHASE_INTRO);
  5713. +                        break;
  5714. +                    case EVENT_INTRO_6:
  5715. +                        if (instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE)
  5716. +                        {
  5717. +                            if (Creature* proudmoore = ObjectAccessor::GetCreature(*me, proudmooreGUID))
  5718. +                                proudmoore->AI()->Talk(H_SAY_INTRO_HERALD_6);
  5719. +                        }
  5720. +                        else
  5721. +                            if (Creature* thrall = ObjectAccessor::GetCreature(*me, thrallGUID))
  5722. +                                thrall->AI()->Talk(A_SAY_INTRO_HERALD_6);
  5723. +                        events.ScheduleEvent(EVENT_INTRO_7, 6000, 0, PHASE_INTRO);
  5724. +                        break;
  5725. +                    case EVENT_INTRO_7:
  5726. +                        if (Creature* tirion = ObjectAccessor::GetCreature(*me, tirionGUID))
  5727. +                            tirion->AI()->Talk(SAY_INTRO_HERALD_7);
  5728. +                        events.ScheduleEvent(EVENT_INTRO_8, 1000, 0, PHASE_INTRO);
  5729. +                        break;
  5730. +                    case EVENT_INTRO_8:
  5731. +                        me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
  5732. +                        events.SetPhase(PHASE_INPROGRESS);
  5733. +                        break;
  5734. +                    case EVENT_SUMMON_FACTION_2:
  5735.                          DoSummonGrandChampion(uiSecondBoss);
  5736. -                        NextStep(10000, true);
  5737. +                        events.ScheduleEvent(EVENT_SUMMON_FACTION_3, 10000, 0, PHASE_INPROGRESS);
  5738.                          break;
  5739. -                    case 2:
  5740. +                    case EVENT_SUMMON_FACTION_3:
  5741.                          DoSummonGrandChampion(uiThirdBoss);
  5742. -                        NextStep(0, false);
  5743.                          break;
  5744. -                    case 3:
  5745. +                    case EVENT_AGGRO_FACTION:
  5746.                          if (!Champion1List.empty())
  5747.                          {
  5748. -                            for (GuidList::const_iterator itr = Champion1List.begin(); itr != Champion1List.end(); ++itr)
  5749. +                            for(GuidList::const_iterator itr = Champion1List.begin(); itr != Champion1List.end(); ++itr)
  5750.                                  if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr))
  5751.                                      AggroAllPlayers(summon);
  5752. -                            NextStep(0, false);
  5753.                          }
  5754.                          break;
  5755. +                    case EVENT_PALETRESS_1:
  5756. +                        Talk(SAY_PALETRESS_INTRO_1);
  5757. +                        Talk(SAY_PALETRESS_INTRO_2);
  5758. +                        events.ScheduleEvent(EVENT_PALETRESS_2, 5000, 0, PHASE_INPROGRESS);
  5759. +                        break;
  5760. +                    case EVENT_PALETRESS_2:
  5761. +                        if (Creature* argentchamp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ARGENT_CHAMPION)))
  5762. +                            argentchamp->AI()->Talk(SAY_PALETRESS_INTRO_3);
  5763. +                        events.ScheduleEvent(EVENT_PALETRESS_3, 5000);
  5764. +                    case EVENT_PALETRESS_3:
  5765. +                        if (Creature* argentchamp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ARGENT_CHAMPION)))
  5766. +                            argentchamp->AI()->Talk(SAY_PALETRESS_INTRO_4);
  5767. +                        events.CancelEvent(EVENT_PALETRESS_3);
  5768. +                        break;
  5769. +                    case EVENT_EADRIC_1:
  5770. +                        Talk(SAY_EADRIC_INTRO_1);
  5771. +                        Talk(SAY_EADRIC_INTRO_2);
  5772. +                        events.ScheduleEvent(EVENT_EADRIC_2, 5000);
  5773. +                        break;
  5774. +                    case EVENT_EADRIC_2:
  5775. +                        if (Creature* argentchamp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ARGENT_CHAMPION)))
  5776. +                            argentchamp->AI()->Talk(SAY_EADRIC_INTRO_3);
  5777. +                        break;
  5778.                  }
  5779. -            } else uiTimer -= uiDiff;
  5780. -
  5781. -            if (!UpdateVictim())
  5782. -                return;
  5783. -        }
  5784. -
  5785. -        void JustSummoned(Creature* summon) override
  5786. -        {
  5787. -            if (instance->GetData(BOSS_GRAND_CHAMPIONS) == NOT_STARTED)
  5788. -            {
  5789. -                summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  5790. -                summon->SetReactState(REACT_PASSIVE);
  5791. -            }
  5792. -        }
  5793. -
  5794. -        void SummonedCreatureDespawn(Creature* summon) override
  5795. -        {
  5796. -            switch (summon->GetEntry())
  5797. -            {
  5798. -                case VEHICLE_DARNASSIA_NIGHTSABER:
  5799. -                case VEHICLE_EXODAR_ELEKK:
  5800. -                case VEHICLE_STORMWIND_STEED:
  5801. -                case VEHICLE_GNOMEREGAN_MECHANOSTRIDER:
  5802. -                case VEHICLE_IRONFORGE_RAM:
  5803. -                case VEHICLE_FORSAKE_WARHORSE:
  5804. -                case VEHICLE_THUNDER_BLUFF_KODO:
  5805. -                case VEHICLE_ORGRIMMAR_WOLF:
  5806. -                case VEHICLE_SILVERMOON_HAWKSTRIDER:
  5807. -                case VEHICLE_DARKSPEAR_RAPTOR:
  5808. -                    SetData(DATA_LESSER_CHAMPIONS_DEFEATED, 0);
  5809. -                    break;
  5810.              }
  5811.          }
  5812.      };
  5813.  
  5814.      CreatureAI* GetAI(Creature* creature) const override
  5815.      {
  5816. -        return GetInstanceAI<npc_announcer_toc5AI>(creature);
  5817. -    }
  5818. -
  5819. -    bool OnGossipHello(Player* player, Creature* creature) override
  5820. -    {
  5821. -        InstanceScript* instance = creature->GetInstanceScript();
  5822. -
  5823. -        if (instance &&
  5824. -            ((instance->GetData(BOSS_GRAND_CHAMPIONS) == DONE &&
  5825. -            instance->GetData(BOSS_BLACK_KNIGHT) == DONE &&
  5826. -            instance->GetData(BOSS_ARGENT_CHALLENGE_E) == DONE) ||
  5827. -            instance->GetData(BOSS_ARGENT_CHALLENGE_P) == DONE))
  5828. -            return false;
  5829. -
  5830. -        if (instance &&
  5831. -            instance->GetData(BOSS_GRAND_CHAMPIONS) == NOT_STARTED &&
  5832. -            instance->GetData(BOSS_ARGENT_CHALLENGE_E) == NOT_STARTED &&
  5833. -            instance->GetData(BOSS_ARGENT_CHALLENGE_P) == NOT_STARTED &&
  5834. -            instance->GetData(BOSS_BLACK_KNIGHT) == NOT_STARTED)
  5835. -            player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_START_EVENT1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
  5836. -        else if (instance)
  5837. -            player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_START_EVENT2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
  5838. -
  5839. -        player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
  5840. -
  5841. -        return true;
  5842. -    }
  5843. -
  5844. -    bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
  5845. -    {
  5846. -        player->PlayerTalkClass->ClearMenus();
  5847. -        if (action == GOSSIP_ACTION_INFO_DEF+1)
  5848. -        {
  5849. -            player->CLOSE_GOSSIP_MENU();
  5850. -            ENSURE_AI(npc_announcer_toc5::npc_announcer_toc5AI, creature->AI())->StartEncounter();
  5851. -        }
  5852. -
  5853. -        return true;
  5854. -    }
  5855. +        return new npc_herald_toc5AI (creature);
  5856. +    };
  5857.  };
  5858.  
  5859.  void AddSC_trial_of_the_champion()
  5860.  {
  5861. -    new npc_announcer_toc5();
  5862. -}
  5863. +    new npc_herald_toc5();
  5864. +}
  5865. \ No newline at end of file
  5866. diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.h b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.h
  5867. index 8367436..b210818 100644
  5868. --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.h
  5869. +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.h
  5870. @@ -1,6 +1,5 @@
  5871.  /*
  5872.   * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
  5873. - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
  5874.   *
  5875.   * This program is free software; you can redistribute it and/or modify it
  5876.   * under the terms of the GNU General Public License as published by the
  5877. @@ -19,8 +18,6 @@
  5878.  #ifndef DEF_TOC_H
  5879.  #define DEF_TOC_H
  5880.  
  5881. -#define DataHeader "TC"
  5882. -
  5883.  enum Data
  5884.  {
  5885.      BOSS_GRAND_CHAMPIONS,
  5886. @@ -29,15 +26,27 @@ enum Data
  5887.      BOSS_BLACK_KNIGHT,
  5888.      DATA_MOVEMENT_DONE,
  5889.      DATA_LESSER_CHAMPIONS_DEFEATED,
  5890. +    DATA_GRAND_CHAMPIONS_DEFEATED,
  5891.      DATA_START,
  5892.      DATA_IN_POSITION,
  5893. -    DATA_ARGENT_SOLDIER_DEFEATED
  5894. +    DATA_ARGENT_SOLDIER_DEFEATED,
  5895. +    DATA_TEAM_IN_INSTANCE,
  5896. +    DATA_RESET,
  5897. +    DATA_AGGRO_DONE,
  5898. +    DATA_AGRO_DONE,
  5899. +    DATA_BLACK_KNIGHT,
  5900. +    DATA_KNIGHT,
  5901. +    DATA_THE_FACEROLLER,
  5902. +    DATA_IVE_HAD_WORSE
  5903.  };
  5904.  
  5905.  enum Data64
  5906.  {
  5907.      DATA_ANNOUNCER,
  5908. +    DATA_ARGENT_CHAMPION,
  5909. +    DATA_HIGHLORD,
  5910.      DATA_MAIN_GATE,
  5911. +    DATA_MAIN_GATE1,
  5912.  
  5913.      DATA_GRAND_CHAMPION_VEHICLE_1,
  5914.      DATA_GRAND_CHAMPION_VEHICLE_2,
  5915. @@ -48,7 +57,7 @@ enum Data64
  5916.      DATA_GRAND_CHAMPION_3
  5917.  };
  5918.  
  5919. -enum CreatureIds
  5920. +enum Npcs
  5921.  {
  5922.      // Horde Champions
  5923.      NPC_MOKRA                   = 35572,
  5924. @@ -64,6 +73,20 @@ enum CreatureIds
  5925.      NPC_JAELYNE                 = 34657,
  5926.      NPC_LANA                    = 34703,
  5927.  
  5928. +    // Faction champions horde
  5929. +    NPC_ORGRIMAR_CHAMPION       = 35314,
  5930. +    NPC_SILVERMOON_CHAMPION     = 35326,
  5931. +    NPC_THUNDER_CHAMPION        = 35325,
  5932. +    NPC_TROLL_CHAMPION          = 35323,
  5933. +    NPC_UNDERCITY_CHAMPION      = 35327,
  5934. +
  5935. +    // Faction champions alliance
  5936. +    NPC_STORMWIND_CHAMPION      = 35328,
  5937. +    NPC_GNOMERAGN_CHAMPION      = 35331,
  5938. +    NPC_EXODAR_CHAMPION         = 35330,
  5939. +    NPC_DRNASSUS_CHAMPION       = 35332,
  5940. +    NPC_IRONFORGE_CHAMPION      = 35329,    
  5941. +
  5942.      NPC_EADRIC                  = 35119,
  5943.      NPC_PALETRESS               = 34928,
  5944.  
  5945. @@ -75,23 +98,61 @@ enum CreatureIds
  5946.  
  5947.      NPC_RISEN_JAEREN            = 35545,
  5948.      NPC_RISEN_ARELAS            = 35564,
  5949. -
  5950. +    
  5951. +    // Announcer Start Event
  5952.      NPC_JAEREN                  = 35004,
  5953. -    NPC_ARELAS                  = 35005
  5954. +    NPC_ARELAS                  = 35005,
  5955. +    NPC_HIGHLORD                = 34996,
  5956. +    NPC_THRALL                  = 34994,
  5957. +    NPC_GARROSH                 = 34995,
  5958. +    NPC_VARIAN                  = 34990,
  5959. +    NPC_JAINA_PROUDMOORE        = 34992,
  5960. +
  5961. +    // Memory
  5962. +    MEMORY_ALGALON              = 35052,
  5963. +    MEMORY_ARCHIMONDE           = 35041,
  5964. +    MEMORY_CHROMAGGUS           = 35033,
  5965. +    MEMORY_CYANIGOSA            = 35046,
  5966. +    MEMORY_DELRISSA             = 35043,
  5967. +    MEMORY_ECK                  = 35047,
  5968. +    MEMORY_ENTROPIUS            = 35044,
  5969. +    MEMORY_GRUUL                = 35039,
  5970. +    MEMORY_HAKKAR               = 35034,
  5971. +    MEMORY_HEIGAN               = 35049,
  5972. +    MEMORY_HEROD                = 35030,
  5973. +    MEMORY_HOGGER               = 34942,
  5974. +    MEMORY_IGNIS                = 35050,
  5975. +    MEMORY_ILLIDAN              = 35042,
  5976. +    MEMORY_INGVAR               = 35045,
  5977. +    MEMORY_KALITHRESH           = 35037,
  5978. +    MEMORY_LUCIFRON             = 35031,
  5979. +    MEMORY_MALCHEZAAR           = 35038,
  5980. +    MEMORY_MUTANUS              = 35029,
  5981. +    MEMORY_ONYXIA               = 35048,
  5982. +    MEMORY_THUNDERAAN           = 35032,
  5983. +    MEMORY_VANCLEEF             = 35028,
  5984. +    MEMORY_VASHJ                = 35040,
  5985. +    MEMORY_VEKNILASH            = 35036,
  5986. +    MEMORY_VEZAX                = 35051,
  5987. +
  5988. +    // Vehicles
  5989. +    NPC_ARGENT_WARHORSE         = 35644,
  5990. +    NPC_ARGENT_BATTLEWORG       = 36558
  5991.  };
  5992.  
  5993.  enum GameObjects
  5994.  {
  5995.      GO_MAIN_GATE                = 195647,
  5996. +    GO_MAIN_GATE1               = 195650,
  5997.  
  5998.      GO_CHAMPIONS_LOOT           = 195709,
  5999. -    GO_CHAMPIONS_LOOT_H            = 195710,
  6000. +    GO_CHAMPIONS_LOOT_H         = 195710,
  6001.  
  6002.      GO_EADRIC_LOOT              = 195374,
  6003.      GO_EADRIC_LOOT_H            = 195375,
  6004.  
  6005.      GO_PALETRESS_LOOT           = 195323,
  6006. -    GO_PALETRESS_LOOT_H            = 195324
  6007. +    GO_PALETRESS_LOOT_H         = 195324
  6008.  };
  6009.  
  6010.  enum Vehicles
  6011. @@ -123,8 +184,24 @@ enum Vehicles
  6012.  
  6013.      VEHICLE_ARGENT_WARHORSE                         = 35644,
  6014.      VEHICLE_ARGENT_BATTLEWORG                       = 36558,
  6015. -
  6016. +    VEHICLE_GR                                      = 35492,
  6017.      VEHICLE_BLACK_KNIGHT                            = 35491
  6018.  };
  6019.  
  6020. -#endif
  6021. +enum Actions
  6022. +{
  6023. +    ACTION_OUTRO                        = 0,
  6024. +    ACTION_RESET_BLACK_KNIGHT           = 1
  6025. +};
  6026. +
  6027. +enum Criterias
  6028. +{
  6029. +    CRITERIA_IVE_HAD_WORSE = 11789
  6030. +};
  6031. +
  6032. +void HandleSpellOnPlayersInInstanceToC5(Unit* caller, uint32 spellId);
  6033. +void HandleKillCreditForAllPlayers(Creature* credit);
  6034. +void HandleInstanceBind(Creature* source);
  6035. +
  6036. +
  6037. +#endif
  6038. \ No newline at end of file
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement