diff options
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() |
