Scripts/Karazhan: Rewrite Opera (#31881)

Credit for some things goes to CMaNGOS

Closes #28951
Closes #28954

(cherry picked from commit e0fa5c79f0e427da01e1cfdd622736f0588d2159)
This commit is contained in:
offl
2026-08-01 20:51:54 +02:00
committed by Shauren
parent b449917114
commit b7af0c3ce8
5 changed files with 1753 additions and 1739 deletions
@@ -0,0 +1,242 @@
-- Spawn groups, creatures
SET @CGUID := 147498; -- 13
SET @OGUID := 94138; -- 13
SET @SPAWN_GROUP_ID := 385; -- 14
DELETE FROM `creature_template_difficulty` WHERE `Entry` IN (18412,19525,17547,17543,17546,17535,18168) AND `DifficultyID` = 0;
UPDATE `creature_template_difficulty` SET `DifficultyID` = 0, `ContentTuningID` = 0 WHERE `Entry` IN (18412,19525,17547,17543,17546,17535,18168) AND `DifficultyID` = 1;
UPDATE `creature_template_difficulty` SET `LevelScalingDeltaMin` = 3, `LevelScalingDeltaMax` = 3 WHERE `Entry` IN (17534,17521,17533) AND `DifficultyID` = 0;
DELETE FROM `creature` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+12;
INSERT INTO `creature` (`guid`,`id`,`map`,`zoneId`,`areaId`,`spawnDifficulties`,`phaseId`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`wander_distance`,`currentwaypoint`,`MovementType`,`ScriptName`,`StringId`,`VerifiedBuild`) VALUES
(@CGUID+0,18412,532,0,0,'3',0,0,0,-10908.856,-1773.627,90.55865,5.833214759826660156,604800,0,0,2,'',NULL,0),
(@CGUID+1,18412,532,0,0,'3',0,0,0,-10910.791,-1771.2006,90.56122,0.364255577325820922,604800,0,0,0,'',NULL,0),
(@CGUID+2,18412,532,0,0,'3',0,0,0,-10907.685,-1778.6509,90.56018,2.441269636154174804,604800,0,0,0,'',NULL,0),
(@CGUID+3,19525,532,0,0,'3',0,0,0,-10895.269,-1782.6263,90.559845,3.769911,604800,0,0,0,'',NULL,15595),
(@CGUID+4,17603,532,0,0,'3',0,0,0,-10893.254,-1756.5731,90.559845,4.485496,604800,0,0,0,'',NULL,15595),
(@CGUID+5,17547,532,0,0,'3',0,0,1,-10883.841,-1758.8567,90.559845,4.537856101989746093,604800,0,0,0,'',NULL,24742),
(@CGUID+6,17543,532,0,0,'3',0,0,0,-10902.105,-1756.45,90.559845,4.660028934478759765,604800,0,0,0,'',NULL,24742),
(@CGUID+7,17546,532,0,0,'3',0,0,0,-10889.533,-1758.1,90.559845,4.572762489318847656,604800,0,0,0,'',NULL,24742),
(@CGUID+8,17535,532,0,0,'3',0,0,0,-10896.65,-1757.6233,90.559845,4.86946868896484375,604800,0,0,0,'',NULL,24742),
(@CGUID+9,17534,532,0,0,'3',0,0,1,-10893.56,-1760.437,90.559845,4.5553093,604800,0,0,0,'',NULL,15595),
(@CGUID+10,17521,532,0,0,'3',0,0,0,-10893.109,-1756.247,90.55985,4.485496,604800,0,0,0,'',NULL,15595),
(@CGUID+11,18168,532,0,0,'3',0,0,1,-10893.107,-1757.8502,90.559845,4.607669353485107421,604800,0,0,0,'',NULL,24742),
(@CGUID+12,17533,532,0,0,'3',0,0,1,-10893.619,-1760.782,90.55985,4.764749,604800,0,0,0,'',NULL,15595);
DELETE FROM `spawn_group_template` WHERE `groupId` BETWEEN @SPAWN_GROUP_ID+0 AND @SPAWN_GROUP_ID+10;
INSERT INTO `spawn_group_template` (`groupId`, `groupName`, `groupFlags`) VALUES
(@SPAWN_GROUP_ID+0,"Karazhan - Cyclone (The Crone)",4), -- 385
(@SPAWN_GROUP_ID+1,"Karazhan - Stage Spotlight",4), -- 386
(@SPAWN_GROUP_ID+2,"Karazhan - Grandmother",4), -- 387
(@SPAWN_GROUP_ID+3,"Karazhan - Tinhead",4), -- 388
(@SPAWN_GROUP_ID+4,"Karazhan - Strawman",4), -- 389
(@SPAWN_GROUP_ID+5,"Karazhan - Roar",4), -- 390
(@SPAWN_GROUP_ID+6,"Karazhan - Dorothee",4), -- 391
(@SPAWN_GROUP_ID+7,"Karazhan - Julianne",4), -- 392
(@SPAWN_GROUP_ID+8,"Karazhan - The Big Bad Wolf",4), -- 393
(@SPAWN_GROUP_ID+9,"Karazhan - The Crone",4), -- 394
(@SPAWN_GROUP_ID+10,"Karazhan - Romulo",4); -- 395
DELETE FROM `spawn_group` WHERE `spawnId` BETWEEN @CGUID+0 AND @CGUID+12 AND `spawnType` = 0;
INSERT INTO `spawn_group` (`groupId`, `spawnType`, `spawnId`) VALUES
(@SPAWN_GROUP_ID+0,0,@CGUID+0),
(@SPAWN_GROUP_ID+0,0,@CGUID+1),
(@SPAWN_GROUP_ID+0,0,@CGUID+2),
(@SPAWN_GROUP_ID+1,0,@CGUID+3),
(@SPAWN_GROUP_ID+2,0,@CGUID+4),
(@SPAWN_GROUP_ID+3,0,@CGUID+5),
(@SPAWN_GROUP_ID+4,0,@CGUID+6),
(@SPAWN_GROUP_ID+5,0,@CGUID+7),
(@SPAWN_GROUP_ID+6,0,@CGUID+8),
(@SPAWN_GROUP_ID+7,0,@CGUID+9),
(@SPAWN_GROUP_ID+8,0,@CGUID+10),
(@SPAWN_GROUP_ID+9,0,@CGUID+11),
(@SPAWN_GROUP_ID+10,0,@CGUID+12);
DELETE FROM `creature_formations` WHERE `leaderGUID` = @CGUID+0;
INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
(@CGUID+0,@CGUID+0,0,0,515,0,0),
(@CGUID+0,@CGUID+1,5,45,515,0,0),
(@CGUID+0,@CGUID+2,5,315,515,0,0);
DELETE FROM `waypoint_path` WHERE `PathId` = (@CGUID+0)*10;
INSERT INTO `waypoint_path` (`PathId`,`MoveType`,`Flags`,`Velocity`,`Comment`) VALUES
((@CGUID+0)*10,0,0,NULL,'Migrated from refactor');
DELETE FROM `waypoint_path_node` WHERE `PathId` = (@CGUID+0)*10;
INSERT INTO `waypoint_path_node` (`PathId`,`NodeId`,`PositionX`,`PositionY`,`PositionZ`,`Orientation`,`Delay`) VALUES
((@CGUID+0)*10,1,-10909.05,-1773.533,90.56085,NULL,0),
((@CGUID+0)*10,2,-10901.14,-1777.352,90.47656,NULL,0),
((@CGUID+0)*10,3,-10887.89,-1770.273,90.47697,NULL,0),
((@CGUID+0)*10,4,-10873.88,-1756.602,90.47607,NULL,0),
((@CGUID+0)*10,5,-10876.84,-1748.874,90.47689,NULL,0),
((@CGUID+0)*10,6,-10881.68,-1747.438,90.47687,NULL,0),
((@CGUID+0)*10,7,-10887.89,-1756.330,90.47715,NULL,0),
((@CGUID+0)*10,8,-10899.38,-1765.153,90.47734,NULL,0),
((@CGUID+0)*10,9,-10906.13,-1767.051,90.47772,NULL,0),
((@CGUID+0)*10,10,-10910.60,-1758.063,90.47652,NULL,0),
((@CGUID+0)*10,11,-10907.22,-1752.803,90.47632,NULL,0),
((@CGUID+0)*10,12,-10899.46,-1745.427,90.47615,NULL,0),
((@CGUID+0)*10,13,-10892.15,-1750.823,90.47671,NULL,0),
((@CGUID+0)*10,14,-10881.37,-1764.995,90.47661,NULL,0),
((@CGUID+0)*10,15,-10878.02,-1777.599,90.47767,NULL,0),
((@CGUID+0)*10,16,-10884.86,-1779.286,90.47733,NULL,0),
((@CGUID+0)*10,17,-10891.14,-1774.733,90.47724,NULL,0),
((@CGUID+0)*10,18,-10896.53,-1767.449,90.47691,NULL,0),
((@CGUID+0)*10,19,-10906.74,-1764.455,90.47702,NULL,0),
((@CGUID+0)*10,20,-10911.01,-1767.946,90.47708,NULL,0);
DELETE FROM `creature_addon` WHERE `guid` = @CGUID+0;
INSERT INTO `creature_addon` (`guid`, `PathId`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `visibilityDistanceType`, `auras`) VALUES
(@CGUID+0,(@CGUID+0)*10,0,0,0,0,0,1,0,0,0,'');
-- Spawn groups, objects
DELETE FROM `gameobject_addon` WHERE `guid` IN (SELECT `guid` FROM `gameobject` WHERE `id` IN (183442,183496));
DELETE FROM `gameobject` WHERE `id` IN (183442,183496);
DELETE FROM `spawn_group` WHERE `spawnId` IN (24346,24381,24382,24383,24384) AND `spawnType` = 1;
DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+12;
INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnDifficulties`, `phaseId`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `VerifiedBuild`) VALUES
(@OGUID+0,183493,532,0,0,'3',0,-10881.7421875,-1754.593505859375,90.4765167236328125,4.625123500823974609,0,0,-0.73727703094482421,0.67559051513671875,300,255,1,15595),
(@OGUID+1,183491,532,0,0,'3',0,-10890.96484375,-1744.3236083984375,90.4765167236328125,4.607671737670898437,0,0,-0.74314403533935546,0.669131457805633544,300,255,1,15595),
(@OGUID+2,183492,532,0,0,'3',0,-10909.7646484375,-1763.95166015625,90.47745513916015625,4.642575740814208984,0,0,-0.731353759765625,0.681998312473297119,300,255,1,15595),
(@OGUID+3,183492,532,0,0,'3',0,-10903.2548828125,-1754.0880126953125,90.47650909423828125,4.555310726165771484,0,0,-0.76040554046630859,0.649448513984680175,300,255,1,15595),
(@OGUID+4,183492,532,0,0,'3',0,-10875.8642578125,-1761.30419921875,90.4771270751953125,4.59021615982055664,0,0,-0.74895572662353515,0.662620067596435546,300,255,1,15595),
(@OGUID+5,183442,532,0,0,'3',0,-10890.8798828125,-1744.0618896484375,90.47650909423828125,4.607671737670898437,0,0,-0.74314403533935546,0.669131457805633544,300,255,1,24742),
(@OGUID+6,183496,532,0,0,'3',0,-10877.748046875,-1763.176025390625,90.47711181640625,4.59021615982055664,0,0,-0.74895572662353515,0.662620067596435546,300,255,1,24742),
(@OGUID+7,183496,532,0,0,'3',0,-10909.4912109375,-1761.785888671875,90.47733306884765625,4.625123500823974609,0,0,-0.73727703094482421,0.67559051513671875,300,255,1,24742),
(@OGUID+8,183496,532,0,0,'3',0,-10906.748046875,-1750.009033203125,90.4765472412109375,4.59021615982055664,0,0,-0.74895572662353515,0.662620067596435546,300,255,1,24742),
(@OGUID+9,183496,532,0,0,'3',0,-10882.9970703125,-1751.80810546875,90.47650909423828125,4.555310726165771484,0,0,-0.76040554046630859,0.649448513984680175,300,255,1,24742),
(@OGUID+10,183443,532,0,0,'3',0,-10891.0654296875,-1744.8685302734375,90.4765167236328125,4.607671737670898437,0,0,-0.74314403533935546,0.669131457805633544,300,255,1,15595),
(@OGUID+11,183494,532,0,0,'3',0,-10900.513671875,-1748.7257080078125,110.1709518432617187,4.625123500823974609,0,0,-0.73727703094482421,0.67559051513671875,300,255,1,15595),
(@OGUID+12,183495,532,0,0,'3',0,-10890.1640625,-1750.0433349609375,90.47650909423828125,4.625123500823974609,0,0,-0.73727703094482421,0.67559051513671875,300,255,1,15595);
DELETE FROM `spawn_group_template` WHERE `groupId` BETWEEN @SPAWN_GROUP_ID+11 AND @SPAWN_GROUP_ID+13;
INSERT INTO `spawn_group_template` (`groupId`, `groupName`, `groupFlags`) VALUES
(@SPAWN_GROUP_ID+11,"Karazhan - Red Riding Hood Decorations",4), -- 396
(@SPAWN_GROUP_ID+12,"Karazhan - Wizard of Oz Decorations",4), -- 397
(@SPAWN_GROUP_ID+13,"Karazhan - Romeo and Juliet Decorations",4); -- 398
DELETE FROM `spawn_group` WHERE `spawnId` BETWEEN @OGUID+0 AND @OGUID+12 AND `spawnType` = 1;
INSERT INTO `spawn_group` (`groupId`, `spawnType`, `spawnId`) VALUES
(@SPAWN_GROUP_ID+11,1,@OGUID+0),
(@SPAWN_GROUP_ID+11,1,@OGUID+1),
(@SPAWN_GROUP_ID+11,1,@OGUID+2),
(@SPAWN_GROUP_ID+11,1,@OGUID+3),
(@SPAWN_GROUP_ID+11,1,@OGUID+4),
(@SPAWN_GROUP_ID+12,1,@OGUID+5),
(@SPAWN_GROUP_ID+12,1,@OGUID+6),
(@SPAWN_GROUP_ID+12,1,@OGUID+7),
(@SPAWN_GROUP_ID+12,1,@OGUID+8),
(@SPAWN_GROUP_ID+12,1,@OGUID+9),
(@SPAWN_GROUP_ID+13,1,@OGUID+10),
(@SPAWN_GROUP_ID+13,1,@OGUID+11),
(@SPAWN_GROUP_ID+13,1,@OGUID+12);
-- Barnes
UPDATE `gameobject_template_addon` SET `flags` = 34 WHERE `entry` = 184275;
DELETE FROM `gossip_menu` WHERE `MenuID` = 7421 AND `TextID` IN (8969,8975,8981,8982);
INSERT INTO `gossip_menu` (`MenuID`, `TextID`, `VerifiedBuild`) VALUES
(7421,8969,15595),
(7421,8975,0),
(7421,8981,24742),
(7421,8982,0);
DELETE FROM `npc_text` WHERE `ID` = 8982;
INSERT INTO `npc_text` (`ID`, `Probability0`, `BroadcastTextID0`) VALUES
(8982,1,14119);
DELETE FROM `gossip_menu_option` WHERE `MenuID` = 7421 AND `OptionID` IN (1,2,3);
INSERT INTO `gossip_menu_option` (`MenuID`, `GossipOptionID`, `OptionID`, `OptionNpc`, `OptionText`, `OptionBroadcastTextID`, `ActionMenuID`, `ActionPoiID`, `BoxCoded`, `BoxMoney`, `BoxText`, `BoxBroadcastTextID`, `VerifiedBuild`) VALUES
(7421,-1899777,1,0,"The wolf's going down.",14074,0,0,0,0,'',0,0),
(7421,-1899778,2,0,"I'll nail it!",14120,0,0,0,0,'',0,24742),
(7421,-1899779,3,0,"I've never been more ready.",14121,0,0,0,0,'',0,0);
DELETE FROM `creature_text` WHERE `CreatureID` = 16812;
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
(16812,0,0,"Splendid. I'm going to get the audience ready. Break a leg!",12,0,100,0,0,0,14056,0,"Barnes SAY_BEGIN"),
(16812,1,0,"Good evening ladies and gentlemen, welcome to this evening's presentation!",14,0,100,0,0,9175,14057,0,"Barnes SAY_HOOD_1"),
(16812,2,0,"Tonight, things are not what they seem... for tonight your eyes may not be trusted!",14,0,100,0,0,9335,15359,0,"Barnes SAY_HOOD_2"),
(16812,3,0,"Take for instance this quiet elderly woman waiting for a visit from her granddaughter... surely there is nothing to fear from this sweet, gray-haired old lady!",14,0,100,0,0,9336,15360,0,"Barnes SAY_HOOD_3"),
(16812,4,0,"But don't let me pull the wool over your eyes! See for yourself what lies beneath those covers! And now... on with the show!",14,0,100,0,0,9337,15361,0,"Barnes SAY_HOOD_4"),
(16812,5,0,"Welcome ladies and gentlemen, to this evening's presentation!",14,0,100,0,0,9174,14118,0,"Barnes SAY_OZ_1"),
(16812,6,0,"Tonight we plumb the depths of the human soul as we join a lost, lonely girl trying desperately--with the help of her loyal companions--to find her way home!",14,0,100,0,0,9338,15362,0,"Barnes SAY_OZ_2"),
(16812,7,0,"But she is pursued... by a wicked, malevolent crone!",14,0,100,0,0,9339,15363,0,"Barnes SAY_OZ_3"),
(16812,8,0,"Will she survive? Will she prevail? Only time will tell. And now... on with the show!",14,0,100,0,0,9340,15364,0,"Barnes SAY_OZ_4"),
(16812,9,0,"Welcome ladies and gentlemen, to this evening's presentation!",14,0,100,0,0,9176,14122,0,"Barnes SAY_RAJ_1"),
(16812,10,0,"Tonight... we explore a tale of forbidden love!",14,0,100,0,0,9341,15365,0,"Barnes SAY_RAJ_2"),
(16812,11,0,"But beware, for not all love stories end happily, as you may find out. Sometimes, love pricks like a thorn!",14,0,100,0,0,9342,15366,0,"Barnes SAY_RAJ_3"),
(16812,12,0,"But don't take it from me; see for yourself what tragedy lies ahead when the paths of star crossed lovers meet! And now... on with the show!",14,0,100,0,0,9343,15367,0,"Barnes SAY_RAJ_4");
DELETE FROM `waypoint_path` WHERE `PathId` IN (134498,1358230,1358231);
INSERT INTO `waypoint_path` (`PathId`,`MoveType`,`Flags`,`Velocity`,`Comment`) VALUES
(1358230,0,0,NULL,'Migrated from refactor'),
(1358231,0,0,NULL,'Migrated from refactor');
DELETE FROM `waypoint_path_node` WHERE `PathId` IN (134498,1358230,1358231);
INSERT INTO `waypoint_path_node` (`PathId`,`NodeId`,`PositionX`,`PositionY`,`PositionZ`,`Orientation`,`Delay`) VALUES
(1358230,1,-10870.946,-1779.4125,90.48595,NULL,0),
(1358230,2,-10875.546,-1778.7738,90.47669,NULL,0),
(1358230,3,-10880.226,-1780.0681,90.477554,NULL,0),
(1358230,4,-10884.346,-1780.9225,90.47741,NULL,0),
(1358230,5,-10889.578,-1781.6733,90.476456,NULL,0),
(1358230,6,-10895.18,-1782.4739,90.47647,NULL,0),
(1358231,1,-10884.146,-1780.5691,90.47643,NULL,0),
(1358231,2,-10874.754,-1778.8278,90.47655,NULL,0),
(1358231,3,-10869.007,-1779.2379,90.47054,NULL,0),
(1358231,4,-10866.676,-1780.9473,90.461075,NULL,0);
DELETE FROM `creature_addon` WHERE `guid` IN (SELECT `guid` FROM `creature` WHERE `id` = 16812);
UPDATE `creature_template_addon` SET `auras` = '28002' WHERE `entry` = 16812;
-- Hood
UPDATE `creature_template` SET `speed_walk` = 1.6, `speed_run` = 1.71428571429, `unit_flags` = 33536 WHERE `entry` = 17603;
UPDATE `creature_template` SET `speed_walk` = 2, `speed_run` = 1.21428571429, `BaseAttackTime` = 1200, `ScriptName` = 'boss_big_bad_wolf' WHERE `entry` = 17521;
DELETE FROM `spell_script_names` WHERE `ScriptName` IN (
'spell_opera_pick_red_riding_hood',
'spell_opera_little_red_riding_hood',
'spell_opera_picnic_basket_smell');
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(30769, 'spell_opera_pick_red_riding_hood'),
(30768, 'spell_opera_little_red_riding_hood'),
(30755, 'spell_opera_picnic_basket_smell');
-- Oz
UPDATE `creature_template` SET `speed_walk` = 1.6, `speed_run` = 1.71428571429 WHERE `entry` = 17547;
UPDATE `creature_template` SET `speed_walk` = 1.6, `speed_run` = 1.71428571429 WHERE `entry` = 17543;
UPDATE `creature_template` SET `speed_walk` = 1.6, `speed_run` = 1.71428571429 WHERE `entry` = 17546;
UPDATE `creature_template` SET `speed_walk` = 1.6, `speed_run` = 1.71428571429 WHERE `entry` = 17535;
UPDATE `creature_template` SET `speed_walk` = 1.6, `speed_run` = 1.71428571429 WHERE `entry` = 17548;
UPDATE `creature_template` SET `speed_walk` = 0.8, `speed_run` = 0.857143 WHERE `entry` = 18412;
UPDATE `creature_template` SET `speed_walk` = 1.6, `speed_run` = 1.71428571429 WHERE `entry` = 18168;
UPDATE `creature_template_addon` SET `auras` = '31073' WHERE `entry` = 17543;
UPDATE `creature_template_addon` SET `auras` = '32339' WHERE `entry` = 18168;
DELETE FROM `spell_proc` WHERE `SpellId` = 31073;
INSERT INTO `spell_proc` (`SpellId`, `SchoolMask`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `ProcFlags`, `SpellTypeMask`, `SpellPhaseMask`, `HitMask`, `AttributesMask`, `DisableEffectsMask`, `ProcsPerMinute`, `Chance`, `Cooldown`, `Charges`) VALUES
(31073,4,0,0,0,0,0,0,0,0,2,0,0,0,0,0);
-- Romeo and Juliet
DELETE FROM `creature_text` WHERE `CreatureID` IN (17534,17533);
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
(17534,0,0,"What devil art thou, that dost torment me thus?",14,0,100,0,0,9196,15070,0,"Julianne SAY_JULIANNE_AGGRO"),
(17534,1,0,"Romulo, I come! Oh... this do I drink to thee!",14,0,100,0,0,9198,15072,0,"Julianne SAY_JULIANNE_DEATH_1"),
(17534,2,0,"O happy dagger! This is thy sheath; there rust, and let me die!",14,0,100,0,0,9310,15074,0,"Julianne SAY_JULIANNE_DEATH_2"),
(17534,3,0,"Come, gentle night; and give me back my Romulo!",14,0,100,0,0,9200,15073,0,"Julianne SAY_JULIANNE_RESURRECT"),
(17534,4,0,"Parting is such sweet sorrow.",14,0,100,0,0,9201,15071,0,"Julianne SAY_JULIANNE_SLAY"),
(17533,0,0,"Wilt thou provoke me? Then have at thee, boy!",14,0,100,0,0,9233,15075,0,"Romulo SAY_ROMULO_AGGRO"),
(17533,1,0,"Thou smilest... upon the stroke that... murders me.",14,0,100,0,0,9235,15078,0,"Romulo SAY_ROMULO_DEATH"),
(17533,2,0,"Thou detestable maw, thou womb of death; I enforce thy rotten jaws to open!",14,0,100,0,0,9237,15077,0,"Romulo SAY_ROMULO_RESURRECT"),
(17533,3,0,"How well my comfort is revived by this!",14,0,100,0,0,9238,15076,0,"Romulo SAY_ROMULO_SLAY");
UPDATE `creature_template` SET `speed_walk` = 1.6, `speed_run` = 1.71428571429, `unit_flags` = 33088 WHERE `entry` = 17534;
File diff suppressed because it is too large Load Diff
@@ -15,15 +15,9 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/* ScriptData
SDName: Instance_Karazhan
SD%Complete: 70
SDComment: Instance Script for Karazhan to help in various encounters. @todo GameObject visibility for Opera event.
SDCategory: Karazhan
EndScriptData */
#include "ScriptMgr.h"
#include "Creature.h"
#include "CreatureAI.h"
#include "GameObject.h"
#include "InstanceScript.h"
#include "karazhan.h"
@@ -44,6 +38,21 @@ EndScriptData */
11 - Nightbane
*/
static constexpr ObjectData creatureData[] =
{
{ NPC_BARNES, DATA_BARNES },
{ NPC_JULIANNE, DATA_JULIANNE },
{ NPC_ROMULO, DATA_ROMULO }
};
static constexpr ObjectData gameObjectData[] =
{
{ GO_STAGE_CURTAIN, DATA_GO_STAGE_CURTAIN },
{ GO_STAGE_DOOR_LEFT, DATA_GO_STAGE_DOOR_LEFT },
{ GO_STAGE_DOOR_RIGHT, DATA_GO_STAGE_DOOR_RIGHT },
{ GO_SIDE_ENTRANCE_DOOR, DATA_GO_SIDE_ENTRANCE_DOOR }
};
DungeonEncounterData const encounters[] =
{
{ DATA_ATTUMEN, {{ 652 }} },
@@ -82,16 +91,18 @@ public:
{
SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadObjectData(creatureData, gameObjectData);
LoadDungeonEncounterData(encounters);
// 1 - OZ, 2 - HOOD, 3 - RAJ, this never gets altered.
OperaEvent = urand(EVENT_OZ, EVENT_RAJ);
OperaEvent = RAND(EVENT_HOOD, EVENT_OZ, EVENT_RAJ);
OzDeathCount = 0;
OptionalBossCount = 0;
}
void OnCreatureCreate(Creature* creature) override
{
InstanceScript::OnCreatureCreate(creature);
switch (creature->GetEntry())
{
case NPC_KILREK:
@@ -161,11 +172,14 @@ public:
{
switch (type)
{
case DATA_OPERA_OZ_DEATHCOUNT:
case DATA_OPERA_VARIATION:
OperaEvent = data;
break;
case DATA_OPERA_OZ_DEATH_COUNT:
if (data == SPECIAL)
++OzDeathCount;
else if (data == IN_PROGRESS)
OzDeathCount = 0;
break;
default:
break;
}
}
@@ -180,10 +194,24 @@ public:
case DATA_OPERA_PERFORMANCE:
if (state == DONE)
{
HandleGameObject(StageDoorLeftGUID, true);
HandleGameObject(StageDoorRightGUID, true);
if (GameObject* sideEntrance = instance->GetGameObject(SideEntranceDoor))
sideEntrance->RemoveFlag(GO_FLAG_LOCKED);
if (GameObject* go = GetGameObject(DATA_GO_STAGE_DOOR_LEFT))
HandleGameObject(ObjectGuid::Empty, true, go);
if (GameObject* go = GetGameObject(DATA_GO_STAGE_DOOR_RIGHT))
HandleGameObject(ObjectGuid::Empty, true, go);
if (GameObject* go = GetGameObject(DATA_GO_SIDE_ENTRANCE_DOOR))
go->ActivateObject(GameObjectActions::Unlock, 0);
if (Creature* barnes = GetCreature(DATA_BARNES))
barnes->AI()->DoAction(ACTION_OPERA_FINISHED);
}
else if (state == FAIL)
{
OzDeathCount = 0;
if (GameObject* go = GetGameObject(DATA_GO_STAGE_DOOR_LEFT))
HandleGameObject(ObjectGuid::Empty, true, go);
if (GameObject* go = GetGameObject(DATA_GO_STAGE_CURTAIN))
HandleGameObject(ObjectGuid::Empty, false, go);
if (Creature* barnes = GetCreature(DATA_BARNES))
barnes->AI()->DoAction(ACTION_OPERA_FINISHED);
}
break;
case DATA_CHESS:
@@ -205,20 +233,17 @@ public:
void OnGameObjectCreate(GameObject* go) override
{
InstanceScript::OnGameObjectCreate(go);
switch (go->GetEntry())
{
case GO_STAGE_CURTAIN:
CurtainGUID = go->GetGUID();
break;
case GO_STAGE_DOOR_LEFT:
StageDoorLeftGUID = go->GetGUID();
if (GetBossState(DATA_OPERA_PERFORMANCE) == DONE)
go->SetGoState(GO_STATE_ACTIVE);
if (GetBossState(DATA_OPERA_PERFORMANCE) == DONE || GetBossState(DATA_OPERA_PERFORMANCE) == FAIL)
HandleGameObject(ObjectGuid::Empty, true, go);
break;
case GO_STAGE_DOOR_RIGHT:
StageDoorRightGUID = go->GetGUID();
if (GetBossState(DATA_OPERA_PERFORMANCE) == DONE)
go->SetGoState(GO_STATE_ACTIVE);
HandleGameObject(ObjectGuid::Empty, true, go);
break;
case GO_PRIVATE_LIBRARY_DOOR:
LibraryDoor = go->GetGUID();
@@ -242,11 +267,8 @@ public:
MastersTerraceDoor[1] = go->GetGUID();
break;
case GO_SIDE_ENTRANCE_DOOR:
SideEntranceDoor = go->GetGUID();
if (GetBossState(DATA_OPERA_PERFORMANCE) == DONE)
go->SetFlag(GO_FLAG_LOCKED);
else
go->RemoveFlag(GO_FLAG_LOCKED);
go->ActivateObject(GameObjectActions::Unlock, 0);
break;
case GO_DUST_COVERED_CHEST:
DustCoveredChest = go->GetGUID();
@@ -255,28 +277,15 @@ public:
BlackenedUrnGUID = go->GetGUID();
break;
}
switch (OperaEvent)
{
/// @todo Set Object visibilities for Opera based on performance
case EVENT_OZ:
break;
case EVENT_HOOD:
break;
case EVENT_RAJ:
break;
}
}
uint32 GetData(uint32 type) const override
{
switch (type)
{
case DATA_OPERA_PERFORMANCE:
case DATA_OPERA_VARIATION:
return OperaEvent;
case DATA_OPERA_OZ_DEATHCOUNT:
case DATA_OPERA_OZ_DEATH_COUNT:
return OzDeathCount;
}
@@ -295,18 +304,10 @@ public:
return MoroesGUID;
case DATA_NIGHTBANE:
return NightbaneGUID;
case DATA_GO_STAGEDOORLEFT:
return StageDoorLeftGUID;
case DATA_GO_STAGEDOORRIGHT:
return StageDoorRightGUID;
case DATA_GO_CURTAINS:
return CurtainGUID;
case DATA_GO_LIBRARY_DOOR:
return LibraryDoor;
case DATA_GO_MASSIVE_DOOR:
return MassiveDoor;
case DATA_GO_SIDE_ENTRANCE_DOOR:
return SideEntranceDoor;
case DATA_GO_GAME_DOOR:
return GamesmansDoor;
case DATA_GO_GAME_EXIT_DOOR:
@@ -327,19 +328,13 @@ public:
}
private:
uint32 OperaEvent;
uint32 OzDeathCount;
uint32 OptionalBossCount;
ObjectGuid CurtainGUID;
ObjectGuid StageDoorLeftGUID;
ObjectGuid StageDoorRightGUID;
ObjectGuid KilrekGUID;
ObjectGuid TerestianGUID;
ObjectGuid MoroesGUID;
ObjectGuid NightbaneGUID;
ObjectGuid LibraryDoor; // Door at Shade of Aran
ObjectGuid MassiveDoor; // Door at Netherspite
ObjectGuid SideEntranceDoor; // Side Entrance
ObjectGuid GamesmansDoor; // Door before Chess
ObjectGuid GamesmansExitDoor; // Door after Chess
ObjectGuid NetherspaceDoor; // Door at Malchezaar
@@ -347,6 +342,10 @@ public:
ObjectGuid ImageGUID;
ObjectGuid DustCoveredChest;
ObjectGuid BlackenedUrnGUID;
protected:
uint32 OperaEvent;
uint32 OzDeathCount;
};
};
@@ -15,403 +15,486 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/* ScriptData
SDName: Karazhan
SD%Complete: 100
SDComment: Support for Barnes (Opera controller) and Berthold (Doorman), Support for Quest 9645.
SDCategory: Karazhan
EndScriptData */
/* ContentData
npc_barnes
npc_image_of_medivh
EndContentData */
#include "ScriptMgr.h"
#include "GameObject.h"
#include "InstanceScript.h"
#include "karazhan.h"
#include "Log.h"
#include "Map.h"
#include "MotionMaster.h"
#include "ObjectAccessor.h"
#include "Player.h"
#include "ScriptedEscortAI.h"
#include "ScriptedCreature.h"
#include "ScriptedGossip.h"
#include "SpellScript.h"
#include "TemporarySummon.h"
enum Spells
enum BarnesTexts
{
// Barnes
SPELL_SPOTLIGHT = 25824,
SPELL_TUXEDO = 32616,
// Berthold
SPELL_TELEPORT = 39567,
// Image of Medivh
SPELL_FIRE_BALL = 30967,
SPELL_UBER_FIREBALL = 30971,
SPELL_CONFLAGRATION_BLAST = 30977,
SPELL_MANA_SHIELD = 31635
SAY_BEGIN = 0,
SAY_HOOD_1 = 1,
SAY_HOOD_2 = 2,
SAY_HOOD_3 = 3,
SAY_HOOD_4 = 4,
SAY_OZ_1 = 5,
SAY_OZ_2 = 6,
SAY_OZ_3 = 7,
SAY_OZ_4 = 8,
SAY_RAJ_1 = 9,
SAY_RAJ_2 = 10,
SAY_RAJ_3 = 11,
SAY_RAJ_4 = 12
};
enum Creatures
enum BarnesMisc
{
NPC_ARCANAGOS = 17652,
NPC_SPOTLIGHT = 19525
SPELL_TUXEDO = 32616,
GOSSIP_MENU_MAIN = 7421,
GOSSIP_MENU_MAIN_2 = 7422,
GOSSIP_TEXT_MOROES_ALIVE = 8969,
GOSSIP_TEXT_MAIN_1 = 8970,
GOSSIP_TEXT_MAIN_2 = 8971,
GOSSIP_TEXT_FAIL_HOOD = 8975,
GOSSIP_TEXT_FAIL_OZ = 8981,
GOSSIP_TEXT_FAIL_RAJ = 8982,
GOSSIP_TEXT_DONE = 10471,
GOSSIP_OPTION_MAIN = 0,
GOSSIP_OPTION_FAIL_HOOD = 1,
GOSSIP_OPTION_FAIL_OZ = 2,
GOSSIP_OPTION_FAIL_RAJ = 3,
PATH_ANNOUNCE_1 = 1358230,
PATH_ANNOUNCE_2 = 1358231,
ACTION_START_ANNOUNCE = 0,
NPC_CROWD_HELPER = 18654
};
/*######
# npc_barnesAI
######*/
enum Misc
enum BarnesSounds
{
OZ_GOSSIP1_MID = 7421, // I'm not an actor.
OZ_GOSSIP1_OID = 0,
OZ_GOSSIP2_MID = 7422, // Ok, I'll give it a try, then.
OZ_GOSSIP2_OID = 0,
SOUND_APPLAUSE = 9332, // NYI
SOUND_AMBIENCE_HOOD = 9357,
SOUND_AMBIENCE_OZ = 9358,
SOUND_AMBIENCE_RAJ = 9359
};
#define OZ_GM_GOSSIP1 "[GM] Change event to EVENT_OZ"
#define OZ_GM_GOSSIP2 "[GM] Change event to EVENT_HOOD"
#define OZ_GM_GOSSIP3 "[GM] Change event to EVENT_RAJ"
struct Dialogue
enum BarnesCreatureSpawnGroups
{
int32 textid;
uint32 timer;
SPAWN_GROUP_SPOTLIGHT = 386,
SPAWN_GROUP_GRANDMOTHER = 387,
SPAWN_GROUP_TINHEAD = 388,
SPAWN_GROUP_STRAWMAN = 389,
SPAWN_GROUP_ROAR = 390,
SPAWN_GROUP_DOROTHEE = 391,
SPAWN_GROUP_JULIANNE = 392
};
static Dialogue OzDialogue[]=
enum BarnesObjectSpawnGroups
{
{0, 6000},
{1, 18000},
{2, 9000},
{3, 15000}
SPAWN_GROUP_DECORATIONS_HOOD = 396,
SPAWN_GROUP_DECORATIONS_OZ = 397,
SPAWN_GROUP_DECORATIONS_RAJ = 398
};
static Dialogue HoodDialogue[]=
static constexpr const char* GOSSIP_OPTION_GM_1 = "[GM] Change event to EVENT_OZ";
static constexpr const char* GOSSIP_OPTION_GM_2 = "[GM] Change event to EVENT_HOOD";
static constexpr const char* GOSSIP_OPTION_GM_3 = "[GM] Change event to EVENT_RAJ";
// 16812 - Barnes
struct npc_barnes : public ScriptedAI
{
{4, 6000},
{5, 10000},
{6, 14000},
{7, 15000}
};
npc_barnes(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
static Dialogue RAJDialogue[]=
{
{8, 5000},
{9, 7000},
{10, 14000},
{11, 14000}
};
// Entries and spawn locations for creatures in Oz event
float Spawns[6][2]=
{
{17535, -10896}, // Dorothee
{17546, -10891}, // Roar
{17547, -10884}, // Tinhead
{17543, -10902}, // Strawman
{17603, -10892}, // Grandmother
{17534, -10900}, // Julianne
};
#define SPAWN_Z 90.5f
#define SPAWN_Y -1758
#define SPAWN_O 4.738f
static constexpr uint32 PATH_ESCORT_BARNES = 134498;
class npc_barnes : public CreatureScript
{
public:
npc_barnes() : CreatureScript("npc_barnes") { }
struct npc_barnesAI : public EscortAI
void DoAction(int32 action) override
{
npc_barnesAI(Creature* creature) : EscortAI(creature)
switch (action)
{
Initialize();
RaidWiped = false;
m_uiEventId = 0;
instance = creature->GetInstanceScript();
}
void Initialize()
{
m_uiSpotlightGUID.Clear();
TalkCount = 0;
TalkTimer = 2000;
WipeTimer = 5000;
PerformanceReady = false;
}
InstanceScript* instance;
ObjectGuid m_uiSpotlightGUID;
uint32 TalkCount;
uint32 TalkTimer;
uint32 WipeTimer;
uint32 m_uiEventId;
bool PerformanceReady;
bool RaidWiped;
void Reset() override
{
Initialize();
m_uiEventId = instance->GetData(DATA_OPERA_PERFORMANCE);
}
void StartEvent()
{
instance->SetBossState(DATA_OPERA_PERFORMANCE, IN_PROGRESS);
//resets count for this event, in case earlier failed
if (m_uiEventId == EVENT_OZ)
instance->SetData(DATA_OPERA_OZ_DEATHCOUNT, IN_PROGRESS);
LoadPath(PATH_ESCORT_BARNES);
Start(false);
}
void JustEngagedWith(Unit* /*who*/) override { }
void WaypointReached(uint32 waypointId, uint32 /*pathId*/) override
{
switch (waypointId)
{
case 0:
DoCast(me, SPELL_TUXEDO, false);
instance->DoUseDoorOrButton(instance->GetGuidData(DATA_GO_STAGEDOORLEFT));
break;
case 4:
TalkCount = 0;
SetEscortPaused(true);
if (Creature* spotlight = me->SummonCreature(NPC_SPOTLIGHT,
me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0.0f,
TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 1min))
case ACTION_START_ANNOUNCE:
_scheduler.Schedule(0s, [this](TaskContext& task)
{
switch (task.GetRepeatCounter())
{
spotlight->SetUninteractible(true);
spotlight->CastSpell(spotlight, SPELL_SPOTLIGHT, false);
m_uiSpotlightGUID = spotlight->GetGUID();
case 0:
Talk(SAY_BEGIN);
me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP);
_instance->SetBossState(DATA_OPERA_PERFORMANCE, IN_PROGRESS);
_instance->HandleGameObject(ObjectGuid::Empty, true, _instance->GetGameObject(DATA_GO_STAGE_DOOR_LEFT));
task.Repeat(3400ms);
break;
case 1:
DoCastSelf(SPELL_TUXEDO);
me->GetMotionMaster()->MovePath(PATH_ANNOUNCE_1, false);
break;
default:
break;
}
break;
case 8:
instance->DoUseDoorOrButton(instance->GetGuidData(DATA_GO_STAGEDOORLEFT));
PerformanceReady = true;
break;
case 9:
PrepareEncounter();
instance->DoUseDoorOrButton(instance->GetGuidData(DATA_GO_CURTAINS));
break;
}
});
break;
case ACTION_OPERA_FINISHED:
me->RemoveAurasDueToSpell(SPELL_TUXEDO);
me->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP);
break;
default:
break;
}
void Talk(uint32 count)
{
int32 text = 0;
switch (m_uiEventId)
{
case EVENT_OZ:
if (OzDialogue[count].textid)
text = OzDialogue[count].textid;
if (OzDialogue[count].timer)
TalkTimer = OzDialogue[count].timer;
break;
case EVENT_HOOD:
if (HoodDialogue[count].textid)
text = HoodDialogue[count].textid;
if (HoodDialogue[count].timer)
TalkTimer = HoodDialogue[count].timer;
break;
case EVENT_RAJ:
if (RAJDialogue[count].textid)
text = RAJDialogue[count].textid;
if (RAJDialogue[count].timer)
TalkTimer = RAJDialogue[count].timer;
break;
}
if (text)
CreatureAI::Talk(text);
}
void PrepareEncounter()
{
TC_LOG_DEBUG("scripts", "Barnes Opera Event - Introduction complete - preparing encounter {}", m_uiEventId);
uint8 index = 0;
uint8 count = 0;
switch (m_uiEventId)
{
case EVENT_OZ:
index = 0;
count = 4;
break;
case EVENT_HOOD:
index = 4;
count = index+1;
break;
case EVENT_RAJ:
index = 5;
count = index+1;
break;
}
for (; index < count; ++index)
{
uint32 entry = ((uint32)Spawns[index][0]);
float PosX = Spawns[index][1];
if (Creature* creature = me->SummonCreature(entry, PosX, SPAWN_Y, SPAWN_Z, SPAWN_O, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 2h))
creature->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
}
RaidWiped = false;
}
void UpdateAI(uint32 diff) override
{
EscortAI::UpdateAI(diff);
if (HasEscortState(STATE_ESCORT_PAUSED))
{
if (TalkTimer <= diff)
{
if (TalkCount > 3)
{
if (Creature* pSpotlight = ObjectAccessor::GetCreature(*me, m_uiSpotlightGUID))
pSpotlight->DespawnOrUnsummon();
SetEscortPaused(false);
return;
}
Talk(TalkCount);
++TalkCount;
} else TalkTimer -= diff;
}
if (PerformanceReady)
{
if (!RaidWiped)
{
if (WipeTimer <= diff)
{
Map::PlayerList const& PlayerList = me->GetMap()->GetPlayers();
if (PlayerList.empty())
return;
RaidWiped = true;
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
{
if (i->GetSource()->IsAlive() && !i->GetSource()->IsGameMaster())
{
RaidWiped = false;
break;
}
}
if (RaidWiped)
{
EnterEvadeMode(EvadeReason::Other);
return;
}
WipeTimer = 15000;
} else WipeTimer -= diff;
}
}
}
bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
ClearGossipMenuFor(player);
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1:
InitGossipMenuFor(player, OZ_GOSSIP2_MID);
AddGossipItemFor(player, OZ_GOSSIP2_MID, OZ_GOSSIP2_OID, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
SendGossipMenuFor(player, 8971, me->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2:
CloseGossipMenuFor(player);
m_uiEventId = urand(EVENT_OZ, EVENT_RAJ);
StartEvent();
break;
case GOSSIP_ACTION_INFO_DEF + 3:
CloseGossipMenuFor(player);
m_uiEventId = EVENT_OZ;
TC_LOG_DEBUG("scripts", "player ({}) manually set Opera event to EVENT_OZ", player->GetGUID().ToString());
break;
case GOSSIP_ACTION_INFO_DEF + 4:
CloseGossipMenuFor(player);
m_uiEventId = EVENT_HOOD;
TC_LOG_DEBUG("scripts", "player ({}) manually set Opera event to EVENT_HOOD", player->GetGUID().ToString());
break;
case GOSSIP_ACTION_INFO_DEF + 5:
CloseGossipMenuFor(player);
m_uiEventId = EVENT_RAJ;
TC_LOG_DEBUG("scripts", "player ({}) manually set Opera event to EVENT_RAJ", player->GetGUID().ToString());
break;
}
return true;
}
bool OnGossipHello(Player* player) override
{
InitGossipMenuFor(player, OZ_GOSSIP1_MID);
// Check for death of Moroes and if opera event is not done already
if (instance->GetBossState(DATA_MOROES) == DONE && instance->GetBossState(DATA_OPERA_PERFORMANCE) != DONE)
{
AddGossipItemFor(player, OZ_GOSSIP1_MID, OZ_GOSSIP1_OID, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
if (player->IsGameMaster())
{
AddGossipItemFor(player, GossipOptionNpc::None, OZ_GM_GOSSIP1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
AddGossipItemFor(player, GossipOptionNpc::None, OZ_GM_GOSSIP2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
AddGossipItemFor(player, GossipOptionNpc::None, OZ_GM_GOSSIP3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5);
}
if (!RaidWiped)
SendGossipMenuFor(player, 8970, me->GetGUID());
else
SendGossipMenuFor(player, 8975, me->GetGUID());
return true;
}
SendGossipMenuFor(player, 8978, me->GetGUID());
return true;
}
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetKarazhanAI<npc_barnesAI>(creature);
}
void WaypointPathEnded(uint32 /*waypointId*/, uint32 pathId) override
{
if (pathId == PATH_ANNOUNCE_1)
{
switch (_instance->GetData(DATA_OPERA_VARIATION))
{
case EVENT_HOOD:
_scheduler.Schedule(0s, [this](TaskContext& task)
{
switch (task.GetRepeatCounter())
{
case 0:
me->SetFacingTo(4.590215682983398437f);
me->SetEmoteState(EMOTE_STATE_TALK);
Talk(SAY_HOOD_1);
if (Creature* helper = me->FindNearestCreature(NPC_CROWD_HELPER, 100.0f))
helper->PlayDirectSound(SOUND_AMBIENCE_HOOD);
me->GetMap()->SpawnGroupSpawn(SPAWN_GROUP_SPOTLIGHT, true);
task.Repeat(7s);
break;
case 1:
Talk(SAY_HOOD_2);
task.Repeat(7s);
break;
case 2:
me->SetEmoteState(EMOTE_ONESHOT_NONE);
task.Repeat(3600ms);
break;
case 3:
Talk(SAY_HOOD_3);
me->SetEmoteState(EMOTE_STATE_TALK);
task.Repeat(10s);
break;
case 4:
Talk(SAY_HOOD_4);
task.Repeat(10s);
break;
case 5:
me->SetEmoteState(EMOTE_ONESHOT_NONE);
task.Repeat(1200ms);
break;
case 6:
me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION);
task.Repeat(3600ms);
break;
case 7:
me->GetMotionMaster()->MovePath(PATH_ANNOUNCE_2, false);
me->GetMap()->SpawnGroupDespawn(SPAWN_GROUP_SPOTLIGHT);
break;
default:
break;
}
});
break;
case EVENT_OZ:
_scheduler.Schedule(0s, [this](TaskContext& task)
{
switch (task.GetRepeatCounter())
{
case 0:
me->SetFacingTo(4.590215682983398437f);
me->SetEmoteState(EMOTE_STATE_TALK);
Talk(SAY_OZ_1);
if (Creature* helper = me->FindNearestCreature(NPC_CROWD_HELPER, 100.0f))
helper->PlayDirectSound(SOUND_AMBIENCE_OZ);
me->GetMap()->SpawnGroupSpawn(SPAWN_GROUP_SPOTLIGHT, true);
task.Repeat(7s);
break;
case 1:
Talk(SAY_OZ_2);
task.Repeat(15s);
break;
case 2:
me->SetEmoteState(EMOTE_ONESHOT_NONE);
task.Repeat(3600ms);
break;
case 3:
Talk(SAY_OZ_3);
me->SetEmoteState(EMOTE_STATE_TALK);
task.Repeat(6s);
break;
case 4:
me->SetEmoteState(EMOTE_ONESHOT_NONE);
task.Repeat(3600ms);
break;
case 5:
Talk(SAY_OZ_4);
me->SetEmoteState(EMOTE_STATE_TALK);
task.Repeat(7s);
break;
case 6:
me->SetEmoteState(EMOTE_ONESHOT_NONE);
task.Repeat(1200ms);
break;
case 7:
me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION);
task.Repeat(3600ms);
break;
case 8:
me->GetMotionMaster()->MovePath(PATH_ANNOUNCE_2, false);
me->GetMap()->SpawnGroupDespawn(SPAWN_GROUP_SPOTLIGHT);
break;
default:
break;
}
});
break;
case EVENT_RAJ:
_scheduler.Schedule(0s, [this](TaskContext& task)
{
switch (task.GetRepeatCounter())
{
case 0:
me->SetFacingTo(4.590215682983398437f);
me->SetEmoteState(EMOTE_STATE_TALK);
Talk(SAY_RAJ_1);
if (Creature* helper = me->FindNearestCreature(NPC_CROWD_HELPER, 100.0f))
helper->PlayDirectSound(SOUND_AMBIENCE_RAJ);
me->GetMap()->SpawnGroupSpawn(SPAWN_GROUP_SPOTLIGHT, true);
task.Repeat(6s);
break;
case 1:
Talk(SAY_RAJ_2);
task.Repeat(4800ms);
break;
case 2:
me->SetEmoteState(EMOTE_ONESHOT_NONE);
task.Repeat(3600ms);
break;
case 3:
Talk(SAY_RAJ_3);
me->SetEmoteState(EMOTE_STATE_TALK);
task.Repeat(11s);
break;
case 4:
me->SetEmoteState(EMOTE_ONESHOT_NONE);
task.Repeat(3600ms);
break;
case 5:
Talk(SAY_RAJ_4);
me->SetEmoteState(EMOTE_STATE_TALK);
task.Repeat(8400ms);
break;
case 6:
me->SetEmoteState(EMOTE_ONESHOT_NONE);
task.Repeat(1200ms);
break;
case 7:
me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION);
task.Repeat(3600ms);
break;
case 8:
me->GetMotionMaster()->MovePath(PATH_ANNOUNCE_2, false);
me->GetMap()->SpawnGroupDespawn(SPAWN_GROUP_SPOTLIGHT);
break;
default:
break;
}
});
break;
default:
break;
}
}
else if (pathId == PATH_ANNOUNCE_2)
{
switch (_instance->GetData(DATA_OPERA_VARIATION))
{
case EVENT_HOOD:
_scheduler.Schedule(0s, [this](TaskContext& task)
{
switch (task.GetRepeatCounter())
{
case 0:
me->SetFacingTo(1.448623299598693847f);
me->GetMap()->SpawnGroupSpawn(SPAWN_GROUP_DECORATIONS_HOOD);
me->GetMap()->SpawnGroupSpawn(SPAWN_GROUP_GRANDMOTHER, true);
task.Repeat(7s);
break;
case 1:
_instance->HandleGameObject(ObjectGuid::Empty, true, _instance->GetGameObject(DATA_GO_STAGE_CURTAIN));
break;
default:
break;
}
});
break;
case EVENT_OZ:
_scheduler.Schedule(0s, [this](TaskContext& task)
{
switch (task.GetRepeatCounter())
{
case 0:
me->SetFacingTo(1.448623299598693847f);
me->GetMap()->SpawnGroupSpawn(SPAWN_GROUP_DECORATIONS_OZ);
me->GetMap()->SpawnGroupSpawn(SPAWN_GROUP_TINHEAD, true);
me->GetMap()->SpawnGroupSpawn(SPAWN_GROUP_STRAWMAN, true);
me->GetMap()->SpawnGroupSpawn(SPAWN_GROUP_ROAR, true);
me->GetMap()->SpawnGroupSpawn(SPAWN_GROUP_DOROTHEE, true);
task.Repeat(1200ms);
break;
case 1:
_instance->HandleGameObject(ObjectGuid::Empty, true, _instance->GetGameObject(DATA_GO_STAGE_CURTAIN));
break;
default:
break;
}
});
break;
case EVENT_RAJ:
_scheduler.Schedule(0s, [this](TaskContext& task)
{
switch (task.GetRepeatCounter())
{
case 0:
me->SetFacingTo(1.448623299598693847f);
me->GetMap()->SpawnGroupSpawn(SPAWN_GROUP_DECORATIONS_RAJ);
me->GetMap()->SpawnGroupSpawn(SPAWN_GROUP_JULIANNE, true);
task.Repeat(4s);
break;
case 1:
_instance->HandleGameObject(ObjectGuid::Empty, true, _instance->GetGameObject(DATA_GO_STAGE_CURTAIN));
break;
default:
break;
}
});
break;
default:
break;
}
}
}
void UpdateAI(uint32 diff) override
{
_scheduler.Update(diff);
}
bool OnGossipHello(Player* player) override
{
if (_instance->GetBossState(DATA_MOROES) != DONE)
{
InitGossipMenuFor(player, GOSSIP_MENU_MAIN);
SendGossipMenuFor(player, GOSSIP_TEXT_MOROES_ALIVE, me->GetGUID());
return true;
}
else
{
switch (_instance->GetBossState(DATA_OPERA_PERFORMANCE))
{
case NOT_STARTED:
InitGossipMenuFor(player, GOSSIP_MENU_MAIN);
AddGossipItemFor(player, GOSSIP_MENU_MAIN, GOSSIP_OPTION_MAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
if (player->IsGameMaster())
{
AddGossipItemFor(player, GossipOptionNpc::None, GOSSIP_OPTION_GM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 10);
AddGossipItemFor(player, GossipOptionNpc::None, GOSSIP_OPTION_GM_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 11);
AddGossipItemFor(player, GossipOptionNpc::None, GOSSIP_OPTION_GM_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 12);
}
SendGossipMenuFor(player, GOSSIP_TEXT_MAIN_1, me->GetGUID());
break;
case FAIL:
InitGossipMenuFor(player, GOSSIP_MENU_MAIN);
if (player->IsGameMaster())
{
AddGossipItemFor(player, GossipOptionNpc::None, GOSSIP_OPTION_GM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 10);
AddGossipItemFor(player, GossipOptionNpc::None, GOSSIP_OPTION_GM_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 11);
AddGossipItemFor(player, GossipOptionNpc::None, GOSSIP_OPTION_GM_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 12);
}
switch (_instance->GetData(DATA_OPERA_VARIATION))
{
case EVENT_HOOD:
AddGossipItemFor(player, GOSSIP_MENU_MAIN, GOSSIP_OPTION_FAIL_HOOD, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
SendGossipMenuFor(player, GOSSIP_TEXT_FAIL_HOOD, me->GetGUID());
break;
case EVENT_OZ:
AddGossipItemFor(player, GOSSIP_MENU_MAIN, GOSSIP_OPTION_FAIL_OZ, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
SendGossipMenuFor(player, GOSSIP_TEXT_FAIL_OZ, me->GetGUID());
break;
case EVENT_RAJ:
AddGossipItemFor(player, GOSSIP_MENU_MAIN, GOSSIP_OPTION_FAIL_RAJ, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
SendGossipMenuFor(player, GOSSIP_TEXT_FAIL_RAJ, me->GetGUID());
break;
default:
break;
}
break;
case DONE:
InitGossipMenuFor(player, GOSSIP_MENU_MAIN);
SendGossipMenuFor(player, GOSSIP_TEXT_DONE, me->GetGUID());
break;
default:
break;
}
return true;
}
}
bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
ClearGossipMenuFor(player);
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1:
InitGossipMenuFor(player, GOSSIP_MENU_MAIN_2);
AddGossipItemFor(player, GOSSIP_MENU_MAIN_2, GOSSIP_OPTION_MAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
SendGossipMenuFor(player, GOSSIP_TEXT_MAIN_2, me->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2:
CloseGossipMenuFor(player);
DoAction(ACTION_START_ANNOUNCE);
break;
case GOSSIP_ACTION_INFO_DEF + 10:
CloseGossipMenuFor(player);
_instance->SetData(DATA_OPERA_VARIATION, EVENT_OZ);
break;
case GOSSIP_ACTION_INFO_DEF + 11:
CloseGossipMenuFor(player);
_instance->SetData(DATA_OPERA_VARIATION, EVENT_HOOD);
break;
case GOSSIP_ACTION_INFO_DEF + 12:
CloseGossipMenuFor(player);
_instance->SetData(DATA_OPERA_VARIATION, EVENT_RAJ);
break;
}
return true;
}
private:
InstanceScript* _instance;
TaskScheduler _scheduler;
};
/*###
# npc_image_of_medivh
####*/
enum
enum ImageOfMedivhTexts
{
SAY_DIALOG_MEDIVH_1 = 0,
SAY_DIALOG_ARCANAGOS_2 = 0,
@@ -424,6 +507,16 @@ enum
SAY_DIALOG_MEDIVH_9 = 4
};
enum ImageOfMedivhMisc
{
SPELL_FIRE_BALL = 30967,
SPELL_UBER_FIREBALL = 30971,
SPELL_CONFLAGRATION_BLAST = 30977,
SPELL_MANA_SHIELD = 31635,
NPC_ARCANAGOS = 17652
};
static float MedivPos[4] = {-11161.49f, -1902.24f, 91.48f, 1.94f};
static float ArcanagosPos[4] = {-11169.75f, -1881.48f, 95.39f, 4.83f};
@@ -649,7 +742,7 @@ class spell_karazhan_charge : public SpellScript
void AddSC_karazhan()
{
new npc_barnes();
RegisterKarazhanCreatureAI(npc_barnes);
new npc_image_of_medivh();
RegisterSpellScript(spell_karazhan_charge);
}
@@ -40,12 +40,7 @@ enum KZDataTypes
DATA_MALCHEZZAR = 10,
DATA_NIGHTBANE = 11,
DATA_OPERA_OZ_DEATHCOUNT = 14,
DATA_KILREK = 15,
DATA_GO_CURTAINS = 18,
DATA_GO_STAGEDOORLEFT = 19,
DATA_GO_STAGEDOORRIGHT = 20,
DATA_GO_LIBRARY_DOOR = 21,
DATA_GO_MASSIVE_DOOR = 22,
DATA_GO_NETHER_DOOR = 23,
@@ -55,14 +50,25 @@ enum KZDataTypes
DATA_IMAGE_OF_MEDIVH = 26,
DATA_MASTERS_TERRACE_DOOR_1 = 27,
DATA_MASTERS_TERRACE_DOOR_2 = 28,
DATA_GO_SIDE_ENTRANCE_DOOR = 29,
DATA_GO_BLACKENED_URN = 30
DATA_GO_BLACKENED_URN = 30,
DATA_BARNES,
DATA_JULIANNE,
DATA_ROMULO,
DATA_OPERA_VARIATION,
DATA_OPERA_OZ_DEATH_COUNT,
DATA_GO_STAGE_CURTAIN,
DATA_GO_STAGE_DOOR_LEFT,
DATA_GO_STAGE_DOOR_RIGHT,
DATA_GO_SIDE_ENTRANCE_DOOR
};
enum KZOperaEvents
{
EVENT_OZ = 1,
EVENT_HOOD = 2,
EVENT_HOOD = 1,
EVENT_OZ = 2,
EVENT_RAJ = 3
};
@@ -73,6 +79,9 @@ enum KZMiscCreatures
NPC_SHADIKITH_THE_GLIDER = 16180,
NPC_TERESTIAN_ILLHOOF = 15688,
NPC_MOROES = 15687,
NPC_BARNES = 16812,
NPC_JULIANNE = 17534,
NPC_ROMULO = 17533,
NPC_NIGHTBANE = 17225,
NPC_ATTUMEN_UNMOUNTED = 15550,
NPC_ATTUMEN_MOUNTED = 16152,
@@ -107,6 +116,11 @@ enum KZGameObjectIds
GO_BLACKENED_URN = 194092
};
enum KZActionIds
{
ACTION_OPERA_FINISHED = 1681200
};
enum KZMisc
{
OPTIONAL_BOSS_REQUIRED_DEATH_COUNT = 50