aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTrazom62 <none@none>2010-03-21 17:17:34 +0100
committerTrazom62 <none@none>2010-03-21 17:17:34 +0100
commit450b2fba9db1df41613193f3f7bc7805bce23db3 (patch)
tree145bd21ac4048728133dc9ff5b54bc38c98d2a8c /src
parentc5f83416343882ab5a5c1548832dc675e999ad36 (diff)
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
Diffstat (limited to 'src')
-rw-r--r--src/scripts/northrend/ulduar/ulduar/boss_algalon.cpp202
-rw-r--r--src/scripts/northrend/ulduar/ulduar/boss_assembly_of_iron.cpp253
-rw-r--r--src/scripts/northrend/ulduar/ulduar/boss_auriaya.cpp29
-rw-r--r--src/scripts/northrend/ulduar/ulduar/boss_flame_leviathan.cpp170
-rw-r--r--src/scripts/northrend/ulduar/ulduar/boss_freya.cpp54
-rw-r--r--src/scripts/northrend/ulduar/ulduar/boss_general_vezax.cpp11
-rw-r--r--src/scripts/northrend/ulduar/ulduar/boss_hodir.cpp38
-rw-r--r--src/scripts/northrend/ulduar/ulduar/boss_ignis.cpp61
-rw-r--r--src/scripts/northrend/ulduar/ulduar/boss_kologarn.cpp41
-rw-r--r--src/scripts/northrend/ulduar/ulduar/boss_mimiron.cpp24
-rw-r--r--src/scripts/northrend/ulduar/ulduar/boss_thorim.cpp53
-rw-r--r--src/scripts/northrend/ulduar/ulduar/boss_xt002.cpp798
-rw-r--r--src/scripts/northrend/ulduar/ulduar/boss_yoggsaron.cpp30
13 files changed, 1351 insertions, 413 deletions
diff --git a/src/scripts/northrend/ulduar/ulduar/boss_algalon.cpp b/src/scripts/northrend/ulduar/ulduar/boss_algalon.cpp
index 32b5190ccf4..e8fae4512ea 100644
--- a/src/scripts/northrend/ulduar/ulduar/boss_algalon.cpp
+++ b/src/scripts/northrend/ulduar/ulduar/boss_algalon.cpp
@@ -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;
}
};
diff --git a/src/scripts/northrend/ulduar/ulduar/boss_assembly_of_iron.cpp b/src/scripts/northrend/ulduar/ulduar/boss_assembly_of_iron.cpp
index 2bb001b06da..d792fca56da 100644
--- a/src/scripts/northrend/ulduar/ulduar/boss_assembly_of_iron.cpp
+++ b/src/scripts/northrend/ulduar/ulduar/boss_assembly_of_iron.cpp
@@ -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;
}
}
diff --git a/src/scripts/northrend/ulduar/ulduar/boss_auriaya.cpp b/src/scripts/northrend/ulduar/ulduar/boss_auriaya.cpp
index 70109eeef03..c9103d3b82d 100644
--- a/src/scripts/northrend/ulduar/ulduar/boss_auriaya.cpp
+++ b/src/scripts/northrend/ulduar/ulduar/boss_auriaya.cpp
@@ -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;
diff --git a/src/scripts/northrend/ulduar/ulduar/boss_flame_leviathan.cpp b/src/scripts/northrend/ulduar/ulduar/boss_flame_leviathan.cpp
index dd28fb5ff41..b167156f2d9 100644
--- a/src/scripts/northrend/ulduar/ulduar/boss_flame_leviathan.cpp
+++ b/src/scripts/northrend/ulduar/ulduar/boss_flame_leviathan.cpp
@@ -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 Spells
+{
+ 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 Mobs
+enum Creatures
{
- MOB_MECHANOLIFT = 33214,
- MOB_LIQUID = 33189,
- MOB_CONTAINER = 33218,
+ 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);
}
};
diff --git a/src/scripts/northrend/ulduar/ulduar/boss_freya.cpp b/src/scripts/northrend/ulduar/ulduar/boss_freya.cpp
index e44cdffff66..9e5dcc1eb55 100644
--- a/src/scripts/northrend/ulduar/ulduar/boss_freya.cpp
+++ b/src/scripts/northrend/ulduar/ulduar/boss_freya.cpp
@@ -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)
diff --git a/src/scripts/northrend/ulduar/ulduar/boss_general_vezax.cpp b/src/scripts/northrend/ulduar/ulduar/boss_general_vezax.cpp
index a9f1be65f2d..f84c638d3e3 100644
--- a/src/scripts/northrend/ulduar/ulduar/boss_general_vezax.cpp
+++ b/src/scripts/northrend/ulduar/ulduar/boss_general_vezax.cpp
@@ -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,
+};
diff --git a/src/scripts/northrend/ulduar/ulduar/boss_hodir.cpp b/src/scripts/northrend/ulduar/ulduar/boss_hodir.cpp
index 4bf9d4f3479..4feb2168f97 100644
--- a/src/scripts/northrend/ulduar/ulduar/boss_hodir.cpp
+++ b/src/scripts/northrend/ulduar/ulduar/boss_hodir.cpp
@@ -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();
}
-
diff --git a/src/scripts/northrend/ulduar/ulduar/boss_ignis.cpp b/src/scripts/northrend/ulduar/ulduar/boss_ignis.cpp
index 80c81e40616..3e51b7d39cc 100644
--- a/src/scripts/northrend/ulduar/ulduar/boss_ignis.cpp
+++ b/src/scripts/northrend/ulduar/ulduar/boss_ignis.cpp
@@ -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();
}
diff --git a/src/scripts/northrend/ulduar/ulduar/boss_kologarn.cpp b/src/scripts/northrend/ulduar/ulduar/boss_kologarn.cpp
index ab07e5c1327..d78916564e7 100644
--- a/src/scripts/northrend/ulduar/ulduar/boss_kologarn.cpp
+++ b/src/scripts/northrend/ulduar/ulduar/boss_kologarn.cpp
@@ -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);
diff --git a/src/scripts/northrend/ulduar/ulduar/boss_mimiron.cpp b/src/scripts/northrend/ulduar/ulduar/boss_mimiron.cpp
index a9f1be65f2d..2b9994d5d9b 100644
--- a/src/scripts/northrend/ulduar/ulduar/boss_mimiron.cpp
+++ b/src/scripts/northrend/ulduar/ulduar/boss_mimiron.cpp
@@ -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,
+};
diff --git a/src/scripts/northrend/ulduar/ulduar/boss_thorim.cpp b/src/scripts/northrend/ulduar/ulduar/boss_thorim.cpp
index c81c9308b9f..40112eb3a3d 100644
--- a/src/scripts/northrend/ulduar/ulduar/boss_thorim.cpp
+++ b/src/scripts/northrend/ulduar/ulduar/boss_thorim.cpp
@@ -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();
-
}
diff --git a/src/scripts/northrend/ulduar/ulduar/boss_xt002.cpp b/src/scripts/northrend/ulduar/ulduar/boss_xt002.cpp
index 82913a5ea2c..9d2c9f8d6fb 100644
--- a/src/scripts/northrend/ulduar/ulduar/boss_xt002.cpp
+++ b/src/scripts/northrend/ulduar/ulduar/boss_xt002.cpp
@@ -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,
+
+ 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
-#define SAY_AGGRO -1000000
-#define SAY_SLAY -1000001
+/************************************************
+-----------------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);
+ DoScriptText(SAY_DEATH, m_creature);
+ _JustDied();
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ if (enterHardMode)
+ {
+ SetPhaseOne();
+ enterHardMode = false;
+ }
+
+ // Handles spell casting. These spells only occur during phase 1 and hard mode
+ if (phase == 1 || hardMode)
+ {
+ 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 (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)
+ {
+ 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)
- m_pInstance->SetData(TYPE_XT002, DONE);
+ 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);
+ }
}
+};
- void MoveInLineOfSight(Unit* who) {}
+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->GetPositionX() < 700) // Not Blizzlike, anti-exploit to prevent players from pulling bosses to vehicles.
+
+ if (m_creature->IsWithinMeleeRange(m_creature->getVictim()))
{
- m_creature->RemoveAllAuras();
- m_creature->DeleteThreatList();
- m_creature->CombatStop(false);
- m_creature->GetMotionMaster()->MoveTargetedHome();
+ 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;
}
- if (SEARING_LIGHT_Timer <= diff)
+ DoMeleeAttackIfReady();
+ }
+};
+
+CreatureAI* GetAI_mob_pummeller(Creature* 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)))
{
- DoCast(m_creature, SPELL_SEARING_LIGHT);
- DoScriptText(SAY_SLAY, m_creature);
- SEARING_LIGHT_Timer = 50000;
- } else SEARING_LIGHT_Timer -= diff;
+ if (m_creature->GetDistance2d(pXT002) <= 0.5)
+ {
+ //Explosion
+ DoCast(m_creature, SPELL_BOOM);
+
+ //Despawns the boombot
+ m_creature->ForcedDespawn();
+ }
+ }
+ }
+};
- if (SONIC_BOOM_Timer <= diff)
+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)
{
- DoCast(m_creature->getVictim(), SPELL_SONIC_BOOM);
- SONIC_BOOM_Timer = 20000;
- } else SONIC_BOOM_Timer -= diff;
+ //voidZone();
+ uiVoidZoneTimer = TIMER_VOID_ZONE;
+ } else uiVoidZoneTimer -= diff;
+ }
- DoMeleeAttackIfReady();
+ // 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_boss_xt002(Creature* pCreature)
+CreatureAI* GetAI_mob_life_spark(Creature* pCreature)
{
- return new boss_xt002_AI (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();
}
diff --git a/src/scripts/northrend/ulduar/ulduar/boss_yoggsaron.cpp b/src/scripts/northrend/ulduar/ulduar/boss_yoggsaron.cpp
index a9f1be65f2d..e87b6648e8e 100644
--- a/src/scripts/northrend/ulduar/ulduar/boss_yoggsaron.cpp
+++ b/src/scripts/northrend/ulduar/ulduar/boss_yoggsaron.cpp
@@ -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,
+};