refactor(Scripts/CavernsOfTime): Mass struct/model update (#16268)
init
This commit is contained in:
+149
-149
@@ -19,29 +19,27 @@
|
|||||||
#include "ScriptedCreature.h"
|
#include "ScriptedCreature.h"
|
||||||
#include "old_hillsbrad.h"
|
#include "old_hillsbrad.h"
|
||||||
|
|
||||||
enum CaptainSkarloc
|
enum Text
|
||||||
{
|
{
|
||||||
SAY_ENTER = 0,
|
SAY_ENTER = 0,
|
||||||
SAY_TAUNT = 1,
|
SAY_TAUNT = 1,
|
||||||
SAY_SLAY = 2,
|
SAY_SLAY = 2,
|
||||||
SAY_DEATH = 3,
|
SAY_DEATH = 3
|
||||||
|
};
|
||||||
|
|
||||||
SPELL_HOLY_LIGHT = 29427,
|
enum Spells
|
||||||
SPELL_CLEANSE = 29380,
|
{
|
||||||
SPELL_HAMMER_OF_JUSTICE = 13005,
|
SPELL_HOLY_LIGHT = 29427,
|
||||||
SPELL_HOLY_SHIELD = 31904,
|
SPELL_CLEANSE = 29380,
|
||||||
SPELL_DEVOTION_AURA = 8258,
|
SPELL_HAMMER_OF_JUSTICE = 13005,
|
||||||
SPELL_CONSECRATION = 38385,
|
SPELL_HOLY_SHIELD = 31904,
|
||||||
|
SPELL_DEVOTION_AURA = 8258,
|
||||||
|
SPELL_CONSECRATION = 38385
|
||||||
|
};
|
||||||
|
|
||||||
WAYPOINTS_COUNT = 4,
|
enum Misc
|
||||||
|
{
|
||||||
EVENT_INITIAL_TALK = 1,
|
WAYPOINTS_COUNT = 4
|
||||||
EVENT_START_FIGHT = 2,
|
|
||||||
EVENT_SPELL_CLEANSE = 10,
|
|
||||||
EVENT_SPELL_HAMMER = 11,
|
|
||||||
EVENT_SPELL_HOLY_LIGHT = 12,
|
|
||||||
EVENT_SPELL_HOLY_SHIELD = 13,
|
|
||||||
EVENT_SPELL_CONSECRATION = 14
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const Position startPath[WAYPOINTS_COUNT] =
|
const Position startPath[WAYPOINTS_COUNT] =
|
||||||
@@ -52,172 +50,174 @@ const Position startPath[WAYPOINTS_COUNT] =
|
|||||||
{2058.77f, 236.04f, 63.92f, 0.0f}
|
{2058.77f, 236.04f, 63.92f, 0.0f}
|
||||||
};
|
};
|
||||||
|
|
||||||
class boss_captain_skarloc : public CreatureScript
|
struct boss_captain_skarloc : public BossAI
|
||||||
{
|
{
|
||||||
public:
|
boss_captain_skarloc(Creature* creature) : BossAI(creature, DATA_CAPTAIN_SKARLOC), summons(me)
|
||||||
boss_captain_skarloc() : CreatureScript("boss_captain_skarloc") { }
|
|
||||||
|
|
||||||
CreatureAI* GetAI(Creature* creature) const override
|
|
||||||
{
|
{
|
||||||
return GetOldHillsbradAI<boss_captain_skarlocAI>(creature);
|
scheduler.SetValidator([this]
|
||||||
|
{
|
||||||
|
return !me->HasUnitState(UNIT_STATE_CASTING);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
struct boss_captain_skarlocAI : public ScriptedAI
|
SummonList summons;
|
||||||
|
|
||||||
|
void Reset() override
|
||||||
{
|
{
|
||||||
boss_captain_skarlocAI(Creature* creature) : ScriptedAI(creature), summons(me) { }
|
_Reset();
|
||||||
|
summons.DespawnAll();
|
||||||
|
}
|
||||||
|
|
||||||
EventMap events;
|
void JustSummoned(Creature* summon) override
|
||||||
SummonList summons;
|
{
|
||||||
|
summons.Summon(summon);
|
||||||
void Reset() override
|
if (Creature* thrall = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetGuidData(DATA_THRALL_GUID)))
|
||||||
{
|
{
|
||||||
events.Reset();
|
thrall->AI()->JustSummoned(summon);
|
||||||
summons.DespawnAll();
|
|
||||||
}
|
}
|
||||||
|
summon->SetImmuneToAll(true);
|
||||||
|
if (summon->GetEntry() == NPC_SKARLOC_MOUNT)
|
||||||
|
return;
|
||||||
|
|
||||||
void JustSummoned(Creature* summon) override
|
if (summons.size() == 1)
|
||||||
{
|
{
|
||||||
summons.Summon(summon);
|
summon->GetMotionMaster()->MovePoint(0, 2060.788f, 237.301f, 63.999f);
|
||||||
if (Creature* thrall = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetGuidData(DATA_THRALL_GUID)))
|
|
||||||
thrall->AI()->JustSummoned(summon);
|
|
||||||
summon->SetImmuneToAll(true);
|
|
||||||
|
|
||||||
if (summon->GetEntry() == NPC_SKARLOC_MOUNT)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (summons.size() == 1)
|
|
||||||
summon->GetMotionMaster()->MovePoint(0, 2060.788f, 237.301f, 63.999f);
|
|
||||||
else
|
|
||||||
summon->GetMotionMaster()->MovePoint(0, 2056.870f, 234.853f, 63.839f);
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
void InitializeAI() override
|
|
||||||
{
|
{
|
||||||
ScriptedAI::InitializeAI();
|
summon->GetMotionMaster()->MovePoint(0, 2056.870f, 234.853f, 63.839f);
|
||||||
|
|
||||||
Movement::PointsArray path;
|
|
||||||
path.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()));
|
|
||||||
for (uint8 i = 0; i < WAYPOINTS_COUNT; ++i)
|
|
||||||
path.push_back(G3D::Vector3(startPath[i].GetPositionX(), startPath[i].GetPositionY(), startPath[i].GetPositionZ()));
|
|
||||||
|
|
||||||
me->GetMotionMaster()->MoveSplinePath(&path);
|
|
||||||
me->SetImmuneToAll(true);
|
|
||||||
me->Mount(SKARLOC_MOUNT_MODEL);
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void MovementInform(uint32 type, uint32 id) override
|
void InitializeAI() override
|
||||||
|
{
|
||||||
|
ScriptedAI::InitializeAI();
|
||||||
|
Movement::PointsArray path;
|
||||||
|
path.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()));
|
||||||
|
for (uint8 i = 0; i < WAYPOINTS_COUNT; ++i)
|
||||||
{
|
{
|
||||||
if (type != ESCORT_MOTION_TYPE)
|
path.push_back(G3D::Vector3(startPath[i].GetPositionX(), startPath[i].GetPositionY(), startPath[i].GetPositionZ()));
|
||||||
return;
|
}
|
||||||
|
me->GetMotionMaster()->MoveSplinePath(&path);
|
||||||
|
me->SetImmuneToAll(true);
|
||||||
|
me->Mount(SKARLOC_MOUNT_MODEL);
|
||||||
|
}
|
||||||
|
|
||||||
// Xinef: we can rely here on internal counting
|
void MovementInform(uint32 type, uint32 id) override
|
||||||
if (id == 1)
|
{
|
||||||
|
if (type != ESCORT_MOTION_TYPE)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Xinef: we can rely here on internal counting
|
||||||
|
if (id == 1)
|
||||||
|
{
|
||||||
|
me->SummonCreature(NPC_DURNHOLDE_MAGE, 2038.549f, 273.303f, 63.420f, 5.30f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||||
|
me->SummonCreature(NPC_DURNHOLDE_VETERAN, 2032.810f, 269.416f, 63.561f, 5.30f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||||
|
}
|
||||||
|
else if (id == 2)
|
||||||
|
{
|
||||||
|
me->Dismount();
|
||||||
|
me->SetWalk(true);
|
||||||
|
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
|
||||||
{
|
{
|
||||||
me->SummonCreature(NPC_DURNHOLDE_MAGE, 2038.549f, 273.303f, 63.420f, 5.30f, TEMPSUMMON_MANUAL_DESPAWN);
|
if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr))
|
||||||
me->SummonCreature(NPC_DURNHOLDE_VETERAN, 2032.810f, 269.416f, 63.561f, 5.30f, TEMPSUMMON_MANUAL_DESPAWN);
|
|
||||||
}
|
|
||||||
else if (id == 2)
|
|
||||||
{
|
|
||||||
me->Dismount();
|
|
||||||
me->SetWalk(true);
|
|
||||||
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
|
|
||||||
if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr))
|
|
||||||
summon->SetWalk(true);
|
|
||||||
if (Creature* mount = me->SummonCreature(NPC_SKARLOC_MOUNT, 2049.12f, 252.31f, 62.855f, me->GetOrientation(), TEMPSUMMON_MANUAL_DESPAWN))
|
|
||||||
{
|
{
|
||||||
mount->SetImmuneToNPC(true);
|
summon->SetWalk(true);
|
||||||
mount->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (Creature* mount = me->SummonCreature(NPC_SKARLOC_MOUNT, 2049.12f, 252.31f, 62.855f, me->GetOrientation(), TEMPSUMMON_MANUAL_DESPAWN))
|
||||||
if (me->movespline->Finalized())
|
|
||||||
{
|
{
|
||||||
Talk(SAY_ENTER, 500ms);
|
mount->SetImmuneToNPC(true);
|
||||||
|
mount->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
me->m_Events.AddEventAtOffset([this]()
|
if (me->movespline->Finalized())
|
||||||
|
{
|
||||||
|
Talk(SAY_ENTER, 500ms);
|
||||||
|
|
||||||
|
me->m_Events.AddEventAtOffset([this]()
|
||||||
|
{
|
||||||
|
me->SetImmuneToAll(false);
|
||||||
|
me->SetInCombatWithZone();
|
||||||
|
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
|
||||||
{
|
{
|
||||||
me->SetImmuneToAll(false);
|
if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr))
|
||||||
me->SetInCombatWithZone();
|
|
||||||
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
|
|
||||||
{
|
{
|
||||||
if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr))
|
if (summon->GetEntry() != NPC_SKARLOC_MOUNT)
|
||||||
{
|
{
|
||||||
if (summon->GetEntry() != NPC_SKARLOC_MOUNT)
|
summon->SetImmuneToAll(false);
|
||||||
{
|
summon->SetInCombatWithZone();
|
||||||
summon->SetImmuneToAll(false);
|
|
||||||
summon->SetInCombatWithZone();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, 8s);
|
}
|
||||||
}
|
}, 8s);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void JustEngagedWith(Unit* /*who*/) override
|
void JustEngagedWith(Unit* /*who*/) override
|
||||||
|
{
|
||||||
|
_JustEngagedWith();
|
||||||
|
DoCastSelf(SPELL_DEVOTION_AURA);
|
||||||
|
scheduler.Schedule(15s, [this](TaskContext context)
|
||||||
{
|
{
|
||||||
me->CastSpell(me, SPELL_DEVOTION_AURA, true);
|
DoCastSelf(SPELL_HOLY_LIGHT);
|
||||||
|
context.Repeat(20s);
|
||||||
events.ScheduleEvent(EVENT_SPELL_HOLY_LIGHT, 15000);
|
}).Schedule(6s, [this](TaskContext context)
|
||||||
events.ScheduleEvent(EVENT_SPELL_CLEANSE, 6000);
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_HAMMER, 20000);
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_HOLY_SHIELD, 10000);
|
|
||||||
if (IsHeroic())
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_CONSECRATION, 1000);
|
|
||||||
}
|
|
||||||
|
|
||||||
void KilledUnit(Unit* /*victim*/) override
|
|
||||||
{
|
{
|
||||||
Talk(SAY_SLAY);
|
if (roll_chance_i(33))
|
||||||
}
|
|
||||||
|
|
||||||
void JustDied(Unit* /*killer*/) override
|
|
||||||
{
|
|
||||||
Talk(SAY_DEATH);
|
|
||||||
me->GetInstanceScript()->SetData(DATA_ESCORT_PROGRESS, ENCOUNTER_PROGRESS_SKARLOC_KILLED);
|
|
||||||
me->GetInstanceScript()->SetData(DATA_THRALL_ADD_FLAG, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void UpdateAI(uint32 diff) override
|
|
||||||
{
|
|
||||||
if (!UpdateVictim())
|
|
||||||
return;
|
|
||||||
|
|
||||||
events.Update(diff);
|
|
||||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
|
||||||
return;
|
|
||||||
|
|
||||||
switch (events.ExecuteEvent())
|
|
||||||
{
|
{
|
||||||
case EVENT_SPELL_HOLY_LIGHT:
|
Talk(SAY_TAUNT);
|
||||||
me->CastSpell(me, SPELL_HOLY_LIGHT, false);
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_HOLY_LIGHT, 20000);
|
|
||||||
break;
|
|
||||||
case EVENT_SPELL_CLEANSE:
|
|
||||||
if (roll_chance_i(33))
|
|
||||||
Talk(SAY_TAUNT);
|
|
||||||
me->CastSpell(me, SPELL_CLEANSE, false);
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_CLEANSE, 10000);
|
|
||||||
break;
|
|
||||||
case EVENT_SPELL_HAMMER:
|
|
||||||
me->CastSpell(me->GetVictim(), SPELL_HAMMER_OF_JUSTICE, false);
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_HAMMER, 30000);
|
|
||||||
break;
|
|
||||||
case EVENT_SPELL_HOLY_SHIELD:
|
|
||||||
me->CastSpell(me, SPELL_HOLY_SHIELD, false);
|
|
||||||
events.ScheduleEvent(SPELL_HOLY_SHIELD, 30000);
|
|
||||||
break;
|
|
||||||
case EVENT_SPELL_CONSECRATION:
|
|
||||||
me->CastSpell(me, SPELL_CONSECRATION, false);
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_CONSECRATION, 20000);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
DoCastSelf(SPELL_CLEANSE);
|
||||||
|
context.Repeat(10s);
|
||||||
|
}).Schedule(20s, [this](TaskContext context)
|
||||||
|
{
|
||||||
|
DoCastVictim(SPELL_HAMMER_OF_JUSTICE);
|
||||||
|
context.Repeat(30s);
|
||||||
|
}).Schedule(10s, [this](TaskContext context)
|
||||||
|
{
|
||||||
|
DoCastSelf(SPELL_HOLY_SHIELD);
|
||||||
|
context.Repeat(30s);
|
||||||
|
});
|
||||||
|
|
||||||
DoMeleeAttackIfReady();
|
if (IsHeroic())
|
||||||
|
{
|
||||||
|
scheduler.Schedule(1s, [this](TaskContext context)
|
||||||
|
{
|
||||||
|
DoCastSelf(SPELL_CONSECRATION);
|
||||||
|
context.Repeat(20s);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
|
void KilledUnit(Unit* /*victim*/) override
|
||||||
|
{
|
||||||
|
Talk(SAY_SLAY);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JustDied(Unit* /*killer*/) override
|
||||||
|
{
|
||||||
|
_JustDied();
|
||||||
|
Talk(SAY_DEATH);
|
||||||
|
me->GetInstanceScript()->SetData(DATA_ESCORT_PROGRESS, ENCOUNTER_PROGRESS_SKARLOC_KILLED);
|
||||||
|
me->GetInstanceScript()->SetData(DATA_THRALL_ADD_FLAG, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpdateAI(uint32 diff) override
|
||||||
|
{
|
||||||
|
if (!UpdateVictim())
|
||||||
|
return;
|
||||||
|
|
||||||
|
scheduler.Update(diff);
|
||||||
|
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||||
|
return;
|
||||||
|
|
||||||
|
DoMeleeAttackIfReady();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
void AddSC_boss_captain_skarloc()
|
void AddSC_boss_captain_skarloc()
|
||||||
{
|
{
|
||||||
new boss_captain_skarloc();
|
RegisterOldHillsbradCreatureAI(boss_captain_skarloc);
|
||||||
}
|
}
|
||||||
|
|||||||
+75
-84
@@ -19,107 +19,98 @@
|
|||||||
#include "ScriptedCreature.h"
|
#include "ScriptedCreature.h"
|
||||||
#include "old_hillsbrad.h"
|
#include "old_hillsbrad.h"
|
||||||
|
|
||||||
enum EpochHunter
|
enum Text
|
||||||
{
|
{
|
||||||
SAY_AGGRO = 5,
|
SAY_AGGRO = 5,
|
||||||
SAY_SLAY = 6,
|
SAY_SLAY = 6,
|
||||||
SAY_BREATH = 7,
|
SAY_BREATH = 7,
|
||||||
SAY_DEATH = 8,
|
SAY_DEATH = 8
|
||||||
|
|
||||||
SPELL_SAND_BREATH = 31914,
|
|
||||||
SPELL_IMPENDING_DEATH = 31916,
|
|
||||||
SPELL_MAGIC_DISRUPTION_AURA = 33834,
|
|
||||||
SPELL_WING_BUFFET = 31475,
|
|
||||||
|
|
||||||
EVENT_SPELL_SAND_BREATH = 1,
|
|
||||||
EVENT_SPELL_IMPENDING_DEATH = 2,
|
|
||||||
EVENT_SPELL_DISRUPTION = 3,
|
|
||||||
EVENT_SPELL_WING_BUFFET = 4
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class boss_epoch_hunter : public CreatureScript
|
enum Spells
|
||||||
{
|
{
|
||||||
public:
|
SPELL_SAND_BREATH = 31914,
|
||||||
boss_epoch_hunter() : CreatureScript("boss_epoch_hunter") { }
|
SPELL_IMPENDING_DEATH = 31916,
|
||||||
|
SPELL_MAGIC_DISRUPTION_AURA = 33834,
|
||||||
|
SPELL_WING_BUFFET = 31475
|
||||||
|
};
|
||||||
|
|
||||||
CreatureAI* GetAI(Creature* creature) const override
|
struct boss_epoch_hunter : public BossAI
|
||||||
|
{
|
||||||
|
boss_epoch_hunter(Creature* creature) : BossAI(creature, DATA_EPOCH_HUNTER)
|
||||||
{
|
{
|
||||||
return GetOldHillsbradAI<boss_epoch_hunterAI>(creature);
|
scheduler.SetValidator([this]
|
||||||
|
{
|
||||||
|
return !me->HasUnitState(UNIT_STATE_CASTING);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
struct boss_epoch_hunterAI : public ScriptedAI
|
void Reset() override
|
||||||
{
|
{
|
||||||
boss_epoch_hunterAI(Creature* creature) : ScriptedAI(creature) { }
|
_Reset();
|
||||||
|
}
|
||||||
|
|
||||||
EventMap events;
|
void JustEngagedWith(Unit* /*who*/) override
|
||||||
|
{
|
||||||
void Reset() override
|
_JustEngagedWith();
|
||||||
|
Talk(SAY_AGGRO);
|
||||||
|
scheduler.Schedule(8s, [this](TaskContext context)
|
||||||
{
|
{
|
||||||
}
|
if (roll_chance_i(50))
|
||||||
|
|
||||||
void JustEngagedWith(Unit* /*who*/) override
|
|
||||||
{
|
|
||||||
Talk(SAY_AGGRO);
|
|
||||||
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_SAND_BREATH, 8000);
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_IMPENDING_DEATH, 2000);
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_DISRUPTION, 20000);
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_WING_BUFFET, 14000);
|
|
||||||
}
|
|
||||||
|
|
||||||
void KilledUnit(Unit* victim) override
|
|
||||||
{
|
|
||||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
|
||||||
Talk(SAY_SLAY);
|
|
||||||
}
|
|
||||||
|
|
||||||
void JustDied(Unit* killer) override
|
|
||||||
{
|
|
||||||
if (killer && killer == me)
|
|
||||||
return;
|
|
||||||
Talk(SAY_DEATH);
|
|
||||||
me->GetInstanceScript()->SetData(DATA_ESCORT_PROGRESS, ENCOUNTER_PROGRESS_EPOCH_KILLED);
|
|
||||||
if (Creature* taretha = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetGuidData(DATA_TARETHA_GUID)))
|
|
||||||
taretha->AI()->DoAction(me->GetEntry());
|
|
||||||
}
|
|
||||||
|
|
||||||
void UpdateAI(uint32 diff) override
|
|
||||||
{
|
|
||||||
if (!UpdateVictim())
|
|
||||||
return;
|
|
||||||
|
|
||||||
events.Update(diff);
|
|
||||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
|
||||||
return;
|
|
||||||
|
|
||||||
switch (events.ExecuteEvent())
|
|
||||||
{
|
{
|
||||||
case EVENT_SPELL_SAND_BREATH:
|
Talk(SAY_BREATH);
|
||||||
if (roll_chance_i(50))
|
|
||||||
Talk(SAY_BREATH);
|
|
||||||
me->CastSpell(me->GetVictim(), SPELL_SAND_BREATH, false);
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_SAND_BREATH, 20000);
|
|
||||||
break;
|
|
||||||
case EVENT_SPELL_IMPENDING_DEATH:
|
|
||||||
me->CastSpell(me->GetVictim(), SPELL_IMPENDING_DEATH, false);
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_IMPENDING_DEATH, 30000);
|
|
||||||
break;
|
|
||||||
case EVENT_SPELL_WING_BUFFET:
|
|
||||||
me->CastSpell(me, SPELL_WING_BUFFET, false);
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_WING_BUFFET, 30000);
|
|
||||||
break;
|
|
||||||
case EVENT_SPELL_DISRUPTION:
|
|
||||||
me->CastSpell(me, SPELL_MAGIC_DISRUPTION_AURA, false);
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_DISRUPTION, 30000);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
DoCastVictim(SPELL_SAND_BREATH);
|
||||||
|
context.Repeat(20s);
|
||||||
|
}).Schedule(2s, [this](TaskContext context)
|
||||||
|
{
|
||||||
|
DoCastVictim(SPELL_IMPENDING_DEATH);
|
||||||
|
context.Repeat(30s);
|
||||||
|
}).Schedule(20s, [this](TaskContext context)
|
||||||
|
{
|
||||||
|
DoCastSelf(SPELL_MAGIC_DISRUPTION_AURA);
|
||||||
|
context.Repeat(30s);
|
||||||
|
}).Schedule(14s, [this](TaskContext context)
|
||||||
|
{
|
||||||
|
DoCastSelf(SPELL_WING_BUFFET);
|
||||||
|
context.Repeat(30s);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
DoMeleeAttackIfReady();
|
void KilledUnit(Unit* victim) override
|
||||||
|
{
|
||||||
|
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||||
|
Talk(SAY_SLAY);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JustDied(Unit* killer) override
|
||||||
|
{
|
||||||
|
if (killer && killer == me)
|
||||||
|
return;
|
||||||
|
|
||||||
|
_JustDied();
|
||||||
|
Talk(SAY_DEATH);
|
||||||
|
me->GetInstanceScript()->SetData(DATA_ESCORT_PROGRESS, ENCOUNTER_PROGRESS_EPOCH_KILLED);
|
||||||
|
if (Creature* taretha = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetGuidData(DATA_TARETHA_GUID)))
|
||||||
|
{
|
||||||
|
taretha->AI()->DoAction(me->GetEntry());
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
|
void UpdateAI(uint32 diff) override
|
||||||
|
{
|
||||||
|
if (!UpdateVictim())
|
||||||
|
return;
|
||||||
|
|
||||||
|
scheduler.Update(diff);
|
||||||
|
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||||
|
return;
|
||||||
|
|
||||||
|
DoMeleeAttackIfReady();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
void AddSC_boss_epoch_hunter()
|
void AddSC_boss_epoch_hunter()
|
||||||
{
|
{
|
||||||
new boss_epoch_hunter();
|
RegisterOldHillsbradCreatureAI(boss_epoch_hunter);
|
||||||
}
|
}
|
||||||
|
|||||||
+124
-132
@@ -21,159 +21,151 @@
|
|||||||
#include "SmartScriptMgr.h"
|
#include "SmartScriptMgr.h"
|
||||||
#include "old_hillsbrad.h"
|
#include "old_hillsbrad.h"
|
||||||
|
|
||||||
enum LieutenantDrake
|
enum Text
|
||||||
{
|
{
|
||||||
SAY_ENTER = 0,
|
SAY_ENTER = 0,
|
||||||
SAY_AGGRO = 1,
|
SAY_AGGRO = 1,
|
||||||
SAY_SLAY = 2,
|
SAY_SLAY = 2,
|
||||||
SAY_MORTAL = 3,
|
SAY_MORTAL = 3,
|
||||||
SAY_SHOUT = 4,
|
SAY_SHOUT = 4,
|
||||||
SAY_DEATH = 5,
|
SAY_DEATH = 5
|
||||||
|
|
||||||
SPELL_WHIRLWIND = 31909,
|
|
||||||
SPELL_EXPLODING_SHOT = 33792,
|
|
||||||
SPELL_HAMSTRING = 9080,
|
|
||||||
SPELL_MORTAL_STRIKE = 31911,
|
|
||||||
SPELL_FRIGHTENING_SHOUT = 33789,
|
|
||||||
|
|
||||||
EVENT_WHIRLWIND = 1,
|
|
||||||
EVENT_FRIGHTENING_SHOUT = 2,
|
|
||||||
EVENT_MORTAL_STRIKE = 3,
|
|
||||||
EVENT_HAMSTRING = 4,
|
|
||||||
EVENT_EXPLODING_SHOT = 5
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class boss_lieutenant_drake : public CreatureScript
|
enum Spells
|
||||||
{
|
{
|
||||||
public:
|
SPELL_WHIRLWIND = 31909,
|
||||||
boss_lieutenant_drake() : CreatureScript("boss_lieutenant_drake") { }
|
SPELL_EXPLODING_SHOT = 33792,
|
||||||
|
SPELL_HAMSTRING = 9080,
|
||||||
|
SPELL_MORTAL_STRIKE = 31911,
|
||||||
|
SPELL_FRIGHTENING_SHOUT = 33789
|
||||||
|
};
|
||||||
|
|
||||||
CreatureAI* GetAI(Creature* creature) const override
|
struct boss_lieutenant_drake : public BossAI
|
||||||
|
{
|
||||||
|
boss_lieutenant_drake(Creature* creature) : BossAI(creature, DATA_LIEUTENANT_DRAKE)
|
||||||
{
|
{
|
||||||
return GetOldHillsbradAI<boss_lieutenant_drakeAI>(creature);
|
scheduler.SetValidator([this]
|
||||||
|
{
|
||||||
|
return !me->HasUnitState(UNIT_STATE_CASTING);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
struct boss_lieutenant_drakeAI : public ScriptedAI
|
void InitializeAI() override
|
||||||
{
|
{
|
||||||
boss_lieutenant_drakeAI(Creature* creature) : ScriptedAI(creature)
|
runSecondPath = false;
|
||||||
|
pathId = me->GetEntry() * 10;
|
||||||
|
me->GetMotionMaster()->MovePath(pathId, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Reset() override
|
||||||
|
{
|
||||||
|
_Reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
void JustEngagedWith(Unit* /*who*/) override
|
||||||
|
{
|
||||||
|
_JustEngagedWith();
|
||||||
|
Talk(SAY_AGGRO);
|
||||||
|
scheduler.Schedule(4s, [this](TaskContext context)
|
||||||
{
|
{
|
||||||
|
DoCastSelf(SPELL_WHIRLWIND);
|
||||||
|
context.Repeat(25s);
|
||||||
|
}).Schedule(14s, [this](TaskContext context)
|
||||||
|
{
|
||||||
|
if (roll_chance_i(40))
|
||||||
|
{
|
||||||
|
Talk(SAY_SHOUT);
|
||||||
|
}
|
||||||
|
DoCastSelf(SPELL_FRIGHTENING_SHOUT);
|
||||||
|
context.Repeat(25s);
|
||||||
|
}).Schedule(9s, [this](TaskContext context)
|
||||||
|
{
|
||||||
|
if (roll_chance_i(40))
|
||||||
|
{
|
||||||
|
Talk(SAY_MORTAL);
|
||||||
|
}
|
||||||
|
DoCastVictim(SPELL_MORTAL_STRIKE);
|
||||||
|
context.Repeat(10s);
|
||||||
|
}).Schedule(18s, [this](TaskContext context)
|
||||||
|
{
|
||||||
|
DoCastVictim(SPELL_HAMSTRING);
|
||||||
|
context.Repeat(25s);
|
||||||
|
}).Schedule(1s, [this](TaskContext context)
|
||||||
|
{
|
||||||
|
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 40.0f))
|
||||||
|
{
|
||||||
|
DoCast(target, SPELL_EXPLODING_SHOT);
|
||||||
|
}
|
||||||
|
context.Repeat(25s);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void KilledUnit(Unit* victim) override
|
||||||
|
{
|
||||||
|
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||||
|
{
|
||||||
|
Talk(SAY_SLAY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void JustDied(Unit* /*killer*/) override
|
||||||
|
{
|
||||||
|
_JustDied();
|
||||||
|
Talk(SAY_DEATH);
|
||||||
|
if (InstanceScript* instance = me->GetInstanceScript())
|
||||||
|
{
|
||||||
|
instance->SetData(DATA_ESCORT_PROGRESS, ENCOUNTER_PROGRESS_DRAKE_KILLED);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MovementInform(uint32 type, uint32 point) override
|
||||||
|
{
|
||||||
|
if (type != WAYPOINT_MOTION_TYPE)
|
||||||
|
{
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void InitializeAI() override
|
if (pathId == me->GetEntry() * 10)
|
||||||
|
{
|
||||||
|
switch (point)
|
||||||
|
{
|
||||||
|
case 7:
|
||||||
|
Talk(SAY_ENTER);
|
||||||
|
break;
|
||||||
|
case 10:
|
||||||
|
pathId = (me->GetEntry() * 10) + 1;
|
||||||
|
runSecondPath = true;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpdateAI(uint32 diff) override
|
||||||
|
{
|
||||||
|
if (runSecondPath)
|
||||||
{
|
{
|
||||||
runSecondPath = false;
|
runSecondPath = false;
|
||||||
pathId = me->GetEntry() * 10;
|
me->GetMotionMaster()->MovePath(pathId, true);
|
||||||
me->GetMotionMaster()->MovePath(pathId, false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Reset() override
|
if (!UpdateVictim())
|
||||||
{
|
return;
|
||||||
events.Reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
void JustEngagedWith(Unit* /*who*/) override
|
scheduler.Update(diff);
|
||||||
{
|
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||||
Talk(SAY_AGGRO);
|
return;
|
||||||
|
|
||||||
events.ScheduleEvent(EVENT_WHIRLWIND, 4000);
|
DoMeleeAttackIfReady();
|
||||||
events.ScheduleEvent(EVENT_FRIGHTENING_SHOUT, 14000);
|
}
|
||||||
events.ScheduleEvent(EVENT_MORTAL_STRIKE, 9000);
|
|
||||||
events.ScheduleEvent(EVENT_HAMSTRING, 18000);
|
|
||||||
events.ScheduleEvent(EVENT_EXPLODING_SHOT, 1000);
|
|
||||||
}
|
|
||||||
|
|
||||||
void KilledUnit(Unit* victim) override
|
private:
|
||||||
{
|
uint32 pathId;
|
||||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
bool runSecondPath;
|
||||||
Talk(SAY_SLAY);
|
|
||||||
}
|
|
||||||
|
|
||||||
void JustDied(Unit* /*killer*/) override
|
|
||||||
{
|
|
||||||
Talk(SAY_DEATH);
|
|
||||||
if (InstanceScript* instance = me->GetInstanceScript())
|
|
||||||
instance->SetData(DATA_ESCORT_PROGRESS, ENCOUNTER_PROGRESS_DRAKE_KILLED);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MovementInform(uint32 type, uint32 point) override
|
|
||||||
{
|
|
||||||
if (type != WAYPOINT_MOTION_TYPE)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pathId == me->GetEntry() * 10)
|
|
||||||
{
|
|
||||||
switch (point)
|
|
||||||
{
|
|
||||||
case 7:
|
|
||||||
Talk(SAY_ENTER);
|
|
||||||
break;
|
|
||||||
case 10:
|
|
||||||
pathId = (me->GetEntry() * 10) + 1;
|
|
||||||
runSecondPath = true;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void UpdateAI(uint32 diff) override
|
|
||||||
{
|
|
||||||
if (runSecondPath)
|
|
||||||
{
|
|
||||||
runSecondPath = false;
|
|
||||||
me->GetMotionMaster()->MovePath(pathId, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!UpdateVictim())
|
|
||||||
return;
|
|
||||||
|
|
||||||
events.Update(diff);
|
|
||||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
|
||||||
return;
|
|
||||||
|
|
||||||
switch (events.ExecuteEvent())
|
|
||||||
{
|
|
||||||
case EVENT_WHIRLWIND:
|
|
||||||
me->CastSpell(me, SPELL_WHIRLWIND, false);
|
|
||||||
events.ScheduleEvent(EVENT_WHIRLWIND, 25000);
|
|
||||||
break;
|
|
||||||
case EVENT_EXPLODING_SHOT:
|
|
||||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 40.0f))
|
|
||||||
me->CastSpell(target, SPELL_EXPLODING_SHOT, false);
|
|
||||||
events.ScheduleEvent(EVENT_EXPLODING_SHOT, 25000);
|
|
||||||
break;
|
|
||||||
case EVENT_MORTAL_STRIKE:
|
|
||||||
if (roll_chance_i(40))
|
|
||||||
Talk(SAY_MORTAL);
|
|
||||||
me->CastSpell(me->GetVictim(), SPELL_MORTAL_STRIKE, false);
|
|
||||||
events.ScheduleEvent(EVENT_MORTAL_STRIKE, 10000);
|
|
||||||
break;
|
|
||||||
case EVENT_FRIGHTENING_SHOUT:
|
|
||||||
if (roll_chance_i(40))
|
|
||||||
Talk(SAY_SHOUT);
|
|
||||||
me->CastSpell(me, SPELL_FRIGHTENING_SHOUT, false);
|
|
||||||
events.ScheduleEvent(EVENT_FRIGHTENING_SHOUT, 25000);
|
|
||||||
break;
|
|
||||||
case EVENT_HAMSTRING:
|
|
||||||
me->CastSpell(me->GetVictim(), SPELL_HAMSTRING, false);
|
|
||||||
events.ScheduleEvent(EVENT_HAMSTRING, 25000);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
DoMeleeAttackIfReady();
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
EventMap events;
|
|
||||||
uint32 pathId;
|
|
||||||
bool runSecondPath;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void AddSC_boss_lieutenant_drake()
|
void AddSC_boss_lieutenant_drake()
|
||||||
{
|
{
|
||||||
new boss_lieutenant_drake();
|
RegisterOldHillsbradCreatureAI(boss_lieutenant_drake);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,9 @@
|
|||||||
enum DataIds
|
enum DataIds
|
||||||
{
|
{
|
||||||
DATA_ESCORT_PROGRESS = 0,
|
DATA_ESCORT_PROGRESS = 0,
|
||||||
|
DATA_LIEUTENANT_DRAKE = 1,
|
||||||
|
DATA_CAPTAIN_SKARLOC = 2,
|
||||||
|
DATA_EPOCH_HUNTER = 3,
|
||||||
|
|
||||||
DATA_BOMBS_PLACED = 10,
|
DATA_BOMBS_PLACED = 10,
|
||||||
DATA_THRALL_REPOSITION = 11,
|
DATA_THRALL_REPOSITION = 11,
|
||||||
@@ -95,4 +98,6 @@ inline AI* GetOldHillsbradAI(T* obj)
|
|||||||
return GetInstanceAI<AI>(obj, OldHillsbradScriptName);
|
return GetInstanceAI<AI>(obj, OldHillsbradScriptName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define RegisterOldHillsbradCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetOldHillsbradAI)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -19,14 +19,17 @@
|
|||||||
#include "ScriptedCreature.h"
|
#include "ScriptedCreature.h"
|
||||||
#include "the_black_morass.h"
|
#include "the_black_morass.h"
|
||||||
|
|
||||||
enum Enums
|
enum Text
|
||||||
{
|
{
|
||||||
SAY_AGGRO = 1,
|
SAY_AGGRO = 1,
|
||||||
SAY_BANISH = 2,
|
SAY_BANISH = 2,
|
||||||
SAY_SLAY = 3,
|
SAY_SLAY = 3,
|
||||||
SAY_DEATH = 4,
|
SAY_DEATH = 4,
|
||||||
EMOTE_FRENZY = 5,
|
EMOTE_FRENZY = 5
|
||||||
|
};
|
||||||
|
|
||||||
|
enum Spells
|
||||||
|
{
|
||||||
SPELL_CLEAVE = 40504,
|
SPELL_CLEAVE = 40504,
|
||||||
SPELL_TIME_STOP = 31422,
|
SPELL_TIME_STOP = 31422,
|
||||||
SPELL_ENRAGE = 37605,
|
SPELL_ENRAGE = 37605,
|
||||||
|
|||||||
@@ -19,19 +19,21 @@
|
|||||||
#include "ScriptedCreature.h"
|
#include "ScriptedCreature.h"
|
||||||
#include "the_black_morass.h"
|
#include "the_black_morass.h"
|
||||||
|
|
||||||
enum Enums
|
enum Text
|
||||||
{
|
{
|
||||||
SAY_AGGRO = 1,
|
SAY_AGGRO = 1,
|
||||||
SAY_BANISH = 2,
|
SAY_BANISH = 2,
|
||||||
SAY_SLAY = 3,
|
SAY_SLAY = 3,
|
||||||
SAY_DEATH = 4,
|
SAY_DEATH = 4
|
||||||
|
};
|
||||||
|
|
||||||
|
enum Spells
|
||||||
|
{
|
||||||
SPELL_ARCANE_BLAST = 31457,
|
SPELL_ARCANE_BLAST = 31457,
|
||||||
SPELL_ARCANE_DISCHARGE = 31472,
|
SPELL_ARCANE_DISCHARGE = 31472,
|
||||||
SPELL_TIME_LAPSE = 31467,
|
SPELL_TIME_LAPSE = 31467,
|
||||||
SPELL_ATTRACTION = 38540,
|
SPELL_ATTRACTION = 38540,
|
||||||
|
SPELL_BANISH_DRAGON_HELPER = 31550
|
||||||
SPELL_BANISH_DRAGON_HELPER = 31550,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct boss_chrono_lord_deja : public BossAI
|
struct boss_chrono_lord_deja : public BossAI
|
||||||
|
|||||||
@@ -19,13 +19,16 @@
|
|||||||
#include "ScriptedCreature.h"
|
#include "ScriptedCreature.h"
|
||||||
#include "the_black_morass.h"
|
#include "the_black_morass.h"
|
||||||
|
|
||||||
enum Enums
|
enum Text
|
||||||
{
|
{
|
||||||
SAY_AGGRO = 1,
|
SAY_AGGRO = 1,
|
||||||
SAY_BANISH = 2,
|
SAY_BANISH = 2,
|
||||||
SAY_SLAY = 3,
|
SAY_SLAY = 3,
|
||||||
SAY_DEATH = 4,
|
SAY_DEATH = 4
|
||||||
|
};
|
||||||
|
|
||||||
|
enum Spells
|
||||||
|
{
|
||||||
SPELL_HASTEN = 31458,
|
SPELL_HASTEN = 31458,
|
||||||
SPELL_MORTAL_WOUND = 31464,
|
SPELL_MORTAL_WOUND = 31464,
|
||||||
SPELL_WING_BUFFET = 31475,
|
SPELL_WING_BUFFET = 31475,
|
||||||
@@ -46,7 +49,6 @@ struct boss_temporus : public BossAI
|
|||||||
void JustEngagedWith(Unit* /*who*/) override
|
void JustEngagedWith(Unit* /*who*/) override
|
||||||
{
|
{
|
||||||
_JustEngagedWith();
|
_JustEngagedWith();
|
||||||
|
|
||||||
scheduler.Schedule(12s, [this](TaskContext context)
|
scheduler.Schedule(12s, [this](TaskContext context)
|
||||||
{
|
{
|
||||||
DoCastSelf(SPELL_HASTEN);
|
DoCastSelf(SPELL_HASTEN);
|
||||||
@@ -69,7 +71,6 @@ struct boss_temporus : public BossAI
|
|||||||
context.Repeat(30s);
|
context.Repeat(30s);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
OwnTalk(SAY_AGGRO);
|
OwnTalk(SAY_AGGRO);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -98,7 +99,6 @@ struct boss_temporus : public BossAI
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ScriptedAI::MoveInLineOfSight(who);
|
ScriptedAI::MoveInLineOfSight(who);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user