Scripts/Oculus: Implemented AI for Boss Ley-Guardian Eregos.

Signed-off-by: Manuel <manue.l@live.com.ar>
This commit is contained in:
Manuel
2011-01-26 16:57:59 -03:00
parent 140c0d8109
commit 187f34248d
4 changed files with 172 additions and 20 deletions

View File

@@ -1048,6 +1048,7 @@ UPDATE `creature_template` SET `ScriptName`='npc_oculus_drake' WHERE `entry` IN
UPDATE `creature_template` SET `ScriptName`='boss_urom' WHERE `entry`=27655;
UPDATE `creature_template` SET `ScriptName`='boss_varos' WHERE `entry`=27447;
UPDATE `creature_template` SET `ScriptName`='npc_azure_ring_captain' WHERE `entry`=28236;
UPDATE `creature_template` SET `ScriptName`='boss_eregos' WHERE `entry`=27656;
/* OBSIDIAN SANCTUM */
UPDATE `instance_template` SET `script`='instance_obsidian_sanctum' WHERE `map`=615;
@@ -1981,6 +1982,7 @@ INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
( 56251, 'spell_varos_energize_core_area_entry'),
( 50785, 'spell_varos_energize_core_area_enemy'),
( 59372, 'spell_varos_energize_core_area_enemy'),
( 51162, 'spell_eregos_planar_shift'),
-- Trial of Crusader
( 66118, 'spell_gen_leeching_swarm'),
( 67630, 'spell_gen_leeching_swarm'),

View File

@@ -0,0 +1,4 @@
DELETE FROM `spell_script_names` WHERE `spell_id`=51162;
INSERT INTO `spell_script_names`(spell_id, ScriptName) VALUES (51162,'spell_eregos_planar_shift');
UPDATE `creature_template` SET `ScriptName`='boss_eregos' WHERE `entry`=27656;

View File

@@ -398,6 +398,7 @@ void AddSC_instance_nexus();
void AddSC_boss_drakos(); //The Nexus The Oculus
void AddSC_boss_urom();
void AddSC_boss_varos();
void AddSC_boss_eregos();
void AddSC_instance_oculus();
void AddSC_oculus();
void AddSC_boss_sartharion(); //Obsidian Sanctum
@@ -1086,6 +1087,7 @@ void AddNorthrendScripts()
AddSC_boss_drakos(); //The Nexus The Oculus
AddSC_boss_urom();
AddSC_boss_varos();
AddSC_boss_eregos();
AddSC_instance_oculus();
AddSC_oculus();
AddSC_boss_sartharion(); //Obsidian Sanctum

View File

@@ -21,16 +21,50 @@
//Types of drake mounts: Ruby(Tank), Amber(DPS), Emerald(Healer)
//Two Repeating phases
enum Events
{
EVENT_ARCANE_BARRAGE = 1,
EVENT_ARCANE_VOLLEY,
EVENT_ENRAGED_ASSAULT,
EVENT_SUMMON_LEY_WHELP
};
enum Says
{
SAY_AGGRO = 0,
SAY_ENRAGE = 1,
SAY_DEATH = 2
};
enum Spells
{
SPELL_ARCANE_BARRAGE = 50804,
H_SPELL_ARCANE_BARRAGE = 59381,
SPELL_ARCANE_VOLLEY = 51153,
H_SPELL_ARCANE_VOLLEY = 59382,
SPELL_ENRAGED_ASSAULT = 51170,
SPELL_PLANAR_ANOMALIES = 57959,
SPELL_PLANAR_SHIFT = 51162,
SPELL_SUMMON_LEY_WHELP = 51175,
SPELL_SUMMON_PLANAR_ANOMALIES = 57963,
SPELL_PLANAR_BLAST = 57976
};
enum Npcs
{
NPC_PLANAR_ANOMALY = 30879
};
enum Phases
{
PHASE_NORMAL = 1,
PHASE_FIRST_PLANAR = 2,
PHASE_SECOND_PLANAR = 3
};
enum Actions
{
ACTION_SET_NORMAL_EVENTS = 1
};
/*Ruby Drake ,
(npc 27756) (item 37860)
(summoned by spell Ruby Essence = 37860 ---> Call Amber Drake == 49462 ---> Summon 27756)
@@ -60,6 +94,7 @@ enum AmberDrake
//you do not have access to until you kill the Mage-Lord Urom.
SPELL_AMBER_TEMPORAL_RIFT = 49592 //(60 yds) - Channeled - Channels a temporal rift on an enemy dragon for 10 sec. While trapped in the rift, all damage done to the target is increased by 100%. In addition, for every 15,000 damage done to a target affected by Temporal Rift, 1 Shock Charge is generated.
};
/*Emerald Drake,
(npc 27692) (item 37815),
(summoned by spell Emerald Essence = 37815 ---> Call Emerald Drake == 49345 ---> Summon 27692)
@@ -85,49 +120,158 @@ public:
return new boss_eregosAI (pCreature);
}
struct boss_eregosAI : public ScriptedAI
struct boss_eregosAI : public BossAI
{
boss_eregosAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceScript();
}
InstanceScript* pInstance;
boss_eregosAI(Creature* creature) : BossAI(creature, DATA_EREGOS_EVENT) { }
void Reset()
{
if (pInstance)
pInstance->SetData(DATA_EREGOS_EVENT, NOT_STARTED);
_Reset();
phase = PHASE_NORMAL;
DoAction(ACTION_SET_NORMAL_EVENTS);
}
void EnterCombat(Unit* /*who*/)
{
if (pInstance)
pInstance->SetData(DATA_EREGOS_EVENT, IN_PROGRESS);
_EnterCombat();
Talk(SAY_AGGRO);
}
void DoAction(const int32 action)
{
if (action != ACTION_SET_NORMAL_EVENTS)
return;
events.ScheduleEvent(EVENT_ARCANE_BARRAGE, urand(3,10) * IN_MILLISECONDS, 0, PHASE_NORMAL);
events.ScheduleEvent(EVENT_ARCANE_VOLLEY, urand(10,25) * IN_MILLISECONDS, 0, PHASE_NORMAL);
events.ScheduleEvent(EVENT_ENRAGED_ASSAULT, urand(35,50) * IN_MILLISECONDS, 0, PHASE_NORMAL);
events.ScheduleEvent(EVENT_SUMMON_LEY_WHELP, urand(15,30) * IN_MILLISECONDS, 0, PHASE_NORMAL);
}
void AttackStart(Unit* /*who*/) {}
void MoveInLineOfSight(Unit* /*who*/) {}
void UpdateAI(const uint32 /*diff*/)
void JustSummoned(Creature* summon)
{
BossAI::JustSummoned(summon);
if (summon->GetEntry() != NPC_PLANAR_ANOMALY)
return;
summon->CombatStop(true);
summon->SetReactState(REACT_PASSIVE);
summon->GetMotionMaster()->MoveRandom(100.0f);
}
void SummonedCreatureDespawn(Creature* summon)
{
if (summon->GetEntry() != NPC_PLANAR_ANOMALY)
return;
// TO-DO: See why the spell is not casted
summon->CastSpell(summon,SPELL_PLANAR_BLAST,true);
}
void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/)
{
if (!me->GetMap()->IsHeroic())
return;
if ( (me->GetHealthPct() < 60.0f && me->GetHealthPct() > 20.0f && phase < PHASE_FIRST_PLANAR)
|| (me->GetHealthPct() < 20.0f && phase < PHASE_SECOND_PLANAR) )
{
events.Reset();
phase = (me->GetHealthPct() < 60.0f && me->GetHealthPct() > 20.0f) ? PHASE_FIRST_PLANAR : PHASE_SECOND_PLANAR;
DoCast(SPELL_PLANAR_SHIFT);
// not sure about the amount, and if we should despawn previous spawns (dragon trashs)
summons.DespawnAll();
for (uint8 i = 0; i < 6; i++)
DoCast(SPELL_PLANAR_ANOMALIES);
}
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STAT_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_ARCANE_BARRAGE:
DoCast(me->getVictim(),SPELL_ARCANE_BARRAGE);
events.ScheduleEvent(EVENT_ARCANE_BARRAGE, urand(3,10) * IN_MILLISECONDS, 0, PHASE_NORMAL);
break;
case EVENT_ARCANE_VOLLEY:
DoCastAOE(SPELL_ARCANE_VOLLEY);
events.ScheduleEvent(EVENT_ARCANE_VOLLEY, urand(10,25) * IN_MILLISECONDS, 0, PHASE_NORMAL);
break;
case EVENT_ENRAGED_ASSAULT:
Talk(SAY_ENRAGE);
DoCast(SPELL_ENRAGED_ASSAULT);
events.ScheduleEvent(EVENT_ENRAGED_ASSAULT, urand(35,50) * IN_MILLISECONDS, 0, PHASE_NORMAL);
break;
case EVENT_SUMMON_LEY_WHELP:
for (uint8 i = 0; i < 3; i++)
DoCast(SPELL_SUMMON_LEY_WHELP);
events.ScheduleEvent(EVENT_SUMMON_LEY_WHELP, urand(15,30) * IN_MILLISECONDS, 0, PHASE_NORMAL);
break;
}
}
DoMeleeAttackIfReady();
}
void JustDied(Unit* /*killer*/)
{
if (pInstance)
pInstance->SetData(DATA_EREGOS_EVENT, DONE);
}
};
Talk(SAY_DEATH);
_JustDied();
}
private:
uint8 phase;
};
};
class spell_eregos_planar_shift : public SpellScriptLoader
{
public:
spell_eregos_planar_shift() : SpellScriptLoader("spell_eregos_planar_shift") { }
class spell_eregos_planar_shift_AuraScript : public AuraScript
{
PrepareAuraScript(spell_eregos_planar_shift_AuraScript);
void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
if (Creature* caster = GetCaster()->ToCreature())
caster->AI()->DoAction(ACTION_SET_NORMAL_EVENTS);
}
void Register()
{
OnEffectRemove += AuraEffectRemoveFn(spell_eregos_planar_shift_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_SCHOOL_IMMUNITY, AURA_EFFECT_HANDLE_REAL);
}
};
AuraScript* GetAuraScript() const
{
return new spell_eregos_planar_shift_AuraScript();
}
};
void AddSC_boss_eregos()
{
new boss_eregos();
new spell_eregos_planar_shift();
}