mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-02-05 12:03:48 +00:00
refactor(Core/Scripts): restyle scripts lib with astyle (#3467)
This commit is contained in:
@@ -73,7 +73,7 @@ enum Spells
|
||||
SPELL_SARTHARION_PYROBUFFET = 56916,
|
||||
SPELL_SARTHARION_BERSERK = 61632,
|
||||
SPELL_SARTHARION_TWILIGHT_REVENGE = 60639,
|
||||
|
||||
|
||||
// Sartharion with drakes
|
||||
SPELL_WILL_OF_SARTHARION = 61254,
|
||||
SPELL_POWER_OF_TENEBRON = 61248,
|
||||
@@ -141,7 +141,7 @@ enum Events
|
||||
EVENT_SARTHARION_LAVA_STRIKE = 16,
|
||||
EVENT_SARTHARION_HEALTH_CHECK = 17,
|
||||
EVENT_SARTHARION_BERSERK = 18,
|
||||
|
||||
|
||||
// Drake abilities called by sartharion
|
||||
EVENT_SARTHARION_CALL_TENEBRON = 30,
|
||||
EVENT_SARTHARION_CALL_SHADRON = 31,
|
||||
@@ -150,7 +150,7 @@ enum Events
|
||||
EVENT_SARTHARION_BOUNDARY = 33
|
||||
};
|
||||
|
||||
const Position portalPos[4] =
|
||||
const Position portalPos[4] =
|
||||
{
|
||||
{3247.29f, 529.804f, 58.9595f, 0.0f},
|
||||
{3248.62f, 646.739f, 85.2939f, 0.0f},
|
||||
@@ -158,14 +158,14 @@ const Position portalPos[4] =
|
||||
{3351.78f, 517.138f, 99.1620f, 0.0f},
|
||||
};
|
||||
|
||||
const Position EggsPos[12] =
|
||||
const Position EggsPos[12] =
|
||||
{
|
||||
// Tenebron
|
||||
{3253.09f, 657.439f, 86.9921f, 3.16334f},
|
||||
{3247.76f, 662.413f, 87.7281f, 4.12938f},
|
||||
{3246.01f, 656.606f, 86.8737f, 4.12938f},
|
||||
{3246.7f, 649.558f, 85.8179f, 4.12938f},
|
||||
{3238.72f, 650.386f, 85.9625f, 0.897469f},
|
||||
{3238.72f, 650.386f, 85.9625f, 0.897469f},
|
||||
{3257.89f, 651.323f, 85.9177f, 0.897469f},
|
||||
// Sartharion
|
||||
{3237.24f, 524.20f, 58.95f, 0.0f},
|
||||
@@ -216,7 +216,7 @@ public:
|
||||
me->SummonCreature(NPC_FIRE_CYCLONE, 3281.57f, 507.984f, 57.0833f, 5.54346f);
|
||||
me->SummonCreature(NPC_FIRE_CYCLONE, 3210.11f, 531.957f, 57.0833f, 3.76777f);
|
||||
me->SummonCreature(NPC_FIRE_CYCLONE, 3286.42f, 585.010f, 57.0833f, 4.10307f);
|
||||
|
||||
|
||||
me->SummonCreature(NPC_SAFE_AREA_TRIGGER, 3244.14f, 512.597f, 58.6534f, 0.0f);
|
||||
me->SummonCreature(NPC_SAFE_AREA_TRIGGER, 3242.84f, 553.979f, 58.8272f, 0.0f);
|
||||
}
|
||||
@@ -229,16 +229,16 @@ public:
|
||||
events.ScheduleEvent(EVENT_SARTHARION_FINISH_LAVA, 9000);
|
||||
|
||||
// Send wave from left
|
||||
if (urand(0,1))
|
||||
if (urand(0, 1))
|
||||
{
|
||||
for (uint8 i = 0; i < 3; ++i)
|
||||
me->SummonCreature(NPC_FLAME_TSUNAMI, 3208.44f, 580.0f-(i*50.0f), 55.8f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 12000);
|
||||
me->SummonCreature(NPC_FLAME_TSUNAMI, 3208.44f, 580.0f - (i * 50.0f), 55.8f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 12000);
|
||||
}
|
||||
// from right
|
||||
else
|
||||
{
|
||||
for (uint8 i = 0; i < 2; ++i)
|
||||
me->SummonCreature(NPC_FLAME_TSUNAMI, 3283.44f, 555.0f-(i*50.0f), 55.8f, 3.14f, TEMPSUMMON_TIMED_DESPAWN, 12000);
|
||||
me->SummonCreature(NPC_FLAME_TSUNAMI, 3283.44f, 555.0f - (i * 50.0f), 55.8f, 3.14f, TEMPSUMMON_TIMED_DESPAWN, 12000);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -264,7 +264,7 @@ public:
|
||||
{
|
||||
Unit* cr = nullptr;
|
||||
for (uint8 i = 0; i < 3; ++i)
|
||||
if ((cr = ObjectAccessor::GetUnit(*me, pInstance->GetData64(DATA_TENEBRON+i))))
|
||||
if ((cr = ObjectAccessor::GetUnit(*me, pInstance->GetData64(DATA_TENEBRON + i))))
|
||||
{
|
||||
if (!cr->IsAlive())
|
||||
continue;
|
||||
@@ -275,7 +275,7 @@ public:
|
||||
me->AddLootMode(1 << dragonsCount);
|
||||
|
||||
cr->SetHealth(cr->GetMaxHealth());
|
||||
switch(DATA_TENEBRON+i)
|
||||
switch(DATA_TENEBRON + i)
|
||||
{
|
||||
case DATA_TENEBRON:
|
||||
cr->CastSpell(cr, SPELL_POWER_OF_TENEBRON, true);
|
||||
@@ -431,9 +431,9 @@ public:
|
||||
EnterEvadeMode();
|
||||
|
||||
events.RepeatEvent(1000);
|
||||
break;
|
||||
break;
|
||||
case EVENT_SARTHARION_SUMMON_LAVA:
|
||||
if (!urand(0,3))
|
||||
if (!urand(0, 3))
|
||||
Talk(SAY_SARTHARION_SPECIAL);
|
||||
|
||||
SummonLavaWaves();
|
||||
@@ -479,29 +479,29 @@ void boss_sartharion::boss_sartharionAI::HandleSartharionAbilities()
|
||||
break;
|
||||
case EVENT_SARTHARION_LAVA_STRIKE:
|
||||
{
|
||||
if (!urand(0,2))
|
||||
Talk(SAY_SARTHARION_SPECIAL_4);
|
||||
if (!urand(0, 2))
|
||||
Talk(SAY_SARTHARION_SPECIAL_4);
|
||||
|
||||
Creature* cr = nullptr;
|
||||
summons.RemoveNotExisting();
|
||||
uint8 rand = urand(0,4); // 5 - numer of cyclones
|
||||
uint8 iter = 0;
|
||||
for (SummonList::iterator i = summons.begin(); i != summons.end(); ++i)
|
||||
{
|
||||
if ((cr = ObjectAccessor::GetCreature(*me, *i)))
|
||||
if (cr->GetEntry() == NPC_FIRE_CYCLONE)
|
||||
{
|
||||
if (iter == rand)
|
||||
Creature* cr = nullptr;
|
||||
summons.RemoveNotExisting();
|
||||
uint8 rand = urand(0, 4); // 5 - numer of cyclones
|
||||
uint8 iter = 0;
|
||||
for (SummonList::iterator i = summons.begin(); i != summons.end(); ++i)
|
||||
{
|
||||
if ((cr = ObjectAccessor::GetCreature(*me, *i)))
|
||||
if (cr->GetEntry() == NPC_FIRE_CYCLONE)
|
||||
{
|
||||
cr->CastSpell(cr, SPELL_CYCLONE_AURA_PERIODIC, true);
|
||||
break;
|
||||
if (iter == rand)
|
||||
{
|
||||
cr->CastSpell(cr, SPELL_CYCLONE_AURA_PERIODIC, true);
|
||||
break;
|
||||
}
|
||||
++iter;
|
||||
}
|
||||
++iter;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
events.RepeatEvent(20000);
|
||||
break;
|
||||
events.RepeatEvent(20000);
|
||||
break;
|
||||
}
|
||||
case EVENT_SARTHARION_HEALTH_CHECK:
|
||||
if (dragonsCount && !usedBerserk && me->HealthBelowPct(36))
|
||||
@@ -633,7 +633,7 @@ public:
|
||||
{
|
||||
summons2.DespawnAll();
|
||||
ClearInstance();
|
||||
|
||||
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
me->SetDisableGravity(false);
|
||||
me->SetSpeed(MOVE_FLIGHT, 1.0f);
|
||||
@@ -695,7 +695,7 @@ public:
|
||||
|
||||
void JustKilled(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() != TYPEID_PLAYER || urand(0,2))
|
||||
if (victim->GetTypeId() != TYPEID_PLAYER || urand(0, 2))
|
||||
return;
|
||||
|
||||
Talk(SAY_TENEBRON_SLAY);
|
||||
@@ -721,7 +721,7 @@ public:
|
||||
Talk(SAY_TENEBRON_RESPOND);
|
||||
me->SetCanFly(true);
|
||||
me->SetSpeed(MOVE_FLIGHT, 3.0f);
|
||||
me->GetMotionMaster()->MovePath(me->GetEntry()*10, false);
|
||||
me->GetMotionMaster()->MovePath(me->GetEntry() * 10, false);
|
||||
timer = 0;
|
||||
}
|
||||
}
|
||||
@@ -736,7 +736,7 @@ public:
|
||||
switch (events.GetEvent())
|
||||
{
|
||||
case EVENT_MINIBOSS_SHADOW_BREATH:
|
||||
if (!urand(0,10))
|
||||
if (!urand(0, 10))
|
||||
Talk(SAY_TENEBRON_BREATH);
|
||||
me->CastSpell(me->GetVictim(), SPELL_SHADOW_BREATH, false);
|
||||
events.RepeatEvent(17500);
|
||||
@@ -749,7 +749,7 @@ public:
|
||||
case EVENT_MINIBOSS_OPEN_PORTAL:
|
||||
Talk(WHISPER_OPEN_PORTAL);
|
||||
Talk(SAY_TENEBRON_SPECIAL);
|
||||
|
||||
|
||||
if (!isSartharion)
|
||||
{
|
||||
if (GameObject* Portal = me->GetVictim()->SummonGameObject(GO_TWILIGHT_PORTAL, portalPos[BOSS_TENEBRON_EVENT].GetPositionX(), portalPos[BOSS_TENEBRON_EVENT].GetPositionY(), portalPos[BOSS_TENEBRON_EVENT].GetPositionZ(), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0))
|
||||
@@ -758,61 +758,61 @@ public:
|
||||
else if (pInstance)
|
||||
pInstance->SetData(DATA_ADD_PORTAL, 0);
|
||||
|
||||
|
||||
|
||||
events.ScheduleEvent(EVENT_MINIBOSS_SPAWN_HELPERS, 2000);
|
||||
events.RepeatEvent(60000);
|
||||
break;
|
||||
case EVENT_MINIBOSS_SPAWN_HELPERS:
|
||||
{
|
||||
Talk(WHISPER_HATCH_EGGS);
|
||||
Creature* cr = nullptr;
|
||||
for (uint8 i = 0; i < 6; ++i)
|
||||
{
|
||||
if ((cr = me->SummonCreature(NPC_TWILIGHT_EGG, EggsPos[isSartharion ? i+6 : i].GetPositionX(), EggsPos[isSartharion ? i+6 : i].GetPositionY(), EggsPos[isSartharion ? i+6 : i].GetPositionZ(), EggsPos[isSartharion ? i+6 : i].GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000)))
|
||||
Talk(WHISPER_HATCH_EGGS);
|
||||
Creature* cr = nullptr;
|
||||
for (uint8 i = 0; i < 6; ++i)
|
||||
{
|
||||
summons.Summon(cr);
|
||||
cr->SetPhaseMask(16, true);
|
||||
if ((cr = me->SummonCreature(NPC_TWILIGHT_EGG, EggsPos[isSartharion ? i + 6 : i].GetPositionX(), EggsPos[isSartharion ? i + 6 : i].GetPositionY(), EggsPos[isSartharion ? i + 6 : i].GetPositionZ(), EggsPos[isSartharion ? i + 6 : i].GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000)))
|
||||
{
|
||||
summons.Summon(cr);
|
||||
cr->SetPhaseMask(16, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
events.ScheduleEvent(EVENT_MINIBOSS_HATCH_EGGS, 25000);
|
||||
events.PopEvent();
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_MINIBOSS_HATCH_EGGS, 25000);
|
||||
events.PopEvent();
|
||||
break;
|
||||
}
|
||||
case EVENT_MINIBOSS_HATCH_EGGS:
|
||||
{
|
||||
Creature* cr = nullptr;
|
||||
summons.RemoveNotExisting();
|
||||
summons.DespawnEntry(NPC_TWILIGHT_WHELP);
|
||||
for (SummonList::iterator i = summons.begin(); i != summons.end(); ++i)
|
||||
{
|
||||
if ((cr = ObjectAccessor::GetCreature(*me, *i)))
|
||||
Creature* cr = nullptr;
|
||||
summons.RemoveNotExisting();
|
||||
summons.DespawnEntry(NPC_TWILIGHT_WHELP);
|
||||
for (SummonList::iterator i = summons.begin(); i != summons.end(); ++i)
|
||||
{
|
||||
if (!cr->IsAlive())
|
||||
continue;
|
||||
if ((cr = ObjectAccessor::GetCreature(*me, *i)))
|
||||
{
|
||||
if (!cr->IsAlive())
|
||||
continue;
|
||||
|
||||
if (cr->GetEntry() == NPC_TWILIGHT_EGG)
|
||||
if ((cr = me->SummonCreature(NPC_TWILIGHT_WHELP, cr->GetPositionX(), cr->GetPositionY(), cr->GetPositionZ(), cr->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000)))
|
||||
summons2.Summon(cr);
|
||||
if (cr->GetEntry() == NPC_TWILIGHT_EGG)
|
||||
if ((cr = me->SummonCreature(NPC_TWILIGHT_WHELP, cr->GetPositionX(), cr->GetPositionY(), cr->GetPositionZ(), cr->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000)))
|
||||
summons2.Summon(cr);
|
||||
}
|
||||
}
|
||||
|
||||
if (!isSartharion)
|
||||
{
|
||||
// Remove phase shift
|
||||
if (InstanceScript* instance = me->GetInstanceScript())
|
||||
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_TWILIGHT_SHIFT);
|
||||
|
||||
RemoveTwilightPortal();
|
||||
}
|
||||
else if (pInstance)
|
||||
pInstance->SetData(DATA_CLEAR_PORTAL, 0);
|
||||
|
||||
EntryCheckPredicate pred(NPC_TWILIGHT_EGG);
|
||||
summons.DoAction(ACTION_SWITCH_PHASE, pred);
|
||||
events.PopEvent();
|
||||
break;
|
||||
}
|
||||
|
||||
if (!isSartharion)
|
||||
{
|
||||
// Remove phase shift
|
||||
if (InstanceScript* instance = me->GetInstanceScript())
|
||||
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_TWILIGHT_SHIFT);
|
||||
|
||||
RemoveTwilightPortal();
|
||||
}
|
||||
else if (pInstance)
|
||||
pInstance->SetData(DATA_CLEAR_PORTAL, 0);
|
||||
|
||||
EntryCheckPredicate pred(NPC_TWILIGHT_EGG);
|
||||
summons.DoAction(ACTION_SWITCH_PHASE, pred);
|
||||
events.PopEvent();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
@@ -918,7 +918,7 @@ public:
|
||||
events.ScheduleEvent(EVENT_MINIBOSS_SHADOW_FISSURE, 20000);
|
||||
events.ScheduleEvent(EVENT_MINIBOSS_SHADOW_BREATH, 10000);
|
||||
events.ScheduleEvent(EVENT_MINIBOSS_OPEN_PORTAL, 15000);
|
||||
|
||||
|
||||
if (pInstance && !isSartharion)
|
||||
pInstance->SetData(BOSS_SHADRON_EVENT, IN_PROGRESS);
|
||||
|
||||
@@ -949,13 +949,13 @@ public:
|
||||
|
||||
void JustKilled(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() != TYPEID_PLAYER || urand(0,2))
|
||||
if (victim->GetTypeId() != TYPEID_PLAYER || urand(0, 2))
|
||||
return;
|
||||
|
||||
Talk(SAY_SHADRON_SLAY);
|
||||
}
|
||||
|
||||
void SummonedCreatureDies(Creature * /*summon*/, Unit*)
|
||||
void SummonedCreatureDies(Creature* /*summon*/, Unit*)
|
||||
{
|
||||
if (isSartharion && pInstance)
|
||||
{
|
||||
@@ -993,7 +993,7 @@ public:
|
||||
Talk(SAY_SHADRON_RESPOND);
|
||||
me->SetCanFly(true);
|
||||
me->SetSpeed(MOVE_FLIGHT, 3.0f);
|
||||
me->GetMotionMaster()->MovePath(me->GetEntry()*10, false);
|
||||
me->GetMotionMaster()->MovePath(me->GetEntry() * 10, false);
|
||||
timer = 0;
|
||||
}
|
||||
}
|
||||
@@ -1008,7 +1008,7 @@ public:
|
||||
switch (events.GetEvent())
|
||||
{
|
||||
case EVENT_MINIBOSS_SHADOW_BREATH:
|
||||
if (!urand(0,10))
|
||||
if (!urand(0, 10))
|
||||
Talk(SAY_SHADRON_BREATH);
|
||||
me->CastSpell(me->GetVictim(), SPELL_SHADOW_BREATH, false);
|
||||
events.RepeatEvent(17500);
|
||||
@@ -1028,7 +1028,7 @@ public:
|
||||
}
|
||||
else if (pInstance)
|
||||
pInstance->SetData(DATA_ADD_PORTAL, 0);
|
||||
|
||||
|
||||
events.ScheduleEvent(EVENT_MINIBOSS_SPAWN_HELPERS, 2000);
|
||||
events.PopEvent();
|
||||
break;
|
||||
@@ -1183,13 +1183,13 @@ public:
|
||||
|
||||
void JustKilled(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() != TYPEID_PLAYER || urand(0,2))
|
||||
if (victim->GetTypeId() != TYPEID_PLAYER || urand(0, 2))
|
||||
return;
|
||||
|
||||
Talk(SAY_VESPERON_SLAY);
|
||||
}
|
||||
|
||||
void SummonedCreatureDies(Creature * /*summon*/, Unit*)
|
||||
void SummonedCreatureDies(Creature* /*summon*/, Unit*)
|
||||
{
|
||||
if (!isSartharion)
|
||||
ClearInstance();
|
||||
@@ -1222,7 +1222,7 @@ public:
|
||||
Talk(SAY_VESPERON_RESPOND);
|
||||
me->SetCanFly(true);
|
||||
me->SetSpeed(MOVE_FLIGHT, 3.0f);
|
||||
me->GetMotionMaster()->MovePath(me->GetEntry()*10, false);
|
||||
me->GetMotionMaster()->MovePath(me->GetEntry() * 10, false);
|
||||
timer = 0;
|
||||
}
|
||||
return;
|
||||
@@ -1238,7 +1238,7 @@ public:
|
||||
switch (events.GetEvent())
|
||||
{
|
||||
case EVENT_MINIBOSS_SHADOW_BREATH:
|
||||
if (!urand(0,10))
|
||||
if (!urand(0, 10))
|
||||
Talk(SAY_SHADRON_BREATH);
|
||||
me->CastSpell(me->GetVictim(), SPELL_SHADOW_BREATH, false);
|
||||
events.RepeatEvent(17500);
|
||||
@@ -1258,7 +1258,7 @@ public:
|
||||
}
|
||||
else if (pInstance)
|
||||
pInstance->SetData(DATA_ADD_PORTAL, 0);
|
||||
|
||||
|
||||
events.ScheduleEvent(EVENT_MINIBOSS_SPAWN_HELPERS, 2000);
|
||||
events.PopEvent();
|
||||
break;
|
||||
@@ -1310,7 +1310,7 @@ public:
|
||||
void DoAction(int32 param)
|
||||
{
|
||||
if (param == ACTION_SWITCH_PHASE)
|
||||
{
|
||||
{
|
||||
me->DespawnOrUnsummon(1);
|
||||
}
|
||||
}
|
||||
@@ -1338,7 +1338,7 @@ public:
|
||||
|
||||
class spell_sartharion_lava_strike : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
public:
|
||||
spell_sartharion_lava_strike() : SpellScriptLoader("spell_sartharion_lava_strike") {}
|
||||
|
||||
class spell_sartharion_lava_strike_SpellScript : public SpellScript
|
||||
|
||||
@@ -149,7 +149,7 @@ public:
|
||||
if (cr->AI()->GetData(DATA_ACHIEVEMENT_DRAGONS_COUNT) >= 3)
|
||||
return true;
|
||||
break;
|
||||
|
||||
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -206,7 +206,7 @@ public:
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
|
||||
void Load(const char* strIn)
|
||||
{
|
||||
if (!strIn)
|
||||
|
||||
@@ -71,398 +71,398 @@ enum Actions
|
||||
|
||||
class DelayedTalk : public BasicEvent
|
||||
{
|
||||
public:
|
||||
DelayedTalk(Creature* owner, uint32 talkId) : _owner(owner), _talkId(talkId) { }
|
||||
public:
|
||||
DelayedTalk(Creature* owner, uint32 talkId) : _owner(owner), _talkId(talkId) { }
|
||||
|
||||
bool Execute(uint64 /*execTime*/, uint32 /*diff*/)
|
||||
{
|
||||
_owner->AI()->Talk(_talkId);
|
||||
return true;
|
||||
}
|
||||
bool Execute(uint64 /*execTime*/, uint32 /*diff*/)
|
||||
{
|
||||
_owner->AI()->Talk(_talkId);
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
Creature* _owner;
|
||||
uint32 _talkId;
|
||||
private:
|
||||
Creature* _owner;
|
||||
uint32 _talkId;
|
||||
};
|
||||
|
||||
class RestoreFight : public BasicEvent
|
||||
{
|
||||
public:
|
||||
RestoreFight(Creature* owner) : _owner(owner) { }
|
||||
public:
|
||||
RestoreFight(Creature* owner) : _owner(owner) { }
|
||||
|
||||
bool Execute(uint64 /*execTime*/, uint32 /*diff*/)
|
||||
{
|
||||
_owner->SetReactState(REACT_AGGRESSIVE);
|
||||
_owner->SetInCombatWithZone();
|
||||
return true;
|
||||
}
|
||||
bool Execute(uint64 /*execTime*/, uint32 /*diff*/)
|
||||
{
|
||||
_owner->SetReactState(REACT_AGGRESSIVE);
|
||||
_owner->SetInCombatWithZone();
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
Creature* _owner;
|
||||
private:
|
||||
Creature* _owner;
|
||||
};
|
||||
|
||||
class boss_baltharus_the_warborn : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_baltharus_the_warborn() : CreatureScript("boss_baltharus_the_warborn") { }
|
||||
public:
|
||||
boss_baltharus_the_warborn() : CreatureScript("boss_baltharus_the_warborn") { }
|
||||
|
||||
struct boss_baltharus_the_warbornAI : public BossAI
|
||||
struct boss_baltharus_the_warbornAI : public BossAI
|
||||
{
|
||||
boss_baltharus_the_warbornAI(Creature* creature) : BossAI(creature, DATA_BALTHARUS_THE_WARBORN)
|
||||
{
|
||||
boss_baltharus_the_warbornAI(Creature* creature) : BossAI(creature, DATA_BALTHARUS_THE_WARBORN)
|
||||
{
|
||||
_introDone = false;
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
}
|
||||
|
||||
void InitializeAI()
|
||||
{
|
||||
BossAI::InitializeAI();
|
||||
me->CastSpell(me, SPELL_BARRIER_CHANNEL, false);
|
||||
}
|
||||
|
||||
void JustReachedHome()
|
||||
{
|
||||
BossAI::JustReachedHome();
|
||||
me->CastSpell(me, SPELL_BARRIER_CHANNEL, false);
|
||||
}
|
||||
|
||||
void DoAction(int32 action)
|
||||
{
|
||||
if (action == ACTION_INTRO_BALTHARUS && !_introDone)
|
||||
{
|
||||
_introDone = true;
|
||||
me->m_Events.AddEvent(new DelayedTalk(me, SAY_BALTHARUS_INTRO), me->m_Events.CalculateTime(6000));
|
||||
}
|
||||
else if (action == ACTION_CLONE)
|
||||
{
|
||||
me->CastSpell(me, SPELL_REPELLING_WAVE, false);
|
||||
me->CastSpell(me, SPELL_CLEAR_DEBUFFS, false);
|
||||
events.ScheduleEvent(EVENT_SUMMON_CLONE, 1000);
|
||||
}
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
BossAI::EnterCombat(who);
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 11000);
|
||||
events.ScheduleEvent(EVENT_ENERVATING_BRAND, 13000);
|
||||
events.ScheduleEvent(EVENT_BLADE_TEMPEST, 15000);
|
||||
if (!Is25ManRaid())
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH1, 1000);
|
||||
else
|
||||
{
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH2, 1000);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH3, 1000);
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
BossAI::JustDied(killer);
|
||||
|
||||
if (Creature* xerestrasza = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_XERESTRASZA)))
|
||||
xerestrasza->AI()->DoAction(ACTION_BALTHARUS_DEATH);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
}
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
summon->SetHealth(me->GetHealth());
|
||||
summon->CastSpell(summon, SPELL_SPAWN_EFFECT, true);
|
||||
summon->SetReactState(REACT_PASSIVE);
|
||||
summon->m_Events.AddEvent(new RestoreFight(summon), summon->m_Events.CalculateTime(2000));
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_CLEAVE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 24000);
|
||||
break;
|
||||
case EVENT_BLADE_TEMPEST:
|
||||
me->CastSpell(me, SPELL_BLADE_TEMPEST, false);
|
||||
events.ScheduleEvent(EVENT_BLADE_TEMPEST, 24000);
|
||||
break;
|
||||
case EVENT_ENERVATING_BRAND:
|
||||
for (uint8 i = 0; i < RAID_MODE<uint8>(2, 4, 2, 4); i++)
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 45.0f, true, -SPELL_ENERVATING_BRAND))
|
||||
me->CastSpell(target, SPELL_ENERVATING_BRAND, true);
|
||||
events.ScheduleEvent(EVENT_ENERVATING_BRAND, 26000);
|
||||
break;
|
||||
case EVENT_CHECK_HEALTH1:
|
||||
if (me->HealthBelowPct(50))
|
||||
{
|
||||
DoAction(ACTION_CLONE);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH1, 1000);
|
||||
break;
|
||||
case EVENT_CHECK_HEALTH2:
|
||||
if (me->HealthBelowPct(66))
|
||||
{
|
||||
DoAction(ACTION_CLONE);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH2, 1000);
|
||||
break;
|
||||
case EVENT_CHECK_HEALTH3:
|
||||
if (me->HealthBelowPct(33))
|
||||
{
|
||||
DoAction(ACTION_CLONE);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH3, 1000);
|
||||
break;
|
||||
case EVENT_SUMMON_CLONE:
|
||||
me->CastSpell(me, SPELL_CLONE, false);
|
||||
Talk(SAY_CLONE);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
bool _introDone;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_baltharus_the_warbornAI>(creature);
|
||||
_introDone = false;
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
}
|
||||
|
||||
void InitializeAI()
|
||||
{
|
||||
BossAI::InitializeAI();
|
||||
me->CastSpell(me, SPELL_BARRIER_CHANNEL, false);
|
||||
}
|
||||
|
||||
void JustReachedHome()
|
||||
{
|
||||
BossAI::JustReachedHome();
|
||||
me->CastSpell(me, SPELL_BARRIER_CHANNEL, false);
|
||||
}
|
||||
|
||||
void DoAction(int32 action)
|
||||
{
|
||||
if (action == ACTION_INTRO_BALTHARUS && !_introDone)
|
||||
{
|
||||
_introDone = true;
|
||||
me->m_Events.AddEvent(new DelayedTalk(me, SAY_BALTHARUS_INTRO), me->m_Events.CalculateTime(6000));
|
||||
}
|
||||
else if (action == ACTION_CLONE)
|
||||
{
|
||||
me->CastSpell(me, SPELL_REPELLING_WAVE, false);
|
||||
me->CastSpell(me, SPELL_CLEAR_DEBUFFS, false);
|
||||
events.ScheduleEvent(EVENT_SUMMON_CLONE, 1000);
|
||||
}
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
BossAI::EnterCombat(who);
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 11000);
|
||||
events.ScheduleEvent(EVENT_ENERVATING_BRAND, 13000);
|
||||
events.ScheduleEvent(EVENT_BLADE_TEMPEST, 15000);
|
||||
if (!Is25ManRaid())
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH1, 1000);
|
||||
else
|
||||
{
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH2, 1000);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH3, 1000);
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
BossAI::JustDied(killer);
|
||||
|
||||
if (Creature* xerestrasza = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_XERESTRASZA)))
|
||||
xerestrasza->AI()->DoAction(ACTION_BALTHARUS_DEATH);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
}
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
summon->SetHealth(me->GetHealth());
|
||||
summon->CastSpell(summon, SPELL_SPAWN_EFFECT, true);
|
||||
summon->SetReactState(REACT_PASSIVE);
|
||||
summon->m_Events.AddEvent(new RestoreFight(summon), summon->m_Events.CalculateTime(2000));
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_CLEAVE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 24000);
|
||||
break;
|
||||
case EVENT_BLADE_TEMPEST:
|
||||
me->CastSpell(me, SPELL_BLADE_TEMPEST, false);
|
||||
events.ScheduleEvent(EVENT_BLADE_TEMPEST, 24000);
|
||||
break;
|
||||
case EVENT_ENERVATING_BRAND:
|
||||
for (uint8 i = 0; i < RAID_MODE<uint8>(2, 4, 2, 4); i++)
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 45.0f, true, -SPELL_ENERVATING_BRAND))
|
||||
me->CastSpell(target, SPELL_ENERVATING_BRAND, true);
|
||||
events.ScheduleEvent(EVENT_ENERVATING_BRAND, 26000);
|
||||
break;
|
||||
case EVENT_CHECK_HEALTH1:
|
||||
if (me->HealthBelowPct(50))
|
||||
{
|
||||
DoAction(ACTION_CLONE);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH1, 1000);
|
||||
break;
|
||||
case EVENT_CHECK_HEALTH2:
|
||||
if (me->HealthBelowPct(66))
|
||||
{
|
||||
DoAction(ACTION_CLONE);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH2, 1000);
|
||||
break;
|
||||
case EVENT_CHECK_HEALTH3:
|
||||
if (me->HealthBelowPct(33))
|
||||
{
|
||||
DoAction(ACTION_CLONE);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH3, 1000);
|
||||
break;
|
||||
case EVENT_SUMMON_CLONE:
|
||||
me->CastSpell(me, SPELL_CLONE, false);
|
||||
Talk(SAY_CLONE);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
bool _introDone;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_baltharus_the_warbornAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
class npc_baltharus_the_warborn_clone : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_baltharus_the_warborn_clone() : CreatureScript("npc_baltharus_the_warborn_clone") { }
|
||||
public:
|
||||
npc_baltharus_the_warborn_clone() : CreatureScript("npc_baltharus_the_warborn_clone") { }
|
||||
|
||||
struct npc_baltharus_the_warborn_cloneAI : public ScriptedAI
|
||||
struct npc_baltharus_the_warborn_cloneAI : public ScriptedAI
|
||||
{
|
||||
npc_baltharus_the_warborn_cloneAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
npc_baltharus_the_warborn_cloneAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
_events.Reset();
|
||||
_events.ScheduleEvent(EVENT_CLEAVE, urand(5000, 10000));
|
||||
_events.ScheduleEvent(EVENT_BLADE_TEMPEST, urand(18000, 25000));
|
||||
_events.ScheduleEvent(EVENT_ENERVATING_BRAND, urand(10000, 15000));
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
_events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (_events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_CLEAVE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false);
|
||||
_events.ScheduleEvent(EVENT_CLEAVE, 24000);
|
||||
break;
|
||||
case EVENT_BLADE_TEMPEST:
|
||||
me->CastSpell(me, SPELL_BLADE_TEMPEST, false);
|
||||
_events.ScheduleEvent(EVENT_BLADE_TEMPEST, 24000);
|
||||
break;
|
||||
case EVENT_ENERVATING_BRAND:
|
||||
for (uint8 i = 0; i < RAID_MODE<uint8>(4, 10, 4, 10); i++)
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 45.0f, true, -SPELL_ENERVATING_BRAND))
|
||||
me->CastSpell(target, SPELL_ENERVATING_BRAND, true);
|
||||
_events.ScheduleEvent(EVENT_ENERVATING_BRAND, 26000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
EventMap _events;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<npc_baltharus_the_warborn_cloneAI>(creature);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
_events.Reset();
|
||||
_events.ScheduleEvent(EVENT_CLEAVE, urand(5000, 10000));
|
||||
_events.ScheduleEvent(EVENT_BLADE_TEMPEST, urand(18000, 25000));
|
||||
_events.ScheduleEvent(EVENT_ENERVATING_BRAND, urand(10000, 15000));
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
_events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (_events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_CLEAVE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false);
|
||||
_events.ScheduleEvent(EVENT_CLEAVE, 24000);
|
||||
break;
|
||||
case EVENT_BLADE_TEMPEST:
|
||||
me->CastSpell(me, SPELL_BLADE_TEMPEST, false);
|
||||
_events.ScheduleEvent(EVENT_BLADE_TEMPEST, 24000);
|
||||
break;
|
||||
case EVENT_ENERVATING_BRAND:
|
||||
for (uint8 i = 0; i < RAID_MODE<uint8>(4, 10, 4, 10); i++)
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 45.0f, true, -SPELL_ENERVATING_BRAND))
|
||||
me->CastSpell(target, SPELL_ENERVATING_BRAND, true);
|
||||
_events.ScheduleEvent(EVENT_ENERVATING_BRAND, 26000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
EventMap _events;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<npc_baltharus_the_warborn_cloneAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
class spell_baltharus_enervating_brand_trigger : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_baltharus_enervating_brand_trigger() : SpellScriptLoader("spell_baltharus_enervating_brand_trigger") { }
|
||||
public:
|
||||
spell_baltharus_enervating_brand_trigger() : SpellScriptLoader("spell_baltharus_enervating_brand_trigger") { }
|
||||
|
||||
class spell_baltharus_enervating_brand_trigger_SpellScript : public SpellScript
|
||||
class spell_baltharus_enervating_brand_trigger_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_baltharus_enervating_brand_trigger_SpellScript);
|
||||
|
||||
void CheckDistance()
|
||||
{
|
||||
PrepareSpellScript(spell_baltharus_enervating_brand_trigger_SpellScript);
|
||||
|
||||
void CheckDistance()
|
||||
{
|
||||
if (Unit* caster = GetOriginalCaster())
|
||||
if (Unit* target = GetHitUnit())
|
||||
if (target == GetCaster()
|
||||
if (Unit* caster = GetOriginalCaster())
|
||||
if (Unit* target = GetHitUnit())
|
||||
if (target == GetCaster()
|
||||
// the spell has an unlimited range, so we need this check
|
||||
&& target->GetDistance2d(caster) <= 12.0f)
|
||||
target->CastSpell(caster, SPELL_SIPHONED_MIGHT, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnHit += SpellHitFn(spell_baltharus_enervating_brand_trigger_SpellScript::CheckDistance);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_baltharus_enervating_brand_trigger_SpellScript();
|
||||
target->CastSpell(caster, SPELL_SIPHONED_MIGHT, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnHit += SpellHitFn(spell_baltharus_enervating_brand_trigger_SpellScript::CheckDistance);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_baltharus_enervating_brand_trigger_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
class npc_xerestrasza : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_xerestrasza() : CreatureScript("npc_xerestrasza") { }
|
||||
public:
|
||||
npc_xerestrasza() : CreatureScript("npc_xerestrasza") { }
|
||||
|
||||
struct npc_xerestraszaAI : public ScriptedAI
|
||||
struct npc_xerestraszaAI : public ScriptedAI
|
||||
{
|
||||
npc_xerestraszaAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
npc_xerestraszaAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
_isIntro = true;
|
||||
_introDone = false;
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_events.Reset();
|
||||
me->RemoveFlag(UNIT_NPC_FLAGS, GOSSIP_OPTION_QUESTGIVER);
|
||||
|
||||
// Xinef: after soft reset npc is no longer present
|
||||
if (me->GetInstanceScript()->GetBossState(DATA_BALTHARUS_THE_WARBORN) == DONE)
|
||||
me->DespawnOrUnsummon(1);
|
||||
}
|
||||
|
||||
void DoAction(int32 action)
|
||||
{
|
||||
if (action == ACTION_BALTHARUS_DEATH)
|
||||
{
|
||||
me->setActive(true);
|
||||
_isIntro = false;
|
||||
|
||||
_events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_0, 6000);
|
||||
_events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_1, 22000);
|
||||
_events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_2, 31000);
|
||||
_events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_3, 38000);
|
||||
_events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_4, 48000);
|
||||
_events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_5, 57000);
|
||||
_events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_6, 67000);
|
||||
_events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_7, 75000);
|
||||
}
|
||||
else if (action == ACTION_INTRO_BALTHARUS && !_introDone && me->IsAlive())
|
||||
{
|
||||
_introDone = true;
|
||||
Talk(SAY_XERESTRASZA_INTRO);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (_isIntro)
|
||||
return;
|
||||
|
||||
_events.Update(diff);
|
||||
switch (_events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_XERESTRASZA_EVENT_0:
|
||||
Talk(SAY_XERESTRASZA_EVENT);
|
||||
me->SetWalk(true);
|
||||
me->GetMotionMaster()->MovePoint(0, 3151.236f, 379.8733f, 86.31996f);
|
||||
break;
|
||||
case EVENT_XERESTRASZA_EVENT_1:
|
||||
Talk(SAY_XERESTRASZA_EVENT_1);
|
||||
break;
|
||||
case EVENT_XERESTRASZA_EVENT_2:
|
||||
Talk(SAY_XERESTRASZA_EVENT_2);
|
||||
break;
|
||||
case EVENT_XERESTRASZA_EVENT_3:
|
||||
Talk(SAY_XERESTRASZA_EVENT_3);
|
||||
break;
|
||||
case EVENT_XERESTRASZA_EVENT_4:
|
||||
Talk(SAY_XERESTRASZA_EVENT_4);
|
||||
break;
|
||||
case EVENT_XERESTRASZA_EVENT_5:
|
||||
Talk(SAY_XERESTRASZA_EVENT_5);
|
||||
break;
|
||||
case EVENT_XERESTRASZA_EVENT_6:
|
||||
Talk(SAY_XERESTRASZA_EVENT_6);
|
||||
break;
|
||||
case EVENT_XERESTRASZA_EVENT_7:
|
||||
me->SetFlag(UNIT_NPC_FLAGS, GOSSIP_OPTION_QUESTGIVER);
|
||||
Talk(SAY_XERESTRASZA_EVENT_7);
|
||||
me->setActive(false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
EventMap _events;
|
||||
bool _isIntro;
|
||||
bool _introDone;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<npc_xerestraszaAI>(creature);
|
||||
_isIntro = true;
|
||||
_introDone = false;
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_events.Reset();
|
||||
me->RemoveFlag(UNIT_NPC_FLAGS, GOSSIP_OPTION_QUESTGIVER);
|
||||
|
||||
// Xinef: after soft reset npc is no longer present
|
||||
if (me->GetInstanceScript()->GetBossState(DATA_BALTHARUS_THE_WARBORN) == DONE)
|
||||
me->DespawnOrUnsummon(1);
|
||||
}
|
||||
|
||||
void DoAction(int32 action)
|
||||
{
|
||||
if (action == ACTION_BALTHARUS_DEATH)
|
||||
{
|
||||
me->setActive(true);
|
||||
_isIntro = false;
|
||||
|
||||
_events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_0, 6000);
|
||||
_events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_1, 22000);
|
||||
_events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_2, 31000);
|
||||
_events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_3, 38000);
|
||||
_events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_4, 48000);
|
||||
_events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_5, 57000);
|
||||
_events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_6, 67000);
|
||||
_events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_7, 75000);
|
||||
}
|
||||
else if (action == ACTION_INTRO_BALTHARUS && !_introDone && me->IsAlive())
|
||||
{
|
||||
_introDone = true;
|
||||
Talk(SAY_XERESTRASZA_INTRO);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (_isIntro)
|
||||
return;
|
||||
|
||||
_events.Update(diff);
|
||||
switch (_events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_XERESTRASZA_EVENT_0:
|
||||
Talk(SAY_XERESTRASZA_EVENT);
|
||||
me->SetWalk(true);
|
||||
me->GetMotionMaster()->MovePoint(0, 3151.236f, 379.8733f, 86.31996f);
|
||||
break;
|
||||
case EVENT_XERESTRASZA_EVENT_1:
|
||||
Talk(SAY_XERESTRASZA_EVENT_1);
|
||||
break;
|
||||
case EVENT_XERESTRASZA_EVENT_2:
|
||||
Talk(SAY_XERESTRASZA_EVENT_2);
|
||||
break;
|
||||
case EVENT_XERESTRASZA_EVENT_3:
|
||||
Talk(SAY_XERESTRASZA_EVENT_3);
|
||||
break;
|
||||
case EVENT_XERESTRASZA_EVENT_4:
|
||||
Talk(SAY_XERESTRASZA_EVENT_4);
|
||||
break;
|
||||
case EVENT_XERESTRASZA_EVENT_5:
|
||||
Talk(SAY_XERESTRASZA_EVENT_5);
|
||||
break;
|
||||
case EVENT_XERESTRASZA_EVENT_6:
|
||||
Talk(SAY_XERESTRASZA_EVENT_6);
|
||||
break;
|
||||
case EVENT_XERESTRASZA_EVENT_7:
|
||||
me->SetFlag(UNIT_NPC_FLAGS, GOSSIP_OPTION_QUESTGIVER);
|
||||
Talk(SAY_XERESTRASZA_EVENT_7);
|
||||
me->setActive(false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
EventMap _events;
|
||||
bool _isIntro;
|
||||
bool _introDone;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<npc_xerestraszaAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
class at_baltharus_plateau : public AreaTriggerScript
|
||||
{
|
||||
public:
|
||||
at_baltharus_plateau() : AreaTriggerScript("at_baltharus_plateau") { }
|
||||
public:
|
||||
at_baltharus_plateau() : AreaTriggerScript("at_baltharus_plateau") { }
|
||||
|
||||
bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/)
|
||||
bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/)
|
||||
{
|
||||
if (InstanceScript* instance = player->GetInstanceScript())
|
||||
{
|
||||
if (InstanceScript* instance = player->GetInstanceScript())
|
||||
{
|
||||
if (Creature* xerestrasza = ObjectAccessor::GetCreature(*player, instance->GetData64(NPC_XERESTRASZA)))
|
||||
xerestrasza->AI()->DoAction(ACTION_INTRO_BALTHARUS);
|
||||
if (Creature* xerestrasza = ObjectAccessor::GetCreature(*player, instance->GetData64(NPC_XERESTRASZA)))
|
||||
xerestrasza->AI()->DoAction(ACTION_INTRO_BALTHARUS);
|
||||
|
||||
if (Creature* baltharus = ObjectAccessor::GetCreature(*player, instance->GetData64(NPC_BALTHARUS_THE_WARBORN)))
|
||||
baltharus->AI()->DoAction(ACTION_INTRO_BALTHARUS);
|
||||
}
|
||||
|
||||
return true;
|
||||
if (Creature* baltharus = ObjectAccessor::GetCreature(*player, instance->GetData64(NPC_BALTHARUS_THE_WARBORN)))
|
||||
baltharus->AI()->DoAction(ACTION_INTRO_BALTHARUS);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_baltharus_the_warborn()
|
||||
|
||||
@@ -79,204 +79,204 @@ Position const FlamecallerWaypointsW[MAX_PATH_FLAMECALLER_WAYPOINTS] =
|
||||
|
||||
class boss_general_zarithrian : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_general_zarithrian() : CreatureScript("boss_general_zarithrian") { }
|
||||
public:
|
||||
boss_general_zarithrian() : CreatureScript("boss_general_zarithrian") { }
|
||||
|
||||
struct boss_general_zarithrianAI : public BossAI
|
||||
struct boss_general_zarithrianAI : public BossAI
|
||||
{
|
||||
boss_general_zarithrianAI(Creature* creature) : BossAI(creature, DATA_GENERAL_ZARITHRIAN)
|
||||
{
|
||||
boss_general_zarithrianAI(Creature* creature) : BossAI(creature, DATA_GENERAL_ZARITHRIAN)
|
||||
{
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
if (instance->GetBossState(DATA_SAVIANA_RAGEFIRE) == DONE && instance->GetBossState(DATA_BALTHARUS_THE_WARBORN) == DONE)
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NOT_SELECTABLE);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 9000);
|
||||
events.ScheduleEvent(EVENT_INTIDMDATING_ROAR, 14000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ADDS1, 18000);
|
||||
if (Is25ManRaid())
|
||||
events.ScheduleEvent(EVENT_SUMMON_ADDS2, 20000);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
BossAI::JustDied(killer);
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SUMMON_ADDS1:
|
||||
Talk(SAY_ADDS);
|
||||
if (Creature* stalker1 = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ZARITHRIAN_SPAWN_STALKER_1)))
|
||||
stalker1->CastSpell(stalker1, SPELL_SUMMON_FLAMECALLER, false);
|
||||
if (Creature* stalker2 = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ZARITHRIAN_SPAWN_STALKER_2)))
|
||||
stalker2->CastSpell(stalker2, SPELL_SUMMON_FLAMECALLER, false);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ADDS1, 40000);
|
||||
break;
|
||||
case EVENT_SUMMON_ADDS2:
|
||||
if (Creature* stalker1 = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ZARITHRIAN_SPAWN_STALKER_1)))
|
||||
stalker1->CastSpell(stalker1, SPELL_SUMMON_FLAMECALLER, false);
|
||||
if (Creature* stalker2 = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ZARITHRIAN_SPAWN_STALKER_2)))
|
||||
stalker2->CastSpell(stalker2, SPELL_SUMMON_FLAMECALLER, false);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ADDS2, 40000);
|
||||
break;
|
||||
case EVENT_INTIDMDATING_ROAR:
|
||||
me->CastSpell(me, SPELL_INTIMIDATING_ROAR, false);
|
||||
events.ScheduleEvent(EVENT_INTIDMDATING_ROAR, 30000);
|
||||
break;
|
||||
case EVENT_CLEAVE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_CLEAVE_ARMOR, false);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 15000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
EnterEvadeIfOutOfCombatArea();
|
||||
}
|
||||
|
||||
bool CheckEvadeIfOutOfCombatArea() const
|
||||
{
|
||||
return me->GetPositionX() > 3060.0f;
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_general_zarithrianAI>(creature);
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
if (instance->GetBossState(DATA_SAVIANA_RAGEFIRE) == DONE && instance->GetBossState(DATA_BALTHARUS_THE_WARBORN) == DONE)
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NOT_SELECTABLE);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 9000);
|
||||
events.ScheduleEvent(EVENT_INTIDMDATING_ROAR, 14000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ADDS1, 18000);
|
||||
if (Is25ManRaid())
|
||||
events.ScheduleEvent(EVENT_SUMMON_ADDS2, 20000);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
BossAI::JustDied(killer);
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SUMMON_ADDS1:
|
||||
Talk(SAY_ADDS);
|
||||
if (Creature* stalker1 = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ZARITHRIAN_SPAWN_STALKER_1)))
|
||||
stalker1->CastSpell(stalker1, SPELL_SUMMON_FLAMECALLER, false);
|
||||
if (Creature* stalker2 = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ZARITHRIAN_SPAWN_STALKER_2)))
|
||||
stalker2->CastSpell(stalker2, SPELL_SUMMON_FLAMECALLER, false);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ADDS1, 40000);
|
||||
break;
|
||||
case EVENT_SUMMON_ADDS2:
|
||||
if (Creature* stalker1 = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ZARITHRIAN_SPAWN_STALKER_1)))
|
||||
stalker1->CastSpell(stalker1, SPELL_SUMMON_FLAMECALLER, false);
|
||||
if (Creature* stalker2 = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ZARITHRIAN_SPAWN_STALKER_2)))
|
||||
stalker2->CastSpell(stalker2, SPELL_SUMMON_FLAMECALLER, false);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ADDS2, 40000);
|
||||
break;
|
||||
case EVENT_INTIDMDATING_ROAR:
|
||||
me->CastSpell(me, SPELL_INTIMIDATING_ROAR, false);
|
||||
events.ScheduleEvent(EVENT_INTIDMDATING_ROAR, 30000);
|
||||
break;
|
||||
case EVENT_CLEAVE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_CLEAVE_ARMOR, false);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 15000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
EnterEvadeIfOutOfCombatArea();
|
||||
}
|
||||
|
||||
bool CheckEvadeIfOutOfCombatArea() const
|
||||
{
|
||||
return me->GetPositionX() > 3060.0f;
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_general_zarithrianAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
class npc_onyx_flamecaller : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_onyx_flamecaller() : CreatureScript("npc_onyx_flamecaller") { }
|
||||
public:
|
||||
npc_onyx_flamecaller() : CreatureScript("npc_onyx_flamecaller") { }
|
||||
|
||||
struct npc_onyx_flamecallerAI : public npc_escortAI
|
||||
struct npc_onyx_flamecallerAI : public npc_escortAI
|
||||
{
|
||||
npc_onyx_flamecallerAI(Creature* creature) : npc_escortAI(creature), _instance(creature->GetInstanceScript())
|
||||
{
|
||||
npc_onyx_flamecallerAI(Creature* creature) : npc_escortAI(creature), _instance(creature->GetInstanceScript())
|
||||
{
|
||||
npc_escortAI::SetDespawnAtEnd(false);
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_lavaGoutCount = 0;
|
||||
AddWaypoints();
|
||||
Start(true, true);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
_events.Reset();
|
||||
_events.ScheduleEvent(EVENT_BLAST_NOVA, urand(20000, 30000));
|
||||
_events.ScheduleEvent(EVENT_LAVA_GOUT, 5000);
|
||||
}
|
||||
|
||||
void EnterEvadeMode()
|
||||
{
|
||||
// Prevent EvadeMode
|
||||
}
|
||||
|
||||
void IsSummonedBy(Unit* /*summoner*/)
|
||||
{
|
||||
// Let Zarithrian count as summoner. _instance cant be null since we got GetRubySanctumAI
|
||||
if (Creature* zarithrian = ObjectAccessor::GetCreature(*me, _instance->GetData64(NPC_GENERAL_ZARITHRIAN)))
|
||||
zarithrian->AI()->JustSummoned(me);
|
||||
}
|
||||
|
||||
void WaypointReached(uint32 waypointId)
|
||||
{
|
||||
if (waypointId == MAX_PATH_FLAMECALLER_WAYPOINTS)
|
||||
me->SetInCombatWithZone();
|
||||
}
|
||||
|
||||
void AddWaypoints()
|
||||
{
|
||||
if (me->GetPositionY() < 500.0f)
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_PATH_FLAMECALLER_WAYPOINTS; i++)
|
||||
AddWaypoint(i+1, FlamecallerWaypointsE[i].GetPositionX(), FlamecallerWaypointsE[i].GetPositionY(), FlamecallerWaypointsE[i].GetPositionZ());
|
||||
}
|
||||
else
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_PATH_FLAMECALLER_WAYPOINTS; i++)
|
||||
AddWaypoint(i+1, FlamecallerWaypointsW[i].GetPositionX(), FlamecallerWaypointsW[i].GetPositionY(), FlamecallerWaypointsW[i].GetPositionZ());
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateEscortAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
_events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (_events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_BLAST_NOVA:
|
||||
DoCastAOE(SPELL_BLAST_NOVA);
|
||||
_events.ScheduleEvent(EVENT_BLAST_NOVA, urand(20000, 30000));
|
||||
break;
|
||||
case EVENT_LAVA_GOUT:
|
||||
if (_lavaGoutCount >= 3)
|
||||
{
|
||||
_lavaGoutCount = 0;
|
||||
_events.ScheduleEvent(EVENT_LAVA_GOUT, 8000);
|
||||
break;
|
||||
}
|
||||
DoCastVictim(SPELL_LAVA_GOUT);
|
||||
_lavaGoutCount++;
|
||||
_events.ScheduleEvent(EVENT_LAVA_GOUT, 1500);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
private:
|
||||
EventMap _events;
|
||||
InstanceScript* _instance;
|
||||
uint8 _lavaGoutCount;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<npc_onyx_flamecallerAI>(creature);
|
||||
npc_escortAI::SetDespawnAtEnd(false);
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_lavaGoutCount = 0;
|
||||
AddWaypoints();
|
||||
Start(true, true);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
_events.Reset();
|
||||
_events.ScheduleEvent(EVENT_BLAST_NOVA, urand(20000, 30000));
|
||||
_events.ScheduleEvent(EVENT_LAVA_GOUT, 5000);
|
||||
}
|
||||
|
||||
void EnterEvadeMode()
|
||||
{
|
||||
// Prevent EvadeMode
|
||||
}
|
||||
|
||||
void IsSummonedBy(Unit* /*summoner*/)
|
||||
{
|
||||
// Let Zarithrian count as summoner. _instance cant be null since we got GetRubySanctumAI
|
||||
if (Creature* zarithrian = ObjectAccessor::GetCreature(*me, _instance->GetData64(NPC_GENERAL_ZARITHRIAN)))
|
||||
zarithrian->AI()->JustSummoned(me);
|
||||
}
|
||||
|
||||
void WaypointReached(uint32 waypointId)
|
||||
{
|
||||
if (waypointId == MAX_PATH_FLAMECALLER_WAYPOINTS)
|
||||
me->SetInCombatWithZone();
|
||||
}
|
||||
|
||||
void AddWaypoints()
|
||||
{
|
||||
if (me->GetPositionY() < 500.0f)
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_PATH_FLAMECALLER_WAYPOINTS; i++)
|
||||
AddWaypoint(i + 1, FlamecallerWaypointsE[i].GetPositionX(), FlamecallerWaypointsE[i].GetPositionY(), FlamecallerWaypointsE[i].GetPositionZ());
|
||||
}
|
||||
else
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_PATH_FLAMECALLER_WAYPOINTS; i++)
|
||||
AddWaypoint(i + 1, FlamecallerWaypointsW[i].GetPositionX(), FlamecallerWaypointsW[i].GetPositionY(), FlamecallerWaypointsW[i].GetPositionZ());
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateEscortAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
_events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (_events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_BLAST_NOVA:
|
||||
DoCastAOE(SPELL_BLAST_NOVA);
|
||||
_events.ScheduleEvent(EVENT_BLAST_NOVA, urand(20000, 30000));
|
||||
break;
|
||||
case EVENT_LAVA_GOUT:
|
||||
if (_lavaGoutCount >= 3)
|
||||
{
|
||||
_lavaGoutCount = 0;
|
||||
_events.ScheduleEvent(EVENT_LAVA_GOUT, 8000);
|
||||
break;
|
||||
}
|
||||
DoCastVictim(SPELL_LAVA_GOUT);
|
||||
_lavaGoutCount++;
|
||||
_events.ScheduleEvent(EVENT_LAVA_GOUT, 1500);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
private:
|
||||
EventMap _events;
|
||||
InstanceScript* _instance;
|
||||
uint8 _lavaGoutCount;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<npc_onyx_flamecallerAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_general_zarithrian()
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -46,183 +46,183 @@ enum Misc
|
||||
|
||||
class boss_saviana_ragefire : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_saviana_ragefire() : CreatureScript("boss_saviana_ragefire") { }
|
||||
public:
|
||||
boss_saviana_ragefire() : CreatureScript("boss_saviana_ragefire") { }
|
||||
|
||||
struct boss_saviana_ragefireAI : public BossAI
|
||||
struct boss_saviana_ragefireAI : public BossAI
|
||||
{
|
||||
boss_saviana_ragefireAI(Creature* creature) : BossAI(creature, DATA_SAVIANA_RAGEFIRE)
|
||||
{
|
||||
boss_saviana_ragefireAI(Creature* creature) : BossAI(creature, DATA_SAVIANA_RAGEFIRE)
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
events.ScheduleEvent(EVENT_ENRAGE, 15000);
|
||||
events.ScheduleEvent(EVENT_FLAME_BREATH, 10000);
|
||||
events.ScheduleEvent(EVENT_FLIGHT, 30000);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
BossAI::JustDied(killer);
|
||||
me->PlayDirectSound(SOUND_ID_DEATH);
|
||||
}
|
||||
|
||||
void MovementInform(uint32 type, uint32 point)
|
||||
{
|
||||
if (type != POINT_MOTION_TYPE && type != EFFECT_MOTION_TYPE)
|
||||
return;
|
||||
|
||||
switch (point)
|
||||
{
|
||||
case POINT_FLIGHT:
|
||||
me->SetFacingTo(4.69f);
|
||||
events.ScheduleEvent(EVENT_CONFLAGRATION, 1000);
|
||||
events.ScheduleEvent(EVENT_LAND_BACK, 7000);
|
||||
Talk(SAY_CONFLAGRATION);
|
||||
break;
|
||||
case POINT_LAND:
|
||||
me->SetDisableGravity(false);
|
||||
events.ScheduleEvent(EVENT_LAND_GROUND, 500);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void Reset()
|
||||
void JustReachedHome()
|
||||
{
|
||||
BossAI::JustReachedHome();
|
||||
me->SetDisableGravity(false);
|
||||
me->SetHover(false);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
BossAI::Reset();
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
Talk(SAY_KILL);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
}
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
events.ScheduleEvent(EVENT_ENRAGE, 15000);
|
||||
events.ScheduleEvent(EVENT_FLAME_BREATH, 10000);
|
||||
events.ScheduleEvent(EVENT_FLIGHT, 30000);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
BossAI::JustDied(killer);
|
||||
me->PlayDirectSound(SOUND_ID_DEATH);
|
||||
}
|
||||
|
||||
void MovementInform(uint32 type, uint32 point)
|
||||
{
|
||||
if (type != POINT_MOTION_TYPE && type != EFFECT_MOTION_TYPE)
|
||||
return;
|
||||
|
||||
switch (point)
|
||||
{
|
||||
case POINT_FLIGHT:
|
||||
me->SetFacingTo(4.69f);
|
||||
events.ScheduleEvent(EVENT_CONFLAGRATION, 1000);
|
||||
events.ScheduleEvent(EVENT_LAND_BACK, 7000);
|
||||
Talk(SAY_CONFLAGRATION);
|
||||
break;
|
||||
case POINT_LAND:
|
||||
me->SetDisableGravity(false);
|
||||
events.ScheduleEvent(EVENT_LAND_GROUND, 500);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void JustReachedHome()
|
||||
{
|
||||
BossAI::JustReachedHome();
|
||||
me->SetDisableGravity(false);
|
||||
me->SetHover(false);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_FLIGHT:
|
||||
case EVENT_FLIGHT:
|
||||
{
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->AttackStop();
|
||||
me->SetDisableGravity(true);
|
||||
me->GetMotionMaster()->MovePoint(POINT_TAKEOFF, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+6.0f, false);
|
||||
me->GetMotionMaster()->MovePoint(POINT_TAKEOFF, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 6.0f, false);
|
||||
events.ScheduleEvent(EVENT_FLIGHT, 50000);
|
||||
events.DelayEvents(15000);
|
||||
events.ScheduleEvent(EVENT_AIR_MOVEMENT, 2000);
|
||||
break;
|
||||
}
|
||||
case EVENT_CONFLAGRATION:
|
||||
me->CastCustomSpell(SPELL_CONFLAGRATION, SPELLVALUE_MAX_TARGETS, RAID_MODE(3, 6, 3, 6), me, true);
|
||||
break;
|
||||
case EVENT_ENRAGE:
|
||||
me->CastSpell(me, SPELL_ENRAGE, false);
|
||||
Talk(EMOTE_ENRAGED);
|
||||
events.ScheduleEvent(EVENT_ENRAGE, urand(15000, 20000));
|
||||
break;
|
||||
case EVENT_FLAME_BREATH:
|
||||
me->CastSpell(me->GetVictim(), SPELL_FLAME_BREATH, false);
|
||||
events.ScheduleEvent(EVENT_FLAME_BREATH, urand(20000, 30000));
|
||||
break;
|
||||
case EVENT_AIR_MOVEMENT:
|
||||
me->GetMotionMaster()->MovePoint(POINT_FLIGHT, 3155.51f, 683.844f, 95.0f, false);
|
||||
break;
|
||||
case EVENT_LAND_BACK:
|
||||
me->GetMotionMaster()->MovePoint(POINT_LAND, 3151.07f, 636.443f, 80.0f, false);
|
||||
break;
|
||||
case EVENT_LAND_GROUND:
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
if (me->GetVictim())
|
||||
me->GetMotionMaster()->MoveChase(me->GetVictim());
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
case EVENT_CONFLAGRATION:
|
||||
me->CastCustomSpell(SPELL_CONFLAGRATION, SPELLVALUE_MAX_TARGETS, RAID_MODE(3, 6, 3, 6), me, true);
|
||||
break;
|
||||
case EVENT_ENRAGE:
|
||||
me->CastSpell(me, SPELL_ENRAGE, false);
|
||||
Talk(EMOTE_ENRAGED);
|
||||
events.ScheduleEvent(EVENT_ENRAGE, urand(15000, 20000));
|
||||
break;
|
||||
case EVENT_FLAME_BREATH:
|
||||
me->CastSpell(me->GetVictim(), SPELL_FLAME_BREATH, false);
|
||||
events.ScheduleEvent(EVENT_FLAME_BREATH, urand(20000, 30000));
|
||||
break;
|
||||
case EVENT_AIR_MOVEMENT:
|
||||
me->GetMotionMaster()->MovePoint(POINT_FLIGHT, 3155.51f, 683.844f, 95.0f, false);
|
||||
break;
|
||||
case EVENT_LAND_BACK:
|
||||
me->GetMotionMaster()->MovePoint(POINT_LAND, 3151.07f, 636.443f, 80.0f, false);
|
||||
break;
|
||||
case EVENT_LAND_GROUND:
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
if (me->GetVictim())
|
||||
me->GetMotionMaster()->MoveChase(me->GetVictim());
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_saviana_ragefireAI>(creature);
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_saviana_ragefireAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
class spell_saviana_conflagration_init : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_saviana_conflagration_init() : SpellScriptLoader("spell_saviana_conflagration_init") { }
|
||||
public:
|
||||
spell_saviana_conflagration_init() : SpellScriptLoader("spell_saviana_conflagration_init") { }
|
||||
|
||||
class spell_saviana_conflagration_init_SpellScript : public SpellScript
|
||||
class spell_saviana_conflagration_init_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_saviana_conflagration_init_SpellScript);
|
||||
|
||||
void HandleDummy(SpellEffIndex effIndex)
|
||||
{
|
||||
PrepareSpellScript(spell_saviana_conflagration_init_SpellScript);
|
||||
|
||||
void HandleDummy(SpellEffIndex effIndex)
|
||||
{
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
GetCaster()->CastSpell(GetHitUnit(), SPELL_FLAME_BEACON, true);
|
||||
GetCaster()->CastSpell(GetHitUnit(), SPELL_CONFLAGRATION_MISSLE, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_saviana_conflagration_init_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_saviana_conflagration_init_SpellScript();
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
GetCaster()->CastSpell(GetHitUnit(), SPELL_FLAME_BEACON, true);
|
||||
GetCaster()->CastSpell(GetHitUnit(), SPELL_CONFLAGRATION_MISSLE, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_saviana_conflagration_init_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_saviana_conflagration_init_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_saviana_conflagration_throwback : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_saviana_conflagration_throwback() : SpellScriptLoader("spell_saviana_conflagration_throwback") { }
|
||||
public:
|
||||
spell_saviana_conflagration_throwback() : SpellScriptLoader("spell_saviana_conflagration_throwback") { }
|
||||
|
||||
class spell_saviana_conflagration_throwback_SpellScript : public SpellScript
|
||||
class spell_saviana_conflagration_throwback_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_saviana_conflagration_throwback_SpellScript);
|
||||
|
||||
void HandleScript(SpellEffIndex effIndex)
|
||||
{
|
||||
PrepareSpellScript(spell_saviana_conflagration_throwback_SpellScript);
|
||||
|
||||
void HandleScript(SpellEffIndex effIndex)
|
||||
{
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
GetHitUnit()->CastSpell(GetCaster(), uint32(GetEffectValue()), true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_saviana_conflagration_throwback_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_saviana_conflagration_throwback_SpellScript();
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
GetHitUnit()->CastSpell(GetCaster(), uint32(GetEffectValue()), true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_saviana_conflagration_throwback_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_saviana_conflagration_throwback_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_saviana_ragefire()
|
||||
|
||||
@@ -25,285 +25,285 @@ DoorData const doorData[] =
|
||||
|
||||
class instance_ruby_sanctum : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
instance_ruby_sanctum() : InstanceMapScript("instance_ruby_sanctum", 724) { }
|
||||
public:
|
||||
instance_ruby_sanctum() : InstanceMapScript("instance_ruby_sanctum", 724) { }
|
||||
|
||||
struct instance_ruby_sanctum_InstanceMapScript : public InstanceScript
|
||||
struct instance_ruby_sanctum_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_ruby_sanctum_InstanceMapScript(InstanceMap* map) : InstanceScript(map)
|
||||
{
|
||||
instance_ruby_sanctum_InstanceMapScript(InstanceMap* map) : InstanceScript(map)
|
||||
{
|
||||
SetBossNumber(MAX_ENCOUNTERS);
|
||||
LoadDoorData(doorData);
|
||||
SetBossNumber(MAX_ENCOUNTERS);
|
||||
LoadDoorData(doorData);
|
||||
|
||||
BaltharusTheWarbornGUID = 0;
|
||||
XerestraszaGUID = 0;
|
||||
GeneralZarithrianGUID = 0;
|
||||
memset(ZarithrianSpawnStalkerGUID, 0, 2 * sizeof(uint64));
|
||||
BaltharusTheWarbornGUID = 0;
|
||||
XerestraszaGUID = 0;
|
||||
GeneralZarithrianGUID = 0;
|
||||
memset(ZarithrianSpawnStalkerGUID, 0, 2 * sizeof(uint64));
|
||||
|
||||
HalionGUID = 0;
|
||||
TwilightHalionGUID = 0;
|
||||
OrbCarrierGUID = 0;
|
||||
HalionControllerGUID = 0;
|
||||
FlameRingGUID = 0;
|
||||
}
|
||||
|
||||
void OnPlayerEnter(Player* /*player*/)
|
||||
{
|
||||
if (GetBossState(DATA_HALION_INTRO_DONE) != DONE && GetBossState(DATA_GENERAL_ZARITHRIAN) == DONE)
|
||||
{
|
||||
instance->LoadGrid(3156.0f, 537.0f);
|
||||
if (Creature* halionController = instance->GetCreature(HalionControllerGUID))
|
||||
halionController->AI()->DoAction(ACTION_INTRO_HALION);
|
||||
}
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature* creature)
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
case NPC_BALTHARUS_THE_WARBORN:
|
||||
BaltharusTheWarbornGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_XERESTRASZA:
|
||||
XerestraszaGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_GENERAL_ZARITHRIAN:
|
||||
GeneralZarithrianGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_ZARITHRIAN_SPAWN_STALKER:
|
||||
if (!ZarithrianSpawnStalkerGUID[0])
|
||||
ZarithrianSpawnStalkerGUID[0] = creature->GetGUID();
|
||||
else
|
||||
ZarithrianSpawnStalkerGUID[1] = creature->GetGUID();
|
||||
break;
|
||||
case NPC_HALION:
|
||||
HalionGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_TWILIGHT_HALION:
|
||||
TwilightHalionGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_HALION_CONTROLLER:
|
||||
HalionControllerGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_ORB_CARRIER:
|
||||
OrbCarrierGUID = creature->GetGUID();
|
||||
break;
|
||||
|
||||
case NPC_LIVING_INFERNO:
|
||||
case NPC_LIVING_EMBER:
|
||||
case NPC_METEOR_STRIKE_NORTH:
|
||||
case NPC_METEOR_STRIKE_SOUTH:
|
||||
case NPC_METEOR_STRIKE_EAST:
|
||||
case NPC_METEOR_STRIKE_WEST:
|
||||
case NPC_METEOR_STRIKE_FLAME:
|
||||
case NPC_COMBUSTION:
|
||||
case NPC_CONSUMPTION:
|
||||
if (Creature* halion = instance->GetCreature(HalionGUID))
|
||||
halion->AI()->JustSummoned(creature);
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* go)
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_FIRE_FIELD:
|
||||
case GO_FLAME_WALLS:
|
||||
case GO_BURNING_TREE_1:
|
||||
case GO_BURNING_TREE_2:
|
||||
case GO_BURNING_TREE_3:
|
||||
case GO_BURNING_TREE_4:
|
||||
case GO_TWILIGHT_FLAME_RING:
|
||||
AddDoor(go, true);
|
||||
break;
|
||||
case GO_FLAME_RING:
|
||||
FlameRingGUID = go->GetGUID();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectRemove(GameObject* go)
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_FIRE_FIELD:
|
||||
case GO_FLAME_WALLS:
|
||||
case GO_BURNING_TREE_1:
|
||||
case GO_BURNING_TREE_2:
|
||||
case GO_BURNING_TREE_3:
|
||||
case GO_BURNING_TREE_4:
|
||||
AddDoor(go, false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
uint64 GetData64(uint32 type) const
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case NPC_BALTHARUS_THE_WARBORN:
|
||||
return BaltharusTheWarbornGUID;
|
||||
case NPC_XERESTRASZA:
|
||||
return XerestraszaGUID;
|
||||
case NPC_GENERAL_ZARITHRIAN:
|
||||
return GeneralZarithrianGUID;
|
||||
case DATA_ZARITHRIAN_SPAWN_STALKER_1:
|
||||
case DATA_ZARITHRIAN_SPAWN_STALKER_2:
|
||||
return ZarithrianSpawnStalkerGUID[type - DATA_ZARITHRIAN_SPAWN_STALKER_1];
|
||||
case NPC_HALION_CONTROLLER:
|
||||
return HalionControllerGUID;
|
||||
case NPC_HALION:
|
||||
return HalionGUID;
|
||||
case NPC_TWILIGHT_HALION:
|
||||
return TwilightHalionGUID;
|
||||
case NPC_ORB_CARRIER:
|
||||
return OrbCarrierGUID;
|
||||
|
||||
case GO_FLAME_RING:
|
||||
return FlameRingGUID;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool SetBossState(uint32 type, EncounterState state)
|
||||
{
|
||||
if (!InstanceScript::SetBossState(type, state))
|
||||
return false;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case DATA_SAVIANA_RAGEFIRE:
|
||||
case DATA_BALTHARUS_THE_WARBORN:
|
||||
if (GetBossState(DATA_BALTHARUS_THE_WARBORN) == DONE && GetBossState(DATA_SAVIANA_RAGEFIRE) == DONE)
|
||||
if (Creature* zarithrian = instance->GetCreature(GeneralZarithrianGUID))
|
||||
zarithrian->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NOT_SELECTABLE);
|
||||
break;
|
||||
case DATA_GENERAL_ZARITHRIAN:
|
||||
if (state == DONE)
|
||||
if (Creature* halionController = instance->GetCreature(HalionControllerGUID))
|
||||
halionController->AI()->DoAction(ACTION_INTRO_HALION);
|
||||
break;
|
||||
case DATA_HALION:
|
||||
DoUpdateWorldState(WORLDSTATE_CORPOREALITY_TOGGLE, 0);
|
||||
DoUpdateWorldState(WORLDSTATE_CORPOREALITY_TWILIGHT, 0);
|
||||
DoUpdateWorldState(WORLDSTATE_CORPOREALITY_MATERIAL, 0);
|
||||
HandleGameObject(FlameRingGUID, true);
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "R S " << GetBossSaveData();
|
||||
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
void FillInitialWorldStates(WorldPacket& data)
|
||||
{
|
||||
data << uint32(WORLDSTATE_CORPOREALITY_MATERIAL) << uint32(50);
|
||||
data << uint32(WORLDSTATE_CORPOREALITY_TWILIGHT) << uint32(50);
|
||||
data << uint32(WORLDSTATE_CORPOREALITY_TOGGLE) << uint32(0);
|
||||
}
|
||||
|
||||
void Load(char const* str)
|
||||
{
|
||||
if (!str)
|
||||
{
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
return;
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA(str);
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
|
||||
std::istringstream loadStream(str);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
|
||||
if (dataHead1 == 'R' && dataHead2 == 'S')
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
|
||||
{
|
||||
uint32 tmpState;
|
||||
loadStream >> tmpState;
|
||||
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
|
||||
tmpState = NOT_STARTED;
|
||||
|
||||
SetBossState(i, EncounterState(tmpState));
|
||||
}
|
||||
|
||||
// Xinef: additional check
|
||||
if (GetBossState(DATA_HALION_INTRO_DONE) != DONE)
|
||||
{
|
||||
SetBossState(DATA_HALION_INTRO1, NOT_STARTED);
|
||||
SetBossState(DATA_HALION_INTRO2, NOT_STARTED);
|
||||
}
|
||||
}
|
||||
else
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
}
|
||||
|
||||
protected:
|
||||
uint64 BaltharusTheWarbornGUID;
|
||||
uint64 XerestraszaGUID;
|
||||
uint64 GeneralZarithrianGUID;
|
||||
uint64 ZarithrianSpawnStalkerGUID[2];
|
||||
|
||||
uint64 HalionGUID;
|
||||
uint64 TwilightHalionGUID;
|
||||
uint64 HalionControllerGUID;
|
||||
uint64 OrbCarrierGUID;
|
||||
uint64 FlameRingGUID;
|
||||
};
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_ruby_sanctum_InstanceMapScript(map);
|
||||
HalionGUID = 0;
|
||||
TwilightHalionGUID = 0;
|
||||
OrbCarrierGUID = 0;
|
||||
HalionControllerGUID = 0;
|
||||
FlameRingGUID = 0;
|
||||
}
|
||||
|
||||
void OnPlayerEnter(Player* /*player*/)
|
||||
{
|
||||
if (GetBossState(DATA_HALION_INTRO_DONE) != DONE && GetBossState(DATA_GENERAL_ZARITHRIAN) == DONE)
|
||||
{
|
||||
instance->LoadGrid(3156.0f, 537.0f);
|
||||
if (Creature* halionController = instance->GetCreature(HalionControllerGUID))
|
||||
halionController->AI()->DoAction(ACTION_INTRO_HALION);
|
||||
}
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature* creature)
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
case NPC_BALTHARUS_THE_WARBORN:
|
||||
BaltharusTheWarbornGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_XERESTRASZA:
|
||||
XerestraszaGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_GENERAL_ZARITHRIAN:
|
||||
GeneralZarithrianGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_ZARITHRIAN_SPAWN_STALKER:
|
||||
if (!ZarithrianSpawnStalkerGUID[0])
|
||||
ZarithrianSpawnStalkerGUID[0] = creature->GetGUID();
|
||||
else
|
||||
ZarithrianSpawnStalkerGUID[1] = creature->GetGUID();
|
||||
break;
|
||||
case NPC_HALION:
|
||||
HalionGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_TWILIGHT_HALION:
|
||||
TwilightHalionGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_HALION_CONTROLLER:
|
||||
HalionControllerGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_ORB_CARRIER:
|
||||
OrbCarrierGUID = creature->GetGUID();
|
||||
break;
|
||||
|
||||
case NPC_LIVING_INFERNO:
|
||||
case NPC_LIVING_EMBER:
|
||||
case NPC_METEOR_STRIKE_NORTH:
|
||||
case NPC_METEOR_STRIKE_SOUTH:
|
||||
case NPC_METEOR_STRIKE_EAST:
|
||||
case NPC_METEOR_STRIKE_WEST:
|
||||
case NPC_METEOR_STRIKE_FLAME:
|
||||
case NPC_COMBUSTION:
|
||||
case NPC_CONSUMPTION:
|
||||
if (Creature* halion = instance->GetCreature(HalionGUID))
|
||||
halion->AI()->JustSummoned(creature);
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* go)
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_FIRE_FIELD:
|
||||
case GO_FLAME_WALLS:
|
||||
case GO_BURNING_TREE_1:
|
||||
case GO_BURNING_TREE_2:
|
||||
case GO_BURNING_TREE_3:
|
||||
case GO_BURNING_TREE_4:
|
||||
case GO_TWILIGHT_FLAME_RING:
|
||||
AddDoor(go, true);
|
||||
break;
|
||||
case GO_FLAME_RING:
|
||||
FlameRingGUID = go->GetGUID();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectRemove(GameObject* go)
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_FIRE_FIELD:
|
||||
case GO_FLAME_WALLS:
|
||||
case GO_BURNING_TREE_1:
|
||||
case GO_BURNING_TREE_2:
|
||||
case GO_BURNING_TREE_3:
|
||||
case GO_BURNING_TREE_4:
|
||||
AddDoor(go, false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
uint64 GetData64(uint32 type) const
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case NPC_BALTHARUS_THE_WARBORN:
|
||||
return BaltharusTheWarbornGUID;
|
||||
case NPC_XERESTRASZA:
|
||||
return XerestraszaGUID;
|
||||
case NPC_GENERAL_ZARITHRIAN:
|
||||
return GeneralZarithrianGUID;
|
||||
case DATA_ZARITHRIAN_SPAWN_STALKER_1:
|
||||
case DATA_ZARITHRIAN_SPAWN_STALKER_2:
|
||||
return ZarithrianSpawnStalkerGUID[type - DATA_ZARITHRIAN_SPAWN_STALKER_1];
|
||||
case NPC_HALION_CONTROLLER:
|
||||
return HalionControllerGUID;
|
||||
case NPC_HALION:
|
||||
return HalionGUID;
|
||||
case NPC_TWILIGHT_HALION:
|
||||
return TwilightHalionGUID;
|
||||
case NPC_ORB_CARRIER:
|
||||
return OrbCarrierGUID;
|
||||
|
||||
case GO_FLAME_RING:
|
||||
return FlameRingGUID;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool SetBossState(uint32 type, EncounterState state)
|
||||
{
|
||||
if (!InstanceScript::SetBossState(type, state))
|
||||
return false;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case DATA_SAVIANA_RAGEFIRE:
|
||||
case DATA_BALTHARUS_THE_WARBORN:
|
||||
if (GetBossState(DATA_BALTHARUS_THE_WARBORN) == DONE && GetBossState(DATA_SAVIANA_RAGEFIRE) == DONE)
|
||||
if (Creature* zarithrian = instance->GetCreature(GeneralZarithrianGUID))
|
||||
zarithrian->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NOT_SELECTABLE);
|
||||
break;
|
||||
case DATA_GENERAL_ZARITHRIAN:
|
||||
if (state == DONE)
|
||||
if (Creature* halionController = instance->GetCreature(HalionControllerGUID))
|
||||
halionController->AI()->DoAction(ACTION_INTRO_HALION);
|
||||
break;
|
||||
case DATA_HALION:
|
||||
DoUpdateWorldState(WORLDSTATE_CORPOREALITY_TOGGLE, 0);
|
||||
DoUpdateWorldState(WORLDSTATE_CORPOREALITY_TWILIGHT, 0);
|
||||
DoUpdateWorldState(WORLDSTATE_CORPOREALITY_MATERIAL, 0);
|
||||
HandleGameObject(FlameRingGUID, true);
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "R S " << GetBossSaveData();
|
||||
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
void FillInitialWorldStates(WorldPacket& data)
|
||||
{
|
||||
data << uint32(WORLDSTATE_CORPOREALITY_MATERIAL) << uint32(50);
|
||||
data << uint32(WORLDSTATE_CORPOREALITY_TWILIGHT) << uint32(50);
|
||||
data << uint32(WORLDSTATE_CORPOREALITY_TOGGLE) << uint32(0);
|
||||
}
|
||||
|
||||
void Load(char const* str)
|
||||
{
|
||||
if (!str)
|
||||
{
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
return;
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA(str);
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
|
||||
std::istringstream loadStream(str);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
|
||||
if (dataHead1 == 'R' && dataHead2 == 'S')
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
|
||||
{
|
||||
uint32 tmpState;
|
||||
loadStream >> tmpState;
|
||||
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
|
||||
tmpState = NOT_STARTED;
|
||||
|
||||
SetBossState(i, EncounterState(tmpState));
|
||||
}
|
||||
|
||||
// Xinef: additional check
|
||||
if (GetBossState(DATA_HALION_INTRO_DONE) != DONE)
|
||||
{
|
||||
SetBossState(DATA_HALION_INTRO1, NOT_STARTED);
|
||||
SetBossState(DATA_HALION_INTRO2, NOT_STARTED);
|
||||
}
|
||||
}
|
||||
else
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
}
|
||||
|
||||
protected:
|
||||
uint64 BaltharusTheWarbornGUID;
|
||||
uint64 XerestraszaGUID;
|
||||
uint64 GeneralZarithrianGUID;
|
||||
uint64 ZarithrianSpawnStalkerGUID[2];
|
||||
|
||||
uint64 HalionGUID;
|
||||
uint64 TwilightHalionGUID;
|
||||
uint64 HalionControllerGUID;
|
||||
uint64 OrbCarrierGUID;
|
||||
uint64 FlameRingGUID;
|
||||
};
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_ruby_sanctum_InstanceMapScript(map);
|
||||
}
|
||||
};
|
||||
|
||||
class spell_ruby_sanctum_rallying_shout : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_ruby_sanctum_rallying_shout() : SpellScriptLoader("spell_ruby_sanctum_rallying_shout") { }
|
||||
public:
|
||||
spell_ruby_sanctum_rallying_shout() : SpellScriptLoader("spell_ruby_sanctum_rallying_shout") { }
|
||||
|
||||
class spell_ruby_sanctum_rallying_shout_SpellScript : public SpellScript
|
||||
class spell_ruby_sanctum_rallying_shout_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_ruby_sanctum_rallying_shout_SpellScript);
|
||||
|
||||
void CountAllies()
|
||||
{
|
||||
PrepareSpellScript(spell_ruby_sanctum_rallying_shout_SpellScript);
|
||||
uint32 count = GetSpell()->GetUniqueTargetInfo()->size();
|
||||
if (count == GetCaster()->GetAuraCount(SPELL_RALLY))
|
||||
return;
|
||||
|
||||
void CountAllies()
|
||||
{
|
||||
uint32 count = GetSpell()->GetUniqueTargetInfo()->size();
|
||||
if (count == GetCaster()->GetAuraCount(SPELL_RALLY))
|
||||
return;
|
||||
|
||||
GetCaster()->RemoveAurasDueToSpell(SPELL_RALLY);
|
||||
if (count > 0)
|
||||
GetCaster()->CastCustomSpell(SPELL_RALLY, SPELLVALUE_AURA_STACK, count, GetCaster(), true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
AfterHit += SpellHitFn(spell_ruby_sanctum_rallying_shout_SpellScript::CountAllies);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_ruby_sanctum_rallying_shout_SpellScript();
|
||||
GetCaster()->RemoveAurasDueToSpell(SPELL_RALLY);
|
||||
if (count > 0)
|
||||
GetCaster()->CastCustomSpell(SPELL_RALLY, SPELLVALUE_AURA_STACK, count, GetCaster(), true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
AfterHit += SpellHitFn(spell_ruby_sanctum_rallying_shout_SpellScript::CountAllies);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_ruby_sanctum_rallying_shout_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_instance_ruby_sanctum()
|
||||
|
||||
@@ -23,7 +23,7 @@ enum DataTypes
|
||||
DATA_HALION_INTRO2 = 4,
|
||||
DATA_HALION_INTRO_DONE = 5,
|
||||
DATA_HALION = 6,
|
||||
|
||||
|
||||
MAX_ENCOUNTERS = 7,
|
||||
|
||||
// Etc
|
||||
|
||||
Reference in New Issue
Block a user