Scripts/BT: full instance rewrite

This commit is contained in:
Keader authored and Ovahlord committed 2020-11-05 17:42:33 +01:00
1 parent 398ee2dfcd
commit 3b2ef0ec45
15 files changed
+5754 -5594

No files matched your search

@@ -0,0 +1,892 @@
--
DELETE FROM `creature_summon_groups` WHERE `summonerId`=22841; -- Shade of Akama
INSERT INTO `creature_summon_groups` (`summonerId`,`summonerType`,`groupId`,`entry`,`position_x`,`position_y`,`position_z`,`orientation`,`summonType`,`summonTime`) VALUES
(22841,0,1,23421,443.495,413.973,118.621,5.13127 ,6,6000),-- Ashtongue Channeler
(22841,0,1,23421,456.694,414.117,118.621,4.2586 ,6,6000),
(22841,0,1,23421,457.763,390.117,118.621,2.25148 ,6,6000),
(22841,0,1,23421,444.153,389.214,118.621,1.0821 ,6,6000),
(22841,0,1,23421,438.279,401.258,118.621,0.017453,6,6000),
(22841,0,1,23421,463.186,401.64 ,118.621,3.19395 ,6,6000),
(22841,0,1,23191,547.186,400.534,112.867,3.12414 ,8, 0); -- Akama
DELETE FROM `creature` WHERE `id` IN (23191,23421);
DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_shade_soul_channel_serverside','spell_shade_soul_channel');
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(40401,'spell_shade_soul_channel_serverside'),
(40520,'spell_shade_soul_channel');
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=40902;
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(13,2,40902,0,1,31,0,3,22841,0,0,0,0,'','Effect_1 - Hits Shade of Akama'),
(13,4,40902,0,2,31,0,3,23351,0,0,0,0,'','Effect_2 - Hits Trigger');
UPDATE `creature_template` SET `mechanic_immune_mask`=618610687 WHERE `entry`=23215; -- Ashtongue Sorcerer Immunity
UPDATE `creature_template` SET `ScriptName`='npc_ashtongue_broken' WHERE `entry`=23319;
UPDATE `creature_template` SET `speed_run`=0.571429 WHERE `entry`=22841;
DELETE FROM `creature_text` WHERE `CreatureID`=23191 AND `groupid` IN (3,4);
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
(23191,3,0,'I will not last much longer!',14,0,100,0,0,11385,21784,0,'Akama SAY_LOW_HEALTH'),
(23191,4,0,'No! Not yet!',14,0,100,0,0,11386,21785,0,'Akama SAY_DEAD');
-- Waypoints
-- Middle Creatures
SET @NPC := 12806;
SET @PATH := @NPC * 10;
UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=489.6115,`position_y`=407.0968,`position_z`=112.7839 WHERE `guid`=@NPC;
UPDATE `creature` SET `MovementType`=0, `spawndist`=0 WHERE `guid`=12805;
DELETE FROM `creature_addon` WHERE `guid`=@NPC;
INSERT INTO `creature_addon` (`guid`,`waypointPathId`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES
(@NPC,@PATH,0,0,1,0, '');
DELETE FROM `waypoint_data` WHERE `id`=@PATH;
INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
(@PATH,1,489.6115,407.0968,112.7839,0,0,0,0,100,0),
(@PATH,2,521.2068,407.0993,112.7837,0,0,0,0,100,0);
DELETE FROM `creature_formations` WHERE `LeaderGUID`=@NPC;
INSERT INTO `creature_formations` (`LeaderGUID`, `MemberGUID`, `FollowDistance`, `FollowAngle`, `GroupAI`, `InversionPoint1`, `InversionPoint2`) VALUES
(@NPC,@NPC ,0, 0,1,-1,-1),
(@NPC,12805,6,90,2,1,2);
-- Side Creatures
SET @NPC := 12780;
SET @PATH := @NPC * 10;
UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=528.3928,`position_y`=429.879,`position_z`=113.0337 WHERE `guid`=@NPC;
DELETE FROM `creature_addon` WHERE `guid`=@NPC;
INSERT INTO `creature_addon` (`guid`,`waypointPathId`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES
(@NPC,@PATH,0,0,1,0, '');
DELETE FROM `waypoint_data` WHERE `id`=@PATH;
INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
(@PATH,1,528.3928, 429.879,113.0337,0,0,0,0,100,0),
(@PATH,2, 506.946,432.0048,113.0337,0,0,0,0,100,0),
(@PATH,3,500.5693,414.4586,113.0338,0,0,0,0,100,0),
(@PATH,4, 506.946,432.0048,113.0337,0,0,0,0,100,0);
SET @NPC := 12782;
SET @PATH := @NPC * 10;
UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=516.83,`position_y`=368.9177,`position_z`=113.0337 WHERE `guid`=@NPC;
DELETE FROM `creature_addon` WHERE `guid`=@NPC;
INSERT INTO `creature_addon` (`guid`,`waypointPathId`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES
(@NPC,@PATH,0,0,1,0, '');
DELETE FROM `waypoint_data` WHERE `id`=@PATH;
INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
(@PATH,1, 501.718,381.9136,113.0337,0,0,0,0,100,0),
(@PATH,2, 507.699,369.5598,113.0337,0,0,0,0,100,0),
(@PATH,3,527.0941,372.4955,113.0337,0,0,0,0,100,0),
(@PATH,4, 507.699,369.5598,113.0337,0,0,0,0,100,0);
UPDATE `creature` SET `MovementType`=0, `spawndist`=0 WHERE `guid` IN (12804,12814,12791,12807,12815,12793);
DELETE FROM `creature_formations` WHERE `LeaderGUID` IN (12780,12782);
INSERT INTO `creature_formations` (`LeaderGUID`, `MemberGUID`, `FollowDistance`, `FollowAngle`, `GroupAI`, `InversionPoint1`, `InversionPoint2`) VALUES
(12780,12780,0, 0,1,-1,-1),
(12780,12804,5, 30,1,3,1),
(12780,12814,8, 45,1,3,1),
(12780,12791,5,315,1,3,1),
(12782,12782,0, 0,1,-1,-1),
(12782,12807,5,290,1,1,3),
(12782,12815,8,315,1,1,3),
(12782,12793,5, 45,1,1,3);
UPDATE `creature_template_addon` SET `auras`='39839' WHERE `entry`=22853;
UPDATE `creature_template_addon` SET `auras`='41191 34189' WHERE `entry`=23374;
-- Add Ashtongue Stalker's
SET @CGUID := 86283;
DELETE FROM `creature` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+8;
INSERT INTO `creature` (`guid`, `id`, `map`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `curhealth`) VALUES
(@CGUID+0, 23374, 564, 656.2982, 387.9902, 112.7728, 2.478368, 7200, 0), -- 23374 (Area: 4009) (Auras: 41191 - 41191) (possible waypoints or random movement)
(@CGUID+1, 23374, 564, 707.5325, 352.4765, 125.2653, 1.32645, 7200, 0), -- 23374 (Area: 4009) (Auras: 41191 - 41191)
(@CGUID+2, 23374, 564, 769.7925, 370.5881, 112.8415, 0.6128875, 7200, 0), -- 23374 (Area: 4009) (Auras: 41191 - 41191)
(@CGUID+3, 23374, 564, 702.7503, 352.3887, 125.2664, 1.972222, 7200, 0), -- 23374 (Area: 4009) (Auras: 41191 - 41191)
(@CGUID+4, 23374, 564, 666.9014, 290.3525, 125.2559, 3.176499, 7200, 0), -- 23374 (Area: 4009) (Auras: 41191 - 41191)
(@CGUID+5, 23374, 564, 740.3699, 286.297, 125.2686, 5.113815, 7200, 0), -- 23374 (Area: 4009) (Auras: 41191 - 41191)
(@CGUID+6, 23374, 564, 669.1512, 286.5623, 125.2573, 4.24115, 7200, 0), -- 23374 (Area: 4009) (Auras: 41191 - 41191) (possible waypoints or random movement)
(@CGUID+7, 23374, 564, 742.5994, 290.4014, 125.2681, 0.05235988, 7200, 0), -- 23374 (Area: 4009) (Auras: 41191 - 41191)
(@CGUID+8, 23374, 564, 631.986, 251.5276, 112.749, 2.80998, 7200, 0); -- 23374 (Area: 0) (Auras: 41191 - 41191, 34189 - 34189)
DELETE FROM `creature_formations` WHERE `LeaderGUID`=12827;
INSERT INTO `creature_formations` (`LeaderGUID`, `MemberGUID`, `FollowDistance`, `FollowAngle`, `GroupAI`) VALUES
(12827, 12827, 0, 0, 2),
(12827, 12840, 10, 90, 2),
(12827, 12824, 10, 270, 2);
-- Pathing for Illidari Nightlord Entry: 22855 'TDB FORMAT'
SET @NPC := 12827;
SET @PATH := @NPC * 10;
UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=797.9049,`position_y`=255.5211,`position_z`=113.0057 WHERE `guid`=@NPC;
DELETE FROM `creature_addon` WHERE `guid`=@NPC;
INSERT INTO `creature_addon` (`guid`,`waypointPathId`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
DELETE FROM `waypoint_data` WHERE `id`=@PATH;
INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
(@PATH,1,797.9049,255.5211,113.0057,0,0,0,0,100,0), -- 21:33:21
(@PATH,2,799.5116,265.5505,112.9946,0,0,0,0,100,0), -- 21:34:44
(@PATH,3,799.6346,277.1103,112.9948,0,0,0,0,100,0), -- 21:33:26
(@PATH,4,799.4362,303.9547,113.0016,0,0,0,0,100,0), -- 21:33:31
(@PATH,5,799.0039,333.6956,113.0056,0,0,0,0,100,0), -- 21:34:33
(@PATH,6,799.1071,339.8928,113.0009,0,0,0,0,100,0), -- 21:33:37
(@PATH,7,798.9255,345.5464,113.0027,0,0,0,0,100,0), -- 21:33:42
(@PATH,8,798.3091,375.1995,112.9979,0,0,0,0,100,0), -- 21:33:47
(@PATH,9,796.5051,380.055,112.9991,0,0,0,0,100,0), -- 21:34:21
(@PATH,10,790.2986,393.373,113.0041,0,0,0,0,100,0), -- 21:33:49
(@PATH,11,788.781,396.0202,112.9945,0,0,0,0,100,0), -- 21:33:53
(@PATH,12,776.2429,410.9937,112.9996,0,0,0,0,100,0), -- 21:34:17
(@PATH,13,769.3853,414.8633,112.9868,0,0,0,0,100,0), -- 21:34:12
(@PATH,14,759.0627,420.3231,112.9865,0,0,0,0,100,0), -- 21:33:58
(@PATH,15,755.8228,421.9212,112.7266,0,0,0,0,100,0), -- 21:34:08
(@PATH,16,730.3083,422.5441,112.9883,0,0,0,0,100,0), -- 21:34:02
(@PATH,17,755.8228,421.9212,112.7266,0,0,0,0,100,0), -- 21:34:08
(@PATH,18,759.0627,420.3231,112.9865,0,0,0,0,100,0), -- 21:33:58
(@PATH,19,769.3853,414.8633,112.9868,0,0,0,0,100,0), -- 21:34:12
(@PATH,20,776.2429,410.9937,112.9996,0,0,0,0,100,0), -- 21:34:17
(@PATH,21,788.781,396.0202,112.9945,0,0,0,0,100,0), -- 21:33:53
(@PATH,22,790.2986,393.373,113.0041,0,0,0,0,100,0), -- 21:33:49
(@PATH,23,796.5051,380.055,112.9991,0,0,0,0,100,0), -- 21:34:21
(@PATH,24,798.2438,374.1577,112.9994,0,0,0,0,100,0), -- 21:34:25
(@PATH,25,798.8231,345.4242,112.9964,0,0,0,0,100,0), -- 21:34:28
(@PATH,26,799.1071,339.8928,113.0009,0,0,0,0,100,0), -- 21:33:37
(@PATH,27,799.0039,333.6956,113.0056,0,0,0,0,100,0), -- 21:34:33
(@PATH,28,799.4362,303.9547,113.0016,0,0,0,0,100,0), -- 21:33:31
(@PATH,29,799.7034,286.332,113.0002,0,0,0,0,100,0), -- 21:34:38
(@PATH,30,799.6346,277.1103,112.9948,0,0,0,0,100,0), -- 21:33:26
(@PATH,31,799.5116,265.5505,112.9946,0,0,0,0,100,0); -- 21:34:44
-- 0x1C16F446801651C0006A5B00009D4B4E .go 797.9049 255.5211 113.0057
DELETE FROM `creature_formations` WHERE `LeaderGUID`=12826;
INSERT INTO `creature_formations` (`LeaderGUID`, `MemberGUID`, `FollowDistance`, `FollowAngle`, `GroupAI`) VALUES
(12826, 12826, 0, 0, 2),
(12826, 12835, 10, 90, 2),
(12826, 12821, 10, 270, 2);
-- Pathing for Illidari Nightlord Entry: 22855 'TDB FORMAT'
SET @NPC := 12826;
SET @PATH := @NPC * 10;
UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=671.0103,`position_y`=418.0573,`position_z`=112.9719 WHERE `guid`=@NPC;
DELETE FROM `creature_addon` WHERE `guid`=@NPC;
INSERT INTO `creature_addon` (`guid`,`waypointPathId`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
DELETE FROM `waypoint_data` WHERE `id`=@PATH;
INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
(@PATH,1,671.0103,418.0573,112.9719,0,0,0,0,100,0), -- 21:30:49
(@PATH,2,664.3151,418.1411,112.9714,0,0,0,0,100,0), -- 21:30:58
(@PATH,3,643.6459,416.9381,112.9693,0,0,0,0,100,0), -- 21:32:19
(@PATH,4,633.8777,410.9504,112.9694,0,0,0,0,100,0), -- 21:31:04
(@PATH,5,625.0879,404.1424,112.968,0,0,0,0,100,0), -- 21:31:09
(@PATH,6,616.4854,383.6906,112.9617,0,0,0,0,100,0), -- 21:32:08
(@PATH,7,609.0042,357.2156,112.9686,0,0,0,0,100,0), -- 21:31:12
(@PATH,8,608.3771,346.3979,112.973,0,0,0,0,100,0), -- 21:32:05
(@PATH,9,608.604,340.5182,112.9734,0,0,0,0,100,0), -- 21:31:20
(@PATH,10,608.3019,334.7826,112.9586,0,0,0,0,100,0), -- 21:31:23
(@PATH,11,608.424,297.6053,112.9599,0,0,0,0,100,0), -- 21:31:49
(@PATH,12,607.9512,258.337,112.967,0,0,0,0,100,0), -- 21:31:29
(@PATH,13,614.2401,245.8512,112.9672,0,0,0,0,100,0), -- 21:31:39
(@PATH,14,608.4531,256.4178,112.9667,0,0,0,0,100,0), -- 21:31:45
(@PATH,15,608.424,297.6053,112.9599,0,0,0,0,100,0), -- 21:31:49
(@PATH,16,608.3019,334.7826,112.9586,0,0,0,0,100,0), -- 21:31:23
(@PATH,17,608.604,340.5182,112.9734,0,0,0,0,100,0), -- 21:31:20
(@PATH,18,608.3771,346.3979,112.973,0,0,0,0,100,0), -- 21:32:05
(@PATH,19,609.0042,357.2156,112.9686,0,0,0,0,100,0), -- 21:31:12
(@PATH,20,616.4854,383.6906,112.9617,0,0,0,0,100,0), -- 21:32:08
(@PATH,21,625.0543,404.2943,112.965,0,0,0,0,100,0), -- 21:32:16
(@PATH,22,633.8777,410.9504,112.9694,0,0,0,0,100,0), -- 21:31:04
(@PATH,23,643.6459,416.9381,112.9693,0,0,0,0,100,0), -- 21:32:19
(@PATH,24,664.3151,418.1411,112.9714,0,0,0,0,100,0); -- 21:30:58
-- 0x1C16F446801651C0006A5B00001D4B4E .go 671.0103 418.0573 112.9719
-- Disable PathFinding for High Warlord Naj'entus
UPDATE `creature_template` SET `flags_extra`=`flags_extra`|536870912 WHERE `entry`=22887;
UPDATE `creature_addon` SET `auras`=19818 WHERE `guid`=40527;
DELETE FROM `spell_script_names` WHERE `ScriptName`= 'spell_najentus_needle_spine';
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(39992,'spell_najentus_needle_spine');
DELETE FROM `creature_text` WHERE `CreatureID`=22887 AND (`GroupID` IN(5,6) OR (`GroupID`=4 AND `ID`=1));
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
(22887,4,1,'My patience has run out! Die! Die!',14,0,100,0,0,11458,21096,0,"High Warlord Naj'entus SAY_ENRAGE2"),
(22887,5,0,'Lord Illidan will... crush you!',14,0,100,0,0,11459,21093,0,"High Warlord Naj'entus SAY_DEATH");
UPDATE `creature_text` SET `Text`='Stick around...',`BroadcastTextId`=21089 WHERE `CreatureID`=22887 AND `GroupID`=1 AND `ID`=0;
-- Fixed speed for Supremus
UPDATE `creature_template` SET `speed_walk`=2.4, `speed_run`=2.14286 WHERE `entry`=22898;
-- Added unit_flag UNIT_FLAG_NOT_SELECTABLE in Supremus Volcano
UPDATE `creature_template` SET `unit_flags`=`unit_flags`|33554432 WHERE `entry`=23085;
-- Updated script name of creature Molten Flame
UPDATE `creature_template` SET `ScriptName`='npc_molten_flame' WHERE `entry`=23095;
-- Added aura Acidic Wound on Gurtogg Bloodboil
DELETE FROM `creature_addon` where `guid`=52761;
INSERT INTO `creature_addon` (`guid`, `waypointPathId`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
(52761, 0, 0, 0, 0, 0, 40484);
-- SpellScripts
DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_gurtogg_bloodboil_insignificance';
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(40618, 'spell_gurtogg_bloodboil_insignificance');
-- Added creature script in Fel Geyser creature
UPDATE `creature_template` SET `ScriptName`='npc_fel_geyser' WHERE `entry`=23254;
-- Conditions for spell Taunt Gurtogg
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=40603;
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(13,3,40603,0,0,31,0,3,22948,0,0,0,0,'','Effect_0 and Effect_1 - Hits Gurtogg Bloodboil');
-- Fix Texts
UPDATE `creature_text` SET `Text`='I hunger.',`BroadcastTextId`=21744 WHERE `CreatureID`=22948 AND `GroupID`=2 AND `ID`=1;
DELETE FROM `creature_text` WHERE `CreatureID`=22948 AND `GroupID`IN(3,4);
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
(22948,3,0,'I\'ll rip the meat from your bones!',14,0,100,0,0,11438,21745,0,'bloodboil SAY_ENRAGE');
DELETE FROM `creature_text` WHERE CreatureID=22984;
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
(22984, 0, 0, 'You hear a loud rumble of metal grinding on stone...', 16, 0, 100, 0, 0, 0, 18600, 2, "Black Temple Trigger - when High Warlord Naj'entus dies - Emote"),
(22984, 1, 0, 'The door to The Den of Mortal Delights has opened.', 16, 0, 100, 0, 0, 0, 21494, 2, 'Black Temple Trigger - when Lower Temple Defeated - Emote');
-- Add missing spells to Ghost (Vengeful Spirit)
UPDATE `creature_template` SET `spell1`=40325, `spell3`=40157, `spell4`=40175, `spell5`=40314, `spell7`=40322 WHERE `entry`=23109;
-- Add missing auras in Shadowy Construct
DELETE FROM `creature_template_addon` WHERE `entry`=23111;
INSERT INTO `creature_template_addon` (`entry`, `waypointPathId`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
(23111, 0, 0, 0, 0, 0, '40326 40334');
-- Teron Gorefiend texts
DELETE FROM `creature_text` where `CreatureID`= 22871;
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
(22871, 0, 0, 'I was the first you know. For me the wheel of death has spun many times. So much time has passed... I have a lot of catching up to do.' , 14, 0, 100, 0, 0, 11512, 21098, 0, 'Teron Gorefiend SAY_INTRO'),
(22871, 1, 0, 'Vengeance is mine!', 14, 0, 100, 0, 0, 11513, 21097, 0, 'Teron Gorefiend SAY_AGGRO'),
(22871, 2, 0, 'I have use for you...', 14, 0, 100, 0, 0, 11514, 21099, 0, 'Teron Gorefiend SAY_SLAY1'),
(22871, 2, 1, 'It gets worse.', 14, 0, 100, 0, 0, 11515, 21100, 0, 'Teron Gorefiend SAY_SLAY2'),
(22871, 3, 0, 'What are you afraid of?', 14, 0, 100, 0, 0, 11517, 21102, 0, 'Teron Gorefiend SAY_INCINERATE1'),
(22871, 3, 1, 'You will show the proper respect!', 14, 0, 100, 0, 0, 11520, 21105, 0, 'Teron Gorefiend SAY_INCINERATE2'),
(22871, 4, 0, "Death really isn't so bad.", 14, 0, 100, 0, 0, 11516, 21101, 0, 'Teron Gorefiend SAY_DOOM_BLOSSOM1'),
(22871, 4, 1, 'I have something for you...', 14, 0, 100, 0, 0, 11519, 21104, 0, 'Teron Gorefiend SAY_DOOM_BLOSSOM2'),
(22871, 5, 0, 'Give in.', 14, 0, 100, 0, 0, 11518, 21103, 0, 'Teron Gorefiend SPELL_CRUSHING_SHADOWS'),
(22871, 6, 0, 'The wheel... spins... again.', 14, 0, 100, 0, 0, 11521, 21106, 0, 'Teron Gorefiend SAY_DEATH');
-- Area Trigger
DELETE FROM `areatrigger_scripts` WHERE `entry`=4665;
INSERT INTO `areatrigger_scripts` (`entry`, `ScriptName`) VALUES
(4665,'at_teron_gorefiend_entrance');
-- Spell scripts
DELETE FROM `spell_script_names` WHERE `ScriptName` IN('spell_teron_gorefiend_spiritual_vengeance','spell_teron_gorefiend_shadow_of_death','spell_teron_gorefiend_shadow_of_death_remove');
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(40268,'spell_teron_gorefiend_spiritual_vengeance'),
(40251,'spell_teron_gorefiend_shadow_of_death'),
(41999,'spell_teron_gorefiend_shadow_of_death_remove');
-- Conditions
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=40268;
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(13,3,40268,0,0,31,0,3,23109,0,0,0,0,'','Effect_0 and Effect_1 hits Vengeful Spirit');
UPDATE `creature_template` SET `AIName`='' WHERE `entry`=23472;
-- Condition for spell Fixate
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=41295;
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(13,1,41295,0,0,31,0,3,23418,0,0,0,0,'','Effect_0 hits Essence of Suffering');
DELETE FROM `creature_template_addon` WHERE `entry`=23418;
INSERT INTO `creature_template_addon` (`entry`, `waypointPathId`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
(23418, 0, 0, 0, 1, 0,'41296 41623');
DELETE FROM `spell_script_names` WHERE `ScriptName` IN('spell_reliquary_of_souls_aura_of_desire','spell_reliquary_of_souls_submerge','spell_reliquary_of_souls_spite','spell_soul_fragment_anger','spell_reliquary_of_souls_frenzy');
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(41350,'spell_reliquary_of_souls_aura_of_desire'),
(28819,'spell_reliquary_of_souls_submerge'),
(41376,'spell_reliquary_of_souls_spite'),
(41986,'spell_soul_fragment_anger'),
(41305,'spell_reliquary_of_souls_frenzy');
DELETE FROM `spell_linked_spell` WHERE `spell_trigger`=-41376 AND`spell_effect`=41377 AND`type`=0;
UPDATE `creature_template` SET `modelid1`=11686, `modelid2`=1126, `flags_extra`=0, `ScriptName`='npc_angered_soul_fragment' WHERE `entry`=23398;
DELETE FROM `spell_proc` WHERE `SpellId`=41350;
INSERT INTO `spell_proc` (`SpellId`, `SchoolMask`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `ProcFlags`, `SpellTypeMask`, `SpellPhaseMask`, `HitMask`, `AttributesMask`, `ProcsPerMinute`, `Chance`, `Cooldown`, `Charges`) VALUES
(41350, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0x0, 0x2, 0, 0, 0, 0);
DELETE FROM `creature_text` WHERE `CreatureID`=23418;
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
(23418,0,0,'Pain and suffering are all that await you!',14,0,100,0,0,11415,21759,0,'SUFF_SAY_AGRO'),
(23418,1,0,'Don\'t leave me alone!',14,0,100,0,0,11416,21760,0,'SUFF_SAY_SLAY'),
(23418,1,1,'Look at what you made me do!',14,0,100,0,0,11417,21761,0,'SUFF_SAY_SLAY2'),
(23418,1,2,'I didn\'t ask for this!',14,0,100,0,0,11418,21762,0,'SUFF_SAY_SLAY3'),
(23418,2,0,'The pain is only beginning...',14,0,100,0,0,11419,21763,0,'SUFF_SAY_ENRAGE'),
(23418,3,0,'I don\'t want to go back!',14,0,100,0,0,11420,21764,0,'SUFF_SAY_RECAP'),
(23418,4,0,'Now what do I do?',14,0,100,0,0,11421,21765,0,'SUFF_SAY_AFTER'),
(23418,5,0,'%s becomes enraged!',41,0,100,0,0,0,24144,0,'SUFF_EMOTE_ENRAGE');
DELETE FROM `creature_text` WHERE `CreatureID`=23419;
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
(23419,0,0,'You can have anything you desire... for a price.',14,0,100,0,0,11408,21752,0,'DESI_SAY_FREED'),
(23419,1,0,'Fulfillment is at hand.',14,0,100,0,0,11409,21753,0,'DESI_SAY_SLAY1'),
(23419,1,1,'Yes, you\'ll stay with us now...',14,0,100,0,0,11410,21754,0,'DESI_SAY_SLAY2'),
(23419,1,2,'Your reach exceeds your grasp.',14,0,100,0,0,11412,21756,0,'DESI_SAY_SLAY3'),
(23419,2,0,'Be careful what you wish for.',14,0,100,0,0,11411,21755,0,'DESI_SAY_SPEC'),
(23419,3,0,'I won\'t be far!',14,0,100,0,0,11414,21758,0,'DESI_SAY_RECAP'),
(23419,4,0,'I\'ll be waiting.',14,0,100,0,0,11413,21757,0,'DESI_SAY_AFTER');
DELETE FROM `creature_text` WHERE `CreatureID`=23420;
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
(23420,0,0,'Beware: I live!',14,0,100,0,0,11399,21746,0,'ANGER_SAY_FREED'),
(23420,1,0,'So... foolish.',14,0,100,0,0,11400,21747,0,'ANGER_SAY_FREED2'),
(23420,2,0,'Enough! No more!',14,0,100,0,0,11402,21748,0,'ANGER_SAY_SEETHE'),
(23420,3,0,'%s seethes in anger!',14,0,100,0,0,0,21878,0,'ANGER_EMOTE_SEETHE'),
(23420,4,0,'On your knees!',14,0,100,0,0,11403,21749,0,'ANGER_SAY_SPEC'),
(23420,5,0,'Beware, coward!',14,0,100,0,0,11405,21751,0,'ANGER_SAY_SPITE'),
(23420,6,0,'I won\'t... be... ignored!',14,0,100,0,0,11404,21750,0,'ANGER_SAY_DEATH');
DELETE FROM `spell_script_names` WHERE `ScriptName` IN (
'spell_mother_shahraz_fatal_attraction',
'spell_mother_shahraz_fatal_attraction_link',
'spell_mother_shahraz_saber_lash',
'spell_mother_shahraz_generic_periodic',
'spell_mother_shahraz_random_periodic');
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(40869,'spell_mother_shahraz_fatal_attraction'),
(40870,'spell_mother_shahraz_fatal_attraction_link'),
(40816,'spell_mother_shahraz_saber_lash'),
(40863,'spell_mother_shahraz_generic_periodic'),
(40865,'spell_mother_shahraz_generic_periodic'),
(40866,'spell_mother_shahraz_generic_periodic'),
(40862,'spell_mother_shahraz_generic_periodic'),
(40867,'spell_mother_shahraz_random_periodic');
DELETE FROM `creature_addon` WHERE `guid`=52760;
INSERT INTO `creature_addon` (`guid`, `waypointPathId`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
(52760, 0, 0, 0, 0, 0, 40816);
DELETE FROM `creature_text` WHERE CreatureID=22947 AND `GroupID` IN(6,7);
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
(22947, 6, 0, '%s goes into a frenzy!', 41, 0, 100, 0, 0, 0, 2384, 0, 'shahraz EMOTE_ENRAGE'),
(22947, 7, 0, '%s goes into a berserker rage!', 16, 0, 100, 0, 0, 0, 4428, 0, 'shahraz EMOTE_BERSERK');
DELETE FROM `creature_addon` WHERE guid IN(52480,52481);
INSERT INTO `creature_addon` (`guid`, `waypointPathId`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
(52480, 0, 0, 8, 1, 0, NULL),
(52481, 0, 0, 8, 1, 0, NULL);
DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_illidari_nightlord_shadow_inferno';
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(39645,'spell_illidari_nightlord_shadow_inferno');
DELETE FROM `creature` WHERE `id` IN(22952,22950,22949,22951);
DELETE FROM `creature_summon_groups` WHERE `summonerId`=23426; -- Illidari Council Trigger
INSERT INTO `creature_summon_groups` (`summonerId`,`summonerType`,`groupId`,`entry`,`position_x`,`position_y`,`position_z`,`orientation`,`summonType`,`summonTime`) VALUES
(23426,0,1,22952,697.495,310.651,277.527,3.1765 ,6,3600000), -- Veras Darkshadow
(23426,0,1,22950,700.792,307.192,277.526,3.14159,6,3600000), -- High Nethermancer Zerevor
(23426,0,1,22949,700.739,302.722,277.526,3.10669,6,3600000), -- Gathios the Shatterer
(23426,0,1,22951,697.409,299.377,277.526,3.07178,6,3600000); -- Lady Malande
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=41333; -- Empyreal Equivalency
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(13,1,41333,0,0,31,0,3,22950,0,0,0,0,'','Effect_0 hits High Nethermancer Zerevor'),
(13,1,41333,0,1,31,0,3,22949,0,0,0,0,'','Effect_0 hits Gathios the Shatterer'),
(13,1,41333,0,2,31,0,3,22951,0,0,0,0,'','Effect_0 hits Lady Malande'),
(13,1,41333,0,3,31,0,3,22952,0,0,0,0,'','Effect_0 hits Veras Darkshadow');
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=41499; -- Empyreal Balance
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(13,1,41499,0,0,31,0,3,22950,0,0,0,0,'','Effect_0 hits High Nethermancer Zerevor'),
(13,1,41499,0,1,31,0,3,22949,0,0,0,0,'','Effect_0 hits Gathios the Shatterer'),
(13,1,41499,0,2,31,0,3,22951,0,0,0,0,'','Effect_0 hits Lady Malande'),
(13,1,41499,0,3,31,0,3,22952,0,0,0,0,'','Effect_0 hits Veras Darkshadow');
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=41342; -- Shared Rule
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(13,1,41342,0,0,31,0,3,23426,0,0,0,0,'','Effect_0 hits The Illidari Council');
UPDATE `linked_respawn` SET `linkedGuid`=52479 WHERE `linkedGuid`=52762;
UPDATE `creature_template` SET `flags_extra`=`flags_extra`|128, `ScriptName`='npc_veras_vanish_effect' WHERE `entry`=23451;
UPDATE `creature_template` SET `ScriptName`='boss_illidari_council' WHERE `entry`=23426;
UPDATE `creature_template` SET `ScriptName`='' WHERE `entry`=23499;
DELETE FROM `spell_script_names` WHERE `ScriptName` IN(
'spell_illidari_council_empyreal_balance',
'spell_illidari_council_empyreal_equivalency',
'spell_illidari_council_balance_of_power',
'spell_illidari_council_deadly_strike',
'spell_illidari_council_deadly_poison',
'spell_illidari_council_judgement',
'spell_illidari_council_seal',
'spell_boss_lady_malande_shield',
'spell_illidari_council_reflective_shield',
'spell_illidari_dampen_magic');
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(41499,'spell_illidari_council_empyreal_balance'),
(41333,'spell_illidari_council_empyreal_equivalency'),
(41341,'spell_illidari_council_balance_of_power'),
(41480,'spell_illidari_council_deadly_strike'),
(41485,'spell_illidari_council_deadly_poison'),
(41467,'spell_illidari_council_judgement'),
(41469,'spell_illidari_council_seal'),
(41459,'spell_illidari_council_seal'),
(41475,'spell_illidari_council_reflective_shield'),
(41478,'spell_illidari_dampen_magic');
DELETE FROM `creature_text` WHERE `CreatureID` IN(22951,22949,22950,22952) AND (`groupid` IN(3,4,5,6) OR (`groupid`=2 AND `id`=1));
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
(22949,2,1,'You are MINE!',14,0,100,0,0,11427,21739,0,'council gath SPECIAL2'),
(22949,3,0,'Selama am\'oronor!',14,0,100,0,0,11423,21735,0,'council gath SLAY'),
(22949,4,0,'Well done!',14,0,100,0,0,11424,21736,0,'council gath SLAY_COMT'),
(22949,5,0,'Lord Illidan, I...',14,0,100,0,0,11425,21737,0,'council gath DEATH'),
(22951,2,1,'I\'m full of surprises!',14,0,100,0,0,11487,21719,0,'council mala SPECIAL2'),
(22951,3,0,'My work is done.',14,0,100,0,0,11483,21712,0,'council mala SLAY'),
(22951,4,0,'As it should be.',14,0,100,0,0,11484,21713,0,'council mala SLAY_COMT'),
(22951,5,0,'Destiny... awaits.',14,0,100,0,0,11485,21715,0,'council mala DEATH'),
(22950,2,1,'Sha\'amoor ara mashal?',14,0,100,0,0,11445,21731,0,'council zere SPECIAL2'),
(22950,3,0,'Shorel\'aran.',14,0,100,0,0,11441,21725,0,'council zere SLAY'),
(22950,4,0,'Belesa menoor!',14,0,100,0,0,11442,21727,0,'council zere SLAY_COMT'),
(22950,5,0,'Diel ma\'ahn... orindel\'o.',14,0,100,0,0,11443,21729,0,'council zere DEATH'),
(22952,2,1,'Anar\'alah belore!',14,0,100,0,0,11529,21705,0,'council vera SPECIAL2'),
(22952,3,0,'Valiant effort.',14,0,100,0,0,11525,21699,0,'council vera SLAY'),
(22952,4,0,'A glorious kill!',14,0,100,0,0,11526,21701,0,'council vera SLAY_COMT'),
(22952,5,0,'You got... lucky.',14,0,100,0,0,11527,21703,0,'council vera DEATH');
DELETE FROM `gossip_menu` WHERE `MenuID`=8713;
INSERT INTO `gossip_menu` (`MenuID`, `TextID`, `VerifiedBuild`) VALUES
(8713, 10960, 0),
(8713, 10835, 0);
DELETE FROM `gossip_menu_option` WHERE `MenuID`=8713 AND `OptionIndex`=1;
INSERT INTO `gossip_menu_option` (`MenuID`, `OptionIndex`, `OptionIcon`, `OptionText`, `OptionBroadcastTextID`, `OptionType`, `OptionNpcFlag`, `VerifiedBuild`) VALUES
(8713, 1, 0, 'We\'re ready to face Illidan.', 20903, 1, 1, 0);
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN(14,15) AND `SourceGroup`=8713;
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(14, 8713, 10960, 0, 0, 13, 0, 10, 1, 0, 0, 0, 0, '', 'Show Gossip if Akama is in Intro State'),
(14, 8713, 10835, 0, 0, 13, 0, 10, 2, 0, 0, 0, 0, '', 'Show Gossip if Akama is in Waiting Fight State'),
(15, 8713, 0, 0, 0, 13, 0, 10, 1, 0, 0, 0, 0, '', 'Show Option if Akama in Intro State'),
(15, 8713, 1, 0, 0, 13, 0, 10, 2, 0, 0, 0, 0, '', 'Show Option if Akama is in Waiting Fight State');
-- Illidan Group Summon
DELETE FROM `creature` WHERE `guid`=12776;
DELETE FROM `creature_summon_groups` WHERE `summonerId`=22917;
INSERT INTO `creature_summon_groups` (`summonerId`,`summonerType`,`groupId`,`entry`,`position_x`,`position_y`,`position_z`,`orientation`,`summonType`,`summonTime`) VALUES
(22917,0,1,23089,748.5206,236.6311,353.0794,2.373648,8,0); -- Akama
-- Akama Group Summon
DELETE FROM `creature_summon_groups` WHERE `summonerId`=23089;
INSERT INTO `creature_summon_groups` (`summonerId`,`summonerType`,`groupId`,`entry`,`position_x`,`position_y`,`position_z`,`orientation`,`summonType`,`summonTime`) VALUES
(23089,0,1,23410,751.4565,311.0107,312.19,0,8,0), -- Spirit of Undalo
(23089,0,1,23411,751.6437,297.2233,312.2083,0,8,0); -- Spirit of Olum
UPDATE `creature_template` SET `scale`=1 WHERE `entry`=23412; -- Door Trigger
UPDATE `creature_template` SET `speed_walk`=1, `speed_run`=2, `unit_flags2`=2099200, `flags_extra`=`flags_extra` | 512 WHERE `entry`=22917; -- Illidan Stormrage
UPDATE `creature_template` SET `flags_extra`=`flags_extra`|128 WHERE `entry`=23336; -- Flame Crash
UPDATE `creature_template` SET `speed_walk`=0.35, `speed_run`=0.992063, `flags_extra`=128, `ScriptName`='npc_illidan_db_target' WHERE `entry`=23070;
UPDATE `creature_template` SET `speed_walk`=1.6, `speed_run`=0.571429 WHERE `entry`=23375; -- Shadow Demon
UPDATE `creature_template` SET `ScriptName`='npc_maiev' WHERE `entry`=23197;
UPDATE `gameobject_template_addon` SET `faction`=1375, `flags`=32 WHERE `entry`=185916;
UPDATE `gameobject_template` SET `ScriptName`='' WHERE `entry`=185916;
-- Blaze SAI
SET @ENTRY := 23259;
UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
(@ENTRY,0,0,0,25,0,100,1,0,0,0,0,8,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Blaze - On Reset - Set Reactstate Passive (No Repeat)"),
(@ENTRY,0,1,0,25,0,100,0,0,0,0,0,11,40610,2,0,0,0,0,1,0,0,0,0,0,0,0,"Blaze - On Reset - Cast 'Blaze'"),
(@ENTRY,0,3,0,25,0,100,0,0,0,0,0,11,40031,2,0,0,0,0,1,0,0,0,0,0,0,0,"Blaze - On Reset - Cast 'Birth - No Visual (Instant Spawn)'");
-- Cage Trap Trigger - 1 SAI
SET @ENTRY := 23292;
UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
(@ENTRY,0,0,0,54,0,100,3,0,0,0,0,11,40704,2,0,0,0,0,1,0,0,0,0,0,0,0,"Cage Trap Trigger - 1 - On Just Summoned - Cast 'Caged' (No Repeat) (Normal Dungeon)");
-- Cage Trap Trigger - 2 SAI
SET @ENTRY := 23293;
UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
(@ENTRY,0,0,0,54,0,100,3,0,0,0,0,11,40707,2,0,0,0,0,1,0,0,0,0,0,0,0,"Cage Trap Trigger - 2 - On Just Summoned - Cast 'Caged' (No Repeat) (Normal Dungeon)");
-- Cage Trap Trigger - 3 SAI
SET @ENTRY := 23294;
UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
(@ENTRY,0,0,0,54,0,100,3,0,0,0,0,11,40708,2,0,0,0,0,1,0,0,0,0,0,0,0,"Cage Trap Trigger - 3 - On Just Summoned - Cast 'Caged' (No Repeat) (Normal Dungeon)");
-- Cage Trap Trigger - 4 SAI
SET @ENTRY := 23295;
UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
(@ENTRY,0,0,0,54,0,100,3,0,0,0,0,11,40709,2,0,0,0,0,1,0,0,0,0,0,0,0,"Cage Trap Trigger - 4 - On Just Summoned - Cast 'Caged' (No Repeat) (Normal Dungeon)");
-- Cage Trap Trigger - 5 SAI
SET @ENTRY := 23296;
UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
(@ENTRY,0,0,0,54,0,100,3,0,0,0,0,11,40710,2,0,0,0,0,1,0,0,0,0,0,0,0,"Cage Trap Trigger - 5 - On Just Summoned - Cast 'Caged' (No Repeat) (Normal Dungeon)");
-- Cage Trap Trigger - 6 SAI
SET @ENTRY := 23297;
UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
(@ENTRY,0,0,0,54,0,100,3,0,0,0,0,11,40711,2,0,0,0,0,1,0,0,0,0,0,0,0,"Cage Trap Trigger - 6 - On Just Summoned - Cast 'Caged' (No Repeat) (Normal Dungeon)");
-- Cage Trap Trigger - 7 SAI
SET @ENTRY := 23298;
UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
(@ENTRY,0,0,0,54,0,100,3,0,0,0,0,11,40712,2,0,0,0,0,1,0,0,0,0,0,0,0,"Cage Trap Trigger - 7 - On Just Summoned - Cast 'Caged' (No Repeat) (Normal Dungeon)");
-- Cage Trap Trigger - 8 SAI
SET @ENTRY := 23299;
UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
(@ENTRY,0,0,0,54,0,100,3,0,0,0,0,11,40713,2,0,0,0,0,1,0,0,0,0,0,0,0,"Cage Trap Trigger - 8 - On Just Summoned - Cast 'Caged' (No Repeat) (Normal Dungeon)");
DELETE FROM `creature_addon` WHERE `guid`=52484; -- Illidan
INSERT INTO `creature_addon` (`guid`, `waypointPathId`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
(52484, 0, 0, 256, 0, 0, '39656 43689');
DELETE FROM `creature_template_addon` WHERE `entry` IN(23069,23336,23498);
INSERT INTO `creature_template_addon` (`entry`, `waypointPathId`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
(23069, 0, 0, 256, 0, 0, 40029),
(23336, 0, 0, 256, 0, 0, 40836),
(23498, 0, 0, 16908544, 0, 0, '34429 41913');
DELETE FROM `spell_linked_spell` WHERE `spell_trigger` IN(-41914,-41917); -- Remove Parasitic hack
DELETE FROM `spell_script_names` WHERE `ScriptName` IN
('spell_illidan_akama_teleport',
'spell_illidan_akama_door_channel',
'spell_illidan_draw_soul',
'spell_illidan_parasitic_shadowfiend',
'spell_illidan_throw_warglaive',
'spell_illidan_tear_of_azzinoth_channel',
'spell_illidan_flame_blast',
'spell_illidan_return_glaives',
'spell_illidan_agonizing_flames',
'spell_illidan_demon_transform1',
'spell_illidan_demon_transform2',
'spell_illidan_flame_burst',
'spell_illidan_find_target',
'spell_illidan_eye_blast',
'spell_illidan_cage_trap',
'spell_illidan_caged',
'spell_maiev_down',
'spell_illidan_cage_teleport',
'spell_illidan_despawn_akama');
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(41077,'spell_illidan_akama_teleport'),
(41268,'spell_illidan_akama_door_channel'),
(40904,'spell_illidan_draw_soul'),
(41917,'spell_illidan_parasitic_shadowfiend'),
(41914,'spell_illidan_parasitic_shadowfiend'),
(39635,'spell_illidan_throw_warglaive'),
(39849,'spell_illidan_throw_warglaive'),
(39857,'spell_illidan_tear_of_azzinoth_channel'),
(40631,'spell_illidan_flame_blast'),
(39873,'spell_illidan_return_glaives'),
(40834,'spell_illidan_agonizing_flames'),
(40511,'spell_illidan_demon_transform1'),
(40398,'spell_illidan_demon_transform2'),
(41126,'spell_illidan_flame_burst'),
(41081,'spell_illidan_find_target'),
(39908,'spell_illidan_eye_blast'),
(40761,'spell_illidan_cage_trap'),
(40760,'spell_illidan_caged'),
(40409,'spell_maiev_down'),
(40693,'spell_illidan_cage_teleport'),
(41242,'spell_illidan_despawn_akama');
DELETE FROM `creature_text` WHERE CreatureID IN(23089,23410,23411); -- Akama and Minions
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
(23089, 0, 0, 'This door is all that stands between us and the Betrayer. Stand aside, friends.', 12, 0, 100, 1, 0, 0, 21563, 0, 'SAY_AKAMA_DOOR'),
(23089, 1, 0, 'I cannot do this alone...', 12, 0, 100, 274, 0, 0, 21548, 0, 'SAY_AKAMA_ALONE'),
(23089, 2, 0, 'I thank you for your aid, brothers. Our people will be redeemed!', 12, 0, 100, 66, 0, 0, 21554, 0, 'SAY_AKAMA_SALUTE'),
(23089, 3, 0, 'Be wary, friends. The Betrayer meditates in the court just beyond.', 12, 0, 100, 0, 0, 11388, 21555, 0, 'SAY_AKAMA_BETRAYER'),
(23089, 4, 0, 'We\'ve come to end your reign, Illidan. My people, and all of Outland, shall be free!', 14, 0, 100, 25, 0, 11389, 20893, 0, 'SAY_AKAMA_FREE'),
(23089, 5, 0, 'The time has come! The moment is at hand!', 14, 0, 100, 22, 0, 11380, 20894, 0, 'SAY_AKAMA_TIME_HAS_COME'),
(23089, 6, 0, 'I will deal with these mongrels! Strike now, friends! Strike at the Betrayer!', 14, 0, 100, 22, 0, 11390, 21250, 0, 'SAY_AKAMA_MINIONS'),
(23089, 7, 0, 'The Light will bless these dismal halls once again.... I swear it.', 14, 0, 100, 1, 0, 11387, 21514, 0, 'SAY_AKAMA_LIGHT'),
(23089, 8, 0, 'Let us finish what we\'ve started. I will lead you to Illidan\'s abode once you\'ve recovered your strength.', 12, 0, 100, 1, 0, 0, 21520, 0, 'SAY_AKAMA_FINISH'),
-- AKAMA MINIONS
(23410, 0, 0, 'You are not alone, Akama.', 12, 0, 100, 0, 0, 0, 21545, 0, 'SAY_SPIRIT_ALONE'), -- Spirit of Udalo
(23411, 0, 0, 'Your people will always be with you!', 12, 0, 100, 0, 0, 0, 21546, 0, 'SAY_SPIRIT_ALONE'); -- Spirit of Olum
DELETE FROM `creature_text` WHERE CreatureID=22917 AND `GroupID` IN(8,9,10,11,12,13,14); -- Illidan
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
(22917, 8, 0, 'Akama. Your duplicity is hardly surprising. I should have slaughtered you and your malformed brethren long ago.', 14, 0, 100, 6, 0, 11463, 20867, 0, 'Illidan SAY_ILLIDAN_DUPLICITY'),
(22917, 9, 0, 'Boldly said. But I remain... unconvinced.', 14, 0, 100, 6, 0, 11464, 20868, 0, 'Illidan SAY_ILLIDAN_UNCONVINCED'),
(22917, 10, 0, 'You are not prepared!', 14, 0, 100, 406, 0, 11466, 20884, 0, 'Illidan SAY_ILLIDAN_PREPARED'),
(22917, 11, 0, 'Is this it, mortals? Is this all the fury you can muster?', 14, 0, 100, 0, 0, 11476, 21068, 0, 'Illidan SAY_ILLIDAN_SHADOW_PRISON'),
(22917, 12, 0, 'Maiev... How is it even possible?', 14, 0, 100, 1, 0, 11477, 21069, 0, 'Illidan SAY_ILLIDAN_CONFRONT_MAIEV'),
(22917, 13, 0, 'Feel the hatred of ten thousand years!', 14, 0, 100, 0, 0, 11470, 21501, 0, 'Illidan SAY_ILLIDAN_FRENZY'),
(22917, 14, 0, 'You have won... Maiev. But the huntress... is nothing without the hunt. You... are nothing... without me.', 14, 0, 100, 0, 0, 11478, 21506, 0, 'Illidan SAY_ILLIDAN_DEFEATED');
DELETE FROM `creature_text` WHERE CreatureID=23197 AND ((`GroupID` IN(1,2,3,4,5,6,7)) OR (`GroupID`=0 AND ID=2)); -- Maiev
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
(23197, 1, 0, 'Their fury pales before mine, Illidan. We have some unsettled business between us.', 14, 0, 100, 6, 0, 11491, 21070, 0, 'Maiev Shadowsong SAY_MAIEV_SHADOWSONG_APPEAR'),
(23197, 2, 0, 'My long hunt is finally over. Today, Justice will be done!', 14, 0, 100, 5, 0, 11492, 21071, 0, 'Maiev Shadowsong SAY_MAIEV_SHADOWSONG_JUSTICE'),
(23197, 3, 0, 'There shall be no prison for you this time!', 14, 0, 100, 0, 0, 11495, 22208, 0, 'Maiev Shadowsong SAY_MAIEV_SHADOWSONG_TRAP'),
(23197, 4, 0, '%s falls to the floor.', 16, 0, 100, 0, 0, 0, 21317, 0, 'Maiev Shadowsong SAY_MAIEV_SHADOWSONG_DOWN'),
(23197, 5, 0, 'It is finished. You are beaten.', 14, 0, 100, 0, 0, 11496, 21507, 0, 'Maiev Shadowsong SAY_MAIEV_SHADOWSONG_FINISHED'),
(23197, 6, 0, 'He\'s right. I feel nothing... I am... nothing.', 14, 0, 100, 0, 0, 11497, 21508, 0, 'Maiev Shadowsong SAY_MAIEV_SHADOWSONG_OUTRO'),
(23197, 7, 0, 'Farewell, champions.', 14, 0, 100, 0, 0, 11498, 21509, 0, 'Maiev Shadowsong SAY_MAIEV_SHADOWSONG_FAREWELL');
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`IN(40704,40707,40708,40709,40710,40711,40712,40713); -- Caged (Visual)
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(13,1,40704,0,0,31,0,3,23296,0,0,0,0,'','Effect_0 hits Cage Trap Trigger - 5'),
(13,1,40707,0,0,31,0,3,23297,0,0,0,0,'','Effect_0 hits Cage Trap Trigger - 6'),
(13,1,40708,0,0,31,0,3,23298,0,0,0,0,'','Effect_0 hits Cage Trap Trigger - 7'),
(13,1,40709,0,0,31,0,3,23299,0,0,0,0,'','Effect_0 hits Cage Trap Trigger - 8'),
(13,1,40710,0,0,31,0,3,23292,0,0,0,0,'','Effect_0 hits Cage Trap Trigger - 1'),
(13,1,40711,0,0,31,0,3,23293,0,0,0,0,'','Effect_0 hits Cage Trap Trigger - 2'),
(13,1,40712,0,0,31,0,3,23294,0,0,0,0,'','Effect_0 hits Cage Trap Trigger - 3'),
(13,1,40713,0,0,31,0,3,23295,0,0,0,0,'','Effect_0 hits Cage Trap Trigger - 4');
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`IN(39849,39635); -- Throw Glaive
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(13,1,39849,0,0,31,0,3,23448,52503,0,0,0,'','Effect_0 hits Glaive Target'),
(13,1,39635,0,0,31,0,3,23448,52502,0,0,0,'','Effect_0 hits Glaive Target');
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=39873; -- Return Glaive
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(13,1,39873,0,0,31,0,3,22917,0,0,0,0,'','Effect_0 hits Illidan Stormrage');
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=40761; -- Cage Trap
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(13,1,40761,0,0,31,0,3,22917,0,0,0,0,'','Effect_0 hits Illidan Stormrage');
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=40693; -- Cage Trap Teleport
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(13,1,40693,0,0,31,0,3,23197,0,0,0,0,'','Effect_0 hits Maiev Shadowsong');
DELETE FROM `script_spline_chain_meta` WHERE `entry`=23089 AND `chainId`=1;
INSERT INTO `script_spline_chain_meta` (`entry`,`chainId`,`splineId`,`expectedDuration`,`msUntilNext`) VALUES
(23089, 1, 0, 3297, 2391),
(23089, 1, 1, 2744, 0);
DELETE FROM `script_spline_chain_waypoints` WHERE `entry`=23089 AND `chainId`=1;
INSERT INTO `script_spline_chain_waypoints` (`entry`,`chainId`,`splineId`,`wpId`,`x`,`y`,`z`) VALUES
(23089, 1, 0, 0, 609.77200, 308.45600, 271.82600),
(23089, 1, 0, 1, 610.93130, 308.29240, 272.00720),
(23089, 1, 0, 2, 625.68130, 307.04240, 271.75720),
(23089, 1, 0, 3, 628.43130, 307.04240, 271.75720),
(23089, 1, 0, 4, 630.18130, 307.04240, 271.75720),
(23089, 1, 0, 5, 631.68130, 306.79240, 271.75720),
(23089, 1, 0, 6, 642.59050, 305.62870, 271.68840),
(23089, 1, 1, 0, 633.37040, 306.42300, 271.66000),
(23089, 1, 1, 1, 642.81750, 305.84460, 271.93120),
(23089, 1, 1, 2, 660.76460, 305.76630, 271.70240);
DELETE FROM `script_spline_chain_meta` WHERE `entry`=23089 AND `chainId`=2;
INSERT INTO `script_spline_chain_meta` (`entry`,`chainId`,`splineId`,`expectedDuration`,`msUntilNext`) VALUES
(23089, 2, 0, 5077, 3297),
(23089, 2, 1, 5259, 3656),
(23089, 2, 2, 4364, 3640),
(23089, 2, 3, 3825, 2422),
(23089, 2, 4, 3466, 2422),
(23089, 2, 5, 2911, 1235),
(23089, 2, 6, 2798, 1203),
(23089, 2, 7, 2172, 0);
DELETE FROM `script_spline_chain_waypoints` WHERE `entry`=23089 AND `chainId`=2;
INSERT INTO `script_spline_chain_waypoints` (`entry`,`chainId`,`splineId`,`wpId`,`x`,`y`,`z`) VALUES
(23089, 2, 0, 0, 660.76460, 305.76630, 271.70240),
(23089, 2, 0, 1, 664.95350, 321.87480, 271.94820),
(23089, 2, 0, 2, 665.70350, 324.87480, 271.94820),
(23089, 2, 0, 3, 673.14240, 354.98330, 271.69400),
(23089, 2, 1, 0, 668.70380, 337.33420, 271.68930),
(23089, 2, 1, 1, 673.44130, 355.17200, 271.79190),
(23089, 2, 1, 2, 680.94130, 363.17200, 271.79190),
(23089, 2, 1, 3, 681.94130, 363.92200, 271.79190),
(23089, 2, 1, 4, 691.69130, 374.67200, 271.79190),
(23089, 2, 1, 5, 694.19130, 377.42200, 271.79190),
(23089, 2, 1, 6, 696.67880, 380.00980, 271.89450),
(23089, 2, 2, 0, 685.40080, 368.01770, 271.67940),
(23089, 2, 2, 1, 691.88500, 374.69560, 272.08730),
(23089, 2, 2, 2, 694.38500, 377.19560, 272.08730),
(23089, 2, 2, 3, 696.88500, 379.94560, 272.33730),
(23089, 2, 2, 4, 699.38500, 379.44560, 272.33730),
(23089, 2, 2, 5, 704.13500, 378.44560, 274.58730),
(23089, 2, 2, 6, 714.88500, 375.94560, 277.83730),
(23089, 2, 2, 7, 719.63500, 374.69560, 280.08730),
(23089, 2, 2, 8, 721.36930, 374.37350, 280.99510),
(23089, 2, 3, 0, 715.07500, 375.81030, 277.75200),
(23089, 2, 3, 1, 719.93350, 374.65850, 280.34520),
(23089, 2, 3, 2, 721.68350, 374.40850, 281.34520),
(23089, 2, 3, 3, 725.93350, 368.15850, 284.84520),
(23089, 2, 3, 4, 728.18350, 364.65850, 287.84520),
(23089, 2, 3, 5, 732.68350, 358.65850, 291.84520),
(23089, 2, 3, 6, 736.79190, 352.50670, 296.43850),
(23089, 2, 4, 0, 729.85970, 362.33540, 289.17460),
(23089, 2, 4, 1, 732.96180, 358.54080, 292.23680),
(23089, 2, 4, 2, 736.96180, 352.54080, 296.73680),
(23089, 2, 4, 3, 737.71180, 350.79080, 297.73680),
(23089, 2, 4, 4, 741.71180, 344.04080, 301.73680),
(23089, 2, 4, 5, 745.56390, 336.74620, 306.29910),
(23089, 2, 5, 0, 741.17650, 344.62910, 301.12160),
(23089, 2, 5, 1, 741.90870, 343.92740, 301.90360),
(23089, 2, 5, 2, 745.65870, 336.67740, 306.40360),
(23089, 2, 5, 3, 747.65870, 326.42740, 309.40360),
(23089, 2, 5, 4, 749.14090, 319.22560, 311.68560),
(23089, 2, 6, 0, 745.88320, 335.18240, 306.71790),
(23089, 2, 6, 1, 747.93570, 326.16000, 309.39880),
(23089, 2, 6, 2, 749.18570, 319.41000, 311.89880),
(23089, 2, 6, 3, 749.43570, 318.41000, 312.39880),
(23089, 2, 6, 4, 751.48830, 308.63760, 312.07980),
(23089, 2, 7, 0, 748.24830, 323.59770, 310.07210),
(23089, 2, 7, 1, 749.51420, 319.24910, 311.87080),
(23089, 2, 7, 2, 749.76420, 317.99910, 312.37080),
(23089, 2, 7, 3, 751.76420, 308.99910, 312.37080),
(23089, 2, 7, 4, 755.51420, 304.99910, 312.37080),
(23089, 2, 7, 5, 755.78010, 304.40060, 312.16960);
DELETE FROM `script_spline_chain_meta` WHERE `entry`=23089 AND `chainId`=3;
INSERT INTO `script_spline_chain_meta` (`entry`,`chainId`,`splineId`,`expectedDuration`,`msUntilNext`) VALUES
(23089, 3, 0, 4686, 3640),
(23089, 3, 1, 3261, 2453),
(23089, 3, 2, 3415, 2438),
(23089, 3, 3, 4631, 3641),
(23089, 3, 4, 2627, 0);
DELETE FROM `script_spline_chain_waypoints` WHERE `entry`=23089 AND `chainId`=3;
INSERT INTO `script_spline_chain_waypoints` (`entry`,`chainId`,`splineId`,`wpId`,`x`,`y`,`z`) VALUES
(23089, 3, 0, 0, 755.78010, 304.40060, 312.16960),
(23089, 3, 0, 1, 759.85900, 303.60590, 312.72120),
(23089, 3, 0, 2, 770.35900, 301.10590, 312.72120),
(23089, 3, 0, 3, 779.60900, 299.10590, 319.97120),
(23089, 3, 0, 4, 781.35900, 298.60590, 319.97120),
(23089, 3, 0, 5, 786.35900, 297.60590, 319.97120),
(23089, 3, 0, 6, 787.35900, 297.35590, 319.97120),
(23089, 3, 0, 7, 798.93790, 294.31120, 319.77270),
(23089, 3, 1, 0, 788.57950, 296.73280, 319.76110),
(23089, 3, 1, 1, 799.06010, 294.20360, 320.06920),
(23089, 3, 1, 2, 798.56010, 289.20360, 320.31920),
(23089, 3, 1, 3, 797.54060, 276.17450, 330.37730),
(23089, 3, 2, 0, 798.04160, 282.67720, 325.05990),
(23089, 3, 2, 1, 797.59280, 276.20070, 330.76180),
(23089, 3, 2, 2, 795.34280, 262.95070, 341.51180),
(23089, 3, 2, 3, 794.59280, 258.70070, 341.51180),
(23089, 3, 2, 4, 793.64410, 254.72420, 341.46370),
(23089, 3, 3, 0, 795.28610, 263.76330, 340.53130),
(23089, 3, 3, 1, 795.05350, 262.63820, 341.82590),
(23089, 3, 3, 2, 794.30350, 258.38820, 341.82590),
(23089, 3, 3, 3, 793.55350, 254.63820, 341.82590),
(23089, 3, 3, 4, 792.55350, 254.13820, 341.82590),
(23089, 3, 3, 5, 787.80350, 251.38820, 341.82590),
(23089, 3, 3, 6, 783.55350, 249.13820, 341.82590),
(23089, 3, 3, 7, 773.05350, 242.88820, 349.07590),
(23089, 3, 3, 8, 766.30350, 238.88820, 353.82590),
(23089, 3, 3, 9, 764.82070, 238.01300, 353.62060),
(23089, 3, 4, 0, 772.12710, 242.24910, 349.37410),
(23089, 3, 4, 1, 766.03170, 239.02710, 353.95420),
(23089, 3, 4, 2, 764.78170, 238.27710, 353.70420),
(23089, 3, 4, 3, 760.28170, 237.77710, 353.45420),
(23089, 3, 4, 4, 750.28170, 236.27710, 353.20420),
(23089, 3, 4, 5, 748.43620, 235.80510, 353.03430);
DELETE FROM `script_spline_chain_meta` WHERE `entry`=23089 AND `chainId`=4;
INSERT INTO `script_spline_chain_meta` (`entry`,`chainId`,`splineId`,`expectedDuration`,`msUntilNext`) VALUES
(23089, 4, 0, 6925, 0);
DELETE FROM `script_spline_chain_waypoints` WHERE `entry`=23089 AND `chainId`=4;
INSERT INTO `script_spline_chain_waypoints` (`entry`,`chainId`,`splineId`,`wpId`,`x`,`y`,`z`) VALUES
(23089, 4, 0, 0, 748.43620, 235.80510, 353.03430),
(23089, 4, 0, 1, 747.83060, 249.37560, 353.26520),
(23089, 4, 0, 2, 747.58060, 252.87560, 353.26520),
(23089, 4, 0, 3, 747.33060, 257.37560, 353.26520),
(23089, 4, 0, 4, 747.33060, 260.87560, 353.26520),
(23089, 4, 0, 5, 746.83060, 277.12560, 353.26520),
(23089, 4, 0, 6, 746.08060, 293.12560, 353.26520),
(23089, 4, 0, 7, 745.58060, 302.87560, 353.26520),
(23089, 4, 0, 8, 745.22500, 304.94600, 352.99600);
DELETE FROM `script_spline_chain_meta` WHERE `entry`=23089 AND `chainId`=5;
INSERT INTO `script_spline_chain_meta` (`entry`,`chainId`,`splineId`,`expectedDuration`,`msUntilNext`) VALUES
(23089, 5, 0, 5893, 0);
DELETE FROM `script_spline_chain_waypoints` WHERE `entry`=23089 AND `chainId`=5;
INSERT INTO `script_spline_chain_waypoints` (`entry`,`chainId`,`splineId`,`wpId`,`x`,`y`,`z`) VALUES
(23089, 5, 0, 0, 745.22500, 304.94600, 352.99600),
(23089, 5, 0, 1, 744.74730, 320.38350, 353.25160),
(23089, 5, 0, 2, 744.49730, 331.88350, 353.25160),
(23089, 5, 0, 3, 744.49730, 348.38350, 353.25160),
(23089, 5, 0, 4, 744.24730, 349.63350, 353.25160),
(23089, 5, 0, 5, 744.24730, 352.13350, 353.25160),
(23089, 5, 0, 6, 743.99730, 362.63350, 353.25160),
(23089, 5, 0, 7, 743.76950, 363.82110, 353.00730);
DELETE FROM `script_spline_chain_meta` WHERE `entry`=23089 AND `chainId`=6;
INSERT INTO `script_spline_chain_meta` (`entry`,`chainId`,`splineId`,`expectedDuration`,`msUntilNext`) VALUES
(23089, 6, 0, 9319, 0);
DELETE FROM `script_spline_chain_waypoints` WHERE `entry`=23089 AND `chainId`=6;
INSERT INTO `script_spline_chain_waypoints` (`entry`,`chainId`,`splineId`,`wpId`,`x`,`y`,`z`) VALUES
(23089, 6, 0, 0, 752.27710, 369.94010, 353.15840),
(23089, 6, 0, 1, 753.94520, 368.68850, 353.20910),
(23089, 6, 0, 2, 762.69520, 361.68850, 353.70910),
(23089, 6, 0, 3, 763.94520, 360.68850, 353.95910),
(23089, 6, 0, 4, 764.94520, 359.68850, 352.95910),
(23089, 6, 0, 5, 780.19520, 347.18850, 341.70910),
(23089, 6, 0, 6, 780.44520, 346.68850, 341.70910),
(23089, 6, 0, 7, 792.19520, 320.18850, 320.20910),
(23089, 6, 0, 8, 794.69520, 314.93850, 320.20910),
(23089, 6, 0, 9, 796.19520, 311.43850, 320.20910),
(23089, 6, 0, 10, 799.11330, 304.43700, 319.75990);
DELETE FROM `script_spline_chain_meta` WHERE `entry`=23089 AND `chainId`=7;
INSERT INTO `script_spline_chain_meta` (`entry`,`chainId`,`splineId`,`expectedDuration`,`msUntilNext`) VALUES
(23089, 7, 0, 4704, 0);
DELETE FROM `script_spline_chain_waypoints` WHERE `entry`=23089 AND `chainId`=7;
INSERT INTO `script_spline_chain_waypoints` (`entry`,`chainId`,`splineId`,`wpId`,`x`,`y`,`z`) VALUES
(23089, 7, 0, 0, 753.04650, 369.30210, 353.12700),
(23089, 7, 0, 1, 751.76920, 369.24790, 353.31160),
(23089, 7, 0, 2, 739.51920, 368.74790, 353.06160),
(23089, 7, 0, 3, 723.26920, 367.99790, 353.06160),
(23089, 7, 0, 4, 722.76920, 367.49790, 353.06160),
(23089, 7, 0, 5, 715.76920, 369.49790, 353.06160),
(23089, 7, 0, 6, 714.51920, 368.24790, 353.06160);
DELETE FROM `gameobject` WHERE guid=44;
INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`) VALUES
(44, 185966, 564, 3959, 3959, 1, 1, 706.406006, 302.182373, 353.743744, 0.157961, 0, 0, 0, 0, 7200, 0, 1);
UPDATE `creature_template` SET `ScriptName`='npc_illidari_elite' WHERE `entry`=23226;
DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_illidan_remove_parasitic_shadowfiend';
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(41923,'spell_illidan_remove_parasitic_shadowfiend');
-- DELETE FROM `spell_dbc` WHERE `Id`=41923;
-- INSERT INTO `spell_dbc` (`Id`,`Dispel`,`Mechanic`,`Attributes`,`AttributesEx`,`AttributesEx2`,`AttributesEx3`,`AttributesEx4`,`AttributesEx5`,`AttributesEx6`,`AttributesEx7`,`Stances`,`StancesNot`,`Targets`,`CastingTimeIndex`,`AuraInterruptFlags`,`ProcFlags`,`ProcChance`,`ProcCharges`,`MaxLevel`,`BaseLevel`,`SpellLevel`,`DurationIndex`,`RangeIndex`,`StackAmount`,`EquippedItemClass`,`EquippedItemSubClassMask`,`EquippedItemInventoryTypeMask`,`Effect1`,`Effect2`,`Effect3`,`EffectDieSides1`,`EffectDieSides2`,`EffectDieSides3`,`EffectRealPointsPerLevel1`,`EffectRealPointsPerLevel2`,`EffectRealPointsPerLevel3`,`EffectBasePoints1`,`EffectBasePoints2`,`EffectBasePoints3`,`EffectMechanic1`,`EffectMechanic2`,`EffectMechanic3`,`EffectImplicitTargetA1`,`EffectImplicitTargetA2`,`EffectImplicitTargetA3`,`EffectImplicitTargetB1`,`EffectImplicitTargetB2`,`EffectImplicitTargetB3`,`EffectRadiusIndex1`,`EffectRadiusIndex2`,`EffectRadiusIndex3`,`EffectApplyAuraName1`,`EffectApplyAuraName2`,`EffectApplyAuraName3`,`EffectAmplitude1`,`EffectAmplitude2`,`EffectAmplitude3`,`EffectMultipleValue1`,`EffectMultipleValue2`,`EffectMultipleValue3`,`EffectItemType1`,`EffectItemType2`,`EffectItemType3`,`EffectMiscValue1`,`EffectMiscValue2`,`EffectMiscValue3`,`EffectMiscValueB1`,`EffectMiscValueB2`,`EffectMiscValueB3`,`EffectTriggerSpell1`,`EffectTriggerSpell2`,`EffectTriggerSpell3`,`EffectSpellClassMaskA1`,`EffectSpellClassMaskA2`,`EffectSpellClassMaskA3`,`EffectSpellClassMaskB1`,`EffectSpellClassMaskB2`,`EffectSpellClassMaskB3`,`EffectSpellClassMaskC1`,`EffectSpellClassMaskC2`,`EffectSpellClassMaskC3`,`MaxTargetLevel`,`SpellFamilyName`,`SpellFamilyFlags1`,`SpellFamilyFlags2`,`SpellFamilyFlags3`,`MaxAffectedTargets`,`DmgClass`,`PreventionType`,`DmgMultiplier1`,`DmgMultiplier2`,`DmgMultiplier3`,`AreaGroupId`,`SchoolMask`,`Comment`) VALUES
-- (41923,0,0,536871296,268435592,4,256,0,8,0,0,0,0,0,1,0,0,0,0,0,0,0,27,1,0,-1,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,15,0,0,28,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,'Remove Parasitic Shadowfiends');
DELETE FROM `spelleffect_dbc` WHERE `Id`= 160109;
INSERT INTO `spelleffect_dbc` (`Id`, `Effect`, `EffectAura`, `EffectRadiusIndex`, `EffectImplicitTargetA`, `EffectImplicitTargetB`, `SpellID`, `EffectIndex`, `Comment`) VALUES
(160109, 6, 4, 28, 22, 15, 41923, 0, '');
DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_illidari_council_vanish');
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(41476,'spell_illidari_council_vanish');
DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_illidan_parasitic_shadowfiend_proc';
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(41913,'spell_illidan_parasitic_shadowfiend_proc');
--
DELETE FROM `creature` WHERE `id` IN (22934) AND `guid`=107033;
INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `MovementType`) VALUES
(107033, 22934, 530, 1, 1, -3565.66, 499.164, 20.2467, 2.54818, 120, 0, 0);
-- Reliquary of Souls Combat Trigger
UPDATE `creature_template` SET `flags_extra`=`flags_extra`&~128, `ScriptName` = 'npc_reliquary_combat_trigger' WHERE `entry`=23417;
UPDATE `creature_template` SET `ScriptName`= 'npc_illidan_generic_fire' WHERE `entry`= 23069;
--
DELETE FROM `conditions` WHERE `SourceEntry`= 40647 AND `SourceTypeOrReferenceId`= 13;
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ScriptName`, `Comment`) VALUES
(13, 4, 40647, 0, 0, 31, 0, 3, 23089, 0, 0, 0, '', 'Shadow Prison - Target Akama');
+2
View File
@@ -3743,6 +3743,8 @@ bool SpellInfo::_IsPositiveEffect(uint8 effIndex, bool deep) const
case 29214: // Wrath of the Plaguebringer
case 34700: // Allergic Reaction
case 54836: // Wrath of the Plaguebringer
case 41914: // Parasitic Shadowfiend (Illidan)
case 41917: // Parasitic Shadowfiend (Illidan)
return false;
case 30877: // Tag Murloc
case 61716: // Rabbit Costume
+12
View File
@@ -4849,6 +4849,18 @@ void SpellMgr::LoadSpellInfoCorrections()
});
// ENDOF ISLE OF CONQUEST SPELLS
// Deadly Poison - Black Temple
ApplySpellFix({ 66551 }, [](SpellInfo* spellInfo)
{
spellInfo->AttributesEx6 |= SPELL_ATTR6_CAN_TARGET_INVISIBLE;
});
// Envenom - Black Temple
ApplySpellFix({ 41487 }, [](SpellInfo* spellInfo)
{
spellInfo->AttributesEx6 |= SPELL_ATTR6_CAN_TARGET_INVISIBLE;
});
//
// FIRELANDS SPELLS
//
@@ -57,270 +57,222 @@ enum Misc
GROUP_OUT_OF_COMBAT = 1
};
// ########################################################
// Wrathbone Flayer
// ########################################################
class npc_wrathbone_flayer : public CreatureScript
struct npc_wrathbone_flayer : public ScriptedAI
{
public:
npc_wrathbone_flayer() : CreatureScript("npc_wrathbone_flayer") { }
struct npc_wrathbone_flayerAI : public ScriptedAI
npc_wrathbone_flayer(Creature* creature) : ScriptedAI(creature)
{
npc_wrathbone_flayerAI(Creature* creature) : ScriptedAI(creature)
Initialize();
_instance = creature->GetInstanceScript();
}
void Initialize()
{
_enteredCombat = false;
}
void Reset() override
{
_events.ScheduleEvent(EVENT_GET_CHANNELERS, 3s);
Initialize();
_bloodmageList.clear();
_deathshaperList.clear();
}
void JustDied(Unit* /*killer*/) override { }
void JustEngagedWith(Unit* /*who*/) override
{
_events.ScheduleEvent(EVENT_CLEAVE, 5s);
_events.ScheduleEvent(EVENT_IGNORED, 7s);
_enteredCombat = true;
}
void UpdateAI(uint32 diff) override
{
if (!_enteredCombat)
{
Initialize();
_instance = creature->GetInstanceScript();
}
void Initialize()
{
_enteredCombat = false;
}
void Reset() override
{
_events.ScheduleEvent(EVENT_GET_CHANNELERS, 3000);
Initialize();
_bloodmageList.clear();
_deathshaperList.clear();
}
void JustDied(Unit* /*killer*/) override { }
void JustEngagedWith(Unit* /*who*/) override
{
_events.ScheduleEvent(EVENT_CLEAVE, 5000);
_events.ScheduleEvent(EVENT_IGNORED, 7000);
_enteredCombat = true;
}
void UpdateAI(uint32 diff) override
{
if (!_enteredCombat)
{
_events.Update(diff);
while (uint32 eventId = _events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_GET_CHANNELERS:
{
std::list<Creature*> BloodMageList;
me->GetCreatureListWithEntryInGrid(BloodMageList, NPC_BLOOD_MAGE, 15.0f);
if (!BloodMageList.empty())
for (std::list<Creature*>::const_iterator itr = BloodMageList.begin(); itr != BloodMageList.end(); ++itr)
{
_bloodmageList.push_back((*itr)->GetGUID());
if ((*itr)->isDead())
(*itr)->Respawn();
}
std::list<Creature*> DeathShaperList;
me->GetCreatureListWithEntryInGrid(DeathShaperList, NPC_DEATHSHAPER, 15.0f);
if (!DeathShaperList.empty())
for (std::list<Creature*>::const_iterator itr = DeathShaperList.begin(); itr != DeathShaperList.end(); ++itr)
{
_deathshaperList.push_back((*itr)->GetGUID());
if ((*itr)->isDead())
(*itr)->Respawn();
}
_events.ScheduleEvent(EVENT_SET_CHANNELERS, 3000);
break;
}
case EVENT_SET_CHANNELERS:
{
for (ObjectGuid guid : _bloodmageList)
if (Creature* bloodmage = ObjectAccessor::GetCreature(*me, guid))
bloodmage->CastSpell((Unit*)nullptr, SPELL_SUMMON_CHANNEL);
for (ObjectGuid guid : _deathshaperList)
if (Creature* deathshaper = ObjectAccessor::GetCreature(*me, guid))
deathshaper->CastSpell((Unit*)nullptr, SPELL_SUMMON_CHANNEL);
_events.ScheduleEvent(EVENT_SET_CHANNELERS, 12000);
break;
}
default:
break;
}
}
}
if (!UpdateVictim())
return;
_events.Update(diff);
while (uint32 eventId = _events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_CLEAVE:
DoCastVictim(SPELL_CLEAVE);
_events.ScheduleEvent(EVENT_CLEAVE, urand (1000, 2000));
case EVENT_GET_CHANNELERS:
{
std::list<Creature*> BloodMageList;
me->GetCreatureListWithEntryInGrid(BloodMageList, NPC_BLOOD_MAGE, 15.0f);
if (!BloodMageList.empty())
for (std::list<Creature*>::const_iterator itr = BloodMageList.begin(); itr != BloodMageList.end(); ++itr)
{
_bloodmageList.push_back((*itr)->GetGUID());
if ((*itr)->isDead())
(*itr)->Respawn();
}
std::list<Creature*> DeathShaperList;
me->GetCreatureListWithEntryInGrid(DeathShaperList, NPC_DEATHSHAPER, 15.0f);
if (!DeathShaperList.empty())
for (std::list<Creature*>::const_iterator itr = DeathShaperList.begin(); itr != DeathShaperList.end(); ++itr)
{
_deathshaperList.push_back((*itr)->GetGUID());
if ((*itr)->isDead())
(*itr)->Respawn();
}
_events.ScheduleEvent(EVENT_SET_CHANNELERS, 3s);
break;
case EVENT_IGNORED:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_IGNORED);
_events.ScheduleEvent(EVENT_IGNORED, 10000);
}
case EVENT_SET_CHANNELERS:
{
for (ObjectGuid guid : _bloodmageList)
if (Creature* bloodmage = ObjectAccessor::GetCreature(*me, guid))
bloodmage->CastSpell(nullptr, SPELL_SUMMON_CHANNEL);
for (ObjectGuid guid : _deathshaperList)
if (Creature* deathshaper = ObjectAccessor::GetCreature(*me, guid))
deathshaper->CastSpell(nullptr, SPELL_SUMMON_CHANNEL);
_events.ScheduleEvent(EVENT_SET_CHANNELERS, 12s);
break;
}
default:
break;
}
}
DoMeleeAttackIfReady();
}
private:
InstanceScript* _instance;
EventMap _events;
GuidList _bloodmageList;
GuidList _deathshaperList;
bool _enteredCombat;
};
if (!UpdateVictim())
return;
CreatureAI* GetAI(Creature* creature) const override
{
return GetBlackTempleAI<npc_wrathbone_flayerAI>(creature);
_events.Update(diff);
while (uint32 eventId = _events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_CLEAVE:
DoCastVictim(SPELL_CLEAVE);
_events.ScheduleEvent(EVENT_CLEAVE, 1s, 2s);
break;
case EVENT_IGNORED:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_IGNORED);
_events.ScheduleEvent(EVENT_IGNORED, 10s);
break;
default:
break;
}
}
DoMeleeAttackIfReady();
}
private:
InstanceScript* _instance;
EventMap _events;
GuidList _bloodmageList;
GuidList _deathshaperList;
bool _enteredCombat;
};
class npc_angered_soul_fragment : public CreatureScript
struct npc_angered_soul_fragment : public ScriptedAI
{
public:
npc_angered_soul_fragment() : CreatureScript("npc_angered_soul_fragment") { }
npc_angered_soul_fragment(Creature* creature) : ScriptedAI(creature) { }
struct npc_angered_soul_fragmentAI : public ScriptedAI
void Reset() override
{
npc_angered_soul_fragmentAI(Creature* creature) : ScriptedAI(creature) { }
_scheduler.CancelAll();
void Reset() override
_scheduler.Schedule(Seconds(1), GROUP_OUT_OF_COMBAT, [this](TaskContext invi)
{
_scheduler.CancelAll();
DoCastSelf(SPELL_GREATER_INVISIBILITY);
_scheduler.Schedule(Seconds(1), GROUP_OUT_OF_COMBAT, [this](TaskContext invi)
/* Workaround - On Retail creature appear and "vanish" again periodically, but i cant find packets
with UPDATE_AURA on sniffs about it */
_scheduler.Schedule(Seconds(5), Seconds(10), GROUP_OUT_OF_COMBAT, [this](TaskContext /*context*/)
{
DoCastSelf(SPELL_GREATER_INVISIBILITY);
/* Workaround - On Retail creature appear and "vanish" again periodically, but i cant find packets
with UPDATE_AURA on sniffs about it */
_scheduler.Schedule(Seconds(5), Seconds(10), GROUP_OUT_OF_COMBAT, [this](TaskContext /*context*/)
{
me->RemoveAurasDueToSpell(SPELL_GREATER_INVISIBILITY);
});
invi.Repeat(Seconds(15), Seconds(25));
me->RemoveAurasDueToSpell(SPELL_GREATER_INVISIBILITY);
});
}
void JustEngagedWith(Unit* /*who*/) override
{
me->RemoveAurasDueToSpell(SPELL_GREATER_INVISIBILITY);
_scheduler.CancelGroup(GROUP_OUT_OF_COMBAT);
_scheduler.Schedule(Seconds(1), [this](TaskContext anger)
{
Unit* target = me->GetVictim();
if (target && me->IsWithinMeleeRange(target))
DoCastSelf(SPELL_ANGER);
else
anger.Repeat(Seconds(1));
});
}
void UpdateAI(uint32 diff) override
{
_scheduler.Update(diff);
if (!UpdateVictim())
return;
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
DoMeleeAttackIfReady();
}
private:
TaskScheduler _scheduler;
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetBlackTempleAI<npc_angered_soul_fragmentAI>(creature);
invi.Repeat(Seconds(15), Seconds(25));
});
}
void JustEngagedWith(Unit* /*who*/) override
{
me->RemoveAurasDueToSpell(SPELL_GREATER_INVISIBILITY);
_scheduler.CancelGroup(GROUP_OUT_OF_COMBAT);
_scheduler.Schedule(Seconds(1), [this](TaskContext anger)
{
Unit* target = me->GetVictim();
if (target && me->IsWithinMeleeRange(target))
DoCastSelf(SPELL_ANGER);
else
anger.Repeat(Seconds(1));
});
}
void UpdateAI(uint32 diff) override
{
_scheduler.Update(diff);
if (!UpdateVictim())
return;
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
DoMeleeAttackIfReady();
}
private:
TaskScheduler _scheduler;
};
// 41986 - Anger
class spell_soul_fragment_anger : public SpellScriptLoader
class spell_soul_fragment_anger : public SpellScript
{
public:
spell_soul_fragment_anger() : SpellScriptLoader("spell_soul_fragment_anger") { }
void HandleKill()
{
if (Creature* caster = GetCaster()->ToCreature())
caster->DespawnOrUnsummon(Milliseconds(200));
}
class spell_soul_fragment_anger_SpellScript : public SpellScript
{
void HandleKill()
{
if (Creature* caster = GetCaster()->ToCreature())
caster->DespawnOrUnsummon(Milliseconds(200));
}
void Register() override
{
AfterCast.Register(&spell_soul_fragment_anger_SpellScript::HandleKill);
}
};
SpellScript* GetSpellScript() const override
{
return new spell_soul_fragment_anger_SpellScript();
}
void Register() override
{
AfterCast.Register(&spell_soul_fragment_anger::HandleKill);
}
};
// 39645 - Shadow Inferno
class spell_illidari_nightlord_shadow_inferno : public SpellScriptLoader
class spell_illidari_nightlord_shadow_inferno : public AuraScript
{
public:
spell_illidari_nightlord_shadow_inferno() : SpellScriptLoader("spell_illidari_nightlord_shadow_inferno") { }
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_SHADOW_INFERNO_DAMAGE });
}
class spell_illidari_nightlord_shadow_inferno_AuraScript : public AuraScript
{
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_SHADOW_INFERNO_DAMAGE });
}
void OnPeriodic(AuraEffect const* aurEffect)
{
PreventDefaultAction();
int32 bp = aurEffect->GetTickNumber() * aurEffect->GetAmount();
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SHADOW_INFERNO_DAMAGE, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellBP0(bp));
}
void OnPeriodic(AuraEffect const* aurEffect)
{
PreventDefaultAction();
int32 bp = aurEffect->GetTickNumber() * aurEffect->GetAmount();
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SHADOW_INFERNO_DAMAGE, CastSpellExtraArgs(true).AddSpellBP0(bp));
}
void Register() override
{
OnEffectPeriodic.Register(&spell_illidari_nightlord_shadow_inferno_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
}
};
AuraScript* GetAuraScript() const override
{
return new spell_illidari_nightlord_shadow_inferno_AuraScript();
}
void Register() override
{
OnEffectPeriodic.Register(&spell_illidari_nightlord_shadow_inferno::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
}
};
void AddSC_black_temple()
{
new npc_wrathbone_flayer();
new npc_angered_soul_fragment();
new spell_soul_fragment_anger();
new spell_illidari_nightlord_shadow_inferno();
RegisterBlackTempleCreatureAI(npc_wrathbone_flayer);
RegisterBlackTempleCreatureAI(npc_angered_soul_fragment);
RegisterSpellScript(spell_soul_fragment_anger);
RegisterSpellScript(spell_illidari_nightlord_shadow_inferno);
}
@@ -55,7 +55,8 @@ enum BTDataTypes
DATA_ESSENCE_OF_ANGER = 22,
DATA_ILLIDAN_MUSIC_CONTROLLER = 23,
DATA_TERON_GOREFIEND_INTRO = 24,
DATA_AKAMA_ILLIDAN_INTRO = 25
DATA_AKAMA_ILLIDAN_INTRO = 25,
DATA_RELIQUARY_COMBAT_TRIGGER = 26
};
enum TriggerEmotes
@@ -105,7 +106,11 @@ enum BTCreatureIds
NPC_ILLIDARI_ELITE = 23226,
NPC_GLAIVE_TARGET = 23448,
NPC_GLAIVE_WORLD_TRIGGER = 22515,
NPC_DEMON_FIRE = 23069
NPC_DEMON_FIRE = 23069,
NPC_PARASITIC_SHADOWFIEND = 23498,
NPC_BLAZE = 23259,
NPC_FLAME_CRASH = 23336,
NPC_RELIQUARY_COMBAT_TRIGGER = 23417
};
enum BTGameObjectIds
@@ -130,7 +135,6 @@ enum BTGameObjectIds
enum BlackTempleMisc
{
AKAMA_FACTION_COMBAT = 1868,
AKAMA_INTRO = 1,
AKAMA_FIGHT = 2,
ACTION_ACTIVE_AKAMA_INTRO = 3,
@@ -143,4 +147,6 @@ inline AI* GetBlackTempleAI(T* obj)
return GetInstanceAI<AI>(obj, BTScriptName);
}
#define RegisterBlackTempleCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetBlackTempleAI)
#endif // BLACK_TEMPLE_H_
@@ -89,318 +89,275 @@ enum Events
EVENT_CHARGE_PLAYER
};
class boss_gurtogg_bloodboil : public CreatureScript
struct boss_gurtogg_bloodboil : public BossAI
{
public:
boss_gurtogg_bloodboil() : CreatureScript("boss_gurtogg_bloodboil") { }
struct boss_gurtogg_bloodboilAI : public BossAI
boss_gurtogg_bloodboil(Creature* creature) : BossAI(creature, DATA_GURTOGG_BLOODBOIL)
{
boss_gurtogg_bloodboilAI(Creature* creature) : BossAI(creature, DATA_GURTOGG_BLOODBOIL)
{
Initialize();
}
Initialize();
}
void Reset() override
{
_Reset();
Initialize();
events.SetPhase(PHASE_1);
me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, false);
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, false);
}
void Reset() override
{
_Reset();
Initialize();
events.SetPhase(PHASE_1);
me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, false);
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, false);
}
void Initialize()
{
_oldThreat = 0.0f;
_oldTargetGUID.Clear();
_targetGUID.Clear();
}
void Initialize()
{
_oldThreat = 0.0f;
_oldTargetGUID.Clear();
_targetGUID.Clear();
}
bool CanAIAttack(Unit const* who) const override
{
return BossAI::CanAIAttack(who) && !who->HasAura(SPELL_BEWILDERING_STRIKE);
}
bool CanAIAttack(Unit const* who) const override
{
return BossAI::CanAIAttack(who) && !who->HasAura(SPELL_BEWILDERING_STRIKE);
}
void AttackStart(Unit* who) override
void AttackStart(Unit* who) override
{
if (!CanAIAttack(who))
return;
BossAI::AttackStart(who);
}
void JustEngagedWith(Unit* who) override
{
Talk(SAY_AGGRO);
BossAI::JustEngagedWith(who);
events.ScheduleEvent(EVENT_BERSERK, 10min);
events.ScheduleEvent(EVENT_CHANGE_PHASE, 1min);
ScheduleEvents();
}
void EnterEvadeMode(EvadeReason /*why*/) override
{
_DespawnAtEvade();
}
void ScheduleEvents()
{
if (events.IsInPhase(PHASE_1))
{
if (!CanAIAttack(who))
events.ScheduleEvent(EVENT_BLOODBOIL, Seconds(10), GROUP_PHASE_1, PHASE_1);
events.ScheduleEvent(EVENT_ARCING_SMASH, Seconds(10), GROUP_PHASE_1, PHASE_1);
events.ScheduleEvent(EVENT_FEL_ACID_BREATH, Seconds(25), GROUP_PHASE_1, PHASE_1);
events.ScheduleEvent(EVENT_EJECT, Seconds(35), GROUP_PHASE_1, PHASE_1);
events.ScheduleEvent(EVENT_BEWILDERING_STRIKE, Seconds(47), GROUP_PHASE_1, PHASE_1);
}
else if (events.IsInPhase(PHASE_2))
{
events.ScheduleEvent(EVENT_START_PHASE_2, Milliseconds(100), GROUP_PHASE_2, PHASE_2);
events.ScheduleEvent(EVENT_EJECT_2, Seconds(14), GROUP_PHASE_2, PHASE_2);
events.ScheduleEvent(EVENT_FEL_ACID_BREATH_2, Seconds(16), GROUP_PHASE_2, PHASE_2);
events.ScheduleEvent(EVENT_ARCING_SMASH_2, Seconds(8), GROUP_PHASE_2, PHASE_2);
}
}
void KilledUnit(Unit* victim) override
{
if (victim->GetTypeId() == TYPEID_PLAYER)
Talk(SAY_SLAY);
}
void JustDied(Unit* /*killer*/) override
{
_JustDied();
DoPlaySoundToSet(me, SOUND_ID_DEATH);
}
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_BLOODBOIL:
DoCast(SPELL_BLOODBOIL);
events.Repeat(Seconds(10));
break;
case EVENT_ARCING_SMASH:
DoCastVictim(SPELL_ARCING_SMASH);
events.Repeat(Seconds(10));
break;
case EVENT_FEL_ACID_BREATH:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, me->GetCombatReach()))
DoCast(target, SPELL_FEL_ACID_BREATH);
events.Repeat(Seconds(25), Seconds(30));
break;
case EVENT_EJECT:
Talk(SAY_SPECIAL);
DoCastVictim(SPELL_EJECT);
break;
case EVENT_BEWILDERING_STRIKE:
DoCastVictim(SPELL_BEWILDERING_STRIKE);
break;
case EVENT_CHANGE_PHASE:
ChangePhase();
break;
case EVENT_START_PHASE_2:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1))
{
if (Unit* oldTarget = me->GetVictim())
{
_oldTargetGUID = oldTarget->GetGUID();
_oldThreat = GetThreat(oldTarget);
}
_targetGUID = target->GetGUID();
DoCastSelf(SPELL_FEL_RAGE_SELF, true);
DoCast(target, SPELL_FEL_RAGE_TARGET, true);
DoCast(target, SPELL_FEL_RAGE_2, true);
DoCast(target, SPELL_FEL_RAGE_3, true);
DoCast(target, SPELL_FEL_GEYSER, true);
DoCast(target, SPELL_FEL_RAGE_TARGET_2, true);
target->CastSpell(target, SPELL_FEL_RAGE_P, true);
target->CastSpell(target, SPELL_TAUNT_GURTOGG, true);
DoCastAOE(SPELL_INSIGNIFIGANCE, true);
events.ScheduleEvent(EVENT_CHARGE_PLAYER, Seconds(2), GROUP_PHASE_2, PHASE_2);
me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true);
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, true);
}
else // If no other targets are found, reset phase 1
{
events.SetPhase(PHASE_1);
events.CancelEventGroup(GROUP_PHASE_2);
ScheduleEvents();
events.RescheduleEvent(EVENT_CHANGE_PHASE, Seconds(60));
}
break;
case EVENT_CHARGE_PLAYER:
if (Unit* target = ObjectAccessor::GetUnit(*me, _targetGUID))
DoCast(target, SPELL_CHARGE);
break;
case EVENT_EJECT_2:
DoCastVictim(SPELL_EJECT_2);
break;
case EVENT_FEL_ACID_BREATH_2:
DoCastVictim(SPELL_FEL_ACID_BREATH_2);
break;
case EVENT_ARCING_SMASH_2:
DoCastVictim(SPELL_ARCING_SMASH_2);
events.Repeat(Seconds(13));
break;
case EVENT_BERSERK:
DoCast(SPELL_BERSERK);
roll_chance_i(50) ? Talk(SAY_ENRAGE) : DoPlaySoundToSet(me, SOUND_ID_ENRAGE);
break;
default:
break;
}
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
BossAI::AttackStart(who);
}
void JustEngagedWith(Unit* who) override
DoMeleeAttackIfReady();
}
void ChangePhase()
{
if (events.IsInPhase(PHASE_1))
{
BossAI::JustEngagedWith(who);
Talk(SAY_AGGRO);
events.ScheduleEvent(EVENT_BERSERK, Minutes(10));
events.ScheduleEvent(EVENT_CHANGE_PHASE, Seconds(60));
events.SetPhase(PHASE_2);
events.CancelEventGroup(GROUP_PHASE_1);
events.ScheduleEvent(EVENT_CHANGE_PHASE, 30s);
ScheduleEvents();
}
void EnterEvadeMode(EvadeReason /*why*/) override
else if (events.IsInPhase(PHASE_2))
{
_DespawnAtEvade();
}
events.SetPhase(PHASE_1);
events.CancelEventGroup(GROUP_PHASE_2);
events.ScheduleEvent(EVENT_CHANGE_PHASE, 1min);
me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, false);
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, false);
ScheduleEvents();
void ScheduleEvents()
{
if (events.IsInPhase(PHASE_1))
{
events.ScheduleEvent(EVENT_BLOODBOIL, Seconds(10), GROUP_PHASE_1, PHASE_1);
events.ScheduleEvent(EVENT_ARCING_SMASH, Seconds(10), GROUP_PHASE_1, PHASE_1);
events.ScheduleEvent(EVENT_FEL_ACID_BREATH, Seconds(25), GROUP_PHASE_1, PHASE_1);
events.ScheduleEvent(EVENT_EJECT, Seconds(35), GROUP_PHASE_1, PHASE_1);
events.ScheduleEvent(EVENT_BEWILDERING_STRIKE, Seconds(47), GROUP_PHASE_1, PHASE_1);
}
else if (events.IsInPhase(PHASE_2))
{
events.ScheduleEvent(EVENT_START_PHASE_2, Milliseconds(100), GROUP_PHASE_2, PHASE_2);
events.ScheduleEvent(EVENT_EJECT_2, Seconds(14), GROUP_PHASE_2, PHASE_2);
events.ScheduleEvent(EVENT_FEL_ACID_BREATH_2, Seconds(16), GROUP_PHASE_2, PHASE_2);
events.ScheduleEvent(EVENT_ARCING_SMASH_2, Seconds(8), GROUP_PHASE_2, PHASE_2);
}
}
void KilledUnit(Unit* victim) override
{
if (victim->GetTypeId() == TYPEID_PLAYER)
Talk(SAY_SLAY);
}
void JustDied(Unit* /*killer*/) override
{
_JustDied();
DoPlaySoundToSet(me, SOUND_ID_DEATH);
}
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)
// Attack the stored target
if (Unit* oldTarget = ObjectAccessor::GetUnit(*me, _oldTargetGUID))
if (Unit* currentTarget = ObjectAccessor::GetUnit(*me, _targetGUID))
{
case EVENT_BLOODBOIL:
DoCast(SPELL_BLOODBOIL);
events.Repeat(Seconds(10));
break;
case EVENT_ARCING_SMASH:
DoCastVictim(SPELL_ARCING_SMASH);
events.Repeat(Seconds(10));
break;
case EVENT_FEL_ACID_BREATH:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, me->GetCombatReach()))
DoCast(target, SPELL_FEL_ACID_BREATH);
events.Repeat(Seconds(25), Seconds(30));
break;
case EVENT_EJECT:
Talk(SAY_SPECIAL);
DoCastVictim(SPELL_EJECT);
break;
case EVENT_BEWILDERING_STRIKE:
DoCastVictim(SPELL_BEWILDERING_STRIKE);
break;
case EVENT_CHANGE_PHASE:
ChangePhase();
break;
case EVENT_START_PHASE_2:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1))
{
if (Unit* oldTarget = me->GetVictim())
{
_oldTargetGUID = oldTarget->GetGUID();
_oldThreat = GetThreat(oldTarget);
}
_targetGUID = target->GetGUID();
DoCastSelf(SPELL_FEL_RAGE_SELF, true);
DoCast(target, SPELL_FEL_RAGE_TARGET, true);
DoCast(target, SPELL_FEL_RAGE_2, true);
DoCast(target, SPELL_FEL_RAGE_3, true);
DoCast(target, SPELL_FEL_GEYSER, true);
DoCast(target, SPELL_FEL_RAGE_TARGET_2, true);
target->CastSpell(target, SPELL_FEL_RAGE_P, true);
target->CastSpell(target, SPELL_TAUNT_GURTOGG, true);
DoCastAOE(SPELL_INSIGNIFIGANCE, true);
events.ScheduleEvent(EVENT_CHARGE_PLAYER, Seconds(2), GROUP_PHASE_2, PHASE_2);
me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true);
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, true);
}
else // If no other targets are found, reset phase 1
{
events.SetPhase(PHASE_1);
events.CancelEventGroup(GROUP_PHASE_2);
ScheduleEvents();
events.RescheduleEvent(EVENT_CHANGE_PHASE, Seconds(60));
}
break;
case EVENT_CHARGE_PLAYER:
if (Unit* target = ObjectAccessor::GetUnit(*me, _targetGUID))
DoCast(target, SPELL_CHARGE);
break;
case EVENT_EJECT_2:
DoCastVictim(SPELL_EJECT_2);
break;
case EVENT_FEL_ACID_BREATH_2:
DoCastVictim(SPELL_FEL_ACID_BREATH_2);
break;
case EVENT_ARCING_SMASH_2:
DoCastVictim(SPELL_ARCING_SMASH_2);
events.Repeat(Seconds(13));
break;
case EVENT_BERSERK:
DoCast(SPELL_BERSERK);
roll_chance_i(50) ? Talk(SAY_ENRAGE) : DoPlaySoundToSet(me, SOUND_ID_ENRAGE);
break;
default:
break;
ModifyThreatByPercent(currentTarget, -100);
AttackStart(oldTarget);
AddThreat(oldTarget, _oldThreat);
Initialize();
}
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
}
DoMeleeAttackIfReady();
}
void ChangePhase()
{
if (events.IsInPhase(PHASE_1))
{
events.SetPhase(PHASE_2);
events.CancelEventGroup(GROUP_PHASE_1);
events.ScheduleEvent(EVENT_CHANGE_PHASE, Seconds(30));
ScheduleEvents();
}
else if (events.IsInPhase(PHASE_2))
{
events.SetPhase(PHASE_1);
events.CancelEventGroup(GROUP_PHASE_2);
events.ScheduleEvent(EVENT_CHANGE_PHASE, Seconds(60));
me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, false);
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, false);
ScheduleEvents();
// Attack the stored target
if (Unit* oldTarget = ObjectAccessor::GetUnit(*me, _oldTargetGUID))
if (Unit* currentTarget = ObjectAccessor::GetUnit(*me, _targetGUID))
{
ModifyThreatByPercent(currentTarget, -100);
AttackStart(oldTarget);
AddThreat(oldTarget, _oldThreat);
Initialize();
}
}
}
private:
ObjectGuid _targetGUID;
ObjectGuid _oldTargetGUID;
float _oldThreat;
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetBlackTempleAI<boss_gurtogg_bloodboilAI>(creature);
}
private:
ObjectGuid _targetGUID;
ObjectGuid _oldTargetGUID;
float _oldThreat;
};
class npc_fel_geyser : public CreatureScript
struct npc_fel_geyser : public PassiveAI
{
public:
npc_fel_geyser() : CreatureScript("npc_fel_geyser") { }
npc_fel_geyser(Creature* creature) : PassiveAI(creature) { }
struct npc_fel_geyserAI : public PassiveAI
void Reset() override
{
npc_fel_geyserAI(Creature* creature) : PassiveAI(creature) { }
void Reset() override
{
DoCastSelf(SPELL_FEL_GEYSER_2, true);
DoCastSelf(SPELL_BIRTH, true);
}
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetBlackTempleAI<npc_fel_geyserAI>(creature);
DoCastSelf(SPELL_FEL_GEYSER_2, true);
DoCastSelf(SPELL_BIRTH, true);
}
};
// 42005 - Bloodboil
class spell_gurtogg_bloodboil_bloodboil : public SpellScriptLoader
class spell_gurtogg_bloodboil_bloodboil : public SpellScript
{
public:
spell_gurtogg_bloodboil_bloodboil() : SpellScriptLoader("spell_gurtogg_bloodboil_bloodboil") { }
void FilterTargets(std::list<WorldObject*>& targets)
{
if (targets.size() <= 5)
return;
class spell_gurtogg_bloodboil_bloodboil_SpellScript : public SpellScript
{
void FilterTargets(std::list<WorldObject*>& targets)
{
if (targets.size() <= 5)
return;
// Sort the list of players
targets.sort(Trinity::ObjectDistanceOrderPred(GetCaster(), false));
// Resize so we only get top 5
targets.resize(5);
}
// Sort the list of players
targets.sort(Trinity::ObjectDistanceOrderPred(GetCaster(), false));
// Resize so we only get top 5
targets.resize(5);
}
void Register() override
{
OnObjectAreaTargetSelect.Register(&spell_gurtogg_bloodboil_bloodboil_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
}
};
SpellScript* GetSpellScript() const override
{
return new spell_gurtogg_bloodboil_bloodboil_SpellScript();
}
void Register() override
{
OnObjectAreaTargetSelect.Register(&spell_gurtogg_bloodboil_bloodboil::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
}
};
// 40618 - Insignificance
class spell_gurtogg_bloodboil_insignificance : public SpellScriptLoader
class spell_gurtogg_bloodboil_insignificance : public SpellScript
{
public:
spell_gurtogg_bloodboil_insignificance() : SpellScriptLoader("spell_gurtogg_bloodboil_insignificance") { }
class spell_gurtogg_bloodboil_insignificance_SpellScript : public SpellScript
bool Validate(SpellInfo const* /*spell*/) override
{
bool Validate(SpellInfo const* /*spell*/) override
{
return ValidateSpellInfo({ SPELL_FEL_RAGE_TARGET });
}
return ValidateSpellInfo({ SPELL_FEL_RAGE_TARGET });
}
void FilterTargets(std::list<WorldObject*>& targets)
{
targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_FEL_RAGE_TARGET));
}
void Register() override
{
OnObjectAreaTargetSelect.Register(&spell_gurtogg_bloodboil_insignificance_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
}
};
SpellScript* GetSpellScript() const override
void FilterTargets(std::list<WorldObject*>& targets)
{
return new spell_gurtogg_bloodboil_insignificance_SpellScript();
targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_FEL_RAGE_TARGET));
}
void Register() override
{
OnObjectAreaTargetSelect.Register(&spell_gurtogg_bloodboil_insignificance::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
}
};
void AddSC_boss_gurtogg_bloodboil()
{
new boss_gurtogg_bloodboil();
new npc_fel_geyser();
new spell_gurtogg_bloodboil_bloodboil();
new spell_gurtogg_bloodboil_insignificance();
RegisterBlackTempleCreatureAI(boss_gurtogg_bloodboil);
RegisterBlackTempleCreatureAI(npc_fel_geyser);
RegisterSpellScript(spell_gurtogg_bloodboil_bloodboil);
RegisterSpellScript(spell_gurtogg_bloodboil_insignificance);
}
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -17,11 +17,11 @@
#include "ScriptMgr.h"
#include "black_temple.h"
#include "GridNotifiers.h"
#include "ScriptedCreature.h"
#include "SpellAuraEffects.h"
#include "black_temple.h"
#include "SpellScript.h"
#include "SpellAuraEffects.h"
#include "GridNotifiers.h"
enum Texts
{
@@ -40,7 +40,7 @@ enum Spells
SPELL_FATAL_ATTRACTION_DAMAGE = 40871,
SPELL_SILENCING_SHRIEK = 40823,
SPELL_SABER_LASH_IMMUNITY = 43690,
SPELL_FATAL_ATTACTION_TELEPORT = 40869,
SPELL_FATAL_ATTRACTION_TELEPORT = 40869,
SPELL_BERSERK = 45078,
SPELL_FATAL_ATTRACTION = 41001,
SPELL_SINISTER_PERIODIC = 40863,
@@ -96,296 +96,223 @@ uint32 const PrismaticAuras[6]=
SPELL_PRISMATIC_AURA_HOLY
};
Position const TeleportPoint[7]=
struct boss_mother_shahraz : public BossAI
{
{ 959.996f, 212.576f, 193.843f },
{ 932.537f, 231.813f, 193.838f },
{ 958.675f, 254.767f, 193.822f },
{ 946.955f, 201.316f, 192.535f },
{ 944.294f, 149.676f, 197.551f },
{ 930.548f, 284.888f, 193.367f },
{ 965.997f, 278.398f, 195.777f }
};
boss_mother_shahraz(Creature* creature) : BossAI(creature, DATA_MOTHER_SHAHRAZ), _enraged(false) { }
class boss_mother_shahraz : public CreatureScript
{
public:
boss_mother_shahraz() : CreatureScript("boss_mother_shahraz") { }
struct boss_shahrazAI : public BossAI
void Reset() override
{
boss_shahrazAI(Creature* creature) : BossAI(creature, DATA_MOTHER_SHAHRAZ), _enraged(false) { }
void Reset() override
{
_Reset();
_enraged = false;
}
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
Talk(SAY_AGGRO);
events.ScheduleEvent(EVENT_SILENCING_SHRIEK, Seconds(22));
events.ScheduleEvent(EVENT_PRISMATIC_SHIELD, Seconds(15));
events.ScheduleEvent(EVENT_FATAL_ATTRACTION, Seconds(35));
events.ScheduleEvent(EVENT_RANDOM_BEAM, Seconds(6));
events.ScheduleEvent(EVENT_BERSERK, Minutes(10));
events.ScheduleEvent(EVENT_TAUNT, Seconds(35));
}
void KilledUnit(Unit* victim) override
{
if (victim->GetTypeId() == TYPEID_PLAYER)
Talk(SAY_SLAY);
}
void JustDied(Unit* /*killer*/) override
{
_JustDied();
Talk(SAY_DEATH);
}
void EnterEvadeMode(EvadeReason /*why*/) override
{
_DespawnAtEvade();
}
void DamageTaken(Unit* /*attacker*/, uint32 &damage) override
{
if (!_enraged && me->HealthBelowPctDamaged(10, damage))
{
_enraged = true;
DoCastSelf(SPELL_RANDOM_PERIODIC, true);
Talk(EMOTE_ENRAGE, me);
Talk(SAY_ENRAGE);
}
}
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case EVENT_RANDOM_BEAM:
DoCastSelf(BeamTriggers[urand(0, 3)]);
events.Repeat(Seconds(30));
break;
case EVENT_PRISMATIC_SHIELD:
DoCastSelf(PrismaticAuras[urand(0, 5)]);
events.Repeat(Seconds(15));
break;
case EVENT_FATAL_ATTRACTION:
Talk(SAY_SPELL);
DoCastSelf(SPELL_FATAL_ATTACTION_TELEPORT, { SPELLVALUE_MAX_TARGETS, 3 });
events.Repeat(Seconds(30));
break;
case EVENT_SILENCING_SHRIEK:
DoCastVictim(SPELL_SILENCING_SHRIEK);
events.Repeat(Seconds(18), Seconds(30));
break;
case EVENT_TAUNT:
Talk(SAY_TAUNT);
events.Repeat(Seconds(30), Seconds(40));
break;
case EVENT_BERSERK:
Talk(EMOTE_BERSERK, me);
DoCastSelf(SPELL_BERSERK);
break;
default:
break;
}
}
private:
bool _enraged;
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetBlackTempleAI<boss_shahrazAI>(creature);
_Reset();
_enraged = false;
}
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
Talk(SAY_AGGRO);
events.ScheduleEvent(EVENT_SILENCING_SHRIEK, 22s);
events.ScheduleEvent(EVENT_PRISMATIC_SHIELD, 15s);
events.ScheduleEvent(EVENT_FATAL_ATTRACTION, 35s);
events.ScheduleEvent(EVENT_RANDOM_BEAM, 6s);
events.ScheduleEvent(EVENT_BERSERK, 10min);
events.ScheduleEvent(EVENT_TAUNT, 35s);
}
void KilledUnit(Unit* victim) override
{
if (victim->GetTypeId() == TYPEID_PLAYER)
Talk(SAY_SLAY);
}
void JustDied(Unit* /*killer*/) override
{
_JustDied();
Talk(SAY_DEATH);
}
void EnterEvadeMode(EvadeReason /*why*/) override
{
_DespawnAtEvade();
}
void DamageTaken(Unit* /*attacker*/, uint32 &damage) override
{
if (!_enraged && me->HealthBelowPctDamaged(10, damage))
{
_enraged = true;
DoCastSelf(SPELL_RANDOM_PERIODIC, true);
Talk(EMOTE_ENRAGE, me);
Talk(SAY_ENRAGE);
}
}
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case EVENT_RANDOM_BEAM:
DoCastSelf(BeamTriggers[urand(0, 3)]);
events.Repeat(Seconds(30));
break;
case EVENT_PRISMATIC_SHIELD:
DoCastSelf(PrismaticAuras[urand(0, 5)]);
events.Repeat(Seconds(15));
break;
case EVENT_FATAL_ATTRACTION:
Talk(SAY_SPELL);
DoCastSelf(SPELL_FATAL_ATTRACTION_TELEPORT, { SPELLVALUE_MAX_TARGETS, 3 });
events.Repeat(Seconds(30));
break;
case EVENT_SILENCING_SHRIEK:
DoCastVictim(SPELL_SILENCING_SHRIEK);
events.Repeat(Seconds(18), Seconds(30));
break;
case EVENT_TAUNT:
Talk(SAY_TAUNT);
events.Repeat(Seconds(30), Seconds(40));
break;
case EVENT_BERSERK:
Talk(EMOTE_BERSERK, me);
DoCastSelf(SPELL_BERSERK);
break;
default:
break;
}
}
private:
bool _enraged;
};
// 40869 - Fatal Attraction
class spell_mother_shahraz_fatal_attraction : public SpellScriptLoader
class spell_mother_shahraz_fatal_attraction : public SpellScript
{
public:
spell_mother_shahraz_fatal_attraction() : SpellScriptLoader("spell_mother_shahraz_fatal_attraction") { }
class spell_mother_shahraz_fatal_attraction_SpellScript : public SpellScript
bool Validate(SpellInfo const* /*spell*/) override
{
return ValidateSpellInfo(
{
bool Validate(SpellInfo const* /*spell*/) override
{
return ValidateSpellInfo({ SPELL_SABER_LASH_IMMUNITY, SPELL_FATAL_ATTRACTION });
}
SPELL_SABER_LASH_IMMUNITY,
SPELL_FATAL_ATTRACTION
});
}
void FilterTargets(std::list<WorldObject*>& targets)
{
targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_SABER_LASH_IMMUNITY));
}
void FilterTargets(std::list<WorldObject*>& targets)
{
targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_SABER_LASH_IMMUNITY));
}
void SetDest(SpellDestination& dest)
{
dest.Relocate(TeleportPoint[urand(0, 6)]);
}
void SetDest(SpellDestination& dest)
{
dest.Relocate(GetCaster()->GetRandomNearPosition(50.0f));
}
void HandleTeleport(SpellEffIndex /*effIndex*/)
{
GetCaster()->CastSpell(GetHitUnit(), SPELL_FATAL_ATTRACTION, true);
}
void HandleTeleport(SpellEffIndex /*effIndex*/)
{
GetCaster()->CastSpell(GetHitUnit(), SPELL_FATAL_ATTRACTION, true);
}
void Register() override
{
OnObjectAreaTargetSelect.Register(&spell_mother_shahraz_fatal_attraction_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY);
OnDestinationTargetSelect.Register(&spell_mother_shahraz_fatal_attraction_SpellScript::SetDest, EFFECT_1, TARGET_DEST_CASTER_RANDOM);
OnEffectHitTarget.Register(&spell_mother_shahraz_fatal_attraction_SpellScript::HandleTeleport, EFFECT_1, SPELL_EFFECT_TELEPORT_UNITS);
}
};
SpellScript* GetSpellScript() const override
{
return new spell_mother_shahraz_fatal_attraction_SpellScript();
}
void Register() override
{
OnObjectAreaTargetSelect.Register(&spell_mother_shahraz_fatal_attraction::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY);
OnDestinationTargetSelect.Register(&spell_mother_shahraz_fatal_attraction::SetDest, EFFECT_1, TARGET_DEST_CASTER_RANDOM);
OnEffectHitTarget.Register(&spell_mother_shahraz_fatal_attraction::HandleTeleport, EFFECT_1, SPELL_EFFECT_TELEPORT_UNITS);
}
};
// 40870 - Fatal Attraction Dummy Visual
class spell_mother_shahraz_fatal_attraction_link : public SpellScriptLoader
class spell_mother_shahraz_fatal_attraction_link : public SpellScript
{
public:
spell_mother_shahraz_fatal_attraction_link() : SpellScriptLoader("spell_mother_shahraz_fatal_attraction_link") { }
bool Validate(SpellInfo const* /*spell*/) override
{
return ValidateSpellInfo({ SPELL_FATAL_ATTRACTION_DAMAGE });
}
class spell_mother_shahraz_fatal_attraction_link_SpellScript : public SpellScript
{
bool Validate(SpellInfo const* /*spell*/) override
{
return ValidateSpellInfo({ SPELL_FATAL_ATTRACTION_DAMAGE });
}
void HandleDummy(SpellEffIndex /*effIndex*/)
{
GetCaster()->CastSpell(GetCaster(), SPELL_FATAL_ATTRACTION_DAMAGE, true);
}
void HandleDummy(SpellEffIndex /*effIndex*/)
{
GetCaster()->CastSpell(GetCaster(), SPELL_FATAL_ATTRACTION_DAMAGE, true);
}
void Register() override
{
OnEffectHitTarget.Register(&spell_mother_shahraz_fatal_attraction_link_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
SpellScript* GetSpellScript() const override
{
return new spell_mother_shahraz_fatal_attraction_link_SpellScript();
}
void Register() override
{
OnEffectHitTarget.Register(&spell_mother_shahraz_fatal_attraction_link::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
// 40816 - Saber Lash
class spell_mother_shahraz_saber_lash : public SpellScriptLoader
class spell_mother_shahraz_saber_lash : public AuraScript
{
public:
spell_mother_shahraz_saber_lash() : SpellScriptLoader("spell_mother_shahraz_saber_lash") { }
bool Validate(SpellInfo const* spellInfo) override
{
return ValidateSpellInfo({ spellInfo->Effects[EFFECT_1].TriggerSpell });
}
class spell_mother_shahraz_saber_lash_AuraScript : public AuraScript
{
bool Validate(SpellInfo const* spellInfo) override
{
return ValidateSpellInfo({ spellInfo->Effects[EFFECT_1].TriggerSpell });
}
void OnTrigger(AuraEffect const* aurEff)
{
PreventDefaultAction();
void OnTrigger(AuraEffect const* aurEff)
{
PreventDefaultAction();
uint32 triggerSpell = GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell;
if (Unit* target = GetUnitOwner()->GetAI()->SelectTarget(SELECT_TARGET_RANDOM, 0))
GetUnitOwner()->CastSpell(target, triggerSpell, true);
}
uint32 triggerSpell = GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell;
if (Unit* target = GetUnitOwner()->GetAI()->SelectTarget(SELECT_TARGET_RANDOM, 0))
GetUnitOwner()->CastSpell(target, triggerSpell, true);
}
void Register() override
{
OnEffectPeriodic.Register(&spell_mother_shahraz_saber_lash_AuraScript::OnTrigger, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
}
};
AuraScript* GetAuraScript() const override
{
return new spell_mother_shahraz_saber_lash_AuraScript();
}
void Register() override
{
OnEffectPeriodic.Register(&spell_mother_shahraz_saber_lash::OnTrigger, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
}
};
/* 40863 - Sinister Periodic
40865 - Vile Periodic
40866 - Wicked Periodic
40862 - Sinful Periodic */
class spell_mother_shahraz_generic_periodic : public SpellScriptLoader
class spell_mother_shahraz_generic_periodic : public AuraScript
{
public:
spell_mother_shahraz_generic_periodic() : SpellScriptLoader("spell_mother_shahraz_generic_periodic") { }
bool Validate(SpellInfo const* spellInfo) override
{
return ValidateSpellInfo({ spellInfo->Effects[EFFECT_0].TriggerSpell });
}
class spell_mother_shahraz_generic_periodic_AuraScript : public AuraScript
{
bool Validate(SpellInfo const* spellInfo) override
{
return ValidateSpellInfo({ spellInfo->Effects[EFFECT_0].TriggerSpell });
}
void OnTrigger(AuraEffect const* aurEff)
{
PreventDefaultAction();
void OnTrigger(AuraEffect const* aurEff)
{
PreventDefaultAction();
uint32 triggerSpell = GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell;
if (Unit* target = GetUnitOwner()->GetAI()->SelectTarget(SELECT_TARGET_RANDOM, 0))
GetUnitOwner()->CastSpell(target, triggerSpell, true);
}
uint32 triggerSpell = GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell;
if (Unit* target = GetUnitOwner()->GetAI()->SelectTarget(SELECT_TARGET_RANDOM, 0))
GetUnitOwner()->CastSpell(target, triggerSpell, true);
}
void Register() override
{
OnEffectPeriodic.Register(&spell_mother_shahraz_generic_periodic_AuraScript::OnTrigger, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
}
};
AuraScript* GetAuraScript() const override
{
return new spell_mother_shahraz_generic_periodic_AuraScript();
}
void Register() override
{
OnEffectPeriodic.Register(&spell_mother_shahraz_generic_periodic::OnTrigger, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
}
};
// 40867 - Random Periodic
class spell_mother_shahraz_random_periodic : public SpellScriptLoader
class spell_mother_shahraz_random_periodic : public AuraScript
{
public:
spell_mother_shahraz_random_periodic() : SpellScriptLoader("spell_mother_shahraz_random_periodic") { }
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo(RandomBeam);
}
class spell_mother_shahraz_random_periodic_AuraScript : public AuraScript
{
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo(RandomBeam);
}
void OnPeriodic(AuraEffect const* /*aurEffect*/)
{
PreventDefaultAction();
GetUnitOwner()->CastSpell(GetUnitOwner(), RandomBeam[urand(0, 3)], true);
}
void OnPeriodic(AuraEffect const* /*aurEffect*/)
{
PreventDefaultAction();
GetUnitOwner()->CastSpell(GetUnitOwner(), RandomBeam[urand(0, 3)], true);
}
void Register() override
{
OnEffectPeriodic.Register(&spell_mother_shahraz_random_periodic_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
}
};
AuraScript* GetAuraScript() const override
{
return new spell_mother_shahraz_random_periodic_AuraScript();
}
void Register() override
{
OnEffectPeriodic.Register(&spell_mother_shahraz_random_periodic::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
}
};
void AddSC_boss_mother_shahraz()
{
new boss_mother_shahraz();
new spell_mother_shahraz_fatal_attraction();
new spell_mother_shahraz_fatal_attraction_link();
new spell_mother_shahraz_saber_lash();
new spell_mother_shahraz_generic_periodic();
new spell_mother_shahraz_random_periodic();
RegisterBlackTempleCreatureAI(boss_mother_shahraz);
RegisterSpellScript(spell_mother_shahraz_fatal_attraction);
RegisterSpellScript(spell_mother_shahraz_fatal_attraction_link);
RegisterSpellScript(spell_mother_shahraz_saber_lash);
RegisterSpellScript(spell_mother_shahraz_generic_periodic);
RegisterSpellScript(spell_mother_shahraz_random_periodic);
}
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -63,200 +63,165 @@ enum Actions
{
ACTION_DISABLE_VULCANO = 1
};
class boss_supremus : public CreatureScript
struct boss_supremus : public BossAI
{
public:
boss_supremus() : CreatureScript("boss_supremus") { }
boss_supremus(Creature* creature) : BossAI(creature, DATA_SUPREMUS) { }
struct boss_supremusAI : public BossAI
void Reset() override
{
boss_supremusAI(Creature* creature) : BossAI(creature, DATA_SUPREMUS) { }
_Reset();
events.SetPhase(PHASE_INITIAL);
me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, false);
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, false);
}
void Reset() override
void EnterEvadeMode(EvadeReason /*why*/) override
{
summons.DespawnAll();
_DespawnAtEvade();
}
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
ChangePhase();
events.ScheduleEvent(EVENT_BERSERK, 15min);
events.ScheduleEvent(EVENT_FLAME, 20s);
}
void ChangePhase()
{
if (events.IsInPhase(PHASE_INITIAL) || events.IsInPhase(PHASE_CHASE))
{
_Reset();
events.SetPhase(PHASE_INITIAL);
events.SetPhase(PHASE_STRIKE);
DummyEntryCheckPredicate pred;
summons.DoAction(ACTION_DISABLE_VULCANO, pred);
events.ScheduleEvent(EVENT_HATEFUL_STRIKE, Seconds(2), 0, PHASE_STRIKE);
me->RemoveAurasDueToSpell(SPELL_SNARE_SELF);
me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, false);
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, false);
}
void EnterEvadeMode(EvadeReason /*why*/) override
else
{
summons.DespawnAll();
_DespawnAtEvade();
events.SetPhase(PHASE_CHASE);
events.ScheduleEvent(EVENT_VOLCANO, Seconds(5), 0, PHASE_CHASE);
events.ScheduleEvent(EVENT_SWITCH_TARGET, Seconds(10), 0, PHASE_CHASE);
me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true);
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, true);
DoCast(SPELL_SNARE_SELF);
}
ResetThreatList();
DoZoneInCombat();
events.ScheduleEvent(EVENT_SWITCH_PHASE, 1min);
}
void JustEngagedWith(Unit* who) override
Unit* CalculateHatefulStrikeTarget()
{
uint32 health = 0;
Unit* target = nullptr;
for (auto* ref : me->GetThreatManager().GetUnsortedThreatList())
{
BossAI::JustEngagedWith(who);
ChangePhase();
events.ScheduleEvent(EVENT_BERSERK, Minutes(15));
events.ScheduleEvent(EVENT_FLAME, Seconds(20));
}
void ChangePhase()
{
if (events.IsInPhase(PHASE_INITIAL) || events.IsInPhase(PHASE_CHASE))
Unit* unit = ref->GetVictim();
if (me->IsWithinMeleeRange(unit))
{
events.SetPhase(PHASE_STRIKE);
DummyEntryCheckPredicate pred;
summons.DoAction(ACTION_DISABLE_VULCANO, pred);
events.ScheduleEvent(EVENT_HATEFUL_STRIKE, Seconds(2), 0, PHASE_STRIKE);
me->RemoveAurasDueToSpell(SPELL_SNARE_SELF);
me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, false);
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, false);
}
else
{
events.SetPhase(PHASE_CHASE);
events.ScheduleEvent(EVENT_VOLCANO, Seconds(5), 0, PHASE_CHASE);
events.ScheduleEvent(EVENT_SWITCH_TARGET, Seconds(10), 0, PHASE_CHASE);
me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true);
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, true);
DoCast(SPELL_SNARE_SELF);
}
ResetThreatList();
DoZoneInCombat();
events.ScheduleEvent(EVENT_SWITCH_PHASE, Seconds(60));
}
Unit* CalculateHatefulStrikeTarget()
{
uint32 health = 0;
Unit* target = nullptr;
for (auto* ref : me->GetThreatManager().GetUnsortedThreatList())
{
Unit* unit = ref->GetVictim();
if (me->IsWithinMeleeRange(unit))
if (unit->GetHealth() > health)
{
if (unit->GetHealth() > health)
{
health = unit->GetHealth();
target = unit;
}
health = unit->GetHealth();
target = unit;
}
}
return target;
}
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case EVENT_BERSERK:
DoCastSelf(SPELL_BERSERK, true);
break;
case EVENT_FLAME:
DoCast(SPELL_MOLTEN_PUNCH);
events.Repeat(Seconds(15), Seconds(20));
break;
case EVENT_HATEFUL_STRIKE:
if (Unit* target = CalculateHatefulStrikeTarget())
DoCast(target, SPELL_HATEFUL_STRIKE);
events.Repeat(Seconds(5));
break;
case EVENT_SWITCH_TARGET:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100.0f, true))
{
ResetThreatList();
AddThreat(target, 1000000.0f);
DoCast(target, SPELL_CHARGE);
Talk(EMOTE_NEW_TARGET);
}
events.Repeat(Seconds(10));
break;
case EVENT_VOLCANO:
DoCastAOE(SPELL_VOLCANIC_SUMMON, true);
Talk(EMOTE_GROUND_CRACK);
events.Repeat(Seconds(10));
break;
case EVENT_SWITCH_PHASE:
ChangePhase();
break;
default:
break;
}
}
return target;
}
};
CreatureAI* GetAI(Creature* creature) const override
void ExecuteEvent(uint32 eventId) override
{
return GetBlackTempleAI<boss_supremusAI>(creature);
switch (eventId)
{
case EVENT_BERSERK:
DoCastSelf(SPELL_BERSERK, true);
break;
case EVENT_FLAME:
DoCast(SPELL_MOLTEN_PUNCH);
events.Repeat(Seconds(15), Seconds(20));
break;
case EVENT_HATEFUL_STRIKE:
if (Unit* target = CalculateHatefulStrikeTarget())
DoCast(target, SPELL_HATEFUL_STRIKE);
events.Repeat(Seconds(5));
break;
case EVENT_SWITCH_TARGET:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100.0f, true))
{
ResetThreatList();
AddThreat(target, 1000000.0f);
DoCast(target, SPELL_CHARGE);
Talk(EMOTE_NEW_TARGET);
}
events.Repeat(Seconds(10));
break;
case EVENT_VOLCANO:
DoCastAOE(SPELL_VOLCANIC_SUMMON, true);
Talk(EMOTE_GROUND_CRACK);
events.Repeat(Seconds(10));
break;
case EVENT_SWITCH_PHASE:
ChangePhase();
break;
default:
break;
}
}
};
class npc_molten_flame : public CreatureScript
struct npc_molten_flame : public NullCreatureAI
{
public:
npc_molten_flame() : CreatureScript("npc_molten_flame") { }
npc_molten_flame(Creature* creature) : NullCreatureAI(creature) { }
struct npc_molten_flameAI : public NullCreatureAI
void InitializeAI() override
{
npc_molten_flameAI(Creature* creature) : NullCreatureAI(creature) { }
void InitializeAI() override
{
float x, y, z;
me->GetNearPoint(me, x, y, z, 100.0f, frand(0.f, 2.f * float(M_PI)));
me->GetMotionMaster()->MovePoint(0, x, y, z);
DoCastSelf(SPELL_MOLTEN_FLAME, true);
}
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetBlackTempleAI<npc_molten_flameAI>(creature);
float x, y, z;
me->GetNearPoint(me, x, y, z, 100.0f, frand(0.f, 2.f * float(M_PI)));
me->GetMotionMaster()->MovePoint(0, x, y, z);
DoCastSelf(SPELL_MOLTEN_FLAME, true);
}
};
class npc_volcano : public CreatureScript
struct npc_volcano : public NullCreatureAI
{
public:
npc_volcano() : CreatureScript("npc_volcano") { }
npc_volcano(Creature* creature) : NullCreatureAI(creature) { }
struct npc_volcanoAI : public NullCreatureAI
void Reset() override
{
npc_volcanoAI(Creature* creature) : NullCreatureAI(creature) { }
void Reset() override
_scheduler.Schedule(Seconds(3), [this](TaskContext /*context*/)
{
_scheduler.Schedule(Seconds(3), [this](TaskContext /*context*/)
{
DoCastSelf(SPELL_VOLCANIC_ERUPTION);
});
}
void DoAction(int32 action) override
{
if (action == ACTION_DISABLE_VULCANO)
{
me->RemoveAurasDueToSpell(SPELL_VOLCANIC_ERUPTION);
me->RemoveAurasDueToSpell(SPELL_VOLCANIC_GEYSER);
}
}
void UpdateAI(uint32 diff) override
{
_scheduler.Update(diff);
}
private:
TaskScheduler _scheduler;
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetBlackTempleAI<npc_volcanoAI>(creature);
DoCastSelf(SPELL_VOLCANIC_ERUPTION);
});
}
void DoAction(int32 action) override
{
if (action == ACTION_DISABLE_VULCANO)
{
me->RemoveAurasDueToSpell(SPELL_VOLCANIC_ERUPTION);
me->RemoveAurasDueToSpell(SPELL_VOLCANIC_GEYSER);
}
}
void UpdateAI(uint32 diff) override
{
_scheduler.Update(diff);
}
private:
TaskScheduler _scheduler;
};
void AddSC_boss_supremus()
{
new boss_supremus();
new npc_molten_flame();
new npc_volcano();
RegisterBlackTempleCreatureAI(boss_supremus);
RegisterBlackTempleCreatureAI(npc_molten_flame);
RegisterBlackTempleCreatureAI(npc_volcano);
}
@@ -69,14 +69,13 @@ enum Spells
SPELL_SPIRIT_VOLLEY = 40314,
SPELL_SPIRIT_SHIELD = 40322,
SPELL_SPIRIT_LANCE = 40157
};
enum Npcs
{
NPC_DOOM_BLOSSOM = 23123,
NPC_SHADOWY_CONSTRUCT = 23111,
NPC_VENGEFUL_SPIRIT = 23109 //Npc controlled by player
NPC_DOOM_BLOSSOM = 23123,
NPC_SHADOWY_CONSTRUCT = 23111,
NPC_VENGEFUL_SPIRIT = 23109 //Npc controlled by player
};
enum Events
@@ -108,263 +107,316 @@ uint32 const SkeletronSpells[4] =
SPELL_SUMMON_SKELETRON_4
};
class boss_teron_gorefiend : public CreatureScript
struct boss_teron_gorefiend : public BossAI
{
public:
boss_teron_gorefiend() : CreatureScript("boss_teron_gorefiend") { }
boss_teron_gorefiend(Creature* creature) : BossAI(creature, DATA_TERON_GOREFIEND) { }
struct boss_teron_gorefiendAI : public BossAI
void Reset() override
{
boss_teron_gorefiendAI(Creature* creature) : BossAI(creature, DATA_TERON_GOREFIEND) { }
void Reset() override
_Reset();
if (instance->GetData(DATA_TERON_GOREFIEND_INTRO))
{
_Reset();
if (instance->GetData(DATA_TERON_GOREFIEND_INTRO))
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
me->SetReactState(REACT_PASSIVE);
}
}
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
Talk(SAY_AGGRO);
events.SetPhase(PHASE_COMBAT);
events.ScheduleEvent(EVENT_ENRAGE, 10min);
events.ScheduleEvent(EVENT_INCINERATE, 12s);
events.ScheduleEvent(EVENT_SUMMON_DOOM_BLOSSOM, 8s);
events.ScheduleEvent(EVENT_SHADOW_DEATH, 8s);
events.ScheduleEvent(EVENT_CRUSHING_SHADOWS, 18s);
}
void EnterEvadeMode(EvadeReason /*why*/) override
{
DoCast(SPELL_SHADOW_OF_DEATH_REMOVE);
summons.DespawnAll();
_DespawnAtEvade();
}
void DoAction(int32 action) override
{
if (action == ACTION_START_INTRO && me->IsAlive())
{
instance->SetData(DATA_TERON_GOREFIEND_INTRO, 0);
Talk(SAY_INTRO);
events.SetPhase(PHASE_INTRO);
events.ScheduleEvent(EVENT_FINISH_INTRO, 20s);
}
}
void KilledUnit(Unit* victim) override
{
if (victim->GetTypeId() == TYPEID_PLAYER)
Talk(SAY_SLAY);
}
void JustDied(Unit* /*killer*/) override
{
Talk(SAY_DEATH);
DoCast(SPELL_SHADOW_OF_DEATH_REMOVE);
_JustDied();
}
void UpdateAI(uint32 diff) override
{
if (!events.IsInPhase(PHASE_INTRO) && !UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
me->SetReactState(REACT_PASSIVE);
case EVENT_ENRAGE:
DoCast(SPELL_BERSERK);
break;
case EVENT_INCINERATE:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_INCINERATE);
Talk(SAY_INCINERATE);
events.Repeat(Seconds(12), Seconds(20));
break;
case EVENT_SUMMON_DOOM_BLOSSOM:
DoCastSelf(SPELL_SUMMON_DOOM_BLOSSOM, true);
Talk(SAY_BLOSSOM);
events.Repeat(Seconds(30), Seconds(40));
break;
case EVENT_SHADOW_DEATH:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100.0f, true, true, -SPELL_SPIRITUAL_VENGEANCE))
DoCast(target, SPELL_SHADOW_OF_DEATH);
events.Repeat(Seconds(30), Seconds(35));
break;
case EVENT_CRUSHING_SHADOWS:
DoCastSelf(SPELL_CRUSHING_SHADOWS, { SPELLVALUE_MAX_TARGETS, 5 });
Talk(SAY_CRUSHING);
events.Repeat(Seconds(18), Seconds(30));
break;
case EVENT_FINISH_INTRO:
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
me->SetReactState(REACT_AGGRESSIVE);
break;
default:
break;
}
}
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
Talk(SAY_AGGRO);
events.SetPhase(PHASE_COMBAT);
events.ScheduleEvent(EVENT_ENRAGE, Minutes(10));
events.ScheduleEvent(EVENT_INCINERATE, Seconds(12));
events.ScheduleEvent(EVENT_SUMMON_DOOM_BLOSSOM, Seconds(8));
events.ScheduleEvent(EVENT_SHADOW_DEATH, Seconds(8));
events.ScheduleEvent(EVENT_CRUSHING_SHADOWS, Seconds(18));
}
void EnterEvadeMode(EvadeReason /*why*/) override
{
DoCast(SPELL_SHADOW_OF_DEATH_REMOVE);
summons.DespawnAll();
_DespawnAtEvade();
}
void DoAction(int32 action) override
{
if (action == ACTION_START_INTRO && me->IsAlive())
{
instance->SetData(DATA_TERON_GOREFIEND_INTRO, 0);
Talk(SAY_INTRO);
events.SetPhase(PHASE_INTRO);
events.ScheduleEvent(EVENT_FINISH_INTRO, Seconds(20));
}
}
void KilledUnit(Unit* victim) override
{
if (victim->GetTypeId() == TYPEID_PLAYER)
Talk(SAY_SLAY);
}
void JustDied(Unit* /*killer*/) override
{
Talk(SAY_DEATH);
DoCast(SPELL_SHADOW_OF_DEATH_REMOVE);
_JustDied();
}
void UpdateAI(uint32 diff) override
{
if (!events.IsInPhase(PHASE_INTRO) && !UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_ENRAGE:
DoCast(SPELL_BERSERK);
break;
case EVENT_INCINERATE:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_INCINERATE);
Talk(SAY_INCINERATE);
events.Repeat(Seconds(12), Seconds(20));
break;
case EVENT_SUMMON_DOOM_BLOSSOM:
DoCastSelf(SPELL_SUMMON_DOOM_BLOSSOM, true);
Talk(SAY_BLOSSOM);
events.Repeat(Seconds(30), Seconds(40));
break;
case EVENT_SHADOW_DEATH:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100.0f, true, true, -SPELL_SPIRITUAL_VENGEANCE))
DoCast(target, SPELL_SHADOW_OF_DEATH);
events.Repeat(Seconds(30), Seconds(35));
break;
case EVENT_CRUSHING_SHADOWS:
DoCastSelf(SPELL_CRUSHING_SHADOWS, { SPELLVALUE_MAX_TARGETS, 5 });
Talk(SAY_CRUSHING);
events.Repeat(Seconds(18), Seconds(30));
break;
case EVENT_FINISH_INTRO:
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
me->SetReactState(REACT_AGGRESSIVE);
break;
default:
break;
}
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
}
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetBlackTempleAI<boss_teron_gorefiendAI>(creature);
DoMeleeAttackIfReady();
}
};
class npc_doom_blossom : public CreatureScript
struct npc_doom_blossom : public NullCreatureAI
{
public:
npc_doom_blossom() : CreatureScript("npc_doom_blossom") { }
npc_doom_blossom(Creature* creature) : NullCreatureAI(creature), _instance(me->GetInstanceScript()) { }
struct npc_doom_blossomAI : public NullCreatureAI
void Reset() override
{
npc_doom_blossomAI(Creature* creature) : NullCreatureAI(creature), _instance(me->GetInstanceScript()) { }
/* Workaround - Until SMSG_SET_PLAY_HOVER_ANIM be implemented */
Position pos;
pos.Relocate(me);
pos.m_positionZ += 8.0f;
me->GetMotionMaster()->MoveTakeoff(0, pos);
void Reset() override
DoCast(SPELL_SUMMON_BLOSSOM_MOVE_TARGET);
_scheduler.CancelAll();
DoZoneInCombat();
_scheduler.Schedule(Seconds(12), [this](TaskContext shadowBolt)
{
/* Workaround - Until SMSG_SET_PLAY_HOVER_ANIM be implemented */
Position pos;
pos.Relocate(me);
pos.m_positionZ += 8.0f;
me->GetMotionMaster()->MoveTakeoff(0, pos);
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_SHADOWBOLT);
DoCast(SPELL_SUMMON_BLOSSOM_MOVE_TARGET);
_scheduler.CancelAll();
me->SetInCombatWithZone();
_scheduler.Schedule(Seconds(12), [this](TaskContext shadowBolt)
{
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_SHADOWBOLT);
shadowBolt.Repeat(Seconds(2));
});
}
void UpdateAI(uint32 diff) override
{
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
_scheduler.Update(diff);
}
private:
TaskScheduler _scheduler;
InstanceScript* _instance;
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetBlackTempleAI<npc_doom_blossomAI>(creature);
shadowBolt.Repeat(Seconds(2));
});
}
void UpdateAI(uint32 diff) override
{
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
_scheduler.Update(diff);
}
private:
TaskScheduler _scheduler;
InstanceScript* _instance;
};
class npc_shadowy_construct : public CreatureScript
struct npc_shadowy_construct : public ScriptedAI
{
public:
npc_shadowy_construct() : CreatureScript("npc_shadowy_construct") { }
struct npc_shadowy_constructAI : public ScriptedAI
npc_shadowy_construct(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript())
{
npc_shadowy_constructAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript())
//This creature must be immune everything, except spells of Vengeful Spirit.
creature->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, true);
creature->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_MAGIC, true);
}
void Reset() override
{
if (_instance->GetBossState(DATA_TERON_GOREFIEND) != IN_PROGRESS)
{
//This creature must be immune everything, except spells of Vengeful Spirit.
creature->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, true);
creature->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_MAGIC, true);
me->DespawnOrUnsummon();
return;
}
void Reset() override
targetGUID.Clear();
_scheduler.CancelAll();
_scheduler.Schedule(Seconds(12), [this](TaskContext atrophy)
{
if (_instance->GetBossState(DATA_TERON_GOREFIEND) != IN_PROGRESS)
DoCastVictim(SPELL_ATROPHY);
atrophy.Repeat(Seconds(10), Seconds(12));
});
_scheduler.Schedule(Milliseconds(200), [this](TaskContext checkPlayer)
{
if (Unit* target = ObjectAccessor::GetUnit(*me, targetGUID))
{
me->DespawnOrUnsummon();
return;
}
targetGUID.Clear();
_scheduler.CancelAll();
_scheduler.Schedule(Seconds(12), [this](TaskContext atrophy)
{
DoCastVictim(SPELL_ATROPHY);
atrophy.Repeat(Seconds(10), Seconds(12));
});
_scheduler.Schedule(Milliseconds(200), [this](TaskContext checkPlayer)
{
if (Unit* target = ObjectAccessor::GetUnit(*me, targetGUID))
{
if (!target->IsAlive() || !me->CanCreatureAttack(target))
SelectNewTarget();
}
else
if (!target->IsAlive() || !me->CanCreatureAttack(target))
SelectNewTarget();
}
else
SelectNewTarget();
checkPlayer.Repeat(Seconds(1));
});
checkPlayer.Repeat(Seconds(1));
});
if (Creature* teron = _instance->GetCreature(DATA_TERON_GOREFIEND))
teron->AI()->JustSummoned(me);
if (Creature* teron = _instance->GetCreature(DATA_TERON_GOREFIEND))
teron->AI()->JustSummoned(me);
SelectNewTarget();
}
SelectNewTarget();
}
void UpdateAI(uint32 diff) override
void UpdateAI(uint32 diff) override
{
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
_scheduler.Update(diff, [this]
{
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
DoMeleeAttackIfReady();
});
}
_scheduler.Update(diff, [this]
{
DoMeleeAttackIfReady();
});
}
void SelectNewTarget()
void SelectNewTarget()
{
if (Creature* teron = _instance->GetCreature(DATA_TERON_GOREFIEND))
{
if (Creature* teron = _instance->GetCreature(DATA_TERON_GOREFIEND))
{
Unit* target = teron->AI()->SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true, true, -SPELL_SPIRITUAL_VENGEANCE);
// He should target Vengeful Spirits only if has no other player available
if (!target)
target = teron->AI()->SelectTarget(SELECT_TARGET_RANDOM, 0);
Unit* target = teron->AI()->SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true, true, -SPELL_SPIRITUAL_VENGEANCE);
// He should target Vengeful Spirits only if has no other player available
if (!target)
target = teron->AI()->SelectTarget(SELECT_TARGET_RANDOM, 0);
if (target)
{
ResetThreatList();
AttackStart(target);
AddThreat(target, 1000000.0f);
targetGUID = target->GetGUID();
}
if (target)
{
ResetThreatList();
AttackStart(target);
AddThreat(target, 1000000.0f);
targetGUID = target->GetGUID();
}
}
}
private:
TaskScheduler _scheduler;
InstanceScript* _instance;
ObjectGuid targetGUID;
};
private:
TaskScheduler _scheduler;
InstanceScript* _instance;
ObjectGuid targetGUID;
};
CreatureAI* GetAI(Creature* creature) const override
// 40251 - Shadow of Death
class spell_teron_gorefiend_shadow_of_death : public AuraScript
{
bool Validate(SpellInfo const* /*spell*/) override
{
return GetBlackTempleAI<npc_shadowy_constructAI>(creature);
return ValidateSpellInfo(
{
SPELL_SUMMON_SPIRIT,
SPELL_POSSESS_SPIRIT_IMMUNE,
SPELL_SPIRITUAL_VENGEANCE,
SPELL_SUMMON_SKELETRON_1,
SPELL_SUMMON_SKELETRON_2,
SPELL_SUMMON_SKELETRON_3,
SPELL_SUMMON_SKELETRON_4
});
}
void Absorb(AuraEffect* /*aurEff*/, DamageInfo& /*dmgInfo*/, uint32& /*absorbAmount*/)
{
PreventDefaultAction();
}
void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
if (GetTargetApplication()->GetRemoveMode().HasFlag(AuraRemoveFlags::Expired))
{
Unit* target = GetTarget();
target->CastSpell(target, SPELL_SUMMON_SPIRIT, true);
for (uint8 i = 0; i < 4; ++i)
target->CastSpell(target, SkeletronSpells[i], true);
target->CastSpell(target, SPELL_POSSESS_SPIRIT_IMMUNE, true);
target->CastSpell(target, SPELL_SPIRITUAL_VENGEANCE, true);
}
}
void Register() override
{
OnEffectAbsorb.Register(&spell_teron_gorefiend_shadow_of_death::Absorb, EFFECT_0);
AfterEffectRemove.Register(&spell_teron_gorefiend_shadow_of_death::OnRemove, EFFECT_1, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, AURA_EFFECT_HANDLE_REAL);
}
};
// 40268 - Spiritual Vengeance
class spell_teron_gorefiend_spiritual_vengeance : public AuraScript
{
void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
GetTarget()->KillSelf();
}
void Register() override
{
AfterEffectRemove.Register(&spell_teron_gorefiend_spiritual_vengeance::OnRemove, EFFECT_0, SPELL_AURA_MOD_POSSESS, AURA_EFFECT_HANDLE_REAL);
}
};
// 41999 - Shadow of Death Remove
class spell_teron_gorefiend_shadow_of_death_remove : public SpellScript
{
bool Validate(SpellInfo const* /*spell*/) override
{
return ValidateSpellInfo(
{
SPELL_SHADOW_OF_DEATH,
SPELL_POSSESS_SPIRIT_IMMUNE,
SPELL_SPIRITUAL_VENGEANCE
});
}
void RemoveAuras()
{
Unit* target = GetHitUnit();
target->RemoveAurasDueToSpell(SPELL_POSSESS_SPIRIT_IMMUNE);
target->RemoveAurasDueToSpell(SPELL_SPIRITUAL_VENGEANCE);
target->RemoveAurasDueToSpell(SPELL_SHADOW_OF_DEATH);
}
void Register() override
{
OnHit.Register(&spell_teron_gorefiend_shadow_of_death_remove::RemoveAuras);
}
};
@@ -383,131 +435,13 @@ public:
}
};
// 40251 - Shadow of Death
class spell_teron_gorefiend_shadow_of_death : public SpellScriptLoader
{
public:
spell_teron_gorefiend_shadow_of_death() : SpellScriptLoader("spell_teron_gorefiend_shadow_of_death") { }
class spell_teron_gorefiend_shadow_of_death_AuraScript : public AuraScript
{
bool Validate(SpellInfo const* /*spell*/) override
{
return ValidateSpellInfo(
{
SPELL_SUMMON_SPIRIT,
SPELL_POSSESS_SPIRIT_IMMUNE,
SPELL_SPIRITUAL_VENGEANCE,
SPELL_SUMMON_SKELETRON_1,
SPELL_SUMMON_SKELETRON_2,
SPELL_SUMMON_SKELETRON_3,
SPELL_SUMMON_SKELETRON_4
});
}
void Absorb(AuraEffect* /*aurEff*/, DamageInfo& /*dmgInfo*/, uint32& /*absorbAmount*/)
{
PreventDefaultAction();
}
void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
if (GetTargetApplication()->GetRemoveMode().HasFlag(AuraRemoveFlags::Expired))
{
Unit* target = GetTarget();
target->CastSpell(target, SPELL_SUMMON_SPIRIT, true);
for (uint8 i = 0; i < 4; ++i)
target->CastSpell(target, SkeletronSpells[i], true);
target->CastSpell(target, SPELL_POSSESS_SPIRIT_IMMUNE, true);
target->CastSpell(target, SPELL_SPIRITUAL_VENGEANCE, true);
}
}
void Register() override
{
OnEffectAbsorb.Register(&spell_teron_gorefiend_shadow_of_death_AuraScript::Absorb, EFFECT_0);
AfterEffectRemove.Register(&spell_teron_gorefiend_shadow_of_death_AuraScript::OnRemove, EFFECT_1, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, AURA_EFFECT_HANDLE_REAL);
}
};
AuraScript* GetAuraScript() const override
{
return new spell_teron_gorefiend_shadow_of_death_AuraScript();
}
};
// 40268 - Spiritual Vengeance
class spell_teron_gorefiend_spiritual_vengeance : public SpellScriptLoader
{
public:
spell_teron_gorefiend_spiritual_vengeance() : SpellScriptLoader("spell_teron_gorefiend_spiritual_vengeance") { }
class spell_teron_gorefiend_spiritual_vengeance_AuraScript : public AuraScript
{
void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
GetTarget()->KillSelf();
}
void Register() override
{
AfterEffectRemove.Register(&spell_teron_gorefiend_spiritual_vengeance_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_MOD_POSSESS, AURA_EFFECT_HANDLE_REAL);
AfterEffectRemove.Register(&spell_teron_gorefiend_spiritual_vengeance_AuraScript::OnRemove, EFFECT_2, SPELL_AURA_MOD_PACIFY_SILENCE, AURA_EFFECT_HANDLE_REAL);
}
};
AuraScript* GetAuraScript() const override
{
return new spell_teron_gorefiend_spiritual_vengeance_AuraScript();
}
};
// 41999 - Shadow of Death Remove
class spell_teron_gorefiend_shadow_of_death_remove : public SpellScriptLoader
{
public:
spell_teron_gorefiend_shadow_of_death_remove() : SpellScriptLoader("spell_teron_gorefiend_shadow_of_death_remove") { }
class spell_teron_gorefiend_shadow_of_death_remove_SpellScript : public SpellScript
{
bool Validate(SpellInfo const* /*spell*/) override
{
return ValidateSpellInfo({ SPELL_SHADOW_OF_DEATH, SPELL_POSSESS_SPIRIT_IMMUNE, SPELL_SPIRITUAL_VENGEANCE });
return false;
return true;
}
void RemoveAuras()
{
Unit* target = GetHitUnit();
target->RemoveAurasDueToSpell(SPELL_POSSESS_SPIRIT_IMMUNE);
target->RemoveAurasDueToSpell(SPELL_SPIRITUAL_VENGEANCE);
target->RemoveAurasDueToSpell(SPELL_SHADOW_OF_DEATH);
}
void Register() override
{
OnHit.Register(&spell_teron_gorefiend_shadow_of_death_remove_SpellScript::RemoveAuras);
}
};
SpellScript* GetSpellScript() const override
{
return new spell_teron_gorefiend_shadow_of_death_remove_SpellScript();
}
};
void AddSC_boss_teron_gorefiend()
{
new boss_teron_gorefiend();
new npc_doom_blossom();
new npc_shadowy_construct();
RegisterBlackTempleCreatureAI(boss_teron_gorefiend);
RegisterBlackTempleCreatureAI(npc_doom_blossom);
RegisterBlackTempleCreatureAI(npc_shadowy_construct);
RegisterSpellScript(spell_teron_gorefiend_shadow_of_death);
RegisterSpellScript(spell_teron_gorefiend_spiritual_vengeance);
RegisterSpellScript(spell_teron_gorefiend_shadow_of_death_remove);
new at_teron_gorefiend_entrance();
new spell_teron_gorefiend_shadow_of_death();
new spell_teron_gorefiend_spiritual_vengeance();
new spell_teron_gorefiend_shadow_of_death_remove();
}
@@ -28,218 +28,205 @@
enum Texts
{
SAY_AGGRO = 0,
SAY_NEEDLE = 1,
SAY_SLAY = 2,
SAY_SPECIAL = 3,
SAY_ENRAGE = 4,
SAY_DEATH = 5
SAY_AGGRO = 0,
SAY_NEEDLE = 1,
SAY_SLAY = 2,
SAY_SPECIAL = 3,
SAY_ENRAGE = 4,
SAY_DEATH = 5
};
enum Spells
{
SPELL_NEEDLE_SPINE_TARGETING = 39992,
SPELL_NEEDLE_SPINE = 39835,
SPELL_TIDAL_BURST = 39878,
SPELL_TIDAL_SHIELD = 39872,
SPELL_IMPALING_SPINE = 39837,
SPELL_CREATE_NAJENTUS_SPINE = 39956,
SPELL_HURL_SPINE = 39948,
SPELL_BERSERK = 26662
SPELL_NEEDLE_SPINE_TARGETING = 39992,
SPELL_NEEDLE_SPINE = 39835,
SPELL_TIDAL_BURST = 39878,
SPELL_TIDAL_SHIELD = 39872,
SPELL_IMPALING_SPINE = 39837,
SPELL_CREATE_NAJENTUS_SPINE = 39956,
SPELL_HURL_SPINE = 39948,
SPELL_BERSERK = 26662
};
enum Events
{
EVENT_BERSERK = 1,
EVENT_YELL = 2,
EVENT_NEEDLE = 3,
EVENT_SPINE = 4,
EVENT_SHIELD = 5
EVENT_BERSERK = 1,
EVENT_YELL = 2,
EVENT_NEEDLE = 3,
EVENT_SPINE = 4,
EVENT_SHIELD = 5
};
class boss_najentus : public CreatureScript
enum Misc
{
public:
boss_najentus() : CreatureScript("boss_najentus") { }
DATA_REMOVE_IMPALING_SPINE = 1,
ACTION_RESET_IMPALING_TARGET = 2
};
struct boss_najentusAI : public BossAI
struct boss_najentus : public BossAI
{
boss_najentus(Creature* creature) : BossAI(creature, DATA_HIGH_WARLORD_NAJENTUS) { }
void Reset() override
{
boss_najentusAI(Creature* creature) : BossAI(creature, DATA_HIGH_WARLORD_NAJENTUS) { }
void Reset() override
{
_Reset();
SpineTargetGUID.Clear();
}
void EnterEvadeMode(EvadeReason /*why*/) override
{
_DespawnAtEvade();
}
void KilledUnit(Unit* victim) override
{
if (victim->GetTypeId() == TYPEID_PLAYER)
Talk(SAY_SLAY);
}
void JustDied(Unit* /*killer*/) override
{
_JustDied();
Talk(SAY_DEATH);
}
void SpellHit(Unit* /*caster*/, SpellInfo const* spell) override
{
if (spell->Id == SPELL_HURL_SPINE && me->HasAura(SPELL_TIDAL_SHIELD))
{
me->RemoveAurasDueToSpell(SPELL_TIDAL_SHIELD);
DoCastSelf(SPELL_TIDAL_BURST, true);
events.RescheduleEvent(EVENT_SPINE, Seconds(2));
}
}
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
Talk(SAY_AGGRO);
events.ScheduleEvent(EVENT_NEEDLE, Seconds(2));
events.ScheduleEvent(EVENT_SHIELD, Seconds(60));
events.ScheduleEvent(EVENT_SPINE, Seconds(30));
events.ScheduleEvent(EVENT_BERSERK, Seconds(480));
events.ScheduleEvent(EVENT_YELL, Seconds(45), Seconds(100));
}
bool RemoveImpalingSpine()
{
if (!SpineTargetGUID)
return false;
Unit* target = ObjectAccessor::GetUnit(*me, SpineTargetGUID);
if (target && target->HasAura(SPELL_IMPALING_SPINE))
target->RemoveAurasDueToSpell(SPELL_IMPALING_SPINE);
SpineTargetGUID.Clear();
return true;
}
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case EVENT_SHIELD:
DoCastSelf(SPELL_TIDAL_SHIELD, true);
events.RescheduleEvent(EVENT_SPINE, Seconds(50));
events.Repeat(Seconds(55), Seconds(60));
break;
case EVENT_BERSERK:
Talk(SAY_ENRAGE);
DoCastSelf(SPELL_BERSERK, true);
break;
case EVENT_SPINE:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 200.0f, true))
{
DoCast(target, SPELL_IMPALING_SPINE, true);
SpineTargetGUID = target->GetGUID();
//must let target summon, otherwise you cannot click the spine
target->SummonGameObject(GO_NAJENTUS_SPINE, *target, QuaternionData(), 30);
Talk(SAY_NEEDLE);
}
events.Repeat(Seconds(20), Seconds(25));
break;
case EVENT_NEEDLE:
DoCastSelf(SPELL_NEEDLE_SPINE_TARGETING, true);
events.Repeat(Seconds(2));
break;
case EVENT_YELL:
Talk(SAY_SPECIAL);
events.Repeat(Seconds(25), Seconds(100));
break;
default:
break;
}
}
private:
ObjectGuid SpineTargetGUID;
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetBlackTempleAI<boss_najentusAI>(creature);
_Reset();
_spineTargetGUID.Clear();
}
void EnterEvadeMode(EvadeReason /*why*/) override
{
_EnterEvadeMode();
_DespawnAtEvade();
}
void KilledUnit(Unit* victim) override
{
if (victim->GetTypeId() == TYPEID_PLAYER)
Talk(SAY_SLAY);
}
void JustDied(Unit* /*killer*/) override
{
_JustDied();
Talk(SAY_DEATH);
}
void SpellHit(Unit* /*caster*/, SpellInfo const* spellInfo) override
{
if (spellInfo->Id == SPELL_HURL_SPINE && me->HasAura(SPELL_TIDAL_SHIELD))
{
me->RemoveAurasDueToSpell(SPELL_TIDAL_SHIELD);
DoCastSelf(SPELL_TIDAL_BURST, true);
events.RescheduleEvent(EVENT_SPINE, Seconds(2));
}
}
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
Talk(SAY_AGGRO);
events.ScheduleEvent(EVENT_NEEDLE, 2s);
events.ScheduleEvent(EVENT_SHIELD, 1min);
events.ScheduleEvent(EVENT_SPINE, 30s);
events.ScheduleEvent(EVENT_BERSERK, 480s);
events.ScheduleEvent(EVENT_YELL, 45s, 100s);
}
uint32 GetData(uint32 data) const override
{
if (data == DATA_REMOVE_IMPALING_SPINE)
return RemoveImpalingSpine() ? 1 : 0;
return 0;
}
void DoAction(int32 actionId) override
{
if (actionId == ACTION_RESET_IMPALING_TARGET)
_spineTargetGUID.Clear();
}
bool RemoveImpalingSpine() const
{
if (!_spineTargetGUID)
return false;
Unit* target = ObjectAccessor::GetUnit(*me, _spineTargetGUID);
if (target && target->HasAura(SPELL_IMPALING_SPINE))
target->RemoveAurasDueToSpell(SPELL_IMPALING_SPINE);
return true;
}
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case EVENT_SHIELD:
DoCastSelf(SPELL_TIDAL_SHIELD, true);
events.RescheduleEvent(EVENT_SPINE, Seconds(50));
events.Repeat(Seconds(55), Seconds(60));
break;
case EVENT_BERSERK:
Talk(SAY_ENRAGE);
DoCastSelf(SPELL_BERSERK, true);
break;
case EVENT_SPINE:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 200.0f, true))
{
DoCast(target, SPELL_IMPALING_SPINE, true);
_spineTargetGUID = target->GetGUID();
//must let target summon, otherwise you cannot click the spine
target->SummonGameObject(GO_NAJENTUS_SPINE, target->GetPosition(), QuaternionData(), 30 * IN_MILLISECONDS);
Talk(SAY_NEEDLE);
}
events.Repeat(Seconds(20), Seconds(25));
break;
case EVENT_NEEDLE:
DoCastSelf(SPELL_NEEDLE_SPINE_TARGETING, true);
events.Repeat(Seconds(2));
break;
case EVENT_YELL:
Talk(SAY_SPECIAL);
events.Repeat(Seconds(25), Seconds(100));
break;
default:
break;
}
}
private:
ObjectGuid _spineTargetGUID;
};
class go_najentus_spine : public GameObjectScript
struct go_najentus_spine : public GameObjectAI
{
public:
go_najentus_spine() : GameObjectScript("go_najentus_spine") { }
go_najentus_spine(GameObject* go) : GameObjectAI(go), _instance(go->GetInstanceScript()) { }
struct go_najentus_spineAI : public GameObjectAI
{
go_najentus_spineAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
bool GossipHello(Player* player) override
{
if (!_instance)
return false;
InstanceScript* instance;
bool GossipHello(Player* player) override
if (Creature* najentus = _instance->GetCreature(DATA_HIGH_WARLORD_NAJENTUS))
if (najentus->AI()->GetData(DATA_REMOVE_IMPALING_SPINE))
{
if (Creature* najentus = instance->GetCreature(DATA_HIGH_WARLORD_NAJENTUS))
{
if (ENSURE_AI(boss_najentus::boss_najentusAI, najentus->AI())->RemoveImpalingSpine())
{
me->CastSpell(player, SPELL_CREATE_NAJENTUS_SPINE, true);
me->Delete();
}
}
return true;
najentus->AI()->DoAction(ACTION_RESET_IMPALING_TARGET);
me->CastSpell(player, SPELL_CREATE_NAJENTUS_SPINE, true);
me->Delete();
}
};
GameObjectAI* GetAI(GameObject* go) const override
{
return GetBlackTempleAI<go_najentus_spineAI>(go);
}
return true;
}
private:
InstanceScript* _instance;
};
// 39992 - Needle Spine Targeting
class spell_najentus_needle_spine : public SpellScriptLoader
class spell_najentus_needle_spine : public SpellScript
{
public:
spell_najentus_needle_spine() : SpellScriptLoader("spell_najentus_needle_spine") { }
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_NEEDLE_SPINE });
}
class spell_najentus_needle_spine_SpellScript : public SpellScript
{
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_NEEDLE_SPINE });
}
void FilterTargets(std::list<WorldObject*>& targets)
{
targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_IMPALING_SPINE));
}
void FilterTargets(std::list<WorldObject*>& targets)
{
targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_IMPALING_SPINE));
}
void HandleScript(SpellEffIndex /*effIndex*/)
{
GetCaster()->CastSpell(GetHitUnit(), SPELL_NEEDLE_SPINE, true);
}
void HandleScript(SpellEffIndex /*effIndex*/)
{
GetCaster()->CastSpell(GetHitUnit(), SPELL_NEEDLE_SPINE, true);
}
void Register() override
{
OnObjectAreaTargetSelect.Register(&spell_najentus_needle_spine_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
OnEffectHitTarget.Register(&spell_najentus_needle_spine_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
SpellScript* GetSpellScript() const override
{
return new spell_najentus_needle_spine_SpellScript();
}
void Register() override
{
OnObjectAreaTargetSelect.Register(&spell_najentus_needle_spine::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
OnEffectHitTarget.Register(&spell_najentus_needle_spine::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
void AddSC_boss_najentus()
{
new boss_najentus();
new go_najentus_spine();
new spell_najentus_needle_spine();
RegisterBlackTempleCreatureAI(boss_najentus);
RegisterGameObjectAI(go_najentus_spine);
RegisterSpellScript(spell_najentus_needle_spine);
}
@@ -76,6 +76,7 @@ ObjectData const creatureData[] =
{ NPC_BLOOD_ELF_COUNCIL_VOICE, DATA_BLOOD_ELF_COUNCIL_VOICE },
{ NPC_BLACK_TEMPLE_TRIGGER, DATA_BLACK_TEMPLE_TRIGGER },
{ NPC_MAIEV_SHADOWSONG, DATA_MAIEV },
{ NPC_RELIQUARY_COMBAT_TRIGGER, DATA_RELIQUARY_COMBAT_TRIGGER },
{ 0, 0 } // END
};