Scripts/Ulduar: Cleanup in Flame Leviathan.

This commit is contained in:
Supabad
2011-07-03 21:16:52 +02:00
parent 5df24441d1
commit 1a0506ca72
4 changed files with 397 additions and 385 deletions

View File

@@ -31,139 +31,143 @@
#include "ObjectMgr.h"
#include "ulduar.h"
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_OVERLOAD_CIRCUIT = 62399,
SPELL_START_THE_ENGINE = 62472,
SPELL_SEARING_FLAME = 62402,
SPELL_BLAZE = 62292,
SPELL_TAR_PASSIVE = 62288,
SPELL_SMOKE_TRAIL = 63575,
SPELL_ELECTROSHOCK = 62522,
SPELL_NAPALM = 63666,
SPELL_PURSUED = 62374,
SPELL_GATHERING_SPEED = 62375,
SPELL_BATTERING_RAM = 62376,
SPELL_FLAME_VENTS = 62396,
SPELL_MISSILE_BARRAGE = 62400,
SPELL_SYSTEMS_SHUTDOWN = 62475,
SPELL_OVERLOAD_CIRCUIT = 62399,
SPELL_START_THE_ENGINE = 62472,
SPELL_SEARING_FLAME = 62402,
SPELL_BLAZE = 62292,
SPELL_TAR_PASSIVE = 62288,
SPELL_SMOKE_TRAIL = 63575,
SPELL_ELECTROSHOCK = 62522,
SPELL_NAPALM = 63666,
//TOWER Additional SPELLS
SPELL_THORIM_S_HAMMER = 62911, // Tower of Storms
SPELL_MIMIRON_S_INFERNO = 62909, // Tower of Flames
SPELL_HODIR_S_FURY = 62533, // Tower of Frost
SPELL_FREYA_S_WARD = 62906, // Tower of Nature
SPELL_FREYA_SUMMONS = 62947, // Tower of Nature
SPELL_THORIM_S_HAMMER = 62911, // Tower of Storms
SPELL_MIMIRON_S_INFERNO = 62909, // Tower of Flames
SPELL_HODIR_S_FURY = 62533, // Tower of Frost
SPELL_FREYA_S_WARD = 62906, // Tower of Nature
SPELL_FREYA_SUMMONS = 62947, // Tower of Nature
//TOWER ap & health spells
SPELL_BUFF_TOWER_OF_STORMS = 65076,
SPELL_BUFF_TOWER_OF_FLAMES = 65075,
SPELL_BUFF_TOWER_OF_FR0ST = 65077,
SPELL_BUFF_TOWER_OF_LIFE = 64482,
SPELL_BUFF_TOWER_OF_STORMS = 65076,
SPELL_BUFF_TOWER_OF_FLAMES = 65075,
SPELL_BUFF_TOWER_OF_FR0ST = 65077,
SPELL_BUFF_TOWER_OF_LIFE = 64482,
//Additional Spells
SPELL_LASH = 65062,
SPELL_FREYA_S_WARD_EFFECT_1 = 62947,
SPELL_FREYA_S_WARD_EFFECT_2 = 62907,
SPELL_AUTO_REPAIR = 62705,
AURA_DUMMY_BLUE = 63294,
AURA_DUMMY_GREEN = 63295,
AURA_DUMMY_YELLOW = 63292,
SPELL_LIQUID_PYRITE = 62494,
SPELL_DUSTY_EXPLOSION = 63360,
SPELL_DUST_CLOUD_IMPACT = 54740,
AURA_STEALTH_DETECTION = 18950,
SPELL_RIDE_VEHICLE = 46598,
SPELL_LASH = 65062,
SPELL_FREYA_S_WARD_EFFECT_1 = 62947,
SPELL_FREYA_S_WARD_EFFECT_2 = 62907,
SPELL_AUTO_REPAIR = 62705,
AURA_DUMMY_BLUE = 63294,
AURA_DUMMY_GREEN = 63295,
AURA_DUMMY_YELLOW = 63292,
SPELL_LIQUID_PYRITE = 62494,
SPELL_DUSTY_EXPLOSION = 63360,
SPELL_DUST_CLOUD_IMPACT = 54740,
AURA_STEALTH_DETECTION = 18950,
SPELL_RIDE_VEHICLE = 46598,
};
enum Creatures
{
NPC_SEAT = 33114,
NPC_MECHANOLIFT = 33214,
NPC_LIQUID = 33189,
NPC_CONTAINER = 33218,
NPC_THORIM_BEACON = 33365,
NPC_MIMIRON_BEACON = 33370,
NPC_HODIR_BEACON = 33212,
NPC_FREYA_BEACON = 33367,
NPC_THORIM_TARGET_BEACON = 33364,
NPC_MIMIRON_TARGET_BEACON = 33369,
NPC_HODIR_TARGET_BEACON = 33108,
NPC_FREYA_TARGET_BEACON = 33366,
NPC_LOREKEEPER = 33686, //Hard mode starter
NPC_BRANZ_BRONZBEARD = 33579,
NPC_DELORAH = 33701,
NPC_ULDUAR_GAUNTLET_GENERATOR = 33571, // Trigger tied to towers
NPC_SEAT = 33114,
NPC_MECHANOLIFT = 33214,
NPC_LIQUID = 33189,
NPC_CONTAINER = 33218,
NPC_THORIM_BEACON = 33365,
NPC_MIMIRON_BEACON = 33370,
NPC_HODIR_BEACON = 33212,
NPC_FREYA_BEACON = 33367,
NPC_THORIM_TARGET_BEACON = 33364,
NPC_MIMIRON_TARGET_BEACON = 33369,
NPC_HODIR_TARGET_BEACON = 33108,
NPC_FREYA_TARGET_BEACON = 33366,
NPC_LOREKEEPER = 33686, // Hard mode starter
NPC_BRANZ_BRONZBEARD = 33579,
NPC_DELORAH = 33701,
NPC_ULDUAR_GAUNTLET_GENERATOR = 33571, // Trigger tied to towers
};
enum Towers
{
GO_TOWER_OF_STORMS = 194377,
GO_TOWER_OF_FLAMES = 194371,
GO_TOWER_OF_FROST = 194370,
GO_TOWER_OF_LIFE = 194375,
GO_TOWER_OF_STORMS = 194377,
GO_TOWER_OF_FLAMES = 194371,
GO_TOWER_OF_FROST = 194370,
GO_TOWER_OF_LIFE = 194375,
};
enum Events
{
EVENT_PURSUE = 1,
EVENT_MISSILE = 2,
EVENT_VENT = 3,
EVENT_SPEED = 4,
EVENT_SUMMON = 5,
EVENT_SHUTDOWN = 6,
EVENT_REPAIR = 7,
EVENT_THORIM_S_HAMMER = 8, // Tower of Storms
EVENT_MIMIRON_S_INFERNO = 9, // Tower of Flames
EVENT_HODIR_S_FURY = 10, // Tower of Frost
EVENT_FREYA_S_WARD = 11, // Tower of Nature
EVENT_PURSUE = 1,
EVENT_MISSILE = 2,
EVENT_VENT = 3,
EVENT_SPEED = 4,
EVENT_SUMMON = 5,
EVENT_SHUTDOWN = 6,
EVENT_REPAIR = 7,
EVENT_THORIM_S_HAMMER = 8, // Tower of Storms
EVENT_MIMIRON_S_INFERNO = 9, // Tower of Flames
EVENT_HODIR_S_FURY = 10, // Tower of Frost
EVENT_FREYA_S_WARD = 11, // Tower of Nature
};
enum Seats
{
SEAT_PLAYER = 0,
SEAT_TURRET = 1,
SEAT_DEVICE = 2,
SEAT_CANNON = 7,
SEAT_PLAYER = 0,
SEAT_TURRET = 1,
SEAT_DEVICE = 2,
SEAT_CANNON = 7,
};
enum Vehicles
{
VEHICLE_SIEGE = 33060,
VEHICLE_CHOPPER = 33062,
VEHICLE_DEMOLISHER = 33109,
VEHICLE_SIEGE = 33060,
VEHICLE_CHOPPER = 33062,
VEHICLE_DEMOLISHER = 33109,
};
#define EMOTE_PURSUE "Flame Leviathan pursues $N."
#define EMOTE_OVERLOAD "Flame Leviathan's circuits overloaded."
#define EMOTE_REPAIR "Automatic repair sequence initiated."
#define DATA_SHUTOUT 29112912 // 2911, 2912 are achievement IDs
#define DATA_UNBROKEN 29052906 // 2905, 2906 are achievement IDs
#define EMOTE_PURSUE "Flame Leviathan pursues $N."
#define EMOTE_OVERLOAD "Flame Leviathan's circuits overloaded."
#define EMOTE_REPAIR "Automatic repair sequence initiated."
#define DATA_SHUTOUT 29112912 // 2911, 2912 are achievement IDs
#define DATA_UNBROKEN 29052906 // 2905, 2906 are achievement IDs
#define DATA_ORBIT_ACHIEVEMENTS 1
#define VEHICLE_SPAWNS 5
#define FREYA_SPAWNS 4
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,
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,
};
enum actions
enum MiscellanousData
{
ACTION_TOWER_OF_STORM_DESTROYED = 1,
ACTION_TOWER_OF_FROST_DESTROYED = 2,
ACTION_TOWER_OF_FLAMES_DESTROYED = 3,
ACTION_TOWER_OF_LIFE_DESTROYED = 4,
// Other actions are in Ulduar.h
ACTION_START_HARD_MODE = 5,
ACTION_SPAWN_VEHICLES = 6,
// Amount of seats depending on Raid mode
TWO_SEATS = 2,
FOUR_SEATS = 4,
};
Position const Center[]=
@@ -171,7 +175,12 @@ Position const Center[]=
{354.8771f, -12.90240f, 409.803650f, 0.0f},
};
Position const PosSiege[5] =
Position const InfernoStart[]=
{
{390.93f, -13.91f, 409.81f, 0.0f},
};
Position const PosSiege[VEHICLE_SPAWNS] =
{
{-814.59f, -64.54f, 429.92f, 5.969f},
{-784.37f, -33.31f, 429.92f, 5.096f},
@@ -180,7 +189,7 @@ Position const PosSiege[5] =
{-812.83f, -77.71f, 429.92f, 0.046f},
};
Position const PosChopper[5] =
Position const PosChopper[VEHICLE_SPAWNS] =
{
{-717.83f, -106.56f, 430.02f, 0.122f},
{-717.83f, -114.23f, 430.44f, 0.122f},
@@ -189,7 +198,7 @@ Position const PosChopper[5] =
{-718.45f, -123.58f, 430.41f, 0.085f},
};
Position const PosDemolisher[5] =
Position const PosDemolisher[VEHICLE_SPAWNS] =
{
{-724.12f, -176.64f, 430.03f, 2.543f},
{-766.70f, -225.03f, 430.50f, 1.710f},
@@ -198,7 +207,13 @@ Position const PosDemolisher[5] =
{-798.01f, -227.24f, 429.84f, 1.446f},
};
#define DATA_ORBIT_ACHIEVEMENTS 1
Position const FreyaBeacons[FREYA_SPAWNS] =
{
{377.02f, -119.10f, 409.81f, 0.0f},
{185.62f, -119.10f, 409.81f, 0.0f},
{377.02f, 54.78f, 409.81f, 0.0f},
{185.62f, 54.78f, 409.81f, 0.0f},
};
class boss_flame_leviathan : public CreatureScript
{
@@ -244,6 +259,7 @@ class boss_flame_leviathan : public CreatureScript
void Reset()
{
_Reset();
//resets shutdown counter to 0. 2 or 4 depending on raid mode
Shutdown = 0;
me->SetReactState(REACT_DEFENSIVE);
}
@@ -298,7 +314,8 @@ class boss_flame_leviathan : public CreatureScript
DoScriptText(SAY_AGGRO, me);
}
// TODO: effect 0 and effect 1 may be on different target
//TODO: effect 0 and effect 1 may be on different target
//TODO: Move to spellscript
void SpellHitTarget(Unit* target, SpellEntry const* spell)
{
if (spell->Id == SPELL_PURSUED)
@@ -354,7 +371,7 @@ class boss_flame_leviathan : public CreatureScript
events.Update(diff);
if (Shutdown == RAID_MODE(2, 4))
if (Shutdown == RAID_MODE(TWO_SEATS, FOUR_SEATS))
{
Shutdown = 0;
events.ScheduleEvent(EVENT_SHUTDOWN, 4000);
@@ -381,134 +398,111 @@ class boss_flame_leviathan : public CreatureScript
if (me->HasUnitState(UNIT_STAT_CASTING))
return;
uint32 eventId = events.GetEvent();
switch(eventId)
while (uint32 eventId = events.ExecuteEvent())
{
case 0:
break; // this is a must
case EVENT_PURSUE:
DoScriptText(RAND(SAY_TARGET_1, SAY_TARGET_2, SAY_TARGET_3), me);
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 75, true))
{
me->AddAura(SPELL_PURSUED, target);
me->MonsterTextEmote(EMOTE_PURSUE, target->GetGUID(), true);
}
events.RepeatEvent(30*IN_MILLISECONDS);
break;
case EVENT_MISSILE:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
DoCast(target, SPELL_MISSILE_BARRAGE);
events.RepeatEvent(1500);
break;
case EVENT_VENT:
DoCastAOE(SPELL_FLAME_VENTS);
events.RepeatEvent(20*IN_MILLISECONDS);
break;
case EVENT_SPEED:
DoCastAOE(SPELL_GATHERING_SPEED);
events.RepeatEvent(15*IN_MILLISECONDS);
break;
case EVENT_SUMMON:
if (summons.size() < 15)
if (Creature* lift = DoSummonFlyer(NPC_MECHANOLIFT, me, 30.0f, 50.0f, 0))
lift->GetMotionMaster()->MoveRandom(100);
events.RepeatEvent(2*IN_MILLISECONDS);
break;
case EVENT_SHUTDOWN:
DoScriptText(RAND(SAY_OVERLOAD_1, SAY_OVERLOAD_2, SAY_OVERLOAD_3), me);
me->MonsterTextEmote(EMOTE_OVERLOAD, 0, true);
me->AddAura(SPELL_SYSTEMS_SHUTDOWN, me);
me->RemoveAurasDueToSpell(SPELL_GATHERING_SPEED);
events.ScheduleEvent(EVENT_REPAIR, 4000);
events.CancelEvent(EVENT_SHUTDOWN);
break;
case EVENT_REPAIR:
me->MonsterTextEmote(EMOTE_REPAIR, 0, true);
me->ClearUnitState(UNIT_STAT_STUNNED | UNIT_STAT_ROOT);
events.ScheduleEvent(EVENT_SHUTDOWN, 150*IN_MILLISECONDS);
events.CancelEvent(EVENT_REPAIR);
break;
case EVENT_THORIM_S_HAMMER: // Tower of Storms
for (uint8 i = 0; i < 7; ++i)
{
if (Creature* thorim = DoSummon(NPC_THORIM_BEACON, me, float(urand(20, 60)), 20000, TEMPSUMMON_TIMED_DESPAWN))
thorim->GetMotionMaster()->MoveRandom(100);
}
DoScriptText(SAY_TOWER_STORM, me);
events.CancelEvent(EVENT_THORIM_S_HAMMER);
break;
case EVENT_MIMIRON_S_INFERNO: // Tower of Flames
me->SummonCreature(NPC_MIMIRON_BEACON, 390.93f, -13.91f, 409.81f);
DoScriptText(SAY_TOWER_FLAME, me);
events.CancelEvent(EVENT_MIMIRON_S_INFERNO);
break;
case EVENT_HODIR_S_FURY: // Tower of Frost
for (uint8 i = 0; i < 7; ++i)
{
if (Creature* hodir = DoSummon(NPC_HODIR_BEACON, me, 50, 0))
hodir->GetMotionMaster()->MoveRandom(100);
}
DoScriptText(SAY_TOWER_FROST, me);
events.CancelEvent(EVENT_HODIR_S_FURY);
break;
case EVENT_FREYA_S_WARD: // Tower of Nature
DoScriptText(SAY_TOWER_NATURE, me);
StartFreyaEvent();
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
DoCast(target, SPELL_FREYA_S_WARD);
events.CancelEvent(EVENT_FREYA_S_WARD);
break;
default:
events.PopEvent();
break;
switch (eventId)
{
case EVENT_PURSUE:
DoScriptText(RAND(SAY_TARGET_1, SAY_TARGET_2, SAY_TARGET_3), me);
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 75, true))
{
me->CastSpell(target, SPELL_PURSUED, true);
me->MonsterTextEmote(EMOTE_PURSUE, target->GetGUID(), true);
}
events.RepeatEvent(30*IN_MILLISECONDS);
break;
case EVENT_MISSILE:
DoCast(me, SPELL_MISSILE_BARRAGE, true);
events.RepeatEvent(2*IN_MILLISECONDS);
break;
case EVENT_VENT:
DoCastAOE(SPELL_FLAME_VENTS);
events.RepeatEvent(20*IN_MILLISECONDS);
break;
case EVENT_SPEED:
DoCastAOE(SPELL_GATHERING_SPEED);
events.RepeatEvent(15*IN_MILLISECONDS);
break;
case EVENT_SUMMON:
if (summons.size() < 15)
if (Creature* lift = DoSummonFlyer(NPC_MECHANOLIFT, me, 30.0f, 50.0f, 0))
lift->GetMotionMaster()->MoveRandom(100);
events.RepeatEvent(2*IN_MILLISECONDS);
break;
case EVENT_SHUTDOWN:
DoScriptText(RAND(SAY_OVERLOAD_1, SAY_OVERLOAD_2, SAY_OVERLOAD_3), me);
me->MonsterTextEmote(EMOTE_OVERLOAD, 0, true);
me->CastSpell(me, SPELL_SYSTEMS_SHUTDOWN, true);
me->RemoveAurasDueToSpell(SPELL_GATHERING_SPEED);
events.ScheduleEvent(EVENT_REPAIR, 4000);
events.CancelEvent(EVENT_SHUTDOWN);
break;
case EVENT_REPAIR:
me->MonsterTextEmote(EMOTE_REPAIR, 0, true);
me->ClearUnitState(UNIT_STAT_STUNNED | UNIT_STAT_ROOT);
events.ScheduleEvent(EVENT_SHUTDOWN, 150*IN_MILLISECONDS);
events.CancelEvent(EVENT_REPAIR);
break;
case EVENT_THORIM_S_HAMMER: // Tower of Storms
for (uint8 i = 0; i < 7; ++i)
{
if (Creature* thorim = DoSummon(NPC_THORIM_BEACON, me, float(urand(20, 60)), 20000, TEMPSUMMON_TIMED_DESPAWN))
thorim->GetMotionMaster()->MoveRandom(100);
}
DoScriptText(SAY_TOWER_STORM, me);
events.CancelEvent(EVENT_THORIM_S_HAMMER);
break;
case EVENT_MIMIRON_S_INFERNO: // Tower of Flames
me->SummonCreature(NPC_MIMIRON_BEACON, InfernoStart->GetPositionX(), InfernoStart->GetPositionY(), InfernoStart->GetPositionZ());
DoScriptText(SAY_TOWER_FLAME, me);
events.CancelEvent(EVENT_MIMIRON_S_INFERNO);
break;
case EVENT_HODIR_S_FURY: // Tower of Frost
for (uint8 i = 0; i < 7; ++i)
{
if (Creature* hodir = DoSummon(NPC_HODIR_BEACON, me, 50, 0))
hodir->GetMotionMaster()->MoveRandom(100);
}
DoScriptText(SAY_TOWER_FROST, me);
events.CancelEvent(EVENT_HODIR_S_FURY);
break;
case EVENT_FREYA_S_WARD: // Tower of Nature
DoScriptText(SAY_TOWER_NATURE, me);
for (int32 i = 0; i < 4; ++i)
me->SummonCreature(NPC_FREYA_BEACON, FreyaBeacons[i]);
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
DoCast(target, SPELL_FREYA_S_WARD);
events.CancelEvent(EVENT_FREYA_S_WARD);
break;
}
}
//TODO: Fix this spell, gets applied on players who are on leviathan should be excluded?
/*if (me->IsWithinMeleeRange(me->getVictim())) //bugged spell casts on units that are boarded on leviathan
DoSpellAttackIfReady(SPELL_BATTERING_RAM);*/
DoMeleeAttackIfReady();
}
void StartFreyaEvent()//summon these 4 on each corner wich wil spawn additional hostile mobs
{
me->SummonCreature(NPC_FREYA_BEACON, 377.02f, -119.10f, 409.81f);
me->SummonCreature(NPC_FREYA_BEACON, 377.02f, 54.78f, 409.81f);
me->SummonCreature(NPC_FREYA_BEACON, 185.62f, 54.78f, 409.81f);
me->SummonCreature(NPC_FREYA_BEACON, 185.62f, -119.10f, 409.81f);
}
void DoAction(int32 const action)
{
// Start encounter
if (action == 10)
if (action && action <= 4) // Tower destruction, debuff leviathan loot and reduce active tower count
{
if (!me->isDead())
{
me->SetHomePosition(Center->GetPositionX(), Center->GetPositionY(), Center->GetPositionZ(), 0);
me->GetMotionMaster()->MoveCharge(Center->GetPositionX(), Center->GetPositionY(), Center->GetPositionZ()); //position center
me->SetReactState(REACT_AGGRESSIVE);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_STUNNED);
return;
}
}
if (action && action <= 4) // Tower destruction, debuff leviathan loot and reduce active tower
{
if (me->HasLootMode(31) && ActiveTowersCount == 4)
if (me->HasLootMode(LOOT_MODE_DEFAULT | LOOT_MODE_HARD_MODE_1 | LOOT_MODE_HARD_MODE_2 | LOOT_MODE_HARD_MODE_3 | LOOT_MODE_HARD_MODE_4) && ActiveTowersCount == 4)
{
me->RemoveLootMode(LOOT_MODE_HARD_MODE_4);
--ActiveTowersCount;
}
if (me->HasLootMode(15) && ActiveTowersCount == 3)
if (me->HasLootMode(LOOT_MODE_DEFAULT | LOOT_MODE_HARD_MODE_1 | LOOT_MODE_HARD_MODE_2 | LOOT_MODE_HARD_MODE_3) && ActiveTowersCount == 3)
{
me->RemoveLootMode(LOOT_MODE_HARD_MODE_3);
--ActiveTowersCount;
}
if (me->HasLootMode(7) && ActiveTowersCount == 2)
if (me->HasLootMode(LOOT_MODE_DEFAULT | LOOT_MODE_HARD_MODE_1 | LOOT_MODE_HARD_MODE_2) && ActiveTowersCount == 2)
{
me->RemoveLootMode(LOOT_MODE_HARD_MODE_2);
--ActiveTowersCount;
}
if (me->HasLootMode(3) && ActiveTowersCount == 1)
if (me->HasLootMode(LOOT_MODE_DEFAULT | LOOT_MODE_HARD_MODE_1) && ActiveTowersCount == 1)
{
me->RemoveLootMode(LOOT_MODE_HARD_MODE_1);
--ActiveTowersCount;
@@ -517,25 +511,35 @@ class boss_flame_leviathan : public CreatureScript
switch (action)
{
case 0: // Activate hard-mode setting counter to 4 towers, enable all towers apply buffs on levithian
case ACTION_TOWER_OF_STORM_DESTROYED:
towerOfStorms = false;
break;
case ACTION_TOWER_OF_FROST_DESTROYED:
towerOfFrost = false;
break;
case ACTION_TOWER_OF_FLAMES_DESTROYED:
towerOfFlames = false;
break;
case ACTION_TOWER_OF_LIFE_DESTROYED:
towerOfLife = false;
break;
case ACTION_START_HARD_MODE: // Activate hard-mode enable all towers, apply buffs on leviathan
ActiveTowers = true;
towerOfStorms = true;
towerOfLife = true;
towerOfFlames = true;
towerOfFrost = true;
me->SetLootMode(31);
me->SetLootMode(LOOT_MODE_DEFAULT | LOOT_MODE_HARD_MODE_1 | LOOT_MODE_HARD_MODE_2 | LOOT_MODE_HARD_MODE_3 | LOOT_MODE_HARD_MODE_4);
break;
case ACTION_TOWER_OF_STORM_DESTROYED: // Tower of Storms destroyed
towerOfStorms = false;
break;
case ACTION_TOWER_OF_FROST_DESTROYED: // Tower of Frost destroyed
towerOfFrost = false;
break;
case ACTION_TOWER_OF_FLAMES_DESTROYED: // Tower of Flames destroyed
towerOfFlames = false;
break;
case ACTION_TOWER_OF_LIFE_DESTROYED: // Tower of Nature destroyed
towerOfLife = false;
case ACTION_MOVE_TO_CENTER_POSITION: // Triggered by 2 Collossus near door
if (!me->isDead())
{
me->SetHomePosition(Center->GetPositionX(), Center->GetPositionY(), Center->GetPositionZ(), 0);
me->GetMotionMaster()->MoveCharge(Center->GetPositionX(), Center->GetPositionY(), Center->GetPositionZ()); //position center
me->SetReactState(REACT_AGGRESSIVE);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_STUNNED);
return;
}
break;
default:
break;
@@ -628,7 +632,7 @@ class boss_flame_leviathan_defense_cannon : public CreatureScript
void Reset ()
{
NapalmTimer = 5000;
NapalmTimer = 5*IN_MILLISECONDS;
DoCast(me, AURA_STEALTH_DETECTION);
}
@@ -833,7 +837,7 @@ class npc_pool_of_tar : public CreatureScript
{
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetReactState(REACT_PASSIVE);
me->AddAura(SPELL_TAR_PASSIVE, me);
me->CastSpell(me, SPELL_TAR_PASSIVE, true);
}
void DamageTaken(Unit* /*who*/, uint32& damage)
@@ -873,7 +877,7 @@ class npc_colossus : public CreatureScript
void JustDied(Unit* /*Who*/)
{
if (me->GetHomePosition().IsInDist(Center, 50.f))
instance->SetData(TYPE_COLOSSUS, instance->GetData(TYPE_COLOSSUS)+1);
instance->SetData(DATA_COLOSSUS, instance->GetData(DATA_COLOSSUS)+1);
}
void UpdateAI(uint32 const /*diff*/)
@@ -901,7 +905,7 @@ class npc_thorims_hammer : public CreatureScript
npc_thorims_hammerAI(Creature* creature) : ScriptedAI(creature)
{
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->AddAura(AURA_DUMMY_BLUE, me);
me->CastSpell(me, AURA_DUMMY_BLUE, true);
}
void MoveInLineOfSight(Unit* who)
@@ -916,7 +920,7 @@ class npc_thorims_hammer : public CreatureScript
void UpdateAI(uint32 const /*diff*/)
{
if (!me->HasAura(AURA_DUMMY_BLUE))
me->AddAura(AURA_DUMMY_BLUE, me);
me->CastSpell(me, AURA_DUMMY_BLUE, true);
UpdateVictim();
}
@@ -943,7 +947,7 @@ public:
npc_mimirons_infernoAI(Creature* creature) : npc_escortAI(creature)
{
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
me->AddAura(AURA_DUMMY_YELLOW, me);
me->CastSpell(me, AURA_DUMMY_YELLOW, true);
me->SetReactState(REACT_PASSIVE);
}
@@ -978,7 +982,7 @@ public:
infernoTimer -= diff;
if (!me->HasAura(AURA_DUMMY_YELLOW))
me->AddAura(AURA_DUMMY_YELLOW, me);
me->CastSpell(me, AURA_DUMMY_YELLOW, true);
}
}
};
@@ -995,7 +999,7 @@ class npc_hodirs_fury : public CreatureScript
npc_hodirs_furyAI(Creature* creature) : ScriptedAI(creature)
{
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->AddAura(AURA_DUMMY_GREEN, me);
me->CastSpell(me, AURA_DUMMY_GREEN, true);
}
void MoveInLineOfSight(Unit* who)
@@ -1010,7 +1014,7 @@ class npc_hodirs_fury : public CreatureScript
void UpdateAI(uint32 const /*diff*/)
{
if (!me->HasAura(AURA_DUMMY_GREEN))
me->AddAura(AURA_DUMMY_GREEN, me);
me->CastSpell(me, AURA_DUMMY_GREEN, true);
UpdateVictim();
}
@@ -1031,7 +1035,7 @@ class npc_freyas_ward : public CreatureScript
{
npc_freyas_wardAI(Creature* creature) : ScriptedAI(creature)
{
me->AddAura(AURA_DUMMY_GREEN, me);
me->CastSpell(me, AURA_DUMMY_GREEN, true);
}
uint32 summonTimer;
@@ -1053,7 +1057,7 @@ class npc_freyas_ward : public CreatureScript
summonTimer -= diff;
if (!me->HasAura(AURA_DUMMY_GREEN))
me->AddAura(AURA_DUMMY_GREEN, me);
me->CastSpell(me, AURA_DUMMY_GREEN, true);
UpdateVictim();
}
@@ -1110,6 +1114,7 @@ class npc_freya_ward_summon : public CreatureScript
//npc lore keeper
#define GOSSIP_ITEM_1 "Activate secondary defensive systems"
#define GOSSIP_ITEM_2 "Confirmed"
class npc_lorekeeper : public CreatureScript
{
public:
@@ -1124,7 +1129,7 @@ class npc_lorekeeper : public CreatureScript
void DoAction(int32 const action)
{
// Start encounter
if (action == 0)
if (action == ACTION_SPAWN_VEHICLES)
{
for (int32 i = 0; i < RAID_MODE(2, 5); ++i)
DoSummon(VEHICLE_SIEGE, PosSiege[i], 3000, TEMPSUMMON_CORPSE_TIMED_DESPAWN);
@@ -1162,9 +1167,9 @@ class npc_lorekeeper : public CreatureScript
if (Creature* leviathan = instance->instance->GetCreature(instance->GetData64(BOSS_LEVIATHAN)))
{
CAST_AI(boss_flame_leviathan::boss_flame_leviathanAI, (leviathan->AI()))->DoAction(0); //enable hard mode activating the 4 additional events spawning additional vehicles
leviathan->AI()->DoAction(ACTION_START_HARD_MODE);
creature->SetVisible(false);
creature->AI()->DoAction(0); // spawn the vehicles
creature->AI()->DoAction(ACTION_SPAWN_VEHICLES); // spawn the vehicles
if (Creature* Delorah = creature->FindNearestCreature(NPC_DELORAH, 1000, true))
{
if (Creature* Branz = creature->FindNearestCreature(NPC_BRANZ_BRONZBEARD, 1000, true))

View File

@@ -390,23 +390,20 @@ class instance_ulduar : public InstanceMapScript
switch (eventId)
{
case EVENT_TOWER_OF_STORM_DESTROYED:
FlameLeviathan->AI()->DoAction(1);
FlameLeviathan->AI()->DoAction(ACTION_TOWER_OF_STORM_DESTROYED);
break;
case EVENT_TOWER_OF_FROST_DESTROYED:
FlameLeviathan->AI()->DoAction(2);
FlameLeviathan->AI()->DoAction(ACTION_TOWER_OF_FROST_DESTROYED);
break;
case EVENT_TOWER_OF_FLAMES_DESTROYED:
FlameLeviathan->AI()->DoAction(3);
FlameLeviathan->AI()->DoAction(ACTION_TOWER_OF_FLAMES_DESTROYED);
break;
case EVENT_TOWER_OF_LIFE_DESTROYED:
FlameLeviathan->AI()->DoAction(4);
FlameLeviathan->AI()->DoAction(ACTION_TOWER_OF_LIFE_DESTROYED);
break;
}
}
void ProcessEvent(Unit* /*unit*/, uint32 /*eventId*/)
{
}
bool SetBossState(uint32 type, EncounterState state)
{
@@ -475,12 +472,12 @@ class instance_ulduar : public InstanceMapScript
{
switch (type)
{
case TYPE_COLOSSUS:
Encounter[TYPE_COLOSSUS] = data;
case DATA_COLOSSUS:
Encounter[DATA_COLOSSUS] = data;
if (data == 2)
{
if (Creature* Leviathan = instance->GetCreature(LeviathanGUID))
Leviathan->AI()->DoAction(10);
Leviathan->AI()->DoAction(ACTION_MOVE_TO_CENTER_POSITION);
if (GameObject* gameObject = instance->GetGameObject(LeviathanGateGUID))
gameObject->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
SaveToDB();
@@ -591,7 +588,7 @@ class instance_ulduar : public InstanceMapScript
{
switch (type)
{
case TYPE_COLOSSUS:
case DATA_COLOSSUS:
return Encounter[type];
case DATA_HODIR_RARE_CACHE:
return HodirRareCacheData;
@@ -607,7 +604,7 @@ class instance_ulduar : public InstanceMapScript
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
saveStream << "U U " << GetBossSaveData() << GetData(TYPE_COLOSSUS);
saveStream << "U U " << GetBossSaveData() << GetData(DATA_COLOSSUS);
OUT_SAVE_INST_DATA_COMPLETE;
return saveStream.str();
@@ -637,7 +634,7 @@ class instance_ulduar : public InstanceMapScript
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
tmpState = NOT_STARTED;
if (i == TYPE_COLOSSUS)
if (i == DATA_COLOSSUS)
SetData(i, tmpState);
else
SetBossState(i, EncounterState(tmpState));

View File

@@ -23,29 +23,149 @@
enum UlduarBosses
{
MAX_ENCOUNTER = 20,
MAX_ENCOUNTER = 20,
BOSS_LEVIATHAN = 0,
BOSS_IGNIS = 1,
BOSS_RAZORSCALE = 2,
BOSS_XT002 = 3,
BOSS_ASSEMBLY_OF_IRON = 4,
BOSS_STEELBREAKER = 5,
BOSS_MOLGEIM = 6,
BOSS_BRUNDIR = 7,
BOSS_KOLOGARN = 8,
BOSS_AURIAYA = 9,
BOSS_MIMIRON = 10,
BOSS_HODIR = 11,
BOSS_THORIM = 12,
BOSS_FREYA = 13,
BOSS_BRIGHTLEAF = 14,
BOSS_IRONBRANCH = 15,
BOSS_STONEBARK = 16,
BOSS_VEZAX = 17,
BOSS_YOGGSARON = 18,
BOSS_ALGALON = 19,
TYPE_COLOSSUS = 20,
BOSS_LEVIATHAN = 0,
BOSS_IGNIS = 1,
BOSS_RAZORSCALE = 2,
BOSS_XT002 = 3,
BOSS_ASSEMBLY_OF_IRON = 4,
BOSS_STEELBREAKER = 5,
BOSS_MOLGEIM = 6,
BOSS_BRUNDIR = 7,
BOSS_KOLOGARN = 8,
BOSS_AURIAYA = 9,
BOSS_MIMIRON = 10,
BOSS_HODIR = 11,
BOSS_THORIM = 12,
BOSS_FREYA = 13,
BOSS_BRIGHTLEAF = 14,
BOSS_IRONBRANCH = 15,
BOSS_STONEBARK = 16,
BOSS_VEZAX = 17,
BOSS_YOGGSARON = 18,
BOSS_ALGALON = 19,
};
enum UlduarNPCs
{
// General
NPC_LEVIATHAN = 33113,
NPC_IGNIS = 33118,
NPC_RAZORSCALE = 33186,
NPC_RAZORSCALE_CONTROLLER = 33233,
NPC_STEELFORGED_DEFFENDER = 33236,
NPC_EXPEDITION_COMMANDER = 33210,
NPC_XT002 = 33293,
NPC_XT_TOY_PILE = 33337,
NPC_STEELBREAKER = 32867,
NPC_MOLGEIM = 32927,
NPC_BRUNDIR = 32857,
NPC_KOLOGARN = 32930,
NPC_FOCUSED_EYEBEAM = 33632,
NPC_FOCUSED_EYEBEAM_RIGHT = 33802,
NPC_LEFT_ARM = 32933,
NPC_RIGHT_ARM = 32934,
NPC_RUBBLE = 33768,
NPC_AURIAYA = 33515,
NPC_MIMIRON = 33350,
NPC_HODIR = 32845,
NPC_THORIM = 32865,
NPC_FREYA = 32906,
NPC_VEZAX = 33271,
NPC_YOGGSARON = 33288,
NPC_ALGALON = 32871,
// Mimiron
NPC_LEVIATHAN_MKII = 33432,
NPC_VX_001 = 33651,
NPC_AERIAL_COMMAND_UNIT = 33670,
// Freya's Keepers
NPC_IRONBRANCH = 32913,
NPC_BRIGHTLEAF = 32915,
NPC_STONEBARK = 32914,
// Hodir's Helper NPCs
NPC_TOR_GREYCLOUD = 32941,
NPC_KAR_GREYCLOUD = 33333,
NPC_EIVI_NIGHTFEATHER = 33325,
NPC_ELLIE_NIGHTFEATHER = 32901,
NPC_SPIRITWALKER_TARA = 33332,
NPC_SPIRITWALKER_YONA = 32950,
NPC_ELEMENTALIST_MAHFUUN = 33328,
NPC_ELEMENTALIST_AVUUN = 32900,
NPC_AMIRA_BLAZEWEAVER = 33331,
NPC_VEESHA_BLAZEWEAVER = 32946,
NPC_MISSY_FLAMECUFFS = 32893,
NPC_SISSY_FLAMECUFFS = 33327,
NPC_BATTLE_PRIEST_ELIZA = 32948,
NPC_BATTLE_PRIEST_GINA = 33330,
NPC_FIELD_MEDIC_PENNY = 32897,
NPC_FIELD_MEDIC_JESSI = 33326,
// Freya's trash NPCs
NPC_CORRUPTED_SERVITOR = 33354,
NPC_MISGUIDED_NYMPH = 33355,
NPC_GUARDIAN_LASHER = 33430,
NPC_FOREST_SWARMER = 33431,
NPC_MANGROVE_ENT = 33525,
NPC_IRONROOT_LASHER = 33526,
NPC_NATURES_BLADE = 33527,
NPC_GUARDIAN_OF_LIFE = 33528,
};
enum UlduarGameObjects
{
GO_KOLOGARN_CHEST_HERO = 195047,
GO_KOLOGARN_CHEST = 195046,
GO_KOLOGARN_BRIDGE = 194232,
GO_KOLOGARN_DOOR = 194553,
GO_THORIM_CHEST_HERO = 194315,
GO_THORIM_CHEST = 194314,
GO_HODIR_RARE_CACHE_OF_WINTER = 194200,
GO_HODIR_RARE_CACHE_OF_WINTER_HERO = 194201,
GO_HODIR_CHEST_HERO = 194308,
GO_HODIR_CHEST = 194307,
GO_FREYA_CHEST_HERO = 194325,
GO_FREYA_CHEST = 194324,
GO_LEVIATHAN_DOOR = 194905,
GO_LEVIATHAN_GATE = 194630,
GO_VEZAX_DOOR = 194750,
GO_MOLE_MACHINE = 194316,
GO_RAZOR_HARPOON_1 = 194542,
GO_RAZOR_HARPOON_2 = 194541,
GO_RAZOR_HARPOON_3 = 194543,
GO_RAZOR_HARPOON_4 = 194519,
GO_RAZOR_BROKEN_HARPOON = 194565,
GO_HODIR_DOOR = 194634,
GO_HODIR_ICE_DOOR = 194441,
GO_ARCHIVUM_DOOR = 194556,
};
enum LeviathanData
{
EVENT_TOWER_OF_STORM_DESTROYED = 21031,
EVENT_TOWER_OF_FROST_DESTROYED = 21032,
EVENT_TOWER_OF_FLAMES_DESTROYED = 21033,
EVENT_TOWER_OF_LIFE_DESTROYED = 21030,
ACTION_TOWER_OF_STORM_DESTROYED = 1,
ACTION_TOWER_OF_FROST_DESTROYED = 2,
ACTION_TOWER_OF_FLAMES_DESTROYED = 3,
ACTION_TOWER_OF_LIFE_DESTROYED = 4,
ACTION_MOVE_TO_CENTER_POSITION = 10,
};
enum UlduarAchievementCriteriaIds
{
CRITERIA_CON_SPEED_ATORY = 21597,
CRITERIA_DISARMED = 21687,
};
enum UlduarData
{
// Collosus (Leviathan)
DATA_COLOSSUS = 20,
// Razorscale
DATA_EXPEDITION_COMMANDER,
@@ -65,116 +185,6 @@ enum UlduarBosses
DATA_HODIR_RARE_CACHE,
};
enum UlduarNPCs
{
// General
NPC_LEVIATHAN = 33113,
NPC_IGNIS = 33118,
NPC_RAZORSCALE = 33186,
NPC_RAZORSCALE_CONTROLLER = 33233,
NPC_STEELFORGED_DEFFENDER = 33236,
NPC_EXPEDITION_COMMANDER = 33210,
NPC_XT002 = 33293,
NPC_XT_TOY_PILE = 33337,
NPC_STEELBREAKER = 32867,
NPC_MOLGEIM = 32927,
NPC_BRUNDIR = 32857,
NPC_KOLOGARN = 32930,
NPC_FOCUSED_EYEBEAM = 33632,
NPC_FOCUSED_EYEBEAM_RIGHT = 33802,
NPC_LEFT_ARM = 32933,
NPC_RIGHT_ARM = 32934,
NPC_RUBBLE = 33768,
NPC_AURIAYA = 33515,
NPC_MIMIRON = 33350,
NPC_HODIR = 32845,
NPC_THORIM = 32865,
NPC_FREYA = 32906,
NPC_VEZAX = 33271,
NPC_YOGGSARON = 33288,
NPC_ALGALON = 32871,
// Mimiron
NPC_LEVIATHAN_MKII = 33432,
NPC_VX_001 = 33651,
NPC_AERIAL_COMMAND_UNIT = 33670,
// Freya's Keepers
NPC_IRONBRANCH = 32913,
NPC_BRIGHTLEAF = 32915,
NPC_STONEBARK = 32914,
// Hodir's Helper NPCs
NPC_TOR_GREYCLOUD = 32941,
NPC_KAR_GREYCLOUD = 33333,
NPC_EIVI_NIGHTFEATHER = 33325,
NPC_ELLIE_NIGHTFEATHER = 32901,
NPC_SPIRITWALKER_TARA = 33332,
NPC_SPIRITWALKER_YONA = 32950,
NPC_ELEMENTALIST_MAHFUUN = 33328,
NPC_ELEMENTALIST_AVUUN = 32900,
NPC_AMIRA_BLAZEWEAVER = 33331,
NPC_VEESHA_BLAZEWEAVER = 32946,
NPC_MISSY_FLAMECUFFS = 32893,
NPC_SISSY_FLAMECUFFS = 33327,
NPC_BATTLE_PRIEST_ELIZA = 32948,
NPC_BATTLE_PRIEST_GINA = 33330,
NPC_FIELD_MEDIC_PENNY = 32897,
NPC_FIELD_MEDIC_JESSI = 33326,
// Freya's trash NPCs
NPC_CORRUPTED_SERVITOR = 33354,
NPC_MISGUIDED_NYMPH = 33355,
NPC_GUARDIAN_LASHER = 33430,
NPC_FOREST_SWARMER = 33431,
NPC_MANGROVE_ENT = 33525,
NPC_IRONROOT_LASHER = 33526,
NPC_NATURES_BLADE = 33527,
NPC_GUARDIAN_OF_LIFE = 33528,
};
enum UlduarGameObjects
{
GO_KOLOGARN_CHEST_HERO = 195047,
GO_KOLOGARN_CHEST = 195046,
GO_KOLOGARN_BRIDGE = 194232,
GO_KOLOGARN_DOOR = 194553,
GO_THORIM_CHEST_HERO = 194315,
GO_THORIM_CHEST = 194314,
GO_HODIR_RARE_CACHE_OF_WINTER = 194200,
GO_HODIR_RARE_CACHE_OF_WINTER_HERO = 194201,
GO_HODIR_CHEST_HERO = 194308,
GO_HODIR_CHEST = 194307,
GO_FREYA_CHEST_HERO = 194325,
GO_FREYA_CHEST = 194324,
GO_LEVIATHAN_DOOR = 194905,
GO_LEVIATHAN_GATE = 194630,
GO_VEZAX_DOOR = 194750,
GO_MOLE_MACHINE = 194316,
GO_RAZOR_HARPOON_1 = 194542,
GO_RAZOR_HARPOON_2 = 194541,
GO_RAZOR_HARPOON_3 = 194543,
GO_RAZOR_HARPOON_4 = 194519,
GO_RAZOR_BROKEN_HARPOON = 194565,
GO_HODIR_DOOR = 194634,
GO_HODIR_ICE_DOOR = 194441,
GO_ARCHIVUM_DOOR = 194556,
};
enum UlduarTowerEvents
{
EVENT_TOWER_OF_STORM_DESTROYED = 21031,
EVENT_TOWER_OF_FROST_DESTROYED = 21032,
EVENT_TOWER_OF_FLAMES_DESTROYED = 21033,
EVENT_TOWER_OF_LIFE_DESTROYED = 21030,
};
enum UlduarAchievementCriteriaIds
{
CRITERIA_CON_SPEED_ATORY = 21597,
CRITERIA_DISARMED = 21687,
};
template<class AI>
CreatureAI* GetUlduarAI(Creature* creature)
{

View File

@@ -97,7 +97,7 @@ class ulduar_teleporter : public GameObjectScript
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Expedition Base Camp", GOSSIP_SENDER_MAIN, BASE_CAMP);
if (InstanceScript* instance = gameObject->GetInstanceScript())
{
if (instance->GetData(TYPE_COLOSSUS) == 2) //count of 2 collossus death
if (instance->GetData(DATA_COLOSSUS) == 2) //count of 2 collossus death
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Formation Grounds", GOSSIP_SENDER_MAIN, GROUNDS);
if (instance->GetBossState(BOSS_LEVIATHAN) == DONE)
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Colossal Forge", GOSSIP_SENDER_MAIN, FORGE);