diff --git a/src/server/scripts/Draenor/Dungeons/Auchindoun/boss_Terongor.cpp b/src/server/scripts/Draenor/Dungeons/Auchindoun/boss_Terongor.cpp
index c3fe64f..e766238 100644
--- a/src/server/scripts/Draenor/Dungeons/Auchindoun/boss_Terongor.cpp
+++ b/src/server/scripts/Draenor/Dungeons/Auchindoun/boss_Terongor.cpp
@@ -15,10 +15,290 @@
* with this program. If not, see .
*/
+#include "ObjectMgr.h"
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "PassiveAI.h"
+#include "SpellScript.h"
+#include "MoveSplineInit.h"
+#include "Cell.h"
+#include "CellImpl.h"
+#include "GridNotifiers.h"
+#include "GridNotifiersImpl.h"
+#include "Auchindoun.h"
-void AddSC_boss_terongor()
+enum Spells
{
-
+ SPELL_SUMMON_ABISSAL = 140762, // first phase
+ SPELL_SHADOWBOLT = 156829,
+ SPELL_CORUPT = 156842,
+ SPELL_FIRE_RAIN = 156974, // spell doesn`t work
+ SPELL_DRAIN = 156854, // end first phase
+ SPELL_SEED_OF_ANGER = 156921, // affliction
+ SPELL_EXHAUSTION = 164841,
+ SPELL_AGONY = 156925,
+ SPELL_UNSTABLE_AFFLICTION = 156954, // end affliction
+ SPELL_CHAOS_BOLT = 164846, // destruction
+ SPELL_IMMOLATE = 156964,
+ SPELL_IGNITION = 156960,
+ SPELL_INCINIRATE = 156963,
+ SPELL_FAIR_RAIN_DESTRUCTION = 156974, // end destruction
+ SPELL_DEMONIC_LEAP = 157041, // demonologic
+ SPELL_ROCK = 156965,
+ SPELL_WAVE_OF_CHAOS = 157001,
+ SPELL_TOUCH_OF_CHAOS = 156968,
+ SPELL_CORUPT_DEMON = 156842, // end demonologic
+ SPELL_JUMP = 71809,
+ SPELL_IMUNE = 177763
+};
+
+enum Models
+{
+ Destruction = 21254,
+ Affliction = 16263,
+ Demono = 64429,
+ Terongor=54036
+};
+
+enum events
+{
+ EVENT_SUMMON_ABISSAL = 1, // first phase
+ EVENT_SHADOWBOLT = 2,
+ EVENT_CORUPT = 3,
+ EVENT_FIRE_RAIN = 4,
+ EVENT_DRAIN = 5, // end first phase
+ EVENT_EXHAUSTION = 6, // affliction
+ EVENT_SEED_OF_ANGER=7,
+ EVENT_AGONY = 8,
+ EVENT_UNSTABLE_AFFLICTION = 9, // end affliction
+ EVENT_CHAOS_BOLT = 10, // destruction
+ EVENT_IMMOLATE = 11,
+ EVENT_IGNITION = 12,
+ EVENT_INCINIRATE = 13, // end destruction
+ EVENT_DEMONIC_LEAP = 14, // demonologic
+ EVENT_ROCK = 15,
+ EVENT_WAVE_OF_CHAOS = 16,
+ EVENT_TOUCH_OF_CHAOS = 17,
+ EVENT_CORUPT_DEMON = 18, // end demonologic
+ EVENT_END=19
+};
+Position at_end = { 1885.49f, 2996.36f, 17.30f, 1.74f };
+class boss_teron : public CreatureScript
+{
+public:
+ boss_teron() : CreatureScript("boss_teron") {}
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetInstanceAI(creature);
+ }
+
+ struct boss_teronAI : public BossAI
+ {
+ boss_teronAI(Creature* creature) : BossAI(creature, BOSS_TERON)
+ {
+ Initialize();
+ }
+
+ void Reset() override
+ {
+ _Reset();
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ check = false;
+ check_end = false;
+ me->SetDisplayId(Terongor);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ }
+ bool check;
+ bool check_end;
+ Unit* player;
+
+ void EnterCombat(Unit* /*who*/) override
+ {
+ _EnterCombat();
+ me->RemoveAllAuras();
+ _StartPhase();
+ }
+
+ void _StartPhase()
+ {
+ events.ScheduleEvent(EVENT_SHADOWBOLT,5500);
+ events.ScheduleEvent(EVENT_CORUPT, 5000);
+ events.ScheduleEvent(EVENT_SUMMON_ABISSAL, 10000);
+ events.ScheduleEvent(EVENT_DRAIN, 15000);
+ events.ScheduleEvent(EVENT_FIRE_RAIN, 3500);
+ }
+
+ void _Endphase()
+ {
+ me->SetReactState(REACT_PASSIVE);
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ me->AttackStop();
+ events.Reset();
+ DoCast(me, SPELL_IMUNE, true);
+ me->GetMotionMaster()->MovePoint(1, at_end);
+ }
+
+ void _MainPhase(uint32 rnd)
+ {
+ switch (rnd)
+ {
+ case 0:
+ me->SetDisplayId(Affliction);
+ events.ScheduleEvent(EVENT_SHADOWBOLT,2000);
+ events.ScheduleEvent(EVENT_AGONY, 5000);
+ events.ScheduleEvent(EVENT_SEED_OF_ANGER,4500);
+ events.ScheduleEvent(EVENT_EXHAUSTION, 8000);
+ events.ScheduleEvent(EVENT_DRAIN, 15000);
+ events.ScheduleEvent(EVENT_UNSTABLE_AFFLICTION, 6700);
+ break;
+ case 1:
+ me->SetDisplayId(Destruction);
+ events.ScheduleEvent(EVENT_CHAOS_BOLT, 10000);
+ events.ScheduleEvent(EVENT_INCINIRATE, 2000);
+ events.ScheduleEvent(EVENT_IMMOLATE, 5000);
+ events.ScheduleEvent(EVENT_FIRE_RAIN, 3500);
+ break;
+ case 2:
+ me->SetDisplayId(Demono);
+ events.ScheduleEvent(EVENT_DEMONIC_LEAP, 1500);
+ events.ScheduleEvent(EVENT_SHADOWBOLT, 2000);
+ events.ScheduleEvent(EVENT_CORUPT, 5000);
+ events.ScheduleEvent(EVENT_ROCK, 8000);
+ events.ScheduleEvent(EVENT_TOUCH_OF_CHAOS, 9000);
+ break;
+ default:
+ break;
+ }
+ }
+
+ void JustReachedHome() override
+ {
+ Reset();
+ _JustReachedHome();
+ }
+ void JustSummoned(Creature* summon)
+ {
+ }
+
+ void MovementInform(uint32 type, uint32 id) override
+ {
+ if (id == 1)
+ {
+ DoCastAOE(SPELL_JUMP);
+ events.ScheduleEvent(EVENT_END,1000);
+ }
+ }
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ _JustDied();
+ instance->SetBossState(BOSS_NIAMI, DONE);
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
+ if ((me->GetHealthPct() <= 75) && (!check))
+ {
+ events.Reset();
+ _MainPhase(rand() % 3);
+ check = true;
+ }
+ if ((me->GetHealthPct() <= 10) && (!check_end))
+ {
+ check_end = true;
+ _Endphase();
+ }
+ events.Update(diff);
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_SHADOWBOLT:
+ DoCast(SelectTarget(SELECT_TARGET_TOPAGGRO), SPELL_SHADOWBOLT);
+ events.ScheduleEvent(EVENT_SHADOWBOLT, 5500);
+ break;
+ case EVENT_CORUPT:
+ DoCast(SelectTarget(SELECT_TARGET_RANDOM), SPELL_CORUPT);
+ events.ScheduleEvent(EVENT_CORUPT, 5000);
+ break;
+ case EVENT_FIRE_RAIN:
+ DoCast(SelectTarget(SELECT_TARGET_RANDOM), SPELL_FIRE_RAIN);
+ events.ScheduleEvent(EVENT_FIRE_RAIN, 7500);
+ break;
+ case EVENT_SUMMON_ABISSAL:
+ DoCastAOE(SPELL_SUMMON_ABISSAL);
+ break;
+ case EVENT_DRAIN:
+ DoCast(SelectTarget(SELECT_TARGET_RANDOM), SPELL_DRAIN);
+ events.ScheduleEvent(EVENT_DRAIN, 15000);
+ break;
+ case EVENT_AGONY:
+ DoCast(SelectTarget(SELECT_TARGET_RANDOM), SPELL_AGONY);
+ events.ScheduleEvent(EVENT_AGONY, 5000);
+ break;
+ case EVENT_EXHAUSTION:
+ DoCast(SelectTarget(SELECT_TARGET_RANDOM), SPELL_EXHAUSTION);
+ events.ScheduleEvent(EVENT_EXHAUSTION, 8000);
+ break;
+ case EVENT_UNSTABLE_AFFLICTION:
+ DoCast(SelectTarget(SELECT_TARGET_RANDOM), SPELL_UNSTABLE_AFFLICTION);
+ events.ScheduleEvent(EVENT_UNSTABLE_AFFLICTION, 6700);
+ break;
+ case EVENT_CHAOS_BOLT:
+ DoCast(SelectTarget(SELECT_TARGET_TOPAGGRO), SPELL_CHAOS_BOLT);
+ events.ScheduleEvent(EVENT_CHAOS_BOLT, 10000);
+ break;
+ case EVENT_INCINIRATE:
+ DoCast(SelectTarget(SELECT_TARGET_TOPAGGRO), SPELL_INCINIRATE);
+ events.ScheduleEvent(EVENT_INCINIRATE, 5500);
+ break;
+ case EVENT_IMMOLATE:
+ player = SelectTarget(SELECT_TARGET_RANDOM);
+ DoCast(player, SPELL_IMMOLATE);
+ events.ScheduleEvent(EVENT_IMMOLATE, 5000);
+ events.ScheduleEvent(EVENT_IGNITION, 3000);
+ break;
+ case EVENT_IGNITION:
+ if (player->HasAura(SPELL_IMMOLATE))
+ DoCast(player, SPELL_IGNITION);
+ break;
+ case EVENT_DEMONIC_LEAP:
+ DoCast(SelectTarget(SELECT_TARGET_RANDOM), SPELL_DEMONIC_LEAP);
+ events.ScheduleEvent(EVENT_DEMONIC_LEAP, 20000);
+ break;
+ case EVENT_ROCK:
+ DoCast(SelectTarget(SELECT_TARGET_RANDOM), SPELL_ROCK);
+ events.ScheduleEvent(EVENT_ROCK, 8000);
+ break;
+ case EVENT_SEED_OF_ANGER:
+ DoCast(SelectTarget(SELECT_TARGET_RANDOM), SPELL_SEED_OF_ANGER);
+ events.ScheduleEvent(EVENT_SEED_OF_ANGER, urand(19000,21000));
+ break;
+ case EVENT_TOUCH_OF_CHAOS:
+ DoCast(SelectTarget(SELECT_TARGET_RANDOM), SPELL_TOUCH_OF_CHAOS);
+ events.ScheduleEvent(EVENT_TOUCH_OF_CHAOS, 9000);
+ break;
+ case EVENT_END:
+ me->DespawnOrUnsummon(1000);
+ break;
+ default:
+ break;
+ }
+ }
+ DoMeleeAttackIfReady();
+ }
+ };
+};
+void AddSC_boss_teron()
+{
+ new boss_teron();
}