convert Magtheridons Lair and Shattered Halls to new format

--HG--
branch : trunk
This commit is contained in:
Supabad
2010-08-08 00:49:40 +02:00
parent d3712984c1
commit c260b3f778
6 changed files with 1721 additions and 1549 deletions
@@ -41,58 +41,75 @@ static Yell RandomTaunt[]=
{-1544005}, {-1544005},
}; };
#define SAY_FREED -1544006 enum eSays
#define SAY_AGGRO -1544007 {
#define SAY_BANISH -1544008 SAY_FREED = -1544006,
#define SAY_CHAMBER_DESTROY -1544009 SAY_AGGRO = -1544007,
#define SAY_PLAYER_KILLED -1544010 SAY_BANISH = -1544008,
#define SAY_DEATH -1544011 SAY_CHAMBER_DESTROY = -1544009,
SAY_PLAYER_KILLED = -1544010,
SAY_DEATH = -1544011,
};
#define EMOTE_BERSERK -1544012 enum eEmotes
#define EMOTE_BLASTNOVA -1544013 {
#define EMOTE_BEGIN -1544014 EMOTE_BERSERK = -1544012,
EMOTE_BLASTNOVA = -1544013,
EMOTE_BEGIN = -1544014,
};
#define MOB_MAGTHERIDON 17257 enum eCreatures
#define MOB_ROOM 17516 {
#define MOB_CHANNELLER 17256 MOB_MAGTHERIDON = 17257,
#define MOB_ABYSSAL 17454 MOB_ROOM = 17516,
MOB_CHANNELLER = 17256,
MOB_ABYSSAL = 17454,
};
#define SPELL_BLASTNOVA 30616 enum eSpells
#define SPELL_CLEAVE 30619 {
#define SPELL_QUAKE_TRIGGER 30657 // must be cast with 30561 as the proc spell SPELL_BLASTNOVA = 30616,
#define SPELL_QUAKE_KNOCKBACK 30571 SPELL_CLEAVE = 30619,
#define SPELL_BLAZE_TARGET 30541 // core bug, does not support target 7 SPELL_QUAKE_TRIGGER = 30657, //must be cast with 30561 as the proc spell
#define SPELL_BLAZE_TRAP 30542 SPELL_QUAKE_KNOCKBACK = 30571,
#define SPELL_DEBRIS_KNOCKDOWN 36449 SPELL_BLAZE_TARGET = 30541, //core bug, does not support target 7
#define SPELL_DEBRIS_VISUAL 30632 SPELL_BLAZE_TRAP = 30542,
#define SPELL_DEBRIS_DAMAGE 30631 // core bug, does not support target 8 SPELL_DEBRIS_KNOCKDOWN = 36449,
#define SPELL_CAMERA_SHAKE 36455 SPELL_DEBRIS_VISUAL = 30632,
#define SPELL_BERSERK 27680 SPELL_DEBRIS_DAMAGE = 30631, //core bug, does not support target 8
SPELL_CAMERA_SHAKE = 36455,
#define SPELL_SHADOW_CAGE 30168 SPELL_BERSERK = 27680,
#define SPELL_SHADOW_GRASP 30410 SPELL_SHADOW_CAGE = 30168,
#define SPELL_SHADOW_GRASP_VISUAL 30166 SPELL_SHADOW_GRASP = 30410,
#define SPELL_MIND_EXHAUSTION 44032 //Casted by the cubes when channeling ends SPELL_SHADOW_GRASP_VISUAL = 30166,
SPELL_MIND_EXHAUSTION = 44032, //Casted by the cubes when channeling ends
#define SPELL_SHADOW_CAGE_C 30205 SPELL_SHADOW_CAGE_C = 30205,
#define SPELL_SHADOW_GRASP_C 30207 SPELL_SHADOW_GRASP_C = 30207,
SPELL_SHADOW_BOLT_VOLLEY = 30510,
#define SPELL_SHADOW_BOLT_VOLLEY 30510 SPELL_DARK_MENDING = 30528,
#define SPELL_DARK_MENDING 30528 SPELL_FEAR = 30530, //39176
#define SPELL_FEAR 30530 //39176 SPELL_BURNING_ABYSSAL = 30511,
#define SPELL_BURNING_ABYSSAL 30511 SPELL_SOUL_TRANSFER = 30531, //core bug, does not support target 7
#define SPELL_SOUL_TRANSFER 30531 // core bug, does not support target 7 SPELL_FIRE_BLAST = 37110,
};
#define SPELL_FIRE_BLAST 37110
//count of clickers needed to interrupt blast nova //count of clickers needed to interrupt blast nova
#define CLICKERS_COUNT 5 #define CLICKERS_COUNT 5
typedef std::map<uint64, uint64> CubeMap; typedef std::map<uint64, uint64> CubeMap;
class mob_abyssal : public CreatureScript
{
public:
mob_abyssal()
: CreatureScript("mob_abyssal")
{
}
struct mob_abyssalAI : public ScriptedAI struct mob_abyssalAI : public ScriptedAI
{ {
mob_abyssalAI(Creature *c) : ScriptedAI(c) mob_abyssalAI(Creature* pCreature) : ScriptedAI(pCreature)
{ {
trigger = 0; trigger = 0;
Despawn_Timer = 60000; Despawn_Timer = 60000;
@@ -130,9 +147,20 @@ struct mob_abyssalAI : public ScriptedAI
} }
} }
void EnterCombat(Unit* /*who*/) {DoZoneInCombat();} void EnterCombat(Unit* /*who*/)
void AttackStart(Unit *who) {if (!trigger) ScriptedAI::AttackStart(who);} {
void MoveInLineOfSight(Unit *who) {if (!trigger) ScriptedAI::MoveInLineOfSight(who);} DoZoneInCombat();
}
void AttackStart(Unit *who)
{
if (!trigger)
ScriptedAI::AttackStart(who);
}
void MoveInLineOfSight(Unit *who)
{
if (!trigger)
ScriptedAI::MoveInLineOfSight(who);
}
void UpdateAI(const uint32 diff) void UpdateAI(const uint32 diff)
{ {
@@ -144,7 +172,8 @@ struct mob_abyssalAI : public ScriptedAI
{ {
DoCast(me, SPELL_DEBRIS_DAMAGE, true); DoCast(me, SPELL_DEBRIS_DAMAGE, true);
trigger = 3; trigger = 3;
} else FireBlast_Timer -= diff; }
else FireBlast_Timer -= diff;
} }
return; return;
} }
@@ -152,7 +181,8 @@ struct mob_abyssalAI : public ScriptedAI
if (Despawn_Timer <= diff) if (Despawn_Timer <= diff)
{ {
me->ForcedDespawn(); me->ForcedDespawn();
} else Despawn_Timer -= diff; }
else Despawn_Timer -= diff;
if (!UpdateVictim()) if (!UpdateVictim())
return; return;
@@ -161,17 +191,33 @@ struct mob_abyssalAI : public ScriptedAI
{ {
DoCast(me->getVictim(), SPELL_FIRE_BLAST); DoCast(me->getVictim(), SPELL_FIRE_BLAST);
FireBlast_Timer = 5000+rand()%10000; FireBlast_Timer = 5000+rand()%10000;
} else FireBlast_Timer -= diff; }
else FireBlast_Timer -= diff;
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
}; };
CreatureAI* GetAI(Creature* Creature) const
{
return new mob_abyssalAI(Creature);
}
};
class boss_magtheridon : public CreatureScript
{
public:
boss_magtheridon()
: CreatureScript("boss_magtheridon")
{
}
struct boss_magtheridonAI : public ScriptedAI struct boss_magtheridonAI : public ScriptedAI
{ {
boss_magtheridonAI(Creature *c) : ScriptedAI(c) boss_magtheridonAI(Creature* pCreature) : ScriptedAI(pCreature)
{ {
pInstance = c->GetInstanceData(); pInstance = pCreature->GetInstanceData();
me->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 10); me->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 10);
me->SetFloatValue(UNIT_FIELD_COMBATREACH, 10); me->SetFloatValue(UNIT_FIELD_COMBATREACH, 10);
@@ -266,7 +312,9 @@ struct boss_magtheridonAI : public ScriptedAI
{ {
DebuffClicker(clicker); DebuffClicker(clicker);
(*i).second = 0; (*i).second = 0;
} else ++ClickerNum; }
else
++ClickerNum;
} }
// if 5 clickers from other cubes apply shadow cage // if 5 clickers from other cubes apply shadow cage
@@ -275,10 +323,12 @@ struct boss_magtheridonAI : public ScriptedAI
DoScriptText(SAY_BANISH, me); DoScriptText(SAY_BANISH, me);
DoCast(me, SPELL_SHADOW_CAGE, true); DoCast(me, SPELL_SHADOW_CAGE, true);
} }
else if (ClickerNum < CLICKERS_COUNT && me->HasAura(SPELL_SHADOW_CAGE)) else
if (ClickerNum < CLICKERS_COUNT && me->HasAura(SPELL_SHADOW_CAGE))
me->RemoveAurasDueToSpell(SPELL_SHADOW_CAGE); me->RemoveAurasDueToSpell(SPELL_SHADOW_CAGE);
if (!ClickerNum) NeedCheckCube = false; if (!ClickerNum)
NeedCheckCube = false;
} }
void KilledUnit(Unit* /*victim*/) void KilledUnit(Unit* /*victim*/)
@@ -322,7 +372,9 @@ struct boss_magtheridonAI : public ScriptedAI
{ {
DoScriptText(RandomTaunt[rand()%6].id, me); DoScriptText(RandomTaunt[rand()%6].id, me);
RandChat_Timer = 90000; RandChat_Timer = 90000;
} else RandChat_Timer -= diff; }
else
RandChat_Timer -= diff;
} }
if (!UpdateVictim()) if (!UpdateVictim())
@@ -335,13 +387,17 @@ struct boss_magtheridonAI : public ScriptedAI
DoCast(me, SPELL_BERSERK, true); DoCast(me, SPELL_BERSERK, true);
DoScriptText(EMOTE_BERSERK, me); DoScriptText(EMOTE_BERSERK, me);
Berserk_Timer = 60000; Berserk_Timer = 60000;
} else Berserk_Timer -= diff; }
else
Berserk_Timer -= diff;
if (Cleave_Timer <= diff) if (Cleave_Timer <= diff)
{ {
DoCast(me->getVictim(), SPELL_CLEAVE); DoCast(me->getVictim(), SPELL_CLEAVE);
Cleave_Timer = 10000; Cleave_Timer = 10000;
} else Cleave_Timer -= diff; }
else
Cleave_Timer -= diff;
if (BlastNova_Timer <= diff) if (BlastNova_Timer <= diff)
{ {
@@ -352,7 +408,9 @@ struct boss_magtheridonAI : public ScriptedAI
DoCast(me, SPELL_BLASTNOVA); DoCast(me, SPELL_BLASTNOVA);
BlastNova_Timer = 60000; BlastNova_Timer = 60000;
} }
} else BlastNova_Timer -= diff; }
else
BlastNova_Timer -= diff;
if (Quake_Timer <= diff) if (Quake_Timer <= diff)
{ {
@@ -362,7 +420,9 @@ struct boss_magtheridonAI : public ScriptedAI
DoCast(me, SPELL_QUAKE_TRIGGER, true); DoCast(me, SPELL_QUAKE_TRIGGER, true);
Quake_Timer = 50000; Quake_Timer = 50000;
} }
} else Quake_Timer -= diff; }
else
Quake_Timer -= diff;
if (Blaze_Timer <= diff) if (Blaze_Timer <= diff)
{ {
@@ -373,13 +433,15 @@ struct boss_magtheridonAI : public ScriptedAI
Creature *summon = me->SummonCreature(MOB_ABYSSAL, x, y, z, 0, TEMPSUMMON_CORPSE_DESPAWN, 0); Creature *summon = me->SummonCreature(MOB_ABYSSAL, x, y, z, 0, TEMPSUMMON_CORPSE_DESPAWN, 0);
if (summon) if (summon)
{ {
CAST_AI(mob_abyssalAI, summon->AI())->SetTrigger(2); CAST_AI(mob_abyssal::mob_abyssalAI, summon->AI())->SetTrigger(2);
DoCast(summon, SPELL_BLAZE_TARGET, true); DoCast(summon, SPELL_BLAZE_TARGET, true);
summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
} }
} }
Blaze_Timer = 20000 + rand()%20000; Blaze_Timer = 20000 + rand()%20000;
} else Blaze_Timer -= diff; }
else
Blaze_Timer -= diff;
if (!Phase3 && me->GetHealth()*10 < me->GetMaxHealth()*3 if (!Phase3 && me->GetHealth()*10 < me->GetMaxHealth()*3
&& !me->IsNonMeleeSpellCasted(false) // blast nova && !me->IsNonMeleeSpellCasted(false) // blast nova
@@ -403,21 +465,39 @@ struct boss_magtheridonAI : public ScriptedAI
float x, y, z; float x, y, z;
pTarget->GetPosition(x, y, z); pTarget->GetPosition(x, y, z);
Creature *summon = me->SummonCreature(MOB_ABYSSAL, x, y, z, 0, TEMPSUMMON_CORPSE_DESPAWN, 0); Creature *summon = me->SummonCreature(MOB_ABYSSAL, x, y, z, 0, TEMPSUMMON_CORPSE_DESPAWN, 0);
if (summon) CAST_AI(mob_abyssalAI, summon->AI())->SetTrigger(1); if (summon)
CAST_AI(mob_abyssal::mob_abyssalAI, summon->AI())->SetTrigger(1);
} }
Debris_Timer = 10000; Debris_Timer = 10000;
} else Debris_Timer -= diff; }
else
Debris_Timer -= diff;
} }
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
}; };
CreatureAI* GetAI(Creature* Creature) const
{
return new boss_magtheridonAI(Creature);
}
};
class mob_hellfire_channeler : public CreatureScript
{
public:
mob_hellfire_channeler()
: CreatureScript("mob_hellfire_channeler")
{
}
struct mob_hellfire_channelerAI : public ScriptedAI struct mob_hellfire_channelerAI : public ScriptedAI
{ {
mob_hellfire_channelerAI(Creature *c) : ScriptedAI(c) mob_hellfire_channelerAI(Creature* pCreature) : ScriptedAI(pCreature)
{ {
pInstance =me->GetInstanceData(); pInstance = pCreature->GetInstanceData();
} }
ScriptedInstance* pInstance; ScriptedInstance* pInstance;
@@ -482,42 +562,67 @@ struct mob_hellfire_channelerAI : public ScriptedAI
{ {
DoCast(me, SPELL_SHADOW_BOLT_VOLLEY); DoCast(me, SPELL_SHADOW_BOLT_VOLLEY);
ShadowBoltVolley_Timer = 10000 + rand()%10000; ShadowBoltVolley_Timer = 10000 + rand()%10000;
} else ShadowBoltVolley_Timer -= diff; }
else
ShadowBoltVolley_Timer -= diff;
if (DarkMending_Timer <= diff) if (DarkMending_Timer <= diff)
{ {
if ((me->GetHealth()*100 / me->GetMaxHealth()) < 50) if ((me->GetHealth()*100 / me->GetMaxHealth()) < 50)
DoCast(me, SPELL_DARK_MENDING); DoCast(me, SPELL_DARK_MENDING);
DarkMending_Timer = 10000 +(rand() % 10000); DarkMending_Timer = 10000 +(rand() % 10000);
} else DarkMending_Timer -= diff; }
else
DarkMending_Timer -= diff;
if (Fear_Timer <= diff) if (Fear_Timer <= diff)
{ {
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 1)) if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 1))
DoCast(pTarget, SPELL_FEAR); DoCast(pTarget, SPELL_FEAR);
Fear_Timer = 25000 + rand()%15000; Fear_Timer = 25000 + rand()%15000;
} else Fear_Timer -= diff; }
else
Fear_Timer -= diff;
if (Infernal_Timer <= diff) if (Infernal_Timer <= diff)
{ {
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(pTarget, SPELL_BURNING_ABYSSAL, true); DoCast(pTarget, SPELL_BURNING_ABYSSAL, true);
Infernal_Timer = 30000 + rand()%10000; Infernal_Timer = 30000 + rand()%10000;
} else Infernal_Timer -= diff; }
else
Infernal_Timer -= diff;
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
}; };
//Manticron Cube CreatureAI* GetAI(Creature* Creature) const
bool GOHello_go_Manticron_Cube(Player* pPlayer, GameObject* pGo)
{ {
ScriptedInstance* pInstance = pGo->GetInstanceData(); return new mob_hellfire_channelerAI(Creature);
}
};
//Manticron Cube
class go_manticron_cube : public GameObjectScript
{
public:
go_manticron_cube() : GameObjectScript("go_manticron_cube")
{
}
bool OnGossipHello(Player *pPlayer, GameObject * pGO)
{
ScriptedInstance* pInstance = pGO->GetInstanceData();
if (!pInstance) if (!pInstance)
return true; return true;
if (pInstance->GetData(DATA_MAGTHERIDON_EVENT) != IN_PROGRESS) return true;
Creature *Magtheridon =Unit::GetCreature(*pGo, pInstance->GetData64(DATA_MAGTHERIDON)); if (pInstance->GetData(DATA_MAGTHERIDON_EVENT) != IN_PROGRESS)
if (!Magtheridon || !Magtheridon->isAlive()) return true; return true;
Creature *Magtheridon =Unit::GetCreature(*pGO, pInstance->GetData64(DATA_MAGTHERIDON));
if (!Magtheridon || !Magtheridon->isAlive())
return true;
// if exhausted or already channeling return // if exhausted or already channeling return
if (pPlayer->HasAura(SPELL_MIND_EXHAUSTION) || pPlayer->HasAura(SPELL_SHADOW_GRASP)) if (pPlayer->HasAura(SPELL_MIND_EXHAUSTION) || pPlayer->HasAura(SPELL_SHADOW_GRASP))
@@ -526,47 +631,16 @@ bool GOHello_go_Manticron_Cube(Player* pPlayer, GameObject* pGo)
pPlayer->InterruptNonMeleeSpells(false); pPlayer->InterruptNonMeleeSpells(false);
pPlayer->CastSpell(pPlayer, SPELL_SHADOW_GRASP, true); pPlayer->CastSpell(pPlayer, SPELL_SHADOW_GRASP, true);
pPlayer->CastSpell(pPlayer, SPELL_SHADOW_GRASP_VISUAL, false); pPlayer->CastSpell(pPlayer, SPELL_SHADOW_GRASP_VISUAL, false);
CAST_AI(boss_magtheridonAI, Magtheridon->AI())->SetClicker(pGo->GetGUID(), pPlayer->GetGUID()); CAST_AI(boss_magtheridon::boss_magtheridonAI, Magtheridon->AI())->SetClicker(pGO->GetGUID(), pPlayer->GetGUID());
return true; return true;
} }
};
CreatureAI* GetAI_boss_magtheridon(Creature* pCreature)
{
return new boss_magtheridonAI(pCreature);
}
CreatureAI* GetAI_mob_hellfire_channeler(Creature* pCreature)
{
return new mob_hellfire_channelerAI(pCreature);
}
CreatureAI* GetAI_mob_abyssalAI(Creature* pCreature)
{
return new mob_abyssalAI(pCreature);
}
void AddSC_boss_magtheridon() void AddSC_boss_magtheridon()
{ {
Script *newscript; new boss_magtheridon();
newscript = new Script; new mob_hellfire_channeler();
newscript->Name = "boss_magtheridon"; new mob_abyssal();
newscript->GetAI = &GetAI_boss_magtheridon; new go_manticron_cube();
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "mob_hellfire_channeler";
newscript->GetAI = &GetAI_mob_hellfire_channeler;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "go_manticron_cube";
newscript->pGOHello = &GOHello_go_Manticron_Cube;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "mob_abyssal";
newscript->GetAI = &GetAI_mob_abyssalAI;
newscript->RegisterSelf();
} }
@@ -26,8 +26,11 @@ EndScriptData */
#include "ScriptPCH.h" #include "ScriptPCH.h"
#include "magtheridons_lair.h" #include "magtheridons_lair.h"
#define SPELL_SOUL_TRANSFER 30531 // core bug, does not support target 7 enum eSpells
#define SPELL_BLAZE_TARGET 30541 // core bug, does not support target 7 {
SPELL_SOUL_TRANSFER = 30531, // core bug, does not support target 7
SPELL_BLAZE_TARGET = 30541, // core bug, does not support target 7
};
#define CHAMBER_CENTER_X -15.14 #define CHAMBER_CENTER_X -15.14
#define CHAMBER_CENTER_Y 1.8 #define CHAMBER_CENTER_Y 1.8
@@ -37,9 +40,17 @@ EndScriptData */
#define EMOTE_BONDS_WEAKEN "'s bonds begin to weaken!" #define EMOTE_BONDS_WEAKEN "'s bonds begin to weaken!"
struct instance_magtheridons_lair : public ScriptedInstance class instance_magtheridons_lair : public InstanceMapScript
{ {
instance_magtheridons_lair(Map* pMap) : ScriptedInstance(pMap) public:
instance_magtheridons_lair()
: InstanceMapScript("instance_magtheridons_lair")
{
}
struct instance_magtheridons_lair_InstanceMapScript : public ScriptedInstance
{
instance_magtheridons_lair_InstanceMapScript(Map* pMap) : ScriptedInstance(pMap)
{ {
Initialize(); Initialize();
} }
@@ -240,17 +251,15 @@ struct instance_magtheridons_lair : public ScriptedInstance
} }
}; };
InstanceData* GetInstanceData_instance_magtheridons_lair(Map* pMap) InstanceData* GetInstanceData(Map* pMap) const
{ {
return new instance_magtheridons_lair(pMap); return new instance_magtheridons_lair_InstanceMapScript(pMap);
} }
};
void AddSC_instance_magtheridons_lair() void AddSC_instance_magtheridons_lair()
{ {
Script *newscript; new instance_magtheridons_lair();
newscript = new Script;
newscript->Name = "instance_magtheridons_lair";
newscript->GetInstanceData = &GetInstanceData_instance_magtheridons_lair;
newscript->RegisterSelf();
} }
@@ -52,34 +52,46 @@ static Say PeonDies[]=
{-1540008}, {-1540008},
}; };
#define SAY_INTRO -1540000 enum eSays
#define SAY_TAUNT_1 -1540009 {
#define SAY_TAUNT_2 -1540010 SAY_INTRO = -1540000,
#define SAY_TAUNT_3 -1540011 SAY_TAUNT_1 = -1540009,
#define SAY_AGGRO_1 -1540012 SAY_TAUNT_2 = -1540010,
#define SAY_AGGRO_2 -1540013 SAY_TAUNT_3 = -1540011,
#define SAY_AGGRO_3 -1540014 SAY_AGGRO_1 = -1540012,
#define SAY_SLAY_1 -1540015 SAY_AGGRO_2 = -1540013,
#define SAY_SLAY_2 -1540016 SAY_AGGRO_3 = -1540014,
#define SAY_DIE -1540017 SAY_SLAY_1 = -1540015,
SAY_SLAY_2 = -1540016,
SAY_DIE = -1540017,
};
#define SPELL_DEATH_COIL 30500 enum eSpells
#define SPELL_DARK_SPIN 30502 // core bug spell attack caster :D {
#define SPELL_SHADOW_FISSURE 30496 // Summon the ShadowFissure NPC SPELL_DEATH_COIL = 30500,
SPELL_DARK_SPIN = 30502, // core bug spell attack caster :D
SPELL_SHADOW_FISSURE = 30496, // Summon the ShadowFissure NPC
SPELL_SHADOW_CLEAVE = 30495,
H_SPELL_SHADOW_SLAM = 35953,
SPELL_HEMORRHAGE = 30478,
SPELL_CONSUMPTION = 30497,
SPELL_TEMPORARY_VISUAL = 39312, // this is wrong, a temporary solution. spell consumption already has the purple visual, but doesn't display as it should
};
#define SPELL_SHADOW_CLEAVE 30495 class boss_grand_warlock_nethekurse : public CreatureScript
#define H_SPELL_SHADOW_SLAM 35953 {
public:
#define SPELL_HEMORRHAGE 30478 boss_grand_warlock_nethekurse()
: CreatureScript("boss_grand_warlock_nethekurse")
#define SPELL_CONSUMPTION 30497 {
#define SPELL_TEMPORARY_VISUAL 39312 // this is wrong, a temporary solution. spell consumption already has the purple visual, but doesn't display as it should }
struct boss_grand_warlock_nethekurseAI : public ScriptedAI struct boss_grand_warlock_nethekurseAI : public ScriptedAI
{ {
boss_grand_warlock_nethekurseAI(Creature *c) : ScriptedAI(c) boss_grand_warlock_nethekurseAI(Creature* pCreature) : ScriptedAI(pCreature)
{ {
pInstance = c->GetInstanceData(); pInstance = pCreature->GetInstanceData();
} }
ScriptedInstance* pInstance; ScriptedInstance* pInstance;
@@ -257,7 +269,9 @@ struct boss_grand_warlock_nethekurseAI : public ScriptedAI
{ {
DoCast(me->getVictim(), SPELL_SHADOW_CLEAVE); DoCast(me->getVictim(), SPELL_SHADOW_CLEAVE);
Cleave_Timer = 6000+rand()%2500; Cleave_Timer = 6000+rand()%2500;
} else Cleave_Timer -= diff; }
else
Cleave_Timer -= diff;
} }
else else
{ {
@@ -266,14 +280,18 @@ struct boss_grand_warlock_nethekurseAI : public ScriptedAI
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,0)) if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(pTarget, SPELL_SHADOW_FISSURE); DoCast(pTarget, SPELL_SHADOW_FISSURE);
ShadowFissure_Timer = urand(7500,15000); ShadowFissure_Timer = urand(7500,15000);
} else ShadowFissure_Timer -= diff; }
else
ShadowFissure_Timer -= diff;
if (DeathCoil_Timer <= diff) if (DeathCoil_Timer <= diff)
{ {
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,0)) if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(pTarget, SPELL_DEATH_COIL); DoCast(pTarget, SPELL_DEATH_COIL);
DeathCoil_Timer = urand(15000,20000); DeathCoil_Timer = urand(15000,20000);
} else DeathCoil_Timer -= diff; }
else
DeathCoil_Timer -= diff;
if ((me->GetHealth()*100) / me->GetMaxHealth() <= 20) if ((me->GetHealth()*100) / me->GetMaxHealth() <= 20)
Phase = true; Phase = true;
@@ -283,11 +301,27 @@ struct boss_grand_warlock_nethekurseAI : public ScriptedAI
} }
}; };
CreatureAI* GetAI(Creature* Creature) const
{
return new boss_grand_warlock_nethekurseAI (Creature);
}
};
class mob_fel_orc_convert : public CreatureScript
{
public:
mob_fel_orc_convert()
: CreatureScript("mob_fel_orc_convert")
{
}
struct mob_fel_orc_convertAI : public ScriptedAI struct mob_fel_orc_convertAI : public ScriptedAI
{ {
mob_fel_orc_convertAI(Creature *c) : ScriptedAI(c) mob_fel_orc_convertAI(Creature* pCreature) : ScriptedAI(pCreature)
{ {
pInstance = c->GetInstanceData(); pInstance = pCreature->GetInstanceData();
} }
ScriptedInstance* pInstance; ScriptedInstance* pInstance;
@@ -312,7 +346,7 @@ struct mob_fel_orc_convertAI : public ScriptedAI
Creature *pKurse = Unit::GetCreature(*me,pInstance->GetData64(DATA_NETHEKURSE)); Creature *pKurse = Unit::GetCreature(*me,pInstance->GetData64(DATA_NETHEKURSE));
if (pKurse && me->IsWithinDist(pKurse, 45.0f)) if (pKurse && me->IsWithinDist(pKurse, 45.0f))
{ {
CAST_AI(boss_grand_warlock_nethekurseAI, pKurse->AI())->DoYellForPeonAggro(); CAST_AI(boss_grand_warlock_nethekurse::boss_grand_warlock_nethekurseAI, pKurse->AI())->DoYellForPeonAggro();
if (pInstance->GetData(TYPE_NETHEKURSE) == IN_PROGRESS) if (pInstance->GetData(TYPE_NETHEKURSE) == IN_PROGRESS)
return; return;
@@ -331,7 +365,7 @@ struct mob_fel_orc_convertAI : public ScriptedAI
return; return;
if (pInstance->GetData64(DATA_NETHEKURSE)) if (pInstance->GetData64(DATA_NETHEKURSE))
if (Creature *pKurse = Unit::GetCreature(*me,pInstance->GetData64(DATA_NETHEKURSE))) if (Creature *pKurse = Unit::GetCreature(*me,pInstance->GetData64(DATA_NETHEKURSE)))
CAST_AI(boss_grand_warlock_nethekurseAI, pKurse->AI())->DoYellForPeonDeath(); CAST_AI(boss_grand_warlock_nethekurse::boss_grand_warlock_nethekurseAI, pKurse->AI())->DoYellForPeonDeath();
} }
} }
@@ -350,10 +384,25 @@ struct mob_fel_orc_convertAI : public ScriptedAI
} }
}; };
CreatureAI* GetAI(Creature* Creature) const
{
return new mob_fel_orc_convertAI (Creature);
}
};
//NOTE: this Creature are also summoned by other spells, for different creatures //NOTE: this Creature are also summoned by other spells, for different creatures
class mob_lesser_shadow_fissure : public CreatureScript
{
public:
mob_lesser_shadow_fissure()
: CreatureScript("mob_lesser_shadow_fissure")
{
}
struct mob_lesser_shadow_fissureAI : public ScriptedAI struct mob_lesser_shadow_fissureAI : public ScriptedAI
{ {
mob_lesser_shadow_fissureAI(Creature *c) : ScriptedAI(c) {} mob_lesser_shadow_fissureAI(Creature* pCreature) : ScriptedAI(pCreature) {}
void Reset() { } void Reset() { }
void MoveInLineOfSight(Unit * /*who*/) {} void MoveInLineOfSight(Unit * /*who*/) {}
@@ -361,38 +410,16 @@ struct mob_lesser_shadow_fissureAI : public ScriptedAI
void EnterCombat(Unit* /*who*/) {} void EnterCombat(Unit* /*who*/) {}
}; };
CreatureAI* GetAI_boss_grand_warlock_nethekurse(Creature* pCreature)
{
return new boss_grand_warlock_nethekurseAI (pCreature);
}
CreatureAI* GetAI_mob_fel_orc_convert(Creature* pCreature)
{
return new mob_fel_orc_convertAI (pCreature);
}
CreatureAI* GetAI_mob_lesser_shadow_fissure(Creature* pCreature) CreatureAI* GetAI_mob_lesser_shadow_fissure(Creature* pCreature)
{ {
return new mob_lesser_shadow_fissureAI (pCreature); return new mob_lesser_shadow_fissureAI (pCreature);
} }
};
void AddSC_boss_grand_warlock_nethekurse() void AddSC_boss_grand_warlock_nethekurse()
{ {
Script *newscript; new boss_grand_warlock_nethekurse();
new mob_fel_orc_convert();
newscript = new Script; new mob_lesser_shadow_fissure();
newscript->Name = "boss_grand_warlock_nethekurse";
newscript->GetAI = &GetAI_boss_grand_warlock_nethekurse;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "mob_fel_orc_convert";
newscript->GetAI = &GetAI_mob_fel_orc_convert;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "mob_lesser_shadow_fissure";
newscript->GetAI = &GetAI_mob_lesser_shadow_fissure;
newscript->RegisterSelf();
} }
@@ -94,15 +94,25 @@ static Yell Killing[]=
{-1540036, NPC_LEFT_HEAD}, {-1540036, NPC_LEFT_HEAD},
{-1540037, NPC_RIGHT_HEAD}, {-1540037, NPC_RIGHT_HEAD},
}; };
static Yell KillingDelay[]= static Yell KillingDelay[]=
{ {
{-1540038, NPC_RIGHT_HEAD}, {-1540038, NPC_RIGHT_HEAD},
{-1000000, NPC_LEFT_HEAD}, {-1000000, NPC_LEFT_HEAD},
}; };
class mob_omrogg_heads : public CreatureScript
{
public:
mob_omrogg_heads()
: CreatureScript("mob_omrogg_heads")
{
}
struct mob_omrogg_headsAI : public ScriptedAI struct mob_omrogg_headsAI : public ScriptedAI
{ {
mob_omrogg_headsAI(Creature *c) : ScriptedAI(c) {} mob_omrogg_headsAI(Creature* pCreature) : ScriptedAI(pCreature) {}
bool DeathYell; bool DeathYell;
uint32 Death_Timer; uint32 Death_Timer;
@@ -133,13 +143,28 @@ struct mob_omrogg_headsAI : public ScriptedAI
} }
}; };
CreatureAI* GetAI(Creature* Creature) const
{
return new mob_omrogg_headsAI (Creature);
}
};
class boss_warbringer_omrogg : public CreatureScript
{
public:
boss_warbringer_omrogg()
: CreatureScript("boss_warbringer_omrogg")
{
}
struct boss_warbringer_omroggAI : public ScriptedAI struct boss_warbringer_omroggAI : public ScriptedAI
{ {
boss_warbringer_omroggAI(Creature *c) : ScriptedAI(c) boss_warbringer_omroggAI(Creature* pCreature) : ScriptedAI(pCreature)
{ {
LeftHeadGUID = 0; LeftHeadGUID = 0;
RightHeadGUID = 0; RightHeadGUID = 0;
pInstance = c->GetInstanceData(); pInstance = pCreature->GetInstanceData();
} }
ScriptedInstance* pInstance; ScriptedInstance* pInstance;
@@ -280,7 +305,7 @@ struct boss_warbringer_omroggAI : public ScriptedAI
DoScriptText(YELL_DIE_L, pLeftHead); DoScriptText(YELL_DIE_L, pLeftHead);
CAST_AI(mob_omrogg_headsAI, CAST_CRE(pRightHead)->AI())->DoDeathYell(); CAST_AI(mob_omrogg_heads::mob_omrogg_headsAI, CAST_CRE(pRightHead)->AI())->DoDeathYell();
if (pInstance) if (pInstance)
pInstance->SetData(TYPE_OMROGG, DONE); pInstance->SetData(TYPE_OMROGG, DONE);
@@ -341,7 +366,9 @@ struct boss_warbringer_omroggAI : public ScriptedAI
if (BlastCount == 3) if (BlastCount == 3)
BlastCount = 0; BlastCount = 0;
} else BlastWave_Timer -= diff; }
else
BlastWave_Timer -= diff;
if (BurningMaul_Timer <= diff) if (BurningMaul_Timer <= diff)
{ {
@@ -350,7 +377,9 @@ struct boss_warbringer_omroggAI : public ScriptedAI
BurningMaul_Timer = 40000; BurningMaul_Timer = 40000;
BlastWave_Timer = 16000; BlastWave_Timer = 16000;
BlastCount = 1; BlastCount = 1;
} else BurningMaul_Timer -= diff; }
else
BurningMaul_Timer -= diff;
if (ResetThreat_Timer <= diff) if (ResetThreat_Timer <= diff)
{ {
@@ -361,19 +390,25 @@ struct boss_warbringer_omroggAI : public ScriptedAI
me->AddThreat(pTarget, 0.0f); me->AddThreat(pTarget, 0.0f);
} }
ResetThreat_Timer = 25000+rand()%15000; ResetThreat_Timer = 25000+rand()%15000;
} else ResetThreat_Timer -= diff; }
else
ResetThreat_Timer -= diff;
if (Fear_Timer <= diff) if (Fear_Timer <= diff)
{ {
DoCast(me, SPELL_FEAR); DoCast(me, SPELL_FEAR);
Fear_Timer = 15000+rand()%20000; Fear_Timer = 15000+rand()%20000;
} else Fear_Timer -= diff; }
else
Fear_Timer -= diff;
if (ThunderClap_Timer <= diff) if (ThunderClap_Timer <= diff)
{ {
DoCast(me, SPELL_THUNDERCLAP); DoCast(me, SPELL_THUNDERCLAP);
ThunderClap_Timer = 15000+rand()%15000; ThunderClap_Timer = 15000+rand()%15000;
} else ThunderClap_Timer -= diff; }
else
ThunderClap_Timer -= diff;
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
@@ -383,24 +418,10 @@ CreatureAI* GetAI_boss_warbringer_omrogg(Creature* pCreature)
{ {
return new boss_warbringer_omroggAI (pCreature); return new boss_warbringer_omroggAI (pCreature);
} }
};
CreatureAI* GetAI_mob_omrogg_heads(Creature* pCreature)
{
return new mob_omrogg_headsAI (pCreature);
}
void AddSC_boss_warbringer_omrogg() void AddSC_boss_warbringer_omrogg()
{ {
Script *newscript; new boss_warbringer_omrogg();
new mob_omrogg_heads();
newscript = new Script;
newscript->Name = "boss_warbringer_omrogg";
newscript->GetAI = &GetAI_boss_warbringer_omrogg;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "mob_omrogg_heads";
newscript->GetAI = &GetAI_mob_omrogg_heads;
newscript->RegisterSelf();
} }
@@ -29,30 +29,48 @@ EndContentData */
#include "ScriptPCH.h" #include "ScriptPCH.h"
#define SAY_AGGRO1 -1540042 enum eSays
#define SAY_AGGRO2 -1540043 {
#define SAY_AGGRO3 -1540044 SAY_AGGRO1 = -1540042,
#define SAY_SLAY1 -1540045 SAY_AGGRO2 = -1540043,
#define SAY_SLAY2 -1540046 SAY_AGGRO3 = -1540044,
#define SAY_DEATH -1540047 SAY_SLAY1 = -1540045,
SAY_SLAY2 = -1540046,
SAY_DEATH = -1540047,
};
#define SPELL_BLADE_DANCE 30739 enum eSpells
#define H_SPELL_CHARGE 25821 {
SPELL_BLADE_DANCE = 30739,
H_SPELL_CHARGE = 25821,
};
enum eCreatures
{
MOB_SHATTERED_ASSASSIN = 17695,
MOB_HEARTHEN_GUARD = 17621,
MOB_SHARPSHOOTER_GUARD = 17622,
MOB_REAVER_GUARD = 17623,
};
#define TARGET_NUM 5 #define TARGET_NUM 5
#define MOB_SHATTERED_ASSASSIN 17695
#define MOB_HEARTHEN_GUARD 17621
#define MOB_SHARPSHOOTER_GUARD 17622
#define MOB_REAVER_GUARD 17623
float AssassEntrance[3] = {275.136,-84.29,2.3}; // y -8 float AssassEntrance[3] = {275.136,-84.29,2.3}; // y -8
float AssassExit[3] = {184.233,-84.29,2.3}; // y -8 float AssassExit[3] = {184.233,-84.29,2.3}; // y -8
float AddsEntrance[3] = {306.036,-84.29,1.93}; float AddsEntrance[3] = {306.036,-84.29,1.93};
class boss_warchief_kargath_bladefist : public CreatureScript
{
public:
boss_warchief_kargath_bladefist()
: CreatureScript("boss_warchief_kargath_bladefist")
{
}
struct boss_warchief_kargath_bladefistAI : public ScriptedAI struct boss_warchief_kargath_bladefistAI : public ScriptedAI
{ {
boss_warchief_kargath_bladefistAI(Creature *c) : ScriptedAI(c) boss_warchief_kargath_bladefistAI(Creature* pCreature) : ScriptedAI(pCreature)
{ {
} }
@@ -189,7 +207,9 @@ struct boss_warchief_kargath_bladefistAI : public ScriptedAI
{ {
SpawnAssassin(); SpawnAssassin();
Assassins_Timer = 0; Assassins_Timer = 0;
} else Assassins_Timer -= diff; }
else
Assassins_Timer -= diff;
if (InBlade) if (InBlade)
{ {
@@ -218,7 +238,9 @@ struct boss_warchief_kargath_bladefistAI : public ScriptedAI
me->GetMotionMaster()->MovePoint(1,x,y,me->GetPositionZ()); me->GetMotionMaster()->MovePoint(1,x,y,me->GetPositionZ());
Wait_Timer = 0; Wait_Timer = 0;
} }
} else Wait_Timer -= diff; }
else
Wait_Timer -= diff;
} }
else else
{ {
@@ -231,14 +253,18 @@ struct boss_warchief_kargath_bladefistAI : public ScriptedAI
Blade_Dance_Timer = 0; Blade_Dance_Timer = 0;
me->SetSpeed(MOVE_RUN,4); me->SetSpeed(MOVE_RUN,4);
return; return;
} else Blade_Dance_Timer -= diff; }
else
Blade_Dance_Timer -= diff;
if (Charge_timer) if (Charge_timer)
if (Charge_timer <= diff) if (Charge_timer <= diff)
{ {
DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), H_SPELL_CHARGE); DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), H_SPELL_CHARGE);
Charge_timer = 0; Charge_timer = 0;
} else Charge_timer -= diff; }
else
Charge_timer -= diff;
if (Summon_Assistant_Timer <= diff) if (Summon_Assistant_Timer <= diff)
{ {
@@ -246,15 +272,23 @@ struct boss_warchief_kargath_bladefistAI : public ScriptedAI
{ {
switch (urand(0,2)) switch (urand(0,2))
{ {
case 0: me->SummonCreature(MOB_HEARTHEN_GUARD,AddsEntrance[0],AddsEntrance[1], AddsEntrance[2], 0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,30000); break; case 0:
case 1: me->SummonCreature(MOB_SHARPSHOOTER_GUARD,AddsEntrance[0],AddsEntrance[1], AddsEntrance[2], 0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,30000); break; me->SummonCreature(MOB_HEARTHEN_GUARD,AddsEntrance[0],AddsEntrance[1], AddsEntrance[2], 0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,30000);
case 2: me->SummonCreature(MOB_REAVER_GUARD,AddsEntrance[0],AddsEntrance[1], AddsEntrance[2], 0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,30000); break; break;
case 1:
me->SummonCreature(MOB_SHARPSHOOTER_GUARD,AddsEntrance[0],AddsEntrance[1], AddsEntrance[2], 0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,30000);
break;
case 2:
me->SummonCreature(MOB_REAVER_GUARD,AddsEntrance[0],AddsEntrance[1], AddsEntrance[2], 0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,30000);
break;
} }
} }
if (urand(0,9) < 2) if (urand(0,9) < 2)
++summoned; ++summoned;
Summon_Assistant_Timer = urand(25000,35000); Summon_Assistant_Timer = urand(25000,35000);
} else Summon_Assistant_Timer -= diff; }
else
Summon_Assistant_Timer -= diff;
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
@@ -270,21 +304,20 @@ struct boss_warchief_kargath_bladefistAI : public ScriptedAI
return; return;
} }
resetcheck_timer = 5000; resetcheck_timer = 5000;
} else resetcheck_timer -= diff; }
else
resetcheck_timer -= diff;
} }
}; };
CreatureAI* GetAI_boss_warchief_kargath_bladefist(Creature* pCreature) CreatureAI* GetAI(Creature* Creature) const
{ {
return new boss_warchief_kargath_bladefistAI (pCreature); return new boss_warchief_kargath_bladefistAI (Creature);
} }
};
void AddSC_boss_warchief_kargath_bladefist() void AddSC_boss_warchief_kargath_bladefist()
{ {
Script *newscript; new boss_warchief_kargath_bladefist();
newscript = new Script;
newscript->Name = "boss_warchief_kargath_bladefist";
newscript->GetAI = &GetAI_boss_warchief_kargath_bladefist;
newscript->RegisterSelf();
} }
@@ -30,9 +30,16 @@ EndScriptData */
#define DOOR_NETHEKURSE 1 #define DOOR_NETHEKURSE 1
struct instance_shattered_halls : public ScriptedInstance class instance_shattered_halls : public InstanceMapScript
{ {
instance_shattered_halls(Map* pMap) : ScriptedInstance(pMap) {Initialize();}; public:
instance_shattered_halls()
: InstanceMapScript("instance_shattered_halls")
{
}
struct instance_shattered_halls_InstanceMapScript : public ScriptedInstance
{
instance_shattered_halls_InstanceMapScript(Map* pMap) : ScriptedInstance(pMap) {Initialize();};
uint32 m_auiEncounter[MAX_ENCOUNTER]; uint32 m_auiEncounter[MAX_ENCOUNTER];
uint64 nethekurseGUID; uint64 nethekurseGUID;
@@ -50,7 +57,9 @@ struct instance_shattered_halls : public ScriptedInstance
{ {
switch(pGo->GetEntry()) switch(pGo->GetEntry())
{ {
case DOOR_NETHEKURSE: nethekurseDoorGUID = pGo->GetGUID(); break; case DOOR_NETHEKURSE:
nethekurseDoorGUID = pGo->GetGUID();
break;
} }
} }
@@ -58,7 +67,9 @@ struct instance_shattered_halls : public ScriptedInstance
{ {
switch(pCreature->GetEntry()) switch(pCreature->GetEntry())
{ {
case 16807: nethekurseGUID = pCreature->GetGUID(); break; case 16807:
nethekurseGUID = pCreature->GetGUID();
break;
} }
} }
@@ -100,17 +111,14 @@ struct instance_shattered_halls : public ScriptedInstance
} }
}; };
InstanceData* GetInstanceData_instance_shattered_halls(Map* pMap) InstanceData* GetInstanceData(Map* pMap) const
{ {
return new instance_shattered_halls(pMap); return new instance_shattered_halls_InstanceMapScript(pMap);
} }
};
void AddSC_instance_shattered_halls() void AddSC_instance_shattered_halls()
{ {
Script *newscript; new instance_shattered_halls();
newscript = new Script;
newscript->Name = "instance_shattered_halls";
newscript->GetInstanceData = &GetInstanceData_instance_shattered_halls;
newscript->RegisterSelf();
} }