aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/scripts/world_scripts_full.sql15
-rw-r--r--sql/updates/world/2011_05_21_01_world_conditions.sql9
-rw-r--r--sql/updates/world/2011_05_21_01_world_instance_misc.sql24
-rw-r--r--sql/updates/world/2011_05_21_01_world_scriptname.sql15
-rw-r--r--sql/updates/world/2011_05_21_01_world_spell_script_names.sql6
-rwxr-xr-xsrc/server/game/Scripting/ScriptLoader.cpp2
-rwxr-xr-xsrc/server/game/Spells/SpellMgr.cpp14
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/boss_algalon.cpp6
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/boss_assembly_of_iron.cpp34
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/boss_auriaya.cpp2
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/boss_flame_leviathan.cpp10
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/boss_freya.cpp1623
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/boss_general_vezax.cpp6
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/boss_hodir.cpp16
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/boss_ignis.cpp4
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/boss_kologarn.cpp6
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/boss_razorscale.cpp16
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/boss_thorim.cpp2
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/boss_xt002.cpp14
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp399
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/ulduar.h189
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/ulduar_teleporter.cpp139
22 files changed, 2079 insertions, 472 deletions
diff --git a/sql/scripts/world_scripts_full.sql b/sql/scripts/world_scripts_full.sql
index 139988a6fa0..c92fa331990 100644
--- a/sql/scripts/world_scripts_full.sql
+++ b/sql/scripts/world_scripts_full.sql
@@ -1600,6 +1600,21 @@ UPDATE `creature_template` SET `ScriptName`='npc_icicle' WHERE `entry` IN (33169
UPDATE `creature_template` SET `ScriptName`='npc_snowpacked_icicle' WHERE `entry`=33174;
UPDATE `creature_template` SET `ScriptName`='npc_ice_block' WHERE `entry`=32938;
UPDATE `creature_template` SET `ScriptName`='boss_hodir' WHERE `entry`=32845;
+UPDATE `creature_template` SET `ScriptName`='boss_freya' WHERE `entry`=32906;
+UPDATE `creature_template` SET `ScriptName`='boss_elder_brightleaf' WHERE `entry`=32915;
+UPDATE `creature_template` SET `ScriptName`='boss_elder_ironbranch' WHERE `entry`=32913;
+UPDATE `creature_template` SET `ScriptName`='boss_elder_stonebark' WHERE `entry`=32914;
+UPDATE `creature_template` SET `ScriptName`='npc_ancient_conservator' WHERE `entry`=33203;
+UPDATE `creature_template` SET `ScriptName`='npc_snaplasher' WHERE `entry`=32916;
+UPDATE `creature_template` SET `ScriptName`='npc_storm_lasher' WHERE `entry`=32919;
+UPDATE `creature_template` SET `ScriptName`='npc_ancient_water_spirit' WHERE `entry`=33202;
+UPDATE `creature_template` SET `ScriptName`='npc_detonating_lasher' WHERE `entry`=32918;
+UPDATE `creature_template` SET `ScriptName`='npc_sun_beam' WHERE `entry`=33170;
+UPDATE `creature_template` SET `ScriptName`='npc_nature_bomb' WHERE `entry`=34129;
+UPDATE `creature_template` SET `ScriptName`='npc_eonars_gift' WHERE `entry`=33228;
+UPDATE `creature_template` SET `ScriptName`='npc_healthy_spore' WHERE `entry`=33215;
+UPDATE `creature_template` SET `ScriptName`='npc_unstable_sun_beam' WHERE `entry`=33050;
+UPDATE `creature_template` SET `ScriptName`='npc_iron_roots' WHERE `entry` IN (33088,33168);
/* UN'GORO CRATER */
diff --git a/sql/updates/world/2011_05_21_01_world_conditions.sql b/sql/updates/world/2011_05_21_01_world_conditions.sql
new file mode 100644
index 00000000000..fc3e748a9de
--- /dev/null
+++ b/sql/updates/world/2011_05_21_01_world_conditions.sql
@@ -0,0 +1,9 @@
+DELETE FROM `conditions` WHERE `SourceEntry` IN (62385,62386,62387,62521,62525,62524);
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`)
+VALUES
+(13,0,62385,0,18,1,32906,0,0,'','Brightleaf\'s Essence'),
+(13,0,62386,0,18,1,32906,0,0,'','Stonebarks\'s Essence'),
+(13,0,62387,0,18,1,32906,0,0,'','Ironbranch\'s Essence'),
+(13,0,62521,0,18,1,32906,0,0,'','Attuned to Nature 25 Dose Reduction'),
+(13,0,62524,0,18,1,32906,0,0,'','Attuned to Nature 2 Dose Reduction'),
+(13,0,62525,0,18,1,32906,0,0,'','Attuned to Nature 10 Dose Reduction'); \ No newline at end of file
diff --git a/sql/updates/world/2011_05_21_01_world_instance_misc.sql b/sql/updates/world/2011_05_21_01_world_instance_misc.sql
new file mode 100644
index 00000000000..2541bd9756b
--- /dev/null
+++ b/sql/updates/world/2011_05_21_01_world_instance_misc.sql
@@ -0,0 +1,24 @@
+-- Trigger flag
+UPDATE `creature_template` SET `flags_extra`=`flags_extra`|128 WHERE `entry`=34129;
+
+-- Delete NPC which is not supposed to be here
+DELETE FROM `creature` WHERE `guid`=136607;
+
+-- Immunity
+UPDATE `creature_template` SET `mechanic_immune_mask`=650854239 WHERE `entry`=32906;
+
+-- Spell Difficulties
+DELETE FROM `spelldifficulty_dbc` WHERE `id` BETWEEN 3240 AND 3250;
+INSERT INTO `spelldifficulty_dbc` (`id`,`spellid0`,`spellid1`,`spellid2`,`spellid3`)
+VALUES
+(3240,63169,63549,0,0), -- Ulduar: Corrupted Servitor - Petrify Joints
+(3241,63082,63559,0,0), -- Ulduar: Misguided Nymph - Bind Life
+(3242,63111,63562,0,0), -- Ulduar: Misguided Nymph - Frost Spear
+(3243,63136,63564,0,0), -- Ulduar: Misguided Nymph - Winter's Embrace
+(3244,63047,63550,0,0), -- Ulduar: Guardian Lasher - Guardian's Lash
+(3245,63242,63556,0,0), -- Ulduar: Mangrove Ent - Nourish
+(3246,63241,63554,0,0), -- Ulduar: Mangrove Ent - Tranquility
+(3247,63240,63553,0,0), -- Ulduar: Ironroot Lasher - Ironroot Thorns
+(3248,63247,63568,0,0), -- Ulduar: Nature's Blade - Living Tsunami
+(3249,63226,63551,0,0), -- Ulduar: Guardian of Life - Poison Breath
+(3250,64587,34650,0,0); -- Ulduar: Nature Bomb - Nature Bomb \ No newline at end of file
diff --git a/sql/updates/world/2011_05_21_01_world_scriptname.sql b/sql/updates/world/2011_05_21_01_world_scriptname.sql
new file mode 100644
index 00000000000..a6e054f6899
--- /dev/null
+++ b/sql/updates/world/2011_05_21_01_world_scriptname.sql
@@ -0,0 +1,15 @@
+UPDATE `creature_template` SET `ScriptName`='boss_freya' WHERE `entry`=32906;
+UPDATE `creature_template` SET `ScriptName`='boss_elder_brightleaf' WHERE `entry`=32915;
+UPDATE `creature_template` SET `ScriptName`='boss_elder_ironbranch' WHERE `entry`=32913;
+UPDATE `creature_template` SET `ScriptName`='boss_elder_stonebark' WHERE `entry`=32914;
+UPDATE `creature_template` SET `ScriptName`='npc_ancient_conservator' WHERE `entry`=33203;
+UPDATE `creature_template` SET `ScriptName`='npc_snaplasher' WHERE `entry`=32916;
+UPDATE `creature_template` SET `ScriptName`='npc_storm_lasher' WHERE `entry`=32919;
+UPDATE `creature_template` SET `ScriptName`='npc_ancient_water_spirit' WHERE `entry`=33202;
+UPDATE `creature_template` SET `ScriptName`='npc_detonating_lasher' WHERE `entry`=32918;
+UPDATE `creature_template` SET `ScriptName`='npc_sun_beam' WHERE `entry`=33170;
+UPDATE `creature_template` SET `ScriptName`='npc_nature_bomb' WHERE `entry`=34129;
+UPDATE `creature_template` SET `ScriptName`='npc_eonars_gift' WHERE `entry`=33228;
+UPDATE `creature_template` SET `ScriptName`='npc_healthy_spore' WHERE `entry`=33215;
+UPDATE `creature_template` SET `ScriptName`='npc_unstable_sun_beam' WHERE `entry`=33050;
+UPDATE `creature_template` SET `ScriptName`='npc_iron_roots' WHERE `entry` IN (33088,33168); \ No newline at end of file
diff --git a/sql/updates/world/2011_05_21_01_world_spell_script_names.sql b/sql/updates/world/2011_05_21_01_world_spell_script_names.sql
new file mode 100644
index 00000000000..a10ad9fa53c
--- /dev/null
+++ b/sql/updates/world/2011_05_21_01_world_spell_script_names.sql
@@ -0,0 +1,6 @@
+DELETE FROM `spell_script_names` WHERE `spell_id` IN (62519,65158,65160);
+INSERT INTO `spell_script_names`
+VALUES
+(62519, 'spell_freya_attuned_to_nature'),
+(65158, 'spell_freya_iron_roots'),
+(65160, 'spell_freya_iron_roots'); \ No newline at end of file
diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp
index 969294733d5..461fe4a5e89 100755
--- a/src/server/game/Scripting/ScriptLoader.cpp
+++ b/src/server/game/Scripting/ScriptLoader.cpp
@@ -425,6 +425,7 @@ void AddSC_boss_general_vezax();
void AddSC_ulduar_teleporter();
void AddSC_boss_mimiron();
void AddSC_boss_hodir();
+void AddSC_boss_freya();
void AddSC_instance_ulduar();
void AddSC_boss_keleseth(); //Utgarde Keep
void AddSC_boss_skarvald_dalronn();
@@ -1121,6 +1122,7 @@ void AddNorthrendScripts()
AddSC_ulduar_teleporter();
AddSC_boss_mimiron();
AddSC_boss_hodir();
+ AddSC_boss_freya();
AddSC_instance_ulduar();
AddSC_boss_keleseth(); //Utgarde Keep
AddSC_boss_skarvald_dalronn();
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index 5791d311281..10af133afb7 100755
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -3946,11 +3946,6 @@ void SpellMgr::LoadSpellCustomAttr()
mSpellCustomAttr[i] |= SPELL_ATTR0_CU_IGNORE_ARMOR;
++count;
break;
- // Strength of the Pack
- case 64381:
- spellInfo->StackAmount = 4;
- ++count;
- break;
case 63675: // Improved Devouring Plague
spellInfo->AttributesEx3 |= SPELL_ATTR3_NO_DONE_BONUS;
++count;
@@ -4011,6 +4006,15 @@ void SpellMgr::LoadSpellCustomAttr()
spellInfo->MaxAffectedTargets = 1;
++count;
break;
+ case 62716: // Growth of Nature
+ case 65584: // Growth of Nature
+ spellInfo->AttributesEx3 |= SPELL_ATTR3_STACK_FOR_DIFF_CASTERS;
+ ++count;
+ break;
+ case 64381: // Strength of the Pack
+ spellInfo->StackAmount = 4;
+ ++count;
+ break;
// ENDOF ULDUAR SPELLS
//
// ICECROWN CITADEL SPELLS
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/boss_algalon.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/boss_algalon.cpp
index da3185323d6..da07f861a8d 100644
--- a/src/server/scripts/Northrend/Ulduar/ulduar/boss_algalon.cpp
+++ b/src/server/scripts/Northrend/Ulduar/ulduar/boss_algalon.cpp
@@ -123,7 +123,7 @@ public:
}
if (pInstance)
- pInstance->SetData(TYPE_ALGALON, IN_PROGRESS);
+ pInstance->SetData(BOSS_ALGALON, IN_PROGRESS);
}
void KilledUnit(Unit * /*victim*/)
@@ -137,7 +137,7 @@ public:
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
if (pInstance)
- pInstance->SetData(TYPE_ALGALON, NOT_STARTED);
+ pInstance->SetData(BOSS_ALGALON, NOT_STARTED);
BlackHoleGUID = 0;
@@ -218,7 +218,7 @@ public:
me->DisappearAndDie();
if (pInstance)
- pInstance->SetData(TYPE_ALGALON, DONE);
+ pInstance->SetData(BOSS_ALGALON, DONE);
return;
}
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/boss_assembly_of_iron.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/boss_assembly_of_iron.cpp
index cd40bebc129..dc11fc7425a 100644
--- a/src/server/scripts/Northrend/Ulduar/ulduar/boss_assembly_of_iron.cpp
+++ b/src/server/scripts/Northrend/Ulduar/ulduar/boss_assembly_of_iron.cpp
@@ -130,7 +130,7 @@ bool IsEncounterComplete(InstanceScript* pInstance, Creature* me)
for (uint8 i = 0; i < 3; ++i)
{
- uint64 guid = pInstance->GetData64(DATA_STEELBREAKER+i);
+ uint64 guid = pInstance->GetData64(BOSS_STEELBREAKER+i);
if (!guid)
return false;
@@ -149,7 +149,7 @@ void RespawnEncounter(InstanceScript* pInstance, Creature* me)
{
for (uint8 i = 0; i < 3; ++i)
{
- uint64 guid = pInstance->GetData64(DATA_STEELBREAKER+i);
+ uint64 guid = pInstance->GetData64(BOSS_STEELBREAKER+i);
if (!guid)
continue;
@@ -166,14 +166,14 @@ void RespawnEncounter(InstanceScript* pInstance, Creature* me)
void StartEncounter(InstanceScript* pInstance, Creature* me, Unit* /*target*/)
{
- if (pInstance->GetBossState(TYPE_ASSEMBLY) == IN_PROGRESS)
+ if (pInstance->GetBossState(BOSS_ASSEMBLY_OF_IRON) == IN_PROGRESS)
return; // Prevent recursive calls
- pInstance->SetBossState(TYPE_ASSEMBLY, IN_PROGRESS);
+ pInstance->SetBossState(BOSS_ASSEMBLY_OF_IRON, IN_PROGRESS);
for (uint8 i = 0; i < 3; ++i)
{
- uint64 guid = pInstance->GetData64(DATA_STEELBREAKER+i);
+ uint64 guid = pInstance->GetData64(BOSS_STEELBREAKER+i);
if (!guid)
continue;
@@ -221,7 +221,7 @@ public:
me->RemoveAllAuras();
if (pInstance)
{
- pInstance->SetBossState(TYPE_ASSEMBLY, NOT_STARTED);
+ pInstance->SetBossState(BOSS_ASSEMBLY_OF_IRON, NOT_STARTED);
RespawnEncounter(pInstance, me);
}
}
@@ -261,7 +261,7 @@ public:
{
bool has_supercharge = false;
- if (Creature* Brundir = Unit::GetCreature(*me, pInstance ? pInstance->GetData64(DATA_BRUNDIR) : 0))
+ if (Creature* Brundir = Unit::GetCreature(*me, pInstance ? pInstance->GetData64(BOSS_BRUNDIR) : 0))
{
if (Brundir->isAlive())
{
@@ -270,7 +270,7 @@ public:
}
}
- if (Creature* Molgeim = Unit::GetCreature(*me, pInstance ? pInstance->GetData64(DATA_MOLGEIM) : 0))
+ if (Creature* Molgeim = Unit::GetCreature(*me, pInstance ? pInstance->GetData64(BOSS_MOLGEIM) : 0))
{
if (Molgeim->isAlive())
{
@@ -288,7 +288,7 @@ public:
{
DoScriptText(RAND(SAY_STEELBREAKER_DEATH_1, SAY_STEELBREAKER_DEATH_2), me);
if (IsEncounterComplete(pInstance, me) && pInstance)
- pInstance->SetData(TYPE_ASSEMBLY, DONE);
+ pInstance->SetData(BOSS_ASSEMBLY_OF_IRON, DONE);
}
void KilledUnit(Unit * /*who*/)
@@ -364,7 +364,7 @@ public:
{
if (pInstance)
{
- pInstance->SetData(TYPE_ASSEMBLY, NOT_STARTED);
+ pInstance->SetData(BOSS_ASSEMBLY_OF_IRON, NOT_STARTED);
RespawnEncounter(pInstance, me);
}
@@ -408,7 +408,7 @@ public:
{
bool has_supercharge = false;
- if (Creature* Steelbreaker = Unit::GetCreature(*me, pInstance ? pInstance->GetData64(DATA_STEELBREAKER) : 0))
+ if (Creature* Steelbreaker = Unit::GetCreature(*me, pInstance ? pInstance->GetData64(BOSS_STEELBREAKER) : 0))
{
if (Steelbreaker->isAlive())
{
@@ -417,7 +417,7 @@ public:
}
}
- if (Creature* Brundir = Unit::GetCreature((*me), pInstance ? pInstance->GetData64(DATA_BRUNDIR) : 0))
+ if (Creature* Brundir = Unit::GetCreature((*me), pInstance ? pInstance->GetData64(BOSS_BRUNDIR) : 0))
{
if (Brundir->isAlive())
{
@@ -435,7 +435,7 @@ public:
{
DoScriptText(RAND(SAY_MOLGEIM_DEATH_1, SAY_MOLGEIM_DEATH_2), me);
if (IsEncounterComplete(pInstance, me) && pInstance)
- pInstance->SetData(TYPE_ASSEMBLY, DONE);
+ pInstance->SetData(BOSS_ASSEMBLY_OF_IRON, DONE);
}
void KilledUnit(Unit * /*who*/)
@@ -605,7 +605,7 @@ public:
{
if (pInstance)
{
- pInstance->SetData(TYPE_ASSEMBLY, NOT_STARTED);
+ pInstance->SetData(BOSS_ASSEMBLY_OF_IRON, NOT_STARTED);
RespawnEncounter(pInstance, me);
}
@@ -653,7 +653,7 @@ public:
{
bool has_supercharge = false;
- if (Creature* Steelbreaker = Unit::GetCreature(*me, pInstance ? pInstance->GetData64(DATA_STEELBREAKER) : 0))
+ if (Creature* Steelbreaker = Unit::GetCreature(*me, pInstance ? pInstance->GetData64(BOSS_STEELBREAKER) : 0))
{
if (Steelbreaker->isAlive())
{
@@ -662,7 +662,7 @@ public:
}
}
- if (Creature* Molgeim = Unit::GetCreature(*me, pInstance ? pInstance->GetData64(DATA_MOLGEIM) : 0))
+ if (Creature* Molgeim = Unit::GetCreature(*me, pInstance ? pInstance->GetData64(BOSS_MOLGEIM) : 0))
{
if (Molgeim->isAlive())
{
@@ -680,7 +680,7 @@ public:
{
DoScriptText(RAND(SAY_BRUNDIR_DEATH_1, SAY_BRUNDIR_DEATH_2), me);
if (IsEncounterComplete(pInstance, me) && pInstance)
- pInstance->SetData(TYPE_ASSEMBLY, DONE);
+ pInstance->SetData(BOSS_ASSEMBLY_OF_IRON, DONE);
}
void KilledUnit(Unit * /*who*/)
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/boss_auriaya.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/boss_auriaya.cpp
index e06d99d6c97..56930a0833a 100644
--- a/src/server/scripts/Northrend/Ulduar/ulduar/boss_auriaya.cpp
+++ b/src/server/scripts/Northrend/Ulduar/ulduar/boss_auriaya.cpp
@@ -46,7 +46,7 @@ public:
struct boss_auriaya_AI : public BossAI
{
- boss_auriaya_AI(Creature *pCreature) : BossAI(pCreature, TYPE_AURIAYA)
+ boss_auriaya_AI(Creature *pCreature) : BossAI(pCreature, BOSS_AURIAYA)
{
}
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/boss_flame_leviathan.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/boss_flame_leviathan.cpp
index 211cfc7e4a5..3f2ae24dc0d 100644
--- a/src/server/scripts/Northrend/Ulduar/ulduar/boss_flame_leviathan.cpp
+++ b/src/server/scripts/Northrend/Ulduar/ulduar/boss_flame_leviathan.cpp
@@ -219,7 +219,7 @@ class boss_flame_leviathan : public CreatureScript
struct boss_flame_leviathanAI : public BossAI
{
- boss_flame_leviathanAI(Creature* creature) : BossAI(creature, TYPE_LEVIATHAN), vehicle(creature->GetVehicleKit())
+ boss_flame_leviathanAI(Creature* creature) : BossAI(creature, BOSS_LEVIATHAN), vehicle(creature->GetVehicleKit())
{
}
@@ -1185,7 +1185,7 @@ class npc_lorekeeper : public CreatureScript
if (player)
player->CLOSE_GOSSIP_MENU();
- if (Creature* leviathan = instance->instance->GetCreature(instance->GetData64(TYPE_LEVIATHAN)))
+ 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
creature->SetVisible(false);
@@ -1208,7 +1208,7 @@ class npc_lorekeeper : public CreatureScript
bool OnGossipHello(Player* player, Creature* creature)
{
InstanceScript* instance = creature->GetInstanceScript();
- if (instance && instance->GetData(TYPE_LEVIATHAN) !=DONE && player)
+ if (instance && instance->GetData(BOSS_LEVIATHAN) !=DONE && player)
{
player->PrepareGossipMenu(creature);
@@ -1261,7 +1261,7 @@ public:
//bool OnGossipHello(Player* pPlayer, Creature* creature)
//{
// InstanceScript* instance = creature->GetInstanceScript();
- // if (instance && instance->GetData(TYPE_LEVIATHAN) !=DONE)
+ // if (instance && instance->GetData(BOSS_LEVIATHAN) !=DONE)
// {
// pPlayer->PrepareGossipMenu(creature);
//
@@ -1321,7 +1321,7 @@ class at_RX_214_repair_o_matic_station : public AreaTriggerScript
{
player->MonsterTextEmote(EMOTE_REPAIR, player->GetGUID(), true);
player->CastSpell(vehicle, SPELL_AUTO_REPAIR, true);
- if (Creature* leviathan = ObjectAccessor::GetCreature(*player, instance ? instance->GetData64(TYPE_LEVIATHAN) : 0))
+ if (Creature* leviathan = ObjectAccessor::GetCreature(*player, instance ? instance->GetData64(BOSS_LEVIATHAN) : 0))
leviathan->AI()->SetData(DATA_UNBROKEN, 0); // set bool to false thats checked in leviathan getdata
}
}
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/boss_freya.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/boss_freya.cpp
index 4c5edaa5538..445059b677a 100644
--- a/src/server/scripts/Northrend/Ulduar/ulduar/boss_freya.cpp
+++ b/src/server/scripts/Northrend/Ulduar/ulduar/boss_freya.cpp
@@ -20,120 +20,1509 @@
#include "SpellScript.h"
#include "ulduar.h"
-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,
+/*
+ * **** TODO ****
+ * Achievements *
+ */
+
+enum FreyaYells
+{
+ // Freya
+ 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,
+ 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,
+ 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,
+};
+
+enum FreyaSpells
+{
+ // Freya
+ SPELL_ATTUNED_TO_NATURE = 62519,
+ SPELL_TOUCH_OF_EONAR = 62528,
+ SPELL_SUNBEAM = 62623,
+ SPELL_ENRAGE = 47008,
+ SPELL_FREYA_GROUND_TREMOR = 62437,
+ SPELL_ROOTS_FREYA = 62283,
+ SPELL_STONEBARK_ESSENCE = 62483,
+ SPELL_IRONBRANCH_ESSENCE = 62484,
+ SPELL_BRIGHTLEAF_ESSENCE = 62485,
+ SPELL_DRAINED_OF_POWER = 62467,
+ SPELL_SUMMON_EONAR_GIFT = 62572,
+
+ // Stonebark
+ SPELL_FISTS_OF_STONE = 62344,
+ SPELL_GROUND_TREMOR = 62325,
+ SPELL_PETRIFIED_BARK = 62337,
+ SPELL_PETRIFIED_BARK_DMG = 62379,
+
+ // Ironbranch
+ SPELL_IMPALE = 62310,
+ SPELL_ROOTS_IRONBRANCH = 62438,
+ SPELL_THORN_SWARM = 62285,
+
+ // Brightleaf
+ SPELL_FLUX_AURA = 62239,
+ SPELL_FLUX = 62262,
+ SPELL_FLUX_PLUS = 62251,
+ SPELL_FLUX_MINUS = 62252,
+ SPELL_SOLAR_FLARE = 62240,
+ SPELL_UNSTABLE_SUNBEAM = 62207, // Trigger 62211
+
+ // Stack Removing of Attuned to Nature
+ SPELL_REMOVE_25STACK = 62521,
+ SPELL_REMOVE_10STACK = 62525,
+ SPELL_REMOVE_2STACK = 62524,
+
+ // Wave summoning spells
+ SPELL_SUMMON_LASHERS = 62687,
+ SPELL_SUMMON_TRIO = 62686,
+ SPELL_SUMMON_ANCIENT_CONSERVATOR = 62685,
+
+ // Detonating Lasher
+ SPELL_DETONATE = 62598,
+ SPELL_FLAME_LASH = 62608,
+
+ // Ancient Water Spirit
+ SPELL_TIDAL_WAVE = 62653,
+ SPELL_TIDAL_WAVE_EFFECT = 62654,
+
+ // Storm Lasher
+ SPELL_LIGHTNING_LASH = 62648,
+ SPELL_STORMBOLT = 62649,
+
+ // Snaplasher
+ SPELL_HARDENED_BARK = 62664,
+ SPELL_BARK_AURA = 62663,
+
+ // Ancient Conservator
+ SPELL_CONSERVATOR_GRIP = 62532,
+ SPELL_NATURE_FURY = 62589,
+ SPELL_SUMMON_PERIODIC = 62566,
+ SPELL_SPORE_SUMMON_NW = 62582, // Not used, triggered by SPELL_SUMMON_PERIODIC
+ SPELL_SPORE_SUMMON_NE = 62591,
+ SPELL_SPORE_SUMMON_SE = 62592,
+ SPELL_SPORE_SUMMON_SW = 62593,
+
+ // Healthly Spore
+ SPELL_HEALTHY_SPORE_VISUAL = 62538,
+ SPELL_GROW = 62559,
+ SPELL_POTENT_PHEROMONES = 62541,
+
+ // Eonar's Gift
+ SPELL_LIFEBINDERS_GIFT = 62584,
+ SPELL_PHEROMONES = 62619,
+ SPELL_EONAR_VISUAL = 62579,
+
+ // Nature Bomb
+ SPELL_NATURE_BOMB = 64587,
+ SPELL_OBJECT_BOMB = 64600,
+ SPELL_SUMMON_NATURE_BOMB = 64606,
+
+ // Unstable Sun Beam
+ SPELL_UNSTABLE_ENERGY = 62217,
+ SPELL_PHOTOSYNTHESIS = 62209,
+ SPELL_UNSTABLE_SUN_BEAM_TRIGGERED = 62243,
+ SPELL_FREYA_UNSTABLE_SUNBEAM = 62450, // Or maybe 62866?
+
+ // Sun Beam
+ SPELL_FREYA_UNSTABLE_ENERGY = 62451,
+ SPELL_FREYA_UNSTABLE_ENERGY_VISUAL = 62216,
+
+ // Attuned To Nature spells
+ SPELL_ATTUNED_TO_NATURE_2_DOSE_REDUCTION = 62524,
+ SPELL_ATTUNED_TO_NATURE_10_DOSE_REDUCTION = 62525,
+ SPELL_ATTUNED_TO_NATURE_25_DOSE_REDUCTION = 62521,
+};
+
+enum FreyaNpcs
+{
+ NPC_SUN_BEAM = 33170,
+ NPC_DETONATING_LASHER = 32918,
+ NPC_ANCIENT_CONSERVATOR = 33203,
+ NPC_ANCIENT_WATER_SPIRIT = 33202,
+ NPC_STORM_LASHER = 32919,
+ NPC_SNAPLASHER = 32916,
+ NPC_NATURE_BOMB = 34129,
+ NPC_EONARS_GIFT = 33228,
+ NPC_HEALTHY_SPORE = 33215,
+ NPC_UNSTABLE_SUN_BEAM = 33050,
+ NPC_IRON_ROOTS = 33088,
+ NPC_STRENGTHENED_IRON_ROOTS = 33168,
+
+ OBJECT_NATURE_BOMB = 194902,
+};
+
+enum FreyaActions
+{
+ ACTION_ELDER_DEATH = 1,
+};
+
+enum FreyaEvents
+{
+ // Freya
+ EVENT_WAVE = 1,
+ EVENT_EONAR_GIFT = 2,
+ EVENT_NATURE_BOMB = 3,
+ EVENT_UNSTABLE_ENERGY = 4,
+ EVENT_STRENGTHENED_IRON_ROOTS = 5,
+ EVENT_GROUND_TREMOR = 6,
+ EVENT_SUNBEAM = 7,
+ EVENT_ENRAGE = 8,
// Elder Stonebark
- SAY_STONEBARK_AGGRO = -1603198,
- SAY_STONEBARK_SLAY_1 = -1603199,
- SAY_STONEBARK_SLAY_2 = -1603200,
- SAY_STONEBARK_DEATH = -1603201,
+ EVENT_TREMOR = 9,
+ EVENT_BARK = 10,
+ EVENT_FISTS = 11,
+
+ // Elder Ironbranch
+ EVENT_IMPALE = 12,
+ EVENT_IRON_ROOTS = 13,
+ EVENT_THORN_SWARM = 14,
+
+ // Elder Brightleaf
+ EVENT_SOLAR_FLARE = 15,
+ EVENT_UNSTABLE_SUN_BEAM = 16,
+ EVENT_FLUX = 17,
};
-enum
+#define WAVE_TIME 60000 // Normal wave is one minute
+#define TIME_DIFFERENCE 10000 // If difference between waveTime and WAVE_TIME is bigger then TIME_DIFFERENCE, schedule EVENT_WAVE in 10 seconds
+
+class npc_iron_roots : public CreatureScript
{
- // Con-speed-atory timed achievement.
- // TODO Should be started when 1st trash is killed.
- ACHIEV_CON_SPEED_ATORY_START_EVENT = 21597,
- SPELL_ACHIEVEMENT_CHECK = 65074,
+ public:
+ npc_iron_roots() : CreatureScript("npc_iron_roots") { }
+
+ struct npc_iron_rootsAI : public Scripted_NoMovementAI
+ {
+ npc_iron_rootsAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ {
+ me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true);
+ me->ApplySpellImmune(0, IMMUNITY_ID, 49560, true); // Death Grip
+ me->setFaction(14);
+ me->SetReactState(REACT_PASSIVE);
+ summonerGUID = 0;
+ }
+
+ uint64 summonerGUID;
+
+ void IsSummonedBy(Unit* summoner)
+ {
+ // Summoner is a player, who should have root aura on self
+ summonerGUID = summoner->GetGUID();
+ me->SetFacingToObject(summoner);
+ me->SetInCombatWith(summoner);
+ }
+
+ void JustDied(Unit* who)
+ {
+ if (Unit* target = ObjectAccessor::GetPlayer(*me, summonerGUID))
+ {
+ target->RemoveAurasDueToSpell(SPELL_ROOTS_IRONBRANCH);
+ target->RemoveAurasDueToSpell(SPELL_ROOTS_FREYA);
+ }
+
+ me->RemoveCorpse(false);
+ }
+ };
- // Lumberjacked timed achievement.
- // TODO should be started when 1st elder is killed.
- // Spell should be casted when 3rd elder is killed.
- ACHIEV_LUMBERJACKED = 21686,
- SPELL_LUMBERJACKED_ACHIEVEMENT_CHECK = 65296,
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_iron_rootsAI(creature);
+ }
};
class boss_freya : public CreatureScript
{
-public:
- boss_freya() : CreatureScript("boss_freya") { }
+ public:
+ boss_freya() : CreatureScript("boss_freya") { }
- CreatureAI* GetAI(Creature* pCreature) const
- {
- return new boss_freyaAI(pCreature);
- }
+ struct boss_freyaAI : public BossAI
+ {
+ boss_freyaAI(Creature* creature) : BossAI(creature, BOSS_FREYA)
+ {
+ me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true);
+ me->ApplySpellImmune(0, IMMUNITY_ID, 49560, true); // Death Grip
+ }
- struct boss_freyaAI : public BossAI
- {
- boss_freyaAI(Creature* pCreature) : BossAI(pCreature, TYPE_FREYA)
+ uint64 ElementalGUID[3][2];
+
+ uint32 deforestation[6][2];
+ uint32 elementalTimer[2];
+ uint32 diffTimer;
+ uint32 waveTime;
+ uint8 trioWaveCount;
+ uint8 trioWaveController;
+ uint8 waveCount;
+ uint8 elderCount;
+ uint8 attunedToNature;
+
+ bool checkElementalAlive[2];
+ bool trioDefeated[2];
+ bool waveInProgress;
+ bool deforestationCheck;
+ bool random[3];
+
+ void Reset()
+ {
+ _Reset();
+ summons.clear();
+ waveTime = 0;
+ trioWaveCount = 0;
+ trioWaveController = 0;
+ waveCount = 0;
+ elderCount = 0;
+
+ for (uint8 i = 0; i < 3; ++i)
+ for (uint8 n = 0; n < 2; ++n)
+ ElementalGUID[i][n] = 0;
+ for (uint8 i = 0; i < 6; ++i)
+ for (uint8 n = 0; n < 2; ++n)
+ deforestation[i][n] = 0;
+ for (uint8 n = 0; n < 2; ++n)
+ {
+ checkElementalAlive[n] = true;
+ trioDefeated[n] = false;
+ }
+ waveInProgress = false;
+ deforestationCheck = false;
+ for (uint8 n = 0; n < 3; ++n)
+ random[n] = false;
+ }
+
+ void KilledUnit(Unit* who)
+ {
+ DoScriptText(RAND(SAY_SLAY_1, SAY_SLAY_2), me);
+ }
+
+ void DamageTaken(Unit* who, uint32& damage)
+ {
+ if (damage >= me->GetHealth() && instance)
+ {
+ damage = 0;
+ DoScriptText(SAY_DEATH, me);
+ me->SetReactState(REACT_PASSIVE);
+ _JustDied();
+ me->RemoveAllAuras();
+ me->AttackStop();
+ me->setFaction(35);
+ me->DeleteThreatList();
+ me->CombatStop(true);
+ me->ForcedDespawn(7500);
+
+ Creature* Elder[3];
+ Elder[0] = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_BRIGHTLEAF) : 0); // Brightleaf
+ Elder[1] = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_STONEBARK) : 0); // Stonebark
+ Elder[2] = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_IRONBRANCH) : 0); // Ironbranch
+
+ for (uint8 n = 0; n < 3; ++n)
+ {
+ if (Elder[n] && Elder[n]->isAlive())
+ {
+ Elder[n]->setFaction(35);
+ Elder[n]->RemoveAllAuras();
+ Elder[n]->AttackStop();
+ Elder[n]->CombatStop(true);
+ Elder[n]->DeleteThreatList();
+ }
+ }
+ }
+ }
+
+ void EnterCombat(Unit* who)
+ {
+ _EnterCombat();
+ DoZoneInCombat();
+ Creature* Elder[3];
+ Elder[0] = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_BRIGHTLEAF) : 0); // Brightleaf
+ Elder[1] = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_STONEBARK) : 0); // Stonebark
+ Elder[2] = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_IRONBRANCH) : 0); // Ironbranch
+
+ for (uint8 n = 0; n < 3; ++n)
+ {
+ if (Elder[n] && Elder[n]->isAlive())
+ {
+ me->AddAura(SPELL_DRAINED_OF_POWER, Elder[n]);
+ Elder[n]->CastSpell(me, SPELL_IRONBRANCH_ESSENCE, true);
+ Elder[n]->RemoveLootMode(LOOT_MODE_DEFAULT);
+ Elder[n]->AI()->AttackStart(who);
+ Elder[n]->AddThreat(who, 250.0f);
+ Elder[n]->SetInCombatWith(who);
+ ++elderCount;
+ }
+ }
+
+ if (Elder[0]->isAlive())
+ {
+ Elder[0]->CastSpell(me, SPELL_BRIGHTLEAF_ESSENCE, true);
+ events.ScheduleEvent(EVENT_UNSTABLE_ENERGY, urand(10000, 20000));
+ }
+ if (Elder[1]->isAlive())
+ {
+ Elder[1]->CastSpell(me, SPELL_STONEBARK_ESSENCE, true);
+ events.ScheduleEvent(EVENT_GROUND_TREMOR, urand(10000, 20000));
+ }
+ if (Elder[2]->isAlive())
+ {
+ Elder[2]->CastSpell(me, SPELL_IRONBRANCH_ESSENCE, true);
+ events.ScheduleEvent(EVENT_STRENGTHENED_IRON_ROOTS, urand(10000, 20000));
+ }
+
+ if (elderCount == 0)
+ DoScriptText(SAY_AGGRO, me);
+ else
+ DoScriptText(SAY_AGGRO_WITH_ELDER, me);
+
+ DoCast(me, SPELL_ATTUNED_TO_NATURE);
+
+ events.ScheduleEvent(EVENT_WAVE, 10000);
+ events.ScheduleEvent(EVENT_EONAR_GIFT, 25000);
+ events.ScheduleEvent(EVENT_ENRAGE, 600000);
+ events.ScheduleEvent(EVENT_SUNBEAM, urand(5000, 15000));
+ }
+
+ void UpdateAI(uint32 const diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STAT_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_ENRAGE:
+ DoScriptText(SAY_BERSERK, me);
+ DoCast(me, SPELL_ENRAGE);
+ break;
+ case EVENT_SUNBEAM:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
+ DoCast(target, SPELL_SUNBEAM);
+ events.ScheduleEvent(EVENT_SUNBEAM, urand(10000, 15000));
+ break;
+ case EVENT_NATURE_BOMB:
+ {
+ // On every player
+ std::list<Player*> PlayerList;
+ Trinity::AnyPlayerInObjectRangeCheck checker(me, 50.0f);
+ Trinity::PlayerListSearcher<Trinity::AnyPlayerInObjectRangeCheck> searcher(me, PlayerList, checker);
+ me->VisitNearbyWorldObject(50.0f, searcher);
+ for (std::list<Player*>::const_iterator itr = PlayerList.begin(); itr != PlayerList.end(); ++itr)
+ (*itr)->CastSpell(*itr, SPELL_SUMMON_NATURE_BOMB, true);
+ events.ScheduleEvent(EVENT_NATURE_BOMB, urand(10000, 12000));
+ break;
+ }
+ case EVENT_UNSTABLE_ENERGY:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
+ DoCast(target, SPELL_FREYA_UNSTABLE_SUNBEAM, true);
+ events.ScheduleEvent(EVENT_UNSTABLE_ENERGY, urand(15000, 20000));
+ break;
+ case EVENT_WAVE:
+ waveTime = 0;
+ waveInProgress = true;
+ SpawnWave();
+ if (waveCount < 6)
+ events.ScheduleEvent(EVENT_WAVE, WAVE_TIME);
+ else
+ events.ScheduleEvent(EVENT_NATURE_BOMB, urand(10000, 20000));
+ break;
+ case EVENT_EONAR_GIFT:
+ DoCast(me, SPELL_SUMMON_EONAR_GIFT);
+ events.ScheduleEvent(EVENT_EONAR_GIFT, urand(40000, 50000));
+ break;
+ case EVENT_STRENGTHENED_IRON_ROOTS:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true, -SPELL_ROOTS_FREYA))
+ target->CastSpell(target, SPELL_ROOTS_FREYA, true); // This must be casted by Target self
+ events.ScheduleEvent(EVENT_STRENGTHENED_IRON_ROOTS, urand(12000, 20000));
+ break;
+ case EVENT_GROUND_TREMOR:
+ DoCastAOE(SPELL_FREYA_GROUND_TREMOR);
+ events.ScheduleEvent(EVENT_GROUND_TREMOR, urand(25000, 28000));
+ break;
+ }
+ }
+
+ if (!me->HasAura(SPELL_TOUCH_OF_EONAR))
+ me->CastSpell(me, SPELL_TOUCH_OF_EONAR, true);
+
+ // For achievement check
+ if (Aura* aura = me->GetAura(SPELL_ATTUNED_TO_NATURE))
+ attunedToNature = aura->GetStackAmount();
+ else
+ attunedToNature = 0;
+
+ diffTimer += diff; // For getting time difference for Deforestation achievement
+
+ if (waveInProgress)
+ waveTime += diff; // Time from the last wave
+
+ // Elementals must be killed within 12 seconds of each other, or they will all revive and heal
+ Creature* Elemental[3][2];
+ for (uint8 i = 0; i < 2; ++i)
+ {
+ if (checkElementalAlive[i])
+ elementalTimer[i] = 0;
+ else
+ {
+ elementalTimer[i] += diff;
+ for (uint8 k = 0; k < 3; ++k)
+ Elemental[k][i] = ObjectAccessor::GetCreature(*me, ElementalGUID[k][i]);
+ if (elementalTimer[i] > 12000)
+ {
+ if (!trioDefeated[i]) // Do *NOT* merge this bool with bool few lines below!
+ {
+ if (Elemental[0][i] && Elemental[1][i] && Elemental[2][i])
+ {
+ for (uint8 n = 0; n < 3; ++n)
+ {
+ if (Elemental[n][i]->isAlive())
+ Elemental[n][i]->SetHealth(Elemental[n][i]->GetMaxHealth());
+ else
+ Elemental[n][i]->Respawn();
+ }
+ }
+ }
+ checkElementalAlive[i] = true;
+ }
+ else
+ {
+ if (!trioDefeated[i])
+ if (Elemental[0][i] && Elemental[1][i] && Elemental[2][i])
+ if (Elemental[0][i]->isDead() && Elemental[1][i]->isDead() && Elemental[2][i]->isDead())
+ {
+ for (uint8 n = 0; n < 3; ++n)
+ {
+ summons.remove(Elemental[n][i]->GetGUID());
+ Elemental[n][i]->ForcedDespawn(5000);
+ trioDefeated[i] = true;
+ Elemental[n][i]->CastSpell(me, SPELL_REMOVE_10STACK, true);
+ }
+ TimeCheck();
+ }
+ }
+ }
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+ // Check if all Trio NPCs are dead - achievement check
+ void LasherDead(uint32 type) // Type must be in format of a binary mask
+ {
+ uint8 n = 0;
+
+ // Handling recieved data
+ for (uint8 i = 0; i < 5; ++i) // We have created "instances" for keeping informations about last 6 death lashers - needed because of respawning
+ {
+ deforestation[i][0] = deforestation[(i + 1)][0]; // Time
+ deforestation[i][1] = deforestation[(i + 1)][1]; // Type
+ }
+ deforestation[5][0] = diffTimer;
+ deforestation[5][1] = type;
+
+ // Check for achievement completion
+ if (deforestation[0][1]) // Check for proper functionality of binary masks (overflow would not be problem)
+ {
+ for (uint8 i = 0; i < 6; ++i) // Count binary mask
+ {
+ n += deforestation[i][1];
+ }
+ if ((deforestation[5][0] - deforestation[0][0]) < 10000) // Time check
+ {
+ if (n == 14 && instance) // Binary mask check - verification of lasher types
+ {
+ deforestationCheck = true;
+ }
+ }
+ }
+ }
+
+ // Random order of spawning waves
+ int GetWaveId()
+ {
+ if (random[0] && random[1] && random[2])
+ for (uint8 n = 0; n < 3; ++n)
+ random[n] = false;
+
+ uint8 randomId = urand(0, 2);
+
+ while (random[randomId])
+ randomId = urand(0, 2);
+
+ random[randomId] = true;
+ return randomId;
+ }
+
+ void SpawnWave()
+ {
+ switch (GetWaveId())
+ {
+ case 0:
+ DoScriptText(SAY_SUMMON_LASHERS, me);
+ for (uint8 n = 0; n < 10; ++n)
+ DoCast(SPELL_SUMMON_LASHERS);
+ break;
+ case 1:
+ DoScriptText(SAY_SUMMON_TRIO, me);
+ DoCast(SPELL_SUMMON_TRIO);
+ trioWaveCount++;
+ break;
+ case 2:
+ DoScriptText(SAY_SUMMON_CONSERVATOR, me);
+ DoCast(SPELL_SUMMON_ANCIENT_CONSERVATOR);
+ break;
+ }
+ waveCount++;
+ }
+
+ void JustSummoned(Creature* summoned)
+ {
+ switch (summoned->GetEntry())
+ {
+ case NPC_SNAPLASHER:
+ case NPC_ANCIENT_WATER_SPIRIT:
+ case NPC_STORM_LASHER:
+ ElementalGUID[trioWaveController][trioWaveCount] = summoned->GetGUID();
+ summons.push_back(summoned->GetGUID());
+ trioWaveController++;
+ if (trioWaveController > 2)
+ trioWaveController = 0;
+ break;
+ case NPC_DETONATING_LASHER:
+ case NPC_ANCIENT_CONSERVATOR:
+ summons.push_back(summoned->GetGUID());
+ break;
+ }
+
+ // Need to have it there, or summoned units would do nothing untill attacked
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 250.0f, true))
+ {
+ summoned->AI()->AttackStart(target);
+ summoned->AddThreat(target, 250.0f);
+ DoZoneInCombat(summoned);
+ }
+ }
+
+ void SummonedCreatureDies(Creature* summoned, Unit* who)
+ {
+ switch (summoned->GetEntry())
+ {
+ case NPC_DETONATING_LASHER:
+ summoned->CastSpell(me, SPELL_REMOVE_2STACK, true);
+ summoned->CastSpell(who, SPELL_DETONATE, true);
+ summoned->ForcedDespawn(5000);
+ summons.remove(summoned->GetGUID());
+ TimeCheck();
+ break;
+ case NPC_ANCIENT_CONSERVATOR:
+ summoned->CastSpell(me, SPELL_REMOVE_25STACK, true);
+ summoned->ForcedDespawn(5000);
+ summons.remove(summoned->GetGUID());
+ TimeCheck();
+ break;
+ }
+ }
+
+ void TimeCheck()
+ {
+ if (waveCount >= 6)
+ return;
+
+ waveInProgress = false;
+ uint32 timeDifference = WAVE_TIME - waveTime;
+ if (timeDifference <= TIME_DIFFERENCE)
+ events.RescheduleEvent(EVENT_WAVE, timeDifference);
+ else
+ events.RescheduleEvent(EVENT_WAVE, TIME_DIFFERENCE);
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new boss_freyaAI(creature);
+ }
+};
+
+class boss_elder_brightleaf : public CreatureScript
+{
+ public:
+ boss_elder_brightleaf() : CreatureScript("boss_elder_brightleaf") { }
+
+ struct boss_elder_brightleafAI : public BossAI
+ {
+ boss_elder_brightleafAI(Creature* creature) : BossAI(creature, BOSS_BRIGHTLEAF)
+ {
+ }
+
+ uint32 lumberjackTimer;
+ uint8 elderCount;
+ bool lumberjack;
+
+ void Reset()
+ {
+ _Reset();
+ if (me->HasAura(SPELL_DRAINED_OF_POWER))
+ me->RemoveAurasDueToSpell(SPELL_DRAINED_OF_POWER);
+ events.ScheduleEvent(EVENT_SOLAR_FLARE, urand(5000, 7000));
+ events.ScheduleEvent(EVENT_UNSTABLE_SUN_BEAM, urand(7000, 12000));
+ events.ScheduleEvent(EVENT_FLUX, 5000);
+ elderCount = 0;
+ lumberjack = false;
+ }
+
+ void KilledUnit(Unit* who)
+ {
+ DoScriptText(RAND(SAY_BRIGHTLEAF_SLAY_1, SAY_BRIGHTLEAF_SLAY_2), me, who);
+ }
+
+ void JustDied(Unit* who)
+ {
+ _JustDied();
+ DoScriptText(SAY_BRIGHTLEAF_DEATH, me, who);
+
+ if (who && who->GetTypeId() == TYPEID_PLAYER)
+ {
+ if (Creature* Ironbranch = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_IRONBRANCH) : 0))
+ Ironbranch->AI()->DoAction(ACTION_ELDER_DEATH);
+
+ if (Creature* Stonebark = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_STONEBARK) : 0))
+ Stonebark->AI()->DoAction(ACTION_ELDER_DEATH);
+ }
+ }
+
+ void EnterCombat(Unit* who)
+ {
+ _EnterCombat();
+ if (!me->HasAura(SPELL_DRAINED_OF_POWER))
+ DoScriptText(SAY_BRIGHTLEAF_AGGRO, me, who);
+ }
+
+ void UpdateAI(uint32 const diff)
+ {
+ if (!UpdateVictim() || me->HasAura(SPELL_DRAINED_OF_POWER))
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STAT_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_UNSTABLE_SUN_BEAM:
+ Position pos;
+ me->GetRandomNearPosition(pos, 20.0f);
+ me->SummonCreature(NPC_UNSTABLE_SUN_BEAM, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), 0);
+ events.ScheduleEvent(EVENT_UNSTABLE_SUN_BEAM, urand(7000, 15000));
+ break;
+ case EVENT_SOLAR_FLARE:
+ {
+ uint8 stackAmount = 0;
+ if (me->GetAura(SPELL_FLUX_AURA))
+ stackAmount = me->GetAura(SPELL_FLUX_AURA)->GetStackAmount();
+ me->CastCustomSpell(SPELL_SOLAR_FLARE, SPELLVALUE_MAX_TARGETS, stackAmount, me, false);
+ events.ScheduleEvent(EVENT_SOLAR_FLARE, urand(5000, 10000));
+ break;
+ }
+ case EVENT_FLUX:
+ me->RemoveAurasDueToSpell(SPELL_FLUX_AURA);
+ me->AddAura(SPELL_FLUX_AURA, me);
+ if (Aura* Flux = me->GetAura(SPELL_FLUX_AURA))
+ Flux->SetStackAmount(urand(1, 8));
+ events.ScheduleEvent(EVENT_FLUX, 5000);
+ break;
+ }
+ }
+
+ if (lumberjack)
+ lumberjackTimer += diff;
+
+ DoMeleeAttackIfReady();
+ }
+
+ void DoAction(int32 const action)
+ {
+ switch (action)
+ {
+ case ACTION_ELDER_DEATH:
+ ++elderCount;
+ lumberjack = true;
+ break;
+ }
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new boss_elder_brightleafAI(creature);
+ }
+};
+
+class boss_elder_stonebark : public CreatureScript
+{
+ public:
+ boss_elder_stonebark() : CreatureScript("boss_elder_stonebark") { }
+
+ struct boss_elder_stonebarkAI : public BossAI
+ {
+ boss_elder_stonebarkAI(Creature* creature) : BossAI(creature, BOSS_STONEBARK)
+ {
+ }
+
+ uint32 lumberjackTimer;
+ uint8 elderCount;
+ bool lumberjack;
+
+ void Reset()
+ {
+ _Reset();
+ if (me->HasAura(SPELL_DRAINED_OF_POWER))
+ me->RemoveAurasDueToSpell(SPELL_DRAINED_OF_POWER);
+ events.ScheduleEvent(EVENT_TREMOR, urand(10000, 12000));
+ events.ScheduleEvent(EVENT_FISTS, urand(25000, 35000));
+ events.ScheduleEvent(EVENT_BARK, urand(37500, 40000));
+ elderCount = 0;
+ lumberjack = false;
+ }
+
+ void KilledUnit(Unit* who)
+ {
+ DoScriptText(RAND(SAY_STONEBARK_SLAY_1, SAY_STONEBARK_SLAY_2), me, who);
+ }
+
+ void JustDied(Unit* who)
+ {
+ _JustDied();
+ DoScriptText(SAY_STONEBARK_DEATH, me, who);
+
+ if (who && who->GetTypeId() == TYPEID_PLAYER)
+ {
+ if (Creature* Ironbranch = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_IRONBRANCH) : 0))
+ Ironbranch->AI()->DoAction(ACTION_ELDER_DEATH);
+
+ if (Creature* Brightleaf = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_BRIGHTLEAF) : 0))
+ Brightleaf->AI()->DoAction(ACTION_ELDER_DEATH);
+ }
+ }
+
+ void EnterCombat(Unit* who)
+ {
+ _EnterCombat();
+ if (!me->HasAura(SPELL_DRAINED_OF_POWER))
+ DoScriptText(SAY_STONEBARK_AGGRO, me, who);
+ }
+
+ void DamageTaken(Unit* who, uint32& damage)
+ {
+ if (who == me)
+ return;
+
+ if (me->HasAura(SPELL_PETRIFIED_BARK))
+ {
+ int32 reflect = damage;
+ who->CastCustomSpell(who, SPELL_PETRIFIED_BARK_DMG, &reflect, NULL, NULL, true);
+ damage = 0;
+ }
+ }
+
+ void UpdateAI(uint32 const diff)
+ {
+ if (!UpdateVictim() || me->HasAura(SPELL_DRAINED_OF_POWER))
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STAT_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_BARK:
+ DoCast(me, SPELL_PETRIFIED_BARK);
+ events.ScheduleEvent(EVENT_BARK, urand(30000, 50000));
+ break;
+ case EVENT_FISTS:
+ DoCast(me->getVictim(), SPELL_FISTS_OF_STONE);
+ events.ScheduleEvent(EVENT_FISTS, urand(20000, 30000));
+ break;
+ case EVENT_TREMOR:
+ if (!me->HasAura(SPELL_FISTS_OF_STONE))
+ DoCast(me->getVictim(), SPELL_GROUND_TREMOR);
+ events.ScheduleEvent(EVENT_TREMOR, urand(10000, 20000));
+ break;
+ }
+ }
+
+ if (lumberjack)
+ lumberjackTimer += diff;
+
+ DoMeleeAttackIfReady();
+ }
+
+ void DoAction(int32 const action)
+ {
+ switch (action)
+ {
+ case ACTION_ELDER_DEATH:
+ ++elderCount;
+ lumberjack = true;
+ break;
+ }
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new boss_elder_stonebarkAI(creature);
+ }
+};
+
+class boss_elder_ironbranch : public CreatureScript
+{
+ public:
+ boss_elder_ironbranch() : CreatureScript("boss_elder_ironbranch") { }
+
+ struct boss_elder_ironbranchAI : public BossAI
+ {
+ boss_elder_ironbranchAI(Creature* creature) : BossAI(creature, BOSS_IRONBRANCH)
+ {
+ }
+
+ uint32 lumberjackTimer;
+ uint8 elderCount;
+ bool lumberjack;
+
+ void Reset()
+ {
+ _Reset();
+ if (me->HasAura(SPELL_DRAINED_OF_POWER))
+ me->RemoveAurasDueToSpell(SPELL_DRAINED_OF_POWER);
+ events.ScheduleEvent(EVENT_IMPALE, urand(18000, 22000));
+ events.ScheduleEvent(EVENT_IRON_ROOTS, urand(12000, 17000));
+ events.ScheduleEvent(EVENT_THORN_SWARM, urand(7500, 12500));
+ elderCount = 0;
+ lumberjack = false;
+ }
+
+ void KilledUnit(Unit* who)
+ {
+ DoScriptText(RAND(SAY_IRONBRANCH_SLAY_1, SAY_IRONBRANCH_SLAY_2), me, who);
+ }
+
+ void JustDied(Unit* who)
+ {
+ _JustDied();
+ DoScriptText(SAY_IRONBRANCH_DEATH, me, who);
+
+ if (who && who->GetTypeId() == TYPEID_PLAYER)
+ {
+ if (Creature* Brightleaf = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_BRIGHTLEAF) : 0))
+ Brightleaf->AI()->DoAction(ACTION_ELDER_DEATH);
+
+ if (Creature* Stonebark = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_STONEBARK) : 0))
+ Stonebark->AI()->DoAction(ACTION_ELDER_DEATH);
+ }
+ }
+
+ void EnterCombat(Unit* who)
+ {
+ _EnterCombat();
+ if (!me->HasAura(SPELL_DRAINED_OF_POWER))
+ DoScriptText(SAY_IRONBRANCH_AGGRO, me, who);
+ }
+
+ void UpdateAI(uint32 const diff)
+ {
+ if (!UpdateVictim() || me->HasAura(SPELL_DRAINED_OF_POWER))
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STAT_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_IMPALE:
+ DoCast(me->getVictim(), SPELL_IMPALE);
+ events.ScheduleEvent(EVENT_IMPALE, urand(15000, 25000));
+ break;
+ case EVENT_IRON_ROOTS:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true, -SPELL_ROOTS_IRONBRANCH))
+ target->CastSpell(target, SPELL_ROOTS_IRONBRANCH, true);
+ events.ScheduleEvent(EVENT_IRON_ROOTS, urand(10000, 20000));
+ break;
+ case EVENT_THORN_SWARM:
+ DoCast(me->getVictim(), SPELL_THORN_SWARM);
+ events.ScheduleEvent(EVENT_THORN_SWARM, urand(8000, 13000));
+ break;
+ }
+ }
+
+ if (lumberjack)
+ lumberjackTimer += diff;
+
+ DoMeleeAttackIfReady();
+ }
+
+ void DoAction(int32 const action)
+ {
+ switch (action)
+ {
+ case ACTION_ELDER_DEATH:
+ ++elderCount;
+ lumberjack = true;
+ break;
+ }
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new boss_elder_ironbranchAI(creature);
+ }
+};
+
+class npc_detonating_lasher : public CreatureScript
+{
+ public:
+ npc_detonating_lasher() : CreatureScript("npc_detonating_lasher") { }
+
+ struct npc_detonating_lasherAI : public ScriptedAI
+ {
+ npc_detonating_lasherAI(Creature* creature) : ScriptedAI(creature)
+ {
+ me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true);
+ }
+
+ uint32 lashTimer;
+ uint32 changeTargetTimer;
+
+ void Reset()
+ {
+ lashTimer = 5000;
+ changeTargetTimer = 7500;
+ }
+
+ void UpdateAI(uint32 const diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ if (lashTimer <= diff)
+ {
+ DoCast(SPELL_FLAME_LASH);
+ lashTimer = urand(5000, 10000);
+ }
+ else
+ lashTimer -= diff;
+
+ if (changeTargetTimer <= diff)
+ {
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
+ {
+ // Switching to other target - modify aggro of new target by 20% from current target's aggro
+ me->AddThreat(target, me->getThreatManager().getThreat(me->getVictim(), false) * 1.2f);
+ me->AI()->AttackStart(target);
+ }
+ changeTargetTimer = urand(5000, 10000);
+ }
+ else
+ changeTargetTimer -= diff;
+
+ DoMeleeAttackIfReady();
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_detonating_lasherAI(creature);
+ }
+};
+
+class npc_ancient_water_spirit : public CreatureScript
+{
+ public:
+ npc_ancient_water_spirit() : CreatureScript("npc_ancient_water_spirit") { }
+
+ struct npc_ancient_water_spiritAI : public ScriptedAI
+ {
+ npc_ancient_water_spiritAI(Creature* creature) : ScriptedAI(creature)
+ {
+ instance = me->GetInstanceScript();
+ if (Creature* Freya = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_FREYA) : 0))
+ waveCount = CAST_AI(boss_freya::boss_freyaAI, Freya->AI())->trioWaveCount;
+ }
+
+ InstanceScript* instance;
+
+ uint32 tidalWaveTimer;
+ uint8 waveCount;
+
+ void Reset()
+ {
+ tidalWaveTimer = 10000;
+ }
+
+ void UpdateAI(uint32 const diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ if (tidalWaveTimer <= diff)
+ {
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
+ {
+ DoCast(target, SPELL_TIDAL_WAVE);
+ DoCast(target, SPELL_TIDAL_WAVE_EFFECT, true);
+ }
+ tidalWaveTimer = urand(12000, 25000);
+ }
+ else
+ tidalWaveTimer -= diff;
+
+ DoMeleeAttackIfReady();
+ }
+
+ void JustDied(Unit* who)
+ {
+ if (Creature* Freya = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_FREYA) : 0))
+ {
+ CAST_AI(boss_freya::boss_freyaAI, Freya->AI())->checkElementalAlive[waveCount] = false;
+ CAST_AI(boss_freya::boss_freyaAI, Freya->AI())->LasherDead(1);
+ }
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_ancient_water_spiritAI(creature);
+ }
+};
+
+class npc_storm_lasher : public CreatureScript
+{
+ public:
+ npc_storm_lasher() : CreatureScript("npc_storm_lasher") { }
+
+ struct npc_storm_lasherAI : public ScriptedAI
+ {
+ npc_storm_lasherAI(Creature* creature) : ScriptedAI(creature)
+ {
+ instance = me->GetInstanceScript();
+ if (Creature* Freya = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_FREYA) : 0))
+ waveCount = CAST_AI(boss_freya::boss_freyaAI, Freya->AI())->trioWaveCount;
+ }
+
+ InstanceScript* instance;
+
+ uint32 lightningLashTimer;
+ uint32 stormboltTimer;
+ uint8 waveCount;
+
+ void Reset()
+ {
+ lightningLashTimer = 10000;
+ stormboltTimer = 5000;
+ }
+
+ void UpdateAI(uint32 const diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ if (lightningLashTimer <= diff)
+ {
+ DoCast(SPELL_LIGHTNING_LASH);
+ lightningLashTimer = urand(7000, 14000);
+ }
+ else
+ lightningLashTimer -= diff;
+
+ if (stormboltTimer <= diff)
+ {
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
+ DoCast(target, SPELL_STORMBOLT);
+ stormboltTimer = urand(8000, 12000);
+ }
+ else
+ stormboltTimer -= diff;
+
+ DoMeleeAttackIfReady();
+ }
+
+ void JustDied(Unit* who)
+ {
+ if (Creature* Freya = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_FREYA) : 0))
+ {
+ CAST_AI(boss_freya::boss_freyaAI, Freya->AI())->checkElementalAlive[waveCount] = false;
+ CAST_AI(boss_freya::boss_freyaAI, Freya->AI())->LasherDead(2);
+ }
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
{
+ return new npc_storm_lasherAI(creature);
}
+};
- void Reset()
+class npc_snaplasher : public CreatureScript
+{
+ public:
+ npc_snaplasher() : CreatureScript("npc_snaplasher") { }
+
+ struct npc_snaplasherAI : public ScriptedAI
{
- _Reset();
+ npc_snaplasherAI(Creature* creature) : ScriptedAI(creature)
+ {
+ instance = me->GetInstanceScript();
+ if (Creature* Freya = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_FREYA) : 0))
+ waveCount = CAST_AI(boss_freya::boss_freyaAI, Freya->AI())->trioWaveCount;
+ }
+
+ InstanceScript* instance;
+
+ uint8 waveCount;
+
+ void UpdateAI(uint32 const diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ if (!me->HasAura(SPELL_BARK_AURA))
+ DoCast(SPELL_HARDENED_BARK);
+
+ DoMeleeAttackIfReady();
+ }
+
+ void JustDied(Unit* who)
+ {
+ if (Creature* Freya = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_FREYA) : 0))
+ {
+ CAST_AI(boss_freya::boss_freyaAI, Freya->AI())->checkElementalAlive[waveCount] = false;
+ CAST_AI(boss_freya::boss_freyaAI, Freya->AI())->LasherDead(4);
+ }
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_snaplasherAI(creature);
}
+};
+
+class npc_ancient_conservator : public CreatureScript
+{
+ public:
+ npc_ancient_conservator() : CreatureScript("npc_ancient_conservator") { }
+
+ struct npc_ancient_conservatorAI : public ScriptedAI
+ {
+ npc_ancient_conservatorAI(Creature* creature) : ScriptedAI(creature)
+ {
+ }
- void KilledUnit(Unit * /*victim*/)
+ uint32 natureFuryTimer;
+ uint32 healthySporeTimer;
+ bool grip;
+
+ void Reset()
+ {
+ natureFuryTimer = 7500;
+ healthySporeTimer = 3500;
+ SummonHealthySpores(2);
+ grip = false;
+ }
+
+ void SummonHealthySpores(uint8 sporesCount)
+ {
+ for (uint8 n = 0; n < sporesCount; ++n)
+ {
+ DoCast(SPELL_SUMMON_PERIODIC);
+ DoCast(SPELL_SPORE_SUMMON_NE);
+ DoCast(SPELL_SPORE_SUMMON_SE);
+ DoCast(SPELL_SPORE_SUMMON_SW);
+ }
+ }
+
+ void UpdateAI(uint32 const diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ if (!grip)
+ {
+ me->CastSpell(me->getVictim(), SPELL_CONSERVATOR_GRIP, true);
+ grip = true;
+ }
+
+ if (healthySporeTimer <= diff)
+ {
+ SummonHealthySpores(1);
+ healthySporeTimer = urand(15000, 17500);
+ }
+ else
+ healthySporeTimer -= diff;
+
+ if (natureFuryTimer <= diff)
+ {
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true, -SPELL_NATURE_FURY))
+ DoCast(target, SPELL_NATURE_FURY);
+ me->AddAura(SPELL_CONSERVATOR_GRIP, me);
+ natureFuryTimer = 5000;
+ }
+ else
+ natureFuryTimer -= diff;
+
+ DoMeleeAttackIfReady();
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
{
- DoScriptText(RAND(SAY_SLAY_1, SAY_SLAY_2), me);
+ return new npc_ancient_conservatorAI(creature);
}
+};
- void JustDied(Unit * /*victim*/)
+class npc_sun_beam : public CreatureScript
+{
+ public:
+ npc_sun_beam() : CreatureScript("npc_sun_beam") { }
+
+ struct npc_sun_beamAI : public Scripted_NoMovementAI
{
- DoScriptText(SAY_DEATH, me);
- _JustDied();
+ npc_sun_beamAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ {
+ me->SetReactState(REACT_PASSIVE);
+ DoCastAOE(SPELL_FREYA_UNSTABLE_ENERGY_VISUAL, true);
+ DoCast(SPELL_FREYA_UNSTABLE_ENERGY);
+ }
+ };
- // cast is not rewarding the achievement.
- // DoCast(SPELL_ACHIEVEMENT_CHECK);
- instance->DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_ACHIEVEMENT_CHECK);
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_sun_beamAI(creature);
}
+};
+
+class npc_healthy_spore : public CreatureScript
+{
+ public:
+ npc_healthy_spore() : CreatureScript("npc_healthy_spore") { }
+
+ struct npc_healthy_sporeAI : public Scripted_NoMovementAI
+ {
+ npc_healthy_sporeAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ {
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_OOC_NOT_ATTACKABLE);
+ me->SetReactState(REACT_PASSIVE);
+ DoCast(me, SPELL_HEALTHY_SPORE_VISUAL);
+ DoCast(me, SPELL_POTENT_PHEROMONES);
+ DoCast(me, SPELL_GROW);
+ lifeTimer = urand(22000, 30000);
+ }
+
+ uint32 lifeTimer;
- void EnterCombat(Unit* /*pWho*/)
+ void UpdateAI(uint32 const diff)
+ {
+ std::list<Player*> PlayerList;
+ Trinity::AnyPlayerInObjectRangeCheck checker(me, 6.0f);
+ Trinity::PlayerListSearcher<Trinity::AnyPlayerInObjectRangeCheck> searcher(me, PlayerList, checker);
+ me->VisitNearbyWorldObject(6.0f, searcher);
+ if (!PlayerList.empty())
+ for (std::list<Player*>::const_iterator itr = PlayerList.begin(); itr != PlayerList.end(); ++itr)
+ (*itr)->RemoveAurasDueToSpell(SPELL_CONSERVATOR_GRIP);
+
+ if (lifeTimer <= diff)
+ {
+ me->RemoveAurasDueToSpell(SPELL_GROW);
+ me->ForcedDespawn(2200);
+ lifeTimer = urand(22000, 30000);
+ }
+ else
+ lifeTimer -= diff;
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
{
- DoScriptText(SAY_AGGRO, me);
- _EnterCombat();
+ return new npc_healthy_sporeAI(creature);
}
+};
+
+class npc_eonars_gift : public CreatureScript
+{
+ public:
+ npc_eonars_gift() : CreatureScript("npc_eonars_gift") { }
- void UpdateAI(const uint32 diff)
+ struct npc_eonars_giftAI : public Scripted_NoMovementAI
{
- if (!UpdateVictim())
- return;
- //SPELLS TODO:
+ npc_eonars_giftAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ {
+ lifeBindersGiftTimer = 12000;
+ DoCast(me, SPELL_GROW);
+ DoCast(me, SPELL_PHEROMONES, true);
+ DoCast(me, SPELL_EONAR_VISUAL, true);
+ }
+
+ uint32 lifeBindersGiftTimer;
- //
- DoMeleeAttackIfReady();
+ void UpdateAI(uint32 const diff)
+ {
+ std::list<Player*> PlayerList;
+ Trinity::AnyPlayerInObjectRangeCheck checker(me, 6.0f);
+ Trinity::PlayerListSearcher<Trinity::AnyPlayerInObjectRangeCheck> searcher(me, PlayerList, checker);
+ me->VisitNearbyWorldObject(6.0f, searcher);
+ if (!PlayerList.empty())
+ for (std::list<Player *>::const_iterator itr = PlayerList.begin(); itr != PlayerList.end(); ++itr)
+ (*itr)->RemoveAurasDueToSpell(SPELL_CONSERVATOR_GRIP);
- EnterEvadeIfOutOfCombatArea(diff);
+ if (lifeBindersGiftTimer <= diff)
+ {
+ me->RemoveAurasDueToSpell(SPELL_GROW);
+ DoCast(SPELL_LIFEBINDERS_GIFT);
+ me->ForcedDespawn(2500);
+ lifeBindersGiftTimer = 12000;
+ }
+ else
+ lifeBindersGiftTimer -= diff;
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_eonars_giftAI(creature);
}
- };
+};
+
+class npc_nature_bomb : public CreatureScript
+{
+ public:
+ npc_nature_bomb() : CreatureScript("npc_nature_bomb") { }
+
+ struct npc_nature_bombAI : public Scripted_NoMovementAI
+ {
+ npc_nature_bombAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ {
+ bombTimer = urand(8000, 10000);
+ DoCast(SPELL_OBJECT_BOMB);
+ }
+ uint32 bombTimer;
+
+ void UpdateAI(uint32 const diff)
+ {
+ if (bombTimer <= diff)
+ {
+ if (GameObject* go = me->FindNearestGameObject(OBJECT_NATURE_BOMB, 1.0f))
+ {
+ DoCast(me, SPELL_NATURE_BOMB);
+ me->RemoveGameObject(go, true);
+ me->RemoveFromWorld();
+ }
+
+ bombTimer = 10000;
+ }
+ else
+ bombTimer -= diff;
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_nature_bombAI(creature);
+ }
};
-enum eSpells
+class npc_unstable_sun_beam : public CreatureScript
{
- SPELL_ATTUNED_TO_NATURE_2_DOSE_REDUCTION = 62524,
- SPELL_ATTUNED_TO_NATURE_10_DOSE_REDUCTION = 62525,
- SPELL_ATTUNED_TO_NATURE_25_DOSE_REDUCTION = 62521,
+ public:
+ npc_unstable_sun_beam() : CreatureScript("npc_unstable_sun_beam") { }
+
+ struct npc_unstable_sun_beamAI : public Scripted_NoMovementAI
+ {
+ npc_unstable_sun_beamAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ {
+ despawnTimer = 10000;
+ instance = me->GetInstanceScript();
+ DoCast(me, SPELL_PHOTOSYNTHESIS);
+ DoCast(me, SPELL_UNSTABLE_SUNBEAM);
+ me->SetReactState(REACT_PASSIVE);
+ }
+
+ InstanceScript* instance;
+
+ uint32 despawnTimer;
+
+ void UpdateAI(uint32 const diff)
+ {
+ if (despawnTimer <= diff)
+ {
+ DoCastAOE(SPELL_UNSTABLE_ENERGY, true);
+ me->DisappearAndDie();
+ }
+ else
+ despawnTimer -= diff;
+ }
+
+ void SpellHitTarget(Unit* target, SpellEntry const* spell)
+ {
+ if (target && spell->Id == SPELL_UNSTABLE_ENERGY)
+ {
+ target->RemoveAurasDueToSpell(SPELL_UNSTABLE_SUNBEAM);
+ target->RemoveAurasDueToSpell(SPELL_UNSTABLE_SUN_BEAM_TRIGGERED);
+ }
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_unstable_sun_beamAI(creature);
+ }
};
class spell_attuned_to_nature_dose_reduction : public SpellScriptLoader
{
public:
- spell_attuned_to_nature_dose_reduction() : SpellScriptLoader("spell_attuned_to_nature_dose_reduction") { }
+ spell_attuned_to_nature_dose_reduction() : SpellScriptLoader("spell_attuned_to_nature_dose_reduction")
+ {
+ }
class spell_attuned_to_nature_dose_reduction_SpellScript : public SpellScript
{
@@ -141,23 +1530,23 @@ public:
void HandleScript(SpellEffIndex /*effIndex*/)
{
- Unit * target = GetHitUnit();
- SpellEntry const * m_spellInfo = GetSpellInfo();
- switch (m_spellInfo->Id)
+ Unit* target = GetHitUnit();
+ SpellEntry const* spellInfo = GetSpellInfo();
+ switch (spellInfo->Id)
{
case SPELL_ATTUNED_TO_NATURE_2_DOSE_REDUCTION:
if (target->HasAura(GetEffectValue()))
- for (uint8 n = 0; n < 2; n++)
+ for (uint8 n = 0; n < 2; ++n)
target->RemoveAuraFromStack(GetEffectValue(), 0, AURA_REMOVE_BY_DEFAULT);
break;
case SPELL_ATTUNED_TO_NATURE_10_DOSE_REDUCTION:
if (target->HasAura(GetEffectValue()))
- for (uint8 n = 0; n < 10; n++)
+ for (uint8 n = 0; n < 10; ++n)
target->RemoveAuraFromStack(GetEffectValue(), 0, AURA_REMOVE_BY_DEFAULT);
break;
case SPELL_ATTUNED_TO_NATURE_25_DOSE_REDUCTION:
if (target->HasAura(GetEffectValue()))
- for (uint8 n = 0; n < 25; n++)
+ for (uint8 n = 0; n < 25; ++n)
target->RemoveAuraFromStack(GetEffectValue(), 0, AURA_REMOVE_BY_DEFAULT);
break;
default:
@@ -171,14 +1560,94 @@ public:
}
};
- SpellScript * GetSpellScript() const
+ SpellScript* GetSpellScript() const
{
return new spell_attuned_to_nature_dose_reduction_SpellScript();
}
};
+class spell_freya_iron_roots : public SpellScriptLoader
+{
+ public:
+ spell_freya_iron_roots() : SpellScriptLoader("spell_freya_iron_roots")
+ {
+ }
+
+ class spell_freya_iron_roots_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_freya_iron_roots_SpellScript);
+
+ void HandleSummon(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+ uint32 entry = uint32(GetSpellInfo()->EffectMiscValue[effIndex]);
+
+ Position pos;
+ GetCaster()->GetPosition(&pos);
+ // Not good at all, but this prevents having roots in a different position then player
+ if (Creature* Roots = GetCaster()->SummonCreature(entry, pos))
+ GetCaster()->NearTeleportTo(Roots->GetPositionX(), Roots->GetPositionY(), Roots->GetPositionZ(), GetCaster()->GetOrientation());
+ }
+
+ void Register()
+ {
+ OnEffect += SpellEffectFn(spell_freya_iron_roots_SpellScript::HandleSummon, EFFECT_0, SPELL_EFFECT_SUMMON);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_freya_iron_roots_SpellScript();
+ }
+};
+
+class spell_freya_attuned_to_nature : public SpellScriptLoader
+{
+ public:
+ spell_freya_attuned_to_nature() : SpellScriptLoader("spell_freya_attuned_to_nature")
+ {
+ }
+
+ class spell_freya_attuned_to_nature_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_freya_attuned_to_nature_SpellScript);
+
+ void ModAuraStack()
+ {
+ if (Aura* aura = GetHitAura())
+ aura->SetStackAmount(uint8(GetSpellInfo()->StackAmount));
+ }
+
+ void Register()
+ {
+ AfterHit += SpellHitFn(spell_freya_attuned_to_nature_SpellScript::ModAuraStack);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_freya_attuned_to_nature_SpellScript();
+ }
+};
+
void AddSC_boss_freya()
{
new boss_freya();
+ new boss_elder_brightleaf();
+ new boss_elder_ironbranch();
+ new boss_elder_stonebark();
+ new npc_ancient_conservator();
+ new npc_snaplasher();
+ new npc_storm_lasher();
+ new npc_ancient_water_spirit();
+ new npc_detonating_lasher();
+ new npc_sun_beam();
+ new npc_nature_bomb();
+ new npc_eonars_gift();
+ new npc_healthy_spore();
+ new npc_unstable_sun_beam();
+ new npc_iron_roots();
new spell_attuned_to_nature_dose_reduction();
-}
+ new spell_freya_iron_roots();
+ new spell_freya_attuned_to_nature();
+} \ No newline at end of file
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/boss_general_vezax.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/boss_general_vezax.cpp
index d31a642b22e..97541c5a12f 100644
--- a/src/server/scripts/Northrend/Ulduar/ulduar/boss_general_vezax.cpp
+++ b/src/server/scripts/Northrend/Ulduar/ulduar/boss_general_vezax.cpp
@@ -95,7 +95,7 @@ public:
struct boss_general_vezaxAI : public BossAI
{
- boss_general_vezaxAI(Creature *pCreature) : BossAI(pCreature, TYPE_VEZAX)
+ boss_general_vezaxAI(Creature *pCreature) : BossAI(pCreature, BOSS_VEZAX)
{
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true);
me->ApplySpellImmune(0, IMMUNITY_ID, 49560, true); // Death Grip jump effect
@@ -332,7 +332,7 @@ public:
void JustDied(Unit * /*pWho*/)
{
- if (Creature * pVezax = me->GetCreature(*me, pInstance ? pInstance->GetData64(TYPE_VEZAX) : 0))
+ if (Creature * pVezax = me->GetCreature(*me, pInstance ? pInstance->GetData64(BOSS_VEZAX) : 0))
pVezax->AI()->DoAction(ACTION_ANIMUS_DIE);
}
@@ -405,7 +405,7 @@ public:
DoCast(me, SPELL_SARONITE_VAPORS);
me->DespawnOrUnsummon(30000);
- if (Creature * pVezax = me->GetCreature(*me, pInstance ? pInstance->GetData64(TYPE_VEZAX) : 0))
+ if (Creature * pVezax = me->GetCreature(*me, pInstance ? pInstance->GetData64(BOSS_VEZAX) : 0))
pVezax->AI()->DoAction(ACTION_VAPORS_DIE);
}
}
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/boss_hodir.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/boss_hodir.cpp
index 3a6a4803fc0..75b62f96c9f 100644
--- a/src/server/scripts/Northrend/Ulduar/ulduar/boss_hodir.cpp
+++ b/src/server/scripts/Northrend/Ulduar/ulduar/boss_hodir.cpp
@@ -207,7 +207,7 @@ class npc_flash_freeze : public CreatureScript
// Prevents to have Ice Block on other place than target is
me->NearTeleportTo(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), target->GetOrientation());
if (target->GetTypeId() == TYPEID_PLAYER)
- if (Creature* Hodir = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(TYPE_HODIR) : 0))
+ if (Creature* Hodir = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_HODIR) : 0))
Hodir->AI()->DoAction(ACTION_CHEESE_THE_FREEZE);
}
}
@@ -259,7 +259,7 @@ class npc_ice_block : public CreatureScript
{
Helper->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_STUNNED | UNIT_FLAG_PACIFIED);
- if (Creature* Hodir = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(TYPE_HODIR) : 0))
+ if (Creature* Hodir = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_HODIR) : 0))
{
if (!Hodir->isInCombat())
{
@@ -287,7 +287,7 @@ class boss_hodir : public CreatureScript
struct boss_hodirAI : public BossAI
{
- boss_hodirAI(Creature* creature) : BossAI(creature, TYPE_HODIR)
+ boss_hodirAI(Creature* creature) : BossAI(creature, BOSS_HODIR)
{
me->SetReactState(REACT_PASSIVE);
}
@@ -457,7 +457,7 @@ class boss_hodir : public CreatureScript
void FlashFreeze()
{
std::list<Unit*> TargetList;
- Trinity::AnyUnfriendlyUnitInObjectRangeCheck checker(me, me, 150.0f);
+ Trinity::AnyUnfriendlyUnitInObjectRangeCheck checker(me, me, 100.0f);
Trinity::UnitListSearcher<Trinity::AnyUnfriendlyUnitInObjectRangeCheck> searcher(me, TargetList, checker);
me->VisitNearbyObject(100.0f, searcher);
for (std::list<Unit*>::iterator itr = TargetList.begin(); itr != TargetList.end(); ++itr)
@@ -633,7 +633,7 @@ class npc_hodir_priest : public CreatureScript
void JustDied(Unit* who)
{
- if (Creature* Hodir = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(TYPE_HODIR) : 0))
+ if (Creature* Hodir = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_HODIR) : 0))
Hodir->AI()->DoAction(ACTION_I_HAVE_THE_COOLEST_FRIENDS);
}
@@ -695,7 +695,7 @@ class npc_hodir_shaman : public CreatureScript
void JustDied(Unit* who)
{
- if (Creature* Hodir = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(TYPE_HODIR) : 0))
+ if (Creature* Hodir = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_HODIR) : 0))
Hodir->AI()->DoAction(ACTION_I_HAVE_THE_COOLEST_FRIENDS);
}
@@ -756,7 +756,7 @@ class npc_hodir_druid : public CreatureScript
void JustDied(Unit* who)
{
- if (Creature* Hodir = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(TYPE_HODIR) : 0))
+ if (Creature* Hodir = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_HODIR) : 0))
Hodir->AI()->DoAction(ACTION_I_HAVE_THE_COOLEST_FRIENDS);
}
@@ -821,7 +821,7 @@ class npc_hodir_mage : public CreatureScript
void JustDied(Unit* who)
{
- if (Creature* Hodir = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(TYPE_HODIR) : 0))
+ if (Creature* Hodir = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_HODIR) : 0))
Hodir->AI()->DoAction(ACTION_I_HAVE_THE_COOLEST_FRIENDS);
}
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/boss_ignis.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/boss_ignis.cpp
index 2b6cb76dc11..b7a832e4cbc 100644
--- a/src/server/scripts/Northrend/Ulduar/ulduar/boss_ignis.cpp
+++ b/src/server/scripts/Northrend/Ulduar/ulduar/boss_ignis.cpp
@@ -123,7 +123,7 @@ public:
struct boss_ignis_AI : public BossAI
{
- boss_ignis_AI(Creature *pCreature) : BossAI(pCreature, TYPE_IGNIS), vehicle(me->GetVehicleKit())
+ boss_ignis_AI(Creature *pCreature) : BossAI(pCreature, BOSS_IGNIS), vehicle(me->GetVehicleKit())
{
assert(vehicle);
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true);
@@ -328,7 +328,7 @@ public:
if (me->HasAura(SPELL_BRITTLE) && damage >= 5000)
{
DoCast(SPELL_SHATTER);
- if (Creature *pIgnis = me->GetCreature(*me, instance->GetData64(TYPE_IGNIS)))
+ if (Creature *pIgnis = me->GetCreature(*me, instance->GetData64(BOSS_IGNIS)))
if (pIgnis->AI())
pIgnis->AI()->DoAction(ACTION_REMOVE_BUFF);
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/boss_kologarn.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/boss_kologarn.cpp
index 990ed9f4f02..998d4ec9481 100644
--- a/src/server/scripts/Northrend/Ulduar/ulduar/boss_kologarn.cpp
+++ b/src/server/scripts/Northrend/Ulduar/ulduar/boss_kologarn.cpp
@@ -102,7 +102,7 @@ class boss_kologarn : public CreatureScript
struct boss_kologarnAI : public BossAI
{
- boss_kologarnAI(Creature *pCreature) : BossAI(pCreature, TYPE_KOLOGARN), vehicle(pCreature->GetVehicleKit()),
+ boss_kologarnAI(Creature *pCreature) : BossAI(pCreature, BOSS_KOLOGARN), vehicle(pCreature->GetVehicleKit()),
left(false), right(false)
{
ASSERT(vehicle);
@@ -160,7 +160,7 @@ class boss_kologarn : public CreatureScript
void PassengerBoarded(Unit* who, int8 /*seatId*/, bool apply)
{
- bool isEncounterInProgress = instance->GetBossState(TYPE_KOLOGARN) == IN_PROGRESS;
+ bool isEncounterInProgress = instance->GetBossState(BOSS_KOLOGARN) == IN_PROGRESS;
if (who->GetEntry() == NPC_LEFT_ARM)
{
left = apply;
@@ -354,7 +354,7 @@ class spell_ulduar_rubble_summon : public SpellScriptLoader
if (!caster)
return;
- uint64 originalCaster = caster->GetInstanceScript() ? caster->GetInstanceScript()->GetData64(TYPE_KOLOGARN) : 0;
+ uint64 originalCaster = caster->GetInstanceScript() ? caster->GetInstanceScript()->GetData64(BOSS_KOLOGARN) : 0;
uint32 spellId = GetEffectValue();
for (uint8 i = 0; i < 5; ++i)
caster->CastSpell(caster, spellId, true, NULL, NULL, originalCaster);
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/boss_razorscale.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/boss_razorscale.cpp
index e7c5028a16c..4b7a81f2e82 100644
--- a/src/server/scripts/Northrend/Ulduar/ulduar/boss_razorscale.cpp
+++ b/src/server/scripts/Northrend/Ulduar/ulduar/boss_razorscale.cpp
@@ -216,7 +216,7 @@ class boss_razorscale_controller : public CreatureScript
void DoAction(int32 const action)
{
- if (instance->GetBossState(TYPE_RAZORSCALE) != IN_PROGRESS)
+ if (instance->GetBossState(BOSS_RAZORSCALE) != IN_PROGRESS)
return;
switch (action)
@@ -298,7 +298,7 @@ class go_razorscale_harpoon : public GameObjectScript
bool OnGossipHello(Player* /*player*/, GameObject* go)
{
InstanceScript* instance = go->GetInstanceScript();
- if (ObjectAccessor::GetCreature(*go, instance ? instance->GetData64(TYPE_RAZORSCALE) : 0))
+ if (ObjectAccessor::GetCreature(*go, instance ? instance->GetData64(BOSS_RAZORSCALE) : 0))
go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
return false;
}
@@ -311,7 +311,7 @@ class boss_razorscale : public CreatureScript
struct boss_razorscaleAI : public BossAI
{
- boss_razorscaleAI(Creature* creature) : BossAI(creature, TYPE_RAZORSCALE)
+ boss_razorscaleAI(Creature* creature) : BossAI(creature, BOSS_RAZORSCALE)
{
// Do not let Razorscale be affected by Battle Shout buff
me->ApplySpellImmune(0, IMMUNITY_ID, (SPELL_BATTLE_SHOUT), true);
@@ -335,7 +335,7 @@ class boss_razorscale : public CreatureScript
me->SetReactState(REACT_PASSIVE);
PermaGround = false;
HarpoonCounter = 0;
- if (Creature* commander = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(DATA_EXP_COMMANDER) : 0))
+ if (Creature* commander = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(DATA_EXPEDITION_COMMANDER) : 0))
commander->AI()->DoAction(ACTION_COMMANDER_RESET);
}
@@ -433,7 +433,7 @@ class boss_razorscale : public CreatureScript
me->SetFlying(false);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED | UNIT_FLAG_PACIFIED);
- if (Creature* commander = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(DATA_EXP_COMMANDER) : 0))
+ if (Creature* commander = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(DATA_EXPEDITION_COMMANDER) : 0))
commander->AI()->DoAction(ACTION_GROUND_PHASE);
events.ScheduleEvent(EVENT_BREATH, 30000, 0, PHASE_GROUND);
events.ScheduleEvent(EVENT_BUFFET, 33000, 0, PHASE_GROUND);
@@ -638,7 +638,7 @@ class npc_expedition_commander : public CreatureScript
switch (Phase)
{
case 1:
- instance->SetBossState(TYPE_RAZORSCALE, IN_PROGRESS);
+ instance->SetBossState(BOSS_RAZORSCALE, IN_PROGRESS);
summons.clear();
AttackStartTimer = 1000;
Phase = 2;
@@ -676,7 +676,7 @@ class npc_expedition_commander : public CreatureScript
Phase = 5;
break;
case 5:
- if (Creature* Razorscale = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(TYPE_RAZORSCALE) : 0))
+ if (Creature* Razorscale = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_RAZORSCALE) : 0))
{
Razorscale->AI()->DoAction(ACTION_EVENT_START);
me->SetInCombatWith(Razorscale);
@@ -707,7 +707,7 @@ class npc_expedition_commander : public CreatureScript
bool OnGossipHello(Player* player, Creature* creature)
{
InstanceScript* instance = creature->GetInstanceScript();
- if (instance && instance->GetBossState(TYPE_RAZORSCALE) == NOT_STARTED)
+ if (instance && instance->GetBossState(BOSS_RAZORSCALE) == NOT_STARTED)
{
player->PrepareGossipMenu(creature);
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/boss_thorim.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/boss_thorim.cpp
index 0f7ea5bf174..30865ac6605 100644
--- a/src/server/scripts/Northrend/Ulduar/ulduar/boss_thorim.cpp
+++ b/src/server/scripts/Northrend/Ulduar/ulduar/boss_thorim.cpp
@@ -53,7 +53,7 @@ public:
struct boss_thorimAI : public BossAI
{
- boss_thorimAI(Creature* pCreature) : BossAI(pCreature, TYPE_THORIM)
+ boss_thorimAI(Creature* pCreature) : BossAI(pCreature, BOSS_THORIM)
{
}
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/boss_xt002.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/boss_xt002.cpp
index 37c6b690fa0..d7f6a64ffcb 100644
--- a/src/server/scripts/Northrend/Ulduar/ulduar/boss_xt002.cpp
+++ b/src/server/scripts/Northrend/Ulduar/ulduar/boss_xt002.cpp
@@ -176,7 +176,7 @@ public:
struct boss_xt002_AI : public BossAI
{
- boss_xt002_AI(Creature *pCreature) : BossAI(pCreature, TYPE_XT002)
+ boss_xt002_AI(Creature *pCreature) : BossAI(pCreature, BOSS_XT002)
{
}
@@ -547,7 +547,7 @@ public:
void JustDied(Unit * /*victim*/)
{
if (m_pInstance)
- if (Creature* pXT002 = me->GetCreature(*me, m_pInstance->GetData64(TYPE_XT002)))
+ if (Creature* pXT002 = me->GetCreature(*me, m_pInstance->GetData64(BOSS_XT002)))
if (pXT002->AI())
pXT002->AI()->DoAction(ACTION_ENTER_HARD_MODE);
@@ -557,7 +557,7 @@ public:
void DamageTaken(Unit * /*pDone*/, uint32 &damage)
{
- if (Creature* pXT002 = me->GetCreature(*me, m_pInstance->GetData64(TYPE_XT002)))
+ if (Creature* pXT002 = me->GetCreature(*me, m_pInstance->GetData64(BOSS_XT002)))
if (pXT002->AI())
{
uint32 health = me->GetHealth();
@@ -600,13 +600,13 @@ public:
{
me->SetReactState(REACT_PASSIVE);
- if (Creature* pXT002 = me->GetCreature(*me, m_pInstance->GetData64(TYPE_XT002)))
+ if (Creature* pXT002 = me->GetCreature(*me, m_pInstance->GetData64(BOSS_XT002)))
me->GetMotionMaster()->MoveChase(pXT002);
}
void UpdateAI(const uint32 /*diff*/)
{
- if (Creature* pXT002 = me->GetCreature(*me, m_pInstance->GetData64(TYPE_XT002)))
+ if (Creature* pXT002 = me->GetCreature(*me, m_pInstance->GetData64(BOSS_XT002)))
{
if (me->GetDistance2d(pXT002) <= 0.5)
{
@@ -718,7 +718,7 @@ public:
{
me->SetReactState(REACT_PASSIVE);
- if (Creature* pXT002 = me->GetCreature(*me, m_pInstance->GetData64(TYPE_XT002)))
+ if (Creature* pXT002 = me->GetCreature(*me, m_pInstance->GetData64(BOSS_XT002)))
me->GetMotionMaster()->MoveChase(pXT002);
}
@@ -729,7 +729,7 @@ public:
void UpdateAI(const uint32 /*diff*/)
{
- if (Creature* pXT002 = me->GetCreature(*me, m_pInstance->GetData64(TYPE_XT002)))
+ if (Creature* pXT002 = me->GetCreature(*me, m_pInstance->GetData64(BOSS_XT002)))
{
if (me->GetDistance2d(pXT002) <= 0.5)
{
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp
index 71c5d927c65..80f16b5f278 100644
--- a/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp
+++ b/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp
@@ -23,8 +23,8 @@
static const DoorData doorData[] =
{
- {GO_LEVIATHAN_DOOR, TYPE_LEVIATHAN, DOOR_TYPE_ROOM, BOUNDARY_S},
- {0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE}
+ { GO_LEVIATHAN_DOOR, BOSS_LEVIATHAN, DOOR_TYPE_ROOM, BOUNDARY_S },
+ { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE },
};
class instance_ulduar : public InstanceMapScript
@@ -32,46 +32,47 @@ class instance_ulduar : public InstanceMapScript
public:
instance_ulduar() : InstanceMapScript("instance_ulduar", 603) { }
- InstanceScript* GetInstanceScript(InstanceMap* pMap) const
+ InstanceScript* GetInstanceScript(InstanceMap* map) const
{
- return new instance_ulduar_InstanceMapScript(pMap);
+ return new instance_ulduar_InstanceMapScript(map);
}
struct instance_ulduar_InstanceMapScript : public InstanceScript
{
instance_ulduar_InstanceMapScript(InstanceMap* map) : InstanceScript(map) { }
- uint32 uiEncounter[MAX_ENCOUNTER];
+ uint32 Encounter[MAX_ENCOUNTER];
std::string m_strInstData;
- uint64 uiLeviathanGUID;
- uint64 uiIgnisGUID;
- uint64 uiRazorscaleGUID;
- uint64 uiRazorscaleController;
- uint64 uiRazorHarpoonGUIDs[4];
- uint64 uiExpCommanderGUID;
- uint64 uiXT002GUID;
- uint64 uiAssemblyGUIDs[3];
- uint64 uiKologarnGUID;
- uint64 uiLeftArmGUID;
- uint64 uiRightArmGUID;
- uint64 uiAuriayaGUID;
- uint64 uiMimironGUID;
- uint64 uiHodirGUID;
- uint64 uiThorimGUID;
- uint64 uiFreyaGUID;
- uint64 uiVezaxGUID;
- uint64 uiYoggSaronGUID;
- uint64 uiAlgalonGUID;
- uint64 uiLeviathanGateGUID;
- uint64 uiVezaxDoorGUID;
-
- uint64 uiKologarnChestGUID;
- uint64 uiKologarnBridgeGUID;
- uint64 uiKologarnDoorGUID;
- uint64 uiThorimChestGUID;
- uint64 uiHodirChestGUID;
- uint64 uiFreyaChestGUID;
+ uint64 LeviathanGUID;
+ uint64 IgnisGUID;
+ uint64 RazorscaleGUID;
+ uint64 RazorscaleController;
+ uint64 RazorHarpoonGUIDs[4];
+ uint64 ExpeditionCommanderGUID;
+ uint64 XT002GUID;
+ uint64 AssemblyGUIDs[3];
+ uint64 KologarnGUID;
+ uint64 LeftArmGUID;
+ uint64 RightArmGUID;
+ uint64 AuriayaGUID;
+ uint64 MimironGUID;
+ uint64 HodirGUID;
+ uint64 ThorimGUID;
+ uint64 FreyaGUID;
+ uint64 KeeperGUIDs[3];
+ uint64 VezaxGUID;
+ uint64 YoggSaronGUID;
+ uint64 AlgalonGUID;
+ uint64 LeviathanGateGUID;
+ uint64 VezaxDoorGUID;
+
+ uint64 KologarnChestGUID;
+ uint64 KologarnBridgeGUID;
+ uint64 KologarnDoorGUID;
+ uint64 ThorimChestGUID;
+ uint64 HodirChestGUID;
+ uint64 FreyaChestGUID;
uint32 TeamInInstance;
@@ -81,42 +82,43 @@ public:
{
SetBossNumber(MAX_ENCOUNTER);
LoadDoorData(doorData);
- uiIgnisGUID = 0;
- uiRazorscaleGUID = 0;
- uiRazorscaleController = 0;
- uiExpCommanderGUID = 0;
- uiXT002GUID = 0;
- uiKologarnGUID = 0;
- uiLeftArmGUID = 0;
- uiRightArmGUID = 0;
- uiAuriayaGUID = 0;
- uiMimironGUID = 0;
- uiHodirGUID = 0;
- uiThorimGUID = 0;
- uiFreyaGUID = 0;
- uiVezaxGUID = 0;
- uiYoggSaronGUID = 0;
- uiAlgalonGUID = 0;
- uiKologarnChestGUID = 0;
- uiKologarnBridgeGUID = 0;
- uiKologarnChestGUID = 0;
- uiThorimChestGUID = 0;
- uiHodirChestGUID = 0;
- uiFreyaChestGUID = 0;
- uiLeviathanGateGUID = 0;
- uiVezaxDoorGUID = 0;
- TeamInInstance = 0;
-
- memset(uiEncounter, 0, sizeof(uiEncounter));
- memset(uiAssemblyGUIDs, 0, sizeof(uiAssemblyGUIDs));
- memset(uiRazorHarpoonGUIDs, 0, sizeof(uiRazorHarpoonGUIDs));
+ IgnisGUID = 0;
+ RazorscaleGUID = 0;
+ RazorscaleController = 0;
+ ExpeditionCommanderGUID = 0;
+ XT002GUID = 0;
+ KologarnGUID = 0;
+ LeftArmGUID = 0;
+ RightArmGUID = 0;
+ AuriayaGUID = 0;
+ MimironGUID = 0;
+ HodirGUID = 0;
+ ThorimGUID = 0;
+ FreyaGUID = 0;
+ VezaxGUID = 0;
+ YoggSaronGUID = 0;
+ AlgalonGUID = 0;
+ KologarnChestGUID = 0;
+ KologarnBridgeGUID = 0;
+ KologarnChestGUID = 0;
+ ThorimChestGUID = 0;
+ HodirChestGUID = 0;
+ FreyaChestGUID = 0;
+ LeviathanGateGUID = 0;
+ VezaxDoorGUID = 0;
+ TeamInInstance = 0;
+
+ memset(Encounter, 0, sizeof(Encounter));
+ memset(AssemblyGUIDs, 0, sizeof(AssemblyGUIDs));
+ memset(RazorHarpoonGUIDs, 0, sizeof(RazorHarpoonGUIDs));
+ memset(KeeperGUIDs, 0, sizeof(KeeperGUIDs));
}
bool IsEncounterInProgress() const
{
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
{
- if (uiEncounter[i] == IN_PROGRESS)
+ if (Encounter[i] == IN_PROGRESS)
return true;
}
@@ -142,42 +144,59 @@ public:
switch (creature->GetEntry())
{
case NPC_LEVIATHAN:
- uiLeviathanGUID = creature->GetGUID();
+ LeviathanGUID = creature->GetGUID();
break;
case NPC_IGNIS:
- uiIgnisGUID = creature->GetGUID();
+ IgnisGUID = creature->GetGUID();
break;
case NPC_RAZORSCALE:
- uiRazorscaleGUID = creature->GetGUID();
+ RazorscaleGUID = creature->GetGUID();
break;
case NPC_RAZORSCALE_CONTROLLER:
- uiRazorscaleController = creature->GetGUID();
+ RazorscaleController = creature->GetGUID();
break;
case NPC_EXPEDITION_COMMANDER:
- uiExpCommanderGUID = creature->GetGUID();
- return;
+ ExpeditionCommanderGUID = creature->GetGUID();
+ break;
case NPC_XT002:
- uiXT002GUID = creature->GetGUID();
+ XT002GUID = creature->GetGUID();
break;
// Assembly of Iron
case NPC_STEELBREAKER:
- uiAssemblyGUIDs[0] = creature->GetGUID();
+ AssemblyGUIDs[0] = creature->GetGUID();
break;
case NPC_MOLGEIM:
- uiAssemblyGUIDs[1] = creature->GetGUID();
+ AssemblyGUIDs[1] = creature->GetGUID();
break;
case NPC_BRUNDIR:
- uiAssemblyGUIDs[2] = creature->GetGUID();
+ AssemblyGUIDs[2] = creature->GetGUID();
+ break;
+
+ // Freya's Keeper
+ case NPC_IRONBRANCH:
+ KeeperGUIDs[0] = creature->GetGUID();
+ if (GetBossState(BOSS_FREYA) == DONE)
+ creature->DespawnOrUnsummon();
+ break;
+ case NPC_BRIGHTLEAF:
+ KeeperGUIDs[1] = creature->GetGUID();
+ if (GetBossState(BOSS_FREYA) == DONE)
+ creature->DespawnOrUnsummon();
break;
+ case NPC_STONEBARK:
+ KeeperGUIDs[2] = creature->GetGUID();
+ if (GetBossState(BOSS_FREYA) == DONE)
+ creature->DespawnOrUnsummon();
+ break;
// Kologarn
case NPC_KOLOGARN:
- uiKologarnGUID = creature->GetGUID();
+ KologarnGUID = creature->GetGUID();
break;
case NPC_KOLOGARN_BRIDGE:
// The below hacks are courtesy of the grid/visibilitysystem
- if (GetBossState(TYPE_KOLOGARN) == DONE)
+ if (GetBossState(BOSS_KOLOGARN) == DONE)
{
creature->SetDeadByDefault(true);
creature->setDeathState(CORPSE);
@@ -193,29 +212,30 @@ public:
break;
case NPC_AURIAYA:
- uiAuriayaGUID = creature->GetGUID();
+ AuriayaGUID = creature->GetGUID();
break;
case NPC_MIMIRON:
- uiMimironGUID = creature->GetGUID();
+ MimironGUID = creature->GetGUID();
break;
case NPC_HODIR:
- uiHodirGUID = creature->GetGUID();
+ HodirGUID = creature->GetGUID();
break;
case NPC_THORIM:
- uiThorimGUID = creature->GetGUID();
+ ThorimGUID = creature->GetGUID();
break;
case NPC_FREYA:
- uiFreyaGUID = creature->GetGUID();
+ FreyaGUID = creature->GetGUID();
break;
case NPC_VEZAX:
- uiVezaxGUID = creature->GetGUID();
+ VezaxGUID = creature->GetGUID();
break;
case NPC_YOGGSARON:
- uiYoggSaronGUID = creature->GetGUID();
+ YoggSaronGUID = creature->GetGUID();
break;
case NPC_ALGALON:
- uiAlgalonGUID = creature->GetGUID();
+ AlgalonGUID = creature->GetGUID();
break;
+
// Hodir's Helper NPCs
case NPC_EIVI_NIGHTFEATHER:
if (TeamInInstance == HORDE)
@@ -253,70 +273,70 @@ public:
}
- void OnGameObjectCreate(GameObject* go)
+ void OnGameObjectCreate(GameObject* gameObject)
{
- switch (go->GetEntry())
+ switch (gameObject->GetEntry())
{
case GO_KOLOGARN_CHEST_HERO:
case GO_KOLOGARN_CHEST:
- uiKologarnChestGUID = go->GetGUID();
+ KologarnChestGUID = gameObject->GetGUID();
break;
case GO_KOLOGARN_BRIDGE:
- uiKologarnBridgeGUID = go->GetGUID();
- if (GetBossState(TYPE_KOLOGARN) == DONE)
- HandleGameObject(0, false, go);
+ KologarnBridgeGUID = gameObject->GetGUID();
+ if (GetBossState(BOSS_KOLOGARN) == DONE)
+ HandleGameObject(0, false, gameObject);
break;
case GO_KOLOGARN_DOOR:
- uiKologarnDoorGUID = go->GetGUID();
+ KologarnDoorGUID = gameObject->GetGUID();
break;
case GO_THORIM_CHEST_HERO:
case GO_THORIM_CHEST:
- uiThorimChestGUID = go->GetGUID();
+ ThorimChestGUID = gameObject->GetGUID();
break;
case GO_HODIR_CHEST_HERO:
case GO_HODIR_CHEST:
- uiHodirChestGUID = go->GetGUID();
+ HodirChestGUID = gameObject->GetGUID();
break;
case GO_FREYA_CHEST_HERO:
case GO_FREYA_CHEST:
- uiFreyaChestGUID = go->GetGUID();
+ FreyaChestGUID = gameObject->GetGUID();
break;
case GO_LEVIATHAN_DOOR:
- AddDoor(go, true);
+ AddDoor(gameObject, true);
break;
case GO_LEVIATHAN_GATE:
- uiLeviathanGateGUID = go->GetGUID();
- if (GetBossState(TYPE_LEVIATHAN) == DONE)
- go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
+ LeviathanGateGUID = gameObject->GetGUID();
+ if (GetBossState(BOSS_LEVIATHAN) == DONE)
+ gameObject->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
break;
case GO_VEZAX_DOOR:
- uiVezaxDoorGUID = go->GetGUID();
- HandleGameObject(0, false, go);
+ VezaxDoorGUID = gameObject->GetGUID();
+ HandleGameObject(0, false, gameObject);
break;
case GO_RAZOR_HARPOON_1:
- uiRazorHarpoonGUIDs[0] = go->GetGUID();
+ RazorHarpoonGUIDs[0] = gameObject->GetGUID();
break;
case GO_RAZOR_HARPOON_2:
- uiRazorHarpoonGUIDs[1] = go->GetGUID();
+ RazorHarpoonGUIDs[1] = gameObject->GetGUID();
break;
case GO_RAZOR_HARPOON_3:
- uiRazorHarpoonGUIDs[2] = go->GetGUID();
+ RazorHarpoonGUIDs[2] = gameObject->GetGUID();
break;
case GO_RAZOR_HARPOON_4:
- uiRazorHarpoonGUIDs[3] = go->GetGUID();
+ RazorHarpoonGUIDs[3] = gameObject->GetGUID();
break;
case GO_MOLE_MACHINE:
- if (GetBossState(TYPE_RAZORSCALE) == IN_PROGRESS)
- go->SetGoState(GO_STATE_ACTIVE);
+ if (GetBossState(BOSS_RAZORSCALE) == IN_PROGRESS)
+ gameObject->SetGoState(GO_STATE_ACTIVE);
}
}
- void OnGameObjectRemove(GameObject* go)
+ void OnGameObjectRemove(GameObject* gameObject)
{
- switch (go->GetEntry())
+ switch (gameObject->GetEntry())
{
case GO_LEVIATHAN_DOOR:
- AddDoor(go, false);
+ AddDoor(gameObject, false);
break;
default:
break;
@@ -326,7 +346,7 @@ public:
void ProcessEvent(GameObject* /*go*/, uint32 eventId)
{
// Flame Leviathan's Tower Event triggers
- Creature* FlameLeviathan = instance->GetCreature(uiLeviathanGUID);
+ Creature* FlameLeviathan = instance->GetCreature(LeviathanGUID);
if (FlameLeviathan && FlameLeviathan->isAlive()) //No leviathan, no event triggering ;)
switch (eventId)
@@ -357,63 +377,63 @@ public:
switch (type)
{
- case TYPE_LEVIATHAN:
- case TYPE_IGNIS:
- case TYPE_RAZORSCALE:
- case TYPE_XT002:
- case TYPE_ASSEMBLY:
- case TYPE_AURIAYA:
- case TYPE_MIMIRON:
- case TYPE_VEZAX:
+ case BOSS_LEVIATHAN:
+ case BOSS_IGNIS:
+ case BOSS_RAZORSCALE:
+ case BOSS_XT002:
+ case BOSS_ASSEMBLY_OF_IRON:
+ case BOSS_AURIAYA:
+ case BOSS_MIMIRON:
+ case BOSS_VEZAX:
if (state == DONE)
- HandleGameObject(uiVezaxDoorGUID, true);
+ HandleGameObject(VezaxDoorGUID, true);
break;
- case TYPE_YOGGSARON:
+ case BOSS_YOGGSARON:
break;
- case TYPE_KOLOGARN:
+ case BOSS_KOLOGARN:
if (state == DONE)
{
- if (GameObject* go = instance->GetGameObject(uiKologarnChestGUID))
- go->SetRespawnTime(go->GetRespawnDelay());
- HandleGameObject(uiKologarnBridgeGUID, false);
+ if (GameObject* gameObject = instance->GetGameObject(KologarnChestGUID))
+ gameObject->SetRespawnTime(gameObject->GetRespawnDelay());
+ HandleGameObject(KologarnBridgeGUID, false);
}
if (state == IN_PROGRESS)
- HandleGameObject(uiKologarnDoorGUID, false);
+ HandleGameObject(KologarnDoorGUID, false);
else
- HandleGameObject(uiKologarnDoorGUID, true);
+ HandleGameObject(KologarnDoorGUID, true);
break;
- case TYPE_HODIR:
+ case BOSS_HODIR:
if (state == DONE)
- if (GameObject* go = instance->GetGameObject(uiHodirChestGUID))
- go->SetRespawnTime(go->GetRespawnDelay());
+ if (GameObject* gameObject = instance->GetGameObject(HodirChestGUID))
+ gameObject->SetRespawnTime(gameObject->GetRespawnDelay());
break;
- case TYPE_THORIM:
+ case BOSS_THORIM:
if (state == DONE)
- if (GameObject* go = instance->GetGameObject(uiThorimChestGUID))
- go->SetRespawnTime(go->GetRespawnDelay());
+ if (GameObject* gameObject = instance->GetGameObject(ThorimChestGUID))
+ gameObject->SetRespawnTime(gameObject->GetRespawnDelay());
break;
- case TYPE_FREYA:
+ case BOSS_FREYA:
if (state == DONE)
- if (GameObject* go = instance->GetGameObject(uiFreyaChestGUID))
- go->SetRespawnTime(go->GetRespawnDelay());
+ if (GameObject* gameObject = instance->GetGameObject(FreyaChestGUID))
+ gameObject->SetRespawnTime(gameObject->GetRespawnDelay());
break;
- }
+ }
- return true;
+ return true;
}
void SetData(uint32 type, uint32 data)
{
- switch(type)
+ switch (type)
{
case TYPE_COLOSSUS:
- uiEncounter[TYPE_COLOSSUS] = data;
+ Encounter[TYPE_COLOSSUS] = data;
if (data == 2)
{
- if (Creature* pBoss = instance->GetCreature(uiLeviathanGUID))
- pBoss->AI()->DoAction(10);
- if (GameObject* pGate = instance->GetGameObject(uiLeviathanGateGUID))
- pGate->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
+ if (Creature* Leviathan = instance->GetCreature(LeviathanGUID))
+ Leviathan->AI()->DoAction(10);
+ if (GameObject* gameObject = instance->GetGameObject(LeviathanGateGUID))
+ gameObject->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
SaveToDB();
}
break;
@@ -427,45 +447,78 @@ public:
switch (type)
{
case DATA_LEFT_ARM:
- uiLeftArmGUID = data;
+ LeftArmGUID = data;
break;
case DATA_RIGHT_ARM:
- uiRightArmGUID = data;
+ RightArmGUID = data;
break;
}
}
uint64 GetData64(uint32 data)
{
- switch(data)
+ switch (data)
{
- case TYPE_LEVIATHAN: return uiLeviathanGUID;
- case TYPE_IGNIS: return uiIgnisGUID;
- case TYPE_RAZORSCALE: return uiRazorscaleGUID;
- case DATA_RAZORSCALE_CONTROL: return uiRazorscaleController;
- case TYPE_XT002: return uiXT002GUID;
- case TYPE_KOLOGARN: return uiKologarnGUID;
- case DATA_LEFT_ARM: return uiLeftArmGUID;
- case DATA_RIGHT_ARM: return uiRightArmGUID;
- case TYPE_AURIAYA: return uiAuriayaGUID;
- case TYPE_MIMIRON: return uiMimironGUID;
- case TYPE_HODIR: return uiHodirGUID;
- case TYPE_THORIM: return uiThorimGUID;
- case TYPE_FREYA: return uiFreyaGUID;
- case TYPE_VEZAX: return uiVezaxGUID;
- case TYPE_YOGGSARON: return uiYoggSaronGUID;
- case TYPE_ALGALON: return uiAlgalonGUID;
-
- // razorscale expedition commander
- case DATA_EXP_COMMANDER: return uiExpCommanderGUID;
- case GO_RAZOR_HARPOON_1: return uiRazorHarpoonGUIDs[0];
- case GO_RAZOR_HARPOON_2: return uiRazorHarpoonGUIDs[1];
- case GO_RAZOR_HARPOON_3: return uiRazorHarpoonGUIDs[2];
- case GO_RAZOR_HARPOON_4: return uiRazorHarpoonGUIDs[3];
+ case BOSS_LEVIATHAN:
+ return LeviathanGUID;
+ case BOSS_IGNIS:
+ return IgnisGUID;
+ case BOSS_RAZORSCALE:
+ return RazorscaleGUID;
+ case DATA_RAZORSCALE_CONTROL:
+ return RazorscaleController;
+ case BOSS_XT002:
+ return XT002GUID;
+ case BOSS_KOLOGARN:
+ return KologarnGUID;
+ case DATA_LEFT_ARM:
+ return LeftArmGUID;
+ case DATA_RIGHT_ARM:
+ return RightArmGUID;
+ case BOSS_AURIAYA:
+ return AuriayaGUID;
+ case BOSS_MIMIRON:
+ return MimironGUID;
+ case BOSS_HODIR:
+ return HodirGUID;
+ case BOSS_THORIM:
+ return ThorimGUID;
+ case BOSS_FREYA:
+ return FreyaGUID;
+ case BOSS_VEZAX:
+ return VezaxGUID;
+ case BOSS_YOGGSARON:
+ return YoggSaronGUID;
+ case BOSS_ALGALON:
+ return AlgalonGUID;
+
+ // Razorscale expedition commander
+ case DATA_EXPEDITION_COMMANDER:
+ return ExpeditionCommanderGUID;
+ case GO_RAZOR_HARPOON_1:
+ return RazorHarpoonGUIDs[0];
+ case GO_RAZOR_HARPOON_2:
+ return RazorHarpoonGUIDs[1];
+ case GO_RAZOR_HARPOON_3:
+ return RazorHarpoonGUIDs[2];
+ case GO_RAZOR_HARPOON_4:
+ return RazorHarpoonGUIDs[3];
+
// Assembly of Iron
- case DATA_STEELBREAKER: return uiAssemblyGUIDs[0];
- case DATA_MOLGEIM: return uiAssemblyGUIDs[1];
- case DATA_BRUNDIR: return uiAssemblyGUIDs[2];
+ case BOSS_STEELBREAKER:
+ return AssemblyGUIDs[0];
+ case BOSS_MOLGEIM:
+ return AssemblyGUIDs[1];
+ case BOSS_BRUNDIR:
+ return AssemblyGUIDs[2];
+
+ // Freya's Keepers
+ case BOSS_BRIGHTLEAF:
+ return KeeperGUIDs[0];
+ case BOSS_IRONBRANCH:
+ return KeeperGUIDs[1];
+ case BOSS_STONEBARK:
+ return KeeperGUIDs[2];
}
return 0;
@@ -473,10 +526,10 @@ public:
uint32 GetData(uint32 type)
{
- switch(type)
+ switch (type)
{
case TYPE_COLOSSUS:
- return uiEncounter[type];
+ return Encounter[type];
}
return 0;
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/ulduar.h b/src/server/scripts/Northrend/Ulduar/ulduar/ulduar.h
index e83d388c4a9..0ee05274aa3 100644
--- a/src/server/scripts/Northrend/Ulduar/ulduar/ulduar.h
+++ b/src/server/scripts/Northrend/Ulduar/ulduar/ulduar.h
@@ -18,118 +18,125 @@
#ifndef DEF_ULDUAR_H
#define DEF_ULDUAR_H
-enum UlduarTypes
+enum UlduarBosses
{
- MAX_ENCOUNTER = 15,
+ MAX_ENCOUNTER = 20,
- TYPE_LEVIATHAN = 0,
- TYPE_IGNIS = 1,
- TYPE_RAZORSCALE = 2,
- TYPE_XT002 = 3,
- TYPE_ASSEMBLY = 4,
- TYPE_KOLOGARN = 5,
- TYPE_AURIAYA = 6,
- TYPE_MIMIRON = 7,
- TYPE_HODIR = 8,
- TYPE_THORIM = 9,
- TYPE_FREYA = 10,
- TYPE_VEZAX = 11,
- TYPE_YOGGSARON = 12,
- TYPE_ALGALON = 13,
- TYPE_COLOSSUS = 14,
+ 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,
- // Assembly of Iorn
- DATA_STEELBREAKER,
- DATA_MOLGEIM,
- DATA_BRUNDIR,
-
- DATA_EXP_COMMANDER,
+ // Razorscale
+ DATA_EXPEDITION_COMMANDER,
DATA_RAZORSCALE_CONTROL,
- // Kologarn:
+ // Kologarn
DATA_LEFT_ARM,
DATA_RIGHT_ARM,
};
enum UlduarNPCs
{
- 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_STEELBREAKER = 32867,
- NPC_MOLGEIM = 32927,
- NPC_BRUNDIR = 32857,
- NPC_KOLOGARN = 32930,
- NPC_KOLOGARN_BRIDGE = 34297,
- 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,
- NPC_LEVIATHAN_MKII = 33432,
- NPC_VX_001 = 33651,
- NPC_AERIAL_COMMAND_UNIT = 33670,
+ 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_STEELBREAKER = 32867,
+ NPC_MOLGEIM = 32927,
+ NPC_BRUNDIR = 32857,
+ NPC_KOLOGARN = 32930,
+ NPC_KOLOGARN_BRIDGE = 34297,
+ 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,
+ 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,
+ 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,
};
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_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_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_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,
};
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
+ 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 UlduarAchievementCriteria
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/ulduar_teleporter.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/ulduar_teleporter.cpp
index aa79edbe2fb..21a4bd35937 100644
--- a/src/server/scripts/Northrend/Ulduar/ulduar/ulduar_teleporter.cpp
+++ b/src/server/scripts/Northrend/Ulduar/ulduar/ulduar_teleporter.cpp
@@ -33,85 +33,88 @@ The teleporter appears to be active and stable.
- Conservatory of Life
*/
-#define BASE_CAMP 200
-#define GROUNDS 201
-#define FORGE 202
-#define SCRAPYARD 203
-#define ANTECHAMBER 204
-#define WALKWAY 205
-#define CONSERVATORY 206
+enum UlduarTeleporter
+{
+ BASE_CAMP = 200,
+ GROUNDS = 201,
+ FORGE = 202,
+ SCRAPYARD = 203,
+ ANTECHAMBER = 204,
+ WALKWAY = 205,
+ CONSERVATORY = 206,
+};
class ulduar_teleporter : public GameObjectScript
{
-public:
- ulduar_teleporter() : GameObjectScript("ulduar_teleporter") { }
-
- bool OnGossipSelect(Player *pPlayer, GameObject * /*pGO*/, uint32 sender, uint32 action)
- {
- pPlayer->PlayerTalkClass->ClearMenus();
- if (sender != GOSSIP_SENDER_MAIN)
- return false;
- if (!pPlayer->getAttackers().empty())
- return false;
+ public:
+ ulduar_teleporter() : GameObjectScript("ulduar_teleporter") { }
- switch(action)
+ bool OnGossipSelect(Player* player, GameObject* /*gameObject*/, uint32 sender, uint32 action)
{
- case BASE_CAMP:
- pPlayer->TeleportTo(603, -706.122f, -92.6024f, 429.876f, 0.0f);
- pPlayer->CLOSE_GOSSIP_MENU();
- break;
- case GROUNDS:
- pPlayer->TeleportTo(603, 131.248f, -35.3802f, 409.804f, 0.0f);
- pPlayer->CLOSE_GOSSIP_MENU();
- break;
- case FORGE:
- pPlayer->TeleportTo(603, 553.233f, -12.3247f, 409.679f, 0.0f);
- pPlayer->CLOSE_GOSSIP_MENU();
- break;
- case SCRAPYARD:
- pPlayer->TeleportTo(603, 926.292f, -11.4635f, 418.595f, 0.0f);
- pPlayer->CLOSE_GOSSIP_MENU();
- break;
- case ANTECHAMBER:
- pPlayer->TeleportTo(603, 1498.09f, -24.246f, 420.967f, 0.0f);
- pPlayer->CLOSE_GOSSIP_MENU();
- break;
- case WALKWAY:
- pPlayer->TeleportTo(603, 1859.45f, -24.1f, 448.9f, 0.0f);
- pPlayer->CLOSE_GOSSIP_MENU();
- break;
- case CONSERVATORY:
- pPlayer->TeleportTo(603, 2086.27f, -24.3134f, 421.239f, 0.0f);
- pPlayer->CLOSE_GOSSIP_MENU();
- break;
- }
+ player->PlayerTalkClass->ClearMenus();
+ if (sender != GOSSIP_SENDER_MAIN)
+ return false;
+ if (!player->getAttackers().empty())
+ return false;
- return true;
- }
+ switch (action)
+ {
+ case BASE_CAMP:
+ player->TeleportTo(603, -706.122f, -92.6024f, 429.876f, 0.0f);
+ player->CLOSE_GOSSIP_MENU();
+ break;
+ case GROUNDS:
+ player->TeleportTo(603, 131.248f, -35.3802f, 409.804f, 0.0f);
+ player->CLOSE_GOSSIP_MENU();
+ break;
+ case FORGE:
+ player->TeleportTo(603, 553.233f, -12.3247f, 409.679f, 0.0f);
+ player->CLOSE_GOSSIP_MENU();
+ break;
+ case SCRAPYARD:
+ player->TeleportTo(603, 926.292f, -11.4635f, 418.595f, 0.0f);
+ player->CLOSE_GOSSIP_MENU();
+ break;
+ case ANTECHAMBER:
+ player->TeleportTo(603, 1498.09f, -24.246f, 420.967f, 0.0f);
+ player->CLOSE_GOSSIP_MENU();
+ break;
+ case WALKWAY:
+ player->TeleportTo(603, 1859.45f, -24.1f, 448.9f, 0.0f);
+ player->CLOSE_GOSSIP_MENU();
+ break;
+ case CONSERVATORY:
+ player->TeleportTo(603, 2086.27f, -24.3134f, 421.239f, 0.0f);
+ player->CLOSE_GOSSIP_MENU();
+ break;
+ }
+
+ return true;
+ }
- bool OnGossipHello(Player *pPlayer, GameObject *pGO)
- {
- pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Expedition Base Camp", GOSSIP_SENDER_MAIN, BASE_CAMP);
- if (InstanceScript* pInstance = pGO->GetInstanceScript())
+ bool OnGossipHello(Player* player, GameObject* gameObject)
{
- if (pInstance->GetData(TYPE_COLOSSUS) == 2) //count of 2 collossus death
- pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Formation Grounds", GOSSIP_SENDER_MAIN, GROUNDS);
- if (pInstance->GetBossState(TYPE_LEVIATHAN) == DONE)
- pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Colossal Forge", GOSSIP_SENDER_MAIN, FORGE);
- if (pInstance->GetBossState(TYPE_XT002) == DONE)
+ player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Expedition Base Camp", GOSSIP_SENDER_MAIN, BASE_CAMP);
+ if (InstanceScript* instance = gameObject->GetInstanceScript())
{
- pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Scrapyard", GOSSIP_SENDER_MAIN, SCRAPYARD);
- pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Antechamber of Ulduar", GOSSIP_SENDER_MAIN, ANTECHAMBER);
+ if (instance->GetData(TYPE_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);
+ if (instance->GetBossState(BOSS_XT002) == DONE)
+ {
+ player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Scrapyard", GOSSIP_SENDER_MAIN, SCRAPYARD);
+ player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Antechamber of Ulduar", GOSSIP_SENDER_MAIN, ANTECHAMBER);
+ }
+ if (instance->GetBossState(BOSS_KOLOGARN) == DONE)
+ player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Shattered Walkway", GOSSIP_SENDER_MAIN, WALKWAY);
+ if (instance->GetBossState(BOSS_AURIAYA) == DONE)
+ player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Conservatory of Life", GOSSIP_SENDER_MAIN, CONSERVATORY);
}
- if (pInstance->GetBossState(TYPE_KOLOGARN) == DONE)
- pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Shattered Walkway", GOSSIP_SENDER_MAIN, WALKWAY);
- if (pInstance->GetBossState(TYPE_AURIAYA) == DONE)
- pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Conservatory of Life", GOSSIP_SENDER_MAIN, CONSERVATORY);
+
+ player->SEND_GOSSIP_MENU(gameObject->GetGOInfo()->GetGossipMenuId(), gameObject->GetGUID());
+ return true;
}
- pPlayer->SEND_GOSSIP_MENU(pGO->GetGOInfo()->GetGossipMenuId(), pGO->GetGUID());
- return true;
- }
-
};
void AddSC_ulduar_teleporter()