Update Script Ulduar/XT-002. Thanks Dakeyras. Fixes issue 1074.

Add script texts for all ulduar bosses and adds. Mainly from wowwiki, Thanks.
Some code style cleanup.
Still WiP.

--HG--
branch : trunk
This commit is contained in:
Trazom62
2010-03-21 17:17:34 +01:00
parent c5f8341634
commit 450b2fba9d
17 changed files with 1831 additions and 415 deletions
@@ -58,28 +58,28 @@ enum Creatures
#define NORDRASSIL_Y -324.609222
#define NORDRASSIL_Z 417.322174
enum Texts
enum Yells
{
SAY_AGGRO = -1620000,
SAY_KILL_1 = -1620005,
SAY_KILL_2 = -1620006,
SAY_BIG_BANG_1 = -1620002,
SAY_BIG_BANG_2 = -1620003,
SAY_PHASE_2 = -1620003,
SAY_BLACK_HOLE = -1620004,
SAY_BERSERK = -1620007,
SAY_SUMMON_COLLAPSING_STAR = -1620008,
SAY_ENGADED_FOR_FIRTS_TIME = -1620001,
SAY_SUMMON1 = -1620010,
SAY_SUMMON2 = -1620011,
SAY_SUMMON3 = -1620012,
SAY_DEATH_1 = -1620013,
SAY_DEATH_2 = -1620014,
SAY_DEATH_3 = -1620015,
SAY_DEATH_4 = -1620009,
SAY_DEFEAT_1 = -1620016,
SAY_DEFEAT_2 = -1620017,
SAY_DEFEAT_3 = -1620018
SAY_AGGRO = -1603000,
SAY_SLAY_1 = -1603001,
SAY_SLAY_2 = -1603002,
SAY_ENGADED_FOR_FIRTS_TIME = -1603003,
SAY_PHASE_2 = -1603004,
SAY_SUMMON_COLLAPSING_STAR = -1603005,
SAY_DEATH_1 = -1603006,
SAY_DEATH_2 = -1603007,
SAY_DEATH_3 = -1603008,
SAY_DEATH_4 = -1603009,
SAY_DEATH_5 = -1603010,
SAY_BERSERK = -1603011,
SAY_BIG_BANG_1 = -1603012,
SAY_BIG_BANG_2 = -1603013,
SAY_TIMER_1 = -1603014,
SAY_TIMER_2 = -1603015,
SAY_TIMER_3 = -1603016,
SAY_SUMMON_1 = -1603017,
SAY_SUMMON_2 = -1603018,
SAY_SUMMON_3 = -1603019,
};
struct boss_algalonAI : public ScriptedAI
@@ -87,6 +87,7 @@ struct boss_algalonAI : public ScriptedAI
boss_algalonAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
Summon = false; // not in reset. intro speech done only once.
}
ScriptedInstance* pInstance;
@@ -107,33 +108,43 @@ struct boss_algalonAI : public ScriptedAI
uint64 BlackHoleGUID;
bool Enrage;
bool m_bIsHeroicMode;
bool Summon;
void EnterCombat(Unit* who)
{
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
me->SetReactState(REACT_PASSIVE);
if (Summon)
{
DoScriptText(SAY_AGGRO, m_creature);
m_creature->InterruptSpell(CURRENT_CHANNELED_SPELL);
DoZoneInCombat(who->ToCreature());
}
else
{
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
m_creature->SetReactState(REACT_PASSIVE);
uiStep = 1;
}
if (pInstance)
pInstance->SetData(TYPE_ALGALON, IN_PROGRESS);
}
void KilledUnit(Unit *victim)
{
DoScriptText(RAND(SAY_KILL_1,SAY_KILL_2), me);
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), m_creature);
}
void Reset()
{
Phase = 1;
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
DoScriptText(SAY_DEFEAT_1, me);
DoScriptText(SAY_DEFEAT_2, me);
DoScriptText(SAY_DEFEAT_3, me);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
if (pInstance)
pInstance->SetData(TYPE_ALGALON, NOT_STARTED);
BlackHoleGUID = 0;
uiPhase_timer = 0;
Ascend_Timer = 480000; //8 minutes
QuantumStrike_Timer = 4000 + rand()%10000;
Berserk_Timer = 360000; //6 minutes
@@ -141,6 +152,7 @@ struct boss_algalonAI : public ScriptedAI
BigBang_Timer = 90000;
PhasePunch_Timer = 8000;
CosmicSmash_Timer = urand(30000, 60000);
Enrage = false;
}
void JumpToNextStep(uint32 uiTimer)
@@ -149,21 +161,14 @@ struct boss_algalonAI : public ScriptedAI
++uiStep;
}
void Aggro(Unit* pWho)
{
me->InterruptSpell(CURRENT_CHANNELED_SPELL);
me->SetInCombatWithZone();
if (pInstance)
pInstance->SetData(TYPE_ALGALON, IN_PROGRESS);
}
void DespawnCollapsingStar()
{
if (m_lCollapsingStarGUIDList.empty())
return;
for(std::list<uint64>::iterator itr = m_lCollapsingStarGUIDList.begin(); itr != m_lCollapsingStarGUIDList.end(); ++itr)
{
if (Creature* pTemp = (Creature*)Unit::GetUnit(*me, *itr))
if (Creature* pTemp = Unit::GetCreature(*m_creature, *itr))
{
if (pTemp->isAlive())
pTemp->ForcedDespawn();
@@ -177,18 +182,17 @@ struct boss_algalonAI : public ScriptedAI
if (pSummoned->GetEntry() == CREATURE_COLLAPSING_STAR)
{
Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0);
if (me->getVictim())
pSummoned->AI()->AttackStart(pTarget ? pTarget : me->getVictim());
if (m_creature->getVictim())
pSummoned->AI()->AttackStart(pTarget ? pTarget : m_creature->getVictim());
m_lCollapsingStarGUIDList.push_back(pSummoned->GetGUID());
}
}
void SummonCollapsingStar(Unit* target)
{
DoScriptText(SAY_SUMMON_COLLAPSING_STAR, me);
me->SummonCreature(CREATURE_COLLAPSING_STAR,target->GetPositionX()+15.0,target->GetPositionY()+15.0,target->GetPositionZ(),0, TEMPSUMMON_TIMED_DESPAWN, 100000);
DoScriptText(SAY_BLACK_HOLE, me);
me->SummonCreature(CREATURE_BLACK_HOLE,target->GetPositionX()+15.0,target->GetPositionY()+15.0,target->GetPositionZ(),0, TEMPSUMMON_TIMED_DESPAWN, 27000);
DoScriptText(SAY_SUMMON_COLLAPSING_STAR, m_creature);
m_creature->SummonCreature(CREATURE_COLLAPSING_STAR,target->GetPositionX()+15.0,target->GetPositionY()+15.0,target->GetPositionZ(),0, TEMPSUMMON_TIMED_DESPAWN, 100000);
m_creature->SummonCreature(CREATURE_BLACK_HOLE,target->GetPositionX()+15.0,target->GetPositionY()+15.0,target->GetPositionZ(),0, TEMPSUMMON_TIMED_DESPAWN, 27000);
}
void UpdateAI(const uint32 diff)
@@ -197,25 +201,29 @@ struct boss_algalonAI : public ScriptedAI
if (!UpdateVictim())
return;
if ((me->GetHealth()*100 / me->GetMaxHealth()) < 20 && Phase == 1)
if (Phase == 1 && HealthBelowPct(20))
{
Phase = 2;
DoScriptText(SAY_PHASE_2, me);
DoScriptText(SAY_PHASE_2, m_creature);
}
if ((me->GetHealth()*100 / me->GetMaxHealth()) < 2)
if (HealthBelowPct(2))
{
me->SummonGameObject(GAMEOBJECT_GIVE_OF_THE_OBSERVER, 1634.258667, -295.101166,417.321381,0,0,0,0,0,-10);
m_creature->SummonGameObject(GAMEOBJECT_GIVE_OF_THE_OBSERVER, 1634.258667, -295.101166,417.321381,0,0,0,0,0,-10);
DoScriptText(SAY_DEATH_1, me);
DoScriptText(SAY_DEATH_2, me);
DoScriptText(SAY_DEATH_3, me);
DoScriptText(SAY_DEATH_4, me);
// All of them. or random?
DoScriptText(SAY_DEATH_1, m_creature);
DoScriptText(SAY_DEATH_2, m_creature);
DoScriptText(SAY_DEATH_3, m_creature);
DoScriptText(SAY_DEATH_4, m_creature);
DoScriptText(SAY_DEATH_5, m_creature);
me->DisappearAndDie();
m_creature->DisappearAndDie();
if (pInstance)
pInstance->SetData(TYPE_ALGALON, DONE);
return;
}
if (Phase == 1)
@@ -226,60 +234,76 @@ struct boss_algalonAI : public ScriptedAI
{
switch(uiStep)
{
case 1: DoScriptText(SAY_SUMMON1, m_creature); break; JumpToNextStep(3000);
case 2: DoScriptText(SAY_SUMMON2, m_creature); break; JumpToNextStep(3000);
case 3: DoScriptText(SAY_SUMMON3, m_creature); break; JumpToNextStep(3000);
case 4: DoScriptText(SAY_ENGADED_FOR_FIRTS_TIME, m_creature); break; JumpToNextStep(3000);
case 5: DoScriptText(SAY_AGGRO, m_creature); break;
case 6: m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); break;
case 7: m_creature->SetReactState(REACT_AGGRESSIVE); break;
case 1:
DoScriptText(SAY_SUMMON_1, m_creature);
JumpToNextStep(3000);
break;
case 2:
DoScriptText(SAY_SUMMON_2, m_creature);
JumpToNextStep(3000);
break;
case 3:
DoScriptText(SAY_SUMMON_3, m_creature);
JumpToNextStep(3000);
break;
case 4:
DoScriptText(SAY_ENGADED_FOR_FIRTS_TIME, m_creature);
JumpToNextStep(3000);
break;
case 5:
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
m_creature->SetReactState(REACT_AGGRESSIVE);
Summon = true;
break;
}
}else uiPhase_timer -= diff;
} else uiPhase_timer -= diff;
return;
}
if(QuantumStrike_Timer <= diff)
if (QuantumStrike_Timer <= diff)
{
DoCast(me->getVictim(), m_bIsHeroicMode ? H_SPELL_QUANTUM_STRIKE : SPELL_QUANTUM_STRIKE, true);
DoCast(m_creature->getVictim(), RAID_MODE(SPELL_QUANTUM_STRIKE,H_SPELL_QUANTUM_STRIKE), true);
QuantumStrike_Timer = 4000 + rand()%10000;
}else QuantumStrike_Timer -= diff;
QuantumStrike_Timer = urand(4000, 14000);
} else QuantumStrike_Timer -= diff;
if(BigBang_Timer <= diff)
if (BigBang_Timer <= diff)
{
DoScriptText(RAND(SAY_BIG_BANG_1,SAY_BIG_BANG_2), me);
DoCast(me->getVictim(), m_bIsHeroicMode ? H_SPELL_BIG_BANG : SPELL_BIG_BANG, true);
DoScriptText(RAND(SAY_BIG_BANG_1,SAY_BIG_BANG_2), m_creature);
DoCast(m_creature->getVictim(), RAID_MODE(SPELL_BIG_BANG,H_SPELL_BIG_BANG), true);
BigBang_Timer = 90000;
}else BigBang_Timer -= diff;
} else BigBang_Timer -= diff;
if(Ascend_Timer <= diff)
if (Ascend_Timer <= diff)
{
DoCast(me->getVictim(),SPELL_ASCEND, true);
DoCast(m_creature->getVictim(),SPELL_ASCEND, true);
Ascend_Timer = 480000;
}else Ascend_Timer -= diff;
} else Ascend_Timer -= diff;
if(PhasePunch_Timer <= diff)
if (PhasePunch_Timer <= diff)
{
DoCast(me->getVictim(),SPELL_PHASE_PUNCH, true);
DoCast(m_creature->getVictim(),SPELL_PHASE_PUNCH, true);
PhasePunch_Timer = 8000;
}else PhasePunch_Timer -= diff;
} else PhasePunch_Timer -= diff;
if(CosmicSmash_Timer <= diff)
if (CosmicSmash_Timer <= diff)
{
DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), m_bIsHeroicMode ? H_SPELL_COSMIC_SMASH : SPELL_COSMIC_SMASH, true);
DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), RAID_MODE(SPELL_COSMIC_SMASH,H_SPELL_COSMIC_SMASH), true);
CosmicSmash_Timer = urand(30000, 60000);
}else CosmicSmash_Timer -= diff;
} else CosmicSmash_Timer -= diff;
if(Berserk_Timer <= diff)
if (Berserk_Timer <= diff)
{
DoScriptText(SAY_BERSERK, me);
DoCast(me->getVictim(),SPELL_BERSERK, true);
DoScriptText(SAY_BERSERK, m_creature);
DoCast(m_creature->getVictim(),SPELL_BERSERK, true);
Berserk_Timer = 360000;
}else Berserk_Timer -= diff;
} else Berserk_Timer -= diff;
DoMeleeAttackIfReady();
@@ -292,9 +316,9 @@ struct boss_algalonAI : public ScriptedAI
{
if (Ascend_Timer <= diff)
{
DoCast(me, SPELL_ASCEND);
DoScriptText(SAY_BERSERK, me);
Ascend_Timer = 360000 + rand()%5000;
DoCast(m_creature, SPELL_ASCEND);
DoScriptText(SAY_BERSERK, m_creature);
Ascend_Timer = urand(360000,365000);
Enrage = false;
} else Ascend_Timer -= diff;
}
@@ -303,13 +327,13 @@ struct boss_algalonAI : public ScriptedAI
DoMeleeAttackIfReady();
}
};
//Collapsing Star
struct mob_collapsing_starAI : public ScriptedAI
{
mob_collapsing_starAI(Creature *pCreature) : ScriptedAI(pCreature)
{
pInstance = (ScriptedInstance*)pCreature->GetInstanceData();
Reset();
}
ScriptedInstance* pInstance;
@@ -326,11 +350,11 @@ struct mob_collapsing_starAI : public ScriptedAI
if (!UpdateVictim())
return;
if(BlackHoleExplosion_Timer <= diff)
if (BlackHoleExplosion_Timer <= diff)
{
me->CastSpell(me, SPELL_BLACK_HOLE_EXPLOSION, false);
m_creature->CastSpell(m_creature, SPELL_BLACK_HOLE_EXPLOSION, false);
BlackHoleExplosion_Timer = 0;
}else BlackHoleExplosion_Timer -= diff;
} else BlackHoleExplosion_Timer -= diff;
}
};
@@ -62,8 +62,9 @@ EndScriptData */
#define SPELL_LIGHTNING_TENDRILS_H 63486
#define SPELL_STORMSHIELD 64187
enum eEnums
enum Events
{
EVENT_NONE,
EVENT_ENRAGE,
// Steelbreaker
EVENT_FUSION_PUNCH,
@@ -81,8 +82,35 @@ enum eEnums
EVENT_LIGHTNING_WHIRL,
EVENT_LIGHTNING_TENDRILS,
EVENT_STORMSHIELD,
MAX_EVENT
};
enum Yells
{
SAY_STEELBREAKER_AGGRO = -1603020,
SAY_STEELBREAKER_SLAY_1 = -1603021,
SAY_STEELBREAKER_SLAY_2 = -1603022,
SAY_STEELBREAKER_POWER = -1603023,
SAY_STEELBREAKER_DEATH_1 = -1603024,
SAY_STEELBREAKER_DEATH_2 = -1603025,
SAY_STEELBREAKER_BERSERK = -1603026,
SAY_MOLGEIM_AGGRO = -1603030,
SAY_MOLGEIM_SLAY_1 = -1603031,
SAY_MOLGEIM_SLAY_2 = -1603032,
SAY_MOLGEIM_RUNE_DEATH = -1603033,
SAY_MOLGEIM_SUMMON = -1603034,
SAY_MOLGEIM_DEATH_1 = -1603035,
SAY_MOLGEIM_DEATH_2 = -1603036,
SAY_MOLGEIM_BERSERK = -1603037,
SAY_BRUNDIR_AGGRO = -1603040,
SAY_BRUNDIR_SLAY_1 = -1603041,
SAY_BRUNDIR_SLAY_2 = -1603042,
SAY_BRUNDIR_SPECIAL = -1603043,
SAY_BRUNDIR_FLIGHT = -1603044,
SAY_BRUNDIR_DEATH_1 = -1603045,
SAY_BRUNDIR_DEATH_2 = -1603046,
SAY_BRUNDIR_BERSERK = -1603047,
};
bool IsEncounterComplete(ScriptedInstance* pInstance, Creature* m_creature)
@@ -93,15 +121,13 @@ bool IsEncounterComplete(ScriptedInstance* pInstance, Creature* m_creature)
for (uint8 i = 0; i < 3; ++i)
{
uint64 guid = pInstance->GetData64(DATA_STEELBREAKER+i);
if(!guid)
if (!guid)
return false;
if(Creature *boss = (Unit::GetCreature((*m_creature), guid)))
if (Creature *boss = Unit::GetCreature(*m_creature, guid))
{
if(boss->isAlive())
if (boss->isAlive())
return false;
continue;
}
else
return false;
@@ -121,7 +147,7 @@ struct boss_steelbreakerAI : public ScriptedAI
events.Reset();
phase = 0;
m_creature->RemoveAllAuras();
if(pInstance)
if (pInstance)
pInstance->SetData(TYPE_ASSEMBLY, NOT_STARTED);
}
@@ -131,6 +157,7 @@ struct boss_steelbreakerAI : public ScriptedAI
void EnterCombat(Unit *who)
{
DoScriptText(SAY_STEELBREAKER_AGGRO, m_creature);
DoZoneInCombat();
DoCast(m_creature, RAID_MODE(SPELL_HIGH_VOLTAGE, SPELL_HIGH_VOLTAGE_H));
events.ScheduleEvent(EVENT_ENRAGE, 900000);
@@ -142,46 +169,46 @@ struct boss_steelbreakerAI : public ScriptedAI
++phase;
events.SetPhase(phase);
events.RescheduleEvent(EVENT_FUSION_PUNCH, 15000);
if(phase >= 2)
if (phase >= 2)
events.RescheduleEvent(EVENT_STATIC_DISRUPTION, 30000);
if(phase >= 3)
if (phase >= 3)
events.RescheduleEvent(EVENT_OVERWHELMING_POWER, rand()%5000);
}
void DamageTaken(Unit* pKiller, uint32 &damage)
{
if(damage >= m_creature->GetHealth())
if (damage >= m_creature->GetHealth())
{
if(Creature* Brundir = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_STORMCALLER_BRUNDIR) : 0))
if(Brundir->isAlive())
{
if (Creature* Brundir = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_STORMCALLER_BRUNDIR) : 0))
if (Brundir->isAlive())
Brundir->SetHealth(Brundir->GetMaxHealth());
}
if(Creature* Molgeim = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_RUNEMASTER_MOLGEIM) : 0))
if(Molgeim->isAlive())
{
if (Creature* Molgeim = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_RUNEMASTER_MOLGEIM) : 0))
if (Molgeim->isAlive())
Molgeim->SetHealth(Molgeim->GetMaxHealth());
}
DoCast(SPELL_SUPERCHARGE);
DoCast(SPELL_SUPERCHARGE);
}
}
void JustDied(Unit* Killer)
{
if(IsEncounterComplete(pInstance, m_creature) && pInstance)
DoScriptText(RAND(SAY_STEELBREAKER_DEATH_1,SAY_STEELBREAKER_DEATH_2), m_creature);
if (IsEncounterComplete(pInstance, m_creature) && pInstance)
pInstance->SetData(TYPE_ASSEMBLY, DONE);
}
void KilledUnit(Unit *who)
{
if(phase == 3)
DoScriptText(RAND(SAY_STEELBREAKER_SLAY_1,SAY_STEELBREAKER_SLAY_2), m_creature);
if (phase == 3)
DoCast(m_creature, SPELL_ELECTRICAL_CHARGE);
}
void SpellHit(Unit *from, const SpellEntry *spell)
{
if(spell->Id == SPELL_SUPERCHARGE)
if (spell->Id == SPELL_SUPERCHARGE)
UpdatePhase();
}
@@ -197,23 +224,23 @@ struct boss_steelbreakerAI : public ScriptedAI
switch(eventId)
{
case EVENT_ENRAGE:
DoScriptText(SAY_STEELBREAKER_BERSERK, m_creature);
DoCast(SPELL_BERSERK);
break;
break;
case EVENT_FUSION_PUNCH:
DoCast(me->getVictim(), RAID_MODE(SPELL_FUSION_PUNCH_H, SPELL_FUSION_PUNCH));
events.ScheduleEvent(EVENT_FUSION_PUNCH, 13000 + (rand()%9)*1000);
break;
DoCast(me->getVictim(), RAID_MODE(SPELL_FUSION_PUNCH, SPELL_FUSION_PUNCH_H));
events.ScheduleEvent(EVENT_FUSION_PUNCH, urand(13000, 22000));
break;
case EVENT_STATIC_DISRUPTION:
{
Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM);
DoCast(pTarget, RAID_MODE(SPELL_STATIC_DISRUPTION_H, SPELL_STATIC_DISRUPTION));
events.ScheduleEvent(EVENT_STATIC_DISRUPTION, 20000 + (rand()%20)*1000);
}
break;
if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM))
DoCast(pTarget, RAID_MODE(SPELL_STATIC_DISRUPTION, SPELL_STATIC_DISRUPTION_H));
events.ScheduleEvent(EVENT_STATIC_DISRUPTION, urand(20000, 40000));
break;
case EVENT_OVERWHELMING_POWER:
DoScriptText(SAY_STEELBREAKER_POWER, m_creature);
DoCast(me->getVictim(), RAID_MODE(SPELL_OVERWHELMING_POWER, SPELL_OVERWHELMING_POWER_H));
events.ScheduleEvent(EVENT_OVERWHELMING_POWER, RAID_MODE(60000, 35000));
break;
break;
}
}
@@ -230,7 +257,7 @@ struct boss_runemaster_molgeimAI : public ScriptedAI
void Reset()
{
if(pInstance)
if (pInstance)
pInstance->SetData(TYPE_ASSEMBLY, NOT_STARTED);
events.Reset();
m_creature->RemoveAllAuras();
@@ -243,6 +270,7 @@ struct boss_runemaster_molgeimAI : public ScriptedAI
void EnterCombat(Unit* who)
{
DoScriptText(SAY_MOLGEIM_AGGRO, m_creature);
DoZoneInCombat();
events.ScheduleEvent(EVENT_ENRAGE, 900000);
UpdatePhase();
@@ -254,40 +282,43 @@ struct boss_runemaster_molgeimAI : public ScriptedAI
events.SetPhase(phase);
events.RescheduleEvent(EVENT_SHIELD_OF_RUNES, 27000);
events.RescheduleEvent(EVENT_RUNE_OF_POWER, 60000);
if(phase >= 2)
if (phase >= 2)
events.RescheduleEvent(EVENT_RUNE_OF_DEATH, 30000);
if(phase >= 3)
events.RescheduleEvent(EVENT_RUNE_OF_SUMMONING, 20000+(rand()%10)*1000);
if (phase >= 3)
events.RescheduleEvent(EVENT_RUNE_OF_SUMMONING, urand(20000,30000));
}
void DamageTaken(Unit* pKiller, uint32 &damage)
{
if(damage >= m_creature->GetHealth())
if (damage >= m_creature->GetHealth())
{
if(Creature* Steelbreaker = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_STEELBREAKER) : 0))
if(Steelbreaker->isAlive())
{
if (Creature* Steelbreaker = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_STEELBREAKER) : 0))
if (Steelbreaker->isAlive())
Steelbreaker->SetHealth(Steelbreaker->GetMaxHealth());
}
if(Creature* Brundir = Unit::GetCreature((*m_creature), pInstance ? pInstance->GetData64(DATA_STORMCALLER_BRUNDIR) : 0))
if(Brundir->isAlive())
{
if (Creature* Brundir = Unit::GetCreature((*m_creature), pInstance ? pInstance->GetData64(DATA_STORMCALLER_BRUNDIR) : 0))
if (Brundir->isAlive())
Brundir->SetHealth(Brundir->GetMaxHealth());
}
DoCast(m_creature, SPELL_SUPERCHARGE);
}
}
void JustDied(Unit* Killer)
{
if(IsEncounterComplete(pInstance, m_creature) && pInstance)
DoScriptText(RAND(SAY_MOLGEIM_DEATH_1,SAY_MOLGEIM_DEATH_2), m_creature);
if (IsEncounterComplete(pInstance, m_creature) && pInstance)
pInstance->SetData(TYPE_ASSEMBLY, DONE);
}
void KilledUnit(Unit *who)
{
DoScriptText(RAND(SAY_MOLGEIM_SLAY_1,SAY_MOLGEIM_SLAY_2), m_creature);
}
void SpellHit(Unit *from, const SpellEntry *spell)
{
if(spell->Id == SPELL_SUPERCHARGE)
if (spell->Id == SPELL_SUPERCHARGE)
UpdatePhase();
}
@@ -303,35 +334,34 @@ struct boss_runemaster_molgeimAI : public ScriptedAI
switch(eventId)
{
case EVENT_ENRAGE:
DoScriptText(SAY_MOLGEIM_BERSERK, m_creature);
DoCast(SPELL_BERSERK);
break;
break;
case EVENT_RUNE_OF_POWER: // Improve target selection; random alive friendly
{
Unit *Target = DoSelectLowestHpFriendly(60);
if(!Target || (Target && !Target->isAlive()))
Target = m_creature;
DoCast(Target, SPELL_RUNE_OF_POWER);
Unit *pTarget = DoSelectLowestHpFriendly(60);
if (!pTarget || (pTarget && !pTarget->isAlive()))
pTarget = m_creature;
DoCast(pTarget, SPELL_RUNE_OF_POWER);
events.ScheduleEvent(EVENT_RUNE_OF_POWER, 60000);
break;
}
break;
case EVENT_SHIELD_OF_RUNES:
DoCast(m_creature, RAID_MODE(SPELL_SHIELD_OF_RUNES, SPELL_SHIELD_OF_RUNES_H));
events.ScheduleEvent(EVENT_SHIELD_OF_RUNES, 27000+ (rand()%7)*1000);
break;
events.ScheduleEvent(EVENT_SHIELD_OF_RUNES, urand(27000,34000));
break;
case EVENT_RUNE_OF_DEATH:
{
Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM);
DoCast(pTarget, SPELL_RUNE_OF_DEATH);
events.ScheduleEvent(EVENT_RUNE_OF_DEATH, 30000+ (rand()%10)*1000);
}
break;
DoScriptText(SAY_MOLGEIM_RUNE_DEATH, m_creature);
if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM))
DoCast(pTarget, SPELL_RUNE_OF_DEATH);
events.ScheduleEvent(EVENT_RUNE_OF_DEATH, urand(30000,40000));
break;
case EVENT_RUNE_OF_SUMMONING:
{
Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM);
DoCast(pTarget, SPELL_RUNE_OF_SUMMONING);
events.ScheduleEvent(EVENT_RUNE_OF_SUMMONING, 20000+(rand()%10)*1000);
}
break;
DoScriptText(SAY_MOLGEIM_SUMMON, m_creature);
if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM))
DoCast(pTarget, SPELL_RUNE_OF_SUMMONING);
events.ScheduleEvent(EVENT_RUNE_OF_SUMMONING, urand(20000,30000));
break;
}
}
@@ -346,29 +376,29 @@ struct mob_lightning_elementalAI : public ScriptedAI
Charge();
}
Unit* Target;
void Charge()
{
Target = m_creature->SelectNearestTarget();
m_creature->AddThreat(Target, 5000000.0f);
AttackStart(Target);
Unit* pTarget = m_creature->SelectNearestTarget();
m_creature->AddThreat(pTarget, 5000000.0f);
AttackStart(pTarget);
}
void UpdateAI(const uint32 diff)
{
if(!m_creature->isInCombat())
if (!m_creature->isInCombat())
return;
if(m_creature->IsWithinMeleeRange(Target))
if (!UpdateVictim())
return;
if (m_creature->IsWithinMeleeRange(m_creature->getVictim()))
{
DoCast(Target, RAID_MODE(SPELL_LIGHTNING_BLAST, SPELL_LIGHTNING_BLAST_H));
DoCast(m_creature->getVictim(), RAID_MODE(SPELL_LIGHTNING_BLAST, SPELL_LIGHTNING_BLAST_H));
m_creature->Kill(m_creature); // hack until spell works
}
m_creature->GetMotionMaster()->MoveChase(Target); // needed at every update?
m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim()); // needed at every update?
}
};
struct mob_rune_of_summoningAI : public ScriptedAI
@@ -394,7 +424,7 @@ struct boss_stormcaller_brundirAI : public ScriptedAI
void Reset()
{
if(pInstance)
if (pInstance)
pInstance->SetData(TYPE_ASSEMBLY, NOT_STARTED);
m_creature->RemoveAllAuras();
events.Reset();
@@ -407,6 +437,7 @@ struct boss_stormcaller_brundirAI : public ScriptedAI
void EnterCombat(Unit* who)
{
DoScriptText(SAY_BRUNDIR_AGGRO, m_creature);
DoZoneInCombat();
events.ScheduleEvent(EVENT_ENRAGE, 900000);
UpdatePhase();
@@ -416,33 +447,28 @@ struct boss_stormcaller_brundirAI : public ScriptedAI
{
++phase;
events.SetPhase(phase);
events.RescheduleEvent(EVENT_CHAIN_LIGHTNING, 9000+ (rand()%8)*1000);
events.RescheduleEvent(EVENT_OVERLOAD, 60000+ (rand()%65)*1000);
if(phase >= 2)
events.RescheduleEvent(EVENT_LIGHTNING_WHIRL, 20000+ (rand()%20)*1000);
if(phase >= 3)
events.RescheduleEvent(EVENT_CHAIN_LIGHTNING, urand(9000,17000));
events.RescheduleEvent(EVENT_OVERLOAD, urand(60000,125000));
if (phase >= 2)
events.RescheduleEvent(EVENT_LIGHTNING_WHIRL, urand(20000,40000));
if (phase >= 3)
{
DoCast(m_creature, SPELL_STORMSHIELD);
events.RescheduleEvent(EVENT_LIGHTNING_TENDRILS, 40000+ (rand()%40)*1000);
events.RescheduleEvent(EVENT_LIGHTNING_TENDRILS, urand(40000,80000));
}
}
void DamageTaken(Unit* pKiller, uint32 &damage)
{
if(damage >= m_creature->GetHealth())
if (damage >= m_creature->GetHealth())
{
if(Creature* Steelbreaker = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_STEELBREAKER) : 0))
if(Steelbreaker->isAlive())
{
if (Creature* Steelbreaker = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_STEELBREAKER) : 0))
if (Steelbreaker->isAlive())
Steelbreaker->SetHealth(Steelbreaker->GetMaxHealth());
}
if(Creature* Molgeim = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_RUNEMASTER_MOLGEIM) : 0))
if(Molgeim->isAlive())
{
if (Creature* Molgeim = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_RUNEMASTER_MOLGEIM) : 0))
if (Molgeim->isAlive())
Molgeim->SetHealth(Molgeim->GetMaxHealth());
}
DoCast(SPELL_SUPERCHARGE);
}
@@ -450,16 +476,20 @@ struct boss_stormcaller_brundirAI : public ScriptedAI
void JustDied(Unit* Killer)
{
if(IsEncounterComplete(pInstance, m_creature) && pInstance)
DoScriptText(RAND(SAY_BRUNDIR_DEATH_1,SAY_BRUNDIR_DEATH_2), m_creature);
if (IsEncounterComplete(pInstance, m_creature) && pInstance)
pInstance->SetData(TYPE_ASSEMBLY, DONE);
}
void KilledUnit(Unit *who)
{
DoScriptText(RAND(SAY_BRUNDIR_SLAY_1,SAY_BRUNDIR_SLAY_2), m_creature);
}
void SpellHit(Unit *from, const SpellEntry *spell)
{
if(spell->Id == SPELL_SUPERCHARGE)
{
if (spell->Id == SPELL_SUPERCHARGE)
UpdatePhase();
}
}
void UpdateAI(const uint32 diff)
@@ -474,28 +504,27 @@ struct boss_stormcaller_brundirAI : public ScriptedAI
switch(eventId)
{
case EVENT_ENRAGE:
DoScriptText(SAY_BRUNDIR_BERSERK, m_creature);
DoCast(SPELL_BERSERK);
break;
break;
case EVENT_CHAIN_LIGHTNING:
{
Unit* Target = SelectUnit(SELECT_TARGET_RANDOM,0);
DoCast(Target, RAID_MODE(SPELL_CHAIN_LIGHTNING_N , SPELL_CHAIN_LIGHTNING_H));
events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 9000+ (rand()%8)*1000);
}
break;
if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(pTarget, RAID_MODE(SPELL_CHAIN_LIGHTNING_N , SPELL_CHAIN_LIGHTNING_H));
events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, urand(9000,17000));
break;
case EVENT_OVERLOAD:
DoCast(RAID_MODE(SPELL_OVERLOAD , SPELL_OVERLOAD_H));
events.ScheduleEvent(EVENT_OVERLOAD, 60000+ (rand()%65)*1000);
break;
events.ScheduleEvent(EVENT_OVERLOAD, urand(60000,125000));
break;
case EVENT_LIGHTNING_WHIRL:
DoCast(RAID_MODE(SPELL_LIGHTNING_WHIRL , SPELL_LIGHTNING_WHIRL_H));
events.ScheduleEvent(EVENT_LIGHTNING_WHIRL, 20000+ (rand()%20)*1000);
break;
events.ScheduleEvent(EVENT_LIGHTNING_WHIRL, urand(20000,40000));
break;
case EVENT_LIGHTNING_TENDRILS:
DoCast(RAID_MODE(SPELL_LIGHTNING_TENDRILS, SPELL_LIGHTNING_TENDRILS_H));
events.DelayEvents(15000, 5000);
DoResetThreat();
break;
break;
}
}
@@ -24,44 +24,47 @@
#define SPELL_SETINEL_BLAST 64679
#define SPELL_SONIC_SCREECH 64422
#define SPELL_SUMMON_SWARMING_GUARDIAN 64397
//wrong text ids. correct are beetwen -1000000 AND -1999999
//beetwen -2000000 and -2999999 are custom texts so wtf?
#define SAY_AGGRO -2615016
#define SAY_SLAY_1 -2615017
enum Yells
{
SAY_AGGRO = -1603050,
SAY_SLAY_1 = -1603051,
SAY_SLAY_2 = -1603052,
SAY_DEATH = -1603053,
SAY_BERSERK = -1603054,
};
struct boss_auriaya_AI : public BossAI
{
boss_auriaya_AI(Creature *pCreature) : BossAI(pCreature, TYPE_AURIAYA)
{
m_pInstance = pCreature->GetInstanceData();
}
ScriptedInstance* m_pInstance;
uint32 TERRIFYING_SCREECH_Timer;
uint32 SONIC_SCREECH_Timer;
void Reset()
{
_Reset();
TERRIFYING_SCREECH_Timer = 180000;
SONIC_SCREECH_Timer = 30000;
}
void EnterCombat(Unit* who)
{
_EnterCombat();
DoScriptText(SAY_AGGRO,m_creature);
}
void KilledUnit(Unit* victim)
{
DoScriptText(SAY_SLAY_1, m_creature);
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), m_creature);
}
void JustDied(Unit *victim)
{
DoScriptText(SAY_SLAY_1, m_creature);
if (m_pInstance)
m_pInstance->SetData(TYPE_AURIAYA, DONE);
DoScriptText(SAY_DEATH, m_creature);
_JustDied();
}
void MoveInLineOfSight(Unit* who) {}
@@ -74,7 +77,6 @@ struct boss_auriaya_AI : public BossAI
if (TERRIFYING_SCREECH_Timer <= diff)
{
DoCast(SPELL_TERRIFYING_SCREECH);
DoScriptText(SAY_SLAY_1, m_creature);
TERRIFYING_SCREECH_Timer = 180000;
} else TERRIFYING_SCREECH_Timer -= diff;
@@ -92,6 +94,7 @@ CreatureAI* GetAI_boss_auriaya(Creature* pCreature)
{
return new boss_auriaya_AI (pCreature);
}
void AddSC_boss_auriaya()
{
Script *newscript;
@@ -20,40 +20,38 @@
#include "ulduar.h"
#include "Vehicle.h"
#define SPELL_PURSUED 62374
#define SPELL_GATHERING_SPEED 62375
#define SPELL_BATTERING_RAM 62376
#define SPELL_FLAME_VENTS 62396
#define SPELL_MISSILE_BARRAGE 62400
#define SPELL_SYSTEMS_SHUTDOWN 62475
#define SPELL_FLAME_CANNON 62395
//#define SPELL_FLAME_CANNON 64692 trigger the same spell
#define SPELL_OVERLOAD_CIRCUIT 62399
#define SPELL_SEARING_FLAME 62402
#define SPELL_BLAZE 62292
#define SPELL_SMOKE_TRAIL 63575
#define SPELL_MIMIRON_INFERNO 62910
#define SPELL_HODIR_FURY 62297
#define SPELL_ELECTROSHOCK 62522
enum Mobs
enum Spells
{
MOB_MECHANOLIFT = 33214,
MOB_LIQUID = 33189,
MOB_CONTAINER = 33218,
SPELL_PURSUED = 62374,
SPELL_GATHERING_SPEED = 62375,
SPELL_BATTERING_RAM = 62376,
SPELL_FLAME_VENTS = 62396,
SPELL_MISSILE_BARRAGE = 62400,
SPELL_SYSTEMS_SHUTDOWN = 62475,
SPELL_FLAME_CANNON = 62395,
// SPELL_FLAME_CANNON = 64692, trigger the same spell
SPELL_OVERLOAD_CIRCUIT = 62399,
SPELL_SEARING_FLAME = 62402,
SPELL_BLAZE = 62292,
SPELL_SMOKE_TRAIL = 63575,
SPELL_MIMIRON_INFERNO = 62910,
SPELL_HODIR_FURY = 62297,
SPELL_ELECTROSHOCK = 62522,
};
enum Creatures
{
MOB_MECHANOLIFT = 33214,
MOB_LIQUID = 33189,
MOB_CONTAINER = 33218,
};
enum Events
{
EVENT_PURSUE = 1,
EVENT_NONE,
EVENT_PURSUE,
EVENT_MISSILE,
EVENT_VENT,
EVENT_SPEED,
@@ -64,41 +62,59 @@ enum Events
enum Seats
{
SEAT_PLAYER = 0,
SEAT_TURRET = 1,
SEAT_DEVICE = 2,
SEAT_PLAYER = 0,
SEAT_TURRET = 1,
SEAT_DEVICE = 2,
};
enum Yells
{
SAY_AGGRO = -1603060,
SAY_SLAY = -1603061,
SAY_DEATH = -1603062,
SAY_TARGET_1 = -1603063,
SAY_TARGET_2 = -1603064,
SAY_TARGET_3 = -1603065,
SAY_HARDMODE = -1603066,
SAY_TOWER_NONE = -1603067,
SAY_TOWER_FROST = -1603068,
SAY_TOWER_FLAME = -1603069,
SAY_TOWER_NATURE = -1603070,
SAY_TOWER_STORM = -1603071,
SAY_PLAYER_RIDING = -1603072,
SAY_OVERLOAD_1 = -1603073,
SAY_OVERLOAD_2 = -1603074,
SAY_OVERLOAD_3 = -1603075,
};
struct boss_flame_leviathanAI : public BossAI
{
boss_flame_leviathanAI(Creature *pCreature) : BossAI(pCreature, TYPE_LEVIATHAN), vehicle(me->GetVehicleKit())
boss_flame_leviathanAI(Creature *pCreature) : BossAI(pCreature, TYPE_LEVIATHAN), vehicle(pCreature->GetVehicleKit())
{
m_pInstance = pCreature->GetInstanceData();
assert(vehicle);
}
ScriptedInstance* m_pInstance;
Vehicle *vehicle;
void Reset()
{
_Reset();
me->SetReactState(REACT_AGGRESSIVE);
m_creature->SetReactState(REACT_AGGRESSIVE);
}
void EnterCombat(Unit *who)
{
_EnterCombat();
me->SetReactState(REACT_DEFENSIVE);
DoScriptText(SAY_AGGRO, m_creature);
m_creature->SetReactState(REACT_DEFENSIVE);
events.ScheduleEvent(EVENT_PURSUE, 0);
events.ScheduleEvent(EVENT_MISSILE, 1500);
events.ScheduleEvent(EVENT_VENT, 20000);
events.ScheduleEvent(EVENT_SPEED, 15000);
events.ScheduleEvent(EVENT_SUMMON, 0);
//events.ScheduleEvent(EVENT_MIMIRON_INFERNO, 60000 + (rand()%60000)); // Not Blizzlike
//events.ScheduleEvent(EVENT_HODIR_FURY, 60000 + (rand()%60000)); // Not Blizzlike
if (Creature *turret = CAST_CRE(vehicle->GetPassenger(7)))
//events.ScheduleEvent(EVENT_MIMIRON_INFERNO, urand(60000, 120000)); // Not Blizzlike
//events.ScheduleEvent(EVENT_HODIR_FURY, urand(60000, 120000)); // Not Blizzlike
if (Creature *turret = CAST_CRE(vehicle->GetPassenger(SEAT_TURRET)))
turret->AI()->DoZoneInCombat();
}
@@ -111,8 +127,8 @@ struct boss_flame_leviathanAI : public BossAI
void JustDied(Unit *victim)
{
if (m_pInstance)
m_pInstance->SetData(TYPE_LEVIATHAN, DONE);
DoScriptText(SAY_DEATH, m_creature);
_JustDied();
}
void SpellHit(Unit *caster, const SpellEntry *spell)
@@ -120,15 +136,15 @@ struct boss_flame_leviathanAI : public BossAI
if(spell->Id == 62472)
vehicle->InstallAllAccessories();
else if(spell->Id == SPELL_ELECTROSHOCK)
me->InterruptSpell(CURRENT_CHANNELED_SPELL);
m_creature->InterruptSpell(CURRENT_CHANNELED_SPELL);
}
void UpdateAI(const uint32 diff)
{
if (!me->isInCombat())
if (!m_creature->isInCombat())
return;
if (me->getThreatManager().isThreatListEmpty())
if (m_creature->getThreatManager().isThreatListEmpty())
{
EnterEvadeMode();
return;
@@ -136,11 +152,11 @@ struct boss_flame_leviathanAI : public BossAI
events.Update(diff);
if (me->hasUnitState(UNIT_STAT_CASTING))
if (m_creature->hasUnitState(UNIT_STAT_CASTING))
return;
uint32 eventId = events.GetEvent();
if (!me->getVictim())
if (!m_creature->getVictim())
eventId = EVENT_PURSUE;
switch(eventId)
@@ -150,13 +166,12 @@ struct boss_flame_leviathanAI : public BossAI
DoCastAOE(SPELL_PURSUED, true);
//events.RepeatEvent(35000); // this should not be used because eventId may be overriden
events.RescheduleEvent(EVENT_PURSUE, 35000);
if(!me->getVictim()) // all siege engines and demolishers are dead
if(!m_creature->getVictim()) // all siege engines and demolishers are dead
UpdateVictim(); // begin to kill other things
return;
case EVENT_MISSILE:
//TODO: without target no visual effect
//DoCastAOE(SPELL_MISSILE_BARRAGE);
DoCast(me->getVictim(), SPELL_MISSILE_BARRAGE);
if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM))
DoCast(pTarget, SPELL_MISSILE_BARRAGE);
events.RepeatEvent(1500);
return;
case EVENT_VENT:
@@ -169,17 +184,18 @@ struct boss_flame_leviathanAI : public BossAI
return;
case EVENT_SUMMON:
if(summons.size() < 15) // 4seat+1turret+10lift
if(Creature *lift = DoSummonFlyer(MOB_MECHANOLIFT, me, rand()%20 + 20, 50, 0))
if(Creature *lift = DoSummonFlyer(MOB_MECHANOLIFT, me, urand(20,40), 50, 0))
lift->GetMotionMaster()->MoveRandom(100);
events.RepeatEvent(2000);
return;
case EVENT_MIMIRON_INFERNO: // Not Blizzlike
DoCast(me->getVictim(), SPELL_MIMIRON_INFERNO);
events.RepeatEvent(60000 + (rand()%60000));
DoCast(m_creature->getVictim(), SPELL_MIMIRON_INFERNO);
events.RepeatEvent(urand(60000, 120000));
return;
case EVENT_HODIR_FURY: // Not Blizzlike
DoCast(me->getVictim(), SPELL_HODIR_FURY);
events.RepeatEvent(60000 + (rand()%60000));
DoCast(m_creature->getVictim(), SPELL_HODIR_FURY);
events.RepeatEvent(urand(60000, 120000));
return;
default:
events.PopEvent();
break;
@@ -197,7 +213,7 @@ struct boss_flame_leviathan_seatAI : public PassiveAI
{
assert(vehicle);
#ifdef BOSS_DEBUG
me->SetReactState(REACT_AGGRESSIVE);
m_creature->SetReactState(REACT_AGGRESSIVE);
#endif
}
@@ -214,17 +230,17 @@ struct boss_flame_leviathan_seatAI : public PassiveAI
void PassengerBoarded(Unit *who, int8 seatId, bool apply)
{
if(!me->GetVehicle())
if (!m_creature->GetVehicle())
return;
if(seatId == SEAT_PLAYER)
if (seatId == SEAT_PLAYER)
{
if(!apply)
return;
if(Creature *turret = CAST_CRE(vehicle->GetPassenger(SEAT_TURRET)))
{
turret->setFaction(me->GetVehicleBase()->getFaction());
turret->setFaction(m_creature->GetVehicleBase()->getFaction());
turret->SetUInt32Value(UNIT_FIELD_FLAGS, 0); // unselectable
turret->AI()->AttackStart(who);
}
@@ -234,12 +250,12 @@ struct boss_flame_leviathan_seatAI : public PassiveAI
device->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
}
}
else if(seatId == SEAT_TURRET)
else if (seatId == SEAT_TURRET)
{
if(apply)
if (apply)
return;
if(Unit *device = vehicle->GetPassenger(SEAT_DEVICE))
if (Unit *device = vehicle->GetPassenger(SEAT_DEVICE))
{
device->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
device->SetUInt32Value(UNIT_FIELD_FLAGS, 0); // unselectable
@@ -254,7 +270,7 @@ struct boss_flame_leviathan_defense_turretAI : public TurretAI
void DamageTaken(Unit *who, uint32 &damage)
{
if(!CanAIAttack(who))
if (!CanAIAttack(who))
damage = 0;
}
@@ -274,15 +290,15 @@ struct boss_flame_leviathan_overload_deviceAI : public PassiveAI
{
if(param == EVENT_SPELLCLICK)
{
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
if(me->GetVehicle())
m_creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
if(m_creature->GetVehicle())
{
if(Unit *player = me->GetVehicle()->GetPassenger(SEAT_PLAYER))
if(Unit *player = m_creature->GetVehicle()->GetPassenger(SEAT_PLAYER))
{
player->ExitVehicle();
me->GetVehicleBase()->CastSpell(player, SPELL_SMOKE_TRAIL, true);
if(Unit *leviathan = me->GetVehicleBase()->GetVehicleBase())
m_creature->GetVehicleBase()->CastSpell(player, SPELL_SMOKE_TRAIL, true);
if(Unit *leviathan = m_creature->GetVehicleBase()->GetVehicleBase())
player->GetMotionMaster()->MoveKnockbackFrom(leviathan->GetPositionX(), leviathan->GetPositionY(), 30, 30);
}
}
@@ -296,18 +312,18 @@ struct boss_flame_leviathan_safety_containerAI : public PassiveAI
void MovementInform(uint32 type, uint32 id)
{
if(id == me->GetEntry())
if(id == m_creature->GetEntry())
{
if(Creature *liquid = DoSummon(MOB_LIQUID, me, 0))
liquid->CastSpell(liquid, 62494, true);
me->DisappearAndDie(); // this will relocate creature to sky
m_creature->DisappearAndDie(); // this will relocate creature to sky
}
}
void UpdateAI(const uint32 diff)
{
if(!me->GetVehicle() && me->isSummon() && me->GetMotionMaster()->GetCurrentMovementGeneratorType() != POINT_MOTION_TYPE)
me->GetMotionMaster()->MoveFall(409.8f, me->GetEntry());
if(!m_creature->GetVehicle() && m_creature->isSummon() && m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() != POINT_MOTION_TYPE)
m_creature->GetMotionMaster()->MoveFall(409.8f, m_creature->GetEntry());
}
};
@@ -315,7 +331,7 @@ struct spell_pool_of_tarAI : public TriggerAI
{
spell_pool_of_tarAI(Creature *c) : TriggerAI(c)
{
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
}
void DamageTaken(Unit *who, uint32 &damage)
@@ -325,8 +341,8 @@ struct spell_pool_of_tarAI : public TriggerAI
void SpellHit(Unit* caster, const SpellEntry *spell)
{
if(spell->SchoolMask & SPELL_SCHOOL_MASK_FIRE && !me->HasAura(SPELL_BLAZE))
me->CastSpell(me, SPELL_BLAZE, true);
if(spell->SchoolMask & SPELL_SCHOOL_MASK_FIRE && !m_creature->HasAura(SPELL_BLAZE))
m_creature->CastSpell(me, SPELL_BLAZE, true);
}
};
@@ -19,42 +19,64 @@
#include "ScriptedPch.h"
#include "ulduar.h"
/*
#define SAY_AGGRO -1
#define SAY_SLAY -1
*/
enum Yells
{
SAY_AGGRO = -1603180,
SAY_AGGRO_WITH_ELDER = -1603181,
SAY_SLAY_1 = -1603182,
SAY_SLAY_2 = -1603183,
SAY_DEATH = -1603184,
SAY_BERSERK = -1603185,
SAY_SUMMON_CONSERVATOR = -1603186,
SAY_SUMMON_TRIO = -1603187,
SAY_SUMMON_LASHERS = -1603188,
SAY_YS_HELP = -1603189,
// Elder Brightleaf
SAY_BRIGHTLEAF_AGGRO = -1603190,
SAY_BRIGHTLEAF_SLAY_1 = -1603191,
SAY_BRIGHTLEAF_SLAY_2 = -1603192,
SAY_BRIGHTLEAF_DEATH = -1603193,
// Elder Ironbranch
SAY_IRONBRANCH_AGGRO = -1603194,
SAY_IRONBRANCH_SLAY_1 = -1603195,
SAY_IRONBRANCH_SLAY_2 = -1603196,
SAY_IRONBRANCH_DEATH = -1603197,
// Elder Stonebark
SAY_STONEBARK_AGGRO = -1603198,
SAY_STONEBARK_SLAY_1 = -1603199,
SAY_STONEBARK_SLAY_2 = -1603200,
SAY_STONEBARK_DEATH = -1603201,
};
struct boss_freyaAI : public BossAI
{
boss_freyaAI(Creature* pCreature) : BossAI(pCreature, TYPE_FREYA)
{
m_pInstance = pCreature->GetInstanceData();
Reset();
}
ScriptedInstance* m_pInstance;
void Reset()
{
_Reset();
}
void KilledUnit(Unit *victim)
{
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), m_creature);
}
void JustDied(Unit *victim)
{
if (m_pInstance)
m_pInstance->SetData(TYPE_FREYA, DONE);
DoScriptText(SAY_DEATH, m_creature);
_JustDied();
}
void Aggro(Unit* pWho)
void EnterCombat(Unit* pWho)
{
// DoScriptText(SAY_AGGRO, m_creature);
m_creature->SetInCombatWithZone();
if (m_pInstance)
m_pInstance->SetData(TYPE_FREYA, IN_PROGRESS);
DoScriptText(SAY_AGGRO, m_creature);
_EnterCombat();
}
void UpdateAI(const uint32 diff)
@@ -18,3 +18,14 @@
#include "ScriptedPch.h"
#include "ulduar.h"
enum Yells
{
SAY_AGGRO = -1603290,
SAY_SLAY_1 = -1603291,
SAY_SLAY_2 = -1603292,
SAY_KITE = -1603293,
SAY_DEATH = -1603294,
SAY_BERSERK = -1603295,
SAY_HARDMODE_ON = -1603296,
};
@@ -19,42 +19,45 @@
#include "ScriptedPch.h"
#include "ulduar.h"
/*
#define SAY_AGGRO -1
#define SAY_SLAY -1
*/
enum Yells
{
SAY_AGGRO = -1603210,
SAY_SLAY_1 = -1603211,
SAY_SLAY_2 = -1603212,
SAY_FLASH_FREEZE = -1603213,
SAY_STALACTITE = -1603214,
SAY_DEATH = -1603215,
SAY_BERSERK = -1603216,
SAY_YS_HELP = -1603217,
SAY_HARD_MODE_MISSED = -1603218,
};
struct boss_hodirAI : public BossAI
{
boss_hodirAI(Creature *pCreature) : BossAI(pCreature, TYPE_HODIR)
{
m_pInstance = pCreature->GetInstanceData();
Reset();
}
ScriptedInstance* m_pInstance;
void Reset()
{
_Reset();
}
void KilledUnit(Unit *victim)
{
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), m_creature);
}
void JustDied(Unit *victim)
{
if (m_pInstance)
m_pInstance->SetData(TYPE_HODIR, DONE);
DoScriptText(SAY_DEATH, m_creature);
_JustDied();
}
void Aggro(Unit* pWho)
void EnterCombat(Unit* pWho)
{
// DoScriptText(SAY_AGGRO, m_creature);
m_creature->SetInCombatWithZone();
if (m_pInstance)
m_pInstance->SetData(TYPE_HODIR, IN_PROGRESS);
DoScriptText(SAY_AGGRO, m_creature);
_EnterCombat();
}
void UpdateAI(const uint32 diff)
@@ -67,9 +70,7 @@ struct boss_hodirAI : public BossAI
DoMeleeAttackIfReady();
EnterEvadeIfOutOfCombatArea(diff);
}
};
CreatureAI* GetAI_boss_hodir(Creature* pCreature)
@@ -86,4 +87,3 @@ void AddSC_boss_hodir()
newscript->RegisterSelf();
}
@@ -23,37 +23,50 @@
#define SPELL_SCORCH 62546
#define SPELL_SLAG_POT 62717
//wrong ids. not in db
#define SAY_AGGRO -10000002
#define SAY_SLAY -1000003
enum Yells
{
SAY_AGGRO = -1603220,
SAY_SLAY_1 = -1603221,
SAY_SLAY_2 = -1603222,
SAY_DEATH = -1603223,
SAY_SUMMON = -1603224,
SAY_SLAG_POT = -1603225,
SAY_SCORCH_1 = -1603226,
SAY_SCORCH_2 = -1603227,
SAY_BERSERK = -1603228,
};
struct boss_ignis_AI : public BossAI
{
boss_ignis_AI(Creature *pCreature) : BossAI(pCreature, TYPE_IGNIS) {}
uint32 FLAME_JETS_Timer;
uint32 SCORCH_Timer;
uint32 SLAG_POT_Timer;
uint32 uiFlameJetsTimer;
uint32 uiScorchTimer;
uint32 uiSlagPotTimer;
void Reset()
{
FLAME_JETS_Timer = 32000;
SCORCH_Timer = 100;
SLAG_POT_Timer = 100;
_Reset();
uiFlameJetsTimer = 32000;
uiScorchTimer = 100;
uiSlagPotTimer = 100;
}
void EnterCombat(Unit* who)
{
DoScriptText(SAY_AGGRO,m_creature);
_EnterCombat();
}
void KilledUnit(Unit* victim)
{
DoScriptText(SAY_SLAY, m_creature);
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), m_creature);
}
void JustDied(Unit *victim)
{
DoScriptText(SAY_SLAY, m_creature);
DoScriptText(SAY_DEATH, m_creature);
_JustDied();
}
void MoveInLineOfSight(Unit* who) {}
@@ -63,7 +76,7 @@ struct boss_ignis_AI : public BossAI
if (!UpdateVictim())
return;
if(m_creature->GetPositionY() < 150 || m_creature->GetPositionX() < 450) // Not Blizzlike, anti-exploit to prevent players from pulling bosses to vehicles.
if (m_creature->GetPositionY() < 150 || m_creature->GetPositionX() < 450) // Not Blizzlike, anti-exploit to prevent players from pulling bosses to vehicles.
{
m_creature->RemoveAllAuras();
m_creature->DeleteThreatList();
@@ -71,26 +84,28 @@ struct boss_ignis_AI : public BossAI
m_creature->GetMotionMaster()->MoveTargetedHome();
}
if (FLAME_JETS_Timer <= diff)
if (uiFlameJetsTimer <= diff)
{
DoCast(SPELL_FLAME_JETS);
DoScriptText(SAY_SLAY, m_creature);
FLAME_JETS_Timer = 25000;
} else FLAME_JETS_Timer -= diff;
uiFlameJetsTimer = 25000;
} else uiFlameJetsTimer -= diff;
if (SCORCH_Timer <= diff)
if (uiScorchTimer <= diff)
{
DoScriptText(RAND(SAY_SCORCH_1,SAY_SCORCH_2), m_creature);
DoCast(SPELL_SCORCH);
SCORCH_Timer = 20000;
} else SCORCH_Timer -= diff;
uiScorchTimer = 20000;
} else uiScorchTimer -= diff;
if (SLAG_POT_Timer <= diff)
if (uiSlagPotTimer <= diff)
{
if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
{
DoScriptText(SAY_SLAG_POT, m_creature);
DoCast(pTarget, SPELL_SLAG_POT);
DoScriptText(SAY_SLAY, m_creature);
SLAG_POT_Timer = 30000;
} else SLAG_POT_Timer -= diff;
}
uiSlagPotTimer = 30000;
} else uiSlagPotTimer -= diff;
DoMeleeAttackIfReady();
}
@@ -37,19 +37,29 @@ enum Events
EVENT_SWEEP,
};
enum Yells
{
SAY_AGGRO = -1603230,
SAY_SLAY_1 = -1603231,
SAY_SLAY_2 = -1603232,
SAY_LEFT_ARM_GONE = -1603233,
SAY_RIGHT_ARM_GONE = -1603234,
SAY_SHOCKWAVE = -1603235,
SAY_GRAB_PLAYER = -1603236,
SAY_DEATH = -1603237,
SAY_BERSERK = -1603238,
};
struct boss_kologarnAI : public BossAI
{
boss_kologarnAI(Creature *pCreature) : BossAI(pCreature, TYPE_KOLOGARN), vehicle(me->GetVehicleKit()),
boss_kologarnAI(Creature *pCreature) : BossAI(pCreature, TYPE_KOLOGARN), vehicle(pCreature->GetVehicleKit()),
left(false), right(false)
{
m_pInstance = me->GetInstanceData();
assert(vehicle);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED); // i think this is a hack, but there is no other way to disable his rotation
}
ScriptedInstance* m_pInstance;
Vehicle *vehicle;
bool left, right;
@@ -60,17 +70,22 @@ struct boss_kologarnAI : public BossAI
void JustDied(Unit *victim)
{
if (m_pInstance)
m_pInstance->SetData(TYPE_KOLOGARN, DONE);
DoScriptText(SAY_DEATH, m_creature);
_JustDied();
}
void KilledUnit(Unit* who)
{
DoScriptText(RAND(SAY_SLAY_2,SAY_SLAY_2), m_creature);
}
void PassengerBoarded(Unit *who, int8 seatId, bool apply)
{
if(who->GetTypeId() == TYPEID_UNIT)
if (who->GetTypeId() == TYPEID_UNIT)
{
if(who->GetEntry() == 32933)
if (who->GetEntry() == 32933)
left = apply;
else if(who->GetEntry() == 32934)
else if (who->GetEntry() == 32934)
right = apply;
who->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
CAST_CRE(who)->SetReactState(REACT_PASSIVE);
@@ -79,6 +94,7 @@ struct boss_kologarnAI : public BossAI
void EnterCombat(Unit *who)
{
DoScriptText(SAY_AGGRO, m_creature);
_EnterCombat();
events.ScheduleEvent(EVENT_SMASH, 5000);
events.ScheduleEvent(EVENT_SWEEP, 10000);
@@ -87,18 +103,19 @@ struct boss_kologarnAI : public BossAI
void UpdateAI(const uint32 diff)
{
if(!UpdateVictim())
if (!UpdateVictim())
return;
events.Update(diff);
if(me->hasUnitState(UNIT_STAT_CASTING))
if (me->hasUnitState(UNIT_STAT_CASTING))
return;
// TODO: because we are using hack, he is stunned and cannot cast, so we use triggered for every spell
switch(events.GetEvent())
{
case EVENT_NONE: break;
case EVENT_NONE:
break;
case EVENT_SMASH:
if(left && right)
DoCastVictim(SPELL_TWO_ARM_SMASH, true);
@@ -18,3 +18,27 @@
#include "ScriptedPch.h"
#include "ulduar.h"
enum Yells
{
SAY_AGGRO = -1603240,
SAY_HARDMODE_ON = -1603241,
SAY_MKII_ACTIVATE = -1603242,
SAY_MKII_SLAY_1 = -1603243,
SAY_MKII_SLAY_2 = -1603244,
SAY_MKII_DEATH = -1603245,
SAY_VX001_ACTIVATE = -1603246,
SAY_VX001_SLAY_1 = -1603247,
SAY_VX001_SLAY_2 = -1603248,
SAY_VX001_DEATH = -1603249,
SAY_AERIAL_ACTIVATE = -1603250,
SAY_AERIAL_SLAY_1 = -1603251,
SAY_AERIAL_SLAY_2 = -1603252,
SAY_AERIAL_DEATH = -1603253,
SAY_V07TRON_ACTIVATE = -1603254,
SAY_V07TRON_SLAY_1 = -1603255,
SAY_V07TRON_SLAY_2 = -1603256,
SAY_V07TRON_DEATH = -1603257,
SAY_BERSERK = -1603258,
SAY_YS_HELP = -1603259,
};
@@ -19,42 +19,60 @@
#include "ScriptedPch.h"
#include "ulduar.h"
/*
#define SAY_AGGRO -1
#define SAY_SLAY -1
*/
enum Yells
{
SAY_AGGRO_1 = -1603270,
SAY_AGGRO_2 = -1603271,
SAY_SPECIAL_1 = -1603272,
SAY_SPECIAL_2 = -1603273,
SAY_SPECIAL_3 = -1603274,
SAY_JUMPDOWN = -1603275,
SAY_SLAY_1 = -1603276,
SAY_SLAY_2 = -1603277,
SAY_BERSERK = -1603278,
SAY_WIPE = -1603279,
SAY_DEATH = -1603280,
SAY_END_NORMAL_1 = -1603281,
SAY_END_NORMAL_2 = -1603282,
SAY_END_NORMAL_3 = -1603283,
SAY_END_HARD_1 = -1603284,
SAY_END_HARD_2 = -1603285,
SAY_END_HARD_3 = -1603286,
SAY_YS_HELP = -1603287,
};
struct boss_thorimAI : public BossAI
{
boss_thorimAI(Creature* pCreature) : BossAI(pCreature, TYPE_THORIM)
{
m_pInstance = pCreature->GetInstanceData();
Reset();
}
ScriptedInstance* m_pInstance;
void Reset()
{
_Reset();
}
void EnterEvadeMode()
{
DoScriptText(SAY_WIPE, m_creature);
_EnterEvadeMode();
}
void KilledUnit(Unit *victim)
{
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), m_creature);
}
void JustDied(Unit *victim)
{
if (m_pInstance)
m_pInstance->SetData(TYPE_THORIM, DONE);
DoScriptText(SAY_DEATH, m_creature);
_JustDied();
}
void Aggro(Unit* pWho)
void EnterCombat(Unit* pWho)
{
// DoScriptText(SAY_AGGRO, m_creature);
m_creature->SetInCombatWithZone();
if (m_pInstance)
m_pInstance->SetData(TYPE_THORIM, IN_PROGRESS);
DoScriptText(RAND(SAY_AGGRO_1,SAY_AGGRO_2), m_creature);
_EnterCombat();
}
void UpdateAI(const uint32 diff)
@@ -67,9 +85,7 @@ struct boss_thorimAI : public BossAI
DoMeleeAttackIfReady();
EnterEvadeIfOutOfCombatArea(diff);
}
};
CreatureAI* GetAI_boss_thorim(Creature* pCreature)
@@ -84,5 +100,4 @@ void AddSC_boss_thorim()
newscript->Name = "boss_thorim";
newscript->GetAI = &GetAI_boss_thorim;
newscript->RegisterSelf();
}
@@ -16,86 +16,788 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/*
TODO:
Add achievments
Boombot explosion only hurt allies to the npc at the moment
Boombot explosion visual
Test the enrage timer
Fix gravity bomb - tractor beam.
Fix void zone spell
If the boss is to close to a scrap pile -> no summon
make the life sparks visible...
*/
#include "ScriptedPch.h"
#include "ulduar.h"
#define SPELL_SEARING_LIGHT 63018
#define SPELL_SONIC_BOOM 38897
enum Spells
{
SPELL_TYMPANIC_TANTRUM = 62776,
SPELL_SEARING_LIGHT_10 = 63018,
SPELL_SEARING_LIGHT_25 = 65121,
#define SAY_AGGRO -1000000
#define SAY_SLAY -1000001
SPELL_GRAVITY_BOMB_10 = 63024,
SPELL_GRAVITY_BOMB_25 = 63234,
SPELL_GRAVITY_BOMB_AURA_10 = 63025,
SPELL_GRAVITY_BOMB_AURA_25 = 63233,
SPELL_HEARTBREAK_10 = 65737,
SPELL_HEARTBREAK_25 = 64193,
SPELL_ENRAGE = 26662,
//------------------VOID ZONE--------------------
SPELL_VOID_ZONE_10 = 64203,
SPELL_VOID_ZONE_25 = 64235,
// Life Spark
SPELL_STATIC_CHARGED_10 = 64227,
SPELL_STATIC_CHARGED_25 = 64236,
SPELL_SHOCK = 64230,
//----------------XT-002 HEART-------------------
SPELL_EXPOSED_HEART = 63849,
//---------------XM-024 PUMMELLER----------------
SPELL_ARCING_SMASH = 8374,
SPELL_TRAMPLE = 5568,
SPELL_UPPERCUT = 10966,
//------------------BOOMBOT-----------------------
SPELL_BOOM = 62834,
};
enum Timers
{
TIMER_TYMPANIC_TANTRUM_MIN = 32000,
TIMER_TYMPANIC_TANTRUM_MAX = 36000,
TIMER_SEARING_LIGHT = 20000,
TIMER_SPAWN_LIFE_SPARK = 9000,
TIMER_GRAVITY_BOMB = 20000,
TIMER_HEART_PHASE = 30000,
TIMER_ENRAGE = 600000,
TIMER_GRAVITY_BOMB_AURA = 8900,
TIMER_VOID_ZONE = 3000,
// Life Spark
TIMER_SHOCK = 12000,
// Pummeller
// Timers may be off
TIMER_ARCING_SMASH = 27000,
TIMER_TRAMPLE = 22000,
TIMER_UPPERCUT = 17000,
TIMER_SPAWN_ADD = 12000,
};
enum Creatures
{
NPC_VOID_ZONE = 34001,
NPC_LIFE_SPARK = 34004,
NPC_XT002_HEART = 33329,
NPC_XS013_SCRAPBOT = 33343,
NPC_XM024_PUMMELLER = 33344,
NPC_XE321_BOOMBOT = 33346,
};
enum Actions
{
ACTION_ENTER_HARD_MODE = 0,
};
enum XT002Data
{
DATA_TRANSFERED_HEALTH = 0,
};
enum Yells
{
SAY_AGGRO = -1603300,
SAY_HEART_OPENED = -1603301,
SAY_HEART_CLOSED = -1603302,
SAY_TYMPANIC_TANTRUM = -1603303,
SAY_SLAY_1 = -1603304,
SAY_SLAY_2 = -1603305,
SAY_BERSERK = -1603306,
SAY_DEATH = -1603307,
SAY_SUMMON = -1603308,
};
//#define GRAVITY_BOMB_DMG_MIN_10 11700
//#define GRAVITY_BOMB_DMG_MAX_10 12300
//#define GRAVITY_BOMB_DMG_MIN_25 14625
//#define GRAVITY_BOMB_DMG_MAX_25 15375
//#define GRAVITY_BOMB_RADIUS 12
//#define VOID_ZONE_DMG_10 5000
//#define VOID_ZONE_DMG_25 7500
//#define VOID_ZONE_RADIUS
/************************************************
-----------------SPAWN LOCATIONS-----------------
************************************************/
//Shared Z-level
#define SPAWN_Z 412
//Lower right
#define LR_X 796
#define LR_Y -94
//Lower left
#define LL_X 796
#define LL_Y 57
//Upper right
#define UR_X 890
#define UR_Y -82
//Upper left
#define UL_X 894
#define UL_Y 62
/*-------------------------------------------------------
*
* XT-002 DECONSTRUCTOR
*
*///----------------------------------------------------
struct boss_xt002_AI : public BossAI
{
boss_xt002_AI(Creature *pCreature) : BossAI(pCreature, TYPE_XT002)
{
m_pInstance = pCreature->GetInstanceData();
}
ScriptedInstance* m_pInstance;
uint32 uiSearingLightTimer;
uint32 uiSpawnLifeSparkTimer;
uint32 uiGravityBombTimer;
uint32 uiGravityBombAuraTimer;
uint32 uiTympanicTantrumTimer;
uint32 uiHeartPhaseTimer;
uint32 uiSpawnAddTimer;
uint32 uiEnrageTimer;
bool searing_light_active;
uint64 uiSearingLightTarget;
uint32 SEARING_LIGHT_Timer;
uint32 SONIC_BOOM_Timer;
bool gravity_bomb_active;
uint64 uiGravityBombTarget;
uint8 phase;
uint8 heart_exposed;
bool enraged;
uint32 transferHealth;
bool enterHardMode;
bool hardMode;
void Reset()
{
SEARING_LIGHT_Timer = 100;
SONIC_BOOM_Timer = 20;
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NOT_SELECTABLE);
//Makes XT-002 to cast a light bomb 10 seconds after aggro.
uiSearingLightTimer = TIMER_SEARING_LIGHT/2;
uiSpawnLifeSparkTimer = TIMER_SPAWN_LIFE_SPARK;
uiGravityBombTimer = TIMER_GRAVITY_BOMB;
uiGravityBombAuraTimer = TIMER_GRAVITY_BOMB_AURA;
uiHeartPhaseTimer = TIMER_HEART_PHASE;
uiSpawnAddTimer = TIMER_SPAWN_ADD;
uiEnrageTimer = TIMER_ENRAGE;
//Tantrum is casted a bit slower the first time.
uiTympanicTantrumTimer = urand(TIMER_TYMPANIC_TANTRUM_MIN, TIMER_TYMPANIC_TANTRUM_MAX) * 2;
searing_light_active = false;
gravity_bomb_active = false;
enraged = false;
hardMode = false;
enterHardMode = false;
phase = 1;
heart_exposed = 0;
}
void EnterCombat(Unit* who)
{
DoScriptText(SAY_AGGRO,m_creature);
DoScriptText(SAY_AGGRO, m_creature);
_EnterCombat();
}
void DoAction(const int32 action)
{
switch (action)
{
case ACTION_ENTER_HARD_MODE:
if (!hardMode)
{
hardMode = true;
// Enter hard mode
enterHardMode = true;
// set max health
m_creature->SetHealth(m_creature->GetMaxHealth());
// Get his heartbreak buff
m_creature->CastSpell(m_creature, RAID_MODE(SPELL_HEARTBREAK_10, SPELL_HEARTBREAK_25), true);
}
break;
}
}
void SetData(uint32 id, uint32 value)
{
switch(id)
{
case DATA_TRANSFERED_HEALTH:
transferHealth = value;
break;
}
}
void KilledUnit(Unit* victim)
{
DoScriptText(SAY_SLAY, m_creature);
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), m_creature);
}
void JustDied(Unit *victim)
{
DoScriptText(SAY_SLAY, m_creature);
if (m_pInstance)
m_pInstance->SetData(TYPE_XT002, DONE);
DoScriptText(SAY_DEATH, m_creature);
_JustDied();
}
void MoveInLineOfSight(Unit* who) {}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
if(m_creature->GetPositionX() < 700) // Not Blizzlike, anti-exploit to prevent players from pulling bosses to vehicles.
if (enterHardMode)
{
m_creature->RemoveAllAuras();
m_creature->DeleteThreatList();
m_creature->CombatStop(false);
m_creature->GetMotionMaster()->MoveTargetedHome();
SetPhaseOne();
enterHardMode = false;
}
if (SEARING_LIGHT_Timer <= diff)
// Handles spell casting. These spells only occur during phase 1 and hard mode
if (phase == 1 || hardMode)
{
DoCast(m_creature, SPELL_SEARING_LIGHT);
DoScriptText(SAY_SLAY, m_creature);
SEARING_LIGHT_Timer = 50000;
} else SEARING_LIGHT_Timer -= diff;
if (uiSearingLightTimer <= diff)
{
if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
{
DoCast(pTarget, RAID_MODE(SPELL_SEARING_LIGHT_10, SPELL_SEARING_LIGHT_25));
uiSearingLightTarget = pTarget->GetGUID();
}
uiSpawnLifeSparkTimer = TIMER_SPAWN_LIFE_SPARK;
if (hardMode)
searing_light_active = true;
uiSearingLightTimer = TIMER_SEARING_LIGHT;
} else uiSearingLightTimer -= diff;
if (SONIC_BOOM_Timer <= diff)
if (uiGravityBombTimer <= diff)
{
if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
{
DoCast(pTarget, RAID_MODE(SPELL_GRAVITY_BOMB_10,SPELL_GRAVITY_BOMB_25));
uiGravityBombTarget = pTarget->GetGUID();
}
uiGravityBombTimer = TIMER_GRAVITY_BOMB;
gravity_bomb_active = true;
} else uiGravityBombTimer -= diff;
if (uiTympanicTantrumTimer <= 0)
{
DoScriptText(SAY_TYMPANIC_TANTRUM, m_creature);
DoCast(SPELL_TYMPANIC_TANTRUM);
uiTympanicTantrumTimer = urand(TIMER_TYMPANIC_TANTRUM_MIN, TIMER_TYMPANIC_TANTRUM_MAX);
} else uiTympanicTantrumTimer -= diff;
}
if (!hardMode)
{
DoCast(m_creature->getVictim(), SPELL_SONIC_BOOM);
SONIC_BOOM_Timer = 20000;
} else SONIC_BOOM_Timer -= diff;
if (phase == 1)
{
if (HealthBelowPct(75) && heart_exposed == 0)
{
exposeHeart();
}
else if (HealthBelowPct(50) && heart_exposed == 1)
{
exposeHeart();
}
else if (HealthBelowPct(25) && heart_exposed == 2)
{
exposeHeart();
}
DoMeleeAttackIfReady();
}
else
{
//Stop moving
m_creature->StopMoving();
//Start summoning adds
if (uiSpawnAddTimer <= diff)
{
DoScriptText(SAY_SUMMON, m_creature);
// Spawn Pummeller
switch (rand() % 4)
{
case 0: m_creature->SummonCreature(NPC_XM024_PUMMELLER, LR_X, LR_Y, SPAWN_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break;
case 1: m_creature->SummonCreature(NPC_XM024_PUMMELLER, LL_X, LL_Y, SPAWN_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break;
case 2: m_creature->SummonCreature(NPC_XM024_PUMMELLER, UR_X, UR_Y, SPAWN_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break;
case 3: m_creature->SummonCreature(NPC_XM024_PUMMELLER, UL_X, UL_Y, SPAWN_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break;
}
// Spawn 5 Bombs
for (int8 n = 0; n < 5; n++)
{
//Some randomes are added so they wont spawn in a pile
switch(rand() % 4)
{
case 0: m_creature->SummonCreature(NPC_XS013_SCRAPBOT, irand(LR_X - 3, LR_X + 3), irand(LR_Y - 3, LR_Y + 3), SPAWN_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break;
case 1: m_creature->SummonCreature(NPC_XS013_SCRAPBOT, irand(LL_X - 3, LL_X + 3), irand(LL_Y - 3, LL_Y + 3), SPAWN_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break;
case 2: m_creature->SummonCreature(NPC_XS013_SCRAPBOT, irand(UR_X - 3, UR_X + 3), irand(UR_Y - 3, UR_Y + 3), SPAWN_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break;
case 3: m_creature->SummonCreature(NPC_XS013_SCRAPBOT, irand(UL_X - 3, UL_X + 3), irand(UL_Y - 3, UL_Y + 3), SPAWN_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break;
}
}
//Spawn 5 Scrapbots
switch (rand() % 4)
{
case 0: m_creature->SummonCreature(NPC_XE321_BOOMBOT, LR_X, LR_Y, SPAWN_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break;
case 1: m_creature->SummonCreature(NPC_XE321_BOOMBOT, LL_X, LL_Y, SPAWN_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break;
case 2: m_creature->SummonCreature(NPC_XE321_BOOMBOT, UR_X, UR_Y, SPAWN_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break;
case 3: m_creature->SummonCreature(NPC_XE321_BOOMBOT, UL_X, UL_Y, SPAWN_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break;
}
uiSpawnAddTimer = TIMER_SPAWN_ADD;
} else uiSpawnAddTimer -= diff;
// Is the phase over?
if (uiHeartPhaseTimer <= diff)
{
DoScriptText(SAY_HEART_CLOSED, m_creature);
SetPhaseOne();
}
else
uiHeartPhaseTimer -= diff;
}
}
else
{
// Adding life sparks when searing light debuff runs out if hard mode
if (searing_light_active)
{
if (uiSpawnLifeSparkTimer <= diff)
{
if (Unit *pSearingLightTarget = m_creature->GetUnit(*m_creature, uiSearingLightTarget))
pSearingLightTarget->SummonCreature(NPC_LIFE_SPARK, pSearingLightTarget->GetPositionX(), pSearingLightTarget->GetPositionY(), pSearingLightTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000);
uiSpawnLifeSparkTimer = TIMER_SPAWN_LIFE_SPARK;
searing_light_active = false;
} else uiSpawnLifeSparkTimer -= diff;
}
DoMeleeAttackIfReady();
}
if (gravity_bomb_active)
{
if (uiGravityBombAuraTimer <= diff)
{
if (Unit *pGravityBombTarget = m_creature->GetUnit(*m_creature, uiGravityBombTarget))
{
pGravityBombTarget->RemoveAurasDueToSpell(RAID_MODE(SPELL_GRAVITY_BOMB_10,SPELL_GRAVITY_BOMB_25));
if (hardMode)
{
//Remains spawned for 3 minutes
pGravityBombTarget->SummonCreature(NPC_VOID_ZONE, pGravityBombTarget->GetPositionX(), pGravityBombTarget->GetPositionY(), pGravityBombTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 180000);
}
}
gravity_bomb_active = false;
uiGravityBombAuraTimer = TIMER_GRAVITY_BOMB_AURA;
//gravityBomb();
} else uiGravityBombAuraTimer -= diff;
}
//Enrage stuff
if (!enraged)
if (uiEnrageTimer <= diff)
{
DoScriptText(SAY_BERSERK, m_creature);
DoCast(m_creature, SPELL_ENRAGE);
enraged = true;
} else uiEnrageTimer -= diff;
}
void exposeHeart()
{
//Make untargetable
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
//Summon the heart npc
m_creature->SummonCreature(NPC_XT002_HEART, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ() + 7, 0, TEMPSUMMON_TIMED_DESPAWN, TIMER_HEART_PHASE);
// Start "end of phase 2 timer"
uiHeartPhaseTimer = TIMER_HEART_PHASE;
//Phase 2 has offically started
phase = 2;
heart_exposed++;
//Reset the add spawning timer
uiSpawnAddTimer = TIMER_SPAWN_ADD;
DoScriptText(SAY_HEART_OPENED, m_creature);
}
void SetPhaseOne()
{
uiSearingLightTimer = TIMER_SEARING_LIGHT / 2;
uiGravityBombTimer = TIMER_GRAVITY_BOMB;
uiTympanicTantrumTimer = urand(TIMER_TYMPANIC_TANTRUM_MIN, TIMER_TYMPANIC_TANTRUM_MAX);
uiSpawnAddTimer = TIMER_SPAWN_ADD;
if (!hardMode)
m_creature->ModifyHealth(-transferHealth);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
phase = 1;
}
// TODO: put in comment and kept for reference. The spell should be fixed properly in spell system, if necessary.
////Have to do this the custom way since the original spell messes up player movement
//void gravityBomb()
//{
// uint32 maxDamage = RAID_MODE(GRAVITY_BOMB_DMG_MAX_10, GRAVITY_BOMB_DMG_MAX_25);
// uint32 minDamage = RAID_MODE(GRAVITY_BOMB_DMG_MIN_10, GRAVITY_BOMB_DMG_MIN_25);
// uint16 range = GRAVITY_BOMB_RADIUS;
// Map* pMap = me->GetMap();
// if (pMap && pMap->IsDungeon())
// {
// Map::PlayerList const &PlayerList = pMap->GetPlayers();
// for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
// {
// //If a player is within the range of the spell
// if (i->getSource() && i->getSource()->GetDistance2d(pGravityBombTarget) <= range)
// {
// //Deal damage to the victim
// int32 damage = urand(minDamage, maxDamage);
// i->getSource()->ModifyHealth(-damage);
// m_creature->SendSpellNonMeleeDamageLog(i->getSource(), SPELL_GRAVITY_BOMB_AURA_10, damage, SPELL_SCHOOL_MASK_SHADOW, 0, 0, false, 0);
// //Replacing the tractor beam effect
// i->getSource()->JumpTo(pGravityBombTarget, 5);
// }
// }
// }
//}
};
CreatureAI* GetAI_boss_xt002(Creature* pCreature)
{
return new boss_xt002_AI(pCreature);
}
/*-------------------------------------------------------
*
* XT-002 HEART
*
*///----------------------------------------------------
struct mob_xt002_heartAI : public ScriptedAI
{
mob_xt002_heartAI(Creature* pCreature) : ScriptedAI(pCreature)
{
m_pInstance = pCreature->GetInstanceData();
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_STUNNED);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
DoCast(m_creature, SPELL_EXPOSED_HEART);
}
ScriptedInstance* m_pInstance;
void JustDied(Unit *victim)
{
if (m_pInstance)
if (Creature* pXT002 = m_creature->GetCreature(*m_creature, m_pInstance->GetData64(TYPE_XT002)))
if (pXT002->AI())
pXT002->AI()->DoAction(ACTION_ENTER_HARD_MODE);
//removes the aura
m_creature->RemoveAurasDueToSpell(SPELL_EXPOSED_HEART);
}
void DamageTaken(Unit *pDone, uint32 &damage)
{
if (Creature* pXT002 = m_creature->GetCreature(*m_creature, m_pInstance->GetData64(TYPE_XT002)))
if (pXT002->AI())
{
uint32 health = m_creature->GetHealth();
health -= damage;
if (health < 0)
health = 0;
pXT002->AI()->SetData(DATA_TRANSFERED_HEALTH, m_creature->GetMaxHealth() - health);
}
}
};
CreatureAI* GetAI_mob_xt002_heart(Creature* pCreature)
{
return new mob_xt002_heartAI(pCreature);
}
/*-------------------------------------------------------
*
* XS-013 SCRAPBOT
*
*///----------------------------------------------------
struct mob_scrapbotAI : public ScriptedAI
{
mob_scrapbotAI(Creature* pCreature) : ScriptedAI(pCreature)
{
m_pInstance = m_creature->GetInstanceData();
}
ScriptedInstance* m_pInstance;
void Reset()
{
m_creature->SetReactState(REACT_PASSIVE);
if (Creature* pXT002 = m_creature->GetCreature(*m_creature, m_pInstance->GetData64(TYPE_XT002)))
m_creature->GetMotionMaster()->MoveChase(pXT002);
}
void UpdateAI(const uint32 diff)
{
if (Creature* pXT002 = m_creature->GetCreature(*m_creature, m_pInstance->GetData64(TYPE_XT002)))
{
if (m_creature->GetDistance2d(pXT002) <= 0.5)
{
// TODO Send raid message
// Increase health with 1 percent
pXT002->ModifyHealth(pXT002->GetMaxHealth() * 0.01);
// Despawns the scrapbot
m_creature->ForcedDespawn();
}
}
}
};
CreatureAI* GetAI_mob_scrapbot(Creature* pCreature)
{
return new mob_scrapbotAI(pCreature);
}
/*-------------------------------------------------------
*
* XM-024 PUMMELLER
*
*///----------------------------------------------------
struct mob_pummellerAI : public ScriptedAI
{
mob_pummellerAI(Creature* pCreature) : ScriptedAI(pCreature)
{
m_pInstance = pCreature->GetInstanceData();
}
ScriptedInstance* m_pInstance;
int32 uiArcingSmashTimer;
int32 uiTrampleTimer;
int32 uiUppercutTimer;
void Reset()
{
uiArcingSmashTimer = TIMER_ARCING_SMASH;
uiTrampleTimer = TIMER_TRAMPLE;
uiUppercutTimer = TIMER_UPPERCUT;
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
if (m_creature->IsWithinMeleeRange(m_creature->getVictim()))
{
if (uiArcingSmashTimer <= diff)
{
DoCast(m_creature->getVictim(), SPELL_ARCING_SMASH);
uiArcingSmashTimer = TIMER_ARCING_SMASH;
} else uiArcingSmashTimer -= diff;
if (uiTrampleTimer <= diff)
{
DoCast(m_creature->getVictim(), SPELL_TRAMPLE);
uiTrampleTimer = TIMER_TRAMPLE;
} else uiTrampleTimer -= diff;
if (uiUppercutTimer <= diff)
{
DoCast(m_creature->getVictim(), SPELL_UPPERCUT);
uiUppercutTimer = TIMER_UPPERCUT;
} else uiUppercutTimer -= diff;
}
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI_boss_xt002(Creature* pCreature)
CreatureAI* GetAI_mob_pummeller(Creature* pCreature)
{
return new boss_xt002_AI (pCreature);
return new mob_pummellerAI(pCreature);
}
/*-------------------------------------------------------
*
* XE-321 BOOMBOT
*
*///----------------------------------------------------
struct mob_boombotAI : public ScriptedAI
{
mob_boombotAI(Creature* pCreature) : ScriptedAI(pCreature)
{
m_pInstance = pCreature->GetInstanceData();
}
ScriptedInstance* m_pInstance;
void Reset()
{
m_creature->SetReactState(REACT_PASSIVE);
if (Creature* pXT002 = m_creature->GetCreature(*m_creature, m_pInstance->GetData64(TYPE_XT002)))
m_creature->GetMotionMaster()->MoveChase(pXT002);
}
void JustDied(Unit *killer)
{
DoCast(SPELL_BOOM);
}
void UpdateAI(const uint32 diff)
{
if (Creature* pXT002 = m_creature->GetCreature(*m_creature, m_pInstance->GetData64(TYPE_XT002)))
{
if (m_creature->GetDistance2d(pXT002) <= 0.5)
{
//Explosion
DoCast(m_creature, SPELL_BOOM);
//Despawns the boombot
m_creature->ForcedDespawn();
}
}
}
};
CreatureAI* GetAI_mob_boombot(Creature* pCreature)
{
return new mob_boombotAI(pCreature);
}
/*-------------------------------------------------------
*
* VOID ZONE
*
*///----------------------------------------------------
struct mob_void_zoneAI : public ScriptedAI
{
mob_void_zoneAI(Creature* pCreature) : ScriptedAI(pCreature)
{
m_pInstance = pCreature->GetInstanceData();
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
}
ScriptedInstance* m_pInstance;
uint32 uiVoidZoneTimer;
void Reset()
{
uiVoidZoneTimer = TIMER_VOID_ZONE;
}
void UpdateAI(const uint32 diff)
{
if (uiVoidZoneTimer <= diff)
{
//voidZone();
uiVoidZoneTimer = TIMER_VOID_ZONE;
} else uiVoidZoneTimer -= diff;
}
// TODO: put in comment and kept for reference. The spell should be fixed properly in spell system, if necessary.
//void voidZone()
//{
// Map* pMap = me->GetMap();
// if (pMap && pMap->IsDungeon())
// {
// Map::PlayerList const &PlayerList = pMap->GetPlayers();
// for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
// {
// // If a player is within the range of the spell
// if (i->getSource() && i->getSource()->GetDistance2d(m_creature) <= 16)
// {
// // Deal damage to the victim
// int32 damage = RAID_MODE(VOID_ZONE_DMG_10, VOID_ZONE_DMG_25);
// m_creature->DealDamage(i->getSource(), damage, NULL, SPELL_DIRECT_DAMAGE, SPELL_SCHOOL_MASK_SHADOW);
// }
// }
// }
//}
};
CreatureAI* GetAI_mob_void_zone(Creature* pCreature)
{
return new mob_void_zoneAI(pCreature);
}
/*-------------------------------------------------------
*
* LIFE SPARK
*
*///----------------------------------------------------
struct mob_life_sparkAI : public ScriptedAI
{
mob_life_sparkAI(Creature* pCreature) : ScriptedAI(pCreature)
{
m_pInstance = pCreature->GetInstanceData();
}
ScriptedInstance* m_pInstance;
uint32 uiShockTimer;
void Reset()
{
DoCast(m_creature, RAID_MODE(SPELL_STATIC_CHARGED_10, SPELL_STATIC_CHARGED_25));
uiShockTimer = 0; // first one is immediate.
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
if (uiShockTimer <= diff)
{
if (m_creature->IsWithinMeleeRange(m_creature->getVictim()))
{
DoCast(m_creature->getVictim(), SPELL_SHOCK);
uiShockTimer = TIMER_SHOCK;
}
}
else uiShockTimer -= diff;
}
};
CreatureAI* GetAI_mob_life_spark(Creature* pCreature)
{
return new mob_life_sparkAI(pCreature);
}
void AddSC_boss_xt002()
{
Script *newscript;
@@ -104,4 +806,34 @@ void AddSC_boss_xt002()
newscript->Name = "boss_xt002";
newscript->GetAI = &GetAI_boss_xt002;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "mob_xt002_heart";
newscript->GetAI = &GetAI_mob_xt002_heart;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "mob_scrapbot";
newscript->GetAI = &GetAI_mob_scrapbot;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "mob_pummeller";
newscript->GetAI = &GetAI_mob_pummeller;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "mob_boombot";
newscript->GetAI = &GetAI_mob_boombot;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "mob_void_zone";
newscript->GetAI = &GetAI_mob_void_zone;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "mob_life_spark";
newscript->GetAI = &GetAI_mob_life_spark;
newscript->RegisterSelf();
}
@@ -18,3 +18,33 @@
#include "ScriptedPch.h"
#include "ulduar.h"
enum Sara_Yells
{
SAY_SARA_PREFIGHT_1 = -1603310,
SAY_SARA_PREFIGHT_2 = -1603311,
SAY_SARA_AGGRO_1 = -1603312,
SAY_SARA_AGGRO_2 = -1603313,
SAY_SARA_AGGRO_3 = -1603314,
SAY_SARA_SLAY_1 = -1603315,
SAY_SARA_SLAY_2 = -1603316,
WHISP_SARA_INSANITY = -1603317,
SAY_SARA_PHASE2_1 = -1603318,
SAY_SARA_PHASE2_2 = -1603319,
};
enum YoggSaron_Yells
{
SAY_PHASE2_1 = -1603330,
SAY_PHASE2_2 = -1603331,
SAY_PHASE2_3 = -1603332,
SAY_PHASE2_4 = -1603333,
SAY_PHASE2_5 = -1603334,
SAY_PHASE3 = -1603335,
SAY_VISION = -1603336,
SAY_SLAY_1 = -1603337,
SAY_SLAY_2 = -1603338,
WHISP_INSANITY_1 = -1603339,
WHISP_INSANITY_2 = -1603340,
SAY_DEATH = -1603341,
};