aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/scripts/northrend/ulduar/ulduar/boss_flame_leviathan.cpp127
-rw-r--r--src/scripts/northrend/ulduar/ulduar/instance_ulduar.cpp2
2 files changed, 88 insertions, 41 deletions
diff --git a/src/scripts/northrend/ulduar/ulduar/boss_flame_leviathan.cpp b/src/scripts/northrend/ulduar/ulduar/boss_flame_leviathan.cpp
index 511937f4e60..0884b10fca6 100644
--- a/src/scripts/northrend/ulduar/ulduar/boss_flame_leviathan.cpp
+++ b/src/scripts/northrend/ulduar/ulduar/boss_flame_leviathan.cpp
@@ -99,6 +99,28 @@ enum Yells
SAY_OVERLOAD_3 = -1603075,
};
+enum eAchievementData
+{
+ //ACHIEV_CHAMPION_OF_ULDUAR = 10042,
+ //ACHIEV_CONQUEROR_OF_ULDUAR = 10352,
+ ACHIEV_10_NUKED_FROM_ORBIT = 10058,
+ ACHIEV_25_NUKED_FROM_ORBIT = 10060,
+ ACHIEV_10_ORBITAL_BOMBARDMENT = 10056,
+ ACHIEV_25_ORBITAL_BOMBARDMENT = 10061,
+ ACHIEV_10_ORBITAL_DEVASTATION = 10057,
+ ACHIEV_25_ORBITAL_DEVASTATION = 10059,
+ ACHIEV_10_ORBIT_UARY = 10218,
+ ACHIEV_25_ORBIT_UARY = 10219,
+ ACHIEV_10_SHUTOUT = 10054,
+ ACHIEV_25_SHUTOUT = 10055,
+ ACHIEV_10_SIEGE_OF_ULDUAR = 9999,
+ ACHIEV_25_SIEGE_OF_ULDUAR = 10003,
+ //ACHIEV_10_THREE_CAR_GARAGE = 10046, 10047, 10048,
+ //ACHIEV_25_THREE_CAR_GARAGE = 10049, 10050, 10051,
+ ACHIEV_10_UNBROKEN = 10044,
+ ACHIEV_25_UNBROKEN = 10045,
+};
+
static Position Center[]=
{
{354.8771, -12.90240, 409.803650},
@@ -109,17 +131,22 @@ struct boss_flame_leviathanAI : public BossAI
boss_flame_leviathanAI(Creature* pCreature) : BossAI(pCreature, TYPE_LEVIATHAN), vehicle(pCreature->GetVehicleKit())
{
assert(vehicle);
- pInstance = pCreature->GetInstanceData();
+ if (pInstance)
+ pInstance = pCreature->GetInstanceData();
}
- Vehicle* vehicle;
+ Vehicle* vehicle;
+ uint8 uiActiveTowers;
ScriptedInstance* pInstance;
void Reset()
{
_Reset();
+ assert(vehicle);
+ uiActiveTowers = 0;
me->SetReactState(REACT_AGGRESSIVE);
- pInstance->SetData(TYPE_LEVIATHAN, NOT_STARTED);
+ if (pInstance)
+ pInstance->SetData(TYPE_LEVIATHAN, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/)
@@ -132,7 +159,8 @@ struct boss_flame_leviathanAI : public BossAI
events.ScheduleEvent(EVENT_VENT, 20000);
events.ScheduleEvent(EVENT_SPEED, 15000);
events.ScheduleEvent(EVENT_SUMMON, 0);
- pInstance->SetData(TYPE_LEVIATHAN, IN_PROGRESS);
+ if (pInstance)
+ pInstance->SetData(TYPE_LEVIATHAN, IN_PROGRESS);
if (Creature *turret = CAST_CRE(vehicle->GetPassenger(SEAT_TURRET)))
turret->AI()->DoZoneInCombat();
}
@@ -146,9 +174,30 @@ struct boss_flame_leviathanAI : public BossAI
void JustDied(Unit* /*victim*/)
{
- pInstance->SetData(TYPE_LEVIATHAN, DONE);
DoScriptText(SAY_DEATH, me);
- _JustDied();
+ if (pInstance)
+ {
+ pInstance->SetData(TYPE_LEVIATHAN, DONE);
+ if (uiActiveTowers)
+ {
+ switch (uiActiveTowers)
+ {
+ case 4:
+ pInstance->DoCompleteAchievement(RAID_MODE(ACHIEV_10_ORBIT_UARY, ACHIEV_25_ORBIT_UARY));
+ break;
+ case 3:
+ pInstance->DoCompleteAchievement(RAID_MODE(ACHIEV_10_NUKED_FROM_ORBIT, ACHIEV_25_NUKED_FROM_ORBIT));
+ break;
+ case 2:
+ pInstance->DoCompleteAchievement(RAID_MODE(ACHIEV_10_ORBITAL_DEVASTATION, ACHIEV_25_ORBITAL_DEVASTATION));
+ break;
+ case 1:
+ pInstance->DoCompleteAchievement(RAID_MODE(ACHIEV_10_ORBITAL_BOMBARDMENT, ACHIEV_25_ORBITAL_BOMBARDMENT));
+ break;
+ }
+ }
+ _JustDied();
+ }
}
void SpellHit(Unit* /*caster*/, const SpellEntry* pSpell)
@@ -159,16 +208,6 @@ struct boss_flame_leviathanAI : public BossAI
me->InterruptSpell(CURRENT_CHANNELED_SPELL);
}
- void DoAction(const int32 param)
- {
- if (param == 1)
- {
- me->GetMotionMaster()->MovePoint(0, Center[0]);
- me->SetReactState(REACT_AGGRESSIVE);
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- }
- }
-
void UpdateAI(const uint32 diff)
{
if (!me->isInCombat())
@@ -241,14 +280,21 @@ struct boss_flame_leviathanAI : public BossAI
DoSpellAttackIfReady(SPELL_BATTERING_RAM);
}
- void DoAction(uint32 uiAction)
+ void DoAction(const int32 uiAction)
{
+ // Start encounter
+ if (uiAction == 10)
+ {
+ me->GetMotionMaster()->MovePoint(0, Center[0]);
+ me->SetReactState(REACT_AGGRESSIVE);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ return;
+ }
/*
Tower event triggers
General TODO:
Yells
- Track tower activation state for Achievements
-
+
Actions:
DoAction(0): Activate hard-mode. Buff up leviathan's AP & health, schedule all the tower spells.
Should be triggered on Lore Keeper's script
@@ -258,32 +304,33 @@ struct boss_flame_leviathanAI : public BossAI
DoAction(3): Tower of Frost has been destroyed, deschedule spell Hodir's Fury
DoAction(4): Tower of Nature has been destroyed, deschedule spell Freya's Ward
*/
-
+
if (uiAction) // Tower destruction, debuff leviathan AP & health
{
- // TODO: the debuffing
+ --uiActiveTowers;
}
+
switch (uiAction)
{
- case 0: // Activate hard-mode
- // TODO: AP & health buffing
- events.ScheduleEvent(EVENT_THORIM_S_HAMMER, urand(30000,60000));
- events.ScheduleEvent(EVENT_MIMIRON_S_INFERNO, urand(30000,60000));
- events.ScheduleEvent(EVENT_HODIR_S_FURY, urand(30000,60000));
- events.ScheduleEvent(EVENT_FREYA_S_WARD, urand(30000,60000));
- break;
- case 1: // Tower of Storms destroyed
- events.CancelEvent(EVENT_THORIM_S_HAMMER);
- break;
- case 2: // Tower of Flames destroyed
- events.CancelEvent(EVENT_MIMIRON_S_INFERNO);
- break;
- case 3: // Tower of Frost destroyed
- events.CancelEvent(EVENT_HODIR_S_FURY);
- break;
- case 4: // Tower of Nature destroyed
- events.CancelEvent(EVENT_FREYA_S_WARD);
- break;
+ case 0: // Activate hard-mode
+ events.ScheduleEvent(EVENT_THORIM_S_HAMMER, urand(30000,60000));
+ events.ScheduleEvent(EVENT_MIMIRON_S_INFERNO, urand(30000,60000));
+ events.ScheduleEvent(EVENT_HODIR_S_FURY, urand(30000,60000));
+ events.ScheduleEvent(EVENT_FREYA_S_WARD, urand(30000,60000));
+ uiActiveTowers=4;
+ break;
+ case 1: // Tower of Storms destroyed
+ events.CancelEvent(EVENT_THORIM_S_HAMMER);
+ break;
+ case 2: // Tower of Flames destroyed
+ events.CancelEvent(EVENT_MIMIRON_S_INFERNO);
+ break;
+ case 3: // Tower of Frost destroyed
+ events.CancelEvent(EVENT_HODIR_S_FURY);
+ break;
+ case 4: // Tower of Nature destroyed
+ events.CancelEvent(EVENT_FREYA_S_WARD);
+ break;
}
}
};
diff --git a/src/scripts/northrend/ulduar/ulduar/instance_ulduar.cpp b/src/scripts/northrend/ulduar/ulduar/instance_ulduar.cpp
index fdc06ec38d2..0f0dd8d0384 100644
--- a/src/scripts/northrend/ulduar/ulduar/instance_ulduar.cpp
+++ b/src/scripts/northrend/ulduar/ulduar/instance_ulduar.cpp
@@ -270,7 +270,7 @@ struct instance_ulduar : public ScriptedInstance
if (data == 2)
{
if (Creature* pBoss = instance->GetCreature(m_uiLeviathanGUID))
- pBoss->AI()->DoAction(1);
+ pBoss->AI()->DoAction(10);
if (GameObject* pGate = instance->GetGameObject(m_uiLeviathanGateGUID))
pGate->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
}