diff --git a/sql/updates/world/custom/custom_2018_07_20_00_world.sql b/sql/updates/world/custom/custom_2018_07_20_00_world.sql new file mode 100644 index 00000000000..61e3b55fdb2 --- /dev/null +++ b/sql/updates/world/custom/custom_2018_07_20_00_world.sql @@ -0,0 +1,255 @@ +-- Template Updates +-- Cho'Gall +UPDATE `creature_template` SET `difficulty_entry_1`= 50131, `difficulty_entry_2`= 50132, `difficulty_entry_3`= 50133, `ScriptName`= 'boss_chogall' WHERE `entry`= 43324; +UPDATE `creature_template` SET `unit_class`= 2, `minlevel`= 88, `maxlevel`= 88, `exp`= 3, `faction`= 16, `movementId`= 144, `DamageModifier`= 35, `BaseVariance`= 0.5, `speed_run`= 1.42857, `BaseAttackTime`= 1500, `unit_flags`= 64, `unit_flags2`= 134219776, `mechanic_immune_mask`= 617299839, `VehicleId`= 961, `flags_extra`= 1 | 536870912 WHERE `entry` IN (50131, 50132, 50133, 43324); +-- Fire Portal and Shadow Portal +UPDATE `creature_template` SET `unit_flags`= 33554432, `unit_flags2`= 2099200, `InhabitType`= 12, `flags_extra`= 128, `ScriptName`= 'npc_chogall_portal' WHERE `entry` IN (43393, 43603); +-- Fire Elemental +UPDATE `creature_template` SET `difficulty_entry_1`= 50194, `difficulty_entry_2`= 50195, `difficulty_entry_3`= 50196, `ScriptName`= 'npc_chogall_elemental' WHERE `entry`= 43406; +-- Shadow Lord +UPDATE `creature_template` SET `difficulty_entry_1`= 50197, `difficulty_entry_2`= 50198, `difficulty_entry_3`= 50199, `ScriptName`= 'npc_chogall_elemental' WHERE `entry`= 43592; +-- Fire Elemental and Shadow Lord +UPDATE `creature_template` SET `minlevel`= 87, `maxlevel`= 87, `exp`= 3, `faction`= 14, `mechanic_immune_mask`= 617299839, `flags_extra`= 536870912 | 1073741824 WHERE `entry` IN (50194, 50195, 50196, 50197,50198, 50199, 43406, 43592); +-- Fire Elemental and Shadow Lord(Heroic) +UPDATE `creature_template` SET `unit_flags`= 2097152 WHERE `entry` IN (50195, 50196, 50198, 50199); +-- Fire Elemental and Shadow Lord (Normal) +UPDATE `creature_template` SET `unit_flags`= 2181038080 WHERE `entry` IN (43406, 43592, 50194, 50197); +-- Blaze +UPDATE `creature_template` SET `unit_flags`= 33554432, `unit_flags2`= 2099200,`flags_extra`= 128 WHERE `entry`= 43585; +-- Corrupting Adherent +UPDATE `creature_template` SET `difficulty_entry_1`= 50184, `difficulty_entry_2`= 50185, `difficulty_entry_3`= 50186, `ScriptName`= 'npc_chogall_corrupting_adherent' WHERE `entry`= 43622; +UPDATE `creature_template` SET `minlevel`= 87, `maxlevel`= 87, `exp`= 3, `faction`= 16, `DamageModifier`= 60, `BaseVariance`= 0.5, `movementId`= 156, `mechanic_immune_mask`= 80297855, `flags_extra`= 536870912 WHERE `entry` IN (50184, 50185, 50186, 43622); +-- Blood of the Old God +UPDATE `creature_template` SET `difficulty_entry_1`= 50168, `difficulty_entry_2`= 50169, `difficulty_entry_3`= 50170, `ScriptName`= 'npc_chogall_blood_of_the_old_god' WHERE `entry`= 43707; +UPDATE `creature_template` SET `minlevel`= 87, `maxlevel`= 87, `exp`= 3, `faction`= 16, `DamageModifier`= 30, `BaseVariance`= 0.5, `movementId`= 106, `mechanic_immune_mask`= 65536 | 131072 | 512 | 16 | 1 | 2 | 32, `flags_extra`= 536870912 | 256 WHERE `entry` IN (50168, 50169, 50170, 43707); +-- Corruption +UPDATE `creature_template` SET `InhabitType`= 12, `unit_flags`= 33554432, `flags_extra`= 128 WHERE `entry`= 43999; +-- Malformation +UPDATE `creature_template` SET `unit_flags`= 33554432, `unit_flags2`= 2164736, `ScriptName`= 'npc_chogall_malformation' WHERE `entry`= 43888; +-- Darkened Creation (Dummy) +UPDATE `creature_template` SET `difficulty_entry_1`= 50187, `difficulty_entry_2`= 50188, `difficulty_entry_3`= 50189, `ScriptName`= 'npc_chogall_darkened_creation' WHERE `entry`= 44045; +UPDATE `creature_template` SET `minlevel`= 87, `maxlevel`= 87, `exp`= 3, `faction`= 14, `movementId`= 94, `unit_flags`= 33554432, `unit_flags2`= 2099200, `InhabitType`= 12, `flags_extra`= 128 | 1073741824, `mechanic_immune_mask`= 80297855 WHERE `entry` IN (44045, 50187, 50188, 50189); +-- Darkened Creation (Transform) +UPDATE `creature_template` SET `difficulty_entry_1`= 50190, `difficulty_entry_2`= 50191, `difficulty_entry_3`= 50192 WHERE `entry`= 44023; +UPDATE `creature_template` SET `minlevel`= 87, `maxlevel`= 87, `exp`= 3, `faction`= 14, `movementId`= 118, `InhabitType`= 12, `flags_extra`= 1073741824, `mechanic_immune_mask`= 80297855 WHERE `entry` IN (44023, 50190, 50191, 50192); +-- Spiked Tentacle (Trigger) +UPDATE `creature_template` SET `unit_flags`= 33554432, `unit_flags2`= 2099200, `InhabitType`= 12, `flags_extra`= 128 WHERE `entry`= 50265; +-- Spiked Tentacle +UPDATE `creature_template` SET `InhabitType`= 12, `DamageModifier`= 30, `BaseVariance`= 0.5, `flags_extra`= 1073741824, `mechanic_immune_mask`= 80297855, `ScriptName`= 'npc_chogall_spiked_tentacle' WHERE `entry`= 50264; + +-- Template Addons +DELETE FROM `creature_template_addon` WHERE `entry` IN (43393, 43603, 43585, 43707, 43888, 50265, 50168, 50169, 50170); +INSERT INTO `creature_template_addon` (`entry`, `auras`) VALUES +(43393, '81172'), +(43603, '81559'), +(43585, '81536'), +(43707, '81777'), +(50168, '81777'), +(50169, '81777'), +(50170, '81777'), +(43888, '82167'), +(50265, '93318'); + +-- Spells +DELETE FROM `spell_script_names` WHERE `ScriptName` IN +('spell_chogall_absorb_elemental_reverse_cast', +'spell_chogall_absorb_elemental', +'spell_chogall_absorb_elemental_heroic', +'spell_chogall_elemental_power', +'spell_chogall_absorb_elemental_buff', +'spell_chogall_flaming_destruction_heroic', +'spell_chogall_empowered_shadows_heroic', +'spell_chogall_summon_corrupted_adherent', +'spell_chogall_fester_blood', +'spell_chogall_fester_blood_summon', +'spell_chogall_conversion', +'spell_chogall_worshipping', +'spell_chogall_consume_blood_of_the_old_god', +'spell_chogall_consume_blood_of_the_old_god_triggered', +'spell_chogall_corruption_significant', +'spell_chogall_corruption_normal', +'spell_chogall_corruption_normal_alternative', +'spell_chogall_corruption_of_the_old_god', +'spell_chogall_corruption_sickness', +'spell_chogall_corruption_malformation', +'spell_chogall_shadow_bolt', +'spell_chogall_debilitating_beam'); + +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(81233, 'spell_chogall_absorb_elemental_reverse_cast'), +(81565, 'spell_chogall_absorb_elemental_reverse_cast'), +(81196, 'spell_chogall_absorb_elemental'), +(93241, 'spell_chogall_absorb_elemental'), +(93242, 'spell_chogall_absorb_elemental_heroic'), +(93243, 'spell_chogall_absorb_elemental_heroic'), +(81566, 'spell_chogall_absorb_elemental'), +(93238, 'spell_chogall_absorb_elemental'), +(93239, 'spell_chogall_absorb_elemental_heroic'), +(93240, 'spell_chogall_absorb_elemental_heroic'), +(93245, 'spell_chogall_elemental_power'), +(93301, 'spell_chogall_elemental_power'), +(93219, 'spell_chogall_absorb_elemental_buff'), +(93220, 'spell_chogall_absorb_elemental_buff'), +(93265, 'spell_chogall_absorb_elemental_buff'), +(93266, 'spell_chogall_absorb_elemental_buff'), +(93265, 'spell_chogall_flaming_destruction_heroic'), +(93266, 'spell_chogall_flaming_destruction_heroic'), +(93219, 'spell_chogall_empowered_shadows_heroic'), +(93220, 'spell_chogall_empowered_shadows_heroic'), +(81628, 'spell_chogall_summon_corrupted_adherent'), +(82299, 'spell_chogall_fester_blood'), +(82337, 'spell_chogall_fester_blood_summon'), +(93111, 'spell_chogall_fester_blood_summon'), +(93112, 'spell_chogall_fester_blood_summon'), +(93113, 'spell_chogall_fester_blood_summon'), +(91303, 'spell_chogall_conversion'), +(93203, 'spell_chogall_conversion'), +(93204, 'spell_chogall_conversion'), +(93205, 'spell_chogall_conversion'), +(91317, 'spell_chogall_worshipping'), +(93365, 'spell_chogall_worshipping'), +(93366, 'spell_chogall_worshipping'), +(93367, 'spell_chogall_worshipping'), +(82630, 'spell_chogall_consume_blood_of_the_old_god'), +(82659, 'spell_chogall_consume_blood_of_the_old_god_triggered'), +(81713, 'spell_chogall_corruption_significant'), +(93175, 'spell_chogall_corruption_significant'), +(93176, 'spell_chogall_corruption_significant'), +(93177, 'spell_chogall_corruption_significant'), +(82919, 'spell_chogall_corruption_normal'), +(93108, 'spell_chogall_corruption_normal'), +(93109, 'spell_chogall_corruption_normal'), +(93110, 'spell_chogall_corruption_normal'), +(81761, 'spell_chogall_corruption_normal'), +(93172, 'spell_chogall_corruption_normal'), +(93173, 'spell_chogall_corruption_normal'), +(93174, 'spell_chogall_corruption_normal'), +(81689, 'spell_chogall_corruption_normal'), +(93184, 'spell_chogall_corruption_normal'), +(93185, 'spell_chogall_corruption_normal'), +(93186, 'spell_chogall_corruption_normal'), +(81831, 'spell_chogall_corruption_normal'), +(93200, 'spell_chogall_corruption_normal'), +(93201, 'spell_chogall_corruption_normal'), +(93202, 'spell_chogall_corruption_normal'), +(81775, 'spell_chogall_corruption_normal_alternative'), +(93209, 'spell_chogall_corruption_normal_alternative'), +(93210, 'spell_chogall_corruption_normal_alternative'), +(93211, 'spell_chogall_corruption_normal_alternative'), +(81943, 'spell_chogall_corruption_normal_alternative'), +(93196, 'spell_chogall_corruption_normal_alternative'), +(93197, 'spell_chogall_corruption_normal_alternative'), +(93198, 'spell_chogall_corruption_normal_alternative'), +(82363, 'spell_chogall_corruption_of_the_old_god'), +(93169, 'spell_chogall_corruption_of_the_old_god'), +(93170, 'spell_chogall_corruption_of_the_old_god'), +(93171, 'spell_chogall_corruption_of_the_old_god'), +(82235, 'spell_chogall_corruption_sickness'), +(82125, 'spell_chogall_corruption_malformation'), +(82151, 'spell_chogall_shadow_bolt'), +(93193, 'spell_chogall_shadow_bolt'), +(93194, 'spell_chogall_shadow_bolt'), +(93195, 'spell_chogall_shadow_bolt'), +(93133, 'spell_chogall_debilitating_beam'), +(93134, 'spell_chogall_debilitating_beam'); + +-- Conditions +DELETE FROM `conditions` WHERE `SourceEntry` IN (81233, 81565, 81196, 93241, 93242, 93243, 81566, 93238, 93239, 93240, 81194, 93264, 93265, 93266, 81572, 93218, 93219, 93220, 82299, 91331, 93206, 93207, 93208, 82356, 82630, 82659, 82433) AND `SourceTypeOrReferenceId`= 13; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ScriptName`, `Comment`) VALUES +(13, 1, 81233, 0, 0, 31, 0, 3, 43324, 0, 0, 0, '', 'Absorb Fire Reverse Cast - Target Cho''Gall'), +(13, 1, 81565, 0, 0, 31, 0, 3, 43324, 0, 0, 0, '', 'Absorb Shadow Reverse Cast - Target Cho''Gall'), +(13, 7, 81194, 0, 0, 31, 0, 3, 43324, 0, 0, 0, '', 'Flaming Destruction - Target Cho''Gall'), +(13, 7, 93264, 0, 0, 31, 0, 3, 43324, 0, 0, 0, '', 'Flaming Destruction - Target Cho''Gall'), +(13, 7, 93265, 0, 0, 31, 0, 3, 43324, 0, 0, 0, '', 'Flaming Destruction - Target Cho''Gall'), +(13, 7, 93266, 0, 0, 31, 0, 3, 43324, 0, 0, 0, '', 'Flaming Destruction - Target Cho''Gall'), +(13, 1, 81572, 0, 0, 31, 0, 3, 43324, 0, 0, 0, '', 'Empowered Shadows - Target Cho''Gall'), +(13, 1, 93218, 0, 0, 31, 0, 3, 43324, 0, 0, 0, '', 'Empowered Shadows - Target Cho''Gall'), +(13, 1, 93219, 0, 0, 31, 0, 3, 43324, 0, 0, 0, '', 'Empowered Shadows - Target Cho''Gall'), +(13, 1, 93220, 0, 0, 31, 0, 3, 43324, 0, 0, 0, '', 'Empowered Shadows - Target Cho''Gall'), +(13, 5, 81196, 0, 0, 31, 0, 3, 43406, 0, 0, 0, '', 'Absorb Fire - Target Fire Elemental'), +(13, 5, 93241, 0, 0, 31, 0, 3, 43406, 0, 0, 0, '', 'Absorb Fire - Target Fire Elemental'), +(13, 5, 93242, 0, 0, 31, 0, 3, 43406, 0, 0, 0, '', 'Absorb Fire - Target Fire Elemental'), +(13, 5, 93243, 0, 0, 31, 0, 3, 43406, 0, 0, 0, '', 'Absorb Fire - Target Fire Elemental'), +(13, 5, 81566, 0, 0, 31, 0, 3, 43592, 0, 0, 0, '', 'Absorb Shadow - Target Shadow Lord'), +(13, 5, 93238, 0, 0, 31, 0, 3, 43592, 0, 0, 0, '', 'Absorb Shadow - Target Shadow Lord'), +(13, 5, 93239, 0, 0, 31, 0, 3, 43592, 0, 0, 0, '', 'Absorb Shadow - Target Shadow Lord'), +(13, 5, 93240, 0, 0, 31, 0, 3, 43592, 0, 0, 0, '', 'Absorb Shadow - Target Shadow Lord'), +(13, 3, 82299, 0, 0, 31, 0, 3, 43622, 0, 0, 0, '', 'Fester Blood - Target Corrupting Adherent'), +(13, 3, 91331, 0, 0, 31, 0, 3, 43324, 0, 0, 0, '', 'Twisted Devotion - Target Cho''Gall'), +(13, 3, 93206, 0, 0, 31, 0, 3, 43324, 0, 0, 0, '', 'Twisted Devotion - Target Cho''Gall'), +(13, 3, 93207, 0, 0, 31, 0, 3, 43324, 0, 0, 0, '', 'Twisted Devotion - Target Cho''Gall'), +(13, 3, 93208, 0, 0, 31, 0, 3, 43324, 0, 0, 0, '', 'Twisted Devotion - Target Cho''Gall'), +(13, 1, 82356, 0, 0, 31, 0, 3, 43999, 0, 0, 0, '', 'Corruption of the Old God Visual - Target Corruption'), +(13, 7, 82630, 0, 0, 31, 0, 3, 43622, 0, 0, 0, '', 'Consume Blood of the Old God - Target Corrupting Adherent'), +(13, 1, 82659, 0, 0, 31, 0, 3, 43324, 0, 0, 0, '', 'Consume Blood of the Old God - Target Cho''Gall'), +(13, 1, 82433, 0, 0, 31, 0, 3, 43324, 0, 0, 0, '', 'Darkened Creations - Target Cho''Gall'); + +-- Texts +DELETE FROM `creature_text` WHERE `CreatureID`= 43324; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(43324, 0, 0, 'Valiona, Theralion, put them in their place.', 14, 0, 100, 0, 0, 22063, 47518, 3, 'Cho''gall to Player'), +(43324, 1, 0, '(Come closer, closer. Let us see your faces. All will be humbled before his power.)', 14, 0, 100, 0, 0, 22064, 47538, 3, 'Cho''gall to Player'), +(43324, 2, 0, 'Welcome, mortals. (Frail little children). Few have laid eyes on this inner sanctum. (They reach out to touch the fire!)', 14, 0, 100, 0, 0, 22065, 47585, 3, 'Cho''gall to Player'), +(43324, 3, 0, 'It is here the chosen realize their destiny. (One with eternity). And it is here that you will realize yours.(End of the flesh. End of the flesh)!', 14, 0, 100, 0, 0, 22066, 47587, 3, 'Cho''gall to Player'), +(43324, 4, 0, 'Brothers of Twilight! The Hammer calls to you! (Fire water earth air). Leave your mortal shell behind. (Fire water earth air). Embrace your new forms for here and everafter! (Burn and drown and crush and suffocate). And use your gifts to destroy the unbelievers. (Burn and drown and crush and suffocate)!!', 14, 0, 100, 0, 0, 22067, 47588, 3, 'Cho''gall to Player'), +(43324, 5, 0, 'Foolish mortals-(Usurper''s children!) nothing you have done- (Spawn of a lesser god!) I am TRYING to speak here. (Words, words, words. The Master wants murder.) ALL falls to chaos. ALL will be destroyed. (Chaos, chaos!) Your work here today changes nothing. (Chaos, chaos, all things end) No mortal may see what you have and live. Your end has come.', 14, 0, 100, 0, 0, 22068, 47591, 3, 'Cho''gall to Player'), +(43324, 6, 0, 'Enough! (To His will all flesh succumbs. From His kingdom, chaos comes.) Yes - what he said.', 14, 0, 100, 0, 0, 22081, 47859, 3, 'Cho''gall to Player'), +(43324, 7, 0, 'Behold the might of the hammer!', 14, 0, 100, 0, 0, 22079, 47857, 3, 'Cho''gall to Fire Elemental'), +(43324, 7, 1, 'Give me your strength!', 14, 0, 100, 0, 0, 22078, 47856, 3, 'Cho''gall to Fire Elemental'), +(43324, 8, 0, '(Stop. Hammertime!)', 14, 0, 100, 0, 0, 22080, 47858, 3, 'Cho''gall to Shadow Lord'), +(43324, 9, 0, '|TInterface\\Icons\\ability_rogue_shadowdance.blp:20|t%s begins to summon |cFFFF0000Corrupted Adherents|r to aid him!\n', 41, 0, 100, 0, 0, 0, 44484, 3, 'Cho''gall'), +(43324, 10, 0, '(*Snort*)', 14, 0, 100, 0, 0, 22083, 47861, 3, 'Cho''gall'), +(43324, 10, 1, '(Infinite suffering!)', 14, 0, 100, 0, 0, 22082, 47860, 3, 'Cho''gall'), +(43324, 10, 2, 'More. More!', 14, 0, 100, 0, 0, 22085, 47863, 3, 'Cho''gall'), +(43324, 10, 3, '(Come, brothers! Feast on hope!)', 14, 0, 100, 0, 0, 22086, 47864, 3, 'Cho''gall'), +(43324, 11, 0, 'Cho''gall beckons and casts |cFF006EFD|Hspell:91303|h[Conversion]|h|r!', 41, 0, 100, 0, 0, 0, 49084, 3, 'Cho''gall to Cho''gall'), +(43324, 12, 0, '|TInterface\\Icons\\spell_shadow_shadetruesight.blp:20|t%s begins to cast |cFFFF0000|Hspell:82299|h[Fester Blood]|h|r!', 41, 0, 100, 0, 0, 0, 45715, 3, 'Cho''gall'), +(43324, 13, 0, 'Brother, it cannot be... (Destiny has come!) My strength... (Too proud! He speaks in blood! Listen!) My mind... (It is for His glory we serve!) What... is happening... (Gone is the dawn. Come shades of Twilight. Come madness, come havoc, come Infinite Night!)', 14, 0, 100, 0, 0, 22093, 47868, 3, 'Cho''gall'), +(43324, 14, 0, '|TInterface\\Icons\\spell_shadow_shadesofdarkness.blp:20|t%s begins to summon |cFFFF0000Darkened Creations|r to aid him!\n', 41, 0, 100, 0, 0, 0, 47897, 3, 'Cho''gall'), +(43324, 15, 0, '(The claws of fate grasp the unbelievers!)', 14, 0, 100, 0, 0, 22094, 47899, 3, 'Cho''gall'), +(43324, 15, 1, '(The Master sees, the Master sees!)', 14, 0, 100, 0, 0, 22095, 47900, 3, 'Cho''gall'), +(43324, 15, 2, '(The Master sees, the Master sees!)', 14, 0, 100, 0, 0, 22095, 47900, 3, 'Cho''gall'), +(43324, 15, 3, 'What madness have we wrought? (Not yet enough!)', 14, 0, 100, 0, 0, 22096, 47901, 3, 'Cho''gall'), +(43324, 15, 4, 'I... can''t take much more... (Brother, it merely begins!)', 14, 0, 100, 0, 0, 22097, 47902, 3, 'Cho''gall'), +(43324, 15, 5, '(The Master''s eye sees all that was and all to be, or not!)', 14, 0, 100, 0, 0, 22098, 47903, 3, 'Cho''gall'), +(43324, 16, 0, '(Body and soul, to be swallowed whole!)', 14, 0, 100, 0, 0, 22088, 47882, 3, 'Cho''gall'), +(43324, 16, 1, 'Everyone succumbs in the end.', 14, 0, 100, 0, 0, 22089, 47883, 3, 'Cho''gall'), +(43324, 16, 2, '(Now they see the darkness! Their eyes are open!)', 14, 0, 100, 0, 0, 22090, 47884, 3, 'Cho''gall'), +(43324, 16, 3, 'Now the Master has them.', 14, 0, 100, 0, 0, 22091, 47885, 3, 'Cho''gall'), +(43324, 16, 4, '(Chaos, madness! Like a hug for your brain.)', 14, 0, 100, 0, 0, 22092, 47886, 3, 'Cho''gall'), +(43324, 16, 5, '(Blood for the master!)', 14, 0, 100, 0, 0, 22069, 47851, 3, 'Cho''gall'), +(43324, 16, 6, '(Finish it! Finish them all!)', 14, 0, 100, 0, 0, 22072, 47854, 3, 'Cho''gall'), +(43324, 17, 0, 'It is finished. (The fate of all.)', 14, 0, 100, 0, 0, 22101, 47892, 3, 'Cho''gall'), +(43324, 18, 0, 'Brother, we are shattered. (But the Master... I still hear... so angry... Master...?)', 14, 0, 100, 0, 0, 22099, 47893, 3, 'Cho''gall'), +(43324, 19, 0, 'Brother, we are shattered. Let her finish them. (The Master does not want them near her... Brother? The Master seethes...)', 14, 0, 100, 0, 0, 22100, 47894, 3, 'Cho''gall'); + +-- Achievement +DELETE FROM `achievement_criteria_data` WHERE `criteria_id`= 15673; +INSERT INTO `achievement_criteria_data` (`criteria_id`, `type`, `value1`, `value2`, `ScriptName`) VALUES +(15673, 11, 0, 0, 'achievement_the_anyss_will_gaze_into_you'); + +-- Areatriggers +DELETE FROM `areatrigger_scripts` WHERE `entry` IN (6625, 6626, 6627, 6444); +INSERT INTO `areatrigger_scripts` (`entry`, `ScriptName`) VALUES +(6625, 'at_ascendant_council_intro_1'), +(6626, 'at_ascendant_council_intro_2'), +(6627, 'at_ascendant_council_intro_3'), +(6444, 'at_chogall_intro'); + +-- Spell Target Positions +UPDATE `spell_target_position` SET `Orientation`= 3.189992 WHERE `ID`= 82712; +UPDATE `spell_target_position` SET `Orientation`= 0.2274163 WHERE `ID`= 82713; + +-- Gold Loot +-- 10 Player +UPDATE `creature_template` SET `mingold`= 2200000, `maxgold`= 2400000 WHERE `entry` IN (43324, 50132); +-- 25 Player +UPDATE `creature_template` SET `mingold`= 4900000, `maxgold`= 5100000 WHERE `entry` IN (50131, 50133); + +-- Currency Loot +DELETE FROM `creature_onkill_reward` WHERE `creature_id` IN (50131, 50132, 50133, 43324); +INSERT INTO `creature_onkill_reward` (`creature_id`, `CurrencyId1`, `CurrencyCount1`) VALUES +(43324, 396, 11500), +(50131, 396, 13500), +(50132, 396, 11500), +(50133, 396, 13500); diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 4faa328a8c2..dc5f42685bc 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -4284,6 +4284,31 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->AttributesEx2 |= SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS; }); + // Cho'Gall + // Darkened Creations + ApplySpellFix({ + 82414, + 93161 + }, [](SpellInfo* spellInfo) + { + spellInfo->MaxAffectedTargets = 4; + }); + + // Darkened Creations + ApplySpellFix({ + 93160, + 93162 + }, [](SpellInfo* spellInfo) + { + spellInfo->MaxAffectedTargets = 10; + }); + + // Summon Spiked Tentacle Trigger + ApplySpellFix({ 93315 }, [](SpellInfo* spellInfo) + { + spellInfo->MaxAffectedTargets = 1; + }); + // ENDOF BASTION OF TWILIGHT // diff --git a/src/server/scripts/EasternKingdoms/BastionOfTwilight/bastion_of_twilight.cpp b/src/server/scripts/EasternKingdoms/BastionOfTwilight/bastion_of_twilight.cpp index c7cc6b5a6a6..c64e79d0aa8 100644 --- a/src/server/scripts/EasternKingdoms/BastionOfTwilight/bastion_of_twilight.cpp +++ b/src/server/scripts/EasternKingdoms/BastionOfTwilight/bastion_of_twilight.cpp @@ -38,7 +38,63 @@ class at_theralion_and_valiona_intro : public AreaTriggerScript } }; +class at_ascendant_council_intro_1 : public AreaTriggerScript +{ + public: + at_ascendant_council_intro_1() : AreaTriggerScript("at_ascendant_council_intro_1") { } + + bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) + { + if (InstanceScript* instance = player->GetInstanceScript()) + instance->SetData(DATA_AT_ASCENDANT_COUNCIL_INTRO_1, IN_PROGRESS); + return true; + } +}; + +class at_ascendant_council_intro_2 : public AreaTriggerScript +{ + public: + at_ascendant_council_intro_2() : AreaTriggerScript("at_ascendant_council_intro_2") { } + + bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) + { + if (InstanceScript* instance = player->GetInstanceScript()) + instance->SetData(DATA_AT_ASCENDANT_COUNCIL_INTRO_2, IN_PROGRESS); + return true; + } +}; + +class at_ascendant_council_intro_3 : public AreaTriggerScript +{ + public: + at_ascendant_council_intro_3() : AreaTriggerScript("at_ascendant_council_intro_3") { } + + bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) + { + if (InstanceScript* instance = player->GetInstanceScript()) + instance->SetData(DATA_AT_ASCENDANT_COUNCIL_INTRO_3, IN_PROGRESS); + return true; + } +}; + +class at_chogall_intro : public AreaTriggerScript +{ + public: + at_chogall_intro() : AreaTriggerScript("at_chogall_intro") { } + + bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) + { + if (InstanceScript* instance = player->GetInstanceScript()) + instance->SetData(DATA_AT_CHOGALL_INTRO, IN_PROGRESS); + return true; + } +}; + void AddSC_bastion_of_twilight() { new at_theralion_and_valiona_intro(); + new at_ascendant_council_intro_1(); + new at_ascendant_council_intro_2(); + new at_ascendant_council_intro_3(); + new at_chogall_intro(); } \ No newline at end of file diff --git a/src/server/scripts/EasternKingdoms/BastionOfTwilight/bastion_of_twilight.h b/src/server/scripts/EasternKingdoms/BastionOfTwilight/bastion_of_twilight.h index e3a1ad0dffa..c94720f899b 100644 --- a/src/server/scripts/EasternKingdoms/BastionOfTwilight/bastion_of_twilight.h +++ b/src/server/scripts/EasternKingdoms/BastionOfTwilight/bastion_of_twilight.h @@ -43,13 +43,19 @@ enum BoTDataTypes DATA_ARION = 11, DATA_ELEMENTIUM_MONSTROSITY = 12, DATA_ASCENDANT_COUNCIL_CONTROLLER = 13, + DATA_CORRUPTION = 14, // GameObject Types - DATA_WHELP_CAGE = 14, + DATA_WHELP_CAGE = 15, + DATA_GRIM_BATOL_RAID_TRAP_DOOR = 16, // Areatriggers - DATA_AT_HALFUS_INTRO = 15, - DATA_AT_THERALION_AND_VALIONA_INTRO = 16, + DATA_AT_HALFUS_INTRO = 17, + DATA_AT_THERALION_AND_VALIONA_INTRO = 18, + DATA_AT_ASCENDANT_COUNCIL_INTRO_1 = 19, + DATA_AT_ASCENDANT_COUNCIL_INTRO_2 = 20, + DATA_AT_ASCENDANT_COUNCIL_INTRO_3 = 21, + DATA_AT_CHOGALL_INTRO = 22, // Encounter Related /*Halfus Wyrmbreaker*/ @@ -61,7 +67,10 @@ enum BoTDataTypes /*Theralion and Valiona*/ DATA_RANDOM_VALIONA_DUMMY, DATA_COLLAPSING_TWILIGHT_PORTAL_COUNT, - DATA_VALIONA_AURA_DUMMY + DATA_VALIONA_AURA_DUMMY, + + /*Cho'Gall*/ + DATA_FULL_HEROIC_ID }; enum BoTDataStates @@ -72,8 +81,12 @@ enum BoTDataStates enum BoTAreatriggerIndex { - AT_INDEX_HALFUS_WYRMBREAKER_INTRO = 1, - AT_INDEX_THERALION_AND_VALIONA_INTRO = 2 + AT_INDEX_HALFUS_WYRMBREAKER_INTRO = 1, + AT_INDEX_THERALION_AND_VALIONA_INTRO = 2, + AT_INDEX_ASCENDANT_COUNCIL_INTRO_1 = 3, + AT_INDEX_ASCENDANT_COUNCIL_INTRO_2 = 4, + AT_INDEX_ASCENDANT_COUNCIL_INTRO_3 = 5, + AT_INDEX_CHOGALL_INTRO = 6, }; enum BoTCreatures @@ -120,6 +133,14 @@ enum BoTCreatures NPC_WATER_BOMB = 44201, NPC_INFERNO_RUSH = 47501, NPC_FROZEN_ORB = 49518, + NPC_LIQUID_ICE = 45452, + + /*Cho'Gall*/ + NPC_FIRE_PORTAL = 43393, + NPC_FIRE_ELEMENTAL = 43406, + NPC_CORRUPTION = 43999, + NPC_MALFORMATION = 43888, + NPC_SPIKED_TENTACLE_TRIGGER = 50265, // Generic Creatures NPC_INVISIBLE_STALKER = 42098 @@ -134,7 +155,8 @@ enum BoTGameObjects GO_ASCENDANT_COUNCIL_ENTRANCE = 205226, GO_ASCENDANT_COUNCIL_EXIT = 205227, GO_CHOGALL_ENTRANCE = 205228, - GO_WHELP_CAGE = 205087 + GO_WHELP_CAGE = 205087, + GO_GRIM_BATOL_RAID_TRAP_DOOR = 205898 }; enum BoTActions @@ -155,12 +177,18 @@ enum BoTActions ACTION_TALK_INTRO_HALFUS_WYRMBREAKER = 1, // Cho'Gall (Boss) - ACTION_TALK_INTRO_THERALION_AND_VALIONA = 1 + ACTION_TALK_THERALION_AND_VALIONA_INTRO = 1, + ACTION_TALK_THERALION_AND_VALIONA_DEAD = 2, + ACTION_TALK_ASCENDANT_COUNCIL_INTRO_1 = 3, + ACTION_TALK_ASCENDANT_COUNCIL_INTRO_2 = 4, + ACTION_TALK_ASCENDANT_COUNCIL_INTRO_3 = 5, + ACTION_TALK_CHOGALL_INTRO = 6, }; enum BoTEvents { - EVENT_CAST_DANCING_FLAMES = 1 + EVENT_CAST_DANCING_FLAMES = 1, + EVENT_CHOGALL_TALK_THERALION_AND_VALIONA_DEAD, }; enum BoTSpells @@ -174,6 +202,8 @@ AI* GetBastionOfTwilightAI(Creature* creature) return GetInstanceAI(creature, BoTScriptName); } +#define RegisterBastionOfTwilightCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetBastionOfTwilightAI) + template AI* GetBastionOfTwilightAI(GameObject* go) { diff --git a/src/server/scripts/EasternKingdoms/BastionOfTwilight/boss_chogall.cpp b/src/server/scripts/EasternKingdoms/BastionOfTwilight/boss_chogall.cpp new file mode 100644 index 00000000000..b20b83d667d --- /dev/null +++ b/src/server/scripts/EasternKingdoms/BastionOfTwilight/boss_chogall.cpp @@ -0,0 +1,1528 @@ +/* +* Copyright (C) 2008-2018 TrinityCore +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License as published by the +* Free Software Foundation; either version 2 of the License, or (at your +* option) any later version. +* +* This program is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +* more details. +* +* You should have received a copy of the GNU General Public License along +* with this program. If not, see . +*/ + +#include "GridNotifiers.h" +#include "ObjectMgr.h" +#include "PassiveAI.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "SpellAuras.h" +#include "SpellScript.h" +#include "SpellAuraEffects.h" +#include "SpellMgr.h" +#include "Vehicle.h" +#include "bastion_of_twilight.h" + +enum Texts +{ + // Cho'Gall + SAY_THERALION_VALIONA_INTRO = 0, + SAY_THERALION_VALIONA_DEATH = 1, + SAY_ASCENDANT_COUNCIL_INTRO_1 = 2, + SAY_ASCENDANT_COUNCIL_INTRO_2 = 3, + SAY_ASCENDANT_COUNCIL_INTRO_3 = 4, + SAY_INTRO = 5, + SAY_AGGRO = 6, + SAY_ABSORB_FIRE_ELEMENTAL = 7, + SAY_ABSORB_SHADOW_LORD = 8, + SAY_ANNOUNCE_SUMMON_CORRUPTING_ADHERENT = 9, + SAY_SUMMON_CORRUPTING_ADHERENT = 10, + SAY_ANNOUNCE_CONVERSION = 11, + SAY_ANNOUNCE_FESTER_BLOOD = 12, + SAY_CONSUME_BLOOD_OF_THE_OLD_GODS = 13, + SAY_ANNOUNCE_DARKENED_CREATIONS = 14, + SAY_DARKENED_CREATIONS = 15, + SAY_SLAY = 16, + SAY_EVADE = 17, + SAY_DEATH_NORMAL = 18, + SAY_DEATH_HEROIC = 19 +}; + +enum BroadCastText +{ + ANNOUNCE_CORRUPTION_SICKNESS = 52818 +}; + +enum Spells +{ + // Cho'Gall + SPELL_CORRUPTED_BLOOD = 93104, + SPELL_BOSS_HITTIN_YA = 73878, + SPELL_FURY_OF_CHOGALL = 82524, + SPELL_FLAMES_ORDERS = 81171, + SPELL_SHADOWS_ORDERS = 81556, + SPELL_SUMMON_CORRUPTING_ADHERENT = 81628, + SPELL_SUMMON_CORRUPTING_ADHERENT_LEFT = 81611, + SPELL_SUMMON_CORRUPTING_ADHERENT_RIGHT = 81618, + SPELL_FESTER_BLOOD = 82299, + SPELL_CONVERSION = 91303, + SPELL_WORSHIPPING = 91317, + SPELL_WORSHIPPING_LINKED = 92314, + SPELL_CONSUME_BLOOD_OF_THE_OLD_GODS = 82630, + SPELL_CORRUPTED_CHOGALL = 95821, + SPELL_CORRUPTED_BLOOD_DAMAGE_INCREASE = 93187, + SPELL_CORRUPTION_ACCELERATED = 81836, + SPELL_CORRUPTION_SICKNESS = 81829, + SPELL_CORRUPTION_MALFORMATION = 82125, + SPELL_CORRUPTION_ABSOLUTE_1 = 82170, + SPELL_CORRUPTION_ABSOLUTE_2 = 82193, + SPELL_DARKENED_CREATIONS = 82414, + SPELL_SUMMON_SPIKED_TENTACLE_TRIGGER = 93315, + SPELL_SWAGGER_WALK = 93338, + SPELL_QUITE_SUICIDE = 3617, + + // Corrupting Adherent + SPELL_CORRUPTING_CRASH = 81685, + SPELL_SPILLED_BLOOD_OF_THE_OLD_GODS_1 = 81771, + SPELL_SPILLED_BLOOD_OF_THE_OLD_GODS_2 = 81757, + SPELL_CONSUME_BLOOD_OF_THE_OLD_GOD_TRIGGERED = 82659, + + // Fire Portal + SPELL_FLAMES_ORDERS_SUMMON = 81186, + + // Shadow Portal + SPELL_SHADOWS_ORDERS_SUMMON = 81558, + + // Fire Elemental + SPELL_FIRE_POWER = 93245, + SPELL_ABSORB_FIRE_REVERSE_CAST = 81233, + + // Shadow Lord + SPELL_SHADOW_POWER = 93301, + SPELL_ABSORB_SHADOW_REVERSE_CAST = 81565, + + // Malformation + SPELL_SHADOW_BOLT = 82151, + + // Darkened Creation + SPELL_DARKENED_CREATION_SUMMON_VISUAL = 82452, + SPELL_TRANSFORM_EYE_TENTACLE = 82451, + SPELL_VOID_ZONE_VISUAL = 82397, + SPELL_DEBILITATING_BEAM = 82411 +}; + +#define SPELL_DEPRAVITY RAID_MODE(81713, 93175, 93176, 93177) +#define SPELL_DEBILITATING_BEAM RAID_MODE(82411, 93132, 93133, 93134) + +enum Events +{ + // Cho'Gall + EVENT_FURY_OF_CHOGALL = 1, + EVENT_FLAMES_ORDER, + EVENT_SHADOWS_ORDERS, + EVENT_SUMMON_CORRUPTING_ADHERENT, + EVENT_FESTER_BLOOD, + EVENT_CONVERSION, + EVENT_CONSUME_BLOOD_OF_THE_OLD_GOD, + EVENT_CHECK_BLOOD_OF_THE_OLD_GOD_BUFF, + EVENT_DARKENED_CREATIONS, + EVENT_SUMMON_SPIKED_TENTACLE, + + // Corrupting Adherent / Blood of the Old God + EVENT_ENGAGE_PLAYERS, + EVENT_CORRUPTING_CRASH, + EVENT_DEPRAVITY, + + // Portals + EVENT_SUMMON_ELEMENTAL, + EVENT_PREPARE_DESPAWN, + + // Elementals + EVENT_ABSORB_ELEMENTAL, + + // Malformation + EVENT_SHADOW_BOLT, + + // Darkened Creation + EVENT_TRANSFORM, + EVENT_DEBILITATING_BEAM +}; + +enum Phases +{ + PHASE_1 = 1, + PHASE_2 = 2, + PHASE_HEROIC_DEATH +}; + +enum Actions +{ + // 1 - 6 used by header file + ACTION_FAIL_ACHIEVEMENT = 7 +}; + +enum Data +{ + DATA_ELEMENTAL_POWER_STACKS = 0, + DATA_ABYSS_WILL_GAZE_INTO_YOU = 1 +}; + +enum Corruption +{ + MAX_CORRUPTION = 100, + CORRUPTION_ACHIEVEMENT_CAP = 30, + CORRUPTION_TOLERANCE = 1, + + CORRUPTION_NORMAL = 1, + CORRUPTION_SIGNIFICANT = 2, + + CORRUPTION_LEVEL_ACCELERATED = 25, + CORRUPTION_LEVEL_SICKNESS = 50, + CORRUPTION_LEVEL_MALFORMATION = 75, + CORRUPTION_LEVEL_ABSOLUTE = 100 +}; + +enum MovePoints +{ + POINT_BREAK_PLATFORM = 1 +}; + +enum Seats +{ + SEAT_0 = 0 +}; + +namespace CorruptionHandler +{ + bool IsCorruptionStage(uint8 power) + { + return (power == CORRUPTION_LEVEL_ACCELERATED + || power == CORRUPTION_LEVEL_SICKNESS + || power == CORRUPTION_LEVEL_MALFORMATION + || power == CORRUPTION_LEVEL_ABSOLUTE); + } + + uint32 GetSpellIdForCorruptionLevel(uint8 power, bool significantStep) + { + uint8 tolerance = 0; + if (!IsCorruptionStage(power) && significantStep && IsCorruptionStage(power - CORRUPTION_TOLERANCE)) + tolerance += CORRUPTION_TOLERANCE; + + switch (power - tolerance) + { + case CORRUPTION_LEVEL_ACCELERATED: + return SPELL_CORRUPTION_ACCELERATED; + case CORRUPTION_LEVEL_SICKNESS: + return SPELL_CORRUPTION_SICKNESS; + case CORRUPTION_LEVEL_MALFORMATION: + return SPELL_CORRUPTION_MALFORMATION; + case CORRUPTION_LEVEL_ABSOLUTE: + return SPELL_CORRUPTION_ABSOLUTE_1; + } + + return 0; + } + + void AddCorruption(Unit* target, uint8 corruptionAmount) + { + uint8 power = target->GetPower(POWER_ALTERNATE_POWER); + + if (power == MAX_CORRUPTION) + return; + + // Add power to target + power += corruptionAmount; + target->SetPower(POWER_ALTERNATE_POWER, std::min(power, uint8(MAX_CORRUPTION))); + target->CastCustomSpell(SPELL_CORRUPTED_BLOOD_DAMAGE_INCREASE, SPELLVALUE_AURA_STACK, corruptionAmount, target, true); + + // Checking for a corruption spell for current corruption stage and cast it + if (uint32 spellId = GetSpellIdForCorruptionLevel(power, corruptionAmount == CORRUPTION_SIGNIFICANT)) + { + target->CastSpell(target, spellId, true); + + if (spellId == SPELL_CORRUPTION_ABSOLUTE_1) + target->CastSpell(target, SPELL_CORRUPTION_ABSOLUTE_2, true); + } + + // Achievement check + if (power > CORRUPTION_ACHIEVEMENT_CAP) + if (InstanceScript* instance = target->GetInstanceScript()) + if (Creature* chogall = instance->GetCreature(DATA_CHOGALL)) + chogall->AI()->DoAction(ACTION_FAIL_ACHIEVEMENT); + } +} + +Position const HeroicDeathPos = { -1161.89f, -798.441f, 835.8751f }; +Position const HeroicTeleportPos = { -1130.75f, -817.314f, 467.747f, 5.191174f }; + +class BreakTrapDoorEvent : public BasicEvent +{ + public: + explicit BreakTrapDoorEvent(Creature* owner): _owner(owner) { } + + bool Execute(uint64 /*time*/, uint32 /*diff*/) + { + if (InstanceScript* instance = _owner->GetInstanceScript()) + if (GameObject* trapDoor = instance->GetGameObject(DATA_GRIM_BATOL_RAID_TRAP_DOOR)) + trapDoor->SetGoState(GO_STATE_ACTIVE); + + _owner->GetMotionMaster()->MoveFall(); + return true; + } + + private: + Creature* _owner; +}; + +class TeleportAfterFallEvent : public BasicEvent +{ + public: + explicit TeleportAfterFallEvent(Creature* owner): _owner(owner) { } + + bool Execute(uint64 /*time*/, uint32 /*diff*/) + { + _owner->NearTeleportTo(HeroicTeleportPos); + return true; + } + + private: + Creature* _owner; +}; + +struct boss_chogall : public BossAI +{ + boss_chogall(Creature* creature) : BossAI(creature, DATA_CHOGALL) + { + Initialize(); + } + + void Initialize() + { + _elementalPowerStacks = 0; + _firstDarkenedCreations = true; + _allowDeath = true; + _achievementEnligibe = true; + } + + void JustEngagedWith(Unit* /*who*/) override + { + _JustEngagedWith(); + Talk(SAY_AGGRO); + instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me); + DoCastSelf(SPELL_CORRUPTED_BLOOD); + events.SetPhase(PHASE_1); + events.ScheduleEvent(EVENT_FURY_OF_CHOGALL, 57s + 800ms); + events.ScheduleEvent(EVENT_FLAMES_ORDER, 6s + 100ms, 0, PHASE_1); + events.ScheduleEvent(EVENT_SHADOWS_ORDERS, 20s + 800ms, 0, PHASE_1); + events.ScheduleEvent(EVENT_SUMMON_CORRUPTING_ADHERENT, 2min + 4s, 0, PHASE_1); + events.ScheduleEvent(EVENT_CONVERSION, 11s, 0, PHASE_1); + + if (instance->GetData(DATA_FULL_HEROIC_ID) && IsHeroic()) + _allowDeath = false; + } + + void Reset() + { + _Reset(); + Initialize(); + DoCastSelf(SPELL_BOSS_HITTIN_YA, true); + } + + void KilledUnit(Unit* who) override + { + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } + + void EnterEvadeMode(EvadeReason /*why*/) override + { + _EnterEvadeMode(); + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + summons.DespawnAll(); + Talk(SAY_EVADE); + + if (Creature* corruption = instance->GetCreature(DATA_CORRUPTION)) + corruption->RemoveAllAuras(); + + _DespawnAtEvade(); + } + + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + if (Creature* corruption = instance->GetCreature(DATA_CORRUPTION)) + corruption->RemoveAllAuras(); + + if (!instance->GetData(DATA_FULL_HEROIC_ID) || !IsHeroic()) + Talk(SAY_DEATH_NORMAL); + } + + void SpellHit(Unit* /*caster*/, SpellInfo const* spell) override + { + switch (spell->Id) + { + case SPELL_ABSORB_FIRE_REVERSE_CAST: + Talk(SAY_ABSORB_FIRE_ELEMENTAL); + break; + case SPELL_ABSORB_SHADOW_REVERSE_CAST: + if (roll_chance_i(20)) + Talk(SAY_ABSORB_SHADOW_LORD); + break; + default: + break; + } + } + + void DoAction(int32 action) override + { + switch (action) + { + case ACTION_TALK_THERALION_AND_VALIONA_INTRO: + Talk(SAY_THERALION_VALIONA_INTRO); + break; + case ACTION_TALK_THERALION_AND_VALIONA_DEAD: + Talk(SAY_THERALION_VALIONA_DEATH); + break; + case ACTION_TALK_ASCENDANT_COUNCIL_INTRO_1: + Talk(SAY_ASCENDANT_COUNCIL_INTRO_1); + break; + case ACTION_TALK_ASCENDANT_COUNCIL_INTRO_2: + Talk(SAY_ASCENDANT_COUNCIL_INTRO_2); + break; + case ACTION_TALK_ASCENDANT_COUNCIL_INTRO_3: + Talk(SAY_ASCENDANT_COUNCIL_INTRO_3); + break; + case ACTION_TALK_CHOGALL_INTRO: + Talk(SAY_INTRO); + break; + case ACTION_FAIL_ACHIEVEMENT: + _achievementEnligibe = false; + break; + default: + break; + } + } + + void PassengerBoarded(Unit* passenger, int8 /*seatId*/, bool apply) override + { + if (!passenger || !apply) + return; + + uint32 spellId = SPELL_SHADOW_POWER; + if (passenger->GetEntry() == NPC_FIRE_ELEMENTAL) + spellId = SPELL_FIRE_POWER; + + if (Aura* aura = passenger->GetAura(spellId)) + { + _elementalPowerStacks = aura->GetStackAmount(); + aura->Remove(); + } + } + + uint32 GetData(uint32 type) const override + { + switch (type) + { + case DATA_ELEMENTAL_POWER_STACKS: + return _elementalPowerStacks; + case DATA_ABYSS_WILL_GAZE_INTO_YOU: + return _achievementEnligibe; + } + return 0; + } + + void DamageTaken(Unit* /*attacker*/, uint32& damage) override + { + if (me->HealthBelowPctDamaged(25, damage) && !events.IsInPhase(PHASE_2) && !events.IsInPhase(PHASE_HEROIC_DEATH)) + { + events.SetPhase(PHASE_2); + events.ScheduleEvent(EVENT_CONSUME_BLOOD_OF_THE_OLD_GOD, 1ms, 0, PHASE_2); + } + + + if (damage >= me->GetHealth() && !_allowDeath) + { + damage = me->GetHealth() - 1; + + if (!events.IsInPhase(PHASE_HEROIC_DEATH)) + { + events.SetPhase(PHASE_HEROIC_DEATH); + me->AttackStop(); + me->SetReactState(REACT_PASSIVE); + Talk(SAY_DEATH_HEROIC); + DoCastSelf(SPELL_SWAGGER_WALK, true); + me->SetWalk(true); + me->GetMotionMaster()->MovePoint(POINT_BREAK_PLATFORM, HeroicDeathPos, false); + } + } + } + + void MovementInform(uint32 type, uint32 id) override + { + if (type != POINT_MOTION_TYPE && type != EFFECT_MOTION_TYPE) + return; + + if (id == POINT_BREAK_PLATFORM) + { + _allowDeath = true; + DoCastSelf(SPELL_QUITE_SUICIDE, true); + me->m_Events.AddEvent(new BreakTrapDoorEvent(me), me->m_Events.CalculateTime(3000)); + me->m_Events.AddEvent(new TeleportAfterFallEvent(me), me->m_Events.CalculateTime(4000)); + } + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_FURY_OF_CHOGALL: + DoCastVictim(SPELL_FURY_OF_CHOGALL); + events.Repeat(47s + 500ms); + break; + case EVENT_FLAMES_ORDER: + DoCastSelf(SPELL_FLAMES_ORDERS); + events.Repeat(40s); + break; + case EVENT_SHADOWS_ORDERS: + DoCastSelf(SPELL_SHADOWS_ORDERS); + events.Repeat(40s); + break; + case EVENT_SUMMON_CORRUPTING_ADHERENT: + Talk(SAY_ANNOUNCE_SUMMON_CORRUPTING_ADHERENT); + Talk(SAY_SUMMON_CORRUPTING_ADHERENT); + DoCastAOE(SPELL_SUMMON_CORRUPTING_ADHERENT); + events.Repeat(1min + 32s + 300ms); + events.ScheduleEvent(EVENT_FESTER_BLOOD, 39s, 0, PHASE_1); + break; + case EVENT_FESTER_BLOOD: + Talk(SAY_ANNOUNCE_FESTER_BLOOD); + DoCastAOE(SPELL_FESTER_BLOOD); + break; + case EVENT_CONVERSION: + Talk(SAY_ANNOUNCE_CONVERSION); + DoCastAOE(SPELL_CONVERSION); + events.Repeat(21s, 25s); + break; + case EVENT_CONSUME_BLOOD_OF_THE_OLD_GOD: + Talk(SAY_CONSUME_BLOOD_OF_THE_OLD_GODS); + DoCastAOE(SPELL_CONSUME_BLOOD_OF_THE_OLD_GODS); + events.ScheduleEvent(EVENT_CHECK_BLOOD_OF_THE_OLD_GOD_BUFF, 5s + 100ms, 0, PHASE_2); + events.ScheduleEvent(EVENT_DARKENED_CREATIONS, 6s, 0, PHASE_2); + if (IsHeroic()) + events.ScheduleEvent(EVENT_SUMMON_SPIKED_TENTACLE, 16s + 800ms, 0, PHASE_2); + break; + case EVENT_CHECK_BLOOD_OF_THE_OLD_GOD_BUFF: + // Make sure that we always get the Blood of the Old God triggered aura in case that + // Phase 2 has been triggered before any Corrupting Adherent has been spawned. + if (!me->HasAura(SPELL_CONSUME_BLOOD_OF_THE_OLD_GOD_TRIGGERED)) + DoCastSelf(SPELL_CONSUME_BLOOD_OF_THE_OLD_GOD_TRIGGERED); + break; + case EVENT_DARKENED_CREATIONS: + if (_firstDarkenedCreations) + _firstDarkenedCreations = false; + else + { + Talk(SAY_ANNOUNCE_DARKENED_CREATIONS); + Talk(SAY_DARKENED_CREATIONS); + } + + DoCastAOE(SPELL_DARKENED_CREATIONS); + events.Repeat(20s); + break; + case EVENT_SUMMON_SPIKED_TENTACLE: + DoCastAOE(SPELL_SUMMON_SPIKED_TENTACLE_TRIGGER); + events.Repeat(20s); + break; + default: + break; + } + } + DoMeleeAttackIfReady(); + } +private: + uint8 _elementalPowerStacks; + bool _firstDarkenedCreations; + bool _allowDeath; + bool _achievementEnligibe; +}; + +class SpilledBloodAuraEvent : public BasicEvent +{ + public: + explicit SpilledBloodAuraEvent(Creature* owner): _owner(owner) { } + + bool Execute(uint64 /*time*/, uint32 /*diff*/) + { + _owner->CastSpell(_owner, SPELL_SPILLED_BLOOD_OF_THE_OLD_GODS_2, true); + return true; + } + + private: + Creature* _owner; +}; + +struct npc_chogall_corrupting_adherent : public ScriptedAI +{ + npc_chogall_corrupting_adherent(Creature* creature) : ScriptedAI(creature) + { + Initialize(); + } + + void Initialize() + { + me->MakeInterruptable(false); + me->SetReactState(REACT_PASSIVE); + DoZoneInCombat(); + } + + void IsSummonedBy(Unit* /*summoner*/) override + { + me->SetCorpseDelay(HOUR); + DoCastSelf(SPELL_BOSS_HITTIN_YA, true); + _events.ScheduleEvent(EVENT_ENGAGE_PLAYERS, 2s); + _events.ScheduleEvent(EVENT_CORRUPTING_CRASH, 9s + 600ms); + } + + void OnSpellCastInterrupt(SpellInfo const* spell) override + { + if (spell->Id == SPELL_DEPRAVITY) + me->MakeInterruptable(false); + } + + void OnSuccessfulSpellCast(SpellInfo const* spell) override + { + if (spell->Id == SPELL_DEPRAVITY) + me->MakeInterruptable(false); + } + + void SpellHit(Unit* /*caster*/, SpellInfo const* spell) override + { + if (spell->Id == SPELL_CONSUME_BLOOD_OF_THE_OLD_GODS) + { + _events.Reset(); + me->AttackStop(); + me->SetReactState(REACT_PASSIVE); + me->DespawnOrUnsummon(6s + 750ms); + } + } + + void JustDied(Unit* /*killer*/) override + { + _events.Reset(); + DoCastSelf(SPELL_SPILLED_BLOOD_OF_THE_OLD_GODS_1, true); + me->m_Events.AddEvent(new SpilledBloodAuraEvent(me), me->m_Events.CalculateTime(5100)); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_ENGAGE_PLAYERS: + me->SetReactState(REACT_AGGRESSIVE); + if (Unit* target = me->SelectNearbyTarget(nullptr, 100.0f)) + AttackStart(target); + break; + case EVENT_CORRUPTING_CRASH: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true, 0)) + DoCast(target, SPELL_CORRUPTING_CRASH); + _events.Repeat(11s); + _events.ScheduleEvent(EVENT_DEPRAVITY, 1s + 400ms); + break; + case EVENT_DEPRAVITY: + me->MakeInterruptable(true); + DoCastAOE(SPELL_DEPRAVITY); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } +private: + EventMap _events; +}; + +struct npc_chogall_blood_of_the_old_god : public ScriptedAI +{ + npc_chogall_blood_of_the_old_god(Creature* creature) : ScriptedAI(creature), _instance(me->GetInstanceScript()) + { + Initialize(); + } + + void Initialize() + { + me->SetReactState(REACT_PASSIVE); + } + + void IsSummonedBy(Unit* /*summoner*/) override + { + if (Creature* chogall = _instance->GetCreature(DATA_CHOGALL)) + chogall->AI()->JustSummoned(me); + + DoZoneInCombat(); + _events.ScheduleEvent(EVENT_ENGAGE_PLAYERS, 2s + 200ms); + } + + void JustDied(Unit* /*killer*/) override + { + me->DespawnOrUnsummon(2s + 500ms); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_ENGAGE_PLAYERS: + me->SetReactState(REACT_AGGRESSIVE); + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true, 0)) + { + me->AddThreat(target, 100000000.0f); // sniffed value + AttackStart(target); + } + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + +private: + EventMap _events; + InstanceScript* _instance; +}; + +struct npc_chogall_portal : public ScriptedAI +{ + npc_chogall_portal(Creature* creature) : ScriptedAI(creature) { } + + void IsSummonedBy(Unit* /*summoner*/) override + { + _events.ScheduleEvent(EVENT_SUMMON_ELEMENTAL, 6s + 100ms); + } + + void UpdateAI(uint32 diff) override + { + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_SUMMON_ELEMENTAL: + DoCastSelf(me->GetEntry() == NPC_FIRE_PORTAL ? SPELL_FLAMES_ORDERS_SUMMON : SPELL_SHADOWS_ORDERS_SUMMON); + _events.ScheduleEvent(EVENT_PREPARE_DESPAWN, 5s + 800ms); + break; + case EVENT_PREPARE_DESPAWN: + me->RemoveAllAuras(); + me->DespawnOrUnsummon(1s + 200ms); + break; + default: + break; + } + } + } + +private: + EventMap _events; +}; + +struct npc_chogall_elemental : public PassiveAI +{ + npc_chogall_elemental(Creature* creature) : PassiveAI(creature), _instance(me->GetInstanceScript()) { } + + void IsSummonedBy(Unit* /*summoner*/) override + { + DoZoneInCombat(); + if (Creature* chogall = _instance->GetCreature(DATA_CHOGALL)) + chogall->AI()->JustSummoned(me); + + if (me->GetEntry() == NPC_FIRE_ELEMENTAL) + me->CastCustomSpell(SPELL_FIRE_POWER, SPELLVALUE_AURA_STACK, 10, me, true); + else + me->CastCustomSpell(SPELL_SHADOW_POWER, SPELLVALUE_AURA_STACK, 10, me, true); + + _events.ScheduleEvent(EVENT_ABSORB_ELEMENTAL, 10s + 500ms); + } + + void DamageTaken(Unit* /*attacker*/, uint32& damage) override + { + if (damage >= me->GetHealth()) + damage = me->GetHealth() - 1; + } + + void UpdateAI(uint32 diff) override + { + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_ABSORB_ELEMENTAL: + if (Creature* chogall = _instance->GetCreature(DATA_CHOGALL)) + { + if (!chogall->HasUnitState(UNIT_STATE_CASTING)) + { + if (me->GetEntry() == NPC_FIRE_ELEMENTAL) + DoCastSelf(SPELL_ABSORB_FIRE_REVERSE_CAST); + else + DoCastSelf(SPELL_ABSORB_SHADOW_REVERSE_CAST); + me->DespawnOrUnsummon(2s + 600ms); + } + else + _events.Repeat(1s); + } + break; + default: + break; + } + } + } + +private: + EventMap _events; + InstanceScript* _instance; +}; + +struct npc_chogall_malformation : public ScriptedAI +{ + npc_chogall_malformation(Creature* creature) : ScriptedAI(creature), _instance(me->GetInstanceScript()) { } + + void IsSummonedBy(Unit* /*summoner*/) override + { + _events.ScheduleEvent(EVENT_SHADOW_BOLT, 1s + 500ms); + } + + void UpdateAI(uint32 diff) override + { + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_SHADOW_BOLT: + DoCastAOE(EVENT_SHADOW_BOLT); + _events.Repeat(2s); + break; + default: + break; + } + } + } + +private: + EventMap _events; + InstanceScript* _instance; +}; + +struct npc_chogall_darkened_creation : public ScriptedAI +{ + npc_chogall_darkened_creation(Creature* creature) : ScriptedAI(creature), _instance(me->GetInstanceScript()) + { + Initialize(); + } + + void Initialize() + { + me->SetReactState(REACT_PASSIVE); + } + + void IsSummonedBy(Unit* /*summoner*/) override + { + if (Creature* chogall = _instance->GetCreature(DATA_CHOGALL)) + chogall->AI()->JustSummoned(me); + + DoZoneInCombat(); + DoCastSelf(SPELL_DARKENED_CREATION_SUMMON_VISUAL); + + _events.ScheduleEvent(EVENT_TRANSFORM, 3s + 500ms); + me->SetCorpseDelay(4); + } + + void UpdateAI(uint32 diff) override + { + _events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_TRANSFORM: + DoCastSelf(SPELL_TRANSFORM_EYE_TENTACLE); + DoCastSelf(SPELL_VOID_ZONE_VISUAL); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + _events.ScheduleEvent(EVENT_DEBILITATING_BEAM, 1s + 300ms); + break; + case EVENT_DEBILITATING_BEAM: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true, -SPELL_DEBILITATING_BEAM)) + { + me->SetFacingToObject(target); + DoCast(target, SPELL_DEBILITATING_BEAM); + } + _events.Repeat(1s + 500ms); + break; + default: + break; + } + } + } + +private: + EventMap _events; + InstanceScript* _instance; +}; + +struct npc_chogall_spiked_tentacle : public ScriptedAI +{ + npc_chogall_spiked_tentacle(Creature* creature) : ScriptedAI(creature), _instance(me->GetInstanceScript()) + { + Initialize(); + } + + void Initialize() + { + me->SetReactState(REACT_PASSIVE); + } + + void IsSummonedBy(Unit* /*summoner*/) override + { + if (Creature* chogall = _instance->GetCreature(DATA_CHOGALL)) + chogall->AI()->JustSummoned(me); + + DoZoneInCombat(); + _events.ScheduleEvent(EVENT_ENGAGE_PLAYERS, 2s + 200ms); + } + + void JustDied(Unit* /*killer*/) override + { + me->DespawnOrUnsummon(4s); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_ENGAGE_PLAYERS: + me->SetReactState(REACT_AGGRESSIVE); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + +private: + EventMap _events; + InstanceScript* _instance; +}; + +class spell_chogall_absorb_elemental_reverse_cast : public SpellScript +{ + PrepareSpellScript(spell_chogall_absorb_elemental_reverse_cast); + + void HandleScriptEffect(SpellEffIndex effIndex) + { + GetHitUnit()->CastSpell(GetHitUnit(), GetSpellInfo()->Effects[effIndex].BasePoints); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_chogall_absorb_elemental_reverse_cast::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +class spell_chogall_absorb_elemental : public SpellScript +{ + PrepareSpellScript(spell_chogall_absorb_elemental); + + void HandleScriptEffect(SpellEffIndex effIndex) + { + if (Unit* caster = GetCaster()) + GetHitUnit()->CastSpell(caster, GetSpellInfo()->Effects[effIndex].BasePoints, true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_chogall_absorb_elemental::HandleScriptEffect, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +class spell_chogall_absorb_elemental_heroic : public SpellScript +{ + PrepareSpellScript(spell_chogall_absorb_elemental_heroic); + + void HandleScriptEffect(SpellEffIndex effIndex) + { + if (Unit* caster = GetCaster()) + GetHitUnit()->CastSpell(caster, GetSpellInfo()->Effects[effIndex].BasePoints, true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_chogall_absorb_elemental_heroic::HandleScriptEffect, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +class spell_chogall_absorb_elemental_heroic_AuraScript : public AuraScript +{ + PrepareAuraScript(spell_chogall_absorb_elemental_heroic_AuraScript); + + void HandlePeriodic(AuraEffect const* /*aurEff*/) + { + Unit* target = GetTarget(); + InstanceScript* instance = target->GetInstanceScript(); + if (!instance) + return; + + if (Creature* chogall = instance->GetCreature(DATA_CHOGALL)) + if (uint8 stacks = chogall->AI()->GetData(DATA_ELEMENTAL_POWER_STACKS)) + target->CastCustomSpell(GetSpellInfo()->Effects[EFFECT_0].TriggerSpell, SPELLVALUE_AURA_STACK, stacks, target, true); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_chogall_absorb_elemental_heroic_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } +}; + +class spell_chogall_elemental_power : public AuraScript +{ + PrepareAuraScript(spell_chogall_elemental_power); + + void HandlePeriodic(AuraEffect const* /*aurEff*/) + { + if (uint8 stackAmount = std::ceil(GetTarget()->GetHealthPct() / 10)) + if (GetStackAmount() > stackAmount) + SetStackAmount(stackAmount); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_chogall_elemental_power::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } +}; + +class spell_chogall_flaming_destruction_heroic : public AuraScript +{ + PrepareAuraScript(spell_chogall_flaming_destruction_heroic); + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + Unit* caster = GetTarget(); + + Unit* target = eventInfo.GetProcTarget(); + if (!target) + return; + + uint32 spellId = sSpellMgr->GetSpellIdForDifficulty(GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, caster); + SpellInfo const* spell = sSpellMgr->AssertSpellInfo(spellId); + + uint8 stacks = GetStackAmount(); + int32 bp = spell->Effects[EFFECT_0].CalcValue(); + bp += CalculatePct(bp, stacks * 10); + caster->CastCustomSpell(spell->Id, SPELLVALUE_BASE_POINT0, bp, target, true, nullptr, aurEff); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_chogall_flaming_destruction_heroic::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } +}; + +class spell_chogall_empowered_shadows_heroic : public AuraScript +{ + PrepareAuraScript(spell_chogall_empowered_shadows_heroic); + + void HandlePeriodic(AuraEffect const* aurEff) + { + PreventDefaultAction(); + + Unit* caster = GetTarget(); + + uint32 spellId = sSpellMgr->GetSpellIdForDifficulty(GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, caster); + SpellInfo const* spell = sSpellMgr->AssertSpellInfo(spellId); + + uint8 stacks = GetStackAmount(); + int32 bp = spell->Effects[EFFECT_0].CalcValue(); + bp += CalculatePct(bp, stacks * 5); + caster->CastCustomSpell(spell->Id, SPELLVALUE_BASE_POINT0, bp, caster, true, nullptr, aurEff); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_chogall_empowered_shadows_heroic::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } +}; + +class spell_chogall_summon_corrupted_adherent : public SpellScript +{ + PrepareSpellScript(spell_chogall_summon_corrupted_adherent); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( + { + SPELL_SUMMON_CORRUPTING_ADHERENT_LEFT, + SPELL_SUMMON_CORRUPTING_ADHERENT_RIGHT, + }); + } + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + if (Unit* caster = GetCaster()) + { + if (caster->GetMap()->Is25ManRaid() && caster->GetMap()->IsHeroic()) + { + caster->CastSpell(caster, SPELL_SUMMON_CORRUPTING_ADHERENT_LEFT, true); + caster->CastSpell(caster, SPELL_SUMMON_CORRUPTING_ADHERENT_RIGHT, true); + } + else + { + bool left = RAND(0, 1) == 0; + caster->CastSpell(caster, left ? SPELL_SUMMON_CORRUPTING_ADHERENT_LEFT : SPELL_SUMMON_CORRUPTING_ADHERENT_RIGHT, true); + } + } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_chogall_summon_corrupted_adherent::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +class CorruptorDeathStateCheck +{ + public: + CorruptorDeathStateCheck(bool alive) : _alive(alive) { } + + bool operator()(WorldObject* object) + { + if (Unit* target = object->ToUnit()) + return _alive ? target->IsAlive() : target->isDead(); + + return false; + } + private: + bool _alive; + +}; + +class spell_chogall_fester_blood : public SpellScript +{ + PrepareSpellScript(spell_chogall_fester_blood); + + void FilterAliveTargets(std::list& targets) + { + if (targets.empty()) + return; + + targets.remove_if(CorruptorDeathStateCheck(true)); + } + + void FilterDeadTargets(std::list& targets) + { + if (targets.empty()) + return; + + targets.remove_if(CorruptorDeathStateCheck(false)); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_chogall_fester_blood::FilterAliveTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_chogall_fester_blood::FilterDeadTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENTRY); + } +}; + +class spell_chogall_fester_blood_summon : public SpellScript +{ + PrepareSpellScript(spell_chogall_fester_blood_summon); + + void HandleScriptEffect(SpellEffIndex effIndex) + { + for (uint8 i = 0; i < 4; i++) + GetHitUnit()->CastSpell(GetHitUnit(), GetSpellInfo()->Effects[effIndex].BasePoints, true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_chogall_fester_blood_summon::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +class spell_chogall_conversion : public SpellScript +{ + PrepareSpellScript(spell_chogall_conversion); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_WORSHIPPING }); + } + + void FilterTargets(std::list& targets) + { + if (targets.empty()) + return; + + Trinity::Containers::RandomResize(targets, GetCaster()->GetMap()->Is25ManRaid() ? 4 : 2); + } + + void HandleScriptEffect(SpellEffIndex effIndex) + { + if (Unit* target = GetHitUnit()) + { + target->CastStop(); + target->StopMoving(); + target->CastSpell(target, SPELL_WORSHIPPING, true); + } + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_chogall_conversion::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_chogall_conversion::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +class spell_chogall_worshipping : public AuraScript +{ + PrepareAuraScript(spell_chogall_worshipping); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_WORSHIPPING }); + } + + void AfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + + target->CastSpell(target, SPELL_WORSHIPPING_LINKED, true); + if (Player* player = target->ToPlayer()) + player->SetClientControl(player, false); + + if (InstanceScript* instance = target->GetInstanceScript()) + if (Creature* chogall = instance->GetCreature(DATA_CHOGALL)) + target->SetFacingToObject(chogall, true); + } + + void AfterRemmove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + + target->RemoveAurasDueToSpell(SPELL_WORSHIPPING_LINKED); + if (Player* player = target->ToPlayer()) + player->SetClientControl(player, true); + } + + void Register() override + { + AfterEffectApply += AuraEffectApplyFn(spell_chogall_worshipping::AfterApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_chogall_worshipping::AfterRemmove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + } +}; + +class spell_chogall_consume_blood_of_the_old_god : public AuraScript +{ + PrepareAuraScript(spell_chogall_consume_blood_of_the_old_god); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_CONSUME_BLOOD_OF_THE_OLD_GOD_TRIGGERED }); + } + + void AfterRemmove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->CastSpell(GetTarget(), SPELL_CONSUME_BLOOD_OF_THE_OLD_GOD_TRIGGERED, true); + } + + void HandlePeriodic(AuraEffect const* /*aurEff*/) + { + // Blizzard is using two different periodic auras, one for the alive adherents and one for the dead ones. + // Since we cannot filter the targets reliably without risking getting a no-target error when one + // of the target lists is empty, we handle both of them in EFFECT_0 instead. + // On the other hand, we cannot see in sniffs which effect gets applied on which target so we have to assume + // that it works like this so we do not need a duplicate triggered spell in this case + PreventDefaultAction(); + } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_chogall_consume_blood_of_the_old_god::AfterRemmove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_chogall_consume_blood_of_the_old_god::HandlePeriodic, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } +}; + +class spell_chogall_consume_blood_of_the_old_god_triggered : public SpellScript +{ + PrepareSpellScript(spell_chogall_consume_blood_of_the_old_god_triggered); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_CORRUPTED_CHOGALL }); + } + + void HandleScriptEffect(SpellEffIndex effIndex) + { + if (Unit* target = GetHitUnit()) + { + target->CastSpell(target, GetSpellInfo()->Effects[effIndex].BasePoints, true); + target->CastSpell(target, SPELL_CORRUPTED_CHOGALL, true); + } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_chogall_consume_blood_of_the_old_god_triggered::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +class spell_chogall_corruption_significant : public SpellScript +{ + PrepareSpellScript(spell_chogall_corruption_significant); + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + CorruptionHandler::AddCorruption(GetHitUnit(), CORRUPTION_SIGNIFICANT); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_chogall_corruption_significant::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +class spell_chogall_corruption_normal : public SpellScript +{ + PrepareSpellScript(spell_chogall_corruption_normal); + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + CorruptionHandler::AddCorruption(GetHitUnit(), CORRUPTION_NORMAL); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_chogall_corruption_normal::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +class spell_chogall_corruption_normal_alternative : public SpellScript +{ + PrepareSpellScript(spell_chogall_corruption_normal_alternative); + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + CorruptionHandler::AddCorruption(GetHitUnit(), CORRUPTION_NORMAL); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_chogall_corruption_normal_alternative::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +class spell_chogall_corruption_of_the_old_god : public SpellScript +{ + PrepareSpellScript(spell_chogall_corruption_of_the_old_god); + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + CorruptionHandler::AddCorruption(GetHitUnit(), CORRUPTION_NORMAL); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_chogall_corruption_of_the_old_god::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +class spell_chogall_corruption_sickness : public AuraScript +{ + PrepareAuraScript(spell_chogall_corruption_sickness); + + void AfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Player* player = GetTarget()->ToPlayer()) + player->Whisper(ANNOUNCE_CORRUPTION_SICKNESS, player, true); + } + + void Register() override + { + AfterEffectApply += AuraEffectApplyFn(spell_chogall_corruption_sickness::AfterApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + } +}; + +class spell_chogall_corruption_malformation : public AuraScript +{ + PrepareAuraScript(spell_chogall_corruption_malformation); + + void AfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + if (InstanceScript* instance = target->GetInstanceScript()) + if (Creature* chogall = instance->GetCreature(DATA_CHOGALL)) + if (Creature* malformation = chogall->SummonCreature(NPC_MALFORMATION, target->GetPosition())) + malformation->EnterVehicle(target); + } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Vehicle* vehicle = GetTarget()->GetVehicleKit()) + if (Unit* passenger = vehicle->GetPassenger(SEAT_0)) + if (Creature* creature = passenger->ToCreature()) + creature->DespawnOrUnsummon(); + } + + void Register() override + { + AfterEffectApply += AuraEffectApplyFn(spell_chogall_corruption_malformation::AfterApply, EFFECT_0, SPELL_AURA_SET_VEHICLE_ID, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectRemoveFn(spell_chogall_corruption_malformation::OnRemove, EFFECT_0, SPELL_AURA_SET_VEHICLE_ID, AURA_EFFECT_HANDLE_REAL); + } +}; + +class VehicleCheck +{ + public: + VehicleCheck(Unit* _passenger) : passenger(_passenger) { } + + bool operator()(WorldObject* object) + { + return (passenger->GetVehicleBase() && passenger->GetVehicleBase() == object->ToUnit()); + } + private: + Unit* passenger; +}; + +class spell_chogall_shadow_bolt : public SpellScript +{ + PrepareSpellScript(spell_chogall_shadow_bolt); + + void FilterTargets(std::list& targets) + { + if (targets.empty()) + return; + + targets.remove_if(VehicleCheck(GetCaster())); + + Trinity::Containers::RandomResize(targets, 1); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_chogall_shadow_bolt::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + } +}; + +class spell_chogall_debilitating_beam : public AuraScript +{ + PrepareAuraScript(spell_chogall_debilitating_beam); + + void HandlePeriodic(AuraEffect const* /*aurEff*/) + { + CorruptionHandler::AddCorruption(GetTarget(), CORRUPTION_NORMAL); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_chogall_debilitating_beam::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + } +}; + +class achievement_the_anyss_will_gaze_into_you : public AchievementCriteriaScript +{ + public: + achievement_the_anyss_will_gaze_into_you() : AchievementCriteriaScript("achievement_the_anyss_will_gaze_into_you") { } + + bool OnCheck(Player* /*source*/, Unit* target) override + { + if (!target) + return false; + + if (target->IsAIEnabled) + return target->GetAI()->GetData(DATA_ABYSS_WILL_GAZE_INTO_YOU); + + return false; + } +}; + +void AddSC_boss_chogall() +{ + RegisterBastionOfTwilightCreatureAI(boss_chogall); + RegisterBastionOfTwilightCreatureAI(npc_chogall_corrupting_adherent); + RegisterBastionOfTwilightCreatureAI(npc_chogall_blood_of_the_old_god); + RegisterBastionOfTwilightCreatureAI(npc_chogall_portal); + RegisterBastionOfTwilightCreatureAI(npc_chogall_elemental); + RegisterBastionOfTwilightCreatureAI(npc_chogall_malformation); + RegisterBastionOfTwilightCreatureAI(npc_chogall_darkened_creation); + RegisterBastionOfTwilightCreatureAI(npc_chogall_spiked_tentacle); + RegisterSpellScript(spell_chogall_absorb_elemental_reverse_cast); + RegisterSpellScript(spell_chogall_absorb_elemental); + RegisterSpellAndAuraScriptPair(spell_chogall_absorb_elemental_heroic, spell_chogall_absorb_elemental_heroic_AuraScript); + RegisterAuraScript(spell_chogall_elemental_power); + RegisterAuraScript(spell_chogall_flaming_destruction_heroic); + RegisterAuraScript(spell_chogall_empowered_shadows_heroic); + RegisterSpellScript(spell_chogall_summon_corrupted_adherent); + RegisterSpellScript(spell_chogall_fester_blood); + RegisterSpellScript(spell_chogall_fester_blood_summon); + RegisterSpellScript(spell_chogall_conversion); + RegisterAuraScript(spell_chogall_worshipping); + RegisterAuraScript(spell_chogall_consume_blood_of_the_old_god); + RegisterSpellScript(spell_chogall_consume_blood_of_the_old_god_triggered); + RegisterSpellScript(spell_chogall_corruption_significant); + RegisterSpellScript(spell_chogall_corruption_normal); + RegisterSpellScript(spell_chogall_corruption_normal_alternative); + RegisterSpellScript(spell_chogall_corruption_of_the_old_god); + RegisterAuraScript(spell_chogall_corruption_sickness); + RegisterAuraScript(spell_chogall_corruption_malformation); + RegisterSpellScript(spell_chogall_shadow_bolt); + RegisterAuraScript(spell_chogall_debilitating_beam); + new achievement_the_anyss_will_gaze_into_you(); +} diff --git a/src/server/scripts/EasternKingdoms/BastionOfTwilight/instance_bastion_of_twilight.cpp b/src/server/scripts/EasternKingdoms/BastionOfTwilight/instance_bastion_of_twilight.cpp index aedbf01ec69..c6a2bcaa110 100644 --- a/src/server/scripts/EasternKingdoms/BastionOfTwilight/instance_bastion_of_twilight.cpp +++ b/src/server/scripts/EasternKingdoms/BastionOfTwilight/instance_bastion_of_twilight.cpp @@ -40,13 +40,15 @@ ObjectData const creatureData[] = { BOSS_SINESTRA, DATA_SINESTRA }, { NPC_PROTO_BEHEMOTH, DATA_PROTO_BEHEMOTH }, { NPC_ASCENDANT_COUNCIL_CONTROLLER, DATA_ASCENDANT_COUNCIL_CONTROLLER }, + { NPC_CORRUPTION, DATA_CORRUPTION }, { 0, 0 } // END }; ObjectData const gameobjectData[] = { - { GO_WHELP_CAGE, DATA_WHELP_CAGE }, - { 0, 0 } // END + { GO_WHELP_CAGE, DATA_WHELP_CAGE }, + { GO_GRIM_BATOL_RAID_TRAP_DOOR, DATA_GRIM_BATOL_RAID_TRAP_DOOR }, + { 0, 0 } // END }; DoorData const doorData[] = @@ -89,6 +91,7 @@ class instance_bastion_of_twilight : public InstanceMapScript _unresponsiveDragonEntrySecond = 0; _deadOrphanedEmeraldWhelps = 0; _lastAreatriggerIndex = 0; + _fullHeroicId = instance->IsHeroic(); _valionaAuraDummyGUID = ObjectGuid::Empty; GenerateHalfusDragonData(); } @@ -162,6 +165,10 @@ class instance_bastion_of_twilight : public InstanceMapScript if (creature->isDead() && GetBossState(DATA_ASCENDANT_COUNCIL) != DONE) creature->Respawn(); break; + case NPC_SPIKED_TENTACLE_TRIGGER: + if (Creature* chogall = GetCreature(DATA_CHOGALL)) + chogall->AI()->JustSummoned(creature); + break; default: break; } @@ -170,6 +177,9 @@ class instance_bastion_of_twilight : public InstanceMapScript void OnGameObjectCreate(GameObject* go) override { InstanceScript::OnGameObjectCreate(go); + + if (go->GetEntry() == GO_GRIM_BATOL_RAID_TRAP_DOOR && instance->IsHeroic() && _fullHeroicId && GetBossState(DATA_CHOGALL) == DONE) + go->SetGoState(GO_STATE_ACTIVE); } bool SetBossState(uint32 type, EncounterState state) override @@ -284,11 +294,16 @@ class instance_bastion_of_twilight : public InstanceMapScript for (ObjectGuid guid : _unstableTwilightGUIDs) if (Creature* creature = instance->GetCreature(guid)) creature->DespawnOrUnsummon(); + + events.ScheduleEvent(EVENT_CHOGALL_TALK_THERALION_AND_VALIONA_DEAD, 6s); } break; default: break; } + + if (state == DONE && !instance->IsHeroic()) + _fullHeroicId = 0; return true; } @@ -334,7 +349,7 @@ class instance_bastion_of_twilight : public InstanceMapScript if (entry == NPC_TIME_WARDEN) { protoBehemoth->AI()->DoAction(ACTION_ENABLE_FIREBALL_BARRAGE); - events.RescheduleEvent(EVENT_CAST_DANCING_FLAMES, Milliseconds(500), Seconds(1)); + events.RescheduleEvent(EVENT_CAST_DANCING_FLAMES, 500ms, 1s); } } } @@ -357,7 +372,7 @@ class instance_bastion_of_twilight : public InstanceMapScript if (_lastAreatriggerIndex < AT_INDEX_THERALION_AND_VALIONA_INTRO) { if (Creature* chogall = GetCreature(DATA_CHOGALL)) - chogall->AI()->DoAction(ACTION_TALK_INTRO_THERALION_AND_VALIONA); + chogall->AI()->DoAction(ACTION_TALK_THERALION_AND_VALIONA_INTRO); if (Creature* theralion = GetCreature(DATA_THERALION)) theralion->AI()->DoAction(ACTION_START_ARGUMENT_INTRO); @@ -369,6 +384,46 @@ class instance_bastion_of_twilight : public InstanceMapScript SaveToDB(); } break; + case DATA_AT_ASCENDANT_COUNCIL_INTRO_1: + if (_lastAreatriggerIndex < AT_INDEX_ASCENDANT_COUNCIL_INTRO_1) + { + if (Creature* chogall = GetCreature(DATA_CHOGALL)) + chogall->AI()->DoAction(ACTION_TALK_ASCENDANT_COUNCIL_INTRO_1); + + _lastAreatriggerIndex = AT_INDEX_ASCENDANT_COUNCIL_INTRO_1; + SaveToDB(); + } + break; + case DATA_AT_ASCENDANT_COUNCIL_INTRO_2: + if (_lastAreatriggerIndex < AT_INDEX_ASCENDANT_COUNCIL_INTRO_2) + { + if (Creature* chogall = GetCreature(DATA_CHOGALL)) + chogall->AI()->DoAction(ACTION_TALK_ASCENDANT_COUNCIL_INTRO_2); + + _lastAreatriggerIndex = AT_INDEX_ASCENDANT_COUNCIL_INTRO_2; + SaveToDB(); + } + break; + case DATA_AT_ASCENDANT_COUNCIL_INTRO_3: + if (_lastAreatriggerIndex < AT_INDEX_ASCENDANT_COUNCIL_INTRO_3) + { + if (Creature* chogall = GetCreature(DATA_CHOGALL)) + chogall->AI()->DoAction(ACTION_TALK_ASCENDANT_COUNCIL_INTRO_3); + + _lastAreatriggerIndex = AT_INDEX_ASCENDANT_COUNCIL_INTRO_3; + SaveToDB(); + } + break; + case DATA_AT_CHOGALL_INTRO: + if (_lastAreatriggerIndex < AT_INDEX_CHOGALL_INTRO) + { + if (Creature* chogall = GetCreature(DATA_CHOGALL)) + chogall->AI()->DoAction(ACTION_TALK_CHOGALL_INTRO); + + _lastAreatriggerIndex = AT_INDEX_CHOGALL_INTRO; + SaveToDB(); + } + break; default: break; } @@ -405,8 +460,10 @@ class instance_bastion_of_twilight : public InstanceMapScript portalCount++; return portalCount; } + case DATA_FULL_HEROIC_ID: + return _fullHeroicId; default: - break; + return 0; } return 0; } @@ -424,7 +481,11 @@ class instance_bastion_of_twilight : public InstanceMapScript if (Creature* cataclysmStalker = instance->GetCreature(guid)) cataclysmStalker->CastSpell(cataclysmStalker, SPELL_DANCING_FLAMES_VISUAL, true); - events.Repeat(Milliseconds(500), Seconds(1)); + events.Repeat(500ms, 1s); + break; + case EVENT_CHOGALL_TALK_THERALION_AND_VALIONA_DEAD: + if (Creature* chogall = GetCreature(DATA_CHOGALL)) + chogall->AI()->DoAction(ACTION_TALK_THERALION_AND_VALIONA_DEAD); break; default: break; @@ -436,7 +497,8 @@ class instance_bastion_of_twilight : public InstanceMapScript { data << _unresponsiveDragonEntryFirst << ' ' << _unresponsiveDragonEntrySecond << ' ' - << _lastAreatriggerIndex; + << _lastAreatriggerIndex << ' ' + << _fullHeroicId; } void ReadSaveDataMore(std::istringstream& data) override @@ -444,6 +506,7 @@ class instance_bastion_of_twilight : public InstanceMapScript data >> _unresponsiveDragonEntryFirst; data >> _unresponsiveDragonEntrySecond; data >> _lastAreatriggerIndex; + data >> _fullHeroicId; if (_unresponsiveDragonEntryFirst && _unresponsiveDragonEntrySecond) { @@ -476,6 +539,7 @@ class instance_bastion_of_twilight : public InstanceMapScript uint32 _unresponsiveDragonEntrySecond; uint8 _deadOrphanedEmeraldWhelps; uint8 _lastAreatriggerIndex; + uint8 _fullHeroicId; }; InstanceScript* GetInstanceScript(InstanceMap* map) const override diff --git a/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp b/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp index 02a6cc3cfb2..761eaba8982 100644 --- a/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp +++ b/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp @@ -29,6 +29,7 @@ void AddSC_bastion_of_twilight(); //Bastion of Twilight void AddSC_boss_halfus_wyrmbreaker(); void AddSC_boss_theralion_and_valiona(); void AddSC_boss_ascendant_council(); +void AddSC_boss_chogall(); void AddSC_instance_bastion_of_twilight(); void AddSC_boss_romogg_bonecrusher(); //Blackrock Caverns void AddSC_boss_corla(); @@ -243,6 +244,7 @@ void AddEasternKingdomsScripts() AddSC_boss_halfus_wyrmbreaker(); AddSC_boss_theralion_and_valiona(); AddSC_boss_ascendant_council(); + AddSC_boss_chogall(); AddSC_instance_bastion_of_twilight(); AddSC_boss_romogg_bonecrusher(); //Blackrock Caverns AddSC_boss_corla();