Scripts/Vault of Archavon: Cleaned and simplified scripts, fixed Toravon's Frozen Orb summon count
Closes issue #2857. --HG-- branch : trunk
This commit is contained in:
@@ -37,69 +37,45 @@
|
|||||||
//Yell
|
//Yell
|
||||||
#define SAY_LEAP "Archavon the Stone Watcher lunges for $N!" //$N should be the target
|
#define SAY_LEAP "Archavon the Stone Watcher lunges for $N!" //$N should be the target
|
||||||
|
|
||||||
#define EVENT_ROCK_SHARDS 1 //15s cd
|
enum Events
|
||||||
#define EVENT_CHOKING_CLOUD 2 //30s cd
|
{
|
||||||
#define EVENT_STOMP 3 //45s cd
|
// Archavon
|
||||||
#define EVENT_IMPALE 4
|
EVENT_ROCK_SHARDS = 1, // 15s cd
|
||||||
#define EVENT_BERSERK 5 //300s cd
|
EVENT_CHOKING_CLOUD = 2, // 30s cd
|
||||||
|
EVENT_STOMP = 3, // 45s cd
|
||||||
|
EVENT_IMPALE = 4,
|
||||||
|
EVENT_BERSERK = 5, // 300s cd
|
||||||
|
|
||||||
//mob
|
//mob
|
||||||
#define EVENT_ROCK_SHOWER 5 //set = 20s cd,unkown cd
|
EVENT_ROCK_SHOWER = 6, // set = 20s cd,unkown cd
|
||||||
#define EVENT_SHIELD_CRUSH 6 //set = 30s cd
|
EVENT_SHIELD_CRUSH = 7, // set = 30s cd
|
||||||
#define EVENT_WHIRL 8 //set= 10s cd
|
EVENT_WHIRL = 8, // set= 10s cd
|
||||||
|
};
|
||||||
|
|
||||||
class boss_archavon : public CreatureScript
|
class boss_archavon : public CreatureScript
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
boss_archavon() : CreatureScript("boss_archavon") { }
|
boss_archavon() : CreatureScript("boss_archavon") { }
|
||||||
|
|
||||||
CreatureAI* GetAI(Creature* pCreature) const
|
struct boss_archavonAI : public BossAI
|
||||||
{
|
{
|
||||||
return new boss_archavonAI (pCreature);
|
boss_archavonAI(Creature* creature) : BossAI(creature, DATA_ARCHAVON)
|
||||||
}
|
|
||||||
|
|
||||||
struct boss_archavonAI : public ScriptedAI
|
|
||||||
{
|
{
|
||||||
boss_archavonAI(Creature *c) : ScriptedAI(c)
|
|
||||||
{
|
|
||||||
pInstance = c->GetInstanceScript();
|
|
||||||
}
|
|
||||||
|
|
||||||
InstanceScript* pInstance;
|
|
||||||
EventMap events;
|
|
||||||
|
|
||||||
void Reset()
|
|
||||||
{
|
|
||||||
events.Reset();
|
|
||||||
|
|
||||||
if (pInstance)
|
|
||||||
pInstance->SetData(DATA_ARCHAVON_EVENT, NOT_STARTED);
|
|
||||||
}
|
|
||||||
|
|
||||||
void KilledUnit(Unit* /*Victim*/) {}
|
|
||||||
|
|
||||||
void JustDied(Unit* /*Killer*/)
|
|
||||||
{
|
|
||||||
if (pInstance)
|
|
||||||
pInstance->SetData(DATA_ARCHAVON_EVENT, DONE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void EnterCombat(Unit * /*who*/)
|
void EnterCombat(Unit * /*who*/)
|
||||||
{
|
{
|
||||||
DoZoneInCombat();
|
|
||||||
events.ScheduleEvent(EVENT_ROCK_SHARDS, 15000);
|
events.ScheduleEvent(EVENT_ROCK_SHARDS, 15000);
|
||||||
events.ScheduleEvent(EVENT_CHOKING_CLOUD, 30000);
|
events.ScheduleEvent(EVENT_CHOKING_CLOUD, 30000);
|
||||||
events.ScheduleEvent(EVENT_STOMP, 45000);
|
events.ScheduleEvent(EVENT_STOMP, 45000);
|
||||||
events.ScheduleEvent(EVENT_BERSERK, 300000);
|
events.ScheduleEvent(EVENT_BERSERK, 300000);
|
||||||
|
|
||||||
if (pInstance)
|
_EnterCombat();
|
||||||
pInstance->SetData(DATA_ARCHAVON_EVENT, IN_PROGRESS);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Below UpdateAI may need review/debug.
|
// Below UpdateAI may need review/debug.
|
||||||
void UpdateAI(const uint32 diff)
|
void UpdateAI(const uint32 diff)
|
||||||
{
|
{
|
||||||
//Return since we have no target
|
|
||||||
if (!UpdateVictim())
|
if (!UpdateVictim())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -110,30 +86,32 @@ public:
|
|||||||
|
|
||||||
while (uint32 eventId = events.ExecuteEvent())
|
while (uint32 eventId = events.ExecuteEvent())
|
||||||
{
|
{
|
||||||
switch(eventId)
|
switch (eventId)
|
||||||
{
|
{
|
||||||
case EVENT_ROCK_SHARDS:
|
case EVENT_ROCK_SHARDS:
|
||||||
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
|
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
|
||||||
DoCast(pTarget, SPELL_ROCK_SHARDS);
|
DoCast(target, SPELL_ROCK_SHARDS);
|
||||||
events.ScheduleEvent(EVENT_ROCK_SHARDS, 15000);
|
events.ScheduleEvent(EVENT_ROCK_SHARDS, 15000);
|
||||||
return;
|
break;
|
||||||
case EVENT_CHOKING_CLOUD:
|
case EVENT_CHOKING_CLOUD:
|
||||||
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
|
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
|
||||||
DoCast(pTarget, SPELL_CRUSHING_LEAP, true); //10y~80y, ignore range
|
DoCast(target, SPELL_CRUSHING_LEAP, true); //10y~80y, ignore range
|
||||||
events.ScheduleEvent(EVENT_CHOKING_CLOUD, 30000);
|
events.ScheduleEvent(EVENT_CHOKING_CLOUD, 30000);
|
||||||
return;
|
break;
|
||||||
case EVENT_STOMP:
|
case EVENT_STOMP:
|
||||||
DoCast(me->getVictim(), SPELL_STOMP);
|
DoCastVictim(SPELL_STOMP);
|
||||||
events.ScheduleEvent(EVENT_IMPALE, 3000);
|
events.ScheduleEvent(EVENT_IMPALE, 3000);
|
||||||
events.ScheduleEvent(EVENT_STOMP, 45000);
|
events.ScheduleEvent(EVENT_STOMP, 45000);
|
||||||
return;
|
break;
|
||||||
case EVENT_IMPALE:
|
case EVENT_IMPALE:
|
||||||
DoCast(me->getVictim(), SPELL_IMPALE);
|
DoCastVictim(SPELL_IMPALE);
|
||||||
return;
|
break;
|
||||||
case EVENT_BERSERK:
|
case EVENT_BERSERK:
|
||||||
DoCast(me, SPELL_BERSERK);
|
DoCast(me, SPELL_BERSERK);
|
||||||
DoScriptText(EMOTE_BERSERK, me);
|
DoScriptText(EMOTE_BERSERK, me);
|
||||||
return;
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -141,6 +119,10 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
CreatureAI* GetAI(Creature* creature) const
|
||||||
|
{
|
||||||
|
return new boss_archavonAI(creature);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/*######
|
/*######
|
||||||
@@ -148,70 +130,72 @@ public:
|
|||||||
######*/
|
######*/
|
||||||
class mob_archavon_warder : public CreatureScript
|
class mob_archavon_warder : public CreatureScript
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
mob_archavon_warder() : CreatureScript("mob_archavon_warder") { }
|
mob_archavon_warder() : CreatureScript("mob_archavon_warder") { }
|
||||||
|
|
||||||
CreatureAI* GetAI(Creature* pCreature) const
|
|
||||||
{
|
|
||||||
return new mob_archavon_warderAI(pCreature);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct mob_archavon_warderAI : public ScriptedAI //npc 32353
|
struct mob_archavon_warderAI : public ScriptedAI //npc 32353
|
||||||
{
|
{
|
||||||
mob_archavon_warderAI(Creature *c) : ScriptedAI(c) {}
|
mob_archavon_warderAI(Creature* creature) : ScriptedAI(creature)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
EventMap events;
|
EventMap events;
|
||||||
|
|
||||||
void Reset()
|
void Reset()
|
||||||
{
|
{
|
||||||
events.Reset();
|
events.Reset();
|
||||||
}
|
|
||||||
|
|
||||||
void EnterCombat(Unit * /*who*/)
|
|
||||||
{
|
|
||||||
DoZoneInCombat();
|
|
||||||
events.ScheduleEvent(EVENT_ROCK_SHOWER, 2000);
|
events.ScheduleEvent(EVENT_ROCK_SHOWER, 2000);
|
||||||
events.ScheduleEvent(EVENT_SHIELD_CRUSH, 20000);
|
events.ScheduleEvent(EVENT_SHIELD_CRUSH, 20000);
|
||||||
events.ScheduleEvent(EVENT_WHIRL, 7500);
|
events.ScheduleEvent(EVENT_WHIRL, 7500);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EnterCombat(Unit* /*who*/)
|
||||||
|
{
|
||||||
|
DoZoneInCombat();
|
||||||
|
}
|
||||||
|
|
||||||
void UpdateAI(const uint32 diff)
|
void UpdateAI(const uint32 diff)
|
||||||
{
|
{
|
||||||
//Return since we have no target
|
|
||||||
if (!UpdateVictim())
|
if (!UpdateVictim())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
events.Update(diff);
|
events.Update(diff);
|
||||||
|
|
||||||
|
if (me->HasUnitState(UNIT_STAT_CASTING))
|
||||||
|
return;
|
||||||
|
|
||||||
while (uint32 eventId = events.ExecuteEvent())
|
while (uint32 eventId = events.ExecuteEvent())
|
||||||
{
|
{
|
||||||
switch(eventId)
|
switch (eventId)
|
||||||
{
|
{
|
||||||
case EVENT_ROCK_SHOWER:
|
case EVENT_ROCK_SHOWER:
|
||||||
{
|
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
|
||||||
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
|
DoCast(target, SPELL_ROCK_SHOWER);
|
||||||
DoCast(pTarget, SPELL_ROCK_SHOWER);
|
|
||||||
events.ScheduleEvent(EVENT_ROCK_SHARDS, 6000);
|
events.ScheduleEvent(EVENT_ROCK_SHARDS, 6000);
|
||||||
return;
|
break;
|
||||||
}
|
|
||||||
case EVENT_SHIELD_CRUSH:
|
case EVENT_SHIELD_CRUSH:
|
||||||
DoCast(me->getVictim(), SPELL_SHIELD_CRUSH);
|
DoCastVictim(SPELL_SHIELD_CRUSH);
|
||||||
events.ScheduleEvent(EVENT_SHIELD_CRUSH, 20000);
|
events.ScheduleEvent(EVENT_SHIELD_CRUSH, 20000);
|
||||||
return;
|
break;
|
||||||
case EVENT_WHIRL:
|
case EVENT_WHIRL:
|
||||||
DoCast(me->getVictim(), SPELL_WHIRL);
|
DoCastVictim(SPELL_WHIRL);
|
||||||
events.ScheduleEvent(EVENT_WHIRL, 8000);
|
events.ScheduleEvent(EVENT_WHIRL, 8000);
|
||||||
return;
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DoMeleeAttackIfReady();
|
DoMeleeAttackIfReady();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
CreatureAI* GetAI(Creature* creature) const
|
||||||
|
{
|
||||||
|
return new mob_archavon_warderAI(creature);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AddSC_boss_archavon()
|
void AddSC_boss_archavon()
|
||||||
{
|
{
|
||||||
new boss_archavon();
|
new boss_archavon();
|
||||||
|
|||||||
@@ -19,27 +19,35 @@
|
|||||||
#include "vault_of_archavon.h"
|
#include "vault_of_archavon.h"
|
||||||
|
|
||||||
//Emalon spells
|
//Emalon spells
|
||||||
|
enum Spells
|
||||||
|
{
|
||||||
|
SPELL_OVERCHARGE = 64218, // Cast every 45 sec on a random Tempest Minion
|
||||||
|
SPELL_BERSERK = 26662,
|
||||||
|
|
||||||
|
SPELL_SHOCK = 64363,
|
||||||
|
SPELL_OVERCHARGED = 64217,
|
||||||
|
SPELL_OVERCHARGED_BLAST = 64219, // Cast when Overcharged reaches 10 stacks. Mob dies after that
|
||||||
|
};
|
||||||
|
|
||||||
|
// cannot let SpellDifficulty handle it, no entries for these
|
||||||
#define SPELL_CHAIN_LIGHTNING RAID_MODE(64213, 64215)
|
#define SPELL_CHAIN_LIGHTNING RAID_MODE(64213, 64215)
|
||||||
#define SPELL_LIGHTNING_NOVA RAID_MODE(64216, 65279)
|
#define SPELL_LIGHTNING_NOVA RAID_MODE(64216, 65279)
|
||||||
#define SPELL_OVERCHARGE 64218 //Casted every 45 sec on a random Tempest Minion
|
|
||||||
#define SPELL_BERSERK 26662
|
|
||||||
|
|
||||||
//Tempest Minion spells
|
enum BossEmotes
|
||||||
#define SPELL_SHOCK 64363
|
{
|
||||||
#define SPELL_OVERCHARGED 64217
|
EMOTE_OVERCHARGE = -1590000,
|
||||||
#define SPELL_OVERCHARGED_BLAST 64219 //Casted when Overcharged reaches 10 stacks. Mob dies after that
|
EMOTE_MINION_RESPAWN = -1590001,
|
||||||
|
EMOTE_BERSERK = -1590002,
|
||||||
|
};
|
||||||
|
|
||||||
//Emotes
|
enum Events
|
||||||
#define EMOTE_OVERCHARGE -1590000
|
{
|
||||||
#define EMOTE_MINION_RESPAWN -1590001
|
EVENT_CHAIN_LIGHTNING = 1,
|
||||||
#define EMOTE_BERSERK -1590002
|
EVENT_LIGHTNING_NOVA = 2,
|
||||||
|
EVENT_OVERCHARGE = 3,
|
||||||
//Events
|
EVENT_BERSERK = 4,
|
||||||
#define EVENT_CHAIN_LIGHTNING 1
|
EVENT_SHOCK = 5,
|
||||||
#define EVENT_LIGHTNING_NOVA 2
|
};
|
||||||
#define EVENT_OVERCHARGE 3
|
|
||||||
#define EVENT_BERSERK 4
|
|
||||||
#define EVENT_SHOCK 5
|
|
||||||
|
|
||||||
//Creatures
|
//Creatures
|
||||||
#define MOB_TEMPEST_MINION 33998
|
#define MOB_TEMPEST_MINION 33998
|
||||||
@@ -59,17 +67,12 @@ struct Position TempestMinions[MAX_TEMPEST_MINIONS] =
|
|||||||
######*/
|
######*/
|
||||||
class boss_emalon : public CreatureScript
|
class boss_emalon : public CreatureScript
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
boss_emalon() : CreatureScript("boss_emalon") { }
|
boss_emalon() : CreatureScript("boss_emalon") { }
|
||||||
|
|
||||||
CreatureAI* GetAI(Creature *_Creature) const
|
|
||||||
{
|
|
||||||
return new boss_emalonAI (_Creature);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct boss_emalonAI : public BossAI
|
struct boss_emalonAI : public BossAI
|
||||||
{
|
{
|
||||||
boss_emalonAI(Creature *c) : BossAI(c, DATA_EMALON_EVENT)
|
boss_emalonAI(Creature* creature) : BossAI(creature, DATA_EMALON)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -81,15 +84,16 @@ public:
|
|||||||
me->SummonCreature(MOB_TEMPEST_MINION, TempestMinions[i], TEMPSUMMON_CORPSE_DESPAWN, 0);
|
me->SummonCreature(MOB_TEMPEST_MINION, TempestMinions[i], TEMPSUMMON_CORPSE_DESPAWN, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void JustSummoned(Creature *summoned)
|
void JustSummoned(Creature* summoned)
|
||||||
{
|
{
|
||||||
BossAI::JustSummoned(summoned);
|
BossAI::JustSummoned(summoned);
|
||||||
|
|
||||||
if (me->getVictim() && summoned->AI())
|
// AttackStart has NULL-check for victim
|
||||||
|
if (summoned->AI())
|
||||||
summoned->AI()->AttackStart(me->getVictim());
|
summoned->AI()->AttackStart(me->getVictim());
|
||||||
}
|
}
|
||||||
|
|
||||||
void EnterCombat(Unit * who)
|
void EnterCombat(Unit* who)
|
||||||
{
|
{
|
||||||
if (!summons.empty())
|
if (!summons.empty())
|
||||||
{
|
{
|
||||||
@@ -111,7 +115,6 @@ public:
|
|||||||
|
|
||||||
void UpdateAI(const uint32 diff)
|
void UpdateAI(const uint32 diff)
|
||||||
{
|
{
|
||||||
//Return since we have no target
|
|
||||||
if (!UpdateVictim())
|
if (!UpdateVictim())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -122,15 +125,15 @@ public:
|
|||||||
|
|
||||||
while (uint32 eventId = events.ExecuteEvent())
|
while (uint32 eventId = events.ExecuteEvent())
|
||||||
{
|
{
|
||||||
switch(eventId)
|
switch (eventId)
|
||||||
{
|
{
|
||||||
case EVENT_CHAIN_LIGHTNING:
|
case EVENT_CHAIN_LIGHTNING:
|
||||||
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
|
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
|
||||||
DoCast(pTarget, SPELL_CHAIN_LIGHTNING);
|
DoCast(target, SPELL_CHAIN_LIGHTNING);
|
||||||
events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 25000);
|
events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 25000);
|
||||||
break;
|
break;
|
||||||
case EVENT_LIGHTNING_NOVA:
|
case EVENT_LIGHTNING_NOVA:
|
||||||
DoCastAOE(SPELL_LIGHTNING_NOVA, false);
|
DoCastAOE(SPELL_LIGHTNING_NOVA);
|
||||||
events.ScheduleEvent(EVENT_LIGHTNING_NOVA, 40000);
|
events.ScheduleEvent(EVENT_LIGHTNING_NOVA, 40000);
|
||||||
break;
|
break;
|
||||||
case EVENT_OVERCHARGE:
|
case EVENT_OVERCHARGE:
|
||||||
@@ -138,7 +141,7 @@ public:
|
|||||||
{
|
{
|
||||||
std::list<uint64>::const_iterator itr = summons.begin();
|
std::list<uint64>::const_iterator itr = summons.begin();
|
||||||
std::advance(itr, urand(0, summons.size()-1));
|
std::advance(itr, urand(0, summons.size()-1));
|
||||||
Creature *minion = Unit::GetCreature(*me, *itr);
|
Creature* minion = Unit::GetCreature(*me, *itr);
|
||||||
if (minion && minion->isAlive())
|
if (minion && minion->isAlive())
|
||||||
{
|
{
|
||||||
minion->CastSpell(me, SPELL_OVERCHARGED, true);
|
minion->CastSpell(me, SPELL_OVERCHARGED, true);
|
||||||
@@ -152,6 +155,8 @@ public:
|
|||||||
DoCast(me, SPELL_BERSERK);
|
DoCast(me, SPELL_BERSERK);
|
||||||
DoScriptText(EMOTE_BERSERK, me);
|
DoScriptText(EMOTE_BERSERK, me);
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -159,6 +164,10 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
CreatureAI* GetAI(Creature* creature) const
|
||||||
|
{
|
||||||
|
return new boss_emalonAI(creature);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/*######
|
/*######
|
||||||
@@ -166,41 +175,29 @@ public:
|
|||||||
######*/
|
######*/
|
||||||
class mob_tempest_minion : public CreatureScript
|
class mob_tempest_minion : public CreatureScript
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
mob_tempest_minion() : CreatureScript("mob_tempest_minion") { }
|
mob_tempest_minion() : CreatureScript("mob_tempest_minion") { }
|
||||||
|
|
||||||
CreatureAI* GetAI(Creature *_Creature) const
|
|
||||||
{
|
|
||||||
return new mob_tempest_minionAI (_Creature);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct mob_tempest_minionAI : public ScriptedAI
|
struct mob_tempest_minionAI : public ScriptedAI
|
||||||
{
|
{
|
||||||
mob_tempest_minionAI(Creature *c) : ScriptedAI(c)
|
mob_tempest_minionAI(Creature* creature) : ScriptedAI(creature)
|
||||||
{
|
{
|
||||||
pInstance = c->GetInstanceScript();
|
instance = creature->GetInstanceScript();
|
||||||
}
|
}
|
||||||
|
|
||||||
InstanceScript* pInstance;
|
|
||||||
|
|
||||||
EventMap events;
|
|
||||||
|
|
||||||
uint32 uiOverchargedTimer;
|
|
||||||
|
|
||||||
void Reset()
|
void Reset()
|
||||||
{
|
{
|
||||||
events.Reset();
|
events.Reset();
|
||||||
|
OverchargedTimer = 0;
|
||||||
uiOverchargedTimer = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void JustDied(Unit* /*Killer*/)
|
void JustDied(Unit* /*Killer*/)
|
||||||
{
|
{
|
||||||
if (Creature *pEmalon = Unit::GetCreature(*me, pInstance ? pInstance->GetData64(DATA_EMALON) : 0))
|
if (Creature* emalon = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_EMALON) : 0))
|
||||||
{
|
{
|
||||||
if (pEmalon->isAlive())
|
if (emalon->isAlive())
|
||||||
{
|
{
|
||||||
pEmalon->SummonCreature(MOB_TEMPEST_MINION, 0, 0, 0, 0, TEMPSUMMON_CORPSE_DESPAWN, 0);
|
emalon->SummonCreature(MOB_TEMPEST_MINION, 0, 0, 0, 0, TEMPSUMMON_CORPSE_DESPAWN, 0);
|
||||||
DoScriptText(EMOTE_MINION_RESPAWN, me);
|
DoScriptText(EMOTE_MINION_RESPAWN, me);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -211,7 +208,7 @@ public:
|
|||||||
DoZoneInCombat();
|
DoZoneInCombat();
|
||||||
events.ScheduleEvent(EVENT_SHOCK, 20000);
|
events.ScheduleEvent(EVENT_SHOCK, 20000);
|
||||||
|
|
||||||
if (Creature *pEmalon = Unit::GetCreature(*me, pInstance ? pInstance->GetData64(DATA_EMALON) : 0))
|
if (Creature *pEmalon = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_EMALON) : 0))
|
||||||
{
|
{
|
||||||
if (!pEmalon->getVictim() && pEmalon->AI())
|
if (!pEmalon->getVictim() && pEmalon->AI())
|
||||||
pEmalon->AI()->AttackStart(who);
|
pEmalon->AI()->AttackStart(who);
|
||||||
@@ -229,15 +226,17 @@ public:
|
|||||||
if (me->HasUnitState(UNIT_STAT_CASTING))
|
if (me->HasUnitState(UNIT_STAT_CASTING))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (Aura *overchargedAura = me->GetAura(SPELL_OVERCHARGED))
|
if (Aura const* overchargedAura = me->GetAura(SPELL_OVERCHARGED))
|
||||||
{
|
{
|
||||||
if (overchargedAura->GetStackAmount() < 10)
|
if (overchargedAura->GetStackAmount() < 10)
|
||||||
{
|
{
|
||||||
if (uiOverchargedTimer <= diff)
|
if (OverchargedTimer <= diff)
|
||||||
{
|
{
|
||||||
DoCast(me, SPELL_OVERCHARGED);
|
DoCast(me, SPELL_OVERCHARGED);
|
||||||
uiOverchargedTimer = 2000;
|
OverchargedTimer = 2000;
|
||||||
} else uiOverchargedTimer -=diff;
|
}
|
||||||
|
else
|
||||||
|
OverchargedTimer -= diff;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -250,25 +249,27 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
while (uint32 eventId = events.ExecuteEvent())
|
if (events.ExecuteEvent() == EVENT_SHOCK)
|
||||||
{
|
{
|
||||||
switch(eventId)
|
DoCastVictim(SPELL_SHOCK);
|
||||||
{
|
|
||||||
case EVENT_SHOCK:
|
|
||||||
DoCast(me->getVictim(), SPELL_SHOCK);
|
|
||||||
events.ScheduleEvent(EVENT_SHOCK, 20000);
|
events.ScheduleEvent(EVENT_SHOCK, 20000);
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DoMeleeAttackIfReady();
|
DoMeleeAttackIfReady();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
InstanceScript* instance;
|
||||||
|
EventMap events;
|
||||||
|
uint32 OverchargedTimer;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
CreatureAI* GetAI(Creature* creature) const
|
||||||
|
{
|
||||||
|
return new mob_tempest_minionAI(creature);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AddSC_boss_emalon()
|
void AddSC_boss_emalon()
|
||||||
{
|
{
|
||||||
new boss_emalon();
|
new boss_emalon();
|
||||||
|
|||||||
@@ -20,84 +20,48 @@
|
|||||||
|
|
||||||
enum Events
|
enum Events
|
||||||
{
|
{
|
||||||
EVENT_NONE,
|
|
||||||
|
|
||||||
// Koralon
|
// Koralon
|
||||||
EVENT_BURNING_BREATH,
|
EVENT_BURNING_BREATH = 1,
|
||||||
EVENT_BURNING_FURY,
|
EVENT_BURNING_FURY = 2,
|
||||||
EVENT_FLAME_CINDER_A,
|
EVENT_FLAME_CINDER_A = 3,
|
||||||
EVENT_METEOR_FISTS_A,
|
EVENT_METEOR_FISTS_A = 4,
|
||||||
EVENT_METEOR_FISTS_B,
|
EVENT_METEOR_FISTS_B = 5,
|
||||||
|
|
||||||
// Flame Warder
|
// Flame Warder
|
||||||
EVENT_FW_LAVA_BIRST,
|
EVENT_FW_LAVA_BIRST = 6,
|
||||||
EVENT_FW_METEOR_FISTS_A,
|
EVENT_FW_METEOR_FISTS_A = 7,
|
||||||
EVENT_FW_METEOR_FISTS_B,
|
EVENT_FW_METEOR_FISTS_B = 8,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum Spells
|
enum Spells
|
||||||
{
|
{
|
||||||
// Spells Koralon
|
// Spells Koralon
|
||||||
SPELL_BURNING_BREATH = 66665,
|
SPELL_BURNING_BREATH = 66665,
|
||||||
SPELL_BURNING_BREATH_H = 67328,
|
|
||||||
SPELL_BURNING_FURY = 66721,
|
SPELL_BURNING_FURY = 66721,
|
||||||
SPELL_FLAME_CINDER_A = 66684,
|
SPELL_FLAME_CINDER_A = 66684,
|
||||||
SPELL_FLAME_CINDER_A_H = 67332,
|
|
||||||
SPELL_FLAME_CINDER_B = 66681, // don't know the real relation to SPELL_FLAME_CINDER_A atm.
|
SPELL_FLAME_CINDER_B = 66681, // don't know the real relation to SPELL_FLAME_CINDER_A atm.
|
||||||
SPELL_METEOR_FISTS_A = 66725,
|
SPELL_METEOR_FISTS_A = 66725,
|
||||||
SPELL_METEOR_FISTS_A_H = 66765,
|
|
||||||
SPELL_METEOR_FISTS_B = 67333,
|
SPELL_METEOR_FISTS_B = 67333,
|
||||||
SPELL_METEOR_FISTS_B_H = 68161,
|
|
||||||
|
|
||||||
// Spells Flame Warder
|
// Spells Flame Warder
|
||||||
SPELL_FW_LAVA_BIRST = 66813,
|
SPELL_FW_LAVA_BIRST = 66813,
|
||||||
SPELL_FW_LAVA_BIRST_H = 67330,
|
|
||||||
SPELL_FW_METEOR_FISTS_A = 66808,
|
SPELL_FW_METEOR_FISTS_A = 66808,
|
||||||
SPELL_FW_METEOR_FISTS_A_H = 66809,
|
|
||||||
SPELL_FW_METEOR_FISTS_B = 67331,
|
SPELL_FW_METEOR_FISTS_B = 67331,
|
||||||
SPELL_FW_METEOR_FISTS_B_H = 68160,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class boss_koralon : public CreatureScript
|
class boss_koralon : public CreatureScript
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
boss_koralon() : CreatureScript("boss_koralon") { }
|
boss_koralon() : CreatureScript("boss_koralon") { }
|
||||||
|
|
||||||
CreatureAI* GetAI(Creature* pCreature) const
|
struct boss_koralonAI : public BossAI
|
||||||
|
{
|
||||||
|
boss_koralonAI(Creature* creature) : BossAI(creature, DATA_KORALON)
|
||||||
{
|
{
|
||||||
return new boss_koralonAI (pCreature);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct boss_koralonAI : public ScriptedAI
|
void EnterCombat(Unit* /*who*/)
|
||||||
{
|
{
|
||||||
boss_koralonAI(Creature *c) : ScriptedAI(c)
|
|
||||||
{
|
|
||||||
pInstance = c->GetInstanceScript();
|
|
||||||
}
|
|
||||||
|
|
||||||
InstanceScript *pInstance;
|
|
||||||
EventMap events;
|
|
||||||
|
|
||||||
void Reset()
|
|
||||||
{
|
|
||||||
events.Reset();
|
|
||||||
|
|
||||||
if (pInstance)
|
|
||||||
pInstance->SetData(DATA_KORALON_EVENT, NOT_STARTED);
|
|
||||||
}
|
|
||||||
|
|
||||||
void KilledUnit(Unit* /*Victim*/) {}
|
|
||||||
|
|
||||||
void JustDied(Unit* /*Killer*/)
|
|
||||||
{
|
|
||||||
if (pInstance)
|
|
||||||
pInstance->SetData(DATA_KORALON_EVENT, DONE);
|
|
||||||
}
|
|
||||||
|
|
||||||
void EnterCombat(Unit * /*who*/)
|
|
||||||
{
|
|
||||||
DoZoneInCombat();
|
|
||||||
|
|
||||||
DoCast(me, SPELL_BURNING_FURY);
|
DoCast(me, SPELL_BURNING_FURY);
|
||||||
|
|
||||||
events.ScheduleEvent(EVENT_BURNING_FURY, 20000); // TODO check timer
|
events.ScheduleEvent(EVENT_BURNING_FURY, 20000); // TODO check timer
|
||||||
@@ -105,8 +69,7 @@ public:
|
|||||||
events.ScheduleEvent(EVENT_METEOR_FISTS_A, 75000); // 1st after 75sec, then every 45sec
|
events.ScheduleEvent(EVENT_METEOR_FISTS_A, 75000); // 1st after 75sec, then every 45sec
|
||||||
events.ScheduleEvent(EVENT_FLAME_CINDER_A, 30000); // TODO check timer
|
events.ScheduleEvent(EVENT_FLAME_CINDER_A, 30000); // TODO check timer
|
||||||
|
|
||||||
if (pInstance)
|
_EnterCombat();
|
||||||
pInstance->SetData(DATA_KORALON_EVENT, IN_PROGRESS);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void UpdateAI(const uint32 diff)
|
void UpdateAI(const uint32 diff)
|
||||||
@@ -121,34 +84,41 @@ public:
|
|||||||
|
|
||||||
while (uint32 eventId = events.ExecuteEvent())
|
while (uint32 eventId = events.ExecuteEvent())
|
||||||
{
|
{
|
||||||
switch(eventId)
|
switch (eventId)
|
||||||
{
|
{
|
||||||
case EVENT_BURNING_FURY:
|
case EVENT_BURNING_FURY:
|
||||||
DoCast(me, SPELL_BURNING_FURY);
|
DoCast(me, SPELL_BURNING_FURY);
|
||||||
events.ScheduleEvent(EVENT_BURNING_FURY, 20000);
|
events.ScheduleEvent(EVENT_BURNING_FURY, 20000);
|
||||||
return;
|
break;
|
||||||
case EVENT_BURNING_BREATH:
|
case EVENT_BURNING_BREATH:
|
||||||
DoCast(me, RAID_MODE(SPELL_BURNING_BREATH,SPELL_BURNING_BREATH_H));
|
DoCast(me, SPELL_BURNING_BREATH);
|
||||||
events.ScheduleEvent(EVENT_BURNING_BREATH, 45000);
|
events.ScheduleEvent(EVENT_BURNING_BREATH, 45000);
|
||||||
return;
|
break;
|
||||||
case EVENT_METEOR_FISTS_A:
|
case EVENT_METEOR_FISTS_A:
|
||||||
DoCast(me, RAID_MODE(SPELL_METEOR_FISTS_A,SPELL_METEOR_FISTS_A_H));
|
DoCast(me, SPELL_METEOR_FISTS_A);
|
||||||
events.ScheduleEvent(EVENT_METEOR_FISTS_B, 1500);
|
events.ScheduleEvent(EVENT_METEOR_FISTS_B, 1500);
|
||||||
return;
|
break;
|
||||||
case EVENT_METEOR_FISTS_B:
|
case EVENT_METEOR_FISTS_B:
|
||||||
DoCast(me, RAID_MODE(SPELL_METEOR_FISTS_B,SPELL_METEOR_FISTS_B_H));
|
DoCast(me, SPELL_METEOR_FISTS_B);
|
||||||
events.ScheduleEvent(EVENT_METEOR_FISTS_A, 45000);
|
events.ScheduleEvent(EVENT_METEOR_FISTS_A, 45000);
|
||||||
return;
|
break;
|
||||||
case EVENT_FLAME_CINDER_A:
|
case EVENT_FLAME_CINDER_A:
|
||||||
DoCast(me, RAID_MODE(SPELL_FLAME_CINDER_A,SPELL_FLAME_CINDER_A_H));
|
DoCast(me, SPELL_FLAME_CINDER_A);
|
||||||
events.ScheduleEvent(EVENT_FLAME_CINDER_A, 30000);
|
events.ScheduleEvent(EVENT_FLAME_CINDER_A, 30000);
|
||||||
return;
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DoMeleeAttackIfReady();
|
DoMeleeAttackIfReady();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
CreatureAI* GetAI(Creature* creature) const
|
||||||
|
{
|
||||||
|
return new boss_koralonAI(creature);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/*######
|
/*######
|
||||||
@@ -156,19 +126,14 @@ public:
|
|||||||
######*/
|
######*/
|
||||||
class mob_flame_warder : public CreatureScript
|
class mob_flame_warder : public CreatureScript
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
mob_flame_warder() : CreatureScript("mob_flame_warder") { }
|
mob_flame_warder() : CreatureScript("mob_flame_warder") { }
|
||||||
|
|
||||||
CreatureAI* GetAI(Creature* pCreature) const
|
|
||||||
{
|
|
||||||
return new mob_flame_warderAI (pCreature);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct mob_flame_warderAI : public ScriptedAI
|
struct mob_flame_warderAI : public ScriptedAI
|
||||||
{
|
{
|
||||||
mob_flame_warderAI(Creature *c) : ScriptedAI(c) {}
|
mob_flame_warderAI(Creature* creature) : ScriptedAI(creature)
|
||||||
|
{
|
||||||
EventMap events;
|
}
|
||||||
|
|
||||||
void Reset()
|
void Reset()
|
||||||
{
|
{
|
||||||
@@ -192,30 +157,38 @@ public:
|
|||||||
|
|
||||||
while (uint32 eventId = events.ExecuteEvent())
|
while (uint32 eventId = events.ExecuteEvent())
|
||||||
{
|
{
|
||||||
switch(eventId)
|
switch (eventId)
|
||||||
{
|
{
|
||||||
case EVENT_FW_LAVA_BIRST:
|
case EVENT_FW_LAVA_BIRST:
|
||||||
DoCast(me->getVictim(), RAID_MODE(SPELL_FW_LAVA_BIRST,SPELL_FW_LAVA_BIRST_H));
|
DoCastVictim(SPELL_FW_LAVA_BIRST);
|
||||||
events.ScheduleEvent(EVENT_FW_LAVA_BIRST, 15000);
|
events.ScheduleEvent(EVENT_FW_LAVA_BIRST, 15000);
|
||||||
return;
|
break;
|
||||||
case EVENT_FW_METEOR_FISTS_A:
|
case EVENT_FW_METEOR_FISTS_A:
|
||||||
DoCast(me, RAID_MODE(SPELL_FW_METEOR_FISTS_A,SPELL_FW_METEOR_FISTS_A_H));
|
DoCast(me, SPELL_FW_METEOR_FISTS_A);
|
||||||
events.ScheduleEvent(EVENT_FW_METEOR_FISTS_B, 1500);
|
events.ScheduleEvent(EVENT_FW_METEOR_FISTS_B, 1500);
|
||||||
return;
|
break;
|
||||||
case EVENT_FW_METEOR_FISTS_B:
|
case EVENT_FW_METEOR_FISTS_B:
|
||||||
DoCast(me, RAID_MODE(SPELL_FW_METEOR_FISTS_B,SPELL_FW_METEOR_FISTS_B_H));
|
DoCast(me, SPELL_FW_METEOR_FISTS_B);
|
||||||
events.ScheduleEvent(EVENT_FW_METEOR_FISTS_A, 20000);
|
events.ScheduleEvent(EVENT_FW_METEOR_FISTS_A, 20000);
|
||||||
return;
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DoMeleeAttackIfReady();
|
DoMeleeAttackIfReady();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
EventMap events;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
CreatureAI* GetAI(Creature* creature) const
|
||||||
|
{
|
||||||
|
return new mob_flame_warderAI(creature);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AddSC_boss_koralon()
|
void AddSC_boss_koralon()
|
||||||
{
|
{
|
||||||
new boss_koralon();
|
new boss_koralon();
|
||||||
|
|||||||
@@ -18,82 +18,59 @@
|
|||||||
#include "ScriptPCH.h"
|
#include "ScriptPCH.h"
|
||||||
#include "vault_of_archavon.h"
|
#include "vault_of_archavon.h"
|
||||||
|
|
||||||
// Spells Toravon
|
enum Spells
|
||||||
#define SPELL_FREEZING_GROUND RAID_MODE(72090,72104) // don't know cd... using 20 secs.
|
{
|
||||||
#define SPELL_FROZEN_ORB RAID_MODE(72091,72095)
|
// Toravon
|
||||||
#define SPELL_WHITEOUT RAID_MODE(72034,72096) // Every 38 sec. cast. (after SPELL_FROZEN_ORB)
|
SPELL_FREEZING_GROUND = 72090, // don't know cd... using 20 secs.
|
||||||
#define SPELL_FROZEN_MALLET 71993
|
SPELL_FROZEN_ORB = 72091,
|
||||||
|
SPELL_WHITEOUT = 72034, // Every 38 sec. cast. (after SPELL_FROZEN_ORB)
|
||||||
|
SPELL_FROZEN_MALLET = 71993,
|
||||||
|
|
||||||
// Spells Frost Warder
|
// Frost Warder
|
||||||
#define SPELL_FROST_BLAST RAID_MODE(72123,72124) // don't know cd... using 20 secs.
|
SPELL_FROST_BLAST = 72123, // don't know cd... using 20 secs.
|
||||||
#define SPELL_FROZEN_MALLET_2 72122
|
SPELL_FROZEN_MALLET_2 = 72122,
|
||||||
|
|
||||||
// Spell Frozen Orb
|
// Frozen Orb
|
||||||
#define SPELL_FROZEN_ORB_DMG 72081 // priodic dmg aura
|
SPELL_FROZEN_ORB_DMG = 72081, // priodic dmg aura
|
||||||
#define SPELL_FROZEN_ORB_AURA 72067 // make visible
|
SPELL_FROZEN_ORB_AURA = 72067, // make visible
|
||||||
|
|
||||||
// Spell Frozen Orb Stalker
|
// Frozen Orb Stalker
|
||||||
#define SPELL_FROZEN_ORB_SUMMON 72093 // summon orb
|
SPELL_FROZEN_ORB_SUMMON = 72093, // summon orb
|
||||||
|
};
|
||||||
|
|
||||||
// Events boss
|
// Events boss
|
||||||
#define EVENT_FREEZING_GROUND 1
|
enum Events
|
||||||
#define EVENT_FROZEN_ORB 2
|
{
|
||||||
#define EVENT_WHITEOUT 3
|
EVENT_FREEZING_GROUND = 1,
|
||||||
|
EVENT_FROZEN_ORB = 2,
|
||||||
|
EVENT_WHITEOUT = 3,
|
||||||
|
|
||||||
// Events mob
|
EVENT_FROST_BLAST = 4,
|
||||||
#define EVENT_FROST_BLAST 4
|
};
|
||||||
|
|
||||||
// Mob Frozen Orb
|
// Mob Frozen Orb
|
||||||
#define MOB_FROZEN_ORB 38456 // 1 in 10 mode and 3 in 25 mode
|
#define MOB_FROZEN_ORB 38456 // 1 in 10 mode and 3 in 25 mode
|
||||||
|
|
||||||
class boss_toravon : public CreatureScript
|
class boss_toravon : public CreatureScript
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
boss_toravon() : CreatureScript("boss_toravon") { }
|
boss_toravon() : CreatureScript("boss_toravon") { }
|
||||||
|
|
||||||
CreatureAI* GetAI(Creature* pCreature) const
|
struct boss_toravonAI : public BossAI
|
||||||
|
{
|
||||||
|
boss_toravonAI(Creature* creature) : BossAI(creature, DATA_TORAVON)
|
||||||
{
|
{
|
||||||
return new boss_toravonAI (pCreature);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct boss_toravonAI : public ScriptedAI
|
void EnterCombat(Unit* /*who*/)
|
||||||
{
|
{
|
||||||
boss_toravonAI(Creature *c) : ScriptedAI(c)
|
|
||||||
{
|
|
||||||
pInstance = c->GetInstanceScript();
|
|
||||||
}
|
|
||||||
|
|
||||||
InstanceScript *pInstance;
|
|
||||||
EventMap events;
|
|
||||||
|
|
||||||
void Reset()
|
|
||||||
{
|
|
||||||
events.Reset();
|
|
||||||
|
|
||||||
if (pInstance)
|
|
||||||
pInstance->SetData(DATA_TORAVON_EVENT, NOT_STARTED);
|
|
||||||
}
|
|
||||||
|
|
||||||
void KilledUnit(Unit* /*Victim*/) {}
|
|
||||||
|
|
||||||
void JustDied(Unit* /*Killer*/)
|
|
||||||
{
|
|
||||||
if (pInstance)
|
|
||||||
pInstance->SetData(DATA_TORAVON_EVENT, DONE);
|
|
||||||
}
|
|
||||||
|
|
||||||
void EnterCombat(Unit * /*who*/)
|
|
||||||
{
|
|
||||||
DoZoneInCombat();
|
|
||||||
|
|
||||||
DoCast(me, SPELL_FROZEN_MALLET);
|
DoCast(me, SPELL_FROZEN_MALLET);
|
||||||
|
|
||||||
events.ScheduleEvent(EVENT_FROZEN_ORB, 11000);
|
events.ScheduleEvent(EVENT_FROZEN_ORB, 11000);
|
||||||
events.ScheduleEvent(EVENT_WHITEOUT, 13000);
|
events.ScheduleEvent(EVENT_WHITEOUT, 13000);
|
||||||
events.ScheduleEvent(EVENT_FREEZING_GROUND, 15000);
|
events.ScheduleEvent(EVENT_FREEZING_GROUND, 15000);
|
||||||
|
|
||||||
if (pInstance)
|
_EnterCombat();
|
||||||
pInstance->SetData(DATA_TORAVON_EVENT, IN_PROGRESS);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void UpdateAI(const uint32 diff)
|
void UpdateAI(const uint32 diff)
|
||||||
@@ -108,27 +85,34 @@ public:
|
|||||||
|
|
||||||
while (uint32 eventId = events.ExecuteEvent())
|
while (uint32 eventId = events.ExecuteEvent())
|
||||||
{
|
{
|
||||||
switch(eventId)
|
switch (eventId)
|
||||||
{
|
{
|
||||||
case EVENT_FROZEN_ORB:
|
case EVENT_FROZEN_ORB:
|
||||||
DoCast(me, SPELL_FROZEN_ORB);
|
me->CastCustomSpell(SPELL_FROZEN_ORB, SPELLVALUE_MAX_TARGETS, 1, me);
|
||||||
events.ScheduleEvent(EVENT_FROZEN_ORB, 38000);
|
events.ScheduleEvent(EVENT_FROZEN_ORB, 38000);
|
||||||
return;
|
break;
|
||||||
case EVENT_WHITEOUT:
|
case EVENT_WHITEOUT:
|
||||||
DoCast(me, SPELL_WHITEOUT);
|
DoCast(me, SPELL_WHITEOUT);
|
||||||
events.ScheduleEvent(EVENT_WHITEOUT, 38000);
|
events.ScheduleEvent(EVENT_WHITEOUT, 38000);
|
||||||
return;
|
break;
|
||||||
case EVENT_FREEZING_GROUND:
|
case EVENT_FREEZING_GROUND:
|
||||||
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
|
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 1))
|
||||||
DoCast(pTarget, SPELL_FREEZING_GROUND);
|
DoCast(target, SPELL_FREEZING_GROUND);
|
||||||
events.ScheduleEvent(EVENT_FREEZING_GROUND, 20000);
|
events.ScheduleEvent(EVENT_FREEZING_GROUND, 20000);
|
||||||
return;
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DoMeleeAttackIfReady();
|
DoMeleeAttackIfReady();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
CreatureAI* GetAI(Creature* creature) const
|
||||||
|
{
|
||||||
|
return new boss_toravonAI(creature);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/*######
|
/*######
|
||||||
@@ -136,26 +120,19 @@ public:
|
|||||||
######*/
|
######*/
|
||||||
class mob_frost_warder : public CreatureScript
|
class mob_frost_warder : public CreatureScript
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
mob_frost_warder() : CreatureScript("mob_frost_warder") { }
|
mob_frost_warder() : CreatureScript("mob_frost_warder") { }
|
||||||
|
|
||||||
CreatureAI* GetAI(Creature* pCreature) const
|
|
||||||
{
|
|
||||||
return new mob_frost_warderAI (pCreature);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct mob_frost_warderAI : public ScriptedAI
|
struct mob_frost_warderAI : public ScriptedAI
|
||||||
{
|
{
|
||||||
mob_frost_warderAI(Creature *c) : ScriptedAI(c) {}
|
mob_frost_warderAI(Creature* c) : ScriptedAI(c) {}
|
||||||
|
|
||||||
EventMap events;
|
|
||||||
|
|
||||||
void Reset()
|
void Reset()
|
||||||
{
|
{
|
||||||
events.Reset();
|
events.Reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
void EnterCombat(Unit * /*who*/)
|
void EnterCombat(Unit* /*who*/)
|
||||||
{
|
{
|
||||||
DoZoneInCombat();
|
DoZoneInCombat();
|
||||||
|
|
||||||
@@ -171,23 +148,28 @@ public:
|
|||||||
|
|
||||||
events.Update(diff);
|
events.Update(diff);
|
||||||
|
|
||||||
while (uint32 eventId = events.ExecuteEvent())
|
if (me->HasUnitState(UNIT_STAT_CASTING))
|
||||||
{
|
|
||||||
switch(eventId)
|
|
||||||
{
|
|
||||||
case EVENT_FROST_BLAST:
|
|
||||||
DoCast(me->getVictim(), SPELL_FROST_BLAST);
|
|
||||||
events.ScheduleEvent(EVENT_FROST_BLAST, 20000);
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (events.ExecuteEvent() == EVENT_FROST_BLAST)
|
||||||
|
{
|
||||||
|
DoCastVictim(SPELL_FROST_BLAST);
|
||||||
|
events.ScheduleEvent(EVENT_FROST_BLAST, 20000);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
DoMeleeAttackIfReady();
|
DoMeleeAttackIfReady();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
EventMap events;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
CreatureAI* GetAI(Creature* creature) const
|
||||||
|
{
|
||||||
|
return new mob_frost_warderAI(creature);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/*######
|
/*######
|
||||||
## Mob Frozen Orb
|
## Mob Frozen Orb
|
||||||
######*/
|
######*/
|
||||||
@@ -196,22 +178,16 @@ class mob_frozen_orb : public CreatureScript
|
|||||||
public:
|
public:
|
||||||
mob_frozen_orb() : CreatureScript("mob_frozen_orb") { }
|
mob_frozen_orb() : CreatureScript("mob_frozen_orb") { }
|
||||||
|
|
||||||
CreatureAI* GetAI(Creature* pCreature) const
|
|
||||||
{
|
|
||||||
return new mob_frozen_orbAI (pCreature);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct mob_frozen_orbAI : public ScriptedAI
|
struct mob_frozen_orbAI : public ScriptedAI
|
||||||
{
|
{
|
||||||
mob_frozen_orbAI(Creature *c) : ScriptedAI(c) {}
|
mob_frozen_orbAI(Creature* creature) : ScriptedAI(creature)
|
||||||
|
{
|
||||||
bool done;
|
}
|
||||||
uint32 killtimer;
|
|
||||||
|
|
||||||
void Reset()
|
void Reset()
|
||||||
{
|
{
|
||||||
done = false;
|
done = false;
|
||||||
killtimer = 60000; // if after this time there is no victim -> destroy!
|
killTimer = 60000; // if after this time there is no victim -> destroy!
|
||||||
}
|
}
|
||||||
|
|
||||||
void EnterCombat(Unit * /*who*/)
|
void EnterCombat(Unit * /*who*/)
|
||||||
@@ -228,17 +204,25 @@ public:
|
|||||||
done = true;
|
done = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (killtimer <= diff)
|
if (killTimer <= diff)
|
||||||
{
|
{
|
||||||
if (!UpdateVictim())
|
if (!UpdateVictim())
|
||||||
me->ForcedDespawn();
|
me->ForcedDespawn();
|
||||||
killtimer = 10000;
|
killTimer = 10000;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
killtimer -= diff;
|
killTimer -= diff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
uint32 killTimer;
|
||||||
|
bool done;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
CreatureAI* GetAI(Creature* creature) const
|
||||||
|
{
|
||||||
|
return new mob_frozen_orbAI(creature);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/*######
|
/*######
|
||||||
@@ -246,59 +230,52 @@ public:
|
|||||||
######*/
|
######*/
|
||||||
class mob_frozen_orb_stalker : public CreatureScript
|
class mob_frozen_orb_stalker : public CreatureScript
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
mob_frozen_orb_stalker() : CreatureScript("mob_frozen_orb_stalker") { }
|
mob_frozen_orb_stalker() : CreatureScript("mob_frozen_orb_stalker") { }
|
||||||
|
|
||||||
CreatureAI* GetAI(Creature* pCreature) const
|
|
||||||
{
|
|
||||||
return new mob_frozen_orb_stalkerAI (pCreature);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct mob_frozen_orb_stalkerAI : public Scripted_NoMovementAI
|
struct mob_frozen_orb_stalkerAI : public Scripted_NoMovementAI
|
||||||
{
|
{
|
||||||
mob_frozen_orb_stalkerAI(Creature* c) : Scripted_NoMovementAI(c)
|
mob_frozen_orb_stalkerAI(Creature* creature) : Scripted_NoMovementAI(creature)
|
||||||
{
|
{
|
||||||
c->SetVisible(false);
|
c->SetVisible(false);
|
||||||
c->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_DISABLE_MOVE);
|
c->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_DISABLE_MOVE);
|
||||||
c->SetReactState(REACT_PASSIVE);
|
c->SetReactState(REACT_PASSIVE);
|
||||||
|
|
||||||
pInstance = c->GetInstanceScript();
|
instance = c->GetInstanceScript();
|
||||||
spawned = false;
|
spawned = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
InstanceScript *pInstance;
|
|
||||||
bool spawned;
|
|
||||||
|
|
||||||
void UpdateAI(const uint32 /*diff*/)
|
void UpdateAI(const uint32 /*diff*/)
|
||||||
{
|
{
|
||||||
if (spawned)
|
if (spawned)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
spawned = true;
|
spawned = true;
|
||||||
if (!pInstance)
|
Unit* toravon = me->GetCreature(*me, instance ? instance->GetData64(DATA_TORAVON) : 0);
|
||||||
return;
|
if (!toravon)
|
||||||
|
|
||||||
Unit* pToravon = me->GetCreature(*me, pInstance->GetData64(DATA_TORAVON));
|
|
||||||
if (!pToravon)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
uint8 num_orbs = RAID_MODE(1, 3);
|
uint8 num_orbs = RAID_MODE(1, 3);
|
||||||
for (uint8 i=0; i<num_orbs; ++i)
|
for (uint8 i = 0; i < num_orbs; ++i)
|
||||||
{
|
{
|
||||||
Position pos;
|
Position pos;
|
||||||
me->GetNearPoint(pToravon, pos.m_positionX, pos.m_positionY, pos.m_positionZ, 0.0f, 10.0f, 0.0f);
|
me->GetNearPoint(toravon, pos.m_positionX, pos.m_positionY, pos.m_positionZ, 0.0f, 10.0f, 0.0f);
|
||||||
me->SetPosition(pos, true);
|
me->SetPosition(pos, true);
|
||||||
DoCast(me, SPELL_FROZEN_ORB_SUMMON);
|
DoCast(me, SPELL_FROZEN_ORB_SUMMON);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
InstanceScript* instance;
|
||||||
|
bool spawned;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
CreatureAI* GetAI(Creature* creature) const
|
||||||
|
{
|
||||||
|
return new mob_frozen_orb_stalkerAI(creature);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AddSC_boss_toravon()
|
void AddSC_boss_toravon()
|
||||||
{
|
{
|
||||||
new boss_toravon();
|
new boss_toravon();
|
||||||
|
|||||||
@@ -18,8 +18,6 @@
|
|||||||
#include "ScriptPCH.h"
|
#include "ScriptPCH.h"
|
||||||
#include "vault_of_archavon.h"
|
#include "vault_of_archavon.h"
|
||||||
|
|
||||||
#define ENCOUNTERS 4
|
|
||||||
|
|
||||||
/* Vault of Archavon encounters:
|
/* Vault of Archavon encounters:
|
||||||
1 - Archavon the Stone Watcher event
|
1 - Archavon the Stone Watcher event
|
||||||
2 - Emalon the Storm Watcher event
|
2 - Emalon the Storm Watcher event
|
||||||
@@ -29,135 +27,63 @@
|
|||||||
|
|
||||||
class instance_archavon : public InstanceMapScript
|
class instance_archavon : public InstanceMapScript
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
instance_archavon() : InstanceMapScript("instance_archavon", 624) { }
|
instance_archavon() : InstanceMapScript("instance_archavon", 624) { }
|
||||||
|
|
||||||
InstanceScript* GetInstanceScript(InstanceMap* pMap) const
|
|
||||||
{
|
|
||||||
return new instance_archavon_InstanceMapScript(pMap);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct instance_archavon_InstanceMapScript : public InstanceScript
|
struct instance_archavon_InstanceMapScript : public InstanceScript
|
||||||
{
|
{
|
||||||
instance_archavon_InstanceMapScript(Map *Map) : InstanceScript(Map) {};
|
instance_archavon_InstanceMapScript(Map* map) : InstanceScript(map)
|
||||||
|
{
|
||||||
uint32 uiEncounters[ENCOUNTERS];
|
SetBossNumber(MAX_ENCOUNTER);
|
||||||
|
}
|
||||||
uint64 uiArchavon;
|
|
||||||
uint64 uiEmalon;
|
|
||||||
uint64 uiKoralon;
|
|
||||||
uint64 uiToravon;
|
|
||||||
|
|
||||||
void Initialize()
|
void Initialize()
|
||||||
{
|
{
|
||||||
uiArchavon = 0;
|
EmalonGUID = 0;
|
||||||
uiEmalon = 0;
|
ToravonGUID = 0;
|
||||||
uiKoralon = 0;
|
|
||||||
uiToravon = 0;
|
|
||||||
|
|
||||||
for (uint8 i = 0; i < ENCOUNTERS; i++)
|
|
||||||
uiEncounters[i] = NOT_STARTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsEncounterInProgress() const
|
|
||||||
{
|
|
||||||
for (uint8 i = 0; i < ENCOUNTERS; i++)
|
|
||||||
if (uiEncounters[i] == IN_PROGRESS)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnCreatureCreate(Creature* creature)
|
void OnCreatureCreate(Creature* creature)
|
||||||
{
|
{
|
||||||
switch(creature->GetEntry())
|
switch (creature->GetEntry())
|
||||||
{
|
{
|
||||||
case CREATURE_ARCHAVON: uiArchavon = creature->GetGUID(); break;
|
case CREATURE_EMALON:
|
||||||
case CREATURE_EMALON: uiEmalon = creature->GetGUID(); break;
|
EmalonGUID = creature->GetGUID();
|
||||||
case CREATURE_KORALON: uiKoralon = creature->GetGUID(); break;
|
break;
|
||||||
case CREATURE_TORAVON: uiToravon = creature->GetGUID(); break;
|
case CREATURE_TORAVON:
|
||||||
|
ToravonGUID = creature->GetGUID();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 GetData(uint32 type)
|
|
||||||
{
|
|
||||||
switch(type)
|
|
||||||
{
|
|
||||||
case DATA_ARCHAVON_EVENT: return uiEncounters[0];
|
|
||||||
case DATA_EMALON_EVENT: return uiEncounters[1];
|
|
||||||
case DATA_KORALON_EVENT: return uiEncounters[2];
|
|
||||||
case DATA_TORAVON_EVENT: return uiEncounters[3];
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64 GetData64(uint32 identifier)
|
uint64 GetData64(uint32 identifier)
|
||||||
{
|
{
|
||||||
switch(identifier)
|
switch (identifier)
|
||||||
{
|
{
|
||||||
case DATA_ARCHAVON: return uiArchavon;
|
case DATA_EMALON:
|
||||||
case DATA_EMALON: return uiEmalon;
|
return EmalonGUID;
|
||||||
case DATA_KORALON: return uiKoralon;
|
case DATA_TORAVON:
|
||||||
case DATA_TORAVON: return uiToravon;
|
return ToravonGUID;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetData(uint32 type, uint32 data)
|
private:
|
||||||
{
|
uint64 EmalonGUID;
|
||||||
switch(type)
|
uint64 ToravonGUID;
|
||||||
{
|
|
||||||
case DATA_ARCHAVON_EVENT: uiEncounters[0] = data; break;
|
|
||||||
case DATA_EMALON_EVENT: uiEncounters[1] = data; break;
|
|
||||||
case DATA_KORALON_EVENT: uiEncounters[2] = data; break;
|
|
||||||
case DATA_TORAVON_EVENT: uiEncounters[3] = data; break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data == DONE)
|
|
||||||
SaveToDB();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string GetSaveData()
|
|
||||||
{
|
|
||||||
OUT_SAVE_INST_DATA;
|
|
||||||
std::ostringstream stream;
|
|
||||||
stream << uiEncounters[0] << " " << uiEncounters[1] << " " << uiEncounters[2] << " " << uiEncounters[3];
|
|
||||||
|
|
||||||
char* out = new char[stream.str().length() + 1];
|
|
||||||
strcpy(out, stream.str().c_str());
|
|
||||||
if (out)
|
|
||||||
{
|
|
||||||
OUT_SAVE_INST_DATA_COMPLETE;
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Load(const char* in)
|
|
||||||
{
|
|
||||||
if (!in)
|
|
||||||
{
|
|
||||||
OUT_LOAD_INST_DATA_FAIL;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
OUT_LOAD_INST_DATA(in);
|
|
||||||
|
|
||||||
std::istringstream stream(in);
|
|
||||||
stream >> uiEncounters[0] >> uiEncounters[1] >> uiEncounters[2] >> uiEncounters[3];
|
|
||||||
|
|
||||||
for (uint8 i = 0; i < ENCOUNTERS; ++i)
|
|
||||||
if (uiEncounters[i] == IN_PROGRESS)
|
|
||||||
uiEncounters[i] = NOT_STARTED;
|
|
||||||
|
|
||||||
OUT_LOAD_INST_DATA_COMPLETE;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||||
|
{
|
||||||
|
return new instance_archavon_InstanceMapScript(map);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
void AddSC_instance_archavon()
|
void AddSC_instance_archavon()
|
||||||
{
|
{
|
||||||
new instance_archavon();
|
new instance_archavon();
|
||||||
|
|||||||
@@ -28,18 +28,12 @@ enum Creatures
|
|||||||
|
|
||||||
enum Data
|
enum Data
|
||||||
{
|
{
|
||||||
DATA_ARCHAVON_EVENT,
|
DATA_ARCHAVON = 0,
|
||||||
DATA_EMALON_EVENT,
|
DATA_EMALON = 1,
|
||||||
DATA_KORALON_EVENT,
|
DATA_KORALON = 2,
|
||||||
DATA_TORAVON_EVENT,
|
DATA_TORAVON = 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum Data64
|
#define MAX_ENCOUNTER 4
|
||||||
{
|
|
||||||
DATA_ARCHAVON,
|
|
||||||
DATA_EMALON,
|
|
||||||
DATA_KORALON,
|
|
||||||
DATA_TORAVON,
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user