Core/Scripting: Move most if Illidan script text to creature text.

This commit is contained in:
Malcrom
2013-07-01 18:48:42 -02:30
parent 029fe277b0
commit 8d213fdea2
2 changed files with 282 additions and 290 deletions

View File

@@ -0,0 +1,33 @@
SET @AKAMA := 23089;
SET @ILLIDAN := 22917;
SET @FLAMEOFAZZINOTH := 22997;
SET @MAIEV := 23197;
DELETE FROM `creature_text` WHERE `entry` IN (@AKAMA, @ILLIDAN, @FLAMEOFAZZINOTH, @MAIEV);
INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
(@AKAMA,0,0, "Be wary friends, The Betrayer meditates in the court just beyond.",14,0,100,0,0,11388, 'Akama SAY_AKAMA_BEWARE'),
(@AKAMA,1,0, "I'll deal with these mongrels. Strike now, friends! Strike at the betrayer!",14,0,100,0,0,11390, 'Akama SAY_AKAMA_LEAVE'),
(@ILLIDAN,0,0, "Come, my minions. Deal with this traitor as he deserves!",14,0,100,0,0,11465, 'Illidan SAY_ILLIDAN_MINION'),
(@ILLIDAN,1,0, "Who shall be next to taste my blades?!",14,0,100,0,0,11473, 'Illidan SAY_ILLIDAN_KILL'),
(@ILLIDAN,1,1, "This is too easy!",14,0,100,0,0,11472, 'Illidan SAY_ILLIDAN_KILL'),
(@ILLIDAN,2,0, "I will not be touched by rabble such as you!",14,0,100,0,0,11479, 'Illidan SAY_ILLIDAN_TAKEOFF'),
(@ILLIDAN,3,0, "Behold the flames of Azzinoth!",14,0,100,0,0,11480, 'Illidan SAY_ILLIDAN_SUMMONFLAMES'),
(@ILLIDAN,4,0, "Stare into the eyes of the Betrayer!",14,0,100,0,0,11481, 'Illidan SAY_ILLIDAN_EYE_BLAST'),
(@ILLIDAN,5,0, "Behold the power... of the demon within!",14,0,100,0,0,11475, 'Illidan SAY_ILLIDAN_MORPH'),
(@ILLIDAN,6,0, "You've wasted too much time mortals, now you shall fall!",14,0,100,0,0,11474, 'Illidan SAY_ILLIDAN_ENRAGE'),
(@ILLIDAN,7,0, "I can feel your hatred.",14,0,100,0,0,11467, 'Illidan SAY_ILLIDAN_TAUNT'),
(@ILLIDAN,7,1, "Give in to your fear!",14,0,100,0,0,11468, 'Illidan SAY_ILLIDAN_TAUNT'),
(@ILLIDAN,7,2, "You know nothing of power!",14,0,100,0,0,11469, 'Illidan SAY_ILLIDAN_TAUNT'),
(@ILLIDAN,7,3, "Such... arrogance!",14,0,100,0,0,11471, 'Illidan SAY_ILLIDAN_TAUNT'),
(@FLAMEOFAZZINOTH,0,0, "%s sets its gaze on $N!",16,0,100,0,0,0, 'Flame of Azzinoth EMOTE_AZZINOTH_GAZE'),
(@MAIEV,0,0, "That is for Naisha!",14,0,100,0,0,11493, 'Maiev Shadowsong SAY_MAIEV_SHADOWSONG_TAUNT'),
(@MAIEV,0,1, "Bleed as I have bled!",14,0,100,0,0,11494, 'Maiev Shadowsong SAY_MAIEV_SHADOWSONG_TAUNT'),
(@MAIEV,0,2, "There shall be no prison for you this time!",14,0,100,0,0,11495, 'Maiev Shadowsong SAY_MAIEV_SHADOWSONG_TAUNT'),
(@MAIEV,0,3, "Meet your end, demon!",14,0,100,0,0,11500, 'Maiev Shadowsong SAY_MAIEV_SHADOWSONG_TAUNT');
-- The time has come to face Illidan, $N. Are you ready?
UPDATE `creature_template` SET `gossip_menu_id`=8713 WHERE `entry`=23089;
DELETE FROM `gossip_menu` WHERE `entry`=8713 AND `text_id`=10960;
INSERT INTO `gossip_menu` (`entry`, `text_id`) VALUES (8713, 10960);
DELETE FROM `gossip_menu_option` WHERE `menu_id`=8713 AND `id`=0;
INSERT INTO `gossip_menu_option` (`menu_id`, `id`,`option_icon`,`option_text`,`box_coded`,`box_money`,`box_text`) VALUES
(8713, 0, 0, 'I''m ready, Akama.', 0, 0, '');

View File

@@ -35,41 +35,32 @@ EndScriptData */
#define GETUNIT(unit, guid) Unit* unit = Unit::GetUnit(*me, guid)
#define GETCRE(cre, guid) Creature* cre = Unit::GetCreature(*me, guid)
/************* Quotes and Sounds ***********************/
// Gossip for when a player clicks Akama
#define GOSSIP_ITEM "We are ready to face Illidan"
#define EMOTE_UNABLE_TO_SUMMON "%s is unable to summon Maiev Shadowsong and enter Phase 4. Resetting Encounter."
// Yells for/by Akama
#define SAY_AKAMA_BEWARE "Be wary friends, The Betrayer meditates in the court just beyond."
#define SOUND_AKAMA_BEWARE 11388
#define SAY_AKAMA_MINION "Come, my minions. Deal with this traitor as he deserves!"
#define SOUND_AKAMA_MINION 11465
#define SAY_AKAMA_LEAVE "I'll deal with these mongrels. Strike now, friends! Strike at the betrayer!"
#define SOUND_AKAMA_LEAVE 11390
// Other defines
#define CENTER_X 676.740f
#define CENTER_Y 305.297f
#define CENTER_Z 353.192f
// Self explanatory
char const* SAY_KILL1 = "Who shall be next to taste my blades?!";
#define SOUND_KILL1 11473
char const* SAY_KILL2 = "This is too easy!";
#define SOUND_KILL2 11472
// I think I'll fly now and let my subordinates take you on
#define SAY_TAKEOFF "I will not be touched by rabble such as you!"
#define SOUND_TAKEOFF 11479
#define SAY_SUMMONFLAMES "Behold the flames of Azzinoth!"
#define SOUND_SUMMONFLAMES 11480
// When casting Eye Blast. Demon Fire will be appear on places that he casts this
#define SAY_EYE_BLAST "Stare into the eyes of the Betrayer!"
#define SOUND_EYE_BLAST 11481
// kk, I go big, dark and demon on you.
#define SAY_MORPH "Behold the power... of the demon within!"
#define SOUND_MORPH 11475
// I KILL!
#define SAY_ENRAGE "You've wasted too much time mortals, now you shall fall!"
#define SOUND_ENRAGE 11474
enum Say
{
// Akama
SAY_AKAMA_BEWARE = 0,
SAY_AKAMA_LEAVE = 1,
// Illidan
SAY_ILLIDAN_MINION = 0,
SAY_ILLIDAN_KILL = 1,
SAY_ILLIDAN_TAKEOFF = 2,
SAY_ILLIDAN_SUMMONFLAMES = 3,
SAY_ILLIDAN_EYE_BLAST = 4,
SAY_ILLIDAN_MORPH = 5,
SAY_ILLIDAN_ENRAGE = 6,
SAY_ILLIDAN_TAUNT = 7,
// Maiev Shadowsong
SAY_MAIEV_SHADOWSONG_TAUNT = 0,
// Flame of Azzinoth
EMOTE_AZZINOTH_GAZE = 0
};
enum Spells
// Normal Form
@@ -102,6 +93,7 @@ enum Spells
SPELL_DEATH = 41220,
SPELL_BERSERK = 45078,
SPELL_DUAL_WIELD = 42459,
SPELL_SUMMON_MAIEV = 40403,
// Phase Normal spells
SPELL_FLAME_CRASH_EFFECT = 40836,
SPELL_SUMMON_SHADOWDEMON = 41117,
@@ -134,104 +126,107 @@ enum Spells
SPELL_TELEPORT_VISUAL = 41232,
SPELL_SHADOW_STRIKE = 40685,
SPELL_THROW_DAGGER = 41152,
SPELL_FAN_BLADES = 39954, // bugged visual
SPELL_FAN_BLADES = 39954 // bugged visual
};
// Other defines
#define CENTER_X 676.740f
#define CENTER_Y 305.297f
#define CENTER_Z 353.192f
enum Misc
{
FLAME_ENRAGE_DISTANCE = 30,
FLAME_CHARGE_DISTANCE = 50,
#define FLAME_ENRAGE_DISTANCE 30
#define FLAME_CHARGE_DISTANCE 50
EQUIP_ID_MAIN_HAND = 32837,
EQUIP_ID_OFF_HAND = 32838,
EQUIP_ID_MAIN_HAND_MAIEV = 44850,
#define EQUIP_ID_MAIN_HAND 32837
#define EQUIP_ID_OFF_HAND 32838
MODEL_INVISIBLE = 11686,
MODEL_ILLIDAN = 21135,
MODEL_BLADE = 21431
};
/**** Creature Summon and Recognition IDs ****/
enum CreatureEntry
{
EMPTY = 0,
AKAMA = 22990,
ILLIDAN_STORMRAGE = 22917,
BLADE_OF_AZZINOTH = 22996,
FLAME_OF_AZZINOTH = 22997,
MAIEV_SHADOWSONG = 23197,
SHADOW_DEMON = 23375,
DEMON_FIRE = 23069,
FLAME_CRASH = 23336,
ILLIDAN_DOOR_TRIGGER = 23412,
SPIRIT_OF_OLUM = 23411,
SPIRIT_OF_UDALO = 23410,
ILLIDARI_ELITE = 23226,
PARASITIC_SHADOWFIEND = 23498,
CAGE_TRAP_TRIGGER = 23292,
EMPTY = 0,
AKAMA = 22990,
ILLIDAN_STORMRAGE = 22917,
BLADE_OF_AZZINOTH = 22996,
FLAME_OF_AZZINOTH = 22997,
MAIEV_SHADOWSONG = 23197,
SHADOW_DEMON = 23375,
DEMON_FIRE = 23069,
FLAME_CRASH = 23336,
ILLIDAN_DOOR_TRIGGER = 23412,
SPIRIT_OF_OLUM = 23411,
SPIRIT_OF_UDALO = 23410,
ILLIDARI_ELITE = 23226,
PARASITIC_SHADOWFIEND = 23498,
CAGE_TRAP_TRIGGER = 23292
};
/*** Phase Names ***/
enum PhaseIllidan
{
PHASE_ILLIDAN_NULL = 0,
PHASE_NORMAL = 1,
PHASE_FLIGHT = 2,
PHASE_NORMAL_2 = 3,
PHASE_DEMON = 4,
PHASE_NORMAL_MAIEV = 5,
PHASE_TALK_SEQUENCE = 6,
PHASE_FLIGHT_SEQUENCE = 7,
PHASE_TRANSFORM_SEQUENCE = 8,
PHASE_ILLIDAN_MAX = 9,
PHASE_ILLIDAN_NULL = 0,
PHASE_NORMAL = 1,
PHASE_FLIGHT = 2,
PHASE_NORMAL_2 = 3,
PHASE_DEMON = 4,
PHASE_NORMAL_MAIEV = 5,
PHASE_TALK_SEQUENCE = 6,
PHASE_FLIGHT_SEQUENCE = 7,
PHASE_TRANSFORM_SEQUENCE = 8,
PHASE_ILLIDAN_MAX = 9
}; // Maiev uses the same phase
enum PhaseAkama
{
PHASE_AKAMA_NULL = 0,
PHASE_CHANNEL = 1,
PHASE_WALK = 2,
PHASE_TALK = 3,
PHASE_FIGHT_ILLIDAN = 4,
PHASE_FIGHT_MINIONS = 5,
PHASE_RETURN = 6,
PHASE_AKAMA_NULL = 0,
PHASE_CHANNEL = 1,
PHASE_WALK = 2,
PHASE_TALK = 3,
PHASE_FIGHT_ILLIDAN = 4,
PHASE_FIGHT_MINIONS = 5,
PHASE_RETURN = 6
};
enum EventIllidan
{
EVENT_NULL = 0,
EVENT_BERSERK = 1,
EVENT_NULL = 0,
EVENT_BERSERK = 1,
// normal phase
EVENT_TAUNT = 2,
EVENT_SHEAR = 3,
EVENT_FLAME_CRASH = 4,
EVENT_PARASITIC_SHADOWFIEND = 5,
EVENT_PARASITE_CHECK = 6,
EVENT_DRAW_SOUL = 7,
EVENT_AGONIZING_FLAMES = 8,
EVENT_TRANSFORM_NORMAL = 9,
EVENT_ENRAGE = 10,
EVENT_TAUNT = 2,
EVENT_SHEAR = 3,
EVENT_FLAME_CRASH = 4,
EVENT_PARASITIC_SHADOWFIEND = 5,
EVENT_PARASITE_CHECK = 6,
EVENT_DRAW_SOUL = 7,
EVENT_AGONIZING_FLAMES = 8,
EVENT_TRANSFORM_NORMAL = 9,
EVENT_ENRAGE = 10,
// flight phase
EVENT_FIREBALL = 2,
EVENT_DARK_BARRAGE = 3,
EVENT_EYE_BLAST = 4,
EVENT_MOVE_POINT = 5,
EVENT_FIREBALL = 2,
EVENT_DARK_BARRAGE = 3,
EVENT_EYE_BLAST = 4,
EVENT_MOVE_POINT = 5,
// demon phase
EVENT_SHADOW_BLAST = 2,
EVENT_FLAME_BURST = 3,
EVENT_SHADOWDEMON = 4,
EVENT_TRANSFORM_DEMON = 5,
EVENT_SHADOW_BLAST = 2,
EVENT_FLAME_BURST = 3,
EVENT_SHADOWDEMON = 4,
EVENT_TRANSFORM_DEMON = 5,
// sequence phase
EVENT_TALK_SEQUENCE = 2,
EVENT_FLIGHT_SEQUENCE = 2,
EVENT_TRANSFORM_SEQUENCE = 2,
EVENT_TALK_SEQUENCE = 2,
EVENT_FLIGHT_SEQUENCE = 2,
EVENT_TRANSFORM_SEQUENCE = 2
};
enum EventMaiev
{
EVENT_MAIEV_NULL = 0,
EVENT_MAIEV_STEALTH = 1,
EVENT_MAIEV_TAUNT = 2,
EVENT_MAIEV_SHADOW_STRIKE = 3,
EVENT_MAIEV_THROW_DAGGER = 4,
EVENT_MAIEV_TRAP = 4,
EVENT_MAIEV_NULL = 0,
EVENT_MAIEV_STEALTH = 1,
EVENT_MAIEV_TAUNT = 2,
EVENT_MAIEV_SHADOW_STRIKE = 3,
EVENT_MAIEV_THROW_DAGGER = 4,
EVENT_MAIEV_TRAP = 4
};
static const EventIllidan MaxTimer[9] =
@@ -247,6 +242,33 @@ static const EventIllidan MaxTimer[9] =
EVENT_TRANSFORM_SEQUENCE
};
/* ################## TO DO CONVERT THIS UGLINESS TO CREATURE TEXT ##################
SET @AKAMA := 23089;
SET @ILLIDAN := 22917;
SET @MAIEV := 23197;
DELETE FROM `creature_text` WHERE `entry`=@AKAMA AND `groupid` IN (2,3,4);
DELETE FROM `creature_text` WHERE `entry`=@ILLIDAN AND `groupid` IN (8,9,10,11,12,13,14);
DELETE FROM `creature_text` WHERE `entry`=@MAIEV AND `groupid` IN (1,2,3,4);
INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
(@ILLIDAN,8,0, "Akama... your duplicity is hardly surprising. I should have slaughtered you and your malformed brethren long ago.",14,0,100,0,0,11463, 'Illidan SAY_XXXXXXXXXXX'),
(@AKAMA,2,0, "We've come to end your reign, Illidan. My people and all of Outland shall be free!",14,0,100,25,0,11389, 'Akama SAY_XXXXXXXXXXX'),
(@ILLIDAN,9,0, "Boldly said. But I remain unconvinced.",14,0,100,396,0,11464, 'Illidan SAY_XXXXXXXXXXX'),
(@AKAMA,3,0, "The time has come! The moment is at hand!",14,0,100,22,0,11380, 'Akama SAY_XXXXXXXXXXX'),
(@ILLIDAN,10,0, "You are not prepared!",14,0,100,406,0,11466, 'Illidan SAY_XXXXXXXXXXX'),
(@ILLIDAN,11,0, "Is this it, mortals? Is this all the fury you can muster?",14,0,100,0,0,11476, 'Illidan SAY_XXXXXXXXXXX'),
(@MAIEV,1,0, "Their fury pales before mine, Illidan. We have some unsettled business between us.",14,0,100,5,0,11491, 'Maiev Shadowsong SAY_XXXXXXXXXXX'),
(@ILLIDAN,12,0, "Maiev... How is this even possible?",14,0,100,1,0,11477, 'Illidan SAY_XXXXXXXXXXX'),
(@MAIEV,2,0, "Ah... my long hunt is finally over. Today, Justice will be done!",14,0,100,15,0,11492, 'Maiev Shadowsong SAY_XXXXXXXXXXX'),
(@ILLIDAN,13,0, "Feel the hatred of ten thousand years!",14,0,100,396,0,11470, 'Illidan SAY_XXXXXXXXXXX'),
(@MAIEV,3,0, "Ahh... It is finished. You are beaten.",14,0,100,0,0,11496, 'Maiev Shadowsong SAY_XXXXXXXXXXX'),
(@ILLIDAN,14,0, "You have won... Maiev...but the huntress... is nothing...without the hunt... you... are nothing... without me..",14,0,100,65,0,11478, 'Illidan SAY_XXXXXXXXXXX'),
(@MAIEV,4,0, "He is right. I feel nothing... I am nothing... Farewell, champions.",14,0,100,0,0,11497, 'Maiev Shadowsong SAY_XXXXXXXXXXX'),
(@AKAMA,4,0, "The Light will fill these dismal halls once again. I swear it.",14,0,100,0,0,11387, 'Akama SAY_XXXXXXXXXXX');
*/
struct Yells
{
uint32 sound;
@@ -282,22 +304,6 @@ static const Yells Conversation[22] =
{0, "", EMPTY, 1000, 0, false} // 21
};
static const Yells RandomTaunts[4]=
{
{11467, "I can feel your hatred.", ILLIDAN_STORMRAGE, 0, 0, false},
{11468, "Give in to your fear!", ILLIDAN_STORMRAGE, 0, 0, false},
{11469, "You know nothing of power!", ILLIDAN_STORMRAGE, 0, 0, false},
{11471, "Such... arrogance!", ILLIDAN_STORMRAGE, 0, 0, false}
};
static const Yells MaievTaunts[4]=
{
{11493, "That is for Naisha!", MAIEV_SHADOWSONG, 0, 0, false},
{11494, "Bleed as I have bled!", MAIEV_SHADOWSONG, 0, 0, false},
{11495, "There shall be no prison for you this time!", MAIEV_SHADOWSONG, 0, 0, false},
{11500, "Meet your end, demon!", MAIEV_SHADOWSONG, 0, 0, false}
};
struct Locations
{
float x, y, z;
@@ -368,27 +374,15 @@ static const Animation DemonTransformation[10]=
{0, SPELL_DEMON_TRANSFORM_3, 0, 0, 0, 8, true}
};
#define EMOTE_SETS_GAZE_ON "%s sets its gaze on $N!"
#define EMOTE_UNABLE_TO_SUMMON "%s is unable to summon Maiev Shadowsong and enter Phase 4. Resetting Encounter."
class mob_flame_of_azzinoth : public CreatureScript
{
public:
mob_flame_of_azzinoth() : CreatureScript("mob_flame_of_azzinoth") { }
CreatureAI* GetAI(Creature* creature) const
{
return new flame_of_azzinothAI (creature);
}
struct flame_of_azzinothAI : public ScriptedAI
{
flame_of_azzinothAI(Creature* creature) : ScriptedAI(creature) {}
uint32 FlameBlastTimer;
uint32 CheckTimer;
uint64 GlaiveGUID;
void Reset()
{
FlameBlastTimer = 15000;
@@ -409,7 +403,7 @@ public:
me->AddThreat(target, 5000000.0f);
AttackStart(target);
DoCast(target, SPELL_CHARGE);
me->MonsterTextEmote(EMOTE_SETS_GAZE_ON, target->GetGUID());
Talk(EMOTE_AZZINOTH_GAZE);
}
}
@@ -463,7 +457,17 @@ public:
DoMeleeAttackIfReady();
}
private:
uint32 FlameBlastTimer;
uint32 CheckTimer;
uint64 GlaiveGUID;
};
CreatureAI* GetAI(Creature* creature) const
{
return new flame_of_azzinothAI (creature);
}
};
/************************************** Illidan's AI* **************************************/
@@ -472,11 +476,6 @@ class boss_illidan_stormrage : public CreatureScript
public:
boss_illidan_stormrage() : CreatureScript("boss_illidan_stormrage") { }
CreatureAI* GetAI(Creature* creature) const
{
return new boss_illidan_stormrageAI (creature);
}
struct boss_illidan_stormrageAI : public ScriptedAI
{
boss_illidan_stormrageAI(Creature* creature) : ScriptedAI(creature), Summons(me)
@@ -485,25 +484,6 @@ public:
DoCast(me, SPELL_DUAL_WIELD, true);
}
InstanceScript* instance;
PhaseIllidan Phase;
EventIllidan Event;
uint32 Timer[EVENT_ENRAGE + 1];
uint32 TalkCount;
uint32 TransformCount;
uint32 FlightCount;
uint32 HoverPoint;
uint64 AkamaGUID;
uint64 MaievGUID;
uint64 FlameGUID[2];
uint64 GlaiveGUID[2];
SummonList Summons;
void Reset();
void JustSummoned(Creature* summon);
@@ -577,18 +557,7 @@ public:
if (victim->GetTypeId() != TYPEID_PLAYER)
return;
/// @todo Find better way to handle emote
switch (urand(0, 1))
{
case 0:
me->MonsterYell(SAY_KILL1, LANG_UNIVERSAL, victim->GetGUID());
DoPlaySoundToSet(me, SOUND_KILL1);
break;
case 1:
me->MonsterYell(SAY_KILL2, LANG_UNIVERSAL, victim->GetGUID());
DoPlaySoundToSet(me, SOUND_KILL2);
break;
}
Talk(SAY_ILLIDAN_KILL);
}
void DamageTaken(Unit* done_by, uint32 &damage)
@@ -650,6 +619,7 @@ public:
void EnterPhase(PhaseIllidan NextPhase)
{
DoZoneInCombat();
switch (NextPhase)
{
case PHASE_NORMAL:
@@ -713,8 +683,7 @@ public:
{
TransformCount = 0;
Timer[EVENT_TRANSFORM_SEQUENCE] = 500;
me->MonsterYell(SAY_MORPH, LANG_UNIVERSAL, 0);
DoPlaySoundToSet(me, SOUND_MORPH);
Talk(SAY_ILLIDAN_MORPH);
}
me->GetMotionMaster()->Clear();
me->AttackStop();
@@ -735,8 +704,7 @@ public:
{
me->InterruptNonMeleeSpells(false);
me->MonsterYell(SAY_EYE_BLAST, LANG_UNIVERSAL, 0);
DoPlaySoundToSet(me, SOUND_EYE_BLAST);
Talk(SAY_ILLIDAN_EYE_BLAST);
float distx, disty, dist[2];
for (uint8 i = 0; i < 2; ++i)
@@ -771,8 +739,7 @@ public:
}
void SummonFlamesOfAzzinoth()
{
me->MonsterYell(SAY_SUMMONFLAMES, LANG_UNIVERSAL, 0);
DoPlaySoundToSet(me, SOUND_SUMMONFLAMES);
Talk(SAY_ILLIDAN_SUMMONFLAMES);
for (uint8 i = 0; i < 2; ++i)
{
@@ -793,7 +760,7 @@ public:
void SummonMaiev()
{
DoCast(me, SPELL_SHADOW_PRISON, true);
DoCast(me, 40403, true);
DoCast(me, SPELL_SUMMON_MAIEV, true);
if (!MaievGUID) // If Maiev cannot be summoned, reset the encounter and post some errors to the console.
{
EnterEvadeMode();
@@ -812,8 +779,7 @@ public:
me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
me->SetDisableGravity(true);
me->StopMoving();
me->MonsterYell(SAY_TAKEOFF, LANG_UNIVERSAL, 0);
DoPlaySoundToSet(me, SOUND_TAKEOFF);
Talk(SAY_ILLIDAN_TAKEOFF);
Timer[EVENT_FLIGHT_SEQUENCE] = 3000;
break;
case 2: // move to center
@@ -828,7 +794,7 @@ public:
{
GlaiveGUID[i] = Glaive->GetGUID();
Glaive->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
Glaive->SetDisplayId(11686);
Glaive->SetDisplayId(MODEL_INVISIBLE);
Glaive->setFaction(me->getFaction());
DoCast(Glaive, SPELL_THROW_GLAIVE2);
}
@@ -844,7 +810,7 @@ public:
{
GlaiveGUID[i] = Glaive->GetGUID();
Glaive->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
Glaive->SetDisplayId(11686);
Glaive->SetDisplayId(MODEL_INVISIBLE);
Glaive->setFaction(me->getFaction());
DoCast(Glaive, SPELL_THROW_GLAIVE, true);
}
@@ -872,7 +838,7 @@ public:
if (Glaive)
{
Glaive->CastSpell(me, SPELL_GLAIVE_RETURNS, false); // Make it look like the Glaive flies back up to us
Glaive->SetDisplayId(11686); // disappear but not die for now
Glaive->SetDisplayId(MODEL_INVISIBLE); // disappear but not die for now
}
}
}
@@ -1019,21 +985,13 @@ public:
{
// PHASE_NORMAL
case EVENT_BERSERK:
me->MonsterYell(SAY_ENRAGE, LANG_UNIVERSAL, 0);
DoPlaySoundToSet(me, SOUND_ENRAGE);
Talk(SAY_ILLIDAN_ENRAGE);
DoCast(me, SPELL_BERSERK, true);
Timer[EVENT_BERSERK] = 5000; // The buff actually lasts forever.
break;
case EVENT_TAUNT:
{
uint32 random = rand()%4;
uint32 soundid = RandomTaunts[random].sound;
if (RandomTaunts[random].text.size())
me->MonsterYell(RandomTaunts[random].text.c_str(), LANG_UNIVERSAL, 0);
if (soundid)
DoPlaySoundToSet(me, soundid);
}
Talk(SAY_ILLIDAN_TAUNT);
Timer[EVENT_TAUNT] = urand(25000, 35000);
break;
@@ -1150,7 +1108,28 @@ public:
}
}
}
public:
uint64 AkamaGUID;
uint32 Timer[EVENT_ENRAGE + 1];
PhaseIllidan Phase;
private:
InstanceScript* instance;
EventIllidan Event;
uint32 TalkCount;
uint32 TransformCount;
uint32 FlightCount;
uint32 HoverPoint;
uint64 MaievGUID;
uint64 FlameGUID[2];
uint64 GlaiveGUID[2];
SummonList Summons;
};
CreatureAI* GetAI(Creature* creature) const
{
return new boss_illidan_stormrageAI (creature);
}
};
/********************************** End of Illidan AI* *****************************************/
@@ -1161,22 +1140,10 @@ class boss_maiev_shadowsong : public CreatureScript
public:
boss_maiev_shadowsong() : CreatureScript("boss_maiev_shadowsong") { }
CreatureAI* GetAI(Creature* creature) const
{
return new boss_maievAI (creature);
}
struct boss_maievAI : public ScriptedAI
{
boss_maievAI(Creature* creature) : ScriptedAI(creature) {};
uint64 IllidanGUID;
PhaseIllidan Phase;
EventMaiev Event;
uint32 Timer[5];
uint32 MaxTimer;
void Reset()
{
MaxTimer = 0;
@@ -1185,7 +1152,7 @@ public:
Timer[EVENT_MAIEV_STEALTH] = 0;
Timer[EVENT_MAIEV_TAUNT] = urand(22, 43) * 1000;
Timer[EVENT_MAIEV_SHADOW_STRIKE] = 30000;
SetEquipmentSlots(false, 44850, EQUIP_UNEQUIP, EQUIP_NO_CHANGE);
SetEquipmentSlots(false, EQUIP_ID_MAIN_HAND_MAIEV, EQUIP_UNEQUIP, EQUIP_NO_CHANGE);
me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 2, 45738);
}
@@ -1330,14 +1297,8 @@ public:
}
break;
case EVENT_MAIEV_TAUNT:
{
uint32 random = rand()%4;
uint32 sound = MaievTaunts[random].sound;
if (MaievTaunts[random].text.size())
me->MonsterYell(MaievTaunts[random].text.c_str(), LANG_UNIVERSAL, 0);
DoPlaySoundToSet(me, sound);
Timer[EVENT_MAIEV_TAUNT] = urand(22, 43) * 1000;
}
Talk(SAY_MAIEV_SHADOWSONG_TAUNT);
Timer[EVENT_MAIEV_TAUNT] = urand(22, 43) * 1000;
break;
case EVENT_MAIEV_SHADOW_STRIKE:
DoCastVictim(SPELL_SHADOW_STRIKE);
@@ -1376,7 +1337,19 @@ public:
if (Phase == PHASE_NORMAL_MAIEV)
DoMeleeAttackIfReady();
}
private:
uint64 IllidanGUID;
PhaseIllidan Phase;
EventMaiev Event;
uint32 Timer[5];
uint32 MaxTimer;
};
CreatureAI* GetAI(Creature* creature) const
{
return new boss_maievAI (creature);
}
};
class npc_akama_illidan : public CreatureScript
@@ -1391,23 +1364,6 @@ public:
instance = creature->GetInstanceScript();
JustCreated = true;
}
bool JustCreated;
InstanceScript* instance;
PhaseAkama Phase;
bool Event;
uint32 Timer;
uint64 IllidanGUID;
uint64 ChannelGUID;
uint64 SpiritGUID[2];
uint64 GateGUID;
uint64 DoorGUID[2];
uint32 ChannelCount;
uint32 WalkCount;
uint32 TalkCount;
uint32 Check_Timer;
void Reset()
{
@@ -1440,21 +1396,21 @@ public:
else
{
IllidanGUID = 0;
GateGUID = 0;
GateGUID = 0;
DoorGUID[0] = 0;
DoorGUID[1] = 0;
}
ChannelGUID = 0;
ChannelGUID = 0;
SpiritGUID[0] = 0;
SpiritGUID[1] = 0;
Phase = PHASE_AKAMA_NULL;
Timer = 0;
Phase = PHASE_AKAMA_NULL;
Timer = 0;
ChannelCount = 0;
TalkCount = 0;
Check_Timer = 5000;
ChannelCount = 0;
TalkCount = 0;
Check_Timer = 5000;
KillAllElites();
@@ -1537,7 +1493,7 @@ public:
if (Creature* Channel = me->SummonCreature(ILLIDAN_DOOR_TRIGGER, x, y, z+5, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 360000))
{
ChannelGUID = Channel->GetGUID();
Channel->SetDisplayId(11686); // Invisible but spell visuals can still be seen.
Channel->SetDisplayId(MODEL_INVISIBLE); // Invisible but spell visuals can still be seen.
DoCast(Channel, SPELL_AKAMA_DOOR_FAIL);
}
@@ -1628,14 +1584,12 @@ public:
if (GETCRE(Illidan, IllidanGUID))
{
CAST_AI(boss_illidan_stormrage::boss_illidan_stormrageAI, Illidan->AI())->Timer[EVENT_TAUNT] += 30000;
Illidan->MonsterYell(SAY_AKAMA_MINION, LANG_UNIVERSAL, 0);
DoPlaySoundToSet(Illidan, SOUND_AKAMA_MINION);
Illidan->AI()->Talk(SAY_ILLIDAN_MINION);
}
Timer = 8000;
break;
case 1:
me->MonsterYell(SAY_AKAMA_LEAVE, LANG_UNIVERSAL, 0);
DoPlaySoundToSet(me, SOUND_AKAMA_LEAVE);
Talk(SAY_AKAMA_LEAVE);
Timer = 3000;
break;
case 2:
@@ -1688,8 +1642,7 @@ public:
Timer = 2000;
break;
case 5:
me->MonsterYell(SAY_AKAMA_BEWARE, LANG_UNIVERSAL, 0);
DoPlaySoundToSet(me, SOUND_AKAMA_BEWARE);
Talk(SAY_AKAMA_BEWARE);
Channel->setDeathState(JUST_DIED);
Spirit[0]->SetVisible(false);
Spirit[1]->SetVisible(false);
@@ -1814,26 +1767,29 @@ public:
DoMeleeAttackIfReady();
}
};
bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action)
{
player->PlayerTalkClass->ClearMenus();
if (action == GOSSIP_ACTION_INFO_DEF) // Time to begin the Event
void sGossipSelect(Player* player, uint32 /*sender*/, uint32 /*action*/)
{
player->CLOSE_GOSSIP_MENU();
CAST_AI(npc_akama_illidan::npc_akama_illidanAI, creature->AI())->EnterPhase(PHASE_CHANNEL);
EnterPhase(PHASE_CHANNEL);
}
return true;
}
bool OnGossipHello(Player* player, Creature* creature)
{
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
player->SEND_GOSSIP_MENU(10465, creature->GetGUID());
return true;
}
private:
bool JustCreated;
InstanceScript* instance;
PhaseAkama Phase;
bool Event;
uint32 Timer;
uint64 IllidanGUID;
uint64 ChannelGUID;
uint64 SpiritGUID[2];
uint64 GateGUID;
uint64 DoorGUID[2];
uint32 ChannelCount;
uint32 WalkCount;
uint32 TalkCount;
uint32 Check_Timer;
};
CreatureAI* GetAI(Creature* creature) const
{
@@ -1878,7 +1834,7 @@ void boss_illidan_stormrage::boss_illidan_stormrageAI::Reset()
FlightCount = 0;
TransformCount = 0;
me->SetDisplayId(21135);
me->SetDisplayId(MODEL_ILLIDAN);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
@@ -2025,21 +1981,10 @@ class mob_cage_trap_trigger : public CreatureScript
public:
mob_cage_trap_trigger() : CreatureScript("mob_cage_trap_trigger") { }
CreatureAI* GetAI(Creature* creature) const
{
return new cage_trap_triggerAI (creature);
}
struct cage_trap_triggerAI : public ScriptedAI
{
cage_trap_triggerAI(Creature* creature) : ScriptedAI(creature) {}
uint64 IllidanGUID;
uint32 DespawnTimer;
bool Active;
bool SummonedBeams;
void Reset()
{
IllidanGUID = 0;
@@ -2095,7 +2040,19 @@ public:
// }
// }
}
public:
bool Active;
private:
uint64 IllidanGUID;
uint32 DespawnTimer;
bool SummonedBeams;
};
CreatureAI* GetAI(Creature* creature) const
{
return new cage_trap_triggerAI (creature);
}
};
class gameobject_cage_trap : public GameObjectScript
@@ -2121,17 +2078,10 @@ class mob_shadow_demon : public CreatureScript
public:
mob_shadow_demon() : CreatureScript("mob_shadow_demon") { }
CreatureAI* GetAI(Creature* creature) const
{
return new shadow_demonAI (creature);
}
struct shadow_demonAI : public ScriptedAI
{
shadow_demonAI(Creature* creature) : ScriptedAI(creature) {}
uint64 TargetGUID;
void EnterCombat(Unit* /*who*/)
{
DoZoneInCombat();
@@ -2168,7 +2118,15 @@ public:
if (me->IsWithinDistInMap(me->GetVictim(), 3))
DoCastVictim(SPELL_CONSUME_SOUL);
}
private:
uint64 TargetGUID;
};
CreatureAI* GetAI(Creature* creature) const
{
return new shadow_demonAI (creature);
}
};
class mob_blade_of_azzinoth : public CreatureScript
@@ -2176,11 +2134,6 @@ class mob_blade_of_azzinoth : public CreatureScript
public:
mob_blade_of_azzinoth() : CreatureScript("mob_blade_of_azzinoth") { }
CreatureAI* GetAI(Creature* creature) const
{
return new blade_of_azzinothAI (creature);
}
struct blade_of_azzinothAI : public NullCreatureAI
{
blade_of_azzinothAI(Creature* creature) : NullCreatureAI(creature) {}
@@ -2188,9 +2141,14 @@ public:
void SpellHit(Unit* /*caster*/, const SpellInfo* spell)
{
if (spell->Id == SPELL_THROW_GLAIVE2 || spell->Id == SPELL_THROW_GLAIVE)
me->SetDisplayId(21431);// appear when hit by Illidan's glaive
me->SetDisplayId(MODEL_BLADE);// appear when hit by Illidan's glaive
}
};
CreatureAI* GetAI(Creature* creature) const
{
return new blade_of_azzinothAI (creature);
}
};
class mob_parasitic_shadowfiend : public CreatureScript
@@ -2198,11 +2156,6 @@ class mob_parasitic_shadowfiend : public CreatureScript
public:
mob_parasitic_shadowfiend() : CreatureScript("mob_parasitic_shadowfiend") { }
CreatureAI* GetAI(Creature* creature) const
{
return new mob_parasitic_shadowfiendAI (creature);
}
// Shadowfiends interact with Illidan, setting more targets in Illidan's hashmap
struct mob_parasitic_shadowfiendAI : public ScriptedAI
{
@@ -2211,10 +2164,6 @@ public:
instance = creature->GetInstanceScript();
}
InstanceScript* instance;
uint64 IllidanGUID;
uint32 CheckTimer;
void Reset()
{
if (instance)
@@ -2274,7 +2223,17 @@ public:
DoMeleeAttackIfReady();
}
private:
InstanceScript* instance;
uint64 IllidanGUID;
uint32 CheckTimer;
};
CreatureAI* GetAI(Creature* creature) const
{
return new mob_parasitic_shadowfiendAI (creature);
}
};
void AddSC_boss_illidan()