mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-17 16:10:49 +01:00
Scripts/SunwellPlateau: reworked InstanceScript and applied codestyle
This commit is contained in:
@@ -44,7 +44,7 @@ enum Quotes
|
||||
YELL_MADR_INTRO = 1,
|
||||
YELL_MADR_ICE_BLOCK = 2,
|
||||
YELL_MADR_TRAP = 3,
|
||||
YELL_MADR_DEATH = 4,
|
||||
YELL_MADR_DEATH = 4
|
||||
};
|
||||
|
||||
enum Spells
|
||||
@@ -61,18 +61,11 @@ enum Spells
|
||||
SPELL_INTRO_ENCAPSULATE_CHANELLING = 45661
|
||||
};
|
||||
|
||||
#define FELMYST 25038
|
||||
|
||||
class boss_brutallus : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_brutallus() : CreatureScript("boss_brutallus") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const OVERRIDE
|
||||
{
|
||||
return new boss_brutallusAI(creature);
|
||||
}
|
||||
|
||||
struct boss_brutallusAI : public ScriptedAI
|
||||
{
|
||||
boss_brutallusAI(Creature* creature) : ScriptedAI(creature)
|
||||
@@ -112,16 +105,14 @@ public:
|
||||
|
||||
DoCast(me, SPELL_DUAL_WIELD, true);
|
||||
|
||||
if (instance)
|
||||
instance->SetData(DATA_BRUTALLUS_EVENT, NOT_STARTED);
|
||||
instance->SetBossState(DATA_BRUTALLUS, NOT_STARTED);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) OVERRIDE
|
||||
{
|
||||
Talk(YELL_AGGRO);
|
||||
|
||||
if (instance)
|
||||
instance->SetData(DATA_BRUTALLUS_EVENT, IN_PROGRESS);
|
||||
instance->SetBossState(DATA_BRUTALLUS, IN_PROGRESS);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) OVERRIDE
|
||||
@@ -133,13 +124,10 @@ public:
|
||||
{
|
||||
Talk(YELL_DEATH);
|
||||
|
||||
if (instance)
|
||||
{
|
||||
instance->SetData(DATA_BRUTALLUS_EVENT, DONE);
|
||||
float x, y, z;
|
||||
me->GetPosition(x, y, z);
|
||||
me->SummonCreature(FELMYST, x, y, z+30, me->GetOrientation(), TEMPSUMMON_MANUAL_DESPAWN, 0);
|
||||
}
|
||||
instance->SetBossState(DATA_BRUTALLUS, DONE);
|
||||
float x, y, z;
|
||||
me->GetPosition(x, y, z);
|
||||
me->SummonCreature(NPC_FELMYST, x, y, z + 30, me->GetOrientation(), TEMPSUMMON_MANUAL_DESPAWN, 0);
|
||||
}
|
||||
|
||||
void EnterEvadeMode() OVERRIDE
|
||||
@@ -152,8 +140,8 @@ public:
|
||||
{
|
||||
if (!Intro || IsIntro)
|
||||
return;
|
||||
Creature* Madrigosa = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_MADRIGOSA) : 0);
|
||||
if (Madrigosa)
|
||||
|
||||
if (Creature* Madrigosa = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_MADRIGOSA))
|
||||
{
|
||||
Madrigosa->Respawn();
|
||||
Madrigosa->setActive(true);
|
||||
@@ -166,7 +154,7 @@ public:
|
||||
}
|
||||
else
|
||||
{
|
||||
//Madrigosa not found, end intro
|
||||
// Madrigosa not found, end intro
|
||||
TC_LOG_ERROR("scripts", "Madrigosa was not found");
|
||||
EndIntro();
|
||||
}
|
||||
@@ -188,7 +176,7 @@ public:
|
||||
|
||||
void DoIntro()
|
||||
{
|
||||
Creature* Madrigosa = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_MADRIGOSA) : 0);
|
||||
Creature* Madrigosa = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(DATA_MADRIGOSA) : 0);
|
||||
if (!Madrigosa)
|
||||
return;
|
||||
|
||||
@@ -265,15 +253,16 @@ public:
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who) OVERRIDE
|
||||
|
||||
{
|
||||
if (!me->IsValidAttackTarget(who))
|
||||
return;
|
||||
if (instance && Intro)
|
||||
instance->SetData(DATA_BRUTALLUS_EVENT, SPECIAL);
|
||||
|
||||
if (Intro)
|
||||
instance->SetBossState(DATA_BRUTALLUS, SPECIAL);
|
||||
|
||||
if (Intro && !IsIntro)
|
||||
StartIntro();
|
||||
|
||||
if (!Intro)
|
||||
ScriptedAI::MoveInLineOfSight(who);
|
||||
}
|
||||
@@ -290,15 +279,17 @@ public:
|
||||
{
|
||||
if (IntroFrostBoltTimer <= diff)
|
||||
{
|
||||
if (Creature* Madrigosa = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_MADRIGOSA) : 0))
|
||||
if (Creature* Madrigosa = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_MADRIGOSA))
|
||||
{
|
||||
Madrigosa->CastSpell(me, SPELL_INTRO_FROSTBOLT, true);
|
||||
IntroFrostBoltTimer = 2000;
|
||||
}
|
||||
} else IntroFrostBoltTimer -= diff;
|
||||
}
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
@@ -341,6 +332,11 @@ public:
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const OVERRIDE
|
||||
{
|
||||
return GetSunwellPlateauAI<boss_brutallusAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_brutallus()
|
||||
|
||||
@@ -15,12 +15,6 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* ScriptData
|
||||
SDName: Boss_Eredar_Twins
|
||||
SD%Complete: 100
|
||||
SDComment:
|
||||
EndScriptData */
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "sunwell_plateau.h"
|
||||
@@ -48,35 +42,35 @@ enum Quotes
|
||||
YELL_ALY_DEAD = 6,
|
||||
YELL_SISTER_SACROLASH_DEAD = 7,
|
||||
YELL_CANFLAGRATION = 8,
|
||||
YELL_BERSERK = 9,
|
||||
YELL_BERSERK = 9
|
||||
};
|
||||
|
||||
enum Spells
|
||||
{
|
||||
//Lady Sacrolash spells
|
||||
SPELL_DARK_TOUCHED = 45347,
|
||||
SPELL_SHADOW_BLADES = 45248, //10 secs
|
||||
SPELL_DARK_STRIKE = 45271,
|
||||
SPELL_SHADOW_NOVA = 45329, //30-35 secs
|
||||
SPELL_CONFOUNDING_BLOW = 45256, //25 secs
|
||||
SPELL_DARK_TOUCHED = 45347,
|
||||
SPELL_SHADOW_BLADES = 45248, //10 secs
|
||||
SPELL_DARK_STRIKE = 45271,
|
||||
SPELL_SHADOW_NOVA = 45329, //30-35 secs
|
||||
SPELL_CONFOUNDING_BLOW = 45256, //25 secs
|
||||
|
||||
//Shadow Image spells
|
||||
SPELL_SHADOW_FURY = 45270,
|
||||
SPELL_IMAGE_VISUAL = 45263,
|
||||
SPELL_SHADOW_FURY = 45270,
|
||||
SPELL_IMAGE_VISUAL = 45263,
|
||||
|
||||
//Misc spells
|
||||
SPELL_ENRAGE = 46587,
|
||||
SPELL_EMPOWER = 45366,
|
||||
SPELL_DARK_FLAME = 45345,
|
||||
SPELL_ENRAGE = 46587,
|
||||
SPELL_EMPOWER = 45366,
|
||||
SPELL_DARK_FLAME = 45345,
|
||||
|
||||
//Grand Warlock Alythess spells
|
||||
SPELL_PYROGENICS = 45230, //15secs
|
||||
SPELL_FLAME_TOUCHED = 45348,
|
||||
SPELL_CONFLAGRATION = 45342, //30-35 secs
|
||||
SPELL_BLAZE = 45235, //on main target every 3 secs
|
||||
SPELL_FLAME_SEAR = 46771,
|
||||
SPELL_BLAZE_SUMMON = 45236, //187366 GO
|
||||
SPELL_BLAZE_BURN = 45246
|
||||
SPELL_PYROGENICS = 45230, //15secs
|
||||
SPELL_FLAME_TOUCHED = 45348,
|
||||
SPELL_CONFLAGRATION = 45342, //30-35 secs
|
||||
SPELL_BLAZE = 45235, //on main target every 3 secs
|
||||
SPELL_FLAME_SEAR = 46771,
|
||||
SPELL_BLAZE_SUMMON = 45236, //187366 GO
|
||||
SPELL_BLAZE_BURN = 45246
|
||||
};
|
||||
|
||||
class boss_sacrolash : public CreatureScript
|
||||
@@ -84,11 +78,6 @@ class boss_sacrolash : public CreatureScript
|
||||
public:
|
||||
boss_sacrolash() : CreatureScript("boss_sacrolash") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const OVERRIDE
|
||||
{
|
||||
return new boss_sacrolashAI(creature);
|
||||
};
|
||||
|
||||
struct boss_sacrolashAI : public ScriptedAI
|
||||
{
|
||||
boss_sacrolashAI(Creature* creature) : ScriptedAI(creature)
|
||||
@@ -112,15 +101,12 @@ public:
|
||||
{
|
||||
Enraged = false;
|
||||
|
||||
if (instance)
|
||||
if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ALYTHESS)))
|
||||
{
|
||||
if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_ALYTHESS)))
|
||||
{
|
||||
if (temp->isDead())
|
||||
temp->Respawn();
|
||||
else if (temp->GetVictim())
|
||||
me->getThreatManager().addThreat(temp->GetVictim(), 0.0f);
|
||||
}
|
||||
if (temp->isDead())
|
||||
temp->Respawn();
|
||||
else if (temp->GetVictim())
|
||||
me->getThreatManager().addThreat(temp->GetVictim(), 0.0f);
|
||||
}
|
||||
|
||||
if (!me->IsInCombat())
|
||||
@@ -131,27 +117,21 @@ public:
|
||||
ShadowimageTimer = 20000;
|
||||
ConflagrationTimer = 30000;
|
||||
EnrageTimer = 360000;
|
||||
|
||||
SisterDeath = false;
|
||||
}
|
||||
|
||||
if (instance)
|
||||
instance->SetData(DATA_EREDAR_TWINS_EVENT, NOT_STARTED);
|
||||
instance->SetBossState(DATA_EREDAR_TWINS, NOT_STARTED);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who) OVERRIDE
|
||||
{
|
||||
DoZoneInCombat();
|
||||
|
||||
if (instance)
|
||||
{
|
||||
Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_ALYTHESS));
|
||||
if (temp && temp->IsAlive() && !temp->GetVictim())
|
||||
temp->AI()->AttackStart(who);
|
||||
}
|
||||
Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ALYTHESS));
|
||||
if (temp && temp->IsAlive() && !temp->GetVictim())
|
||||
temp->AI()->AttackStart(who);
|
||||
|
||||
if (instance)
|
||||
instance->SetData(DATA_EREDAR_TWINS_EVENT, IN_PROGRESS);
|
||||
instance->SetBossState(DATA_EREDAR_TWINS, IN_PROGRESS);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) OVERRIDE
|
||||
@@ -167,8 +147,7 @@ public:
|
||||
{
|
||||
Talk(YELL_SAC_DEAD);
|
||||
|
||||
if (instance)
|
||||
instance->SetData(DATA_EREDAR_TWINS_EVENT, DONE);
|
||||
instance->SetBossState(DATA_EREDAR_TWINS, DONE);
|
||||
}
|
||||
else
|
||||
me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
|
||||
@@ -178,15 +157,15 @@ public:
|
||||
{
|
||||
switch (spell->Id)
|
||||
{
|
||||
case SPELL_SHADOW_BLADES:
|
||||
case SPELL_SHADOW_NOVA:
|
||||
case SPELL_CONFOUNDING_BLOW:
|
||||
case SPELL_SHADOW_FURY:
|
||||
HandleTouchedSpells(target, SPELL_DARK_TOUCHED);
|
||||
break;
|
||||
case SPELL_CONFLAGRATION:
|
||||
HandleTouchedSpells(target, SPELL_FLAME_TOUCHED);
|
||||
break;
|
||||
case SPELL_SHADOW_BLADES:
|
||||
case SPELL_SHADOW_NOVA:
|
||||
case SPELL_CONFOUNDING_BLOW:
|
||||
case SPELL_SHADOW_FURY:
|
||||
HandleTouchedSpells(target, SPELL_DARK_TOUCHED);
|
||||
break;
|
||||
case SPELL_CONFLAGRATION:
|
||||
HandleTouchedSpells(target, SPELL_FLAME_TOUCHED);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -194,26 +173,26 @@ public:
|
||||
{
|
||||
switch (TouchedType)
|
||||
{
|
||||
case SPELL_FLAME_TOUCHED:
|
||||
if (!target->HasAura(SPELL_DARK_FLAME))
|
||||
{
|
||||
if (target->HasAura(SPELL_DARK_TOUCHED))
|
||||
case SPELL_FLAME_TOUCHED:
|
||||
if (!target->HasAura(SPELL_DARK_FLAME))
|
||||
{
|
||||
target->RemoveAurasDueToSpell(SPELL_DARK_TOUCHED);
|
||||
target->CastSpell(target, SPELL_DARK_FLAME, true);
|
||||
} else target->CastSpell(target, SPELL_FLAME_TOUCHED, true);
|
||||
}
|
||||
break;
|
||||
case SPELL_DARK_TOUCHED:
|
||||
if (!target->HasAura(SPELL_DARK_FLAME))
|
||||
{
|
||||
if (target->HasAura(SPELL_FLAME_TOUCHED))
|
||||
if (target->HasAura(SPELL_DARK_TOUCHED))
|
||||
{
|
||||
target->RemoveAurasDueToSpell(SPELL_DARK_TOUCHED);
|
||||
target->CastSpell(target, SPELL_DARK_FLAME, true);
|
||||
} else target->CastSpell(target, SPELL_FLAME_TOUCHED, true);
|
||||
}
|
||||
break;
|
||||
case SPELL_DARK_TOUCHED:
|
||||
if (!target->HasAura(SPELL_DARK_FLAME))
|
||||
{
|
||||
target->RemoveAurasDueToSpell(SPELL_FLAME_TOUCHED);
|
||||
target->CastSpell(target, SPELL_DARK_FLAME, true);
|
||||
} else target->CastSpell(target, SPELL_DARK_TOUCHED, true);
|
||||
}
|
||||
break;
|
||||
if (target->HasAura(SPELL_FLAME_TOUCHED))
|
||||
{
|
||||
target->RemoveAurasDueToSpell(SPELL_FLAME_TOUCHED);
|
||||
target->CastSpell(target, SPELL_DARK_FLAME, true);
|
||||
} else target->CastSpell(target, SPELL_DARK_TOUCHED, true);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -223,8 +202,7 @@ public:
|
||||
{
|
||||
if (instance)
|
||||
{
|
||||
Unit* Temp = NULL;
|
||||
Temp = Unit::GetUnit(*me, instance->GetData64(DATA_ALYTHESS));
|
||||
Unit* Temp = Unit::GetUnit(*me, instance->GetData64(DATA_ALYTHESS));
|
||||
if (Temp && Temp->isDead())
|
||||
{
|
||||
Talk(YELL_SISTER_ALYTHESS_DEAD);
|
||||
@@ -245,9 +223,7 @@ public:
|
||||
if (!me->IsNonMeleeSpellCasted(false))
|
||||
{
|
||||
me->InterruptSpell(CURRENT_GENERIC_SPELL);
|
||||
Unit* target = NULL;
|
||||
target = SelectTarget(SELECT_TARGET_RANDOM, 0);
|
||||
if (target)
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
DoCast(target, SPELL_CONFLAGRATION);
|
||||
ConflagrationTimer = 30000+(rand()%5000);
|
||||
}
|
||||
@@ -259,8 +235,7 @@ public:
|
||||
{
|
||||
if (!me->IsNonMeleeSpellCasted(false))
|
||||
{
|
||||
Unit* target = NULL;
|
||||
target = SelectTarget(SELECT_TARGET_RANDOM, 0);
|
||||
Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
|
||||
if (target)
|
||||
DoCast(target, SPELL_SHADOW_NOVA);
|
||||
|
||||
@@ -279,9 +254,7 @@ public:
|
||||
{
|
||||
if (!me->IsNonMeleeSpellCasted(false))
|
||||
{
|
||||
Unit* target = NULL;
|
||||
target = SelectTarget(SELECT_TARGET_RANDOM, 0);
|
||||
if (target)
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
DoCast(target, SPELL_CONFOUNDING_BLOW);
|
||||
ConfoundingblowTimer = 20000 + (rand()%5000);
|
||||
}
|
||||
@@ -297,7 +270,7 @@ public:
|
||||
temp = DoSpawnCreature(NPC_SHADOW_IMAGE, 0, 0, 0, 0, TEMPSUMMON_CORPSE_DESPAWN, 10000);
|
||||
if (temp && target)
|
||||
{
|
||||
temp->AddThreat(target, 1000000);//don't change target(healers)
|
||||
temp->AddThreat(target, 1000000); //don't change target(healers)
|
||||
temp->AI()->AttackStart(target);
|
||||
}
|
||||
}
|
||||
@@ -333,6 +306,11 @@ public:
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const OVERRIDE
|
||||
{
|
||||
return GetSunwellPlateauAI<boss_sacrolashAI>(creature);
|
||||
};
|
||||
};
|
||||
|
||||
class boss_alythess : public CreatureScript
|
||||
@@ -340,11 +318,6 @@ class boss_alythess : public CreatureScript
|
||||
public:
|
||||
boss_alythess() : CreatureScript("boss_alythess") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const OVERRIDE
|
||||
{
|
||||
return new boss_alythessAI(creature);
|
||||
};
|
||||
|
||||
struct boss_alythessAI : public ScriptedAI
|
||||
{
|
||||
boss_alythessAI(Creature* creature) : ScriptedAI(creature)
|
||||
@@ -376,7 +349,7 @@ public:
|
||||
|
||||
if (instance)
|
||||
{
|
||||
if (Creature* temp = Unit::GetCreature((*me), instance->GetData64(DATA_SACROLASH)))
|
||||
if (Creature* temp = ObjectAccessor::GetCreature((*me), instance->GetData64(DATA_SACROLASH)))
|
||||
{
|
||||
if (temp->isDead())
|
||||
temp->Respawn();
|
||||
@@ -398,23 +371,18 @@ public:
|
||||
SisterDeath = false;
|
||||
}
|
||||
|
||||
if (instance)
|
||||
instance->SetData(DATA_EREDAR_TWINS_EVENT, NOT_STARTED);
|
||||
instance->SetBossState(DATA_EREDAR_TWINS, NOT_STARTED);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who) OVERRIDE
|
||||
{
|
||||
DoZoneInCombat();
|
||||
|
||||
if (instance)
|
||||
{
|
||||
Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_SACROLASH));
|
||||
if (temp && temp->IsAlive() && !temp->GetVictim())
|
||||
temp->AI()->AttackStart(who);
|
||||
}
|
||||
Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SACROLASH));
|
||||
if (temp && temp->IsAlive() && !temp->GetVictim())
|
||||
temp->AI()->AttackStart(who);
|
||||
|
||||
if (instance)
|
||||
instance->SetData(DATA_EREDAR_TWINS_EVENT, IN_PROGRESS);
|
||||
instance->SetBossState(DATA_EREDAR_TWINS, IN_PROGRESS);
|
||||
}
|
||||
|
||||
void AttackStart(Unit* who) OVERRIDE
|
||||
@@ -424,7 +392,6 @@ public:
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who) OVERRIDE
|
||||
|
||||
{
|
||||
if (!who || me->GetVictim())
|
||||
return;
|
||||
@@ -441,17 +408,13 @@ public:
|
||||
}
|
||||
}
|
||||
else if (IntroStepCounter == 10 && me->IsWithinLOSInMap(who)&& me->IsWithinDistInMap(who, 30))
|
||||
{
|
||||
IntroStepCounter = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) OVERRIDE
|
||||
{
|
||||
if (rand()%4 == 0)
|
||||
{
|
||||
Talk(YELL_ALY_KILL);
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) OVERRIDE
|
||||
@@ -459,9 +422,7 @@ public:
|
||||
if (SisterDeath)
|
||||
{
|
||||
Talk(YELL_ALY_DEAD);
|
||||
|
||||
if (instance)
|
||||
instance->SetData(DATA_EREDAR_TWINS_EVENT, DONE);
|
||||
instance->SetBossState(DATA_EREDAR_TWINS, DONE);
|
||||
}
|
||||
else
|
||||
me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
|
||||
@@ -471,16 +432,16 @@ public:
|
||||
{
|
||||
switch (spell->Id)
|
||||
{
|
||||
case SPELL_BLAZE:
|
||||
target->CastSpell(target, SPELL_BLAZE_SUMMON, true);
|
||||
break;
|
||||
case SPELL_CONFLAGRATION:
|
||||
case SPELL_FLAME_SEAR:
|
||||
HandleTouchedSpells(target, SPELL_FLAME_TOUCHED);
|
||||
break;
|
||||
case SPELL_SHADOW_NOVA:
|
||||
HandleTouchedSpells(target, SPELL_DARK_TOUCHED);
|
||||
break;
|
||||
case SPELL_BLAZE:
|
||||
target->CastSpell(target, SPELL_BLAZE_SUMMON, true);
|
||||
break;
|
||||
case SPELL_CONFLAGRATION:
|
||||
case SPELL_FLAME_SEAR:
|
||||
HandleTouchedSpells(target, SPELL_FLAME_TOUCHED);
|
||||
break;
|
||||
case SPELL_SHADOW_NOVA:
|
||||
HandleTouchedSpells(target, SPELL_DARK_TOUCHED);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -488,58 +449,68 @@ public:
|
||||
{
|
||||
switch (TouchedType)
|
||||
{
|
||||
case SPELL_FLAME_TOUCHED:
|
||||
if (!target->HasAura(SPELL_DARK_FLAME))
|
||||
{
|
||||
if (target->HasAura(SPELL_DARK_TOUCHED))
|
||||
case SPELL_FLAME_TOUCHED:
|
||||
if (!target->HasAura(SPELL_DARK_FLAME))
|
||||
{
|
||||
target->RemoveAurasDueToSpell(SPELL_DARK_TOUCHED);
|
||||
target->CastSpell(target, SPELL_DARK_FLAME, true);
|
||||
}else
|
||||
{
|
||||
target->CastSpell(target, SPELL_FLAME_TOUCHED, true);
|
||||
if (target->HasAura(SPELL_DARK_TOUCHED))
|
||||
{
|
||||
target->RemoveAurasDueToSpell(SPELL_DARK_TOUCHED);
|
||||
target->CastSpell(target, SPELL_DARK_FLAME, true);
|
||||
}
|
||||
else
|
||||
target->CastSpell(target, SPELL_FLAME_TOUCHED, true);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SPELL_DARK_TOUCHED:
|
||||
if (!target->HasAura(SPELL_DARK_FLAME))
|
||||
{
|
||||
if (target->HasAura(SPELL_FLAME_TOUCHED))
|
||||
break;
|
||||
case SPELL_DARK_TOUCHED:
|
||||
if (!target->HasAura(SPELL_DARK_FLAME))
|
||||
{
|
||||
target->RemoveAurasDueToSpell(SPELL_FLAME_TOUCHED);
|
||||
target->CastSpell(target, SPELL_DARK_FLAME, true);
|
||||
} else target->CastSpell(target, SPELL_DARK_TOUCHED, true);
|
||||
}
|
||||
break;
|
||||
if (target->HasAura(SPELL_FLAME_TOUCHED))
|
||||
{
|
||||
target->RemoveAurasDueToSpell(SPELL_FLAME_TOUCHED);
|
||||
target->CastSpell(target, SPELL_DARK_FLAME, true);
|
||||
}
|
||||
else
|
||||
target->CastSpell(target, SPELL_DARK_TOUCHED, true);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
uint32 IntroStep(uint32 step)
|
||||
{
|
||||
Creature* Sacrolash = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_SACROLASH) : 0);
|
||||
Creature* Sacrolash = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SACROLASH));
|
||||
switch (step)
|
||||
{
|
||||
case 0: return 0;
|
||||
case 1:
|
||||
if (Sacrolash)
|
||||
Sacrolash->AI()->Talk(YELL_INTRO_SAC_1);
|
||||
return 1000;
|
||||
case 2: Talk(YELL_INTRO_ALY_2); return 1000;
|
||||
case 3:
|
||||
if (Sacrolash)
|
||||
Sacrolash->AI()->Talk(YELL_INTRO_SAC_3);
|
||||
return 2000;
|
||||
case 4: Talk(YELL_INTRO_ALY_4); return 1000;
|
||||
case 5:
|
||||
if (Sacrolash)
|
||||
Sacrolash->AI()->Talk(YELL_INTRO_SAC_5);
|
||||
return 2000;
|
||||
case 6: Talk(YELL_INTRO_ALY_6); return 1000;
|
||||
case 7:
|
||||
if (Sacrolash)
|
||||
Sacrolash->AI()->Talk(YELL_INTRO_SAC_7);
|
||||
return 3000;
|
||||
case 8: Talk(YELL_INTRO_ALY_8); return 900000;
|
||||
case 0:
|
||||
return 0;
|
||||
case 1:
|
||||
if (Sacrolash)
|
||||
Sacrolash->AI()->Talk(YELL_INTRO_SAC_1);
|
||||
return 1000;
|
||||
case 2:
|
||||
Talk(YELL_INTRO_ALY_2);
|
||||
return 1000;
|
||||
case 3:
|
||||
if (Sacrolash)
|
||||
Sacrolash->AI()->Talk(YELL_INTRO_SAC_3);
|
||||
return 2000;
|
||||
case 4:
|
||||
Talk(YELL_INTRO_ALY_4);
|
||||
return 1000;
|
||||
case 5:
|
||||
if (Sacrolash)
|
||||
Sacrolash->AI()->Talk(YELL_INTRO_SAC_5);
|
||||
return 2000;
|
||||
case 6:
|
||||
Talk(YELL_INTRO_ALY_6);
|
||||
return 1000;
|
||||
case 7:
|
||||
if (Sacrolash)
|
||||
Sacrolash->AI()->Talk(YELL_INTRO_SAC_7);
|
||||
return 3000;
|
||||
case 8:
|
||||
Talk(YELL_INTRO_ALY_8);
|
||||
return 900000;
|
||||
}
|
||||
return 10000;
|
||||
}
|
||||
@@ -556,30 +527,23 @@ public:
|
||||
|
||||
if (!SisterDeath)
|
||||
{
|
||||
if (instance)
|
||||
Unit* Temp = Unit::GetUnit(*me, instance->GetData64(DATA_SACROLASH));
|
||||
if (Temp && Temp->isDead())
|
||||
{
|
||||
Unit* Temp = NULL;
|
||||
Temp = Unit::GetUnit(*me, instance->GetData64(DATA_SACROLASH));
|
||||
if (Temp && Temp->isDead())
|
||||
{
|
||||
Talk(YELL_SISTER_SACROLASH_DEAD);
|
||||
DoCast(me, SPELL_EMPOWER);
|
||||
me->InterruptSpell(CURRENT_GENERIC_SPELL);
|
||||
SisterDeath = true;
|
||||
}
|
||||
Talk(YELL_SISTER_SACROLASH_DEAD);
|
||||
DoCast(me, SPELL_EMPOWER);
|
||||
me->InterruptSpell(CURRENT_GENERIC_SPELL);
|
||||
SisterDeath = true;
|
||||
}
|
||||
}
|
||||
if (!me->GetVictim())
|
||||
{
|
||||
if (instance)
|
||||
Creature* sisiter = ObjectAccessor::GetCreature((*me), instance->GetData64(DATA_SACROLASH));
|
||||
if (sisiter && !sisiter->isDead() && sisiter->GetVictim())
|
||||
{
|
||||
Creature* sisiter = Unit::GetCreature((*me), instance->GetData64(DATA_SACROLASH));
|
||||
if (sisiter && !sisiter->isDead() && sisiter->GetVictim())
|
||||
{
|
||||
me->AddThreat(sisiter->GetVictim(), 0.0f);
|
||||
DoStartNoMovement(sisiter->GetVictim());
|
||||
me->Attack(sisiter->GetVictim(), false);
|
||||
}
|
||||
me->AddThreat(sisiter->GetVictim(), 0.0f);
|
||||
DoStartNoMovement(sisiter->GetVictim());
|
||||
me->Attack(sisiter->GetVictim(), false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -592,9 +556,7 @@ public:
|
||||
{
|
||||
if (!me->IsNonMeleeSpellCasted(false))
|
||||
{
|
||||
Unit* target = NULL;
|
||||
target = SelectTarget(SELECT_TARGET_RANDOM, 0);
|
||||
if (target)
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
DoCast(target, SPELL_SHADOW_NOVA);
|
||||
ShadownovaTimer= 30000+(rand()%5000);
|
||||
}
|
||||
@@ -607,8 +569,7 @@ public:
|
||||
if (!me->IsNonMeleeSpellCasted(false))
|
||||
{
|
||||
me->InterruptSpell(CURRENT_GENERIC_SPELL);
|
||||
Unit* target = NULL;
|
||||
target = SelectTarget(SELECT_TARGET_RANDOM, 0);
|
||||
Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
|
||||
if (target)
|
||||
DoCast(target, SPELL_CONFLAGRATION);
|
||||
ConflagrationTimer = 30000+(rand()%5000);
|
||||
@@ -661,6 +622,11 @@ public:
|
||||
} else EnrageTimer -= diff;
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const OVERRIDE
|
||||
{
|
||||
return GetSunwellPlateauAI<boss_alythessAI>(creature);
|
||||
};
|
||||
};
|
||||
|
||||
class npc_shadow_image : public CreatureScript
|
||||
@@ -689,23 +655,23 @@ public:
|
||||
KillTimer = 15000;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)OVERRIDE { }
|
||||
void EnterCombat(Unit* /*who*/) OVERRIDE { }
|
||||
|
||||
void SpellHitTarget(Unit* target, const SpellInfo* spell) OVERRIDE
|
||||
{
|
||||
switch (spell->Id)
|
||||
{
|
||||
case SPELL_SHADOW_FURY:
|
||||
case SPELL_DARK_STRIKE:
|
||||
if (!target->HasAura(SPELL_DARK_FLAME))
|
||||
{
|
||||
if (target->HasAura(SPELL_FLAME_TOUCHED))
|
||||
case SPELL_SHADOW_FURY:
|
||||
case SPELL_DARK_STRIKE:
|
||||
if (!target->HasAura(SPELL_DARK_FLAME))
|
||||
{
|
||||
target->RemoveAurasDueToSpell(SPELL_FLAME_TOUCHED);
|
||||
target->CastSpell(target, SPELL_DARK_FLAME, true);
|
||||
} else target->CastSpell(target, SPELL_DARK_TOUCHED, true);
|
||||
}
|
||||
break;
|
||||
if (target->HasAura(SPELL_FLAME_TOUCHED))
|
||||
{
|
||||
target->RemoveAurasDueToSpell(SPELL_FLAME_TOUCHED);
|
||||
target->CastSpell(target, SPELL_DARK_FLAME, true);
|
||||
} else target->CastSpell(target, SPELL_DARK_TOUCHED, true);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -81,14 +81,14 @@ enum Spells
|
||||
//Other
|
||||
SPELL_BERSERK = 45078,
|
||||
SPELL_CLOUD_VISUAL = 45212,
|
||||
SPELL_CLOUD_SUMMON = 45884,
|
||||
SPELL_CLOUD_SUMMON = 45884
|
||||
};
|
||||
|
||||
enum PhaseFelmyst
|
||||
{
|
||||
PHASE_NONE,
|
||||
PHASE_GROUND,
|
||||
PHASE_FLIGHT,
|
||||
PHASE_FLIGHT
|
||||
};
|
||||
|
||||
enum EventFelmyst
|
||||
@@ -104,7 +104,7 @@ enum EventFelmyst
|
||||
|
||||
EVENT_FLIGHT_SEQUENCE,
|
||||
EVENT_SUMMON_DEAD,
|
||||
EVENT_SUMMON_FOG,
|
||||
EVENT_SUMMON_FOG
|
||||
};
|
||||
|
||||
class boss_felmyst : public CreatureScript
|
||||
@@ -112,11 +112,6 @@ class boss_felmyst : public CreatureScript
|
||||
public:
|
||||
boss_felmyst() : CreatureScript("boss_felmyst") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const OVERRIDE
|
||||
{
|
||||
return new boss_felmystAI(creature);
|
||||
}
|
||||
|
||||
struct boss_felmystAI : public ScriptedAI
|
||||
{
|
||||
boss_felmystAI(Creature* creature) : ScriptedAI(creature)
|
||||
@@ -148,8 +143,7 @@ public:
|
||||
DespawnSummons(NPC_VAPOR_TRAIL);
|
||||
me->setActive(false);
|
||||
|
||||
if (instance)
|
||||
instance->SetData(DATA_FELMYST_EVENT, NOT_STARTED);
|
||||
instance->SetBossState(DATA_FELMYST, NOT_STARTED);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) OVERRIDE
|
||||
@@ -162,8 +156,7 @@ public:
|
||||
DoCast(me, AURA_NOXIOUS_FUMES, true);
|
||||
EnterPhase(PHASE_GROUND);
|
||||
|
||||
if (instance)
|
||||
instance->SetData(DATA_FELMYST_EVENT, IN_PROGRESS);
|
||||
instance->SetBossState(DATA_FELMYST, IN_PROGRESS);
|
||||
}
|
||||
|
||||
void AttackStart(Unit* who) OVERRIDE
|
||||
@@ -173,7 +166,6 @@ public:
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who) OVERRIDE
|
||||
|
||||
{
|
||||
if (phase != PHASE_FLIGHT)
|
||||
ScriptedAI::MoveInLineOfSight(who);
|
||||
@@ -193,8 +185,7 @@ public:
|
||||
{
|
||||
Talk(YELL_DEATH);
|
||||
|
||||
if (instance)
|
||||
instance->SetData(DATA_FELMYST_EVENT, DONE);
|
||||
instance->SetBossState(DATA_FELMYST, DONE);
|
||||
}
|
||||
|
||||
void SpellHit(Unit* caster, const SpellInfo* spell) OVERRIDE
|
||||
@@ -246,26 +237,26 @@ public:
|
||||
{
|
||||
switch (NextPhase)
|
||||
{
|
||||
case PHASE_GROUND:
|
||||
me->CastStop(SPELL_FOG_BREATH);
|
||||
me->RemoveAurasDueToSpell(SPELL_FOG_BREATH);
|
||||
me->StopMoving();
|
||||
me->SetSpeed(MOVE_RUN, 2.0f);
|
||||
case PHASE_GROUND:
|
||||
me->CastStop(SPELL_FOG_BREATH);
|
||||
me->RemoveAurasDueToSpell(SPELL_FOG_BREATH);
|
||||
me->StopMoving();
|
||||
me->SetSpeed(MOVE_RUN, 2.0f);
|
||||
|
||||
events.ScheduleEvent(EVENT_CLEAVE, urand(5000, 10000));
|
||||
events.ScheduleEvent(EVENT_CORROSION, urand(10000, 20000));
|
||||
events.ScheduleEvent(EVENT_GAS_NOVA, urand(15000, 20000));
|
||||
events.ScheduleEvent(EVENT_ENCAPSULATE, urand(20000, 25000));
|
||||
events.ScheduleEvent(EVENT_FLIGHT, 60000);
|
||||
break;
|
||||
case PHASE_FLIGHT:
|
||||
me->SetDisableGravity(true);
|
||||
events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 1000);
|
||||
uiFlightCount = 0;
|
||||
uiBreathCount = 0;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
events.ScheduleEvent(EVENT_CLEAVE, urand(5000, 10000));
|
||||
events.ScheduleEvent(EVENT_CORROSION, urand(10000, 20000));
|
||||
events.ScheduleEvent(EVENT_GAS_NOVA, urand(15000, 20000));
|
||||
events.ScheduleEvent(EVENT_ENCAPSULATE, urand(20000, 25000));
|
||||
events.ScheduleEvent(EVENT_FLIGHT, 60000);
|
||||
break;
|
||||
case PHASE_FLIGHT:
|
||||
me->SetDisableGravity(true);
|
||||
events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 1000);
|
||||
uiFlightCount = 0;
|
||||
uiBreathCount = 0;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
phase = NextPhase;
|
||||
}
|
||||
@@ -274,133 +265,131 @@ public:
|
||||
{
|
||||
switch (uiFlightCount)
|
||||
{
|
||||
case 0:
|
||||
//me->AttackStop();
|
||||
me->GetMotionMaster()->Clear(false);
|
||||
me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
|
||||
me->StopMoving();
|
||||
Talk(YELL_TAKEOFF);
|
||||
events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 2000);
|
||||
break;
|
||||
case 1:
|
||||
me->GetMotionMaster()->MovePoint(0, me->GetPositionX()+1, me->GetPositionY(), me->GetPositionZ()+10);
|
||||
break;
|
||||
case 2:
|
||||
{
|
||||
Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true);
|
||||
if (!target)
|
||||
target = Unit::GetUnit(*me, instance ? instance->GetData64(DATA_PLAYER_GUID) : 0);
|
||||
|
||||
if (!target)
|
||||
case 0:
|
||||
//me->AttackStop();
|
||||
me->GetMotionMaster()->Clear(false);
|
||||
me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
|
||||
me->StopMoving();
|
||||
Talk(YELL_TAKEOFF);
|
||||
events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 2000);
|
||||
break;
|
||||
case 1:
|
||||
me->GetMotionMaster()->MovePoint(0, me->GetPositionX()+1, me->GetPositionY(), me->GetPositionZ()+10);
|
||||
break;
|
||||
case 2:
|
||||
{
|
||||
EnterEvadeMode();
|
||||
return;
|
||||
}
|
||||
Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true);
|
||||
if (!target)
|
||||
target = Unit::GetUnit(*me, instance->GetData64(DATA_PLAYER_GUID));
|
||||
|
||||
Creature* Vapor = me->SummonCreature(NPC_VAPOR, target->GetPositionX()-5+rand()%10, target->GetPositionY()-5+rand()%10, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 9000);
|
||||
if (Vapor)
|
||||
if (!target)
|
||||
{
|
||||
EnterEvadeMode();
|
||||
return;
|
||||
}
|
||||
|
||||
if (Creature* Vapor = me->SummonCreature(NPC_VAPOR, target->GetPositionX()-5+rand()%10, target->GetPositionY()-5+rand()%10, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 9000))
|
||||
{
|
||||
Vapor->AI()->AttackStart(target);
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
DoCast(Vapor, SPELL_VAPOR_CHANNEL, false); // core bug
|
||||
Vapor->CastSpell(Vapor, SPELL_VAPOR_TRIGGER, true);
|
||||
}
|
||||
|
||||
events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 10000);
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
Vapor->AI()->AttackStart(target);
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
DoCast(Vapor, SPELL_VAPOR_CHANNEL, false); // core bug
|
||||
Vapor->CastSpell(Vapor, SPELL_VAPOR_TRIGGER, true);
|
||||
DespawnSummons(NPC_VAPOR_TRAIL);
|
||||
//DoCast(me, SPELL_VAPOR_SELECT); need core support
|
||||
|
||||
Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true);
|
||||
if (!target)
|
||||
target = Unit::GetUnit(*me, instance->GetData64(DATA_PLAYER_GUID));
|
||||
|
||||
if (!target)
|
||||
{
|
||||
EnterEvadeMode();
|
||||
return;
|
||||
}
|
||||
|
||||
//target->CastSpell(target, SPELL_VAPOR_SUMMON, true); need core support
|
||||
if (Creature* pVapor = me->SummonCreature(NPC_VAPOR, target->GetPositionX()-5+rand()%10, target->GetPositionY()-5+rand()%10, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 9000))
|
||||
{
|
||||
if (pVapor->AI())
|
||||
pVapor->AI()->AttackStart(target);
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
DoCast(pVapor, SPELL_VAPOR_CHANNEL, false); // core bug
|
||||
pVapor->CastSpell(pVapor, SPELL_VAPOR_TRIGGER, true);
|
||||
}
|
||||
|
||||
events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 10000);
|
||||
break;
|
||||
}
|
||||
|
||||
events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 10000);
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
DespawnSummons(NPC_VAPOR_TRAIL);
|
||||
//DoCast(me, SPELL_VAPOR_SELECT); need core support
|
||||
|
||||
Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true);
|
||||
if (!target)
|
||||
target = Unit::GetUnit(*me, instance ? instance->GetData64(DATA_PLAYER_GUID) : 0);
|
||||
|
||||
if (!target)
|
||||
case 4:
|
||||
DespawnSummons(NPC_VAPOR_TRAIL);
|
||||
events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 1);
|
||||
break;
|
||||
case 5:
|
||||
{
|
||||
EnterEvadeMode();
|
||||
return;
|
||||
}
|
||||
Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true);
|
||||
if (!target)
|
||||
target = Unit::GetUnit(*me, instance->GetData64(DATA_PLAYER_GUID));
|
||||
|
||||
//target->CastSpell(target, SPELL_VAPOR_SUMMON, true); need core support
|
||||
Creature* pVapor = me->SummonCreature(NPC_VAPOR, target->GetPositionX()-5+rand()%10, target->GetPositionY()-5+rand()%10, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 9000);
|
||||
if (pVapor)
|
||||
if (!target)
|
||||
{
|
||||
EnterEvadeMode();
|
||||
return;
|
||||
}
|
||||
|
||||
breathX = target->GetPositionX();
|
||||
breathY = target->GetPositionY();
|
||||
float x, y, z;
|
||||
target->GetContactPoint(me, x, y, z, 70);
|
||||
me->GetMotionMaster()->MovePoint(0, x, y, z+10);
|
||||
break;
|
||||
}
|
||||
case 6:
|
||||
me->SetOrientation(me->GetAngle(breathX, breathY));
|
||||
me->StopMoving();
|
||||
//DoTextEmote("takes a deep breath.", NULL);
|
||||
events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 10000);
|
||||
break;
|
||||
case 7:
|
||||
{
|
||||
if (pVapor->AI())
|
||||
pVapor->AI()->AttackStart(target);
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
DoCast(pVapor, SPELL_VAPOR_CHANNEL, false); // core bug
|
||||
pVapor->CastSpell(pVapor, SPELL_VAPOR_TRIGGER, true);
|
||||
DoCast(me, SPELL_FOG_BREATH, true);
|
||||
float x, y, z;
|
||||
me->GetPosition(x, y, z);
|
||||
x = 2 * breathX - x;
|
||||
y = 2 * breathY - y;
|
||||
me->GetMotionMaster()->MovePoint(0, x, y, z);
|
||||
events.ScheduleEvent(EVENT_SUMMON_FOG, 1);
|
||||
break;
|
||||
}
|
||||
|
||||
events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 10000);
|
||||
break;
|
||||
}
|
||||
case 4:
|
||||
DespawnSummons(NPC_VAPOR_TRAIL);
|
||||
events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 1);
|
||||
break;
|
||||
case 5:
|
||||
{
|
||||
Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true);
|
||||
if (!target)
|
||||
target = Unit::GetUnit(*me, instance ? instance->GetData64(DATA_PLAYER_GUID) : 0);
|
||||
|
||||
if (!target)
|
||||
{
|
||||
EnterEvadeMode();
|
||||
return;
|
||||
}
|
||||
|
||||
breathX = target->GetPositionX();
|
||||
breathY = target->GetPositionY();
|
||||
float x, y, z;
|
||||
target->GetContactPoint(me, x, y, z, 70);
|
||||
me->GetMotionMaster()->MovePoint(0, x, y, z+10);
|
||||
break;
|
||||
}
|
||||
case 6:
|
||||
me->SetOrientation(me->GetAngle(breathX, breathY));
|
||||
me->StopMoving();
|
||||
//DoTextEmote("takes a deep breath.", NULL);
|
||||
events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 10000);
|
||||
break;
|
||||
case 7:
|
||||
{
|
||||
DoCast(me, SPELL_FOG_BREATH, true);
|
||||
float x, y, z;
|
||||
me->GetPosition(x, y, z);
|
||||
x = 2 * breathX - x;
|
||||
y = 2 * breathY - y;
|
||||
me->GetMotionMaster()->MovePoint(0, x, y, z);
|
||||
events.ScheduleEvent(EVENT_SUMMON_FOG, 1);
|
||||
break;
|
||||
}
|
||||
case 8:
|
||||
me->CastStop(SPELL_FOG_BREATH);
|
||||
me->RemoveAurasDueToSpell(SPELL_FOG_BREATH);
|
||||
++uiBreathCount;
|
||||
events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 1);
|
||||
if (uiBreathCount < 3)
|
||||
uiFlightCount = 4;
|
||||
break;
|
||||
case 9:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO))
|
||||
DoStartMovement(target);
|
||||
else
|
||||
{
|
||||
EnterEvadeMode();
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case 10:
|
||||
me->SetDisableGravity(false);
|
||||
me->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
|
||||
EnterPhase(PHASE_GROUND);
|
||||
AttackStart(SelectTarget(SELECT_TARGET_TOPAGGRO));
|
||||
break;
|
||||
case 8:
|
||||
me->CastStop(SPELL_FOG_BREATH);
|
||||
me->RemoveAurasDueToSpell(SPELL_FOG_BREATH);
|
||||
++uiBreathCount;
|
||||
events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 1);
|
||||
if (uiBreathCount < 3)
|
||||
uiFlightCount = 4;
|
||||
break;
|
||||
case 9:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO))
|
||||
DoStartMovement(target);
|
||||
else
|
||||
{
|
||||
EnterEvadeMode();
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case 10:
|
||||
me->SetDisableGravity(false);
|
||||
me->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
|
||||
EnterPhase(PHASE_GROUND);
|
||||
AttackStart(SelectTarget(SELECT_TARGET_TOPAGGRO));
|
||||
break;
|
||||
}
|
||||
++uiFlightCount;
|
||||
}
|
||||
@@ -512,6 +501,11 @@ public:
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const OVERRIDE
|
||||
{
|
||||
return GetSunwellPlateauAI<boss_felmystAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
class npc_felmyst_vapor : public CreatureScript
|
||||
@@ -531,12 +525,14 @@ public:
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
me->SetSpeed(MOVE_RUN, 0.8f);
|
||||
}
|
||||
|
||||
void Reset() OVERRIDE { }
|
||||
void EnterCombat(Unit* /*who*/) OVERRIDE
|
||||
{
|
||||
DoZoneInCombat();
|
||||
//DoCast(me, SPELL_VAPOR_FORCE, true); core bug
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 /*diff*/) OVERRIDE
|
||||
{
|
||||
if (!me->GetVictim())
|
||||
@@ -565,6 +561,7 @@ public:
|
||||
me->SetTarget(me->GetGUID());
|
||||
me->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 0.01f); // core bug
|
||||
}
|
||||
|
||||
void Reset() OVERRIDE { }
|
||||
void EnterCombat(Unit* /*who*/) OVERRIDE { }
|
||||
void AttackStart(Unit* /*who*/) OVERRIDE { }
|
||||
|
||||
@@ -44,7 +44,7 @@ enum Yells
|
||||
|
||||
SAY_GOOD_AGGRO = 0,
|
||||
SAY_GOOD_NEAR_DEATH = 1,
|
||||
SAY_GOOD_NEAR_DEATH2 = 2,
|
||||
SAY_GOOD_NEAR_DEATH2 = 2
|
||||
};
|
||||
|
||||
enum Spells
|
||||
@@ -76,20 +76,20 @@ enum Spells
|
||||
enum SWPActions
|
||||
{
|
||||
DO_ENRAGE = 1,
|
||||
DO_BANISH = 2,
|
||||
DO_BANISH = 2
|
||||
};
|
||||
|
||||
#define GO_FAILED "You are unable to use this currently."
|
||||
|
||||
#define EMOTE_UNABLE_TO_FIND "is unable to find Kalecgos"
|
||||
|
||||
#define FLY_X 1679
|
||||
#define FLY_Y 900
|
||||
#define FLY_Z 82
|
||||
#define FLY_X 1679
|
||||
#define FLY_Y 900
|
||||
#define FLY_Z 82
|
||||
|
||||
#define CENTER_X 1705
|
||||
#define CENTER_Y 930
|
||||
#define RADIUS 30
|
||||
#define CENTER_X 1705
|
||||
#define CENTER_Y 930
|
||||
#define RADIUS 30
|
||||
|
||||
#define DRAGON_REALM_Z 53.079f
|
||||
#define DEMON_REALM_Z -74.558f
|
||||
@@ -103,11 +103,6 @@ class boss_kalecgos : public CreatureScript
|
||||
public:
|
||||
boss_kalecgos() : CreatureScript("boss_kalecgos") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const OVERRIDE
|
||||
{
|
||||
return new boss_kalecgosAI(creature);
|
||||
}
|
||||
|
||||
struct boss_kalecgosAI : public ScriptedAI
|
||||
{
|
||||
boss_kalecgosAI(Creature* creature) : ScriptedAI(creature)
|
||||
@@ -141,13 +136,10 @@ public:
|
||||
|
||||
void Reset() OVERRIDE
|
||||
{
|
||||
if (instance)
|
||||
{
|
||||
SathGUID = instance->GetData64(DATA_SATHROVARR);
|
||||
instance->SetData(DATA_KALECGOS_EVENT, NOT_STARTED);
|
||||
}
|
||||
SathGUID = instance->GetData64(DATA_SATHROVARR);
|
||||
instance->SetBossState(DATA_KALECGOS, NOT_STARTED);
|
||||
|
||||
if (Creature* Sath = Unit::GetCreature(*me, SathGUID))
|
||||
if (Creature* Sath = ObjectAccessor::GetCreature(*me, SathGUID))
|
||||
Sath->AI()->EnterEvadeMode();
|
||||
|
||||
me->setFaction(14);
|
||||
@@ -158,7 +150,7 @@ public:
|
||||
me->SetVisible(true);
|
||||
me->SetStandState(UNIT_STAND_STATE_SLEEP);
|
||||
}
|
||||
me->SetFullHealth();//dunno why it does not resets health at evade..
|
||||
me->SetFullHealth(); //dunno why it does not resets health at evade..
|
||||
ArcaneBuffetTimer = 8000;
|
||||
FrostBreathTimer = 15000;
|
||||
WildMagicTimer = 10000;
|
||||
@@ -234,6 +226,7 @@ public:
|
||||
} else ResetTimer -= diff;
|
||||
return;
|
||||
}
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
@@ -246,13 +239,13 @@ public:
|
||||
}
|
||||
if (HealthBelowPct(10) && !isEnraged)
|
||||
{
|
||||
if (Creature* Sath = Unit::GetCreature(*me, SathGUID))
|
||||
if (Creature* Sath = ObjectAccessor::GetCreature(*me, SathGUID))
|
||||
Sath->AI()->DoAction(DO_ENRAGE);
|
||||
DoAction(DO_ENRAGE);
|
||||
}
|
||||
if (!isBanished && HealthBelowPct(1))
|
||||
{
|
||||
if (Creature* Sath = Unit::GetCreature(*me, SathGUID))
|
||||
if (Creature* Sath = ObjectAccessor::GetCreature(*me, SathGUID))
|
||||
{
|
||||
if (Sath->HasAura(SPELL_BANISH))
|
||||
{
|
||||
@@ -317,6 +310,7 @@ public:
|
||||
SpectralBlastTimer = 1000;
|
||||
return;
|
||||
}
|
||||
|
||||
std::list<Unit*>::const_iterator i = targetList.begin();
|
||||
advance(i, rand()%targetList.size());
|
||||
if ((*i))
|
||||
@@ -331,7 +325,6 @@ public:
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who) OVERRIDE
|
||||
|
||||
{
|
||||
if (bJustReset)//boss is invisible, don't attack
|
||||
return;
|
||||
@@ -356,8 +349,7 @@ public:
|
||||
Talk(SAY_EVIL_AGGRO);
|
||||
DoZoneInCombat();
|
||||
|
||||
if (instance)
|
||||
instance->SetData(DATA_KALECGOS_EVENT, IN_PROGRESS);
|
||||
instance->SetBossState(DATA_KALECGOS, IN_PROGRESS);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) OVERRIDE
|
||||
@@ -396,21 +388,21 @@ public:
|
||||
{
|
||||
switch (TalkSequence)
|
||||
{
|
||||
case 1:
|
||||
me->setFaction(35);
|
||||
TalkTimer = 1000;
|
||||
break;
|
||||
case 2:
|
||||
Talk(SAY_GOOD_PLRWIN);
|
||||
TalkTimer = 10000;
|
||||
break;
|
||||
case 3:
|
||||
me->SetDisableGravity(true);
|
||||
me->GetMotionMaster()->MovePoint(0, FLY_X, FLY_Y, FLY_Z);
|
||||
TalkTimer = 600000;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
case 1:
|
||||
me->setFaction(35);
|
||||
TalkTimer = 1000;
|
||||
break;
|
||||
case 2:
|
||||
Talk(SAY_GOOD_PLRWIN);
|
||||
TalkTimer = 10000;
|
||||
break;
|
||||
case 3:
|
||||
me->SetDisableGravity(true);
|
||||
me->GetMotionMaster()->MovePoint(0, FLY_X, FLY_Y, FLY_Z);
|
||||
TalkTimer = 600000;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -418,23 +410,28 @@ public:
|
||||
{
|
||||
switch (TalkSequence)
|
||||
{
|
||||
case 1:
|
||||
Talk(SAY_EVIL_ENRAGE);
|
||||
TalkTimer = 3000;
|
||||
break;
|
||||
case 2:
|
||||
me->SetDisableGravity(true);
|
||||
me->GetMotionMaster()->MovePoint(0, FLY_X, FLY_Y, FLY_Z);
|
||||
TalkTimer = 15000;
|
||||
break;
|
||||
case 3:
|
||||
EnterEvadeMode();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
case 1:
|
||||
Talk(SAY_EVIL_ENRAGE);
|
||||
TalkTimer = 3000;
|
||||
break;
|
||||
case 2:
|
||||
me->SetDisableGravity(true);
|
||||
me->GetMotionMaster()->MovePoint(0, FLY_X, FLY_Y, FLY_Z);
|
||||
TalkTimer = 15000;
|
||||
break;
|
||||
case 3:
|
||||
EnterEvadeMode();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const OVERRIDE
|
||||
{
|
||||
return GetSunwellPlateauAI<boss_kalecgosAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
class boss_kalec : public CreatureScript
|
||||
@@ -490,6 +487,7 @@ public:
|
||||
{
|
||||
if (!me->HasAura(AURA_SPECTRAL_INVISIBILITY))
|
||||
me->CastSpell(me, AURA_SPECTRAL_INVISIBILITY, true);
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
@@ -497,26 +495,26 @@ public:
|
||||
{
|
||||
switch (YellSequence)
|
||||
{
|
||||
case 0:
|
||||
Talk(SAY_GOOD_AGGRO);
|
||||
++YellSequence;
|
||||
break;
|
||||
case 1:
|
||||
if (HealthBelowPct(50))
|
||||
{
|
||||
Talk(SAY_GOOD_NEAR_DEATH);
|
||||
case 0:
|
||||
Talk(SAY_GOOD_AGGRO);
|
||||
++YellSequence;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (HealthBelowPct(10))
|
||||
{
|
||||
Talk(SAY_GOOD_NEAR_DEATH2);
|
||||
++YellSequence;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
break;
|
||||
case 1:
|
||||
if (HealthBelowPct(50))
|
||||
{
|
||||
Talk(SAY_GOOD_NEAR_DEATH);
|
||||
++YellSequence;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (HealthBelowPct(10))
|
||||
{
|
||||
Talk(SAY_GOOD_NEAR_DEATH2);
|
||||
++YellSequence;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
YellTimer = 5000;
|
||||
}
|
||||
@@ -610,11 +608,11 @@ public:
|
||||
if (instance)
|
||||
{
|
||||
KalecgosGUID = instance->GetData64(DATA_KALECGOS_DRAGON);
|
||||
instance->SetData(DATA_KALECGOS_EVENT, NOT_STARTED);
|
||||
instance->SetBossState(DATA_KALECGOS, NOT_STARTED);
|
||||
}
|
||||
if (KalecGUID)
|
||||
{
|
||||
if (Creature* Kalec = Unit::GetCreature(*me, KalecGUID))
|
||||
if (Creature* Kalec = ObjectAccessor::GetCreature(*me, KalecGUID))
|
||||
Kalec->setDeathState(JUST_DIED);
|
||||
KalecGUID = 0;
|
||||
}
|
||||
@@ -654,7 +652,7 @@ public:
|
||||
if (target->GetGUID() == KalecGUID)
|
||||
{
|
||||
TeleportAllPlayersBack();
|
||||
if (Creature* Kalecgos = Unit::GetCreature(*me, KalecgosGUID))
|
||||
if (Creature* Kalecgos = ObjectAccessor::GetCreature(*me, KalecgosGUID))
|
||||
{
|
||||
CAST_AI(boss_kalecgos::boss_kalecgosAI, Kalecgos->AI())->TalkTimer = 1;
|
||||
CAST_AI(boss_kalecgos::boss_kalecgosAI, Kalecgos->AI())->isFriendly = false;
|
||||
@@ -670,14 +668,14 @@ public:
|
||||
Talk(SAY_SATH_DEATH);
|
||||
me->SetPosition(me->GetPositionX(), me->GetPositionY(), DRAGON_REALM_Z, me->GetOrientation());
|
||||
TeleportAllPlayersBack();
|
||||
if (Creature* Kalecgos = Unit::GetCreature(*me, KalecgosGUID))
|
||||
if (Creature* Kalecgos = ObjectAccessor::GetCreature(*me, KalecgosGUID))
|
||||
{
|
||||
CAST_AI(boss_kalecgos::boss_kalecgosAI, Kalecgos->AI())->TalkTimer = 1;
|
||||
CAST_AI(boss_kalecgos::boss_kalecgosAI, Kalecgos->AI())->isFriendly = true;
|
||||
}
|
||||
|
||||
if (instance)
|
||||
instance->SetData(DATA_KALECGOS_EVENT, DONE);
|
||||
instance->SetBossState(DATA_KALECGOS, DONE);
|
||||
}
|
||||
|
||||
void TeleportAllPlayersBack()
|
||||
@@ -716,27 +714,28 @@ public:
|
||||
{
|
||||
if (!me->HasAura(AURA_SPECTRAL_INVISIBILITY))
|
||||
me->CastSpell(me, AURA_SPECTRAL_INVISIBILITY, true);
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (CheckTimer <= diff)
|
||||
{
|
||||
Creature* Kalec = Unit::GetCreature(*me, KalecGUID);
|
||||
Creature* Kalec = ObjectAccessor::GetCreature(*me, KalecGUID);
|
||||
if (!Kalec || !Kalec->IsAlive())
|
||||
{
|
||||
if (Creature* Kalecgos = Unit::GetCreature(*me, KalecgosGUID))
|
||||
if (Creature* Kalecgos = ObjectAccessor::GetCreature(*me, KalecgosGUID))
|
||||
Kalecgos->AI()->EnterEvadeMode();
|
||||
return;
|
||||
}
|
||||
|
||||
if (HealthBelowPct(10) && !isEnraged)
|
||||
{
|
||||
if (Creature* Kalecgos = Unit::GetCreature(*me, KalecgosGUID))
|
||||
if (Creature* Kalecgos = ObjectAccessor::GetCreature(*me, KalecgosGUID))
|
||||
Kalecgos->AI()->DoAction(DO_ENRAGE);
|
||||
DoAction(DO_ENRAGE);
|
||||
}
|
||||
|
||||
Creature* Kalecgos = Unit::GetCreature(*me, KalecgosGUID);
|
||||
Creature* Kalecgos = ObjectAccessor::GetCreature(*me, KalecgosGUID);
|
||||
if (Kalecgos && !Kalecgos->IsInCombat())
|
||||
{
|
||||
me->AI()->EnterEvadeMode();
|
||||
@@ -778,7 +777,8 @@ public:
|
||||
|
||||
if (ShadowBoltTimer <= diff)
|
||||
{
|
||||
if (!(rand()%5))Talk(SAY_SATH_SPELL1);
|
||||
if (!(rand()%5))
|
||||
Talk(SAY_SATH_SPELL1);
|
||||
DoCast(me, SPELL_SHADOW_BOLT);
|
||||
ShadowBoltTimer = 7000+(rand()%3000);
|
||||
} else ShadowBoltTimer -= diff;
|
||||
|
||||
@@ -60,7 +60,7 @@ enum Yells
|
||||
SAY_ANVEENA_IMPRISONED = 0,
|
||||
SAY_ANVEENA_LOST = 1,
|
||||
SAY_ANVEENA_KALEC = 2,
|
||||
SAY_ANVEENA_GOODBYE = 3,
|
||||
SAY_ANVEENA_GOODBYE = 3
|
||||
};
|
||||
|
||||
/*** Spells used during the encounter ***/
|
||||
@@ -156,7 +156,7 @@ enum Phase
|
||||
PHASE_NORMAL = 2, // Kil'Jaeden emerges from the sunwell
|
||||
PHASE_DARKNESS = 3, // At 85%, he gains few abilities; Kalecgos joins the fight
|
||||
PHASE_ARMAGEDDON = 4, // At 55%, he gains even more abilities
|
||||
PHASE_SACRIFICE = 5, // At 25%, Anveena sacrifices herself into the Sunwell; at this point he becomes enraged and has *significally* shorter cooldowns.
|
||||
PHASE_SACRIFICE = 5 // At 25%, Anveena sacrifices herself into the Sunwell; at this point he becomes enraged and has *significally* shorter cooldowns.
|
||||
};
|
||||
|
||||
//Timers
|
||||
@@ -185,7 +185,7 @@ Position DeceiverLocations[3]=
|
||||
{
|
||||
{1682.045f, 631.299f, 5.936f, 0.0f},
|
||||
{1684.099f, 618.848f, 0.589f, 0.0f},
|
||||
{1694.170f, 612.272f, 1.416f, 0.0f},
|
||||
{1694.170f, 612.272f, 1.416f, 0.0f}
|
||||
};
|
||||
|
||||
// Locations, where Shield Orbs will spawn
|
||||
@@ -225,7 +225,7 @@ static Speech Speeches[]=
|
||||
{SAY_KJ_PHASE5, DATA_KILJAEDEN, 5500},
|
||||
|
||||
// use in End sequence?
|
||||
{SAY_KALECGOS_GOODBYE, DATA_KALECGOS_KJ, 12000},
|
||||
{SAY_KALECGOS_GOODBYE, DATA_KALECGOS_KJ, 12000}
|
||||
};
|
||||
|
||||
//AI for Kalecgos
|
||||
@@ -271,13 +271,13 @@ public:
|
||||
switch (index)
|
||||
{
|
||||
case 0:
|
||||
return instance->instance->GetGameObject(instance->GetData64(DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_1));
|
||||
return ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_1));
|
||||
case 1:
|
||||
return instance->instance->GetGameObject(instance->GetData64(DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_2));
|
||||
return ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_2));
|
||||
case 2:
|
||||
return instance->instance->GetGameObject(instance->GetData64(DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_3));
|
||||
return ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_3));
|
||||
case 3:
|
||||
return instance->instance->GetGameObject(instance->GetData64(DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_4));
|
||||
return ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_4));
|
||||
}
|
||||
|
||||
return NULL;
|
||||
@@ -368,11 +368,11 @@ public:
|
||||
if (go->GetUInt32Value(GAMEOBJECT_FACTION) == 35)
|
||||
{
|
||||
InstanceScript* instance = go->GetInstanceScript();
|
||||
player->SummonCreature(CREATURE_POWER_OF_THE_BLUE_DRAGONFLIGHT, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 121000);
|
||||
player->SummonCreature(NPC_POWER_OF_THE_BLUE_DRAGONFLIGHT, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 121000);
|
||||
player->CastSpell(player, SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT, false);
|
||||
go->SetUInt32Value(GAMEOBJECT_FACTION, 0);
|
||||
|
||||
if (Creature* pKalec = Unit::GetCreature(*player, instance->GetData64(DATA_KALECGOS_KJ)))
|
||||
if (Creature* pKalec = ObjectAccessor::GetCreature(*player, instance->GetData64(DATA_KALECGOS_KJ)))
|
||||
CAST_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalec->AI())->SetRingOfBlueFlames();
|
||||
|
||||
go->Refresh();
|
||||
@@ -425,7 +425,7 @@ public:
|
||||
phase = PHASE_DECEIVERS;
|
||||
|
||||
if (instance)
|
||||
if (Creature* pKalecKJ = Unit::GetCreature((*me), instance->GetData64(DATA_KALECGOS_KJ)))
|
||||
if (Creature* pKalecKJ = ObjectAccessor::GetCreature((*me), instance->GetData64(DATA_KALECGOS_KJ)))
|
||||
CAST_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalecKJ->AI())->ResetOrbs();
|
||||
deceiverDeathCount = 0;
|
||||
bSummonedDeceivers = false;
|
||||
@@ -438,15 +438,15 @@ public:
|
||||
{
|
||||
switch (summoned->GetEntry())
|
||||
{
|
||||
case CREATURE_HAND_OF_THE_DECEIVER:
|
||||
case NPC_HAND_OF_THE_DECEIVER:
|
||||
summoned->CastSpell(summoned, SPELL_SHADOW_CHANNELING, false);
|
||||
break;
|
||||
case CREATURE_ANVEENA:
|
||||
case NPC_ANVEENA:
|
||||
summoned->SetDisableGravity(true);
|
||||
summoned->CastSpell(summoned, SPELL_ANVEENA_PRISON, true);
|
||||
summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
break;
|
||||
case CREATURE_KILJAEDEN:
|
||||
case NPC_KILJAEDEN:
|
||||
summoned->CastSpell(summoned, SPELL_REBIRTH, false);
|
||||
summoned->AddThreat(me->GetVictim(), 1.0f);
|
||||
break;
|
||||
@@ -458,7 +458,7 @@ public:
|
||||
{
|
||||
if (uiRandomSayTimer < diff)
|
||||
{
|
||||
if (instance && instance->GetData(DATA_MURU_EVENT) != DONE && instance->GetData(DATA_KILJAEDEN_EVENT) == NOT_STARTED)
|
||||
if (instance && instance->GetBossState(DATA_MURU) != DONE && instance->GetBossState(DATA_KILJAEDEN) == NOT_STARTED)
|
||||
Talk(SAY_KJ_OFFCOMBAT);
|
||||
uiRandomSayTimer = 30000;
|
||||
} else uiRandomSayTimer -= diff;
|
||||
@@ -466,9 +466,9 @@ public:
|
||||
if (!bSummonedDeceivers)
|
||||
{
|
||||
for (uint8 i = 0; i < 3; ++i)
|
||||
me->SummonCreature(CREATURE_HAND_OF_THE_DECEIVER, DeceiverLocations[i], TEMPSUMMON_DEAD_DESPAWN, 0);
|
||||
me->SummonCreature(NPC_HAND_OF_THE_DECEIVER, DeceiverLocations[i], TEMPSUMMON_DEAD_DESPAWN, 0);
|
||||
|
||||
DoSpawnCreature(CREATURE_ANVEENA, 0, 0, 40, 0, TEMPSUMMON_DEAD_DESPAWN, 0);
|
||||
DoSpawnCreature(NPC_ANVEENA, 0, 0, 40, 0, TEMPSUMMON_DEAD_DESPAWN, 0);
|
||||
DoCast(me, SPELL_ANVEENA_ENERGY_DRAIN);
|
||||
bSummonedDeceivers = true;
|
||||
}
|
||||
@@ -477,7 +477,7 @@ public:
|
||||
{
|
||||
me->RemoveAurasDueToSpell(SPELL_ANVEENA_ENERGY_DRAIN);
|
||||
phase = PHASE_NORMAL;
|
||||
DoSpawnCreature(CREATURE_KILJAEDEN, 0, 0, 0, 0, TEMPSUMMON_MANUAL_DESPAWN, 0);
|
||||
DoSpawnCreature(NPC_KILJAEDEN, 0, 0, 0, 0, TEMPSUMMON_MANUAL_DESPAWN, 0);
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -489,11 +489,6 @@ class boss_kiljaeden : public CreatureScript
|
||||
public:
|
||||
boss_kiljaeden() : CreatureScript("boss_kiljaeden") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const OVERRIDE
|
||||
{
|
||||
return new boss_kiljaedenAI(creature);
|
||||
}
|
||||
|
||||
struct boss_kiljaedenAI : public ScriptedAI
|
||||
{
|
||||
boss_kiljaedenAI(Creature* creature) : ScriptedAI(creature), summons(me)
|
||||
@@ -559,11 +554,9 @@ public:
|
||||
OrbActivated = false;
|
||||
SpeechBegins = true;
|
||||
|
||||
if (instance)
|
||||
{
|
||||
if (Creature* pKalec = Unit::GetCreature(*me, instance->GetData64(DATA_KALECGOS_KJ)))
|
||||
pKalec->RemoveDynObject(SPELL_RING_OF_BLUE_FLAMES);
|
||||
}
|
||||
if (Creature* pKalec = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_KALECGOS_KJ)))
|
||||
pKalec->RemoveDynObject(SPELL_RING_OF_BLUE_FLAMES);
|
||||
|
||||
me->SetFloatValue(UNIT_FIELD_COMBATREACH, 12);
|
||||
ChangeTimers(false, 0);
|
||||
summons.DespawnAll();
|
||||
@@ -590,7 +583,7 @@ public:
|
||||
|
||||
void JustSummoned(Creature* summoned) OVERRIDE
|
||||
{
|
||||
if (summoned->GetEntry() == CREATURE_ARMAGEDDON_TARGET)
|
||||
if (summoned->GetEntry() == NPC_ARMAGEDDON_TARGET)
|
||||
{
|
||||
summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
@@ -607,9 +600,7 @@ public:
|
||||
{
|
||||
Talk(SAY_KJ_DEATH);
|
||||
summons.DespawnAll();
|
||||
|
||||
if (instance)
|
||||
instance->SetData(DATA_KILJAEDEN_EVENT, DONE);
|
||||
instance->SetBossState(DATA_KILJAEDEN, DONE);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) OVERRIDE
|
||||
@@ -624,11 +615,8 @@ public:
|
||||
summons.DespawnAll();
|
||||
|
||||
// Reset the controller
|
||||
if (instance)
|
||||
{
|
||||
if (Creature* pControl = Unit::GetCreature(*me, instance->GetData64(DATA_KILJAEDEN_CONTROLLER)))
|
||||
CAST_AI(npc_kiljaeden_controller::npc_kiljaeden_controllerAI, pControl->AI())->Reset();
|
||||
}
|
||||
if (Creature* pControl = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_KILJAEDEN_CONTROLLER)))
|
||||
CAST_AI(npc_kiljaeden_controller::npc_kiljaeden_controllerAI, pControl->AI())->Reset();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) OVERRIDE
|
||||
@@ -657,7 +645,7 @@ public:
|
||||
{
|
||||
float x, y, z;
|
||||
target->GetPosition(x, y, z);
|
||||
if (Creature* pSinisterReflection = me->SummonCreature(CREATURE_SINISTER_REFLECTION, x, y, z, 0, TEMPSUMMON_CORPSE_DESPAWN, 0))
|
||||
if (Creature* pSinisterReflection = me->SummonCreature(NPC_SINISTER_REFLECTION, x, y, z, 0, TEMPSUMMON_CORPSE_DESPAWN, 0))
|
||||
{
|
||||
pSinisterReflection->SetDisplayId(target->GetDisplayId());
|
||||
pSinisterReflection->AI()->AttackStart(target);
|
||||
@@ -709,15 +697,12 @@ public:
|
||||
if (Speeches[speechCount].timer < SpeechTimer)
|
||||
{
|
||||
SpeechTimer = 0;
|
||||
if (instance)
|
||||
{
|
||||
if (Creature* speechCreature = Unit::GetCreature(*me, instance->GetData64(Speeches[speechCount].creature)))
|
||||
speechCreature->AI()->Talk(Speeches[speechCount].textid);
|
||||
if (speechCount == 12)
|
||||
if (Creature* pAnveena = Unit::GetCreature(*me, instance->GetData64(DATA_ANVEENA)))
|
||||
pAnveena->CastSpell(me, SPELL_SACRIFICE_OF_ANVEENA, false);
|
||||
// ChangeTimers(true, 10000); // Kil should do an emote while screaming without attacking for 10 seconds
|
||||
}
|
||||
if (Creature* speechCreature = ObjectAccessor::GetCreature(*me, instance->GetData64(Speeches[speechCount].creature)))
|
||||
speechCreature->AI()->Talk(Speeches[speechCount].textid);
|
||||
if (speechCount == 12)
|
||||
if (Creature* pAnveena = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ANVEENA)))
|
||||
pAnveena->CastSpell(me, SPELL_SACRIFICE_OF_ANVEENA, false);
|
||||
// ChangeTimers(true, 10000); // Kil should do an emote while screaming without attacking for 10 seconds
|
||||
if (speechCount == speechPhaseEnd)
|
||||
TimerIsDeactivated[TIMER_SPEECH]=true;
|
||||
speechCount++;
|
||||
@@ -769,7 +754,7 @@ public:
|
||||
float sx, sy;
|
||||
sx = ShieldOrbLocations[0][0] + std::sin(ShieldOrbLocations[i][0]);
|
||||
sy = ShieldOrbLocations[0][1] + std::sin(ShieldOrbLocations[i][1]);
|
||||
me->SummonCreature(CREATURE_SHIELD_ORB, sx, sy, SHIELD_ORB_Z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 45000);
|
||||
me->SummonCreature(NPC_SHIELD_ORB, sx, sy, SHIELD_ORB_Z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 45000);
|
||||
}
|
||||
Timer[TIMER_SUMMON_SHILEDORB] = urand(30000, 60000); // 30-60seconds cooldown
|
||||
Timer[TIMER_SOUL_FLAY] = 2000;
|
||||
@@ -814,19 +799,18 @@ public:
|
||||
}
|
||||
break;
|
||||
case TIMER_ORBS_EMPOWER: //Phase 3
|
||||
if (instance)
|
||||
if (Creature* pKalec = Unit::GetCreature(*me, instance->GetData64(DATA_KALECGOS_KJ)))
|
||||
if (Creature* pKalec = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_KALECGOS_KJ)))
|
||||
{
|
||||
switch (Phase)
|
||||
{
|
||||
switch (Phase)
|
||||
{
|
||||
case PHASE_SACRIFICE:
|
||||
CAST_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalec->AI())->EmpowerOrb(true);
|
||||
break;
|
||||
default:
|
||||
CAST_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalec->AI())->EmpowerOrb(false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
OrbActivated = true;
|
||||
TimerIsDeactivated[TIMER_ORBS_EMPOWER] = true;
|
||||
break;
|
||||
@@ -841,7 +825,7 @@ public:
|
||||
{
|
||||
float x, y, z;
|
||||
target->GetPosition(x, y, z);
|
||||
me->SummonCreature(CREATURE_ARMAGEDDON_TARGET, x, y, z, 0, TEMPSUMMON_TIMED_DESPAWN, 15000);
|
||||
me->SummonCreature(NPC_ARMAGEDDON_TARGET, x, y, z, 0, TEMPSUMMON_TIMED_DESPAWN, 15000);
|
||||
}
|
||||
Timer[TIMER_ARMAGEDDON] = 2000; // No, I'm not kidding
|
||||
break;
|
||||
@@ -893,6 +877,11 @@ public:
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const OVERRIDE
|
||||
{
|
||||
return GetSunwellPlateauAI<boss_kiljaedenAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
//AI for Hand of the Deceiver
|
||||
@@ -901,11 +890,6 @@ class npc_hand_of_the_deceiver : public CreatureScript
|
||||
public:
|
||||
npc_hand_of_the_deceiver() : CreatureScript("npc_hand_of_the_deceiver") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const OVERRIDE
|
||||
{
|
||||
return new npc_hand_of_the_deceiverAI(creature);
|
||||
}
|
||||
|
||||
struct npc_hand_of_the_deceiverAI : public ScriptedAI
|
||||
{
|
||||
npc_hand_of_the_deceiverAI(Creature* creature) : ScriptedAI(creature)
|
||||
@@ -923,8 +907,7 @@ public:
|
||||
/// @todo Timers!
|
||||
ShadowBoltVolleyTimer = urand(8000, 14000); // So they don't all cast it in the same moment.
|
||||
FelfirePortalTimer = 20000;
|
||||
if (instance)
|
||||
instance->SetData(DATA_KILJAEDEN_EVENT, NOT_STARTED);
|
||||
instance->SetBossState(DATA_KILJAEDEN, NOT_STARTED);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summoned) OVERRIDE
|
||||
@@ -935,12 +918,10 @@ public:
|
||||
|
||||
void EnterCombat(Unit* who) OVERRIDE
|
||||
{
|
||||
if (instance)
|
||||
{
|
||||
instance->SetData(DATA_KILJAEDEN_EVENT, IN_PROGRESS);
|
||||
if (Creature* pControl = Unit::GetCreature(*me, instance->GetData64(DATA_KILJAEDEN_CONTROLLER)))
|
||||
pControl->AddThreat(who, 1.0f);
|
||||
}
|
||||
instance->SetBossState(DATA_KILJAEDEN, IN_PROGRESS);
|
||||
if (Creature* pControl = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_KILJAEDEN_CONTROLLER)))
|
||||
pControl->AddThreat(who, 1.0f);
|
||||
|
||||
me->InterruptNonMeleeSpells(true);
|
||||
}
|
||||
|
||||
@@ -949,7 +930,7 @@ public:
|
||||
if (!instance)
|
||||
return;
|
||||
|
||||
if (Creature* pControl = Unit::GetCreature(*me, instance->GetData64(DATA_KILJAEDEN_CONTROLLER)))
|
||||
if (Creature* pControl = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_KILJAEDEN_CONTROLLER)))
|
||||
++(CAST_AI(npc_kiljaeden_controller::npc_kiljaeden_controllerAI, pControl->AI())->deceiverDeathCount);
|
||||
}
|
||||
|
||||
@@ -977,7 +958,7 @@ public:
|
||||
// Felfire Portal - Creatres a portal, that spawns Volatile Felfire Fiends, which do suicide bombing.
|
||||
if (FelfirePortalTimer <= diff)
|
||||
{
|
||||
if (Creature* pPortal = DoSpawnCreature(CREATURE_FELFIRE_PORTAL, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 20000))
|
||||
if (Creature* pPortal = DoSpawnCreature(NPC_FELFIRE_PORTAL, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 20000))
|
||||
{
|
||||
ThreatContainer::StorageType const &threatlist = me->getThreatManager().getThreatList();
|
||||
for (ThreatContainer::StorageType::const_iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr)
|
||||
@@ -993,6 +974,11 @@ public:
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const OVERRIDE
|
||||
{
|
||||
return GetSunwellPlateauAI<npc_hand_of_the_deceiverAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
//AI for Felfire Portal
|
||||
@@ -1034,7 +1020,7 @@ public:
|
||||
|
||||
if (uiSpawnFiendTimer <= diff)
|
||||
{
|
||||
if (Creature* pFiend = DoSpawnCreature(CREATURE_VOLATILE_FELFIRE_FIEND, 0, 0, 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 20000))
|
||||
if (Creature* pFiend = DoSpawnCreature(NPC_VOLATILE_FELFIRE_FIEND, 0, 0, 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 20000))
|
||||
pFiend->AddThreat(SelectTarget(SELECT_TARGET_RANDOM, 0), 100000.0f);
|
||||
uiSpawnFiendTimer = urand(4000, 8000);
|
||||
} else uiSpawnFiendTimer -= diff;
|
||||
|
||||
@@ -30,55 +30,56 @@ SDComment: all sounds, black hole effect triggers to often (46228)
|
||||
// Muru & Entropius's spells
|
||||
enum Spells
|
||||
{
|
||||
SPELL_ENRAGE = 26662,
|
||||
SPELL_ENRAGE = 26662,
|
||||
|
||||
// Muru's spells
|
||||
SPELL_NEGATIVE_ENERGY = 46009, //(this trigger 46008)
|
||||
SPELL_DARKNESS = 45999,
|
||||
SPELL_OPEN_ALL_PORTALS = 46177,
|
||||
SPELL_DARKNESS = 45999,
|
||||
SPELL_OPEN_ALL_PORTALS = 46177,
|
||||
SPELL_OPEN_PORTAL = 45977,
|
||||
SPELL_OPEN_PORTAL_2 = 45976,
|
||||
SPELL_SUMMON_BERSERKER = 46037,
|
||||
SPELL_SUMNON_FURY_MAGE = 46038,
|
||||
SPELL_SUMMON_VOID_SENTINEL = 45988,
|
||||
SPELL_SUMMON_ENTROPIUS = 46217,
|
||||
SPELL_OPEN_PORTAL_2 = 45976,
|
||||
SPELL_SUMMON_BERSERKER = 46037,
|
||||
SPELL_SUMNON_FURY_MAGE = 46038,
|
||||
SPELL_SUMMON_VOID_SENTINEL = 45988,
|
||||
SPELL_SUMMON_ENTROPIUS = 46217,
|
||||
|
||||
// Entropius's spells
|
||||
SPELL_DARKNESS_E = 46269,
|
||||
SPELL_BLACKHOLE = 46282,
|
||||
SPELL_NEGATIVE_ENERGY_E = 46284,
|
||||
SPELL_DARKNESS_E = 46269,
|
||||
SPELL_BLACKHOLE = 46282,
|
||||
SPELL_NEGATIVE_ENERGY_E = 46284,
|
||||
SPELL_ENTROPIUS_SPAWN = 46223,
|
||||
|
||||
// Shadowsword Berserker's spells
|
||||
SPELL_FLURRY = 46160,
|
||||
SPELL_DUAL_WIELD = 29651,
|
||||
SPELL_FLURRY = 46160,
|
||||
SPELL_DUAL_WIELD = 29651,
|
||||
|
||||
// Shadowsword Fury Mage's spells
|
||||
SPELL_FEL_FIREBALL = 46101,
|
||||
SPELL_SPELL_FURY = 46102,
|
||||
SPELL_FEL_FIREBALL = 46101,
|
||||
SPELL_SPELL_FURY = 46102,
|
||||
|
||||
// Void Sentinel's spells
|
||||
SPELL_SHADOW_PULSE = 46087,
|
||||
SPELL_VOID_BLAST = 46161,
|
||||
SPELL_SHADOW_PULSE = 46087,
|
||||
SPELL_VOID_BLAST = 46161,
|
||||
|
||||
// Void Spawn's spells
|
||||
SPELL_SHADOW_BOLT_VOLLEY = 46082,
|
||||
SPELL_SHADOW_BOLT_VOLLEY = 46082,
|
||||
|
||||
//Dark Fiend Spells
|
||||
SPELL_DARKFIEND_AOE = 45944,
|
||||
SPELL_DARKFIEND_VISUAL = 45936,
|
||||
SPELL_DARKFIEND_SKIN = 45934,
|
||||
SPELL_DARKFIEND_AOE = 45944,
|
||||
SPELL_DARKFIEND_VISUAL = 45936,
|
||||
SPELL_DARKFIEND_SKIN = 45934,
|
||||
|
||||
//Black Hole Spells
|
||||
SPELL_BLACKHOLE_SPAWN = 46242,
|
||||
SPELL_BLACKHOLE_GROW = 46228
|
||||
SPELL_BLACKHOLE_GROW = 46228
|
||||
};
|
||||
|
||||
enum BossTimers{
|
||||
TIMER_DARKNESS = 0,
|
||||
TIMER_HUMANOIDES = 1,
|
||||
TIMER_PHASE = 2,
|
||||
TIMER_SENTINEL = 3
|
||||
enum BossTimers
|
||||
{
|
||||
TIMER_DARKNESS = 0,
|
||||
TIMER_HUMANOIDES = 1,
|
||||
TIMER_PHASE = 2,
|
||||
TIMER_SENTINEL = 3
|
||||
};
|
||||
|
||||
float DarkFiends[8][4] =
|
||||
@@ -88,32 +89,28 @@ float DarkFiends[8][4] =
|
||||
{1801.98f, 633.62f, 69.74f, 5.71f},
|
||||
{1830.88f, 629.99f, 69.73f, 3.52f},
|
||||
{1800.38f, 621.41f, 69.74f, 0.22f},
|
||||
{1808.3f, 612.45f, 69.73f, 1.02f},
|
||||
{1823.9f, 639.69f, 69.74f, 4.12f},
|
||||
{1808.3f, 612.45f, 69.73f, 1.02f},
|
||||
{1823.9f, 639.69f, 69.74f, 4.12f},
|
||||
{1811.85f, 640.46f, 69.73f, 4.97f}
|
||||
};
|
||||
|
||||
float Humanoides[6][5] =
|
||||
{
|
||||
{CREATURE_FURY_MAGE, 1780.16f, 666.83f, 71.19f, 5.21f},
|
||||
{CREATURE_FURY_MAGE, 1847.93f, 600.30f, 71.30f, 2.57f},
|
||||
{CREATURE_BERSERKER, 1779.97f, 660.64f, 71.19f, 5.28f},
|
||||
{CREATURE_BERSERKER, 1786.2f, 661.01f, 71.19f, 4.51f},
|
||||
{CREATURE_BERSERKER, 1845.17f, 602.63f, 71.28f, 2.43f},
|
||||
{CREATURE_BERSERKER, 1842.91f, 599.93f, 71.23f, 2.44f}
|
||||
{NPC_FURY_MAGE, 1780.16f, 666.83f, 71.19f, 5.21f},
|
||||
{NPC_FURY_MAGE, 1847.93f, 600.30f, 71.30f, 2.57f},
|
||||
{NPC_BERSERKER, 1779.97f, 660.64f, 71.19f, 5.28f},
|
||||
{NPC_BERSERKER, 1786.2f, 661.01f, 71.19f, 4.51f},
|
||||
{NPC_BERSERKER, 1845.17f, 602.63f, 71.28f, 2.43f},
|
||||
{NPC_BERSERKER, 1842.91f, 599.93f, 71.23f, 2.44f}
|
||||
};
|
||||
|
||||
uint32 EnrageTimer = 600000;
|
||||
|
||||
class boss_entropius : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_entropius() : CreatureScript("boss_entropius") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const OVERRIDE
|
||||
{
|
||||
return new boss_entropiusAI(creature);
|
||||
}
|
||||
|
||||
struct boss_entropiusAI : public ScriptedAI
|
||||
{
|
||||
boss_entropiusAI(Creature* creature) : ScriptedAI(creature), Summons(me)
|
||||
@@ -133,8 +130,7 @@ public:
|
||||
|
||||
Summons.DespawnAll();
|
||||
|
||||
if (instance)
|
||||
instance->SetData(DATA_MURU_EVENT, NOT_STARTED);
|
||||
instance->SetBossState(DATA_MURU, NOT_STARTED);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) OVERRIDE
|
||||
@@ -142,22 +138,21 @@ public:
|
||||
DoCastAOE(SPELL_NEGATIVE_ENERGY_E, true);
|
||||
DoCast(me, SPELL_ENTROPIUS_SPAWN, false);
|
||||
|
||||
if (instance)
|
||||
instance->SetData(DATA_MURU_EVENT, IN_PROGRESS);
|
||||
instance->SetBossState(DATA_MURU, IN_PROGRESS);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summoned) OVERRIDE
|
||||
{
|
||||
switch (summoned->GetEntry())
|
||||
{
|
||||
case CREATURE_DARK_FIENDS:
|
||||
case NPC_DARK_FIENDS:
|
||||
summoned->CastSpell(summoned, SPELL_DARKFIEND_VISUAL, false);
|
||||
break;
|
||||
case CREATURE_DARKNESS:
|
||||
case NPC_DARKNESS:
|
||||
summoned->AddUnitState(UNIT_STATE_STUNNED);
|
||||
float x, y, z, o;
|
||||
summoned->GetHomePosition(x, y, z, o);
|
||||
me->SummonCreature(CREATURE_DARK_FIENDS, x, y, z, o, TEMPSUMMON_CORPSE_DESPAWN, 0);
|
||||
me->SummonCreature(NPC_DARK_FIENDS, x, y, z, o, TEMPSUMMON_CORPSE_DESPAWN, 0);
|
||||
break;
|
||||
}
|
||||
summoned->AI()->AttackStart(SelectTarget(SELECT_TARGET_RANDOM, 0, 50, true));
|
||||
@@ -167,9 +162,7 @@ public:
|
||||
void JustDied(Unit* /*killer*/) OVERRIDE
|
||||
{
|
||||
Summons.DespawnAll();
|
||||
|
||||
if (instance)
|
||||
instance->SetData(DATA_MURU_EVENT, DONE);
|
||||
instance->SetBossState(DATA_MURU, DONE);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) OVERRIDE
|
||||
@@ -201,6 +194,11 @@ public:
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const OVERRIDE
|
||||
{
|
||||
return GetSunwellPlateauAI<boss_entropiusAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
class boss_muru : public CreatureScript
|
||||
@@ -208,11 +206,6 @@ class boss_muru : public CreatureScript
|
||||
public:
|
||||
boss_muru() : CreatureScript("boss_muru") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const OVERRIDE
|
||||
{
|
||||
return new boss_muruAI(creature);
|
||||
}
|
||||
|
||||
struct boss_muruAI : public ScriptedAI
|
||||
{
|
||||
boss_muruAI(Creature* creature) : ScriptedAI(creature), Summons(creature)
|
||||
@@ -244,17 +237,13 @@ public:
|
||||
me->SetVisible(true);
|
||||
|
||||
Summons.DespawnAll();
|
||||
|
||||
if (instance)
|
||||
instance->SetData(DATA_MURU_EVENT, NOT_STARTED);
|
||||
instance->SetBossState(DATA_MURU, NOT_STARTED);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) OVERRIDE
|
||||
{
|
||||
DoCastAOE(SPELL_NEGATIVE_ENERGY, false);
|
||||
|
||||
if (instance)
|
||||
instance->SetData(DATA_MURU_EVENT, IN_PROGRESS);
|
||||
instance->SetBossState(DATA_MURU, IN_PROGRESS);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* /*done_by*/, uint32 &damage) OVERRIDE
|
||||
@@ -275,10 +264,10 @@ public:
|
||||
{
|
||||
switch (summoned->GetEntry())
|
||||
{
|
||||
case BOSS_ENTROPIUS:
|
||||
case NPC_ENTROPIUS:
|
||||
me->SetVisible(false);
|
||||
break;
|
||||
case CREATURE_DARK_FIENDS:
|
||||
case NPC_DARK_FIENDS:
|
||||
summoned->CastSpell(summoned, SPELL_DARKFIEND_VISUAL, false);
|
||||
break;
|
||||
}
|
||||
@@ -295,9 +284,7 @@ public:
|
||||
{
|
||||
if (Timer[TIMER_PHASE] <= diff)
|
||||
{
|
||||
if (!instance)
|
||||
return;
|
||||
switch (instance->GetData(DATA_MURU_EVENT))
|
||||
switch (instance->GetBossState(DATA_MURU))
|
||||
{
|
||||
case NOT_STARTED:
|
||||
Reset();
|
||||
@@ -334,7 +321,7 @@ public:
|
||||
{
|
||||
DarkFiend = false;
|
||||
for (uint8 j = 0; j < 8; ++j)
|
||||
me->SummonCreature(CREATURE_DARK_FIENDS, DarkFiends[j][0], DarkFiends[j][1], DarkFiends[j][2], DarkFiends[j][3], TEMPSUMMON_CORPSE_DESPAWN, 0);
|
||||
me->SummonCreature(NPC_DARK_FIENDS, DarkFiends[j][0], DarkFiends[j][1], DarkFiends[j][2], DarkFiends[j][3], TEMPSUMMON_CORPSE_DESPAWN, 0);
|
||||
Timer[TIMER_DARKNESS] = 42000;
|
||||
}
|
||||
break;
|
||||
@@ -358,14 +345,21 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
//Timer
|
||||
// Timer
|
||||
for (uint8 i = 0; i < 4; ++i)
|
||||
{
|
||||
if (i != TIMER_PHASE)Timer[i] -= diff;
|
||||
else if (Phase == 2) Timer[i] -= diff;
|
||||
if (i != TIMER_PHASE)
|
||||
Timer[i] -= diff;
|
||||
else if (Phase == 2)
|
||||
Timer[i] -= diff;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const OVERRIDE
|
||||
{
|
||||
return GetSunwellPlateauAI<boss_muruAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
class npc_muru_portal : public CreatureScript
|
||||
@@ -438,7 +432,7 @@ public:
|
||||
{
|
||||
if (!SummonSentinel)
|
||||
{
|
||||
if (InAction && instance && instance->GetData(DATA_MURU_EVENT) == NOT_STARTED)
|
||||
if (InAction && instance && instance->GetBossState(DATA_MURU) == NOT_STARTED)
|
||||
Reset();
|
||||
return;
|
||||
}
|
||||
@@ -525,7 +519,7 @@ public:
|
||||
|
||||
struct npc_void_sentinelAI : public ScriptedAI
|
||||
{
|
||||
npc_void_sentinelAI(Creature* creature) : ScriptedAI(creature){ }
|
||||
npc_void_sentinelAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
|
||||
uint32 PulseTimer;
|
||||
uint32 VoidBlastTimer;
|
||||
@@ -543,7 +537,7 @@ public:
|
||||
void JustDied(Unit* /*killer*/) OVERRIDE
|
||||
{
|
||||
for (uint8 i = 0; i < 8; ++i)
|
||||
me->SummonCreature(CREATURE_VOID_SPAWN, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), float(rand()%6), TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 180000);
|
||||
me->SummonCreature(NPC_VOID_SPAWN, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), float(rand()%6), TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 180000);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) OVERRIDE
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
|
||||
* Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
@@ -16,19 +15,10 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* ScriptData
|
||||
SDName: Instance_Sunwell_Plateau
|
||||
SD%Complete: 25
|
||||
SDComment: VERIFY SCRIPT
|
||||
SDCategory: Sunwell_Plateau
|
||||
EndScriptData */
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "InstanceScript.h"
|
||||
#include "sunwell_plateau.h"
|
||||
#include "Player.h"
|
||||
|
||||
#define MAX_ENCOUNTER 6
|
||||
#include "sunwell_plateau.h"
|
||||
|
||||
/* Sunwell Plateau:
|
||||
0 - Kalecgos and Sathrovarr
|
||||
@@ -39,268 +29,256 @@ EndScriptData */
|
||||
5 - Kil'Jaeden
|
||||
*/
|
||||
|
||||
DoorData const doorData[] =
|
||||
{
|
||||
{ GO_FIRE_BARRIER, DATA_FELMYST, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
|
||||
{ GO_MURUS_GATE_1, DATA_MURU, DOOR_TYPE_ROOM, BOUNDARY_NONE },
|
||||
{ GO_MURUS_GATE_2, DATA_MURU, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
|
||||
{ GO_BOSS_COLLISION_1, DATA_KALECGOS, DOOR_TYPE_DOOR, BOUNDARY_NONE },
|
||||
{ GO_BOSS_COLLISION_2, DATA_KALECGOS, DOOR_TYPE_DOOR, BOUNDARY_NONE },
|
||||
{ GO_FORCE_FIELD, DATA_KALECGOS, DOOR_TYPE_DOOR, BOUNDARY_NONE },
|
||||
{ 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
|
||||
};
|
||||
|
||||
class instance_sunwell_plateau : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
instance_sunwell_plateau() : InstanceMapScript("instance_sunwell_plateau", 580) { }
|
||||
public:
|
||||
instance_sunwell_plateau() : InstanceMapScript(SunwellPlateauScriptName, 580) { }
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
|
||||
{
|
||||
return new instance_sunwell_plateau_InstanceMapScript(map);
|
||||
}
|
||||
|
||||
struct instance_sunwell_plateau_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_sunwell_plateau_InstanceMapScript(Map* map) : InstanceScript(map) { }
|
||||
|
||||
uint32 m_auiEncounter[MAX_ENCOUNTER];
|
||||
|
||||
/** Creatures **/
|
||||
uint64 Kalecgos_Dragon;
|
||||
uint64 Kalecgos_Human;
|
||||
uint64 Sathrovarr;
|
||||
uint64 Brutallus;
|
||||
uint64 Madrigosa;
|
||||
uint64 Felmyst;
|
||||
uint64 Alythess;
|
||||
uint64 Sacrolash;
|
||||
uint64 Muru;
|
||||
uint64 KilJaeden;
|
||||
uint64 KilJaedenController;
|
||||
uint64 Anveena;
|
||||
uint64 KalecgosKJ;
|
||||
uint32 SpectralPlayers;
|
||||
|
||||
/** GameObjects **/
|
||||
uint64 ForceField; // Kalecgos Encounter
|
||||
uint64 KalecgosWall[2];
|
||||
uint64 FireBarrier; // Felmysts Encounter
|
||||
uint64 MurusGate[2]; // Murus Encounter
|
||||
|
||||
/*** Misc ***/
|
||||
uint32 SpectralRealmTimer;
|
||||
std::vector<uint64> SpectralRealmList;
|
||||
|
||||
void Initialize() OVERRIDE
|
||||
struct instance_sunwell_plateau_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
|
||||
|
||||
/*** Creatures ***/
|
||||
Kalecgos_Dragon = 0;
|
||||
Kalecgos_Human = 0;
|
||||
Sathrovarr = 0;
|
||||
Brutallus = 0;
|
||||
Madrigosa = 0;
|
||||
Felmyst = 0;
|
||||
Alythess = 0;
|
||||
Sacrolash = 0;
|
||||
Muru = 0;
|
||||
KilJaeden = 0;
|
||||
KilJaedenController = 0;
|
||||
Anveena = 0;
|
||||
KalecgosKJ = 0;
|
||||
SpectralPlayers = 0;
|
||||
|
||||
/*** GameObjects ***/
|
||||
ForceField = 0;
|
||||
FireBarrier = 0;
|
||||
MurusGate[0] = 0;
|
||||
MurusGate[1] = 0;
|
||||
KalecgosWall[0] = 0;
|
||||
KalecgosWall[1] = 0;
|
||||
|
||||
/*** Misc ***/
|
||||
SpectralRealmTimer = 5000;
|
||||
}
|
||||
|
||||
bool IsEncounterInProgress() const OVERRIDE
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
if (m_auiEncounter[i] == IN_PROGRESS)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
Player const* GetPlayerInMap() const
|
||||
{
|
||||
Map::PlayerList const& players = instance->GetPlayers();
|
||||
|
||||
if (!players.isEmpty())
|
||||
instance_sunwell_plateau_InstanceMapScript(Map* map) : InstanceScript(map)
|
||||
{
|
||||
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
|
||||
SetBossNumber(EncounterCount);
|
||||
LoadDoorData(doorData);
|
||||
|
||||
KalecgosDragonGUID = 0;
|
||||
KalecgosHumanGUID = 0;
|
||||
SathrovarrGUID = 0;
|
||||
BrutallusGUID = 0;
|
||||
MadrigosaGUID = 0;
|
||||
FelmystGUID = 0;
|
||||
AlythessGUID = 0;
|
||||
SacrolashGUID = 0;
|
||||
MuruGUID = 0;
|
||||
KilJaedenGUID = 0;
|
||||
KilJaedenControllerGUID = 0;
|
||||
AnveenaGUID = 0;
|
||||
KalecgosKjGUID = 0;
|
||||
SpectralPlayers = 0;
|
||||
|
||||
SpectralRealmTimer = 5000;
|
||||
}
|
||||
|
||||
Player const* GetPlayerInMap() const
|
||||
{
|
||||
Map::PlayerList const& players = instance->GetPlayers();
|
||||
|
||||
if (!players.isEmpty())
|
||||
{
|
||||
Player* player = itr->GetSource();
|
||||
if (player && !player->HasAura(45839, 0))
|
||||
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
|
||||
{
|
||||
Player* player = itr->GetSource();
|
||||
if (player && !player->HasAura(45839, 0))
|
||||
return player;
|
||||
}
|
||||
}
|
||||
else
|
||||
TC_LOG_DEBUG("scripts", "Instance Sunwell Plateau: GetPlayerInMap, but PlayerList is empty!");
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature* creature) OVERRIDE
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
case NPC_KALECGOS:
|
||||
KalecgosDragonGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_KALEC:
|
||||
KalecgosHumanGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_SATHROVARR:
|
||||
SathrovarrGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_BRUTALLUS:
|
||||
BrutallusGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_MADRIGOSA:
|
||||
MadrigosaGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_FELMYST:
|
||||
FelmystGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_GRAND_WARLOCK_ALYTHESS:
|
||||
AlythessGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_LADY_SACROLASH:
|
||||
SacrolashGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_MURU:
|
||||
MuruGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_KILJAEDEN:
|
||||
KilJaedenGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_KILJAEDEN_CONTROLLER:
|
||||
KilJaedenControllerGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_ANVEENA:
|
||||
AnveenaGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_KALECGOS_KJ:
|
||||
KalecgosKjGUID = creature->GetGUID();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
TC_LOG_DEBUG("scripts", "Instance Sunwell Plateau: GetPlayerInMap, but PlayerList is empty!");
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature* creature) OVERRIDE
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
void OnGameObjectCreate(GameObject* go) OVERRIDE
|
||||
{
|
||||
case 24850: Kalecgos_Dragon = creature->GetGUID(); break;
|
||||
case 24891: Kalecgos_Human = creature->GetGUID(); break;
|
||||
case 24892: Sathrovarr = creature->GetGUID(); break;
|
||||
case 24882: Brutallus = creature->GetGUID(); break;
|
||||
case 24895: Madrigosa = creature->GetGUID(); break;
|
||||
case 25038: Felmyst = creature->GetGUID(); break;
|
||||
case 25166: Alythess = creature->GetGUID(); break;
|
||||
case 25165: Sacrolash = creature->GetGUID(); break;
|
||||
case 25741: Muru = creature->GetGUID(); break;
|
||||
case 25315: KilJaeden = creature->GetGUID(); break;
|
||||
case 25608: KilJaedenController = creature->GetGUID(); break;
|
||||
case 26046: Anveena = creature->GetGUID(); break;
|
||||
case 25319: KalecgosKJ = creature->GetGUID(); break;
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_FORCE_FIELD:
|
||||
case GO_BOSS_COLLISION_1:
|
||||
case GO_BOSS_COLLISION_2:
|
||||
case GO_FIRE_BARRIER:
|
||||
case GO_MURUS_GATE_1:
|
||||
case GO_MURUS_GATE_2:
|
||||
AddDoor(go, true);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* go) OVERRIDE
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
void OnGameObjectRemove(GameObject* go) OVERRIDE
|
||||
{
|
||||
case 188421: ForceField = go->GetGUID(); break;
|
||||
case 188523: KalecgosWall[0] = go->GetGUID(); break;
|
||||
case 188524: KalecgosWall[0] = go->GetGUID(); break;
|
||||
case 188075:
|
||||
if (m_auiEncounter[2] == DONE)
|
||||
HandleGameObject(0, true, go);
|
||||
FireBarrier = go->GetGUID();
|
||||
break;
|
||||
case 187990: MurusGate[0] = go->GetGUID(); break;
|
||||
case 188118:
|
||||
if (m_auiEncounter[4] == DONE)
|
||||
HandleGameObject(0, true, go);
|
||||
MurusGate[1]= go->GetGUID();
|
||||
break;
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_FIRE_BARRIER:
|
||||
case GO_MURUS_GATE_1:
|
||||
case GO_MURUS_GATE_2:
|
||||
case GO_BOSS_COLLISION_1:
|
||||
case GO_BOSS_COLLISION_2:
|
||||
case GO_FORCE_FIELD:
|
||||
AddDoor(go, false);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 id) const OVERRIDE
|
||||
{
|
||||
switch (id)
|
||||
uint64 GetData64(uint32 id) const OVERRIDE
|
||||
{
|
||||
case DATA_KALECGOS_EVENT: return m_auiEncounter[0];
|
||||
case DATA_BRUTALLUS_EVENT: return m_auiEncounter[1];
|
||||
case DATA_FELMYST_EVENT: return m_auiEncounter[2];
|
||||
case DATA_EREDAR_TWINS_EVENT: return m_auiEncounter[3];
|
||||
case DATA_MURU_EVENT: return m_auiEncounter[4];
|
||||
case DATA_KILJAEDEN_EVENT: return m_auiEncounter[5];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint64 GetData64(uint32 id) const OVERRIDE
|
||||
{
|
||||
switch (id)
|
||||
{
|
||||
case DATA_KALECGOS_DRAGON: return Kalecgos_Dragon;
|
||||
case DATA_KALECGOS_HUMAN: return Kalecgos_Human;
|
||||
case DATA_SATHROVARR: return Sathrovarr;
|
||||
case DATA_GO_FORCEFIELD: return ForceField;
|
||||
case DATA_BRUTALLUS: return Brutallus;
|
||||
case DATA_MADRIGOSA: return Madrigosa;
|
||||
case DATA_FELMYST: return Felmyst;
|
||||
case DATA_ALYTHESS: return Alythess;
|
||||
case DATA_SACROLASH: return Sacrolash;
|
||||
case DATA_MURU: return Muru;
|
||||
case DATA_KILJAEDEN: return KilJaeden;
|
||||
case DATA_KILJAEDEN_CONTROLLER: return KilJaedenController;
|
||||
case DATA_ANVEENA: return Anveena;
|
||||
case DATA_KALECGOS_KJ: return KalecgosKJ;
|
||||
case DATA_PLAYER_GUID:
|
||||
Player const* target = GetPlayerInMap();
|
||||
return target ? target->GetGUID() : 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void SetData(uint32 id, uint32 data) OVERRIDE
|
||||
{
|
||||
switch (id)
|
||||
{
|
||||
case DATA_KALECGOS_EVENT:
|
||||
switch (id)
|
||||
{
|
||||
case DATA_KALECGOS_DRAGON:
|
||||
return KalecgosDragonGUID;
|
||||
case DATA_KALECGOS_HUMAN:
|
||||
return KalecgosHumanGUID;
|
||||
case DATA_SATHROVARR:
|
||||
return SathrovarrGUID;
|
||||
case DATA_BRUTALLUS:
|
||||
return BrutallusGUID;
|
||||
case DATA_MADRIGOSA:
|
||||
return MadrigosaGUID;
|
||||
case DATA_FELMYST:
|
||||
return FelmystGUID;
|
||||
case DATA_ALYTHESS:
|
||||
return AlythessGUID;
|
||||
case DATA_SACROLASH:
|
||||
return SacrolashGUID;
|
||||
case DATA_MURU:
|
||||
return MuruGUID;
|
||||
case DATA_KILJAEDEN:
|
||||
return KilJaedenGUID;
|
||||
case DATA_KILJAEDEN_CONTROLLER:
|
||||
return KilJaedenControllerGUID;
|
||||
case DATA_ANVEENA:
|
||||
return AnveenaGUID;
|
||||
case DATA_KALECGOS_KJ:
|
||||
return KalecgosKjGUID;
|
||||
case DATA_PLAYER_GUID:
|
||||
{
|
||||
if (data == NOT_STARTED || data == DONE)
|
||||
{
|
||||
HandleGameObject(ForceField, true);
|
||||
HandleGameObject(KalecgosWall[0], true);
|
||||
HandleGameObject(KalecgosWall[1], true);
|
||||
}
|
||||
else if (data == IN_PROGRESS)
|
||||
{
|
||||
HandleGameObject(ForceField, false);
|
||||
HandleGameObject(KalecgosWall[0], false);
|
||||
HandleGameObject(KalecgosWall[1], false);
|
||||
}
|
||||
m_auiEncounter[0] = data;
|
||||
Player const* target = GetPlayerInMap();
|
||||
return target ? target->GetGUID() : 0;
|
||||
}
|
||||
break;
|
||||
case DATA_BRUTALLUS_EVENT: m_auiEncounter[1] = data; break;
|
||||
case DATA_FELMYST_EVENT:
|
||||
if (data == DONE)
|
||||
HandleGameObject(FireBarrier, true);
|
||||
m_auiEncounter[2] = data; break;
|
||||
case DATA_EREDAR_TWINS_EVENT: m_auiEncounter[3] = data; break;
|
||||
case DATA_MURU_EVENT:
|
||||
switch (data)
|
||||
{
|
||||
case DONE:
|
||||
HandleGameObject(MurusGate[0], true);
|
||||
HandleGameObject(MurusGate[1], true);
|
||||
break;
|
||||
case IN_PROGRESS:
|
||||
HandleGameObject(MurusGate[0], false);
|
||||
HandleGameObject(MurusGate[1], false);
|
||||
break;
|
||||
case NOT_STARTED:
|
||||
HandleGameObject(MurusGate[0], true);
|
||||
HandleGameObject(MurusGate[1], false);
|
||||
break;
|
||||
}
|
||||
m_auiEncounter[4] = data; break;
|
||||
case DATA_KILJAEDEN_EVENT: m_auiEncounter[5] = data; break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (data == DONE)
|
||||
SaveToDB();
|
||||
}
|
||||
|
||||
std::string GetSaveData() OVERRIDE
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
std::ostringstream stream;
|
||||
stream << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' ' << m_auiEncounter[2] << ' ' << m_auiEncounter[3] << ' '
|
||||
<< m_auiEncounter[4] << ' ' << m_auiEncounter[5];
|
||||
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return stream.str();
|
||||
}
|
||||
|
||||
void Load(char const* in) OVERRIDE
|
||||
{
|
||||
if (!in)
|
||||
std::string GetSaveData() OVERRIDE
|
||||
{
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
return;
|
||||
OUT_SAVE_INST_DATA;
|
||||
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "S P " << GetBossSaveData();
|
||||
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA(in);
|
||||
std::istringstream stream(in);
|
||||
stream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2] >> m_auiEncounter[3]
|
||||
>> m_auiEncounter[4] >> m_auiEncounter[5];
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
if (m_auiEncounter[i] == IN_PROGRESS) // Do not load an encounter as "In Progress" - reset it instead.
|
||||
m_auiEncounter[i] = NOT_STARTED;
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
void Load(char const* str) OVERRIDE
|
||||
{
|
||||
if (!str)
|
||||
{
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
return;
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA(str);
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
|
||||
std::istringstream loadStream(str);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
|
||||
if (dataHead1 == 'S' && dataHead2 == 'P')
|
||||
{
|
||||
for (uint32 i = 0; i < EncounterCount; ++i)
|
||||
{
|
||||
uint32 tmpState;
|
||||
loadStream >> tmpState;
|
||||
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
|
||||
tmpState = NOT_STARTED;
|
||||
SetBossState(i, EncounterState(tmpState));
|
||||
}
|
||||
}
|
||||
else
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
}
|
||||
|
||||
protected:
|
||||
uint64 KalecgosDragonGUID;
|
||||
uint64 KalecgosHumanGUID;
|
||||
uint64 SathrovarrGUID;
|
||||
uint64 BrutallusGUID;
|
||||
uint64 MadrigosaGUID;
|
||||
uint64 FelmystGUID;
|
||||
uint64 AlythessGUID;
|
||||
uint64 SacrolashGUID;
|
||||
uint64 MuruGUID;
|
||||
uint64 KilJaedenGUID;
|
||||
uint64 KilJaedenControllerGUID;
|
||||
uint64 AnveenaGUID;
|
||||
uint64 KalecgosKjGUID;
|
||||
uint32 SpectralPlayers;
|
||||
|
||||
uint32 SpectralRealmTimer;
|
||||
std::vector<uint64> SpectralRealmList;
|
||||
};
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
|
||||
{
|
||||
return new instance_sunwell_plateau_InstanceMapScript(map);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
void AddSC_instance_sunwell_plateau()
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
|
||||
* Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
@@ -16,94 +15,105 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef DEF_SUNWELLPLATEAU_H
|
||||
#define DEF_SUNWELLPLATEAU_H
|
||||
#ifndef SUNWELL_PLATEAU_H
|
||||
#define SUNWELL_PLATEAU_H
|
||||
|
||||
/*** Encounters ***/
|
||||
enum Data
|
||||
{
|
||||
DATA_KALECGOS_EVENT,
|
||||
DATA_BRUTALLUS_EVENT,
|
||||
DATA_FELMYST_EVENT,
|
||||
DATA_EREDAR_TWINS_EVENT,
|
||||
DATA_MURU_EVENT,
|
||||
DATA_KILJAEDEN_EVENT,
|
||||
};
|
||||
#define SunwellPlateauScriptName "instance_sunwell_plateau"
|
||||
|
||||
enum Data64
|
||||
uint32 const EncounterCount = 6;
|
||||
|
||||
enum DataTypes
|
||||
{
|
||||
/*** Creatures ***/
|
||||
// Encounter States/Boss GUIDs
|
||||
DATA_KALECGOS = 0,
|
||||
DATA_BRUTALLUS = 1,
|
||||
DATA_FELMYST = 2,
|
||||
DATA_EREDAR_TWINS = 3,
|
||||
DATA_MURU = 4,
|
||||
DATA_KILJAEDEN = 5,
|
||||
|
||||
DATA_KALECGOS_DRAGON,
|
||||
DATA_KALECGOS_HUMAN,
|
||||
DATA_SATHROVARR,
|
||||
DATA_BRUTALLUS,
|
||||
DATA_MADRIGOSA,
|
||||
DATA_FELMYST,
|
||||
DATA_ALYTHESS,
|
||||
DATA_SACROLASH,
|
||||
DATA_MURU,
|
||||
DATA_KILJAEDEN,
|
||||
DATA_KILJAEDEN_CONTROLLER,
|
||||
DATA_ANVEENA,
|
||||
DATA_KALECGOS_KJ,
|
||||
|
||||
/*** GameObjects ***/
|
||||
DATA_GO_FORCEFIELD,
|
||||
// GameObject GUIDs
|
||||
DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_1,
|
||||
DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_2,
|
||||
DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_3,
|
||||
DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_4,
|
||||
|
||||
/*** Misc ***/
|
||||
DATA_PLAYER_GUID,
|
||||
// Misc
|
||||
DATA_PLAYER_GUID
|
||||
};
|
||||
|
||||
enum Creatures
|
||||
enum CreatureIds
|
||||
{
|
||||
BOSS_MURU = 25741,
|
||||
BOSS_ENTROPIUS = 25840,
|
||||
NPC_KALECGOS = 24850,
|
||||
NPC_KALEC = 24891,
|
||||
NPC_SATHROVARR = 24892,
|
||||
NPC_MURU = 25741,
|
||||
NPC_ENTROPIUS = 25840,
|
||||
NPC_KALECGOS = 24850,
|
||||
NPC_KALEC = 24891,
|
||||
NPC_SATHROVARR = 24892,
|
||||
NPC_BRUTALLUS = 24882,
|
||||
NPC_MADRIGOSA = 24895,
|
||||
NPC_FELMYST = 25038,
|
||||
|
||||
NPC_DEAD = 25268,
|
||||
NPC_FLIGHT_LEFT = 25357,
|
||||
NPC_FLIGHT_RIGHT = 25358,
|
||||
NPC_DEATH_CLOUD = 25703,
|
||||
NPC_VAPOR = 25265,
|
||||
NPC_VAPOR_TRAIL = 25267,
|
||||
NPC_DEAD = 25268,
|
||||
NPC_FLIGHT_LEFT = 25357,
|
||||
NPC_FLIGHT_RIGHT = 25358,
|
||||
NPC_DEATH_CLOUD = 25703,
|
||||
NPC_VAPOR = 25265,
|
||||
NPC_VAPOR_TRAIL = 25267,
|
||||
|
||||
NPC_GRAND_WARLOCK_ALYTHESS = 25166,
|
||||
NPC_SHADOW_IMAGE = 25214,
|
||||
NPC_LADY_SACROLASH = 25165,
|
||||
NPC_GRAND_WARLOCK_ALYTHESS = 25166,
|
||||
NPC_SHADOW_IMAGE = 25214,
|
||||
NPC_LADY_SACROLASH = 25165,
|
||||
|
||||
CREATURE_ANVEENA = 26046, // Embodiment of the Sunwell
|
||||
CREATURE_KALECGOS = 25319, // Helps the raid throughout the fight
|
||||
CREATURE_PROPHET = 26246, // Outro
|
||||
CREATURE_KILJAEDEN = 25315, // Give it to 'em KJ!
|
||||
CREATURE_HAND_OF_THE_DECEIVER = 25588, // Adds found before KJ emerges
|
||||
CREATURE_FELFIRE_PORTAL = 25603, // Portal spawned be Hand of the Deceivers
|
||||
CREATURE_VOLATILE_FELFIRE_FIEND = 25598, // Fiends spawned by the above portal
|
||||
CREATURE_ARMAGEDDON_TARGET = 25735, // This mob casts meteor on itself.. I think
|
||||
CREATURE_SHIELD_ORB = 25502, // Shield orbs circle the room raining shadow bolts on raid
|
||||
CREATURE_THE_CORE_OF_ENTROPIUS = 26262, // Used in the ending cinematic?
|
||||
CREATURE_POWER_OF_THE_BLUE_DRAGONFLIGHT = 25653, // NPC that players possess when using the Orb of the Blue Dragonflight
|
||||
CREATURE_SPIKE_TARGET1 = 30598, // Should summon these under Shadow Spike Channel on targets place
|
||||
CREATURE_SPIKE_TARGET2 = 30614,
|
||||
CREATURE_SINISTER_REFLECTION = 25708, // Sinister Relection spawnd on Phase swichtes
|
||||
NPC_ANVEENA = 26046, // Embodiment of the Sunwell
|
||||
NPC_KALECGOS_KJ = 25319, // Helps the raid throughout the fight
|
||||
NPC_PROPHET = 26246, // Outro
|
||||
NPC_KILJAEDEN = 25315, // Give it to 'em KJ!
|
||||
NPC_KILJAEDEN_CONTROLLER = 25608,
|
||||
NPC_HAND_OF_THE_DECEIVER = 25588, // Adds found before KJ emerges
|
||||
NPC_FELFIRE_PORTAL = 25603, // Portal spawned be Hand of the Deceivers
|
||||
NPC_VOLATILE_FELFIRE_FIEND = 25598, // Fiends spawned by the above portal
|
||||
NPC_ARMAGEDDON_TARGET = 25735, // This mob casts meteor on itself.. I think
|
||||
NPC_SHIELD_ORB = 25502, // Shield orbs circle the room raining shadow bolts on raid
|
||||
NPC_THE_CORE_OF_ENTROPIUS = 26262, // Used in the ending cinematic?
|
||||
NPC_POWER_OF_THE_BLUE_DRAGONFLIGHT = 25653, // NPC that players possess when using the Orb of the Blue Dragonflight
|
||||
NPC_SPIKE_TARGET1 = 30598, // Should summon these under Shadow Spike Channel on targets place
|
||||
NPC_SPIKE_TARGET2 = 30614,
|
||||
NPC_SINISTER_REFLECTION = 25708, // Sinister Relection spawnd on Phase swichtes
|
||||
|
||||
CREATURE_DARKNESS = 25879,
|
||||
CREATURE_DARK_FIENDS = 25744,
|
||||
CREATURE_BERSERKER = 25798,
|
||||
CREATURE_FURY_MAGE = 25799,
|
||||
CREATURE_VOID_SENTINEL = 25772,
|
||||
CREATURE_VOID_SPAWN = 25824,
|
||||
CREATURE_BLACK_HOLE = 25855,
|
||||
NPC_DARKNESS = 25879,
|
||||
NPC_DARK_FIENDS = 25744,
|
||||
NPC_BERSERKER = 25798,
|
||||
NPC_FURY_MAGE = 25799,
|
||||
NPC_VOID_SENTINEL = 25772,
|
||||
NPC_VOID_SPAWN = 25824,
|
||||
NPC_BLACK_HOLE = 25855
|
||||
};
|
||||
|
||||
enum GameObjects
|
||||
enum GameObjectIds
|
||||
{
|
||||
GAMEOBJECT_ORB_OF_THE_BLUE_DRAGONFLIGHT = 188415,
|
||||
GO_ORB_OF_THE_BLUE_DRAGONFLIGHT = 188415,
|
||||
GO_FORCE_FIELD = 188421,
|
||||
GO_BOSS_COLLISION_1 = 188523,
|
||||
GO_BOSS_COLLISION_2 = 188524,
|
||||
GO_FIRE_BARRIER = 188075,
|
||||
GO_MURUS_GATE_1 = 187990,
|
||||
GO_MURUS_GATE_2 = 188118
|
||||
};
|
||||
|
||||
#endif
|
||||
template<class AI>
|
||||
AI* GetSunwellPlateauAI(Creature* creature)
|
||||
{
|
||||
return GetInstanceAI<AI>(creature, SunwellPlateauScriptName);
|
||||
}
|
||||
|
||||
#endif // SUNWELL_PLATEAU_H
|
||||
|
||||
Reference in New Issue
Block a user