diff options
136 files changed, 2879 insertions, 1788 deletions
diff --git a/sql/base/dev/world_database.sql b/sql/base/dev/world_database.sql index 3224b5b73a7..72faba49b8b 100644 --- a/sql/base/dev/world_database.sql +++ b/sql/base/dev/world_database.sql @@ -627,28 +627,6 @@ CREATE TABLE `creature_text` ( /*!40101 SET character_set_client = @saved_cs_client */; -- --- Table structure for table `db_script_string` --- - -DROP TABLE IF EXISTS `db_script_string`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `db_script_string` ( - `entry` int(10) unsigned NOT NULL DEFAULT '0', - `content_default` text NOT NULL, - `content_loc1` text, - `content_loc2` text, - `content_loc3` text, - `content_loc4` text, - `content_loc5` text, - `content_loc6` text, - `content_loc7` text, - `content_loc8` text, - PRIMARY KEY (`entry`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- -- Table structure for table `disables` -- diff --git a/sql/updates/world/2014_09_08_00_world_conditions.sql b/sql/updates/world/2014_09_08_00_world_conditions.sql index 492d6b5a981..469f5d5aecd 100644 --- a/sql/updates/world/2014_09_08_00_world_conditions.sql +++ b/sql/updates/world/2014_09_08_00_world_conditions.sql @@ -8,7 +8,7 @@ UPDATE `quest_template` SET `PrevQuestId`=0 WHERE `Id` IN(13682,13809); -- Clea UPDATE `quest_template` SET `PrevQuestId`=0 WHERE `Id` IN(13788,13812); -- Clear prev quest from Threat from above as this needs more than one quest complete to become available so will be dealt with by conditions instead UPDATE `quest_template` SET `PrevQuestId`=0 WHERE `Id`=13664; -- Clear prev quest for the Black Knight's Fall as this quest had multiple requirements and will be dealt with by conditions instead -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN(19,20) AND `SourceId` IN(13794,13795,13682,13809,13788,13812,13664); +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN(19,20) AND `SourceEntry` IN(13794,13795,13682,13809,13788,13812,13664); INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES (19, 0, 13794, 0, 0, 8, 0, 13737, 0, 0, 0, 0, 0, '', 'Eadric the Pure requires A Champion Rises'), (20, 0, 13794, 0, 0, 8, 0, 13737, 0, 0, 0, 0, 0, '', 'Eadric the Pure requires A Champion Rises'), diff --git a/sql/updates/world/2014_09_11_02_world_misc.sql b/sql/updates/world/2014_09_11_02_world_misc.sql new file mode 100644 index 00000000000..5c5fab0ecfd --- /dev/null +++ b/sql/updates/world/2014_09_11_02_world_misc.sql @@ -0,0 +1,123 @@ +-- Set Values +-- Human +SET @HRace := 1; +SET @HFaction := 72; +-- Dwarf +SET @DWRace := 4; +SET @DWFaction := 47; +-- Orc +SET @ORace := 2; +SET @OFaction := 76; +-- Tauren +SET @TARace := 32; +SET @TAFaction := 81; +-- Night Elf +SET @NRace := 8; +SET @NFaction := 69; +-- Undead +SET @URace := 16; +SET @UFaction := 68; +-- Troll +SET @TRRace := 128; +SET @TRFaction := 530; +-- Gnome (Milli Featherwhistle already uses db gossip and conditions as has sai script +-- Blood Elf +SET @BRace := 512; +SET @BFaction := 911; +-- Dreanei +SET @DRRace := 1024; +SET @DRFaction := 930; + +UPDATE `creature_template` SET `ScriptName`='' WHERE `entry` IN(384,1261,1460,2357,3662,3685,4730,4731,4885,7952,16264,17584); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN(14,15) AND `SourceGroup` IN(4004,4001,3161,3162,4006,4005,3185,8098,8213,3185); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(15, 4004, 0, 0, 0, 16, 0, @HRace, 0, 0, 0, 0, 0, '', 'Gossip Option - Show Option if Player is Human'), +(15, 4004, 0, 0, 1, 5, 0, @HFaction, 128, 0, 0, 0, 0, '', 'Gossip Option - Show Option if player is Exalted with Stormwind'), +(15, 4001, 0, 0, 0, 16, 0, @DWRace, 0, 0, 0, 0, 0, '', 'Gossip Option - Show Option if Player is Dwarf'), +(15, 4001, 0, 0, 1, 5, 0, @DWFaction, 128, 0, 0, 0, 0, '', 'Gossip Option - Show Option if player is Exalted with Ironforge'), +(15, 3161, 0, 0, 0, 16, 0, @ORace, 0, 0, 0, 0, 0, '', 'Gossip Option - Show Option if Player is Orc'), +(15, 3161, 0, 0, 1, 5, 0, @OFaction, 128, 0, 0, 0, 0, '', 'Gossip Option - Show Option if player is Exalted with Orgrimmar'), +(15, 4006, 0, 0, 0, 16, 0, @TARace, 0, 0, 0, 0, 0, '', 'Gossip Option - Show Option if Player is Tauren'), +(15, 4006, 0, 0, 1, 5, 0, @TAFaction, 128, 0, 0, 0, 0, '', 'Gossip Option - Show Option if player is Exalted with Thunderbluff'), +(15, 3185, 0, 0, 0, 16, 0, @NRace, 0, 0, 0, 0, 0, '', 'Gossip Option - Show Option if Player is Night Elf'), +(15, 3185, 0, 0, 1, 5, 0, @NFaction, 128, 0, 0, 0, 0, '', 'Gossip Option - Show Option if player is Exalted with Darnassus'), +(15, 4005, 0, 0, 0, 16, 0, @URace, 0, 0, 0, 0, 0, '', 'Gossip Option - Show Option if Player is Undead'), +(15, 4005, 0, 0, 1, 5, 0, @UFaction, 128, 0, 0, 0, 0, '', 'Gossip Option - Show Option if player is Exalted with Undercity'), +(15, 3162, 0, 0, 0, 16, 0, @TRRace, 0, 0, 0, 0, 0, '', 'Gossip Option - Show Option if Player is Troll'), +(15, 3162, 0, 0, 1, 5, 0, @TRFaction, 128, 0, 0, 0, 0, '', 'Gossip Option - Show Option if player is Exalted with Sen Jin'), +(15, 8098, 0, 0, 0, 16, 0, @BRace, 0, 0, 0, 0, 0, '', 'Gossip Option - Show Option if Player is Blood Elf'), +(15, 8098, 0, 0, 1, 5, 0, @BFaction, 128, 0, 0, 0, 0, '', 'Gossip Option - Show Option if player is Exalted with Silvermoon City'), +(15, 8213, 0, 0, 0, 16, 0, @DRRace, 0, 0, 0, 0, 0, '', 'Gossip Option - Show Option if Player is Dreanei'), +(15, 8213, 0, 0, 1, 5, 0, @DRFaction, 128, 0, 0, 0, 0, '', 'Gossip Option - Show Option if player is Exalted with Exodar'), + +(14, 4004, 4855, 0, 0, 16, 0, @HRace, 0, 0, 1, 0, 0, '', 'NPC Text - Show text if Player is Human'), +(14, 4004, 4855, 0, 0, 5, 0, @HFaction, 128, 0, 1, 0, 0, '', 'NPC Text - Show text if player is not Exalted with Stormwind'), +(14, 4006, 4840, 0, 0, 16, 0, @TARace, 0, 0, 1, 0, 0, '', 'NPC Text - Show text if Player is not Tauren'), +(14, 4006, 4840, 0, 0, 5, 0, @TAFaction, 128, 0, 1, 0, 0, '', 'NPC Text - Show text if player is not Exalted with Thunderbluff'), +(14, 8098, 10305, 0, 0, 16, 0, @BRace, 0, 0, 1, 0, 0, '', 'NPC Text - Show text if Player is not Blood Elf'), +(14, 8098, 10305, 0, 0, 5, 0, @BFaction, 128, 0, 1, 0, 0, '', 'NPC Text - Show text if player is not Exalted with Silvermoon'), +(14, 4005, 5840, 0, 0, 16, 0, @URace, 0, 0, 1, 0, 0, '', 'NPC Text - Show text if Player is not Undead'), +(14, 4005, 5840, 0, 0, 5, 0, @UFaction, 128, 0, 1, 0, 0, '', 'NPC Text - Show text if player is not Exalted with Undercity'), +(14, 3161, 3841, 0, 0, 16, 0, @ORace, 0, 0, 1, 0, 0, '', 'NPC Text - Show text if Player is not Orc'), +(14, 3161, 3841, 0, 0, 5, 0, @OFaction, 128, 0, 1, 0, 0, '', 'NPC Text - Show text if player is not Exalted with Ogrimmar'), +(14, 3185, 5844, 0, 0, 16, 0, @NRace, 0, 0, 1, 0, 0, '', 'NPC Text - Show text if Player is not Night Elf'), +(14, 3185, 5844, 0, 0, 5, 0, @NFaction, 128, 0, 1, 0, 0, '', 'NPC Text - Show text if player is not Exalted with Darnassus'), +(14, 3162, 5842, 0, 0, 16, 0, @TRRace, 0, 0, 1, 0, 0, '', 'NPC Text - Show text if Player is not Troll'), +(14, 3162, 5842, 0, 0, 5, 0, @TRFaction, 128, 0, 1, 0, 0, '', 'NPC Text - Show text if player is not Exalted with Darkspear Trolls'), + + +(14, 4004, 4859, 0, 0, 16, 0, @HRace, 0, 0, 0, 0, 0, '', 'NPC Text - Show text if Player is Human'), +(14, 4004, 4859, 0, 1, 5, 0, @HFaction, 128, 0, 0, 0, 0, '', 'NPC Text - Show text if player is Exalted with Stormwind'), +(14, 4006, 4862, 0, 0, 16, 0, @TARace, 0, 0, 0, 0, 0, '', 'NPC Text - Show text if Player is Tauren'), +(14, 4006, 4862, 0, 1, 5, 0, @TAFaction, 128, 0, 0, 0, 0, '', 'NPC Text - Show text if player is Exalted with Thunderbluff'), +(14, 8098, 10011, 0, 0, 16, 0, @BRace, 0, 0, 0, 0, 0, '', 'NPC Text - Show text if Player is Blood Elf'), +(14, 8098, 10011, 0, 1, 5, 0, @BFaction, 128, 0, 0, 0, 0, '', 'NPC Text - Show text if player is Exalted with Silvermoon'), +(14, 4005, 4869, 0, 0, 16, 0, @URace, 0, 0, 0, 0, 0, '', 'NPC Text - Show text if Player is Undead'), +(14, 4005, 4869, 0, 1, 5, 0, @UFaction, 128, 0, 0, 0, 0, '', 'NPC Text - Show text if player is Exalted with Undercity'), +(14, 3161, 3893, 0, 0, 16, 0, @ORace, 0, 0, 0, 0, 0, '', 'NPC Text - Show text if Player is Orc'), +(14, 3161, 3893, 0, 1, 5, 0, @OFaction, 128, 0, 0, 0, 0, '', 'NPC Text - Show text if player is Exalted with Ogrimmar'), +(14, 3185, 3942, 0, 0, 16, 0, @NRace, 0, 0, 0, 0, 0, '', 'NPC Text - Show text if Player is Night Elf'), +(14, 3185, 3942, 0, 1, 5, 0, @NFaction, 128, 0, 0, 0, 0, '', 'NPC Text - Show text if player is Exalted with Darnassus'), +(14, 3162, 3896, 0, 0, 16, 0, @TRRace, 0, 0, 0, 0, 0, '', 'NPC Text - Show text if Player is Troll'), +(14, 3162, 3896, 0, 1, 5, 0, @TRFaction, 128, 0, 0, 0, 0, '', 'NPC Text - Show text if player is Exalted with Darkspear Trolls'); + +UPDATE `creature_template` SET `gossip_menu_id`=4001 WHERE `entry`=1261; +UPDATE `creature_template` SET `gossip_menu_id`=4004 WHERE `entry`=2357; + +DELETE FROM `gossip_menu_option` WHERE `menu_id` IN(4004,4001,3161,3162,4006,4005,3185,8098,8213,3185); +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`, `option_text`, `OptionBroadcastTextID`, `option_id`, `npc_option_npcflag`, `action_menu_id`, `action_poi_id`, `box_coded`, `box_money`, `box_text`, `BoxBroadcastTextID`) VALUES +(3185, 1, 1, 'I would like to buy from you.', 14967, 3, 128, 0, 0, 0, 0, '', 0), +(4001, 0, 1, 'I would like to buy from you.', 14967, 3, 128, 0, 0, 0, 0, '', 0), +(3161, 0, 1, 'I would like to buy from you.', 14967, 3, 128, 0, 0, 0, 0, '', 0), +(3162, 0, 1, 'I would like to buy from you.', 14967, 3, 128, 0, 0, 0, 0, '', 0), +(4004, 0, 1, 'I would like to buy from you.', 14967, 3, 128, 0, 0, 0, 0, '', 0), +(4005, 0, 1, 'I would like to buy from you.', 14967, 3, 128, 0, 0, 0, 0, '', 0), +(4006, 0, 1, 'I would like to buy from you.', 14967, 3, 128, 0, 0, 0, 0, '', 0), +(8098, 0, 1, 'I wish to purchase one of these creatures.', 17909, 3, 128, 0, 0, 0, 0, '', 0), +(8213, 0, 1, 'I wish to purchase one of these creatures.', 17909, 3, 128, 0, 0, 0, 0, '', 0); + +DELETE FROM `gossip_menu` WHERE `entry`=4001; +INSERT INTO `gossip_menu` (`entry`, `text_id`) VALUES +(4001, 5856); -- 1261 + +DELETE FROM `gossip_menu` WHERE `entry` IN(4004,4001,3161,3162,4006,4005,3185,8098,8213,3185); +INSERT INTO `gossip_menu` (`entry`, `text_id`) VALUES +(3161, 3893), +(3161, 3841), +(3162, 3896), +(3162, 5842), +(3185, 3942), +(3185, 5844), +(4001, 5856), +(4004, 4859), +(4004, 5855), +(4005, 4869), +(4005, 5840), +(4006, 4862), +(4006, 5843), +(8098, 10011), +(8098, 10305), +(8213, 10239); + +UPDATE `smart_scripts` SET `target_type`=10 WHERE `entryorguid`=2598300 AND `ID`=1; diff --git a/sql/updates/world/2014_09_11_03_world_misc.sql b/sql/updates/world/2014_09_11_03_world_misc.sql new file mode 100644 index 00000000000..b6cd07998ef --- /dev/null +++ b/sql/updates/world/2014_09_11_03_world_misc.sql @@ -0,0 +1,5 @@ +DELETE FROM `npc_text` WHERE `ID`=5841; +INSERT INTO `npc_text` (`ID`, `text0_0`, `text0_1`, `BroadcastTextID0`, `lang0`, `prob0`, `em0_0`, `em0_1`, `em0_2`, `em0_3`, `em0_4`, `em0_5`, `text1_0`, `text1_1`, `BroadcastTextID1`, `lang1`, `prob1`, `em1_0`, `em1_1`, `em1_2`, `em1_3`, `em1_4`, `em1_5`, `text2_0`, `text2_1`, `BroadcastTextID2`, `lang2`, `prob2`, `em2_0`, `em2_1`, `em2_2`, `em2_3`, `em2_4`, `em2_5`, `text3_0`, `text3_1`, `BroadcastTextID3`, `lang3`, `prob3`, `em3_0`, `em3_1`, `em3_2`, `em3_3`, `em3_4`, `em3_5`, `text4_0`, `text4_1`, `BroadcastTextID4`, `lang4`, `prob4`, `em4_0`, `em4_1`, `em4_2`, `em4_3`, `em4_4`, `em4_5`, `text5_0`, `text5_1`, `BroadcastTextID5`, `lang5`, `prob5`, `em5_0`, `em5_1`, `em5_2`, `em5_3`, `em5_4`, `em5_5`, `text6_0`, `text6_1`, `BroadcastTextID6`, `lang6`, `prob6`, `em6_0`, `em6_1`, `em6_2`, `em6_3`, `em6_4`, `em6_5`, `text7_0`, `text7_1`, `BroadcastTextID7`, `lang7`, `prob7`, `em7_0`, `em7_1`, `em7_2`, `em7_3`, `em7_4`, `em7_5`, `VerifiedBuild`) VALUES +(5841, 'I only make my mounts available to those who are considered exalted to Orgrimmar and the Orcish race. Go prove yourself to us, and I''ll make my mighty wolves available for your inspection.', 'I only make my mounts available to those who are considered exalted to Orgrimmar and the Orcish race. Go prove yourself to us, and I''ll make my mighty wolves available for your inspection.', 8414, 0, 1, 0, 1, 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, 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); + +UPDATE `gossip_menu_option` SET `id`=0 WHERE `menu_id`=3185 AND `id`=1; diff --git a/sql/updates/world/2014_09_12_00_world_misc.sql b/sql/updates/world/2014_09_12_00_world_misc.sql new file mode 100644 index 00000000000..e36e4012ca9 --- /dev/null +++ b/sql/updates/world/2014_09_12_00_world_misc.sql @@ -0,0 +1,34 @@ +UPDATE `creature_template` SET `ScriptName`='' WHERE `entry` =3362; + +DELETE FROM `creature_text` WHERE `entry` IN(18407,18166); +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`, `BroadcastTextID`) VALUES +(18407, 0, 0, 'Damn those ogres. Damn them to the Nether. Won''t someone save us from these savages! This is the fifth kidnapping in as many days.', 12, 1, 100, 0, 0, 0, 'Warden Bullrok',15371), +(18407, 1, 0, 'That''s the best reward we''re going to be able to offer. Hopefully someone accepts the mission.', 12, 1, 100, 1, 0, 0, 'Warden Bullrok',15372), +(18166, 0, 0, 'Do not burden A''dal with mundane questions, $r. This being''s will is all that keeps our enemies from crushing this city.', 12, 0, 100, 0, 0, 0, 'Khadgar',17238), +(18166, 1, 0, 'Show our guest around Shattrath, will you? Keep an eye out for pickpockets in the Lower City.', 12, 0, 100, 0, 0, 0, 'Khadgar',17266); + +UPDATE `creature_template` SET `AIName`='SmartAI', `ScriptName`='' WHERE `entry`=18166; + +DELETE FROM `smart_scripts` WHERE `entryorguid`IN(18407,18166) AND `source_type`=0; +DELETE FROM `smart_scripts` WHERE `entryorguid`=18481 AND `source_type`=0 AND `id`=2; + +DELETE FROM `smart_scripts` WHERE `entryorguid`=1840700 AND `source_type`=9; + +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 +(18407, 0, 0, 0, 1, 0, 100, 0, 60000, 60000, 120000, 240000, 80, 1840700, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Warden Bullrok - Out of Combat - Run Script'), +(18481, 0, 2, 0, 20, 0, 100, 0, 10210, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 19, 18166, 0, 0, 0, 0, 0, 0, 'A\'dal - On Quest Reward (A''DAL) - Say line 0 on Khadgar'), +(18166, 0, 0, 0, 19, 0, 100, 0, 10211, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Khadgar - On Quest Accept (City of Lights) - Say Line 1'), +(1840700, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 71, 0, 0, 1903, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Warden Bullrok - Script - Equip Virtual Item 1903 to Slot 1'), +(1840700, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 2.96706, 'Warden Bullrok - Script - Set Orientation'), +(1840700, 9, 2, 0, 0, 0, 100, 0, 2000, 2000, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Warden Bullrok - Script - Play emote STATE_WORK_CHOPWOOD'), +(1840700, 9, 3, 0, 0, 0, 100, 0, 0, 0, 0, 0, 17, 234, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Warden Bullrok - Script - Say Line 1'), +(1840700, 9, 4, 0, 0, 0, 100, 0, 15000, 15000, 0, 0, 17, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Warden Bullrok - Script - Play emote ONESHOT_NONE'), +(1840700, 9, 5, 0, 0, 0, 100, 0, 1000, 1000, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Warden Bullrok - Script - Say Line 1'), +(1840700, 9, 6, 0, 0, 0, 100, 0, 3000, 3000, 0, 0, 66, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0.6283185, 'Warden Bullrok - Script - Set Orientation'), +(1840700, 9, 7, 0, 0, 0, 100, 0, 0, 0, 0, 0, 71, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Warden Bullrok - Script - Unequip Virtual Item'); + +UPDATE `gossip_menu` SET `text_id`=5841 WHERE `entry`=3161 AND `text_id`=3841; +UPDATE `conditions` SET `SourceEntry`=5843 WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=4006 AND `SourceEntry`=4840 AND `SourceId`=0 AND `ElseGroup`=0 AND `ConditionTypeOrReference`=5 AND `ConditionTarget`=0 AND `ConditionValue1`=81 AND `ConditionValue2`=128 AND `ConditionValue3`=0; +UPDATE `conditions` SET `SourceEntry`=5843 WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=4006 AND `SourceEntry`=4840 AND `SourceId`=0 AND `ElseGroup`=0 AND `ConditionTypeOrReference`=16 AND `ConditionTarget`=0 AND `ConditionValue1`=32 AND `ConditionValue2`=0 AND `ConditionValue3`=0; +UPDATE `conditions` SET `SourceEntry`=5855 WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=4004 AND `SourceEntry`=4855 AND `SourceId`=0 AND `ElseGroup`=0 AND `ConditionTypeOrReference`=5 AND `ConditionTarget`=0 AND `ConditionValue1`=72 AND `ConditionValue2`=128 AND `ConditionValue3`=0; +UPDATE `conditions` SET `SourceEntry`=5855 WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=4004 AND `SourceEntry`=4855 AND `SourceId`=0 AND `ElseGroup`=0 AND `ConditionTypeOrReference`=16 AND `ConditionTarget`=0 AND `ConditionValue1`=1 AND `ConditionValue2`=0 AND `ConditionValue3`=0; diff --git a/sql/updates/world/2014_09_12_01_world_misc.sql b/sql/updates/world/2014_09_12_01_world_misc.sql new file mode 100644 index 00000000000..71cb62477d4 --- /dev/null +++ b/sql/updates/world/2014_09_12_01_world_misc.sql @@ -0,0 +1,4 @@ +UPDATE `conditions` SET `SourceEntry`=5841 WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=3161 AND `SourceEntry`=3841 AND `SourceId`=0 AND `ElseGroup`=0 AND `ConditionTypeOrReference`=16 AND `ConditionTarget`=0 AND `ConditionValue1`=2 AND `ConditionValue2`=0 AND `ConditionValue3`=0; +UPDATE `conditions` SET `SourceEntry`=5841 WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=3161 AND `SourceEntry`=3841 AND `SourceId`=0 AND `ElseGroup`=0 AND `ConditionTypeOrReference`=5 AND `ConditionTarget`=0 AND `ConditionValue1`=76 AND `ConditionValue2`=128 AND `ConditionValue3`=0; + +UPDATE `creature_template` SET `flags_extra`=0 WHERE `entry` IN(24928,25115); diff --git a/sql/updates/world/2014_09_12_02_world_misc.sql b/sql/updates/world/2014_09_12_02_world_misc.sql new file mode 100644 index 00000000000..535ecb90367 --- /dev/null +++ b/sql/updates/world/2014_09_12_02_world_misc.sql @@ -0,0 +1,9 @@ +DELETE FROM `creature_text` WHERE `entry`=26527; +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`, `BroadcastTextId`) VALUES +(26527, 0, 0, 'Oh, no! Adventurers, something awful has happened! A colleague of mine has been captured by the Infinite Dragonflight, and they''re doing something horrible to him! Keeping Arthas is still your highest priority, but if you act fast you could help save a Guardian of Time!', 15, 0, 100, 0, 0, 0, 'Chromie', 32670), +(26527, 1, 0, 'Adventurers, you must hurry! The Guardian of Time cannot last for much longer!', 15, 0, 100, 0, 0, 0, 'Chromie', 32678), +(26527, 2, 0, 'I can barely sense the Guardian of Time! His timeline is fading quickly!', 15, 0, 100, 0, 0, 0, 'Chromie', 32679); + +DELETE FROM `conditions` WHERE `SourceEntry`=60422; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `Comment`) VALUES +(13, 1, 60422, 0, 0, 31, 1, 3, 32281, 0, 0, 0, 0, 'Corruption of Time (60422) can hit only Guardian of Time'); diff --git a/sql/updates/world/2014_09_12_03_world_gameobject_template.sql b/sql/updates/world/2014_09_12_03_world_gameobject_template.sql new file mode 100644 index 00000000000..3771dd7c7dc --- /dev/null +++ b/sql/updates/world/2014_09_12_03_world_gameobject_template.sql @@ -0,0 +1,3 @@ +-- +UPDATE `gameobject_template` SET `flags`=4 WHERE `entry`=201937; -- Light's Vengeance +UPDATE `gameobject_template` SET `flags`=32 WHERE `entry`=201759; -- The Forge of Souls Portcullis diff --git a/sql/updates/world/2014_09_12_04_world_sai.sql b/sql/updates/world/2014_09_12_04_world_sai.sql new file mode 100644 index 00000000000..4021ea41d01 --- /dev/null +++ b/sql/updates/world/2014_09_12_04_world_sai.sql @@ -0,0 +1,98 @@ +DELETE FROM `gossip_menu_option` WHERE menu_id IN(8510,8524); +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`, `option_text`, `OptionBroadcastTextID`, `option_id`, `npc_option_npcflag`, `action_menu_id`, `action_poi_id`, `box_coded`, `box_money`, `box_text`, `BoxBroadcastTextID`) VALUES +(8510, 0, 0, 'Yes Scryer, You may possess me', 20008, 1, 1, 0, 0, 0, 0, NULL, 0); + +UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` IN (22258,22259,22273,22267,22366); + +UPDATE `spell_dbc` SET `Effect1`=28,`EffectMiscValueB1`=64 WHERE `Id`IN(38674,38675,38676,38677,38678,38679,38709,38681); + + +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (22258,22259,22273,22267,22366,2225800); + +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 +(22258, 0, 0, 0, 11, 0, 100, 0, 0, 0, 0, 0, 80, 2225800, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Demoniac Scryer - On Spawn - Run Script'), +(22258, 0, 1, 2 ,62,0, 100, 0, 8510,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Demoniac Scryer - On Gossip Select - Close Gossip'), +(22258, 0, 2, 0, 61,0, 100, 0,0,0,0,0,85,38708,1,0,0,0,0,7,0,0,0,0,0,0,0,'Demoniac Scryer - On Gossip Select - Cast Demoniac Visitation'), +(22258, 0, 3, 7, 11,0, 100, 0,0,0,0,0,81,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Demoniac Scryer - On Spawn - Set NPC Flags'), +(22258, 0, 4, 5, 7,0, 100, 0,0,0,0,0,11,38672,0,0,0,0,0,1,0,0,0,0,0,0,0,'Demoniac Scryer - On Evade - Cast Magic Sucker Device timer'), +(22258, 0, 5, 0, 61,0, 100, 0,0,0,0,0,11,38690,0,0,0,0,0,1,0,0,0,0,0,0,0,'Demoniac Scryer - On Evade - Cast Magic Sucker Device Bunny Appearance'), +(22258, 0, 6 ,0, 6, 0, 100, 0, 0, 0, 0, 0, 11, 38691, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Demoniac Scryer - On Death - Cast Magic Sucker Device Despawner, Mob AE'), +(22258, 0, 7 ,8, 61, 0, 100, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Demoniac Scryer - On Spawn - Disable Auto Attack'), +(22258, 0, 8 ,9, 61, 0, 100, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Demoniac Scryer - On Death - Disable Combatmovement'), +(22258, 0, 9 ,0, 61, 0, 100, 0, 0, 0, 0, 0, 18, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Demoniac Scryer - On Death - Disable Combatmovement'), +(22258, 0, 10 ,0, 64, 0, 100, 0, 0, 0, 0, 0, 98, 8510, 10643, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Demoniac Scryer - On Death - Disable Combatmovement'), +(22366, 0, 0, 0, 54, 0, 100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Demoniac Visitation - On Just Summoned - Say'), +(22259, 0, 0, 1, 54, 0, 100, 0, 0, 0, 0, 0, 11, 38683, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Hellfire Wardling - On Just Summoned - Cast Magic Sucker Device Despawner, Mob'), +(22259, 0, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Hellfire Wardling - On Just Summoned - Say'), +(22259, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 7741, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Hellfire Wardling - On Just Summoned - Cast Summoned Demon'), +(22259, 0, 3, 4, 6, 0, 100, 0, 0, 0, 0, 0, 11, 38891, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Hellfire Wardling - On Death - Cast Magic Sucker Device (Despawn Visual)'), +(22259, 0, 4, 0, 61, 0, 100, 0, 0, 0, 0, 0, 41, 500, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Hellfire Wardling - On Death - Despawn'), +(22259, 0, 5, 0, 8, 0, 100, 0, 38691, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Hellfire Wardling - On Spellhit (Magic Sucker Device Despawner, Mob AE) - Despawn'), +(22273, 0, 0, 1, 54, 0, 100, 0, 0, 0, 0, 0, 11, 38683, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Fel Warden - On Just Summoned - Cast Magic Sucker Device Despawner, Mob'), +(22273, 0, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Fel Warden - On Just Summoned - Say'), +(22273, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 7741, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Fel Warden - On Just Summoned - Cast Summoned Demon'), +(22273, 0, 3, 0, 8, 0, 100, 0, 38691, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Fel Warden - On Spellhit (Magic Sucker Device Despawner, Mob AE) - Despawn'), +(22267, 0, 0, 1, 54, 0, 100, 0, 0, 0, 0, 0, 11, 38719, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Magic Sucker Device Buttress - On Just Summoned - Cast Magic Sucker Device Buttress Appearance'), +(22267, 0, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 19, 22258, 0, 0, 0, 0, 0, 0, 'Magic Sucker Device Buttress - On Just Summoned - Set Orientation'), +(22267, 0, 2, 3, 61, 0, 100, 0, 0, 0, 0, 0, 11, 30259, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Magic Sucker Device Buttress - On Just Summoned - Cast Statue (dnd)'), +(22267, 0, 3, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 38721, 0, 0, 0, 0, 0, 19, 22258, 0, 0, 0, 0, 0, 0, 'Magic Sucker Device Buttress - On Just Summoned - Cast Magic Sucker Device Channel(dnd)'), +(22267, 0, 4, 0, 8, 0, 100, 0, 38691, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Magic Sucker Device Buttress - On Spellhit (Magic Sucker Device Despawner, Mob AE) - Despawn'), +(22267, 0, 5, 3, 1, 0, 100, 0, 0, 0, 3000, 3000, 11, 38719, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Magic Sucker Device Buttress - IC - Cast Magic Sucker Device Buttress Appearance'), +(22267, 0, 6, 3, 0, 0, 100, 0, 0, 0, 3000, 3000, 11, 38919, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Magic Sucker Device Buttress - OOC - Cast Magic Sucker Device Buttress Appearance'), + +(2225800, 9, 0 ,0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 38672, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Demoniac Scryer - Script - Cast Magic Sucker Device timer'), -- 15:36:21 +(2225800, 9, 1 ,0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 38690, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Demoniac Scryer - Script - Cast Magic Sucker Device Bunny Appearance'), -- 15:36:21 +(2225800, 9, 2 ,0, 0, 0, 100, 0, 8000, 8000, 0, 0, 11, 38681, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Demoniac Scryer - Script - Cast Spawn Magic Sucker Spawner, Device'), -- 15:36:29 +(2225800, 9, 3 ,0, 0, 0, 100, 0, 7000, 7000, 0, 0, 11, 38679, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Demoniac Scryer - Script - Cast Spawn Magic Sucker Device Mob'), -- 15:36:36 * +(2225800, 9, 4 ,0, 0, 0, 100, 0, 15000, 15000, 0, 0, 11, 38679, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Demoniac Scryer - Script - Cast Spawn Magic Sucker Device Mob'), -- 15:36:51 * +(2225800, 9, 5 ,0, 0, 0, 100, 0, 15000, 15000, 0, 0, 11, 38679, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Demoniac Scryer - Script - Cast Spawn Magic Sucker Device Mob'), -- 15:37:06 * +(2225800, 9, 6 ,0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 38675, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Demoniac Scryer - Script - Cast Create Magic Sucker Device Buttress (N)'), -- 15:37:06 * +(2225800, 9, 7 ,0, 0, 0, 100, 0, 15000, 15000, 0, 0, 11, 38679, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Demoniac Scryer - Script - Cast Spawn Magic Sucker Device Mob'), -- 15:37:21 * +(2225800, 9, 8 ,0, 0, 0, 100, 0, 15000, 15000, 0, 0, 11, 38679, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Demoniac Scryer - Script - Cast Spawn Magic Sucker Device Mob'), -- 15:37:36 * +(2225800, 9, 9 ,0, 0, 0, 100, 0, 15000, 15000, 0, 0, 11, 38679, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Demoniac Scryer - Script - Cast Spawn Magic Sucker Device Mob'), -- 15:37:51 * +(2225800, 9, 10 ,0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 38676, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Demoniac Scryer - Script - Cast Create Magic Sucker Device Buttress (S)'), -- 15:37:51 * +(2225800, 9, 11 ,0, 0, 0, 100, 0, 15000, 15000, 0, 0, 11, 38679, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Demoniac Scryer - Script - Cast Spawn Magic Sucker Device Mob'), -- 15:38:06 * +(2225800, 9, 12 ,0, 0, 0, 100, 0, 15000, 15000, 0, 0, 11, 38679, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Demoniac Scryer - Script - Cast Spawn Magic Sucker Device Mob'), -- 15:38:21 * +(2225800, 9, 13 ,0, 0, 0, 100, 0, 15000, 15000, 0, 0, 11, 38679, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Demoniac Scryer - Script - Cast Spawn Magic Sucker Device Mob'), -- 15:38:36 * +(2225800, 9, 14 ,0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 38709, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Demoniac Scryer - Script - Cast Spawn Magic Sucker Device Boss'), -- 15:38:36 * +(2225800, 9, 15 ,0, 0, 0, 100, 0, 15000, 15000, 0, 0, 11, 38679, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Demoniac Scryer - Script - Cast Spawn Magic Sucker Device Mob'), -- 15:38:51 * +(2225800, 9, 16 ,0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 38677, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Demoniac Scryer - Script - Cast Create Magic Sucker Device Buttress (E)'), -- 15:38:51 * +(2225800, 9, 17 ,0, 0, 0, 100, 0, 15000, 15000, 0, 0, 11, 38679, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Demoniac Scryer - Script - Cast Spawn Magic Sucker Device Mob'), -- 15:39:06 * +(2225800, 9, 18 ,0, 0, 0, 100, 0, 15000, 15000, 0, 0, 11, 38679, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Demoniac Scryer - Script - Cast Spawn Magic Sucker Device Mob'), -- 15:39:21 * +(2225800, 9, 19 ,0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 38678, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Demoniac Scryer - Script - Cast Create Magic Sucker Device Buttress (W)'), -- 15:39:21 * +(2225800, 9, 20 ,0, 0, 0, 100, 0, 15000, 15000, 0, 0, 11, 38679, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Demoniac Scryer - Script - Cast Spawn Magic Sucker Device Mob'), -- 15:39:36 * +(2225800, 9, 21 ,0, 0, 0, 100, 0, 15000, 15000, 0, 0, 11, 38679, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Demoniac Scryer - Script - Cast Spawn Magic Sucker Device Mob'), -- 15:39:51 * +(2225800, 9, 22 ,0, 0, 0, 100, 0, 15000, 15000, 0, 0, 11, 38691, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Demoniac Scryer - Script - Cast Magic Sucker Device Despawner, Mob AE'), -- 15:40:06 * +(2225800, 9, 23 ,0, 0, 0, 100, 0, 1000, 1000, 0, 0, 11, 38727, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Demoniac Scryer - Script - Cast Magic Sucker Device (Success Visual timer)'), -- 15:40:07 * +(2225800, 9, 24 ,0, 0, 0, 100, 0, 0, 0, 0, 0, 18, 768, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Demoniac Scryer - Script - Set Unit Flags'), +(2225800, 9, 25 ,0, 0, 0, 100, 0, 0, 0, 0, 0, 28, 38672, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Demoniac Scryer - Script - Remove Aura Magic Sucker Device timer'), +(2225800, 9, 26 ,0, 0, 0, 100, 0, 3000, 3000, 0, 0, 11, 38727, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Demoniac Scryer - Script - Cast Magic Sucker Device (Success Visual timer)'), -- 15:40:07 * +(2225800, 9, 27 ,0, 0, 0, 100, 0, 0, 0, 0, 0, 28, 38672, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Demoniac Scryer - Script - Remove Aura Magic Sucker Device timer'), +(2225800, 9, 28 ,0, 0, 0, 100, 0, 3000, 3000, 0, 0, 11, 38727, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Demoniac Scryer - Script - Cast Magic Sucker Device (Success Visual timer)'), -- 15:40:07 * +(2225800, 9, 29 ,0, 0, 0, 100, 0, 0, 0, 0, 0, 28, 38672, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Demoniac Scryer - Script - Remove Aura Magic Sucker Device timer'), +(2225800, 9, 30 ,0, 0, 0, 100, 0, 84000, 84000, 0, 0, 41, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Demoniac Scryer - Script - Remove Aura Magic Sucker Device timer'); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceEntry`=22258; + +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(22, 11, 22258, 0, 0, 9, 0, 10838, 0, 0, 0, 0, 0, '', 'Demoniac Scryer - Only run SAI if player has the Demoniac Scryer Taken'), +(22, 11, 22258, 0, 0, 2, 0, 31607, 1, 0, 1, 0, 0, '', 'Demoniac Scryer - Only run SAI if player does not have Demoniac Scryer Reading'), +(22, 11, 22258, 0, 0, 1, 0, 38708, 0, 0, 1, 0, 0, '', 'Demoniac Scryer - Only run SAI if player does not have Aura Demonaic Visitation'), +(22, 11, 22258, 0, 0, 1, 1, 38672, 0, 0, 1, 0, 0, '', 'Demoniac Scryer - Only run SAI if Demoniac Scryer does not have Aura Magic Sucker Device timer'); + +DELETE FROM `creature_text` WHERE `entry` IN (22259,22273,22366); + +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`, `BroadcastTextID`) VALUES +(22273, 0, 0, 'Die, interloper! Your puny device cannot pierce the dark magics of Hellfire Citadel!', 12, 0, 100, 397, 0, 0, 'Fel Warden',20020), +(22259, 0, 0, 'Your end has come!', 12, 0, 100, 0, 0, 0, 'Hellfire Wardling',53515), +(22259, 0, 1, 'An intruder! Begone!', 12, 0, 100, 0, 0, 0, 'Hellfire Wardling',20027), +(22259, 0, 2, 'An intruder! Begone!', 12, 0, 100, 0, 0, 8152, 'Hellfire Wardling',20027), +(22259, 0, 3, 'You will burn!', 12, 0, 100, 0, 0, 0, 'Hellfire Wardling',53513), +(22259, 0, 4, 'Die!', 12, 0, 100, 0, 0, 0, 'Hellfire Wardling',53514), +(22259, 0, 5, 'Your end has come!', 12, 0, 100, 0, 0, 8152, 'Hellfire Wardling',53515), +(22259, 0, 6, 'Die!', 12, 0, 100, 0, 0, 8152, 'Hellfire Wardling',53514), +(22366, 0, 0, 'Thank you for allowing me to visit, $n. You have a very colorful soul, but it''s a little brighter than I prefer... or I might have stayed longer!', 15, 0, 100, 0, 0, 0, 'Demoniac Visitation',20154); + +DELETE FROM `spell_linked_spell` WHERE `spell_trigger`IN(-38708); +INSERT INTO `spell_linked_spell` (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES +(-38708, 38991, 0,'Upon Demoniac Visitation expiring cast Summon Demonaic Visitation'); diff --git a/sql/updates/world/2014_09_12_04_world_texts.sql b/sql/updates/world/2014_09_12_04_world_texts.sql new file mode 100644 index 00000000000..5f7177eb765 --- /dev/null +++ b/sql/updates/world/2014_09_12_04_world_texts.sql @@ -0,0 +1,185 @@ +DROP TABLE IF EXISTS `db_script_string`; -- RIP + +UPDATE `waypoint_scripts` SET `dataint` = 5960 WHERE `dataint` = 2000005018; +UPDATE `waypoint_scripts` SET `dataint` = 22392 WHERE `dataint` = 2000005019; +UPDATE `waypoint_scripts` SET `dataint` = 22050 WHERE `dataint` = 2000005020; +UPDATE `waypoint_scripts` SET `dataint` = 22051 WHERE `dataint` = 2000005021; +UPDATE `waypoint_scripts` SET `dataint` = 22052 WHERE `dataint` = 2000005022; +UPDATE `waypoint_scripts` SET `dataint` = 10141 WHERE `dataint` = 2000005023; +UPDATE `waypoint_scripts` SET `dataint` = 10146 WHERE `dataint` = 2000005024; +UPDATE `waypoint_scripts` SET `dataint` = 10152 WHERE `dataint` = 2000005025; +UPDATE `waypoint_scripts` SET `dataint` = 10126 WHERE `dataint` = 2000005026; +UPDATE `waypoint_scripts` SET `dataint` = 7194 WHERE `dataint` = 2000005027; +UPDATE `waypoint_scripts` SET `dataint` = 7193 WHERE `dataint` = 2000005028; +UPDATE `waypoint_scripts` SET `dataint` = 7191 WHERE `dataint` = 2000005029; +UPDATE `waypoint_scripts` SET `dataint` = 10139 WHERE `dataint` = 2000005030; -- 4.x text +UPDATE `waypoint_scripts` SET `dataint` = 6406 WHERE `dataint` = 2000005031; +UPDATE `waypoint_scripts` SET `dataint` = 6405 WHERE `dataint` = 2000005032; +UPDATE `waypoint_scripts` SET `dataint` = 10158 WHERE `dataint` = 2000005033; +UPDATE `waypoint_scripts` SET `dataint` = 22544 WHERE `dataint` = 2000005034; +UPDATE `waypoint_scripts` SET `dataint` = 10146 WHERE `dataint` = 2000005035; +UPDATE `waypoint_scripts` SET `dataint` = 12835 WHERE `dataint` = 2000005036; +UPDATE `waypoint_scripts` SET `dataint` = 12832 WHERE `dataint` = 2000005037; +UPDATE `waypoint_scripts` SET `dataint` = 12833 WHERE `dataint` = 2000005038; +UPDATE `waypoint_scripts` SET `dataint` = 14565 WHERE `dataint` = 2000005039; +UPDATE `waypoint_scripts` SET `dataint` = 14567 WHERE `dataint` = 2000005040; +UPDATE `waypoint_scripts` SET `dataint` = 15144 WHERE `dataint` = 2000005041; +UPDATE `waypoint_scripts` SET `dataint` = 15373 WHERE `dataint` = 2000005042; +UPDATE `waypoint_scripts` SET `dataint` = 17569 WHERE `dataint` = 2000005043; -- doesn't exist anywhere, picked a random text from the same npc +UPDATE `waypoint_scripts` SET `dataint` = 17563 WHERE `dataint` = 2000005044; -- doesn't exist anywhere, picked a random text from the same npc +UPDATE `waypoint_scripts` SET `dataint` = 16059 WHERE `dataint` = 2000005045; +UPDATE `waypoint_scripts` SET `dataint` = 10119 WHERE `dataint` = 2000005048; +UPDATE `waypoint_scripts` SET `dataint` = 17035 WHERE `dataint` = 2000005049; +UPDATE `waypoint_scripts` SET `dataint` = 17045 WHERE `dataint` = 2000005050; +UPDATE `waypoint_scripts` SET `dataint` = 17056 WHERE `dataint` = 2000005051; +UPDATE `waypoint_scripts` SET `dataint` = 17486 WHERE `dataint` = 2000005052; +UPDATE `waypoint_scripts` SET `dataint` = 17485 WHERE `dataint` = 2000005053; +UPDATE `waypoint_scripts` SET `dataint` = 17485 WHERE `dataint` = 2000005054; +UPDATE `waypoint_scripts` SET `dataint` = 17485 WHERE `dataint` = 2000005055; +UPDATE `waypoint_scripts` SET `dataint` = 18816 WHERE `dataint` = 2000005056; +UPDATE `waypoint_scripts` SET `dataint` = 709 WHERE `dataint` = 2000005057; +UPDATE `waypoint_scripts` SET `dataint` = 710 WHERE `dataint` = 2000005058; +UPDATE `waypoint_scripts` SET `dataint` = 705 WHERE `dataint` = 2000005059; +UPDATE `waypoint_scripts` SET `dataint` = 693 WHERE `dataint` = 2000005060; +UPDATE `waypoint_scripts` SET `dataint` = 710 WHERE `dataint` = 2000005061; +UPDATE `waypoint_scripts` SET `dataint` = 706 WHERE `dataint` = 2000005062; +UPDATE `waypoint_scripts` SET `dataint` = 709 WHERE `dataint` = 2000005063; +UPDATE `waypoint_scripts` SET `dataint` = 710 WHERE `dataint` = 2000005064; +UPDATE `waypoint_scripts` SET `dataint` = 705 WHERE `dataint` = 2000005065; +UPDATE `waypoint_scripts` SET `dataint` = 693 WHERE `dataint` = 2000005066; +UPDATE `waypoint_scripts` SET `dataint` = 710 WHERE `dataint` = 2000005067; +UPDATE `waypoint_scripts` SET `dataint` = 706 WHERE `dataint` = 2000005068; +UPDATE `waypoint_scripts` SET `dataint` = 709 WHERE `dataint` = 2000005069; +UPDATE `waypoint_scripts` SET `dataint` = 710 WHERE `dataint` = 2000005070; +UPDATE `waypoint_scripts` SET `dataint` = 705 WHERE `dataint` = 2000005071; +UPDATE `waypoint_scripts` SET `dataint` = 693 WHERE `dataint` = 2000005072; +UPDATE `waypoint_scripts` SET `dataint` = 710 WHERE `dataint` = 2000005073; +UPDATE `waypoint_scripts` SET `dataint` = 706 WHERE `dataint` = 2000005074; +UPDATE `waypoint_scripts` SET `dataint` = 709 WHERE `dataint` = 2000005075; +UPDATE `waypoint_scripts` SET `dataint` = 710 WHERE `dataint` = 2000005076; +UPDATE `waypoint_scripts` SET `dataint` = 705 WHERE `dataint` = 2000005077; +UPDATE `waypoint_scripts` SET `dataint` = 694 WHERE `dataint` = 2000005078; +UPDATE `waypoint_scripts` SET `dataint` = 694 WHERE `dataint` = 2000005079; +UPDATE `waypoint_scripts` SET `dataint` = 696 WHERE `dataint` = 2000005080; +UPDATE `waypoint_scripts` SET `dataint` = 694 WHERE `dataint` = 2000005081; +UPDATE `waypoint_scripts` SET `dataint` = 694 WHERE `dataint` = 2000005082; +UPDATE `waypoint_scripts` SET `dataint` = 694 WHERE `dataint` = 2000005083; +UPDATE `waypoint_scripts` SET `dataint` = 694 WHERE `dataint` = 2000005084; +UPDATE `waypoint_scripts` SET `dataint` = 694 WHERE `dataint` = 2000005085; +UPDATE `waypoint_scripts` SET `dataint` = 696 WHERE `dataint` = 2000005086; +UPDATE `waypoint_scripts` SET `dataint` = 694 WHERE `dataint` = 2000005087; +UPDATE `waypoint_scripts` SET `dataint` = 694 WHERE `dataint` = 2000005088; +UPDATE `waypoint_scripts` SET `dataint` = 694 WHERE `dataint` = 2000005089; +UPDATE `waypoint_scripts` SET `dataint` = 694 WHERE `dataint` = 2000005090; +UPDATE `waypoint_scripts` SET `dataint` = 694 WHERE `dataint` = 2000005091; +UPDATE `waypoint_scripts` SET `dataint` = 696 WHERE `dataint` = 2000005092; +UPDATE `waypoint_scripts` SET `dataint` = 694 WHERE `dataint` = 2000005093; +UPDATE `waypoint_scripts` SET `dataint` = 694 WHERE `dataint` = 2000005094; +UPDATE `waypoint_scripts` SET `dataint` = 694 WHERE `dataint` = 2000005095; +UPDATE `waypoint_scripts` SET `dataint` = 694 WHERE `dataint` = 2000005096; +UPDATE `waypoint_scripts` SET `dataint` = 694 WHERE `dataint` = 2000005097; +UPDATE `waypoint_scripts` SET `dataint` = 696 WHERE `dataint` = 2000005098; +UPDATE `waypoint_scripts` SET `dataint` = 1101 WHERE `dataint` = 2000005099; +UPDATE `waypoint_scripts` SET `dataint` = 1103 WHERE `dataint` = 2000005100; +UPDATE `waypoint_scripts` SET `dataint` = 4013 WHERE `dataint` = 2000005101; +UPDATE `waypoint_scripts` SET `dataint` = 1104 WHERE `dataint` = 2000005102; +UPDATE `waypoint_scripts` SET `dataint` = 1110 WHERE `dataint` = 2000005103; +UPDATE `waypoint_scripts` SET `dataint` = 1105 WHERE `dataint` = 2000005104; +UPDATE `waypoint_scripts` SET `dataint` = 1108 WHERE `dataint` = 2000005105; +UPDATE `waypoint_scripts` SET `dataint` = 1106 WHERE `dataint` = 2000005106; +UPDATE `waypoint_scripts` SET `dataint` = 1107 WHERE `dataint` = 2000005107; +UPDATE `waypoint_scripts` SET `dataint` = 1112 WHERE `dataint` = 2000005108; +UPDATE `waypoint_scripts` SET `dataint` = 151 WHERE `dataint` = 2000005109; +UPDATE `waypoint_scripts` SET `dataint` = 151 WHERE `dataint` = 2000005110; +UPDATE `waypoint_scripts` SET `dataint` = 155 WHERE `dataint` = 2000005111; +UPDATE `waypoint_scripts` SET `dataint` = 154 WHERE `dataint` = 2000005112; +UPDATE `waypoint_scripts` SET `dataint` = 152 WHERE `dataint` = 2000005113; +UPDATE `waypoint_scripts` SET `dataint` = 177 WHERE `dataint` = 2000005114; +UPDATE `waypoint_scripts` SET `dataint` = 149 WHERE `dataint` = 2000005115; +UPDATE `waypoint_scripts` SET `dataint` = 173 WHERE `dataint` = 2000005116; +UPDATE `waypoint_scripts` SET `dataint` = 174 WHERE `dataint` = 2000005117; +UPDATE `waypoint_scripts` SET `dataint` = 172 WHERE `dataint` = 2000005118; +UPDATE `waypoint_scripts` SET `dataint` = 173 WHERE `dataint` = 2000005119; +UPDATE `waypoint_scripts` SET `dataint` = 172 WHERE `dataint` = 2000005120; +UPDATE `waypoint_scripts` SET `dataint` = 176 WHERE `dataint` = 2000005121; +UPDATE `waypoint_scripts` SET `dataint` = 178 WHERE `dataint` = 2000005122; +UPDATE `waypoint_scripts` SET `dataint` = 169 WHERE `dataint` = 2000005123; +UPDATE `waypoint_scripts` SET `dataint` = 147 WHERE `dataint` = 2000005124; +UPDATE `waypoint_scripts` SET `dataint` = 157 WHERE `dataint` = 2000005125; +UPDATE `waypoint_scripts` SET `dataint` = 168 WHERE `dataint` = 2000005126; +UPDATE `waypoint_scripts` SET `dataint` = 147 WHERE `dataint` = 2000005127; +UPDATE `waypoint_scripts` SET `dataint` = 157 WHERE `dataint` = 2000005128; +UPDATE `waypoint_scripts` SET `dataint` = 167 WHERE `dataint` = 2000005129; +UPDATE `waypoint_scripts` SET `dataint` = 157 WHERE `dataint` = 2000005130; +UPDATE `waypoint_scripts` SET `dataint` = 147 WHERE `dataint` = 2000005131; +UPDATE `waypoint_scripts` SET `dataint` = 2874 WHERE `dataint` = 2000005132; +UPDATE `waypoint_scripts` SET `dataint` = 10119 WHERE `dataint` = 2000005133; +UPDATE `waypoint_scripts` SET `dataint` = 1129 WHERE `dataint` = 2000005134; +UPDATE `waypoint_scripts` SET `dataint` = 1154 WHERE `dataint` = 2000005135; +UPDATE `waypoint_scripts` SET `dataint` = 1155 WHERE `dataint` = 2000005136; +UPDATE `waypoint_scripts` SET `dataint` = 1140 WHERE `dataint` = 2000005137; +UPDATE `waypoint_scripts` SET `dataint` = 1161 WHERE `dataint` = 2000005138; +UPDATE `waypoint_scripts` SET `dataint` = 1162 WHERE `dataint` = 2000005139; +UPDATE `waypoint_scripts` SET `dataint` = 1163 WHERE `dataint` = 2000005140; +UPDATE `waypoint_scripts` SET `dataint` = 1165 WHERE `dataint` = 2000005141; +UPDATE `waypoint_scripts` SET `dataint` = 1166 WHERE `dataint` = 2000005142; +UPDATE `waypoint_scripts` SET `dataint` = 13580 WHERE `dataint` = 2000005144; +UPDATE `waypoint_scripts` SET `dataint` = 13576 WHERE `dataint` = 2000005145; +UPDATE `waypoint_scripts` SET `dataint` = 15119 WHERE `dataint` = 2000005147; +UPDATE `waypoint_scripts` SET `dataint` = 209 WHERE `dataint` = 2000005148; +UPDATE `waypoint_scripts` SET `dataint` = 224 WHERE `dataint` = 2000005149; +UPDATE `waypoint_scripts` SET `dataint` = 225 WHERE `dataint` = 2000005150; +UPDATE `waypoint_scripts` SET `dataint` = 213 WHERE `dataint` = 2000005151; +UPDATE `waypoint_scripts` SET `dataint` = 225 WHERE `dataint` = 2000005152; +UPDATE `waypoint_scripts` SET `dataint` = 225 WHERE `dataint` = 2000005153; +UPDATE `waypoint_scripts` SET `dataint` = 224 WHERE `dataint` = 2000005154; +UPDATE `waypoint_scripts` SET `dataint` = 214 WHERE `dataint` = 2000005155; +UPDATE `waypoint_scripts` SET `dataint` = 217 WHERE `dataint` = 2000005156; +UPDATE `waypoint_scripts` SET `dataint` = 210 WHERE `dataint` = 2000005157; +UPDATE `waypoint_scripts` SET `dataint` = 205 WHERE `dataint` = 2000005158; +UPDATE `waypoint_scripts` SET `dataint` = 216 WHERE `dataint` = 2000005159; +UPDATE `waypoint_scripts` SET `dataint` = 212 WHERE `dataint` = 2000005160; +UPDATE `waypoint_scripts` SET `dataint` = 208 WHERE `dataint` = 2000005161; +UPDATE `waypoint_scripts` SET `dataint` = 214 WHERE `dataint` = 2000005162; +UPDATE `waypoint_scripts` SET `dataint` = 215 WHERE `dataint` = 2000005163; +UPDATE `waypoint_scripts` SET `dataint` = 206 WHERE `dataint` = 2000005164; +UPDATE `waypoint_scripts` SET `dataint` = 212 WHERE `dataint` = 2000005165; +UPDATE `waypoint_scripts` SET `dataint` = 214 WHERE `dataint` = 2000005166; +UPDATE `waypoint_scripts` SET `dataint` = 1153 WHERE `dataint` = 2000005167; +UPDATE `waypoint_scripts` SET `dataint` = 1130 WHERE `dataint` = 2000005168; +UPDATE `waypoint_scripts` SET `dataint` = 201 WHERE `dataint` = 2000005169; +UPDATE `waypoint_scripts` SET `dataint` = 218 WHERE `dataint` = 2000005170; +UPDATE `waypoint_scripts` SET `dataint` = 222 WHERE `dataint` = 2000005171; +UPDATE `waypoint_scripts` SET `dataint` = 221 WHERE `dataint` = 2000005172; +UPDATE `waypoint_scripts` SET `dataint` = 204 WHERE `dataint` = 2000005173; +UPDATE `waypoint_scripts` SET `dataint` = 222 WHERE `dataint` = 2000005174; +UPDATE `waypoint_scripts` SET `dataint` = 219 WHERE `dataint` = 2000005175; +UPDATE `waypoint_scripts` SET `dataint` = 218 WHERE `dataint` = 2000005176; +UPDATE `waypoint_scripts` SET `dataint` = 221 WHERE `dataint` = 2000005177; +UPDATE `waypoint_scripts` SET `dataint` = 219 WHERE `dataint` = 2000005178; +UPDATE `waypoint_scripts` SET `dataint` = 222 WHERE `dataint` = 2000005179; +UPDATE `waypoint_scripts` SET `dataint` = 587 WHERE `dataint` = 2000005180; +UPDATE `waypoint_scripts` SET `dataint` = 589 WHERE `dataint` = 2000005181; +UPDATE `waypoint_scripts` SET `dataint` = 590 WHERE `dataint` = 2000005182; +UPDATE `waypoint_scripts` SET `dataint` = 588 WHERE `dataint` = 2000005183; +UPDATE `waypoint_scripts` SET `dataint` = 1091 WHERE `dataint` = 2000005184; +UPDATE `waypoint_scripts` SET `dataint` = 24425 WHERE `dataint` = 2000005200; +UPDATE `waypoint_scripts` SET `dataint` = 24425 WHERE `dataint` = 2000005201; +UPDATE `waypoint_scripts` SET `dataint` = 22216 WHERE `dataint` = 2000005202; +UPDATE `waypoint_scripts` SET `dataint` = 22211 WHERE `dataint` = 2000005203; +UPDATE `waypoint_scripts` SET `dataint` = 22206 WHERE `dataint` = 2000005204; +UPDATE `waypoint_scripts` SET `dataint` = 25086 WHERE `dataint` = 2000005205; +UPDATE `waypoint_scripts` SET `dataint` = 25073 WHERE `dataint` = 2000005206; +UPDATE `waypoint_scripts` SET `dataint` = 25074 WHERE `dataint` = 2000005207; +UPDATE `waypoint_scripts` SET `dataint` = 25075 WHERE `dataint` = 2000005208; +UPDATE `waypoint_scripts` SET `dataint` = 25076 WHERE `dataint` = 2000005209; +UPDATE `waypoint_scripts` SET `dataint` = 23842 WHERE `dataint` = 2000005210; +UPDATE `waypoint_scripts` SET `dataint` = 328 WHERE `dataint` = 2000005400; +UPDATE `waypoint_scripts` SET `dataint` = 327 WHERE `dataint` = 2000005401; +UPDATE `waypoint_scripts` SET `dataint` = 5956 WHERE `dataint` = 2000005402; +UPDATE `waypoint_scripts` SET `dataint` = 5957 WHERE `dataint` = 2000005403; +UPDATE `waypoint_scripts` SET `dataint` = 5960 WHERE `dataint` = 2000005404; +UPDATE `waypoint_scripts` SET `dataint` = 5959 WHERE `dataint` = 2000005405; +UPDATE `waypoint_scripts` SET `dataint` = 24439 WHERE `dataint` = 2000005406; +UPDATE `waypoint_scripts` SET `dataint` = 24443 WHERE `dataint` = 2000005407; +UPDATE `waypoint_scripts` SET `dataint` = 36 WHERE `dataint` = 2000005408; diff --git a/sql/updates/world/2014_09_13_00_world_misc.sql b/sql/updates/world/2014_09_13_00_world_misc.sql new file mode 100644 index 00000000000..e2c04ef287d --- /dev/null +++ b/sql/updates/world/2014_09_13_00_world_misc.sql @@ -0,0 +1,19 @@ +DELETE FROM `spell_linked_spell` WHERE `spell_trigger`IN(31606,47190); +INSERT INTO `spell_linked_spell` (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES +(31606, 31746, 0, 'Stormcrow Amulet triggers Stormcrow Shape'), +(47190, 47189, 1, 'Toaluus Spiritual Incense triggers Spiritual Insight'); + +UPDATE `creature_template` SET `AIName`='SmartAI', `ScriptName`='' WHERE `entry` IN(26595,17841); + +DELETE FROM `smart_scripts` WHERE `entryorguid`IN(26595,17841) 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 +(26595, 0, 0, 0, 10, 0, 100, 0, 1, 30, 10, 10, 28, 47189, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Toaluu the Mystic - Out of Combat - Remove Aura Spiritual Insight'), +(17841, 0, 0, 0, 10, 0, 100, 0, 1, 30, 10, 10, 28, 31746, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Ysiel Windsinger - Out of Combat - Remove Aura Stormcrow Shape'); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceEntry` IN(26595,17841); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(22, 1, 26595, 0, 0, 28, 0, 12028, 0, 0, 0, 0, 0, '', 'Only run SAI if Player Has Spiritual Insight Complete in Log'), +(22, 1, 26595, 0, 0, 1, 0, 47189, 0, 0, 0, 0, 0, '', 'Only run SAI if Player Has Aura Spiritual Insight'), +(22, 1, 17841, 0, 0, 28, 0, 9718, 0, 0, 0, 0, 0, '', 'Only run SAI if Player Has As The Crow Flies Complete in Log'), +(22, 1, 17841, 0, 0, 1, 0, 31746, 0, 0, 0, 0, 0, '', 'Only run SAI if Player Has Aura Stormcrow Shape'); diff --git a/sql/updates/world/2014_09_13_01_world_spell_script_names.sql b/sql/updates/world/2014_09_13_01_world_spell_script_names.sql new file mode 100644 index 00000000000..aaa12cd0938 --- /dev/null +++ b/sql/updates/world/2014_09_13_01_world_spell_script_names.sql @@ -0,0 +1,3 @@ +DELETE FROM `spell_script_names` WHERE `spell_id` = 48292;
+INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
+(48292, 'spell_gen_50pct_count_pct_from_max_hp');
diff --git a/sql/updates/world/2014_09_13_02_world_trinity_string.sql b/sql/updates/world/2014_09_13_02_world_trinity_string.sql new file mode 100644 index 00000000000..ab9ed7cf03b --- /dev/null +++ b/sql/updates/world/2014_09_13_02_world_trinity_string.sql @@ -0,0 +1 @@ +DELETE FROM `trinity_string` WHERE `entry` IN (28634,28635); diff --git a/sql/updates/world/2014_09_13_03_world_spelldifficulty_dbc.sql b/sql/updates/world/2014_09_13_03_world_spelldifficulty_dbc.sql new file mode 100644 index 00000000000..4225bd420e2 --- /dev/null +++ b/sql/updates/world/2014_09_13_03_world_spelldifficulty_dbc.sql @@ -0,0 +1,3 @@ +DELETE FROM `spelldifficulty_dbc` WHERE `id`=52480; +INSERT INTO `spelldifficulty_dbc` (`id`, `spellid0`, `spellid1`) VALUES +(52480, 52480, 58825); diff --git a/sql/updates/world/2014_09_13_04_world_misc.sql b/sql/updates/world/2014_09_13_04_world_misc.sql new file mode 100644 index 00000000000..1d3290071c8 --- /dev/null +++ b/sql/updates/world/2014_09_13_04_world_misc.sql @@ -0,0 +1,26 @@ +SET @CGUID := 52390; + +UPDATE `smart_scripts` SET `event_type`=7 WHERE `entryorguid`=28083 AND `source_type`=0 AND `id`=17 AND `link`=18; +DELETE FROM `smart_scripts` WHERE `entryorguid`=28083 AND `source_type`=0 AND `id`=16 AND `link`=17; +DELETE FROM `smart_scripts` WHERE `entryorguid`=28083 AND `source_type`=0 AND `id`=8 AND `link`=0; +UPDATE `smart_scripts` SET `event_type`=1, `event_param3`=60000, `event_param4`=90000 WHERE `entryorguid`=28083 AND `source_type`=0 AND `id`=1 AND `link`=0; +DELETE FROM `smart_scripts` WHERE `entryorguid`=28083 AND `source_type`=0 AND `id`=0 AND `link`=1; +UPDATE `smart_scripts` SET `event_type`=4 WHERE `entryorguid`=28083 AND `source_type`=0 AND `id`=3 AND `link`=4; +DELETE FROM `smart_scripts` WHERE `entryorguid`=28083 AND `source_type`=0 AND `id`=2; +UPDATE `smart_scripts` SET `event_flags`=0 WHERE `entryorguid`=11832 AND `source_type`=0 AND `id`=4 AND `link`=0; +UPDATE `smart_scripts` SET `event_flags`=0 WHERE `entryorguid`=1183201 AND `source_type`=9 AND `id`=0 AND `link`=0; + +DELETE FROM `creature_template_addon` WHERE `entry` IN(19698,23383,19671); +INSERT INTO `creature_template_addon` (`entry`, `mount`, `bytes1`, `bytes2`, `auras`) VALUES +(19698, 0, 0x10008, 0x1, ''), -- 19698 +(23383, 0, 0x0, 0x1, ''), -- 23383 +(19671, 0, 0x0, 0x101, ''); -- 19671 + +DELETE FROM `creature` WHERE `id` IN(19698,23383); +INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `MovementType`) VALUES +(@CGUID+0, 19698, 530, 1, 1, -3345.276, 5189.063, -100.9659, 5.77704, 120, 0, 0), -- 19698 (Area: 3519) +(@CGUID+1, 23383, 530, 1, 1, -3664.54, 3389.79, 312.952, 2.356194, 120, 0, 0); -- 23383 (Area: 3519) + +DELETE FROM `event_scripts` WHERE `id`=17209 AND `command`=8; +INSERT INTO `event_scripts` (`id`, `delay`, `command`, `datalong`, `datalong2`, `dataint`, `x`, `y`, `z`, `o`) VALUES +(17209, 1, 8, 27995, 1, 0, 0, 0, 0, 0); diff --git a/sql/updates/world/2014_09_13_05_world_misc_335.sql b/sql/updates/world/2014_09_13_05_world_misc_335.sql new file mode 100644 index 00000000000..eb701a48cc4 --- /dev/null +++ b/sql/updates/world/2014_09_13_05_world_misc_335.sql @@ -0,0 +1,8 @@ +UPDATE `gameobject_template` SET `AIName`='SmartGameObjectAI',`ScriptName`='' WHERE `entry`IN(183877); +DELETE FROM `smart_scripts` WHERE `entryorguid`IN(183877) AND `source_type`=1; + +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 +(183877, 1, 0, 0, 62, 0, 100, 1, 8023, 0, 0, 0, 12, 19671, 8, 60000, 0, 0, 0, 8, 0, 0, 0, -351.345, -69.7118, -0.8754317, 4.34587, 'Ethereal Transporter Control Panel - On Gossip Option 0 Selected - Summon Cryo-Engineer Sha heen'), +(183877, 1, 1, 0, 62, 0, 100, 0, 8023, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Ethereal Transporter Control Panel - On Gossip Option 0 Selected - Close Gossip'); + +UPDATE `gossip_menu_option` SET `action_menu_id`=0 WHERE `menu_id`=8023 AND `id`=0; diff --git a/sql/updates/world/2014_09_14_00_world_waypoint_scripts.sql b/sql/updates/world/2014_09_14_00_world_waypoint_scripts.sql new file mode 100644 index 00000000000..ebb309aa9d6 --- /dev/null +++ b/sql/updates/world/2014_09_14_00_world_waypoint_scripts.sql @@ -0,0 +1 @@ +UPDATE `waypoint_scripts` SET `dataint`=13572 WHERE `guid`=346; diff --git a/sql/updates/world/2014_09_14_01_world_misc.sql b/sql/updates/world/2014_09_14_01_world_misc.sql new file mode 100644 index 00000000000..49fa75e37de --- /dev/null +++ b/sql/updates/world/2014_09_14_01_world_misc.sql @@ -0,0 +1,50 @@ +SET @CGUID := 74512; + +UPDATE `creature_template` SET `gossip_menu_id`=10200 WHERE `entry`=32239; +UPDATE`creature_template` SET `gossip_menu_id`=9928, `minlevel`=82, `maxlevel`=82, `npcflag`=1, `speed_walk`=4.8, `speed_run`=3.142857, `unit_flags2`=2099200 WHERE `entry`=30399; +UPDATE `creature_template` SET `faction`=14, `speed_walk`=1.6, `speed_run`=1.857143, `unit_flags`=320, `unit_flags2`=2099200 WHERE `entry`=30396; +UPDATE `creature_template` SET `speed_walk`=3.2, `speed_run`=1.428571, `unit_flags`=33088, `unit_flags2`=2099200, `HoverHeight`=2.1 WHERE `entry`=30420; +UPDATE `creature_template` SET `faction`=2102, `unit_flags`=320 WHERE `entry`=30429; + + +DELETE FROM `gossip_menu` WHERE `entry` IN(9928,10200); +INSERT INTO `gossip_menu` (`entry`, `text_id`) VALUES +(10200, 14160), -- 32239 +(9928, 13800); -- 30399 + +DELETE FROM `gossip_menu_option` WHERE `menu_id` IN(9928,10200); +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`, `option_text`, `OptionBroadcastTextID`, `option_id`, `npc_option_npcflag`, `action_menu_id`, `action_poi_id`, `box_coded`, `box_money`, `box_text`, `BoxBroadcastTextID`) VALUES +(10200, 0, 0, 'I\'m ready, Highlord.', 32933, 1, 1, 0, 0, 0, 0, '', 0), +(9928, 0, 0, 'I\'m with you, Thorim.', 31225, 1, 1, 0, 0, 0, 0, '', 0); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup` IN(9928,10200); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(15, 10200, 0, 0, 0, 9, 0, 13364, 0, 0, 0, 0, 0, '', 'Highlord Tirion Fordring - Show Gossip if Tirions Gambit Taken'), +(15, 10200, 0, 0, 1, 9, 0, 13403, 0, 0, 0, 0, 0, '', 'Highlord Tirion Fordring - Show Gossip if Tirions Gambit Taken'), +(15, 10200, 0, 0, 0, 1, 0, 61131, 0, 0, 0, 0, 0, '', 'Highlord Tirion Fordring - Show Gossip if player has aura Cultist Hood'), +(15, 10200, 0, 0, 1, 1, 0, 61131, 0, 0, 0, 0, 0, '', 'Highlord Tirion Fordring - Show Gossip if player has aura Cultist Hood'), +(15, 9928, 0, 0, 0, 9, 0, 13047, 0, 0, 0, 0, 0, '', 'Thorim - SHow Gossip if the reckoning taken'); + +DELETE FROM `creature_template_addon` WHERE `entry` IN(32239,32241,30399,30396,30420); +INSERT INTO `creature_template_addon` (`entry`, `mount`, `bytes1`, `bytes2`, `auras`) VALUES +(32239, 0, 0x10000, 0x101, '49414'), -- 32239 - 49414 +(32241, 0, 0x10000, 0x1, '49414'), -- 32241 - 49414 +(30399, 0, 0x10000, 0x1, '54503'), -- 30399 - 54503 +(30396, 0, 0x1, 0x1, ''), -- 30396 +(30420, 0, 0x3010000, 0x1, '54503'); -- 30420 - 54503 + +DELETE FROM `creature` WHERE `id` IN(32239,32241,30399,30420); +INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `MovementType`) VALUES +(@CGUID+0, 32239, 571, 1, 1, 6240.595, 2658.845, 570.3328, 5.864306, 120, 0, 0), -- 32239 (Area: 210) +(@CGUID+1, 32241, 571, 1, 1, 6243.453, 2667.72, 570.3328, 5.410521, 120, 0, 0), -- 32241 (Area: 210) +(@CGUID+2, 32241, 571, 1, 1, 6250.451, 2656.436, 570.3328, 2.199115, 120, 0, 0), -- 32241 (Area: 210) +(@CGUID+3, 32241, 571, 1, 1, 6252.46, 2665.359, 570.3328, 3.979351, 120, 0, 0), -- 32241 (Area: 210) +(@CGUID+4, 30399, 571, 1, 1, 8703.806, -714.0443, 934.9764, 2.321288, 120, 0, 0), -- 30399 (Area: 67) +(@CGUID+5, 30420, 571, 1, 1, 8711.395, -754.7941, 955.1224, 2.338741, 120, 0, 0); -- 30420 (Area: 67) + +DELETE FROM `spell_area` WHERE `spell` IN(49416,54504) AND `area` IN(4543,4445,4521); +INSERT INTO `spell_area` (`spell`, `area`, `quest_start`, `quest_end`, `aura_spell`, `racemask`, `gender`, `autocast`, `quest_start_status`, `quest_end_status`) VALUES +(54504, 4543, 13047, 13047, 0, 0, 2, 1, 74, 11), +(54504, 4445, 13047, 13047, 0, 0, 2, 1, 74, 11), +(49416, 4521, 13364, 13364, 0, 0, 2, 1, 74, 11), +(49416, 4521, 13403, 13403, 0, 0, 2, 1, 74, 11); diff --git a/sql/updates/world/2014_09_14_02_world_spellscriptnames.sql b/sql/updates/world/2014_09_14_02_world_spellscriptnames.sql new file mode 100644 index 00000000000..96ebc93961f --- /dev/null +++ b/sql/updates/world/2014_09_14_02_world_spellscriptnames.sql @@ -0,0 +1 @@ +UPDATE `spell_script_names` SET `ScriptName`= 'spell_gen_stand' WHERE `spell_id`=37752; diff --git a/sql/updates/world/2014_09_14_03_world_toc5.sql b/sql/updates/world/2014_09_14_03_world_toc5.sql new file mode 100644 index 00000000000..3b2464e7f5f --- /dev/null +++ b/sql/updates/world/2014_09_14_03_world_toc5.sql @@ -0,0 +1,304 @@ +SET @CGUID := 143275; +SET @OGUID := 77245; + +DELETE FROM `creature` WHERE `map`=650; +INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `MovementType`) VALUES +(@CGUID+ 0, 35644, 650, 3, 1, 702.967, 587.6493, 412.4754, 0.6108652, 7200, 0, 0), -- Argent Warhorse (Area: Trial of the Champion) (Auras: 67870 - Trample) +(@CGUID+ 1, 35644, 650, 3, 1, 774.8976, 573.7361, 412.4752, 2.146755, 7200, 0, 0), -- Argent Warhorse (Area: Trial of the Champion) (Auras: 67870 - Trample) +(@CGUID+ 2, 35644, 650, 3, 1, 787.4393, 584.9688, 412.4759, 2.478368, 7200, 0, 0), -- Argent Warhorse (Area: Trial of the Champion) (Auras: 67870 - Trample) +(@CGUID+ 3, 35644, 650, 3, 1, 712.5938, 576.2604, 412.4758, 0.8901179, 7200, 0, 0), -- Argent Warhorse (Area: Trial of the Champion) (Auras: 67870 - Trample) +(@CGUID+ 4, 35644, 650, 3, 1, 720.5695, 571.2847, 412.4749, 1.064651, 7200, 0, 0), -- Argent Warhorse (Area: Trial of the Champion) (Auras: 67870 - Trample) +(@CGUID+ 5, 36558, 650, 3, 1, 790.1771, 589.059, 412.4753, 2.565634, 7200, 0, 0), -- Argent Battleworg (Area: Trial of the Champion) (Auras: 67865 - Trample) +(@CGUID+ 6, 36558, 650, 3, 1, 716.6649, 573.4948, 412.4753, 0.9773844, 7200, 0, 0), -- Argent Battleworg (Area: Trial of the Champion) (Auras: 67865 - Trample) +(@CGUID+ 7, 36558, 650, 3, 1, 770.4861, 571.5521, 412.4746, 2.059489, 7200, 0, 0), -- Argent Battleworg (Area: Trial of the Champion) (Auras: 67865 - Trample) +(@CGUID+ 8, 36558, 650, 3, 1, 700.5313, 591.9271, 412.4749, 0.5235988, 7200, 0, 0), -- Argent Battleworg (Area: Trial of the Champion) (Auras: 67865 - Trample) +(@CGUID+ 9, 36558, 650, 3, 1, 778.7413, 576.0486, 412.4756, 2.234021, 7200, 0, 0), -- Argent Battleworg (Area: Trial of the Champion) (Auras: 67865 - Trample) +(@CGUID+ 10, 36558, 650, 3, 1, 705.4965, 583.9445, 412.4759, 0.6981317, 7200, 0, 0), -- Argent Battleworg (Area: Trial of the Champion) (Auras: 67865 - Trample) +(@CGUID+ 11, 35644, 650, 3, 1, 699.9427, 643.3698, 412.4744, 5.77704, 7200, 0, 0), -- Argent Warhorse (Area: Trial of the Champion) (Auras: 67870 - Trample) +(@CGUID+ 12, 35644, 650, 3, 1, 790.4896, 646.533, 412.4745, 3.717551, 7200, 0, 0), -- Argent Warhorse (Area: Trial of the Champion) (Auras: 67870 - Trample) +(@CGUID+ 13, 35644, 650, 3, 1, 777.5643, 660.3004, 412.4669, 4.34587, 7200, 0, 0), -- Argent Warhorse (Area: Trial of the Champion) (Auras: 67870 - Trample) +(@CGUID+ 14, 35644, 650, 3, 1, 704.9427, 651.3299, 412.4751, 5.602507, 7200, 0, 0), -- Argent Warhorse (Area: Trial of the Champion) (Auras: 67870 - Trample) +(@CGUID+ 15, 35644, 650, 3, 1, 793.0087, 592.6667, 412.4749, 2.6529, 7200, 0, 0), -- Argent Warhorse (Area: Trial of the Champion) (Auras: 67870 - Trample) +(@CGUID+ 16, 35644, 650, 3, 1, 768.2552, 661.6059, 412.4703, 4.555309, 7200, 0, 0), -- Argent Warhorse (Area: Trial of the Champion) (Auras: 67870 - Trample) +(@CGUID+ 17, 35644, 650, 3, 1, 722.3629, 660.7448, 412.4681, 4.834562, 7200, 0, 0), -- Argent Warhorse (Area: Trial of the Champion) (Auras: 67870 - Trample) +(@CGUID+ 18, 35016, 650, 3, 1, 748.8837, 616.4618, 411.1738, 0, 7200, 0, 0), -- [ph] Argent Raid Spectator - Generic Bunny (Area: Trial of the Champion) +(@CGUID+ 19, 35016, 650, 3, 1, 782.1198, 583.2101, 412.4743, 0, 7200, 0, 0), -- [ph] Argent Raid Spectator - Generic Bunny (Area: Trial of the Champion) +(@CGUID+ 20, 35016, 650, 3, 1, 746.5243, 615.868, 411.1725, 0, 7200, 0, 0), -- [ph] Argent Raid Spectator - Generic Bunny (Area: Trial of the Champion) +(@CGUID+ 21, 35016, 650, 3, 1, 747.375, 619.1094, 411.9709, 0, 7200, 0, 0), -- [ph] Argent Raid Spectator - Generic Bunny (Area: Trial of the Champion) +(@CGUID+ 22, 35016, 650, 3, 1, 746.9774, 618.7934, 411.9709, 0, 7200, 0, 0), -- [ph] Argent Raid Spectator - Generic Bunny (Area: Trial of the Champion) +(@CGUID+ 23, 35016, 650, 3, 1, 697.2847, 618.2535, 412.4758, 0, 7200, 0, 0), -- [ph] Argent Raid Spectator - Generic Bunny (Area: Trial of the Champion) +(@CGUID+ 24, 35016, 650, 3, 1, 792.2587, 598.2239, 412.4696, 0, 7200, 0, 0), -- [ph] Argent Raid Spectator - Generic Bunny (Area: Trial of the Champion) +(@CGUID+ 25, 35016, 650, 3, 1, 703.8837, 596.6007, 412.4742, 0, 7200, 0, 0), -- [ph] Argent Raid Spectator - Generic Bunny (Area: Trial of the Champion) +(@CGUID+ 26, 35016, 650, 3, 1, 714.4861, 581.7222, 412.476, 0, 7200, 0, 0), -- [ph] Argent Raid Spectator - Generic Bunny (Area: Trial of the Champion) +(@CGUID+ 27, 22515, 650, 3, 1, 746.9045, 618.2813, 411.1724, 0, 7200, 0, 0), -- World Trigger (Area: Trial of the Champion) +(@CGUID+ 28, 35004, 650, 3, 1, 748.309, 619.4879, 411.1724, 4.712389, 7200, 0, 0), -- Jaeren Sunsworn (Area: Trial of the Champion) +(@CGUID+ 29, 36558, 650, 3, 1, 717.4427, 660.6458, 412.4669, 4.921828, 7200, 0, 0), -- Argent Battleworg (Area: Trial of the Champion) (Auras: 67865 - Trample) +(@CGUID+ 30, 36558, 650, 3, 1, 702.1649, 647.2674, 412.4749, 5.689773, 7200, 0, 0), -- Argent Battleworg (Area: Trial of the Champion) (Auras: 67865 - Trample) +(@CGUID+ 31, 36558, 650, 3, 1, 726.8264, 661.2014, 412.4716, 4.660029, 7200, 0, 0), -- Argent Battleworg (Area: Trial of the Champion) (Auras: 67865 - Trample) +(@CGUID+ 32, 34977, 650, 3, 1, 726.3802, 557.1511, 436.9785, 1.256637, 7200, 0, 0), -- Argent Crusade Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura) +(@CGUID+ 33, 35016, 650, 3, 1, 712.4132, 653.9305, 412.4742, 0, 7200, 0, 0), -- [ph] Argent Raid Spectator - Generic Bunny (Area: Trial of the Champion) +(@CGUID+ 34, 34970, 650, 3, 1, 757.9983, 559.7309, 435.5007, 1.466077, 7200, 0, 0), -- Argent Crusade Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura) +(@CGUID+ 35, 34979, 650, 3, 1, 712.8733, 563.1719, 436.9667, 1.029744, 7200, 0, 0), -- Argent Crusade Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66361 - Argent Crusade Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+ 36, 34979, 650, 3, 1, 709.5764, 570.1059, 435.5041, 0.9424778, 7200, 0, 0), -- Argent Crusade Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura) +(@CGUID+ 37, 35016, 650, 3, 1, 702.2743, 638.7604, 412.4703, 0, 7200, 0, 0), -- [ph] Argent Raid Spectator - Generic Bunny (Area: Trial of the Champion) +(@CGUID+ 38, 35016, 650, 3, 1, 795.5486, 618.25, 412.4769, 0, 7200, 0, 0), -- [ph] Argent Raid Spectator - Generic Bunny (Area: Trial of the Champion) +(@CGUID+ 39, 35016, 650, 3, 1, 780.4358, 654.4063, 412.4742, 0, 7200, 0, 0), -- [ph] Argent Raid Spectator - Generic Bunny (Area: Trial of the Champion) +(@CGUID+ 40, 34975, 650, 3, 1, 767.5816, 560.5399, 435.5033, 1.832596, 7200, 0, 0), -- Argent Crusade Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66361 - Argent Crusade Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+ 41, 34996, 650, 3, 1, 746.5833, 559.0191, 435.4921, 1.570796, 7200, 0, 0), -- Highlord Tirion Fordring (Area: Trial of the Champion) +(@CGUID+ 42, 35016, 650, 3, 1, 791.9722, 638.0104, 412.4699, 0, 7200, 0, 0), -- [ph] Argent Raid Spectator - Generic Bunny (Area: Trial of the Champion) +(@CGUID+ 43, 34859, 650, 3, 1, 688.7309, 604.6893, 435.5013, 0.2094395, 7200, 0, 0), -- Orcish Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura) +(@CGUID+ 44, 34887, 650, 3, 1, 797.1476, 617.7083, 435.4885, 3.106686, 7200, 0, 0), -- [ph] Argent Raid Spectator - FX - Alliance (Area: Trial of the Champion) +(@CGUID+ 45, 34903, 650, 3, 1, 697.1163, 583.0521, 435.5041, 0.6283185, 7200, 0, 0), -- [ph] Argent Raid Spectator - FX - Tauren (Area: Trial of the Champion) +(@CGUID+ 46, 34857, 650, 3, 1, 692.8542, 590.632, 435.5041, 0.4712389, 7200, 0, 0), -- Troll Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura) +(@CGUID+ 47, 34858, 650, 3, 1, 697.2413, 583.8577, 435.5041, 0.6283185, 7200, 0, 0), -- Tauren Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura) +(@CGUID+ 48, 34857, 650, 3, 1, 689.6233, 598.0452, 435.5031, 0.3316126, 7200, 0, 0), -- Troll Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66371 - Sen'jin Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+ 49, 34966, 650, 3, 1, 718.9167, 564.0781, 435.5041, 1.117011, 7200, 0, 0), -- Argent Crusade Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura) +(@CGUID+ 50, 34975, 650, 3, 1, 775.7483, 564.5851, 435.5041, 2.164208, 7200, 0, 0), -- Argent Crusade Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66361 - Argent Crusade Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+ 51, 34966, 650, 3, 1, 725.6614, 560.8351, 435.5034, 1.239184, 7200, 0, 0), -- Argent Crusade Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura) +(@CGUID+ 52, 34977, 650, 3, 1, 734.4114, 560.158, 435.501, 1.37881, 7200, 0, 0), -- Argent Crusade Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66361 - Argent Crusade Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+ 53, 36558, 650, 3, 1, 788.0156, 650.7882, 412.4749, 3.804818, 7200, 0, 0), -- Argent Battleworg (Area: Trial of the Champion) (Auras: 67865 - Trample) +(@CGUID+ 54, 36558, 650, 3, 1, 773.0972, 660.7327, 412.4673, 4.45059, 7200, 0, 0), -- Argent Battleworg (Area: Trial of the Champion) (Auras: 67865 - Trample) +(@CGUID+ 55, 36558, 650, 3, 1, 793.0521, 642.8507, 412.4742, 3.630285, 7200, 0, 0), -- Argent Battleworg (Area: Trial of the Champion) (Auras: 67865 - Trample) +(@CGUID+ 56, 34994, 650, 3, 1, 686.6632, 614.5608, 435.4849, 6.230825, 7200, 0, 0), -- Thrall (Area: Trial of the Champion) +(@CGUID+ 57, 34977, 650, 3, 1, 730.9983, 552.7188, 438.8121, 1.343904, 7200, 0, 0), -- Argent Crusade Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura) +(@CGUID+ 58, 34974, 650, 3, 1, 787.5018, 568.9618, 436.9922, 2.286381, 7200, 0, 0), -- Argent Crusade Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66361 - Argent Crusade Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+ 59, 34974, 650, 3, 1, 781.3715, 567.4167, 435.5041, 2.408554, 7200, 0, 0), -- Argent Crusade Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66361 - Argent Crusade Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+ 60, 34995, 650, 3, 1, 686.9358, 622.0295, 435.4867, 6.230825, 7200, 0, 0), -- Garrosh Hellscream (Area: Trial of the Champion) +(@CGUID+ 61, 34856, 650, 3, 1, 801.5677, 591.3837, 435.5041, 2.670354, 7200, 0, 0), -- Dwarven Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66363 - Ironforge Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+ 62, 34883, 650, 3, 1, 687.8299, 617.6493, 435.4933, 1.58825, 7200, 0, 0), -- [ph] Argent Raid Spectator - FX - Horde (Area: Trial of the Champion) +(@CGUID+ 63, 34856, 650, 3, 1, 804.0261, 598.4358, 435.503, 2.86234, 7200, 0, 0), -- Dwarven Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura) +(@CGUID+ 64, 34902, 650, 3, 1, 689.1962, 597, 435.5034, 0.3490658, 7200, 0, 0), -- [ph] Argent Raid Spectator - FX - Troll (Area: Trial of the Champion) +(@CGUID+ 65, 34901, 650, 3, 1, 687.1597, 618.132, 435.4888, 0, 7200, 0, 0), -- [ph] Argent Raid Spectator - FX - Orc (Area: Trial of the Champion) +(@CGUID+ 66, 34859, 650, 3, 1, 687.9653, 629.6111, 435.4982, 6.195919, 7200, 0, 0), -- Orcish Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66369 - Orgrimmar Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+ 67, 34906, 650, 3, 1, 803.6215, 594.6302, 435.5041, 0, 7200, 0, 0), -- [ph] Argent Raid Spectator - FX - Dwarf (Area: Trial of the Champion) +(@CGUID+ 68, 34859, 650, 3, 1, 685.1129, 600.4305, 436.9705, 0.2792527, 7200, 0, 0), -- Orcish Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura) +(@CGUID+ 69, 34868, 650, 3, 1, 798.6945, 587.3577, 435.5041, 2.687807, 7200, 0, 0), -- Draenei Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura) +(@CGUID+ 70, 34870, 650, 3, 1, 804.4705, 604.8055, 435.5013, 2.844887, 7200, 0, 0), -- Human Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66367 - Stormwind Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+ 71, 34858, 650, 3, 1, 696.2604, 577.507, 436.9658, 0.6981317, 7200, 0, 0), -- Tauren Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66370 - Thunder Bluff Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+ 72, 34868, 650, 3, 1, 793.882, 580.6788, 435.5041, 2.391101, 7200, 0, 0), -- Draenei Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66362 - Exodar Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+ 73, 34858, 650, 3, 1, 689.6354, 582.8229, 438.8188, 0.5585054, 7200, 0, 0), -- Tauren Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura) +(@CGUID+ 74, 34970, 650, 3, 1, 764.0799, 553.434, 438.8278, 1.867502, 7200, 0, 0), -- Argent Crusade Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66361 - Argent Crusade Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+ 75, 34966, 650, 3, 1, 718.4045, 555.9202, 438.8031, 1.151917, 7200, 0, 0), -- Argent Crusade Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66361 - Argent Crusade Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+ 76, 34979, 650, 3, 1, 714.3403, 553.7083, 440.2231, 1.117011, 7200, 0, 0), -- Argent Crusade Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura) +(@CGUID+ 77, 34970, 650, 3, 1, 761.217, 549.1424, 440.2457, 1.58825, 7200, 0, 0), -- Argent Crusade Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66361 - Argent Crusade Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+ 78, 34977, 650, 3, 1, 733.809, 545.2153, 442.0747, 1.413717, 7200, 0, 0), -- Argent Crusade Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66361 - Argent Crusade Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+ 79, 34990, 650, 3, 1, 806.3246, 617.9948, 435.4912, 3.124139, 7200, 0, 0), -- King Varian Wrynn (Area: Trial of the Champion) +(@CGUID+ 80, 34992, 650, 3, 1, 806.2239, 614.9393, 435.4874, 3.001966, 7200, 0, 0), -- Lady Jaina Proudmoore (Area: Trial of the Champion) +(@CGUID+ 81, 34975, 650, 3, 1, 773.5018, 555.5156, 438.8247, 1.954769, 7200, 0, 0), -- Argent Crusade Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66361 - Argent Crusade Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+ 82, 34860, 650, 3, 1, 699.0052, 654.8941, 435.5041, 5.532694, 7200, 0, 0), -- Forsaken Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura) +(@CGUID+ 83, 34870, 650, 3, 1, 805.0313, 629.7674, 435.5009, 3.385939, 7200, 0, 0), -- Human Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66367 - Stormwind Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+ 84, 34905, 650, 3, 1, 696.3594, 653.5868, 435.5041, 5.602507, 7200, 0, 0), -- [ph] Argent Raid Spectator - FX - Undead (Area: Trial of the Champion) +(@CGUID+ 85, 34904, 650, 3, 1, 690.5955, 642, 435.5041, 5.88176, 7200, 0, 0), -- [ph] Argent Raid Spectator - FX - Blood Elf (Area: Trial of the Champion) +(@CGUID+ 86, 34869, 650, 3, 1, 806.5208, 644.8802, 436.9614, 3.543018, 7200, 0, 0), -- Gnomish Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura) +(@CGUID+ 87, 34909, 650, 3, 1, 800.1441, 651.7257, 437.002, 3.630285, 7200, 0, 0), -- [ph] Argent Raid Spectator - FX - Night Elf (Area: Trial of the Champion) +(@CGUID+ 88, 34908, 650, 3, 1, 799.4948, 582.9219, 436.9941, 0, 7200, 0, 0), -- [ph] Argent Raid Spectator - FX - Draenei (Area: Trial of the Champion) +(@CGUID+ 89, 34900, 650, 3, 1, 813.5729, 618.1268, 438.8528, 3.159046, 7200, 0, 0), -- [ph] Argent Raid Spectator - FX - Human (Area: Trial of the Champion) +(@CGUID+ 90, 34910, 650, 3, 1, 805.7778, 640.0972, 435.6143, 0, 7200, 0, 0), -- [ph] Argent Raid Spectator - FX - Gnome (Area: Trial of the Champion) +(@CGUID+ 91, 34868, 650, 3, 1, 799.1945, 575.25, 438.801, 2.373648, 7200, 0, 0), -- Draenei Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66362 - Exodar Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+ 92, 34861, 650, 3, 1, 686.3924, 643.3507, 436.9734, 5.88176, 7200, 0, 0), -- Blood Elf Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura) +(@CGUID+ 93, 34859, 650, 3, 1, 680.5989, 603.9861, 438.7939, 0.1919862, 7200, 0, 0), -- Orcish Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura) +(@CGUID+ 94, 34860, 650, 3, 1, 693.6354, 654.8924, 436.9629, 5.602507, 7200, 0, 0), -- Forsaken Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura) +(@CGUID+ 95, 34856, 650, 3, 1, 808.9236, 586.0347, 440.2946, 2.635447, 7200, 0, 0), -- Dwarven Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura) +(@CGUID+ 96, 34856, 650, 3, 1, 814.3316, 597.7813, 440.2612, 2.897247, 7200, 0, 0), -- Dwarven Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66363 - Ironforge Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+ 97, 34857, 650, 3, 1, 684.9636, 591.0174, 438.8482, 0.418879, 7200, 0, 0), -- Troll Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66371 - Sen'jin Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+ 98, 34870, 650, 3, 1, 809.1111, 633.1337, 436.9589, 3.420845, 7200, 0, 0), -- Human Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66367 - Stormwind Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+ 99, 34856, 650, 3, 1, 807.6233, 595.1649, 436.9687, 2.80998, 7200, 0, 0), -- Dwarven Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66363 - Ironforge Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+100, 34868, 650, 3, 1, 800.2813, 582.7483, 436.9739, 2.583087, 7200, 0, 0), -- Draenei Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66362 - Exodar Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+101, 34856, 650, 3, 1, 813.6354, 587.592, 442.0691, 2.70526, 7200, 0, 0), -- Dwarven Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66363 - Ironforge Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+102, 34860, 650, 3, 1, 686.8663, 650.8368, 438.7787, 5.759586, 7200, 0, 0), -- Forsaken Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66365 - Undercity Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+103, 34871, 650, 3, 1, 799.3472, 648.0243, 435.5041, 3.560472, 7200, 0, 0), -- Night Elf Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura) +(@CGUID+104, 34857, 650, 3, 1, 675.2813, 589.9879, 442.0812, 0.3839724, 7200, 0, 0), -- Troll Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura) +(@CGUID+105, 34870, 650, 3, 1, 808.1927, 601.9358, 436.9788, 2.80998, 7200, 0, 0), -- Human Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66367 - Stormwind Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+106, 34871, 650, 3, 1, 805.4722, 648.7205, 436.9274, 3.508112, 7200, 0, 0), -- Night Elf Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura) +(@CGUID+107, 34868, 650, 3, 1, 806.4879, 574.6146, 442.076, 2.495821, 7200, 0, 0), -- Draenei Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66362 - Exodar Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+108, 34857, 650, 3, 1, 675.1146, 597.7188, 442.0728, 0.2792527, 7200, 0, 0), -- Troll Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura) +(@CGUID+109, 34859, 650, 3, 1, 685.118, 634.4045, 436.9757, 6.091199, 7200, 0, 0), -- Orcish Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66369 - Orgrimmar Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+110, 34858, 650, 3, 1, 688.0121, 573.8524, 442.0741, 0.6632251, 7200, 0, 0), -- Tauren Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66370 - Thunder Bluff Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+111, 34861, 650, 3, 1, 692.4063, 644.8698, 435.5041, 5.8294, 7200, 0, 0), -- Blood Elf Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66360 - Silvermoon Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+112, 34859, 650, 3, 1, 677.9861, 634.1024, 440.2452, 6.126106, 7200, 0, 0), -- Orcish Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura) +(@CGUID+113, 34869, 650, 3, 1, 803.8958, 639.0643, 435.5034, 3.455752, 7200, 0, 0), -- Gnomish Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura) +(@CGUID+114, 34861, 650, 3, 1, 689.4358, 639.2587, 435.5034, 5.951573, 7200, 0, 0), -- Blood Elf Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66360 - Silvermoon Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+115, 34858, 650, 3, 1, 682.8559, 586.1996, 440.2427, 0.4712389, 7200, 0, 0), -- Tauren Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66370 - Thunder Bluff Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+116, 34869, 650, 3, 1, 807.9583, 636.7726, 436.9755, 3.368485, 7200, 0, 0), -- Gnomish Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura) +(@CGUID+117, 34871, 650, 3, 1, 795.6719, 653.7396, 435.5041, 3.752458, 7200, 0, 0), -- Night Elf Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66368 - Darnassus Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+118, 34975, 650, 3, 1, 779.9965, 550.6945, 442.0774, 2.059489, 7200, 0, 0), -- Argent Crusade Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66361 - Argent Crusade Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+119, 34974, 650, 3, 1, 783.0695, 561.1771, 438.7979, 2.303835, 7200, 0, 0), -- Argent Crusade Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura) +(@CGUID+120, 34966, 650, 3, 1, 721.9705, 548.191, 442.0721, 1.239184, 7200, 0, 0), -- Argent Crusade Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66361 - Argent Crusade Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+121, 34970, 650, 3, 1, 769.9514, 547.875, 442.0723, 1.797689, 7200, 0, 0), -- Argent Crusade Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66361 - Argent Crusade Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+122, 34974, 650, 3, 1, 790.6077, 559.2691, 442.0727, 2.408554, 7200, 0, 0), -- Argent Crusade Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura) +(@CGUID+123, 34979, 650, 3, 1, 700.2726, 559.2239, 442.0803, 0.9250245, 7200, 0, 0), -- Argent Crusade Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura) +(@CGUID+124, 34869, 650, 3, 1, 818.5121, 640.5989, 442.0783, 3.385939, 7200, 0, 0), -- Gnomish Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura) +(@CGUID+125, 34870, 650, 3, 1, 818.1632, 607.1302, 440.209, 2.949606, 7200, 0, 0), -- Human Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66367 - Stormwind Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+126, 34869, 650, 3, 1, 813.5018, 644.8768, 440.2538, 3.490659, 7200, 0, 0), -- Gnomish Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura) +(@CGUID+127, 34860, 650, 3, 1, 690.4861, 661.6614, 440.2092, 5.550147, 7200, 0, 0), -- Forsaken Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66365 - Undercity Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+128, 34861, 650, 3, 1, 677.1702, 640.7396, 442.0688, 6.003932, 7200, 0, 0), -- Blood Elf Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura) +(@CGUID+129, 34871, 650, 3, 1, 800.1945, 660.7292, 438.7687, 3.822271, 7200, 0, 0), -- Night Elf Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66368 - Darnassus Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+130, 34870, 650, 3, 1, 818.1337, 626.9636, 440.2178, 3.281219, 7200, 0, 0), -- Human Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66367 - Stormwind Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+131, 34869, 650, 3, 1, 813.3004, 650.717, 442.0732, 3.490659, 7200, 0, 0), -- Gnomish Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66366 - Gnomeregan Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+132, 34861, 650, 3, 1, 679.9809, 648.8785, 440.1984, 5.864306, 7200, 0, 0), -- Blood Elf Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66360 - Silvermoon Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+133, 34860, 650, 3, 1, 684.0695, 656.6805, 442.074, 5.689773, 7200, 0, 0), -- Forsaken Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow, 66365 - Undercity Pennant, 55944 - Spectator - Cheer Aura) +(@CGUID+134, 34871, 650, 3, 1, 810.6077, 659.8299, 442.0864, 3.682645, 7200, 0, 0); -- Night Elf Coliseum Spectator (Area: Trial of the Champion) (Auras: 66321 - [DND] Spawn Grow; 55944 - Spectator - Cheer Aura) + +DELETE FROM `creature_addon` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+134; +INSERT INTO `creature_addon` (`guid`, `mount`, `bytes1`, `bytes2`, `auras`) VALUES +(@CGUID+18, 0, 0x0, 0x1, ''), -- [ph] Argent Raid Spectator - Generic Bunny +(@CGUID+19, 0, 0x0, 0x1, ''), -- [ph] Argent Raid Spectator - Generic Bunny +(@CGUID+20, 0, 0x0, 0x1, ''), -- [ph] Argent Raid Spectator - Generic Bunny +(@CGUID+21, 0, 0x0, 0x1, ''), -- [ph] Argent Raid Spectator - Generic Bunny +(@CGUID+22, 0, 0x0, 0x1, ''), -- [ph] Argent Raid Spectator - Generic Bunny +(@CGUID+23, 0, 0x0, 0x1, ''), -- [ph] Argent Raid Spectator - Generic Bunny +(@CGUID+24, 0, 0x0, 0x1, ''), -- [ph] Argent Raid Spectator - Generic Bunny +(@CGUID+25, 0, 0x0, 0x1, ''), -- [ph] Argent Raid Spectator - Generic Bunny +(@CGUID+26, 0, 0x0, 0x1, ''), -- [ph] Argent Raid Spectator - Generic Bunny +(@CGUID+32, 0, 0x0, 0x1, '66321 55944'), -- Argent Crusade Spectator - 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura +(@CGUID+33, 0, 0x0, 0x1, ''), -- [ph] Argent Raid Spectator - Generic Bunny +(@CGUID+34, 0, 0x0, 0x1, '66321 55944'), -- Argent Crusade Spectator - 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura +(@CGUID+35, 0, 0x0, 0x1, '66321 66361 55944'), -- Argent Crusade Spectator - 66321 - [DND] Spawn Grow, 66361 - Argent Crusade Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+36, 0, 0x0, 0x1, '66321 55944'), -- Argent Crusade Spectator - 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura +(@CGUID+37, 0, 0x0, 0x1, ''), -- [ph] Argent Raid Spectator - Generic Bunny +(@CGUID+38, 0, 0x0, 0x1, ''), -- [ph] Argent Raid Spectator - Generic Bunny +(@CGUID+39, 0, 0x0, 0x1, ''), -- [ph] Argent Raid Spectator - Generic Bunny +(@CGUID+40, 0, 0x0, 0x1, '66321 66361 55944'), -- Argent Crusade Spectator - 66321 - [DND] Spawn Grow, 66361 - Argent Crusade Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+42, 0, 0x0, 0x1, ''), -- [ph] Argent Raid Spectator - Generic Bunny +(@CGUID+43, 0, 0x0, 0x1, '66321 55944'), -- Orcish Coliseum Spectator - 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura +(@CGUID+44, 0, 0x0, 0x1, ''), -- [ph] Argent Raid Spectator - FX - Alliance +(@CGUID+45, 0, 0x0, 0x1, ''), -- [ph] Argent Raid Spectator - FX - Tauren +(@CGUID+46, 0, 0x0, 0x1, '66321 55944'), -- Troll Coliseum Spectator - 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura +(@CGUID+47, 0, 0x0, 0x1, '66321 55944'), -- Tauren Coliseum Spectator - 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura +(@CGUID+48, 0, 0x0, 0x1, '66321 66371 55944'), -- Troll Coliseum Spectator - 66321 - [DND] Spawn Grow, 66371 - Sen'jin Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+49, 0, 0x0, 0x1, '66321 55944'), -- Argent Crusade Spectator - 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura +(@CGUID+50, 0, 0x0, 0x1, '66321 66361 55944'), -- Argent Crusade Spectator - 66321 - [DND] Spawn Grow, 66361 - Argent Crusade Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+51, 0, 0x0, 0x1, '66321 55944'), -- Argent Crusade Spectator - 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura +(@CGUID+52, 0, 0x0, 0x1, '66321 66361 55944'), -- Argent Crusade Spectator - 66321 - [DND] Spawn Grow, 66361 - Argent Crusade Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+57, 0, 0x0, 0x1, '66321 55944'), -- Argent Crusade Spectator - 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura +(@CGUID+58, 0, 0x0, 0x1, '66321 66361 55944'), -- Argent Crusade Spectator - 66321 - [DND] Spawn Grow, 66361 - Argent Crusade Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+59, 0, 0x0, 0x1, '66321 66361 55944'), -- Argent Crusade Spectator - 66321 - [DND] Spawn Grow, 66361 - Argent Crusade Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+61, 0, 0x0, 0x1, '66321 66363 55944'), -- Dwarven Coliseum Spectator - 66321 - [DND] Spawn Grow, 66363 - Ironforge Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+62, 0, 0x0, 0x1, ''), -- [ph] Argent Raid Spectator - FX - Horde +(@CGUID+63, 0, 0x0, 0x1, '66321 55944'), -- Dwarven Coliseum Spectator - 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura +(@CGUID+64, 0, 0x0, 0x1, ''), -- [ph] Argent Raid Spectator - FX - Troll +(@CGUID+65, 0, 0x0, 0x1, ''), -- [ph] Argent Raid Spectator - FX - Orc +(@CGUID+66, 0, 0x0, 0x1, '66321 66369 55944'), -- Orcish Coliseum Spectator - 66321 - [DND] Spawn Grow, 66369 - Orgrimmar Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+67, 0, 0x0, 0x1, ''), -- [ph] Argent Raid Spectator - FX - Dwarf +(@CGUID+68, 0, 0x0, 0x1, '66321 55944'), -- Orcish Coliseum Spectator - 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura +(@CGUID+69, 0, 0x0, 0x1, '66321 55944'), -- Draenei Coliseum Spectator - 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura +(@CGUID+70, 0, 0x0, 0x1, '66321 66367 55944'), -- Human Coliseum Spectator - 66321 - [DND] Spawn Grow, 66367 - Stormwind Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+71, 0, 0x0, 0x1, '66321 66370 55944'), -- Tauren Coliseum Spectator - 66321 - [DND] Spawn Grow, 66370 - Thunder Bluff Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+72, 0, 0x0, 0x1, '66321 66362 55944'), -- Draenei Coliseum Spectator - 66321 - [DND] Spawn Grow, 66362 - Exodar Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+73, 0, 0x0, 0x1, '66321 55944'), -- Tauren Coliseum Spectator - 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura +(@CGUID+74, 0, 0x0, 0x1, '66321 66361 55944'), -- Argent Crusade Spectator - 66321 - [DND] Spawn Grow, 66361 - Argent Crusade Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+75, 0, 0x0, 0x1, '66321 66361 55944'), -- Argent Crusade Spectator - 66321 - [DND] Spawn Grow, 66361 - Argent Crusade Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+76, 0, 0x0, 0x1, '66321 55944'), -- Argent Crusade Spectator - 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura +(@CGUID+77, 0, 0x0, 0x1, '66321 66361 55944'), -- Argent Crusade Spectator - 66321 - [DND] Spawn Grow, 66361 - Argent Crusade Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+78, 0, 0x0, 0x1, '66321 66361 55944'), -- Argent Crusade Spectator - 66321 - [DND] Spawn Grow, 66361 - Argent Crusade Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+81, 0, 0x0, 0x1, '66321 66361 55944'), -- Argent Crusade Spectator - 66321 - [DND] Spawn Grow, 66361 - Argent Crusade Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+82, 0, 0x0, 0x1, '66321 55944'), -- Forsaken Coliseum Spectator - 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura +(@CGUID+83, 0, 0x0, 0x1, '66321 66367 55944'), -- Human Coliseum Spectator - 66321 - [DND] Spawn Grow, 66367 - Stormwind Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+84, 0, 0x0, 0x1, ''), -- [ph] Argent Raid Spectator - FX - Undead +(@CGUID+85, 0, 0x0, 0x1, ''), -- [ph] Argent Raid Spectator - FX - Blood Elf +(@CGUID+86, 0, 0x0, 0x1, '66321 55944'), -- Gnomish Coliseum Spectator - 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura +(@CGUID+91, 0, 0x0, 0x1, '66321 66362 55944'), -- Draenei Coliseum Spectator - 66321 - [DND] Spawn Grow, 66362 - Exodar Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+92, 0, 0x0, 0x1, '66321 55944'), -- Blood Elf Coliseum Spectator - 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura +(@CGUID+93, 0, 0x0, 0x1, '66321 55944'), -- Orcish Coliseum Spectator - 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura +(@CGUID+94, 0, 0x0, 0x1, '66321 55944'), -- Forsaken Coliseum Spectator - 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura +(@CGUID+95, 0, 0x0, 0x1, '66321 55944'), -- Dwarven Coliseum Spectator - 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura +(@CGUID+96, 0, 0x0, 0x1, '66321 66363 55944'), -- Dwarven Coliseum Spectator - 66321 - [DND] Spawn Grow, 66363 - Ironforge Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+97, 0, 0x0, 0x1, '66321 66371 55944'), -- Troll Coliseum Spectator - 66321 - [DND] Spawn Grow, 66371 - Sen'jin Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+98, 0, 0x0, 0x1, '66321 66367 55944'), -- Human Coliseum Spectator - 66321 - [DND] Spawn Grow, 66367 - Stormwind Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+99, 0, 0x0, 0x1, '66321 66363 55944'), -- Dwarven Coliseum Spectator - 66321 - [DND] Spawn Grow, 66363 - Ironforge Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+100, 0, 0x0, 0x1, '66321 66362 55944'), -- Draenei Coliseum Spectator - 66321 - [DND] Spawn Grow, 66362 - Exodar Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+101, 0, 0x0, 0x1, '66321 66363 55944'), -- Dwarven Coliseum Spectator - 66321 - [DND] Spawn Grow, 66363 - Ironforge Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+102, 0, 0x0, 0x1, '66321 66365 55944'), -- Forsaken Coliseum Spectator - 66321 - [DND] Spawn Grow, 66365 - Undercity Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+103, 0, 0x0, 0x1, '66321 55944'), -- Night Elf Coliseum Spectator - 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura +(@CGUID+104, 0, 0x0, 0x1, '66321 55944'), -- Troll Coliseum Spectator - 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura +(@CGUID+105, 0, 0x0, 0x1, '66321 66367 55944'), -- Human Coliseum Spectator - 66321 - [DND] Spawn Grow, 66367 - Stormwind Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+106, 0, 0x0, 0x1, '66321 55944'), -- Night Elf Coliseum Spectator - 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura +(@CGUID+107, 0, 0x0, 0x1, '66321 66362 55944'), -- Draenei Coliseum Spectator - 66321 - [DND] Spawn Grow, 66362 - Exodar Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+108, 0, 0x0, 0x1, '66321 55944'), -- Troll Coliseum Spectator - 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura +(@CGUID+109, 0, 0x0, 0x1, '66321 66369 55944'), -- Orcish Coliseum Spectator - 66321 - [DND] Spawn Grow, 66369 - Orgrimmar Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+110, 0, 0x0, 0x1, '66321 66370 55944'), -- Tauren Coliseum Spectator - 66321 - [DND] Spawn Grow, 66370 - Thunder Bluff Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+111, 0, 0x0, 0x1, '66321 66360 55944'), -- Blood Elf Coliseum Spectator - 66321 - [DND] Spawn Grow, 66360 - Silvermoon Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+112, 0, 0x0, 0x1, '66321 55944'), -- Orcish Coliseum Spectator - 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura +(@CGUID+113, 0, 0x0, 0x1, '66321 55944'), -- Gnomish Coliseum Spectator - 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura +(@CGUID+114, 0, 0x0, 0x1, '66321 66360 55944'), -- Blood Elf Coliseum Spectator - 66321 - [DND] Spawn Grow, 66360 - Silvermoon Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+115, 0, 0x0, 0x1, '66321 66370 55944'), -- Tauren Coliseum Spectator - 66321 - [DND] Spawn Grow, 66370 - Thunder Bluff Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+116, 0, 0x0, 0x1, '66321 55944'), -- Gnomish Coliseum Spectator - 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura +(@CGUID+117, 0, 0x0, 0x1, '66321 66368 55944'), -- Night Elf Coliseum Spectator - 66321 - [DND] Spawn Grow, 66368 - Darnassus Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+118, 0, 0x0, 0x1, '66321 66361 55944'), -- Argent Crusade Spectator - 66321 - [DND] Spawn Grow, 66361 - Argent Crusade Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+119, 0, 0x0, 0x1, '66321 55944'), -- Argent Crusade Spectator - 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura +(@CGUID+120, 0, 0x0, 0x1, '66321 66361 55944'), -- Argent Crusade Spectator - 66321 - [DND] Spawn Grow, 66361 - Argent Crusade Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+121, 0, 0x0, 0x1, '66321 66361 55944'), -- Argent Crusade Spectator - 66321 - [DND] Spawn Grow, 66361 - Argent Crusade Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+122, 0, 0x0, 0x1, '66321 55944'), -- Argent Crusade Spectator - 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura +(@CGUID+123, 0, 0x0, 0x1, '66321 55944'), -- Argent Crusade Spectator - 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura +(@CGUID+124, 0, 0x0, 0x1, '66321 55944'), -- Gnomish Coliseum Spectator - 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura +(@CGUID+125, 0, 0x0, 0x1, '66321 66367 55944'), -- Human Coliseum Spectator - 66321 - [DND] Spawn Grow, 66367 - Stormwind Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+126, 0, 0x0, 0x1, '66321 55944'), -- Gnomish Coliseum Spectator - 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura +(@CGUID+127, 0, 0x0, 0x1, '66321 66365 55944'), -- Forsaken Coliseum Spectator - 66321 - [DND] Spawn Grow, 66365 - Undercity Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+128, 0, 0x0, 0x1, '66321 55944'), -- Blood Elf Coliseum Spectator - 66321 - [DND] Spawn Grow, 55944 - Spectator - Cheer Aura +(@CGUID+129, 0, 0x0, 0x1, '66321 66368 55944'), -- Night Elf Coliseum Spectator - 66321 - [DND] Spawn Grow, 66368 - Darnassus Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+130, 0, 0x0, 0x1, '66321 66367 55944'), -- Human Coliseum Spectator - 66321 - [DND] Spawn Grow, 66367 - Stormwind Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+131, 0, 0x0, 0x1, '66321 66366 55944'), -- Gnomish Coliseum Spectator - 66321 - [DND] Spawn Grow, 66366 - Gnomeregan Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+132, 0, 0x0, 0x1, '66321 66360 55944'), -- Blood Elf Coliseum Spectator - 66321 - [DND] Spawn Grow, 66360 - Silvermoon Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+133, 0, 0x0, 0x1, '66321 66365 55944'), -- Forsaken Coliseum Spectator - 66321 - [DND] Spawn Grow, 66365 - Undercity Pennant, 55944 - Spectator - Cheer Aura +(@CGUID+134, 0, 0x0, 0x1, '66321 55944'); -- Night Elf Coliseum Spectator - 66321 - [DND] Spawn Grow; 55944 - Spectator - Cheer Aura + +DELETE FROM `gameobject` WHERE `map`=650; +INSERT INTO `gameobject` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`) VALUES +(@OGUID+ 0, 195479, 650, 3, 1, 746.1556, 549.4642, 412.8809, 4.71239, 0, 0, 0.7071069, 0.7071066, 86400, 255, 1), -- Doodad_InstancePortal_Green_10Man01 (Area: 0) +(@OGUID+ 1, 195480, 650, 3, 1, 746.1556, 549.4642, 412.8809, 1.570796, 0, 0, 0.7071069, 0.7071066, 86400, 255, 1), -- Doodad_InstancePortal_Green_25Man01 (Area: 0) +(@OGUID+ 2, 195478, 650, 3, 1, 746.1556, 549.4642, 412.8809, 1.570796, 0, 0, 0.7071069, 0.7071066, 86400, 255, 1), -- Doodad_InstancePortal_Green_10Man_Heroic01 (Area: 0) +(@OGUID+ 3, 195481, 650, 3, 1, 746.1556, 549.4642, 412.8809, 1.570796, 0, 0, 0.7071069, 0.7071066, 86400, 255, 1), -- Doodad_InstancePortal_Green_25Man_Heroic01 (Area: 0) +(@OGUID+ 4, 195486, 650, 3, 1, 813.1198, 617.5898, 413.0305, 0, 0, 0, 0.7071069, 0.7071066, 86400, 255, 1), -- Doodad_InstanceNewPortal_Purple_Skull01 (Area: 0) +(@OGUID+ 5, 195477, 650, 3, 1, 813.1296, 617.6323, 413.0386, 0, 0, 0, 0.7071069, 0.7071066, 86400, 255, 1), -- Doodad_InstanceNewPortal_Purple07 (Area: 0) +(@OGUID+ 6, 195650, 650, 3, 1, 804.6328, 618.0554, 412.6763, 3.141593, 0, 0, 0.7071069, 0.7071066, 86400, 255, 0), -- North Portcullis (Area: Trial of the Champion) +(@OGUID+ 7, 195649, 650, 3, 1, 688.7698, 618.0554, 412.704, 3.141593, 0, 0, 0.7071069, 0.7071066, 86400, 255, 1), -- South Portcullis (Area: Trial of the Champion) +(@OGUID+ 8, 195648, 650, 3, 1, 746.6458, 560.1208, 412.704, 1.570796, 0, 0, 0.7071069, 0.7071066, 86400, 255, 1), -- East Portcullis (Area: Trial of the Champion) +(@OGUID+ 9, 195647, 650, 3, 1, 746.6976, 677.4688, 412.3391, 1.570796, 0, 0, 0.7071069, 0.7071066, 86400, 255, 1), -- Main Gate (Area: Trial of the Champion) +(@OGUID+10, 196398, 650, 3, 1, 784.533, 660.2379, 412.3891, 5.567601, 0, 0, 0, 1, 86400, 255, 1), -- Lance Rack (Area: Trial of the Champion) +(@OGUID+11, 196398, 650, 3, 1, 801.6632, 624.8055, 412.3444, 4.939284, 0, 0, 0, 1, 86400, 255, 1), -- Lance Rack (Area: Trial of the Champion) +(@OGUID+12, 195485, 650, 3, 1, 844.6845, 623.4078, 159.1088, 0, 0, 0, 0.7071069, 0.7071066, 86400, 255, 0), -- Web Door (Area: Trial of the Champion) +(@OGUID+13, 196398, 650, 3, 1, 692.1268, 610.5746, 412.3466, 1.850049, 0, 0, 0, 1, 86400, 255, 1), -- Lance Rack (Area: Trial of the Champion) +(@OGUID+14, 196398, 650, 3, 1, 710.3246, 660.7083, 412.3868, 0.6981314, 0, 0, 0, 1, 86400, 255, 1), -- Lance Rack (Area: Trial of the Champion) +(@OGUID+15, 195709, 650, 1, 1, 744.7205, 618.3073, 411.0891, 1.53589, 0, 0, 0, 1, -86400, 255, 1), -- Champion's Cache (Area: Trial of the Champion) +(@OGUID+16, 195374, 650, 1, 1, 748.7604, 618.309, 411.0891, 1.588249, 0, 0, 0, 1, -86400, 255, 1), -- Eadric's Cache (Area: Trial of the Champion) +(@OGUID+17, 195323, 650, 1, 1, 748.7778, 618.3524, 411.0891, 1.570796, 0, 0, 0, 1, -86400, 255, 1), -- Confessor's Cache (Area: 0) +(@OGUID+18, 195710, 650, 2, 1, 744.7205, 618.3073, 411.0891, 1.53589, 0, 0, 0, 1, -86400, 255, 1), -- Champion's Cache (Area: Trial of the Champion) +(@OGUID+19, 195375, 650, 2, 1, 748.7604, 618.309, 411.0891, 1.588249, 0, 0, 0, 1, -86400, 255, 1), -- Eadric's Cache (Area: Trial of the Champion) +(@OGUID+20, 195324, 650, 2, 1, 748.7778, 618.3524, 411.0891, 1.570796, 0, 0, 0, 1, -86400, 255, 1); -- Confessor's Cache (Area: 0) + +UPDATE `creature_model_info` SET `bounding_radius`=1, `combat_reach`=1.5 WHERE `modelid`=29639; -- 29639 +UPDATE `creature_model_info` SET `bounding_radius`=1, `combat_reach`=1.5 WHERE `modelid`=29640; -- 29640 +UPDATE `creature_model_info` SET `bounding_radius`=0.3519, `combat_reach`=1.725 WHERE `modelid`=29643; -- 29643 +UPDATE `creature_model_info` SET `bounding_radius`=0.306, `combat_reach`=1.5 WHERE `modelid`=29644; -- 29644 +UPDATE `creature_model_info` SET `bounding_radius`=0.9747, `combat_reach`=4.05 WHERE `modelid`=29645; -- 29645 +UPDATE `creature_model_info` SET `bounding_radius`=0.9747, `combat_reach`=4.05 WHERE `modelid`=29646; -- 29646 +UPDATE `creature_model_info` SET `bounding_radius`=0.306, `combat_reach`=1.5 WHERE `modelid`=29648; -- 29648 +UPDATE `creature_model_info` SET `bounding_radius`=0.306, `combat_reach`=1.5 WHERE `modelid`=29650; -- 29650 +UPDATE `creature_model_info` SET `bounding_radius`=0.383, `combat_reach`=1.5 WHERE `modelid`=29651; -- 29651 +UPDATE `creature_model_info` SET `bounding_radius`=0.383, `combat_reach`=1.5 WHERE `modelid`=29652; -- 29652 +UPDATE `creature_model_info` SET `bounding_radius`=0.383, `combat_reach`=1.5 WHERE `modelid`=29654; -- 29654 +UPDATE `creature_model_info` SET `bounding_radius`=0.383, `combat_reach`=1.5 WHERE `modelid`=29655; -- 29655 +UPDATE `creature_model_info` SET `bounding_radius`=0.372, `combat_reach`=1.5 WHERE `modelid`=29659; -- 29659 +UPDATE `creature_model_info` SET `bounding_radius`=0.372, `combat_reach`=1.5 WHERE `modelid`=29660; -- 29660 +UPDATE `creature_model_info` SET `bounding_radius`=0.306, `combat_reach`=1.5 WHERE `modelid`=29570; -- 29570 +UPDATE `creature_model_info` SET `bounding_radius`=0.306, `combat_reach`=1.5 WHERE `modelid`=29571; -- 29571 +UPDATE `creature_model_info` SET `bounding_radius`=0.208, `combat_reach`=1.5 WHERE `modelid`=29572; -- 29572 +UPDATE `creature_model_info` SET `bounding_radius`=0.347, `combat_reach`=1.5 WHERE `modelid`=29574; -- 29574 +UPDATE `creature_model_info` SET `bounding_radius`=0.347, `combat_reach`=1.5 WHERE `modelid`=29575; -- 29575 +UPDATE `creature_model_info` SET `bounding_radius`=1, `combat_reach`=1.5 WHERE `modelid`=29576; -- 29576 +UPDATE `creature_model_info` SET `bounding_radius`=1, `combat_reach`=1.5 WHERE `modelid`=29577; -- 29577 +UPDATE `creature_model_info` SET `bounding_radius`=0.372, `combat_reach`=1.5 WHERE `modelid`=29578; -- 29578 +UPDATE `creature_model_info` SET `bounding_radius`=0.372, `combat_reach`=1.5 WHERE `modelid`=29579; -- 29579 +UPDATE `creature_model_info` SET `bounding_radius`=0.383, `combat_reach`=1.5 WHERE `modelid`=29580; -- 29580 +UPDATE `creature_model_info` SET `bounding_radius`=0.383, `combat_reach`=1.5 WHERE `modelid`=29581; -- 29581 +UPDATE `creature_model_info` SET `bounding_radius`=0.9747, `combat_reach`=4.05 WHERE `modelid`=29582; -- 29582 +UPDATE `creature_model_info` SET `bounding_radius`=0.9747, `combat_reach`=4.05 WHERE `modelid`=29583; -- 29583 +UPDATE `creature_model_info` SET `bounding_radius`=0.4596, `combat_reach`=1.8 WHERE `modelid`=29894; -- 29894 +UPDATE `creature_model_info` SET `bounding_radius`=0.347, `combat_reach`=1.5 WHERE `modelid`=29634; -- 29634 +UPDATE `creature_model_info` SET `bounding_radius`=0.347, `combat_reach`=1.5 WHERE `modelid`=29635; -- 29635 +UPDATE `creature_model_info` SET `bounding_radius`=0.306, `combat_reach`=1.5 WHERE `modelid`=29636; -- 29636 +UPDATE `creature_model_info` SET `bounding_radius`=0.208, `combat_reach`=1.5 WHERE `modelid`=29638; -- 29638 + +UPDATE `creature_template` SET `scale`=1 WHERE `entry` IN (34871, 34869, 34856, 34975, 34970, 34868, 34870, 34977, 34974, 34966, 34979, 34860, 34859, 34861, 34857, 34858); + +UPDATE `creature_template` SET `spell1`=68505, `spell2`=62575,`spell3`=68282,`spell4`=62552 WHERE `entry` IN (36558,33322); diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 93fe943b26b..1ec20830140 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -17,7 +17,7 @@ #include "Cell.h" #include "CellImpl.h" -#include "Chat.h" +#include "ChatTextBuilder.h" #include "CreatureTextMgr.h" #include "DatabaseEnv.h" #include "GossipDef.h" @@ -38,26 +38,6 @@ #include "MoveSplineInit.h" #include "GameEventMgr.h" -class BroadcastTextBuilder -{ - public: - BroadcastTextBuilder(WorldObject const* obj, ChatMsg msgtype, uint32 id, WorldObject const* target, uint32 gender = GENDER_MALE) - : _source(obj), _msgType(msgtype), _textId(id), _target(target), _gender(gender) { } - - size_t operator()(WorldPacket* data, LocaleConstant locale) const - { - BroadcastText const* bct = sObjectMgr->GetBroadcastText(_textId); - - return ChatHandler::BuildChatPacket(*data, _msgType, bct ? Language(bct->Language) : LANG_UNIVERSAL, _source, _target, bct ? bct->GetText(locale, _gender) : "", 0, "", locale); - } - - WorldObject const* _source; - ChatMsg _msgType; - uint32 _textId; - WorldObject const* _target; - uint32 _gender; -}; - SmartScript::SmartScript() { go = NULL; @@ -232,7 +212,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u { if (IsUnit(*itr)) { - (*itr)->SendPlaySound(e.action.sound.sound, e.action.sound.onlySelf > 0); + (*itr)->PlayDirectSound(e.action.sound.sound, e.action.sound.onlySelf ? (*itr)->ToPlayer() : nullptr); TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_SOUND: target: %s (GuidLow: %u), sound: %u, onlyself: %u", (*itr)->GetName().c_str(), (*itr)->GetGUIDLow(), e.action.sound.sound, e.action.sound.onlySelf); } @@ -762,7 +742,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u me->DoFleeToGetAssistance(); if (e.action.flee.withEmote) { - BroadcastTextBuilder builder(me, CHAT_MSG_MONSTER_EMOTE, BROADCAST_TEXT_FLEE_FOR_ASSIST, NULL, me->getGender()); + Trinity::BroadcastTextBuilder builder(me, CHAT_MSG_MONSTER_EMOTE, BROADCAST_TEXT_FLEE_FOR_ASSIST); sCreatureTextMgr->SendChatPacket(me, builder, CHAT_MSG_MONSTER_EMOTE); } TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_FLEE_FOR_ASSIST: Creature %u DoFleeToGetAssistance", me->GetGUIDLow()); @@ -1005,7 +985,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u me->CallForHelp((float)e.action.callHelp.range); if (e.action.callHelp.withEmote) { - BroadcastTextBuilder builder(me, CHAT_MSG_MONSTER_EMOTE, BROADCAST_TEXT_CALL_FOR_HELP, NULL, me->getGender()); + Trinity::BroadcastTextBuilder builder(me, CHAT_MSG_MONSTER_EMOTE, BROADCAST_TEXT_CALL_FOR_HELP); sCreatureTextMgr->SendChatPacket(me, builder, CHAT_MSG_MONSTER_EMOTE); } TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction: SMART_ACTION_CALL_FOR_HELP: Creature %u", me->GetGUIDLow()); diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 547cd9a8502..46e02f9547f 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -21,7 +21,7 @@ #include "ArenaTeamMgr.h" #include "Battleground.h" #include "CellImpl.h" -#include "Chat.h" +#include "ChatTextBuilder.h" #include "Common.h" #include "DatabaseEnv.h" #include "DBCEnums.h" @@ -42,29 +42,6 @@ #include "World.h" #include "WorldPacket.h" -namespace Trinity -{ - class AchievementChatBuilder - { - public: - AchievementChatBuilder(Player const* player, ChatMsg msgType, uint32 textId, uint32 achievementId) - : _player(player), _msgType(msgType), _textId(textId), _achievementId(achievementId) { } - - void operator()(WorldPacket& data, LocaleConstant locale) - { - BroadcastText const* bct = sObjectMgr->GetBroadcastText(_textId); - - ChatHandler::BuildChatPacket(data, _msgType, bct ? Language(bct->Language) : LANG_UNIVERSAL, _player, _player, bct ? bct->GetText(locale, _player->getGender()) : "", _achievementId); - } - - private: - Player const* _player; - ChatMsg _msgType; - uint32 _textId; - uint32 _achievementId; - }; -} // namespace Trinity - bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) { if (dataType >= MAX_ACHIEVEMENT_CRITERIA_DATA_TYPE) @@ -661,8 +638,8 @@ void AchievementMgr::SendAchievementEarned(AchievementEntry const* achievement) if (Guild* guild = sGuildMgr->GetGuildById(GetPlayer()->GetGuildId())) { - Trinity::AchievementChatBuilder _builder(GetPlayer(), CHAT_MSG_GUILD_ACHIEVEMENT, BROADCAST_TEXT_ACHIEVEMENT_EARNED, achievement->ID); - Trinity::LocalizedPacketDo<Trinity::AchievementChatBuilder> _localizer(_builder); + Trinity::BroadcastTextBuilder _builder(GetPlayer(), CHAT_MSG_GUILD_ACHIEVEMENT, BROADCAST_TEXT_ACHIEVEMENT_EARNED, GetPlayer(), achievement->ID); + Trinity::LocalizedPacketDo<Trinity::BroadcastTextBuilder> _localizer(_builder); guild->BroadcastWorker(_localizer, GetPlayer()); } @@ -679,9 +656,9 @@ void AchievementMgr::SendAchievementEarned(AchievementEntry const* achievement) // if player is in world he can tell his friends about new achievement else if (GetPlayer()->IsInWorld()) { - Trinity::AchievementChatBuilder _builder(GetPlayer(), CHAT_MSG_ACHIEVEMENT, BROADCAST_TEXT_ACHIEVEMENT_EARNED, achievement->ID); - Trinity::LocalizedPacketDo<Trinity::AchievementChatBuilder> _localizer(_builder); - Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::AchievementChatBuilder> > _worker(GetPlayer(), sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), _localizer); + Trinity::BroadcastTextBuilder _builder(GetPlayer(), CHAT_MSG_ACHIEVEMENT, BROADCAST_TEXT_ACHIEVEMENT_EARNED, GetPlayer(), achievement->ID); + Trinity::LocalizedPacketDo<Trinity::BroadcastTextBuilder> _localizer(_builder); + Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::BroadcastTextBuilder> > _worker(GetPlayer(), sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), _localizer); GetPlayer()->VisitNearbyWorldObject(sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), _worker); } diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 6f6d1b66308..f2a112cbeba 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -738,7 +738,7 @@ void Battleground::EndBattleground(uint32 winner) stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_PVPSTATS_BATTLEGROUND); stmt->setUInt64(0, battlegroundId); stmt->setUInt8(1, GetWinner()); - stmt->setUInt8(2, m_BracketId + 1); + stmt->setUInt8(2, GetUniqueBracketId()); stmt->setUInt8(3, GetTypeID(true)); CharacterDatabase.Execute(stmt); } @@ -1832,3 +1832,8 @@ bool Battleground::CheckAchievementCriteriaMeet(uint32 criteriaId, Player const* TC_LOG_ERROR("bg.battleground", "Battleground::CheckAchievementCriteriaMeet: No implementation for criteria %u", criteriaId); return false; } + +uint8 Battleground::GetUniqueBracketId() const +{ + return GetMinLevel() / 10; +} diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h index b0270192fd1..b14c18c9335 100644 --- a/src/server/game/Battlegrounds/Battleground.h +++ b/src/server/game/Battlegrounds/Battleground.h @@ -469,6 +469,9 @@ class Battleground virtual uint32 GetPrematureWinner(); + // because BattleGrounds with different types and same level range has different m_BracketId + uint8 GetUniqueBracketId() const; + protected: // this method is called, when BG cannot spawn its own spirit guide, or something is wrong, It correctly ends Battleground void EndNow(); diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 45450a0c129..e402836f4c2 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -1879,16 +1879,6 @@ bool WorldObject::CanDetectStealthOf(WorldObject const* obj) const return true; } -void WorldObject::SendPlaySound(uint32 Sound, bool OnlySelf) -{ - WorldPacket data(SMSG_PLAY_SOUND, 4); - data << Sound; - if (OnlySelf && GetTypeId() == TYPEID_PLAYER) - this->ToPlayer()->GetSession()->SendPacket(&data); - else - SendMessageToSet(&data, true); // ToSelf ignored in this case -} - void Object::ForceValuesUpdateAtIndex(uint32 i) { _changesMask.SetBit(i); @@ -1899,149 +1889,6 @@ void Object::ForceValuesUpdateAtIndex(uint32 i) } } -namespace Trinity -{ - class MonsterChatBuilder - { - public: - MonsterChatBuilder(WorldObject const* obj, ChatMsg msgtype, int32 textId, uint32 language, WorldObject const* target) - : i_object(obj), i_msgtype(msgtype), i_textId(textId), i_language(Language(language)), i_target(target) { } - void operator()(WorldPacket& data, LocaleConstant loc_idx) - { - char const* text = sObjectMgr->GetTrinityString(i_textId, loc_idx); - ChatHandler::BuildChatPacket(data, i_msgtype, i_language, i_object, i_target, text, 0, "", loc_idx); - } - - private: - WorldObject const* i_object; - ChatMsg i_msgtype; - int32 i_textId; - Language i_language; - WorldObject const* i_target; - }; - - class MonsterCustomChatBuilder - { - public: - MonsterCustomChatBuilder(WorldObject const* obj, ChatMsg msgtype, const char* text, uint32 language, WorldObject const* target) - : i_object(obj), i_msgtype(msgtype), i_text(text), i_language(Language(language)), i_target(target) - {} - void operator()(WorldPacket& data, LocaleConstant loc_idx) - { - ChatHandler::BuildChatPacket(data, i_msgtype, i_language, i_object, i_target, i_text, 0, "", loc_idx); - } - - private: - WorldObject const* i_object; - ChatMsg i_msgtype; - const char* i_text; - Language i_language; - WorldObject const* i_target; - }; -} // namespace Trinity - -void WorldObject::MonsterSay(const char* text, uint32 language, WorldObject const* target) -{ - CellCoord p = Trinity::ComputeCellCoord(GetPositionX(), GetPositionY()); - - Cell cell(p); - cell.SetNoCreate(); - - Trinity::MonsterCustomChatBuilder say_build(this, CHAT_MSG_MONSTER_SAY, text, language, target); - Trinity::LocalizedPacketDo<Trinity::MonsterCustomChatBuilder> say_do(say_build); - Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::MonsterCustomChatBuilder> > say_worker(this, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), say_do); - TypeContainerVisitor<Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::MonsterCustomChatBuilder> >, WorldTypeMapContainer > message(say_worker); - cell.Visit(p, message, *GetMap(), *this, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY)); -} - -void WorldObject::MonsterSay(int32 textId, uint32 language, WorldObject const* target) -{ - CellCoord p = Trinity::ComputeCellCoord(GetPositionX(), GetPositionY()); - - Cell cell(p); - cell.SetNoCreate(); - - Trinity::MonsterChatBuilder say_build(this, CHAT_MSG_MONSTER_SAY, textId, language, target); - Trinity::LocalizedPacketDo<Trinity::MonsterChatBuilder> say_do(say_build); - Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::MonsterChatBuilder> > say_worker(this, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), say_do); - TypeContainerVisitor<Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::MonsterChatBuilder> >, WorldTypeMapContainer > message(say_worker); - cell.Visit(p, message, *GetMap(), *this, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY)); -} - -void WorldObject::MonsterYell(const char* text, uint32 language, WorldObject const* target) -{ - CellCoord p = Trinity::ComputeCellCoord(GetPositionX(), GetPositionY()); - - Cell cell(p); - cell.SetNoCreate(); - - Trinity::MonsterCustomChatBuilder say_build(this, CHAT_MSG_MONSTER_YELL, text, language, target); - Trinity::LocalizedPacketDo<Trinity::MonsterCustomChatBuilder> say_do(say_build); - Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::MonsterCustomChatBuilder> > say_worker(this, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), say_do); - TypeContainerVisitor<Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::MonsterCustomChatBuilder> >, WorldTypeMapContainer > message(say_worker); - cell.Visit(p, message, *GetMap(), *this, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL)); -} - -void WorldObject::MonsterYell(int32 textId, uint32 language, WorldObject const* target) -{ - CellCoord p = Trinity::ComputeCellCoord(GetPositionX(), GetPositionY()); - - Cell cell(p); - cell.SetNoCreate(); - - Trinity::MonsterChatBuilder say_build(this, CHAT_MSG_MONSTER_YELL, textId, language, target); - Trinity::LocalizedPacketDo<Trinity::MonsterChatBuilder> say_do(say_build); - Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::MonsterChatBuilder> > say_worker(this, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), say_do); - TypeContainerVisitor<Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::MonsterChatBuilder> >, WorldTypeMapContainer > message(say_worker); - cell.Visit(p, message, *GetMap(), *this, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL)); -} - -void WorldObject::MonsterTextEmote(const char* text, WorldObject const* target, bool IsBossEmote) -{ - WorldPacket data; - ChatHandler::BuildChatPacket(data, IsBossEmote ? CHAT_MSG_RAID_BOSS_EMOTE : CHAT_MSG_MONSTER_EMOTE, LANG_UNIVERSAL, - this, target, text); - SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), true); -} - -void WorldObject::MonsterTextEmote(int32 textId, WorldObject const* target, bool IsBossEmote) -{ - CellCoord p = Trinity::ComputeCellCoord(GetPositionX(), GetPositionY()); - - Cell cell(p); - cell.SetNoCreate(); - - Trinity::MonsterChatBuilder say_build(this, IsBossEmote ? CHAT_MSG_RAID_BOSS_EMOTE : CHAT_MSG_MONSTER_EMOTE, textId, LANG_UNIVERSAL, target); - Trinity::LocalizedPacketDo<Trinity::MonsterChatBuilder> say_do(say_build); - Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::MonsterChatBuilder> > say_worker(this, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), say_do); - TypeContainerVisitor<Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::MonsterChatBuilder> >, WorldTypeMapContainer > message(say_worker); - cell.Visit(p, message, *GetMap(), *this, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE)); -} - -void WorldObject::MonsterWhisper(const char* text, Player const* target, bool IsBossWhisper) -{ - if (!target) - return; - - LocaleConstant loc_idx = target->GetSession()->GetSessionDbLocaleIndex(); - WorldPacket data; - ChatHandler::BuildChatPacket(data, IsBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, LANG_UNIVERSAL, this, target, text, 0, "", loc_idx); - target->GetSession()->SendPacket(&data); -} - -void WorldObject::MonsterWhisper(int32 textId, Player const* target, bool IsBossWhisper) -{ - if (!target) - return; - - LocaleConstant loc_idx = target->GetSession()->GetSessionDbLocaleIndex(); - char const* text = sObjectMgr->GetTrinityString(textId, loc_idx); - WorldPacket data; - ChatHandler::BuildChatPacket(data, IsBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, LANG_UNIVERSAL, this, target, text, 0, "", loc_idx); - - target->GetSession()->SendPacket(&data); -} - void Unit::BuildHeartBeatMsg(WorldPacket* data) const { data->Initialize(MSG_MOVE_HEARTBEAT, 32); diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 85381c1dfd9..652a4d4b71f 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -652,15 +652,6 @@ class WorldObject : public Object, public WorldLocation virtual uint8 getLevelForTarget(WorldObject const* /*target*/) const { return 1; } - void MonsterSay(const char* text, uint32 language, WorldObject const* target); - void MonsterYell(const char* text, uint32 language, WorldObject const* target); - void MonsterTextEmote(const char* text, WorldObject const* target, bool IsBossEmote = false); - void MonsterWhisper(const char* text, Player const* target, bool IsBossWhisper = false); - void MonsterSay(int32 textId, uint32 language, WorldObject const* target); - void MonsterYell(int32 textId, uint32 language, WorldObject const* target); - void MonsterTextEmote(int32 textId, WorldObject const* target, bool IsBossEmote = false); - void MonsterWhisper(int32 textId, Player const* target, bool IsBossWhisper = false); - void PlayDistanceSound(uint32 sound_id, Player* target = NULL); void PlayDirectSound(uint32 sound_id, Player* target = NULL); @@ -683,9 +674,6 @@ class WorldObject : public Object, public WorldLocation FlaggedValuesArray32<int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPES> m_serverSideVisibility; FlaggedValuesArray32<int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPES> m_serverSideVisibilityDetect; - // Low Level Packets - void SendPlaySound(uint32 Sound, bool OnlySelf); - virtual void SetMap(Map* map); virtual void ResetMap(); Map* GetMap() const { ASSERT(m_currMap); return m_currMap; } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index f7ef9a3d895..a5b97cbee3c 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -3807,7 +3807,8 @@ bool Player::AddSpell(uint32 spellId, bool active, bool learning, bool dependent if (!pSkill) continue; - if (_spell_idx->second->AutolearnType == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && !HasSkill(pSkill->id)) + ///@todo: confirm if rogues start with lockpicking skill at level 1 but only receive the spell to use it at level 16 + if ((_spell_idx->second->AutolearnType == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && !HasSkill(pSkill->id)) || (pSkill->id == SKILL_LOCKPICKING && _spell_idx->second->max_value == 0)) LearnDefaultSkill(pSkill->id, 0); if (pSkill->id == SKILL_MOUNTS && !Has310Flyer(false)) @@ -20527,27 +20528,27 @@ void Player::StopCastingCharm() } } -void Player::Say(const std::string& text, const uint32 language) +void Player::Say(std::string const& text, Language language, WorldObject const* /*= nullptr*/) { std::string _text(text); sScriptMgr->OnPlayerChat(this, CHAT_MSG_SAY, language, _text); WorldPacket data; - ChatHandler::BuildChatPacket(data, CHAT_MSG_SAY, Language(language), this, this, _text); + ChatHandler::BuildChatPacket(data, CHAT_MSG_SAY, language, this, this, _text); SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), true); } -void Player::Yell(const std::string& text, const uint32 language) +void Player::Yell(std::string const& text, Language language, WorldObject const* /*= nullptr*/) { std::string _text(text); sScriptMgr->OnPlayerChat(this, CHAT_MSG_YELL, language, _text); WorldPacket data; - ChatHandler::BuildChatPacket(data, CHAT_MSG_YELL, Language(language), this, this, _text); + ChatHandler::BuildChatPacket(data, CHAT_MSG_YELL, language, this, this, _text); SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), true); } -void Player::TextEmote(const std::string& text) +void Player::TextEmote(std::string const& text, WorldObject const* /*= nullptr*/, bool /*= false*/) { std::string _text(text); sScriptMgr->OnPlayerChat(this, CHAT_MSG_EMOTE, LANG_UNIVERSAL, _text); @@ -20557,40 +20558,40 @@ void Player::TextEmote(const std::string& text) SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), true, !GetSession()->HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHAT)); } -void Player::Whisper(const std::string& text, uint32 language, uint64 receiver) +void Player::Whisper(std::string const& text, Language language, Player* target, bool /*= false*/) { + ASSERT(target); + bool isAddonMessage = language == LANG_ADDON; if (!isAddonMessage) // if not addon data language = LANG_UNIVERSAL; // whispers should always be readable - Player* rPlayer = ObjectAccessor::FindPlayer(receiver); - std::string _text(text); - sScriptMgr->OnPlayerChat(this, CHAT_MSG_WHISPER, language, _text, rPlayer); + sScriptMgr->OnPlayerChat(this, CHAT_MSG_WHISPER, language, _text, target); WorldPacket data; ChatHandler::BuildChatPacket(data, CHAT_MSG_WHISPER, Language(language), this, this, _text); - rPlayer->GetSession()->SendPacket(&data); + target->GetSession()->SendPacket(&data); // rest stuff shouldn't happen in case of addon message if (isAddonMessage) return; - ChatHandler::BuildChatPacket(data, CHAT_MSG_WHISPER_INFORM, Language(language), rPlayer, rPlayer, _text); + ChatHandler::BuildChatPacket(data, CHAT_MSG_WHISPER_INFORM, Language(language), target, target, _text); GetSession()->SendPacket(&data); - if (!isAcceptWhispers() && !IsGameMaster() && !rPlayer->IsGameMaster()) + if (!isAcceptWhispers() && !IsGameMaster() && !target->IsGameMaster()) { SetAcceptWhispers(true); ChatHandler(GetSession()).SendSysMessage(LANG_COMMAND_WHISPERON); } // announce afk or dnd message - if (rPlayer->isAFK()) - ChatHandler(GetSession()).PSendSysMessage(LANG_PLAYER_AFK, rPlayer->GetName().c_str(), rPlayer->autoReplyMsg.c_str()); - else if (rPlayer->isDND()) - ChatHandler(GetSession()).PSendSysMessage(LANG_PLAYER_DND, rPlayer->GetName().c_str(), rPlayer->autoReplyMsg.c_str()); + if (target->isAFK()) + ChatHandler(GetSession()).PSendSysMessage(LANG_PLAYER_AFK, target->GetName().c_str(), target->autoReplyMsg.c_str()); + else if (target->isDND()) + ChatHandler(GetSession()).PSendSysMessage(LANG_PLAYER_DND, target->GetName().c_str(), target->autoReplyMsg.c_str()); } Item* Player::GetMItem(uint32 id) @@ -23146,6 +23147,8 @@ void Player::LearnDefaultSkill(uint32 skillId, uint16 rank) skillValue = std::min(std::max<uint16>({ 1, uint16((getLevel() - 1) * 5) }), maxValue); else if (skillId == SKILL_FIST_WEAPONS) skillValue = std::max<uint16>(1, GetSkillValue(SKILL_UNARMED)); + else if (skillId == SKILL_LOCKPICKING) + skillValue = std::max<uint16>(1, GetSkillValue(SKILL_LOCKPICKING)); SetSkill(skillId, 0, skillValue, maxValue); break; diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 27ea8355345..5705d95190d 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1215,13 +1215,13 @@ class Player : public Unit, public GridObject<Player> uint32 GetPhaseMaskForSpawn() const; // used for proper set phase for DB at GM-mode creature/GO spawn /// Handles said message in regular chat based on declared language and in config pre-defined Range. - void Say(std::string const& text, const uint32 language); + void Say(std::string const& text, Language language, WorldObject const* = nullptr) override; /// Handles yelled message in regular chat based on declared language and in config pre-defined Range. - void Yell(std::string const& text, const uint32 language); + void Yell(std::string const& text, Language language, WorldObject const* = nullptr) override; /// Outputs an universal text which is supposed to be an action. - void TextEmote(std::string const& text); + void TextEmote(std::string const& text, WorldObject const* = nullptr, bool = false) override; /// Handles whispers from Addons and players based on sender, receiver's guid and language. - void Whisper(std::string const& text, const uint32 language, uint64 receiver); + void Whisper(std::string const& text, Language language, Player* receiver, bool = false) override; /*********************************************************/ /*** STORAGE SYSTEM ***/ diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 9423284c76d..97b0bb75e4d 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -23,6 +23,7 @@ #include "Battleground.h" #include "BattlegroundScore.h" #include "CellImpl.h" +#include "ChatTextBuilder.h" #include "ConditionMgr.h" #include "CreatureAI.h" #include "CreatureAIImpl.h" @@ -458,7 +459,7 @@ bool Unit::IsWithinMeleeRange(const Unit* obj, float dist) const float dx = GetPositionX() - obj->GetPositionX(); float dy = GetPositionY() - obj->GetPositionY(); - float dz = GetPositionZ() - obj->GetPositionZ(); + float dz = GetPositionZMinusOffset() - obj->GetPositionZMinusOffset(); float distsq = dx*dx + dy*dy + dz*dz; float sizefactor = GetMeleeReach() + obj->GetMeleeReach(); @@ -8132,7 +8133,7 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg if (triggerEntry == NULL) { // Don't cast unknown spell - // TC_LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell %u has 0 in EffectTriggered[%d]. Unhandled custom case?", auraSpellInfo->Id, triggeredByAura->GetEffIndex()); + TC_LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell %u (effIndex: %u) has unknown TriggerSpell %u. Unhandled custom case?", auraSpellInfo->Id, triggeredByAura->GetEffIndex(), trigger_spell_id); return false; } @@ -15504,7 +15505,7 @@ void Unit::SetControlled(bool apply, UnitState state) case UNIT_STATE_STUNNED: SetStunned(true); // i need to stop fear on stun and root or i will get teleport to destination issue as MVMGEN for fear keeps going on - if (HasUnitState(UNIT_STATE_FLEEING)) + if (HasUnitState(UNIT_STATE_FLEEING)) SetFeared(false); CastStop(); break; @@ -17848,3 +17849,84 @@ bool Unit::IsHighestExclusiveAura(Aura const* aura, bool removeOtherAuraApplicat return true; } + +void Unit::Talk(std::string const& text, ChatMsg msgType, Language language, float textRange, WorldObject const* target) +{ + Trinity::CustomChatTextBuilder builder(this, msgType, text, language, target); + Trinity::LocalizedPacketDo<Trinity::CustomChatTextBuilder> localizer(builder); + Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::CustomChatTextBuilder> > worker(this, textRange, localizer); + VisitNearbyWorldObject(textRange, worker); +} + +void Unit::Say(std::string const& text, Language language, WorldObject const* target /*= nullptr*/) +{ + Talk(text, CHAT_MSG_MONSTER_SAY, language, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), target); +} + +void Unit::Yell(std::string const& text, Language language, WorldObject const* target /*= nullptr*/) +{ + Talk(text, CHAT_MSG_MONSTER_YELL, language, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), target); +} + +void Unit::TextEmote(std::string const& text, WorldObject const* target /*= nullptr*/, bool isBossEmote /*= false*/) +{ + Talk(text, isBossEmote ? CHAT_MSG_RAID_BOSS_EMOTE : CHAT_MSG_MONSTER_EMOTE, LANG_UNIVERSAL, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), target); +} + +void Unit::Whisper(std::string const& text, Language language, Player* target, bool isBossWhisper /*= false*/) +{ + if (!target) + return; + + LocaleConstant locale = target->GetSession()->GetSessionDbLocaleIndex(); + WorldPacket data; + ChatHandler::BuildChatPacket(data, isBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, language, this, target, text, 0, "", locale); + target->SendDirectMessage(&data); +} + +void Unit::Talk(uint32 textId, ChatMsg msgType, float textRange, WorldObject const* target) +{ + if (!sObjectMgr->GetBroadcastText(textId)) + { + TC_LOG_ERROR("entities.unit", "WorldObject::MonsterText: `broadcast_text` was not %u found", textId); + return; + } + + Trinity::BroadcastTextBuilder builder(this, msgType, textId, target); + Trinity::LocalizedPacketDo<Trinity::BroadcastTextBuilder> localizer(builder); + Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::BroadcastTextBuilder> > worker(this, textRange, localizer); + VisitNearbyWorldObject(textRange, worker); +} + +void Unit::Say(uint32 textId, WorldObject const* target /*= nullptr*/) +{ + Talk(textId, CHAT_MSG_MONSTER_SAY, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), target); +} + +void Unit::Yell(uint32 textId, WorldObject const* target /*= nullptr*/) +{ + Talk(textId, CHAT_MSG_MONSTER_YELL, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), target); +} + +void Unit::TextEmote(uint32 textId, WorldObject const* target /*= nullptr*/, bool isBossEmote /*= false*/) +{ + Talk(textId, isBossEmote ? CHAT_MSG_RAID_BOSS_EMOTE : CHAT_MSG_MONSTER_EMOTE, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), target); +} + +void Unit::Whisper(uint32 textId, Player* target, bool isBossWhisper /*= false*/) +{ + if (!target) + return; + + BroadcastText const* bct = sObjectMgr->GetBroadcastText(textId); + if (!bct) + { + TC_LOG_ERROR("entities.unit", "WorldObject::MonsterWhisper: `broadcast_text` was not %u found", textId); + return; + } + + LocaleConstant locale = target->GetSession()->GetSessionDbLocaleIndex(); + WorldPacket data; + ChatHandler::BuildChatPacket(data, isBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, LANG_UNIVERSAL, this, target, bct->GetText(locale, getGender()), 0, "", locale); + target->SendDirectMessage(&data); +} diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index a18bc3b0848..7d40b1c24db 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1619,6 +1619,7 @@ class Unit : public WorldObject bool IsLevitating() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY); } bool IsWalking() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_WALKING); } + bool IsHovering() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_HOVER); } virtual bool SetWalk(bool enable); virtual bool SetDisableGravity(bool disable, bool packetOnly = false); virtual bool SetSwim(bool enable); @@ -2157,6 +2158,17 @@ class Unit : public WorldObject int32 GetHighestExclusiveSameEffectSpellGroupValue(AuraEffect const* aurEff, AuraType auraType, bool checkMiscValue = false, int32 miscValue = 0) const; bool IsHighestExclusiveAura(Aura const* aura, bool removeOtherAuraApplications = false); + virtual void Talk(std::string const& text, ChatMsg msgType, Language language, float textRange, WorldObject const* target); + virtual void Say(std::string const& text, Language language, WorldObject const* target = nullptr); + virtual void Yell(std::string const& text, Language language, WorldObject const* target = nullptr); + virtual void TextEmote(std::string const& text, WorldObject const* target = nullptr, bool isBossEmote = false); + virtual void Whisper(std::string const& text, Language language, Player* target, bool isBossWhisper = false); + void Talk(uint32 textId, ChatMsg msgType, float textRange, WorldObject const* target); + void Say(uint32 textId, WorldObject const* target = nullptr); + void Yell(uint32 textId, WorldObject const* target = nullptr); + void TextEmote(uint32 textId, WorldObject const* target = nullptr, bool isBossEmote = false); + void Whisper(uint32 textId, Player* target, bool isBossWhisper = false); + protected: explicit Unit (bool isWorldObject); diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 7ab843943f8..20c20a883d2 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -4602,18 +4602,12 @@ void ObjectMgr::LoadScripts(ScriptsType type) tableName.c_str(), tmp.Talk.ChatType, tmp.id); continue; } - if (!tmp.Talk.TextID) + if (!sObjectMgr->GetBroadcastText(uint32(tmp.Talk.TextID))) { TC_LOG_ERROR("sql.sql", "Table `%s` has invalid talk text id (dataint = %i) in SCRIPT_COMMAND_TALK for script id %u", tableName.c_str(), tmp.Talk.TextID, tmp.id); continue; } - if (tmp.Talk.TextID < MIN_DB_SCRIPT_STRING_ID || tmp.Talk.TextID >= MAX_DB_SCRIPT_STRING_ID) - { - TC_LOG_ERROR("sql.sql", "Table `%s` has out of range text id (dataint = %i expected %u-%u) in SCRIPT_COMMAND_TALK for script id %u", - tableName.c_str(), tmp.Talk.TextID, MIN_DB_SCRIPT_STRING_ID, MAX_DB_SCRIPT_STRING_ID, tmp.id); - continue; - } break; } @@ -8635,33 +8629,6 @@ uint32 ObjectMgr::GetScriptId(const char *name) return uint32(itr - _scriptNamesStore.begin()); } -void ObjectMgr::CheckScripts(ScriptsType type, std::set<int32>& ids) -{ - ScriptMapMap* scripts = GetScriptsMapByType(type); - if (!scripts) - return; - - for (ScriptMapMap::const_iterator itrMM = scripts->begin(); itrMM != scripts->end(); ++itrMM) - { - for (ScriptMap::const_iterator itrM = itrMM->second.begin(); itrM != itrMM->second.end(); ++itrM) - { - switch (itrM->second.command) - { - case SCRIPT_COMMAND_TALK: - { - if (!GetTrinityStringLocale (itrM->second.Talk.TextID)) - TC_LOG_ERROR("sql.sql", "Table `%s` references invalid text id %u from `db_script_string`, script id: %u.", GetScriptsTableNameByType(type).c_str(), itrM->second.Talk.TextID, itrMM->first); - - if (ids.find(itrM->second.Talk.TextID) != ids.end()) - ids.erase(itrM->second.Talk.TextID); - } - default: - break; - } - } - } -} - void ObjectMgr::LoadBroadcastTexts() { uint32 oldMSTime = getMSTime(); @@ -8797,23 +8764,6 @@ void ObjectMgr::LoadBroadcastTextLocales() TC_LOG_INFO("server.loading", ">> Loaded %u broadcast text locales in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); } -void ObjectMgr::LoadDbScriptStrings() -{ - LoadTrinityStrings("db_script_string", MIN_DB_SCRIPT_STRING_ID, MAX_DB_SCRIPT_STRING_ID); - - std::set<int32> ids; - - for (int32 i = MIN_DB_SCRIPT_STRING_ID; i < MAX_DB_SCRIPT_STRING_ID; ++i) - if (GetTrinityStringLocale(i)) - ids.insert(i); - - for (int type = SCRIPTS_FIRST; type < SCRIPTS_LAST; ++type) - CheckScripts(ScriptsType(type), ids); - - for (std::set<int32>::const_iterator itr = ids.begin(); itr != ids.end(); ++itr) - TC_LOG_ERROR("sql.sql", "Table `db_script_string` has unused string id %u", *itr); -} - CreatureBaseStats const* ObjectMgr::GetCreatureBaseStats(uint8 level, uint8 unitClass) { CreatureBaseStatsContainer::const_iterator it = _creatureBaseStatsStore.find(MAKE_PAIR16(level, unitClass)); diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index dc9196dd0df..d15ca257d67 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -466,8 +466,6 @@ typedef std::unordered_map<uint32/*(mapid, spawnMode) pair*/, CellObjectGuidsMap // Trinity string ranges #define MIN_TRINITY_STRING_ID 1 // 'trinity_string' #define MAX_TRINITY_STRING_ID 2000000000 -#define MIN_DB_SCRIPT_STRING_ID MAX_TRINITY_STRING_ID // 'db_script_string' -#define MAX_DB_SCRIPT_STRING_ID 2000010000 // Trinity Trainer Reference start range #define TRINITY_TRAINER_START_REF 200000 @@ -968,7 +966,6 @@ class ObjectMgr void LoadBroadcastTextLocales(); bool LoadTrinityStrings(char const* table, int32 min_value, int32 max_value); bool LoadTrinityStrings() { return LoadTrinityStrings("trinity_string", MIN_TRINITY_STRING_ID, MAX_TRINITY_STRING_ID); } - void LoadDbScriptStrings(); void LoadCreatureClassLevelStats(); void LoadCreatureLocales(); void LoadCreatureTemplates(); @@ -1386,7 +1383,6 @@ class ObjectMgr private: void LoadScripts(ScriptsType type); - void CheckScripts(ScriptsType type, std::set<int32>& ids); void LoadQuestRelationsHelper(QuestRelations& map, QuestRelationsReverse* reverseMap, std::string const& table, bool starter, bool go); void PlayerCreateInfoAddItemHelper(uint32 race_, uint32 class_, uint32 itemId, int32 count); diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index 88a83ab6fde..4becedfe41a 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -226,7 +226,7 @@ void Group::LoadMemberFromDB(uint32 guidLow, uint8 memberFlags, uint8 subgroup, void Group::ConvertToLFG() { - m_groupType = GroupType(m_groupType | GROUPTYPE_LFG | GROUPTYPE_UNK1); + m_groupType = GroupType(m_groupType | GROUPTYPE_LFG | GROUPTYPE_LFG_RESTRICTED); m_lootMethod = NEED_BEFORE_GREED; if (!isBGGroup() && !isBFGroup()) { diff --git a/src/server/game/Groups/Group.h b/src/server/game/Groups/Group.h index 08f91ca816a..59f77a06308 100644 --- a/src/server/game/Groups/Group.h +++ b/src/server/game/Groups/Group.h @@ -82,13 +82,15 @@ enum GroupMemberAssignment enum GroupType { - GROUPTYPE_NORMAL = 0x00, - GROUPTYPE_BG = 0x01, - GROUPTYPE_RAID = 0x02, - GROUPTYPE_BGRAID = GROUPTYPE_BG | GROUPTYPE_RAID, // mask - GROUPTYPE_UNK1 = 0x04, - GROUPTYPE_LFG = 0x08 + GROUPTYPE_NORMAL = 0x00, + GROUPTYPE_BG = 0x01, + GROUPTYPE_RAID = 0x02, + GROUPTYPE_BGRAID = GROUPTYPE_BG | GROUPTYPE_RAID, // mask + GROUPTYPE_LFG_RESTRICTED = 0x04, // Script_HasLFGRestrictions() + GROUPTYPE_LFG = 0x08, // 0x10, leave/change group?, I saw this flag when leaving group and after leaving BG while in group + // GROUPTYPE_ONE_PERSON_PARTY = 0x20, 4.x Script_IsOnePersonParty() + // GROUPTYPE_EVERYONE_ASSISTANT = 0x40 4.x Script_IsEveryoneAssistant() }; enum GroupUpdateFlags diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp index eccf7a6fd38..e820f23299d 100644 --- a/src/server/game/Handlers/ChatHandler.cpp +++ b/src/server/game/Handlers/ChatHandler.cpp @@ -254,11 +254,11 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData) } if (type == CHAT_MSG_SAY) - sender->Say(msg, lang); + sender->Say(msg, Language(lang)); else if (type == CHAT_MSG_EMOTE) sender->TextEmote(msg); else if (type == CHAT_MSG_YELL) - sender->Yell(msg, lang); + sender->Yell(msg, Language(lang)); } break; case CHAT_MSG_WHISPER: { @@ -298,7 +298,7 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData) (HasPermission(rbac::RBAC_PERM_CAN_FILTER_WHISPERS) && !sender->isAcceptWhispers() && !sender->IsInWhisperWhiteList(receiver->GetGUID()))) sender->AddWhisperWhiteList(receiver->GetGUID()); - GetPlayer()->Whisper(msg, lang, receiver->GetGUID()); + GetPlayer()->Whisper(msg, Language(lang), receiver); } break; case CHAT_MSG_PARTY: case CHAT_MSG_PARTY_LEADER: diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index f7c3c8a2be6..50beaa65972 100644 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -298,10 +298,14 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPacket& recvData) // Send next quest if (Quest const* nextQuest = _player->GetNextQuest(guid, quest)) { - if (nextQuest->IsAutoAccept() && _player->CanAddQuest(nextQuest, true) && _player->CanTakeQuest(nextQuest, true)) - _player->AddQuestAndCheckCompletion(nextQuest, object); - - _player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, guid, true); + // Only send the quest to the player if the conditions are met + if (_player->CanTakeQuest(nextQuest, false)) + { + if (nextQuest->IsAutoAccept() && _player->CanAddQuest(nextQuest, true)) + _player->AddQuestAndCheckCompletion(nextQuest, object); + + _player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, guid, true); + } } questgiver->AI()->sQuestReward(_player, quest, reward); @@ -316,10 +320,14 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPacket& recvData) // Send next quest if (Quest const* nextQuest = _player->GetNextQuest(guid, quest)) { - if (nextQuest->IsAutoAccept() && _player->CanAddQuest(nextQuest, true) && _player->CanTakeQuest(nextQuest, true)) - _player->AddQuestAndCheckCompletion(nextQuest, object); - - _player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, guid, true); + // Only send the quest to the player if the conditions are met + if (_player->CanTakeQuest(nextQuest, false)) + { + if (nextQuest->IsAutoAccept() && _player->CanAddQuest(nextQuest, true)) + _player->AddQuestAndCheckCompletion(nextQuest, object); + + _player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, guid, true); + } } questGiver->AI()->QuestReward(_player, quest, reward); diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index c1de3aae7cb..814deba78db 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -1194,7 +1194,6 @@ enum TrinityStrings LANG_NPCINFO_FLAGS_EXTRA = 11009 // NOT RESERVED IDS 12000-1999999999 - // `db_script_string` table index 2000000000-2000009999 (MIN_DB_SCRIPT_STRING_ID-MAX_DB_SCRIPT_STRING_ID) // For other tables maybe 2000010000-2147483647 (max index) }; #endif diff --git a/src/server/game/Scripting/MapScripts.cpp b/src/server/game/Scripting/MapScripts.cpp index 3ccc876e1a2..888c1ec7e8d 100644 --- a/src/server/game/Scripting/MapScripts.cpp +++ b/src/server/game/Scripting/MapScripts.cpp @@ -373,83 +373,49 @@ void Map::ScriptsProcess() switch (step.script->command) { case SCRIPT_COMMAND_TALK: + { if (step.script->Talk.ChatType > CHAT_TYPE_WHISPER && step.script->Talk.ChatType != CHAT_MSG_RAID_BOSS_WHISPER) { TC_LOG_ERROR("scripts", "%s invalid chat type (%u) specified, skipping.", step.script->GetDebugInfo().c_str(), step.script->Talk.ChatType); break; } - if (step.script->Talk.Flags & SF_TALK_USE_PLAYER) - { - if (Player* player = _GetScriptPlayerSourceOrTarget(source, target, step.script)) - { - LocaleConstant loc_idx = player->GetSession()->GetSessionDbLocaleIndex(); - std::string text(sObjectMgr->GetTrinityString(step.script->Talk.TextID, loc_idx)); + Unit* source = nullptr; - switch (step.script->Talk.ChatType) - { - case CHAT_TYPE_SAY: - player->Say(text, LANG_UNIVERSAL); - break; - case CHAT_TYPE_YELL: - player->Yell(text, LANG_UNIVERSAL); - break; - case CHAT_TYPE_TEXT_EMOTE: - case CHAT_TYPE_BOSS_EMOTE: - player->TextEmote(text); - break; - case CHAT_TYPE_WHISPER: - case CHAT_MSG_RAID_BOSS_WHISPER: - { - uint64 targetGUID = target ? target->GetGUID() : 0; - if (!targetGUID || !IS_PLAYER_GUID(targetGUID)) - TC_LOG_ERROR("scripts", "%s attempt to whisper to non-player unit, skipping.", step.script->GetDebugInfo().c_str()); - else - player->Whisper(text, LANG_UNIVERSAL, targetGUID); - break; - } - default: - break; // must be already checked at load - } - } - } + if (step.script->Talk.Flags & SF_TALK_USE_PLAYER) + source = _GetScriptPlayerSourceOrTarget(source, target, step.script); else + source = _GetScriptCreatureSourceOrTarget(source, target, step.script); + + if (source) { - // Source or target must be Creature. - if (Creature* cSource = _GetScriptCreatureSourceOrTarget(source, target, step.script)) + switch (step.script->Talk.ChatType) { - uint64 targetGUID = target ? target->GetGUID() : 0; - switch (step.script->Talk.ChatType) + case CHAT_TYPE_SAY: + source->Say(step.script->Talk.TextID, target); + break; + case CHAT_TYPE_YELL: + source->Yell(step.script->Talk.TextID, target); + break; + case CHAT_TYPE_TEXT_EMOTE: + case CHAT_TYPE_BOSS_EMOTE: + source->TextEmote(step.script->Talk.TextID, target, step.script->Talk.ChatType == CHAT_TYPE_BOSS_EMOTE); + break; + case CHAT_TYPE_WHISPER: + case CHAT_MSG_RAID_BOSS_WHISPER: { - case CHAT_TYPE_SAY: - cSource->MonsterSay(step.script->Talk.TextID, LANG_UNIVERSAL, target); - break; - case CHAT_TYPE_YELL: - cSource->MonsterYell(step.script->Talk.TextID, LANG_UNIVERSAL, target); - break; - case CHAT_TYPE_TEXT_EMOTE: - cSource->MonsterTextEmote(step.script->Talk.TextID, target); - break; - case CHAT_TYPE_BOSS_EMOTE: - cSource->MonsterTextEmote(step.script->Talk.TextID, target, true); - break; - case CHAT_TYPE_WHISPER: - if (!targetGUID || !IS_PLAYER_GUID(targetGUID)) - TC_LOG_ERROR("scripts", "%s attempt to whisper to non-player unit, skipping.", step.script->GetDebugInfo().c_str()); - else - cSource->MonsterWhisper(step.script->Talk.TextID, target->ToPlayer()); - break; - case CHAT_MSG_RAID_BOSS_WHISPER: - if (!targetGUID || !IS_PLAYER_GUID(targetGUID)) - TC_LOG_ERROR("scripts", "%s attempt to raidbosswhisper to non-player unit, skipping.", step.script->GetDebugInfo().c_str()); - else - cSource->MonsterWhisper(step.script->Talk.TextID, target->ToPlayer(), true); - break; - default: - break; // must be already checked at load + Player* receiver = target ? target->ToPlayer() : nullptr; + if (!receiver) + TC_LOG_ERROR("scripts", "%s attempt to whisper to non-player unit, skipping.", step.script->GetDebugInfo().c_str()); + else + source->Whisper(step.script->Talk.TextID, receiver, step.script->Talk.ChatType == CHAT_MSG_RAID_BOSS_WHISPER); + break; } + default: + break; // must be already checked at load } } break; + } case SCRIPT_COMMAND_EMOTE: // Source or target must be Creature. diff --git a/src/server/game/Server/Protocol/PacketLog.cpp b/src/server/game/Server/Protocol/PacketLog.cpp index 0d5168cc5a9..0a085ccc565 100644 --- a/src/server/game/Server/Protocol/PacketLog.cpp +++ b/src/server/game/Server/Protocol/PacketLog.cpp @@ -93,7 +93,8 @@ void PacketLog::Initialize() header.SniffStartTicks = getMSTime(); header.OptionalDataSize = 0; - fwrite(&header, sizeof(header), 1, _file); + if (CanLogPacket()) + fwrite(&header, sizeof(header), 1, _file); } } diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index f8673e5d5b7..ef92a59a73d 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -119,7 +119,7 @@ bool WorldSocket::ReadHeaderHandler() EndianConvertReverse(header->size); EndianConvert(header->cmd); - if (!header->IsValid()) + if (!header->IsValidSize() || !header->IsValidOpcode()) { if (_worldSession) { @@ -129,7 +129,7 @@ bool WorldSocket::ReadHeaderHandler() } else TC_LOG_ERROR("network", "WorldSocket::ReadHeaderHandler(): client %s sent malformed packet (size: %hu, cmd: %u)", - GetRemoteIpAddress().to_string().c_str(), header->size, header->cmd); + GetRemoteIpAddress().to_string().c_str(), header->size, header->cmd); CloseSocket(); return false; diff --git a/src/server/game/Server/WorldSocket.h b/src/server/game/Server/WorldSocket.h index d301e239340..3355c3d8cca 100644 --- a/src/server/game/Server/WorldSocket.h +++ b/src/server/game/Server/WorldSocket.h @@ -39,7 +39,8 @@ struct ClientPktHeader uint16 size; uint32 cmd; - bool IsValid() const { return size >= 4 && size < 10240 && cmd < NUM_MSG_TYPES; } + bool IsValidSize() const { return size >= 4 && size < 10240; } + bool IsValidOpcode() const { return cmd < NUM_MSG_TYPES; } }; #pragma pack(pop) diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 00b787345d4..adc120ade49 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -3798,7 +3798,7 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex) if (m_caster->getGender() > 0) gender = "her"; sprintf(buf, "%s rubs %s [Decahedral Dwarven Dice] between %s hands and rolls. One %u and one %u.", m_caster->GetName().c_str(), gender, gender, urand(1, 10), urand(1, 10)); - m_caster->MonsterTextEmote(buf, NULL); + m_caster->TextEmote(buf); break; } // Roll 'dem Bones - Worn Troll Dice @@ -3809,7 +3809,7 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex) if (m_caster->getGender() > 0) gender = "her"; sprintf(buf, "%s causually tosses %s [Worn Troll Dice]. One %u and one %u.", m_caster->GetName().c_str(), gender, urand(1, 6), urand(1, 6)); - m_caster->MonsterTextEmote(buf, NULL); + m_caster->TextEmote(buf); break; } // Death Knight Initiate Visual @@ -5783,14 +5783,18 @@ void Spell::EffectPlaySound(SpellEffIndex effIndex) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) + if (!unitTarget) + return; + + Player* player = unitTarget->ToPlayer(); + if (!player) return; switch (m_spellInfo->Id) { case 58730: // Restricted Flight Area case 58600: // Restricted Flight Area - unitTarget->ToPlayer()->GetSession()->SendNotification(LANG_ZONE_NOFLYZONE); + player->GetSession()->SendNotification(LANG_ZONE_NOFLYZONE); break; default: break; @@ -5804,9 +5808,7 @@ void Spell::EffectPlaySound(SpellEffIndex effIndex) return; } - WorldPacket data(SMSG_PLAY_SOUND, 4); - data << uint32(soundId); - unitTarget->ToPlayer()->GetSession()->SendPacket(&data); + player->PlayDirectSound(soundId, player); } void Spell::EffectRemoveAura(SpellEffIndex effIndex) diff --git a/src/server/game/Texts/ChatTextBuilder.h b/src/server/game/Texts/ChatTextBuilder.h new file mode 100644 index 00000000000..72f80bb07a3 --- /dev/null +++ b/src/server/game/Texts/ChatTextBuilder.h @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef __CHATTEXT_BUILDER_H +#define __CHATTEXT_BUILDER_H + +#include "Chat.h" +#include "ObjectMgr.h" + +namespace Trinity +{ + class BroadcastTextBuilder + { + public: + BroadcastTextBuilder(Unit const* obj, ChatMsg msgType, uint32 textId, WorldObject const* target = nullptr, uint32 achievementId = 0) + : _source(obj), _msgType(msgType), _textId(textId), _target(target), _achievementId(achievementId) { } + + void operator()(WorldPacket& data, LocaleConstant locale) + { + BroadcastText const* bct = sObjectMgr->GetBroadcastText(_textId); + ChatHandler::BuildChatPacket(data, _msgType, bct ? Language(bct->Language) : LANG_UNIVERSAL, _source, _target, bct ? bct->GetText(locale, _source->getGender()) : "", _achievementId, "", locale); + } + + size_t operator()(WorldPacket* data, LocaleConstant locale) const + { + BroadcastText const* bct = sObjectMgr->GetBroadcastText(_textId); + return ChatHandler::BuildChatPacket(*data, _msgType, bct ? Language(bct->Language) : LANG_UNIVERSAL, _source, _target, bct ? bct->GetText(locale, _source->getGender()) : "", _achievementId, "", locale); + } + + private: + Unit const* _source; + ChatMsg _msgType; + uint32 _textId; + WorldObject const* _target; + uint32 _achievementId; + }; + + class CustomChatTextBuilder + { + public: + CustomChatTextBuilder(WorldObject const* obj, ChatMsg msgType, std::string const& text, Language language = LANG_UNIVERSAL, WorldObject const* target = nullptr) + : _source(obj), _msgType(msgType), _text(text), _language(language), _target(target) { } + + void operator()(WorldPacket& data, LocaleConstant locale) + { + ChatHandler::BuildChatPacket(data, _msgType, _language, _source, _target, _text, 0, "", locale); + } + + private: + WorldObject const* _source; + ChatMsg _msgType; + std::string _text; + Language _language; + WorldObject const* _target; + }; +} +// namespace Trinity + +#endif // __CHATTEXT_BUILDER_H diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 58e3cffa8de..35ad588c0aa 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1702,9 +1702,6 @@ void World::SetInitialWorldSettings() sObjectMgr->LoadEventScripts(); // must be after load Creature/Gameobject(Template/Data) sObjectMgr->LoadWaypointScripts(); - TC_LOG_INFO("server.loading", "Loading Scripts text locales..."); // must be after Load*Scripts calls - sObjectMgr->LoadDbScriptStrings(); - TC_LOG_INFO("server.loading", "Loading spell script names..."); sObjectMgr->LoadSpellScriptNames(); diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index 3e7b242f3cc..e248a835ee0 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -2266,7 +2266,7 @@ public: // Get the args that we might have (up to 2) char const* arg1 = strtok((char*)args, " "); char const* arg2 = strtok(NULL, " "); - + // Analyze them to see if we got either a playerName or duration or both if (arg1) { @@ -2452,7 +2452,7 @@ public: } WorldPacket data(SMSG_PLAY_SOUND, 4); - data << uint32(soundId) << handler->GetSession()->GetPlayer()->GetGUID(); + data << uint32(soundId); sWorld->SendGlobalMessage(&data); handler->PSendSysMessage(LANG_COMMAND_PLAYED_TO_ALL, soundId); diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp index 66988b499d2..00e5fc22d92 100644 --- a/src/server/scripts/Commands/cs_npc.cpp +++ b/src/server/scripts/Commands/cs_npc.cpp @@ -761,8 +761,8 @@ public: handler->PSendSysMessage(npcFlagTexts[i].Name, npcFlagTexts[i].Value); handler->PSendSysMessage(LANG_NPCINFO_MECHANIC_IMMUNE, mechanicImmuneMask); - for (uint8 i = 0; i < MAX_MECHANIC; ++i) - if ((mechanicImmuneMask << 1) & mechanicImmunes[i].Value) + for (uint8 i = 1; i < MAX_MECHANIC; ++i) + if (mechanicImmuneMask & (1 << (mechanicImmunes[i].Value - 1))) handler->PSendSysMessage("%s (0x%X)", mechanicImmunes[i].Name, mechanicImmunes[i].Value); return true; @@ -1222,7 +1222,7 @@ public: return false; } - creature->MonsterSay(args, LANG_UNIVERSAL, NULL); + creature->Say(args, LANG_UNIVERSAL); // make some emotes char lastchar = args[strlen(args) - 1]; @@ -1251,7 +1251,7 @@ public: return false; } - creature->MonsterTextEmote(args, 0); + creature->TextEmote(args); return true; } @@ -1297,14 +1297,29 @@ public: static bool HandleNpcWhisperCommand(ChatHandler* handler, char const* args) { if (!*args) + { + handler->SendSysMessage(LANG_CMD_SYNTAX); + handler->SetSentErrorMessage(true); return false; + } char* receiver_str = strtok((char*)args, " "); char* text = strtok(NULL, ""); + if (!receiver_str || !text) + { + handler->SendSysMessage(LANG_CMD_SYNTAX); + handler->SetSentErrorMessage(true); + return false; + } + Creature* creature = handler->getSelectedCreature(); - if (!creature || !receiver_str || !text) + if (!creature) + { + handler->SendSysMessage(LANG_SELECT_CREATURE); + handler->SetSentErrorMessage(true); return false; + } uint64 receiver_guid = atol(receiver_str); @@ -1313,14 +1328,18 @@ public: if (handler->HasLowerSecurity(receiver, 0)) return false; - creature->MonsterWhisper(text, receiver); + creature->Whisper(text, LANG_UNIVERSAL, receiver); return true; } static bool HandleNpcYellCommand(ChatHandler* handler, char const* args) { if (!*args) + { + handler->SendSysMessage(LANG_CMD_SYNTAX); + handler->SetSentErrorMessage(true); return false; + } Creature* creature = handler->getSelectedCreature(); if (!creature) @@ -1330,7 +1349,7 @@ public: return false; } - creature->MonsterYell(args, LANG_UNIVERSAL, NULL); + creature->Yell(args, LANG_UNIVERSAL); // make an emote creature->HandleEmoteCommand(EMOTE_ONESHOT_SHOUT); diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp index 70aacbfc227..5f061fab595 100644 --- a/src/server/scripts/Commands/cs_reload.cpp +++ b/src/server/scripts/Commands/cs_reload.cpp @@ -88,7 +88,6 @@ public: { "creature_queststarter", rbac::RBAC_PERM_COMMAND_RELOAD_CREATURE_QUESTSTARTER, true, &HandleReloadCreatureQuestStarterCommand, "", NULL }, { "creature_summon_groups", rbac::RBAC_PERM_COMMAND_RELOAD_CREATURE_SUMMON_GROUPS, true, &HandleReloadCreatureSummonGroupsCommand, "", NULL }, { "creature_template", rbac::RBAC_PERM_COMMAND_RELOAD_CREATURE_TEMPLATE, true, &HandleReloadCreatureTemplateCommand, "", NULL }, - //{ "db_script_string", rbac::RBAC_PERM_COMMAND_RELOAD_, true, &HandleReloadDbScriptStringCommand, "", NULL }, { "disables", rbac::RBAC_PERM_COMMAND_RELOAD_DISABLES, true, &HandleReloadDisablesCommand, "", NULL }, { "disenchant_loot_template", rbac::RBAC_PERM_COMMAND_RELOAD_DISENCHANT_LOOT_TEMPLATE, true, &HandleReloadLootTemplatesDisenchantCommand, "", NULL }, { "event_scripts", rbac::RBAC_PERM_COMMAND_RELOAD_EVENT_SCRIPTS, true, &HandleReloadEventScriptsCommand, "", NULL }, @@ -266,7 +265,6 @@ public: HandleReloadEventScriptsCommand(handler, "a"); HandleReloadSpellScriptsCommand(handler, "a"); handler->SendGlobalGMSysMessage("DB tables `*_scripts` reloaded."); - HandleReloadDbScriptStringCommand(handler, "a"); HandleReloadWpScriptsCommand(handler, "a"); HandleReloadWpCommand(handler, "a"); return true; @@ -960,14 +958,6 @@ public: return true; } - static bool HandleReloadDbScriptStringCommand(ChatHandler* handler, const char* /*args*/) - { - TC_LOG_INFO("misc", "Re-Loading Script strings from `db_script_string`..."); - sObjectMgr->LoadDbScriptStrings(); - handler->SendGlobalGMSysMessage("DB table `db_script_string` reloaded."); - return true; - } - static bool HandleReloadGameGraveyardZoneCommand(ChatHandler* handler, const char* /*args*/) { TC_LOG_INFO("misc", "Re-Loading Graveyard-zone links..."); diff --git a/src/server/scripts/Commands/cs_wp.cpp b/src/server/scripts/Commands/cs_wp.cpp index 647d8b49c1b..0c11c77af6a 100644 --- a/src/server/scripts/Commands/cs_wp.cpp +++ b/src/server/scripts/Commands/cs_wp.cpp @@ -214,7 +214,7 @@ public: target->LoadPath(pathid); target->SetDefaultMovementType(WAYPOINT_MOTION_TYPE); target->GetMotionMaster()->Initialize(); - target->MonsterSay("Path loaded.", LANG_UNIVERSAL, NULL); + target->Say("Path loaded.", LANG_UNIVERSAL); return true; } @@ -267,7 +267,7 @@ public: target->SetDefaultMovementType(IDLE_MOTION_TYPE); target->GetMotionMaster()->MoveTargetedHome(); target->GetMotionMaster()->Initialize(); - target->MonsterSay("Path unloaded.", LANG_UNIVERSAL, NULL); + target->Say("Path unloaded.", LANG_UNIVERSAL); return true; } diff --git a/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp index ca46ff36079..651e487522d 100644 --- a/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp +++ b/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp @@ -72,7 +72,7 @@ public: void Reset() override { Initialize(); - + events.Reset(); summons.DespawnAll(); } diff --git a/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp b/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp index c5f4f9cdbf9..4869ffc4756 100644 --- a/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp +++ b/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp @@ -28,7 +28,6 @@ EndScriptData */ #include "deadmines.h" #include "TemporarySummon.h" #include "WorldPacket.h" -#include "Opcodes.h" enum Sounds { @@ -101,9 +100,9 @@ class instance_deadmines : public InstanceMapScript case CANNON_GUNPOWDER_USED: CannonBlast_Timer = DATA_CANNON_BLAST_TIMER; // it's a hack - Mr. Smite should do that but his too far away - pIronCladDoor->SetName("Mr. Smite"); - pIronCladDoor->MonsterYell(SAY_MR_SMITE_ALARM1, LANG_UNIVERSAL, NULL); - DoPlaySound(pIronCladDoor, SOUND_MR_SMITE_ALARM1); + //pIronCladDoor->SetName("Mr. Smite"); + //pIronCladDoor->MonsterYell(SAY_MR_SMITE_ALARM1, LANG_UNIVERSAL, NULL); + pIronCladDoor->PlayDirectSound(SOUND_MR_SMITE_ALARM1); State = CANNON_BLAST_INITIATED; break; case CANNON_BLAST_INITIATED: @@ -114,8 +113,8 @@ class instance_deadmines : public InstanceMapScript ShootCannon(); BlastOutDoor(); LeverStucked(); - pIronCladDoor->MonsterYell(SAY_MR_SMITE_ALARM2, LANG_UNIVERSAL, NULL); - DoPlaySound(pIronCladDoor, SOUND_MR_SMITE_ALARM2); + //pIronCladDoor->MonsterYell(SAY_MR_SMITE_ALARM2, LANG_UNIVERSAL, NULL); + pIronCladDoor->PlayDirectSound(SOUND_MR_SMITE_ALARM2); State = PIRATES_ATTACK; } else CannonBlast_Timer -= diff; break; @@ -170,7 +169,7 @@ class instance_deadmines : public InstanceMapScript if (GameObject* pDefiasCannon = instance->GetGameObject(DefiasCannonGUID)) { pDefiasCannon->SetGoState(GO_STATE_ACTIVE); - DoPlaySound(pDefiasCannon, SOUND_CANNONFIRE); + pDefiasCannon->PlayDirectSound(SOUND_CANNONFIRE); } } @@ -179,7 +178,7 @@ class instance_deadmines : public InstanceMapScript if (GameObject* pIronCladDoor = instance->GetGameObject(IronCladDoorGUID)) { pIronCladDoor->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); - DoPlaySound(pIronCladDoor, SOUND_DESTROYDOOR); + pIronCladDoor->PlayDirectSound(SOUND_DESTROYDOOR); } } @@ -238,13 +237,6 @@ class instance_deadmines : public InstanceMapScript return 0; } - - void DoPlaySound(GameObject* unit, uint32 sound) - { - WorldPacket data(SMSG_PLAY_SOUND, 4); - data << uint32(sound); - unit->SendMessageToSet(&data, false); - } }; InstanceScript* GetInstanceScript(InstanceMap* map) const override diff --git a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp index c37829e26d5..716b32601be 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp @@ -560,25 +560,25 @@ public: { case 0: return 9999999; case 1: - me->MonsterYell(SAY_DIALOG_MEDIVH_1, LANG_UNIVERSAL, NULL); + me->Yell(SAY_DIALOG_MEDIVH_1, LANG_UNIVERSAL); return 10000; case 2: if (arca) - arca->MonsterYell(SAY_DIALOG_ARCANAGOS_2, LANG_UNIVERSAL, NULL); + arca->Yell(SAY_DIALOG_ARCANAGOS_2, LANG_UNIVERSAL); return 20000; case 3: - me->MonsterYell(SAY_DIALOG_MEDIVH_3, LANG_UNIVERSAL, NULL); + me->Yell(SAY_DIALOG_MEDIVH_3, LANG_UNIVERSAL); return 10000; case 4: if (arca) - arca->MonsterYell(SAY_DIALOG_ARCANAGOS_4, LANG_UNIVERSAL, NULL); + arca->Yell(SAY_DIALOG_ARCANAGOS_4, LANG_UNIVERSAL); return 20000; case 5: - me->MonsterYell(SAY_DIALOG_MEDIVH_5, LANG_UNIVERSAL, NULL); + me->Yell(SAY_DIALOG_MEDIVH_5, LANG_UNIVERSAL); return 20000; case 6: if (arca) - arca->MonsterYell(SAY_DIALOG_ARCANAGOS_6, LANG_UNIVERSAL, NULL); + arca->Yell(SAY_DIALOG_ARCANAGOS_6, LANG_UNIVERSAL); return 10000; case 7: FireArcanagosTimer = 500; @@ -588,7 +588,7 @@ public: DoCast(me, SPELL_MANA_SHIELD); return 10000; case 9: - me->MonsterTextEmote(EMOTE_DIALOG_MEDIVH_7, NULL, false); + me->TextEmote(EMOTE_DIALOG_MEDIVH_7); return 10000; case 10: if (arca) @@ -596,7 +596,7 @@ public: return 1000; case 11: if (arca) - arca->MonsterYell(SAY_DIALOG_ARCANAGOS_8, LANG_UNIVERSAL, NULL); + arca->Yell(SAY_DIALOG_ARCANAGOS_8, LANG_UNIVERSAL); return 5000; case 12: if (arca) @@ -608,7 +608,7 @@ public: } return 10000; case 13: - me->MonsterYell(SAY_DIALOG_MEDIVH_9, LANG_UNIVERSAL, NULL); + me->Yell(SAY_DIALOG_MEDIVH_9, LANG_UNIVERSAL); return 10000; case 14: me->SetVisible(false); diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp index 0733640f4c3..b9429954dea 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp @@ -352,7 +352,7 @@ public: Creature* speaker = DoSpawnCreature(HELPER, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 1000); if (speaker) speaker->CastSpell(speaker, SPELL_HEAD_SPEAKS, false); - me->MonsterTextEmote(EMOTE_LAUGHS, NULL); + me->TextEmote(EMOTE_LAUGHS); } else laugh -= diff; } @@ -670,14 +670,14 @@ public: if (count < 3) { if (player) - player->Say(Text[count], 0); + player->Say(Text[count], LANG_UNIVERSAL); } else { DoCast(me, SPELL_RHYME_BIG); if (player) { - player->Say(Text[count], 0); + player->Say(Text[count], LANG_UNIVERSAL); player->HandleEmoteCommand(ANIM_EMOTE_SHOUT); } wp_reached = true; @@ -735,7 +735,7 @@ public: if (laugh <= diff) { laugh = urand(11000, 22000); - me->MonsterTextEmote(EMOTE_LAUGHS, NULL); + me->TextEmote(EMOTE_LAUGHS); DoPlaySoundToSet(me, RandomLaugh[rand32() % 3]); } else laugh -= diff; diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp index b218e3f2978..c5f7a5da6d7 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp @@ -21,7 +21,7 @@ enum Spells { SPELL_CURSE_OF_BLOOD = 24673, - SPELL_ILLUSION = 17773, + SPELL_ILLUSION = 17773 }; enum Events @@ -113,7 +113,7 @@ public: CreatureAI* GetAI(Creature* creature) const override { - return new boss_jandicebarovAI(creature); + return GetInstanceAI<boss_jandicebarovAI>(creature); } }; diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp index 897799a708c..348e2212870 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp @@ -81,7 +81,7 @@ public: events.ScheduleEvent(EVENT_ICE_ARMOR, 180000); break; case EVENT_FROSTBOLT: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true)) DoCast(target, SPELL_FROSTBOLT); events.ScheduleEvent(EVENT_FROSTBOLT, 8000); break; diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp index 792649f2998..f5b1dc34062 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp @@ -89,6 +89,7 @@ public: case EVENT_BLAST_WAVE: DoCast(me, SPELL_BLAST_WAVE); events.ScheduleEvent(EVENT_BLAST_WAVE, 12000); + break; case EVENT_FRENZY: DoCast(me, SPELL_FRENZY); Talk(EMOTE_FRENZY); @@ -106,7 +107,6 @@ public: EventMap events; }; - CreatureAI* GetAI(Creature* creature) const override { return new boss_vectusAI(creature); diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp index 3284febb9f3..60bfae36f47 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp @@ -769,7 +769,7 @@ public: } else { - me->MonsterTextEmote(EMOTE_UNABLE_TO_FIND, NULL); + me->TextEmote(EMOTE_UNABLE_TO_FIND); EnterEvadeMode(); return; } diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp index 3c9d4397d24..077597e4706 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp @@ -306,7 +306,7 @@ class boss_hexlord_malacrass : public CreatureScript instance->SetData(DATA_HEXLORDEVENT, IN_PROGRESS); DoZoneInCombat(); - me->MonsterYell(YELL_AGGRO, LANG_UNIVERSAL, NULL); + me->Yell(YELL_AGGRO, LANG_UNIVERSAL); DoPlaySoundToSet(me, SOUND_YELL_AGGRO); for (uint8 i = 0; i < 4; ++i) @@ -327,11 +327,11 @@ class boss_hexlord_malacrass : public CreatureScript switch (urand(0, 1)) { case 0: - me->MonsterYell(YELL_KILL_ONE, LANG_UNIVERSAL, NULL); + me->Yell(YELL_KILL_ONE, LANG_UNIVERSAL); DoPlaySoundToSet(me, SOUND_YELL_KILL_ONE); break; case 1: - me->MonsterYell(YELL_KILL_TWO, LANG_UNIVERSAL, NULL); + me->Yell(YELL_KILL_TWO, LANG_UNIVERSAL); DoPlaySoundToSet(me, SOUND_YELL_KILL_TWO); break; } @@ -341,7 +341,7 @@ class boss_hexlord_malacrass : public CreatureScript { instance->SetData(DATA_HEXLORDEVENT, DONE); - me->MonsterYell(YELL_DEATH, LANG_UNIVERSAL, NULL); + me->Yell(YELL_DEATH, LANG_UNIVERSAL); DoPlaySoundToSet(me, SOUND_YELL_DEATH); for (uint8 i = 0; i < 4; ++i) @@ -415,7 +415,7 @@ class boss_hexlord_malacrass : public CreatureScript if (DrainPower_Timer <= diff) { DoCast(me, SPELL_DRAIN_POWER, true); - me->MonsterYell(YELL_DRAIN_POWER, LANG_UNIVERSAL, NULL); + me->Yell(YELL_DRAIN_POWER, LANG_UNIVERSAL); DoPlaySoundToSet(me, SOUND_YELL_DRAIN_POWER); DrainPower_Timer = urand(40000, 55000); // must cast in 60 sec, or buff/debuff will disappear } else DrainPower_Timer -= diff; @@ -427,7 +427,7 @@ class boss_hexlord_malacrass : public CreatureScript else { DoCast(me, SPELL_SPIRIT_BOLTS, false); - me->MonsterYell(YELL_SPIRIT_BOLTS, LANG_UNIVERSAL, NULL); + me->Yell(YELL_SPIRIT_BOLTS, LANG_UNIVERSAL); DoPlaySoundToSet(me, SOUND_YELL_SPIRIT_BOLTS); SpiritBolts_Timer = 40000; SiphonSoul_Timer = 10000; // ready to drain diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp index c9c028021f1..279ca60a484 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp @@ -227,7 +227,7 @@ class boss_nalorakk : public CreatureScript case 0: if (me->IsWithinDistInMap(who, 50)) { - me->MonsterYell(YELL_NALORAKK_WAVE1, LANG_UNIVERSAL, NULL); + me->Yell(YELL_NALORAKK_WAVE1, LANG_UNIVERSAL); DoPlaySoundToSet(me, SOUND_NALORAKK_WAVE1); (*me).GetMotionMaster()->MovePoint(1, NalorakkWay[1][0], NalorakkWay[1][1], NalorakkWay[1][2]); @@ -240,7 +240,7 @@ class boss_nalorakk : public CreatureScript case 2: if (me->IsWithinDistInMap(who, 40)) { - me->MonsterYell(YELL_NALORAKK_WAVE2, LANG_UNIVERSAL, NULL); + me->Yell(YELL_NALORAKK_WAVE2, LANG_UNIVERSAL); DoPlaySoundToSet(me, SOUND_NALORAKK_WAVE2); (*me).GetMotionMaster()->MovePoint(3, NalorakkWay[3][0], NalorakkWay[3][1], NalorakkWay[3][2]); @@ -253,7 +253,7 @@ class boss_nalorakk : public CreatureScript case 5: if (me->IsWithinDistInMap(who, 40)) { - me->MonsterYell(YELL_NALORAKK_WAVE3, LANG_UNIVERSAL, NULL); + me->Yell(YELL_NALORAKK_WAVE3, LANG_UNIVERSAL); DoPlaySoundToSet(me, SOUND_NALORAKK_WAVE3); (*me).GetMotionMaster()->MovePoint(6, NalorakkWay[6][0], NalorakkWay[6][1], NalorakkWay[6][2]); @@ -268,7 +268,7 @@ class boss_nalorakk : public CreatureScript { SendAttacker(who); - me->MonsterYell(YELL_NALORAKK_WAVE4, LANG_UNIVERSAL, NULL); + me->Yell(YELL_NALORAKK_WAVE4, LANG_UNIVERSAL); DoPlaySoundToSet(me, SOUND_NALORAKK_WAVE4); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); @@ -287,7 +287,7 @@ class boss_nalorakk : public CreatureScript { instance->SetData(DATA_NALORAKKEVENT, IN_PROGRESS); - me->MonsterYell(YELL_AGGRO, LANG_UNIVERSAL, NULL); + me->Yell(YELL_AGGRO, LANG_UNIVERSAL); DoPlaySoundToSet(me, SOUND_YELL_AGGRO); DoZoneInCombat(); } @@ -296,7 +296,7 @@ class boss_nalorakk : public CreatureScript { instance->SetData(DATA_NALORAKKEVENT, DONE); - me->MonsterYell(YELL_DEATH, LANG_UNIVERSAL, NULL); + me->Yell(YELL_DEATH, LANG_UNIVERSAL); DoPlaySoundToSet(me, SOUND_YELL_DEATH); } @@ -305,11 +305,11 @@ class boss_nalorakk : public CreatureScript switch (urand(0, 1)) { case 0: - me->MonsterYell(YELL_KILL_ONE, LANG_UNIVERSAL, NULL); + me->Yell(YELL_KILL_ONE, LANG_UNIVERSAL); DoPlaySoundToSet(me, SOUND_YELL_KILL_ONE); break; case 1: - me->MonsterYell(YELL_KILL_TWO, LANG_UNIVERSAL, NULL); + me->Yell(YELL_KILL_TWO, LANG_UNIVERSAL); DoPlaySoundToSet(me, SOUND_YELL_KILL_TWO); break; } @@ -373,7 +373,7 @@ class boss_nalorakk : public CreatureScript if (Berserk_Timer <= diff) { DoCast(me, SPELL_BERSERK, true); - me->MonsterYell(YELL_BERSERK, LANG_UNIVERSAL, NULL); + me->Yell(YELL_BERSERK, LANG_UNIVERSAL); DoPlaySoundToSet(me, SOUND_YELL_BERSERK); Berserk_Timer = 600000; } else Berserk_Timer -= diff; @@ -383,7 +383,7 @@ class boss_nalorakk : public CreatureScript if (inBearForm) { // me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, 5122); - me->MonsterYell(YELL_SHIFTEDTOTROLL, LANG_UNIVERSAL, NULL); + me->Yell(YELL_SHIFTEDTOTROLL, LANG_UNIVERSAL); DoPlaySoundToSet(me, SOUND_YELL_TOTROLL); me->RemoveAurasDueToSpell(SPELL_BEARFORM); Surge_Timer = urand(15000, 20000); @@ -395,7 +395,7 @@ class boss_nalorakk : public CreatureScript else { // me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, 0); - me->MonsterYell(YELL_SHIFTEDTOBEAR, LANG_UNIVERSAL, NULL); + me->Yell(YELL_SHIFTEDTOBEAR, LANG_UNIVERSAL); DoPlaySoundToSet(me, SOUND_YELL_TOBEAR); DoCast(me, SPELL_BEARFORM, true); LaceratingSlash_Timer = 2000; // dur 18s @@ -426,7 +426,7 @@ class boss_nalorakk : public CreatureScript if (Surge_Timer <= diff) { - me->MonsterYell(YELL_SURGE, LANG_UNIVERSAL, NULL); + me->Yell(YELL_SURGE, LANG_UNIVERSAL); DoPlaySoundToSet(me, SOUND_YELL_SURGE); Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 45, true); if (target) diff --git a/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp b/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp index 84f650ec9f4..598717a1c3b 100644 --- a/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp +++ b/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp @@ -280,7 +280,7 @@ public: { case 0: if (WaitTimer == WAIT_SECS) - me->MonsterSay(NPCSAY_INIT, LANG_UNIVERSAL, NULL); //no blizzlike + me->Say(NPCSAY_INIT, LANG_UNIVERSAL); //no blizzlike if (WaitTimer <= diff) { @@ -310,7 +310,7 @@ public: { if (Player* player = ObjectAccessor::GetPlayer(*me, PlayerGUID)) { - me->MonsterSay(NPCSAY_END, LANG_UNIVERSAL, NULL); //not blizzlike + me->Say(NPCSAY_END, LANG_UNIVERSAL); //not blizzlike player->GroupEventHappens(QUEST_PYREWOOD_AMBUSH, me); } } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp index a7fa54b12e1..b5c226b15cb 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp @@ -940,7 +940,7 @@ void hyjalAI::WaypointReached(uint32 waypointId) { if (waypointId == 1 || (waypointId == 0 && me->GetEntry() == THRALL)) { - me->MonsterYell(YELL_HURRY, LANG_UNIVERSAL, NULL); + me->Yell(YELL_HURRY, LANG_UNIVERSAL); WaitForTeleport = true; TeleportTimer = 20000; if (me->GetEntry() == JAINA) diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp index 6c718a4a16a..69eba98f406 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp @@ -29,7 +29,6 @@ EndScriptData */ #include "hyjal_trash.h" #include "Player.h" #include "WorldPacket.h" -#include "Opcodes.h" #include "Chat.h" /* Battle of Mount Hyjal encounters: @@ -185,15 +184,12 @@ public: for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) { - if (i->GetSource()) + if (Player* player = i->GetSource()) { WorldPacket packet; - ChatHandler::BuildChatPacket(packet, CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, unit, i->GetSource(), YELL_EFFORTS); - i->GetSource()->GetSession()->SendPacket(&packet); - - WorldPacket data2(SMSG_PLAY_SOUND, 4); - data2 << 10986; - i->GetSource()->GetSession()->SendPacket(&data2); + ChatHandler::BuildChatPacket(packet, CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, unit, player, YELL_EFFORTS); + player->SendDirectMessage(&packet); + player->PlayDirectSound(10986, player); } } } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp index 0a666488e84..fa87247f19f 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp @@ -87,14 +87,14 @@ public: { Initialize(); - instance->SetData(DATA_EPOCH_EVENT, NOT_STARTED); + instance->SetBossState(DATA_EPOCH, NOT_STARTED); } void EnterCombat(Unit* /*who*/) override { Talk(SAY_AGGRO); - instance->SetData(DATA_EPOCH_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_EPOCH, IN_PROGRESS); } void UpdateAI(uint32 diff) override @@ -136,7 +136,7 @@ public: { Talk(SAY_DEATH); - instance->SetData(DATA_EPOCH_EVENT, DONE); + instance->SetBossState(DATA_EPOCH, DONE); } void KilledUnit(Unit* victim) override diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite_corruptor.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite_corruptor.cpp index f3333c0b0b6..d693ec38e44 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite_corruptor.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite_corruptor.cpp @@ -22,7 +22,9 @@ enum Spells { SPELL_CORRUPTING_BLIGHT = 60588, - SPELL_VOID_STRIKE = 60590 + SPELL_VOID_STRIKE = 60590, + SPELL_CORRUPTION_OF_TIME_CHANNEL = 60422, + SPELL_CORRUPTION_OF_TIME_TARGET = 60451 }; enum Yells @@ -32,52 +34,78 @@ enum Yells SAY_FAIL = 2 }; -class boss_infinite_corruptor : public CreatureScript +enum Events { -public: - boss_infinite_corruptor() : CreatureScript("boss_infinite_corruptor") { } + EVENT_CORRUPTING_BLIGHT = 1, + EVENT_VOID_STRIKE +}; - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<boss_infinite_corruptorAI>(creature); - } +class boss_infinite_corruptor : public CreatureScript +{ + public: + boss_infinite_corruptor() : CreatureScript("boss_infinite_corruptor") { } - struct boss_infinite_corruptorAI : public ScriptedAI - { - boss_infinite_corruptorAI(Creature* creature) : ScriptedAI(creature) + struct boss_infinite_corruptorAI : public BossAI { - instance = creature->GetInstanceScript(); - } + boss_infinite_corruptorAI(Creature* creature) : BossAI(creature, DATA_INFINITE) { } - InstanceScript* instance; + void Reset() override + { + _Reset(); - void Reset() override - { - instance->SetData(DATA_INFINITE_EVENT, NOT_STARTED); - } + if (Creature* guardian = me->FindNearestCreature(NPC_GUARDIAN_OF_TIME, 100.0f)) + { + DoCast((Unit*)NULL, SPELL_CORRUPTION_OF_TIME_CHANNEL, false); + guardian->CastSpell(guardian, SPELL_CORRUPTION_OF_TIME_TARGET, false); + } + } - void EnterCombat(Unit* /*who*/) override - { - Talk(SAY_AGGRO); - instance->SetData(DATA_INFINITE_EVENT, IN_PROGRESS); - } + void EnterCombat(Unit* /*who*/) override + { + Talk(SAY_AGGRO); + _EnterCombat(); + events.ScheduleEvent(EVENT_CORRUPTING_BLIGHT, 7000); + events.ScheduleEvent(EVENT_VOID_STRIKE, 5000); + } - void UpdateAI(uint32 /*diff*/) override - { - //Return since we have no target - if (!UpdateVictim()) - return; + void JustDied(Unit* /*killer*/) override + { + Talk(SAY_DEATH); + _JustDied(); - DoMeleeAttackIfReady(); - } + if (Creature* guardian = me->FindNearestCreature(NPC_GUARDIAN_OF_TIME, 100.0f)) + { + guardian->RemoveAurasDueToSpell(SPELL_CORRUPTION_OF_TIME_TARGET); + guardian->DespawnOrUnsummon(5000); + } - void JustDied(Unit* /*killer*/) override + if (Creature* rift = me->FindNearestCreature(NPC_TIME_RIFT, 100.0f)) + rift->DespawnOrUnsummon(); + } + + void ExecuteEvent(uint32 eventId) override + { + switch (eventId) + { + case EVENT_CORRUPTING_BLIGHT: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 60.0f, true)) + DoCast(target, SPELL_CORRUPTING_BLIGHT); + events.ScheduleEvent(EVENT_CORRUPTING_BLIGHT, 17000); + break; + case EVENT_VOID_STRIKE: + DoCastVictim(SPELL_VOID_STRIKE); + events.ScheduleEvent(EVENT_VOID_STRIKE, 5000); + break; + default: + break; + } + } + }; + + CreatureAI* GetAI(Creature* creature) const override { - Talk(SAY_DEATH); - instance->SetData(DATA_INFINITE_EVENT, DONE); + return GetInstanceAI<boss_infinite_corruptorAI>(creature); } - }; - }; void AddSC_boss_infinite_corruptor() diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp index d9356b724c0..7b3314ef4e9 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp @@ -26,15 +26,13 @@ Script Data End */ #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "culling_of_stratholme.h" +#include "Player.h" enum Spells { SPELL_CARRION_SWARM = 52720, //A cresting wave of chaotic magic splashes over enemies in front of the caster, dealing 3230 to 3570 Shadow damage and 380 to 420 Shadow damage every 3 sec. for 15 sec. - H_SPELL_CARRION_SWARM = 58852, SPELL_MIND_BLAST = 52722, //Inflicts 4163 to 4837 Shadow damage to an enemy. - H_SPELL_MIND_BLAST = 58850, SPELL_SLEEP = 52721, //Puts an enemy to sleep for up to 10 sec. Any damage caused will awaken the target. - H_SPELL_SLEEP = 58849, SPELL_VAMPIRIC_TOUCH = 52723, //Heals the caster for half the damage dealt by a melee attack. SPELL_MAL_GANIS_KILL_CREDIT = 58124, // Quest credit SPELL_KILL_CREDIT = 58630 // Non-existing spell as encounter credit, created in spell_dbc @@ -75,7 +73,6 @@ public: { Initialize(); instance = creature->GetInstanceScript(); - uiOutroStep = 0; } void Initialize() @@ -108,14 +105,13 @@ public: void Reset() override { Initialize(); - - instance->SetData(DATA_MAL_GANIS_EVENT, NOT_STARTED); + instance->SetBossState(DATA_MAL_GANIS, NOT_STARTED); } void EnterCombat(Unit* /*who*/) override { Talk(SAY_AGGRO); - instance->SetData(DATA_MAL_GANIS_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_MAL_GANIS, IN_PROGRESS); } void DamageTaken(Unit* done_by, uint32 &damage) override @@ -159,7 +155,7 @@ public: { EnterEvadeMode(); me->DisappearAndDie(); - instance->SetData(DATA_MAL_GANIS_EVENT, FAIL); + instance->SetBossState(DATA_MAL_GANIS, FAIL); } if (uiCarrionSwarmTimer < diff) @@ -197,7 +193,7 @@ public: switch (uiOutroStep) { case 1: - Talk(SAY_ESCAPE_SPEECH_1); + Talk(SAY_OUTRO); me->GetMotionMaster()->MoveTargetedHome(); ++uiOutroStep; uiOutroTimer = 8000; @@ -212,7 +208,7 @@ public: case 3: Talk(SAY_OUTRO); ++uiOutroStep; - uiOutroTimer = 16000; + //uiOutroTimer = 16000; break; case 4: me->HandleEmoteCommand(33); @@ -232,8 +228,8 @@ public: void JustDied(Unit* /*killer*/) override { - instance->SetData(DATA_MAL_GANIS_EVENT, DONE); - DoCastAOE(SPELL_MAL_GANIS_KILL_CREDIT); + instance->SetBossState(DATA_MAL_GANIS, DONE); + DoCastAOE(SPELL_MAL_GANIS_KILL_CREDIT, true); // give achievement credit and LFG rewards to players. criteria use spell 58630 which doesn't exist, but it was created in spell_dbc DoCastAOE(SPELL_KILL_CREDIT); } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp index c961bf9b2c6..10ee66c86d0 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp @@ -15,14 +15,6 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* Script Data Start -SDName: Boss meathook -SDAuthor: Tartalo -SD%Complete: 100 -SDComment: It may need timer adjustment -SDCategory: -Script Data End */ - #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "culling_of_stratholme.h" @@ -30,9 +22,7 @@ Script Data End */ enum Spells { SPELL_CONSTRICTING_CHAINS = 52696, //Encases the targets in chains, dealing 1800 Physical damage every 1 sec. and stunning the target for 5 sec. - H_SPELL_CONSTRICTING_CHAINS = 58823, SPELL_DISEASE_EXPULSION = 52666, //Meathook belches out a cloud of disease, dealing 1710 to 1890 Nature damage and interrupting the spell casting of nearby enemy targets for 4 sec. - H_SPELL_DISEASE_EXPULSION = 58824, SPELL_FRENZY = 58841 //Increases the caster's Physical damage by 10% for 30 sec. }; @@ -44,96 +34,73 @@ enum Yells SAY_DEATH = 3 }; -class boss_meathook : public CreatureScript +enum Events { -public: - boss_meathook() : CreatureScript("boss_meathook") { } - - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<boss_meathookAI>(creature); - } - - struct boss_meathookAI : public ScriptedAI - { - boss_meathookAI(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - instance = creature->GetInstanceScript(); - Talk(SAY_SPAWN); - } - - void Initialize() - { - uiChainTimer = urand(12000, 17000); //seen on video 13, 17, 15, 12, 16 - uiDiseaseTimer = urand(2000, 4000); //approx 3s - uiFrenzyTimer = urand(21000, 26000); //made it up - } - - uint32 uiChainTimer; - uint32 uiDiseaseTimer; - uint32 uiFrenzyTimer; - - InstanceScript* instance; - - void Reset() override - { - Initialize(); - - instance->SetData(DATA_MEATHOOK_EVENT, NOT_STARTED); - } - - void EnterCombat(Unit* /*who*/) override - { - Talk(SAY_AGGRO); + EVENT_CHAIN = 1, + EVENT_DISEASE, + EVENT_FRENZY +}; - instance->SetData(DATA_MEATHOOK_EVENT, IN_PROGRESS); - } +class boss_meathook : public CreatureScript +{ + public: + boss_meathook() : CreatureScript("boss_meathook") { } - void UpdateAI(uint32 diff) override + struct boss_meathookAI : public BossAI { - //Return since we have no target - if (!UpdateVictim()) - return; - - if (uiDiseaseTimer <= diff) + boss_meathookAI(Creature* creature) : BossAI(creature, DATA_MEATHOOK) { - DoCastAOE(SPELL_DISEASE_EXPULSION); - uiDiseaseTimer = urand(1500, 4000); - } else uiDiseaseTimer -= diff; + Talk(SAY_SPAWN); + } - if (uiFrenzyTimer <= diff) + void EnterCombat(Unit* /*who*/) override { - DoCast(me, SPELL_FRENZY); - uiFrenzyTimer = urand(21000, 26000); - } else uiFrenzyTimer -= diff; - - if (uiChainTimer <= diff) + Talk(SAY_AGGRO); + _EnterCombat(); + events.ScheduleEvent(EVENT_CHAIN, urand(12000, 17000)); + events.ScheduleEvent(EVENT_DISEASE, urand(2000, 4000)); + events.ScheduleEvent(EVENT_FRENZY, urand(21000, 26000)); + } + + void ExecuteEvent(uint32 eventId) override { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - DoCast(target, SPELL_CONSTRICTING_CHAINS); //anyone but the tank - uiChainTimer = urand(2000, 4000); - } else uiChainTimer -= diff; - - DoMeleeAttackIfReady(); - } - - void JustDied(Unit* /*killer*/) override - { - Talk(SAY_DEATH); + switch (eventId) + { + case EVENT_CHAIN: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) + DoCast(target, SPELL_CONSTRICTING_CHAINS); + events.ScheduleEvent(EVENT_CHAIN, urand(2000, 4000)); + break; + case EVENT_DISEASE: + DoCastAOE(SPELL_DISEASE_EXPULSION); + events.ScheduleEvent(EVENT_DISEASE, urand(1500, 4000)); + break; + case EVENT_FRENZY: + DoCast(me, SPELL_FRENZY); + events.ScheduleEvent(EVENT_FRENZY, urand(21000, 26000)); + break; + default: + break; + } + } + + void JustDied(Unit* /*killer*/) override + { + Talk(SAY_DEATH); + _JustDied(); + } - instance->SetData(DATA_MEATHOOK_EVENT, DONE); - } + void KilledUnit(Unit* victim) override + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } + }; - void KilledUnit(Unit* victim) override + CreatureAI* GetAI(Creature* creature) const override { - if (victim->GetTypeId() != TYPEID_PLAYER) - return; - - Talk(SAY_SLAY); + return GetInstanceAI<boss_meathookAI>(creature); } - }; - }; void AddSC_boss_meathook() diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp index 1c35a38a5e3..ec7aa742975 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp @@ -15,14 +15,6 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* Script Data Start -SDName: Boss salramm -SDAuthor: Tartalo -SD%Complete: 80 -SDComment: @todo Intro -SDCategory: -Script Data End */ - #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "culling_of_stratholme.h" @@ -31,9 +23,7 @@ enum Spells { SPELL_CURSE_OF_TWISTED_FLESH = 58845, SPELL_EXPLODE_GHOUL = 52480, - H_SPELL_EXPLODE_GHOUL = 58825, SPELL_SHADOW_BOLT = 57725, - H_SPELL_SHADOW_BOLT = 58828, SPELL_STEAL_FLESH = 52708, SPELL_SUMMON_GHOULS = 52451 }; @@ -49,114 +39,89 @@ enum Yells SAY_SUMMON_GHOULS = 6 }; -class boss_salramm : public CreatureScript +enum Events { -public: - boss_salramm() : CreatureScript("boss_salramm") { } - - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<boss_salrammAI>(creature); - } - - struct boss_salrammAI : public ScriptedAI - { - boss_salrammAI(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - instance = creature->GetInstanceScript(); - Talk(SAY_SPAWN); - } - - void Initialize() - { - uiCurseFleshTimer = 30000; //30s DBM - uiExplodeGhoulTimer = urand(25000, 28000); //approx 6 sec after summon ghouls - uiShadowBoltTimer = urand(8000, 12000); // approx 10s - uiStealFleshTimer = 12345; - uiSummonGhoulsTimer = urand(19000, 24000); //on a video approx 24s after aggro - } - - uint32 uiCurseFleshTimer; - uint32 uiExplodeGhoulTimer; - uint32 uiShadowBoltTimer; - uint32 uiStealFleshTimer; - uint32 uiSummonGhoulsTimer; - - InstanceScript* instance; - - void Reset() override - { - Initialize(); - - instance->SetData(DATA_SALRAMM_EVENT, NOT_STARTED); - } - - void EnterCombat(Unit* /*who*/) override - { - Talk(SAY_AGGRO); + EVENT_CURSE_FLESH = 1, + EVENT_EXPLODE_GHOUL, + EVENT_SHADOW_BOLT, + EVENT_STEAL_FLESH, + EVENT_SUMMON_GHOULS +}; - instance->SetData(DATA_SALRAMM_EVENT, IN_PROGRESS); - } +class boss_salramm : public CreatureScript +{ + public: + boss_salramm() : CreatureScript("boss_salramm") { } - void UpdateAI(uint32 diff) override + struct boss_salrammAI : public BossAI { - //Return since we have no target - if (!UpdateVictim()) - return; - - //Curse of twisted flesh timer - if (uiCurseFleshTimer <= diff) + boss_salrammAI(Creature* creature) : BossAI(creature, DATA_SALRAMM) { - DoCastVictim(SPELL_CURSE_OF_TWISTED_FLESH); - uiCurseFleshTimer = 37000; - } else uiCurseFleshTimer -= diff; + Talk(SAY_SPAWN); + } - //Shadow bolt timer - if (uiShadowBoltTimer <= diff) + void EnterCombat(Unit* /*who*/) override { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(target, SPELL_SHADOW_BOLT); - uiShadowBoltTimer = urand(8000, 12000); - } else uiShadowBoltTimer -= diff; + Talk(SAY_AGGRO); + _EnterCombat(); - //Steal Flesh timer - if (uiStealFleshTimer <= diff) - { - Talk(SAY_STEAL_FLESH); - if (Unit* random_pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(random_pTarget, SPELL_STEAL_FLESH); - uiStealFleshTimer = 10000; - } else uiStealFleshTimer -= diff; + events.ScheduleEvent(EVENT_CURSE_FLESH, 30000); + events.ScheduleEvent(EVENT_SUMMON_GHOULS, urand(19000, 24000)); + events.ScheduleEvent(EVENT_SHADOW_BOLT, urand(8000, 12000)); + events.ScheduleEvent(EVENT_STEAL_FLESH, 12345); /// @todo: adjust timer + } - //Summon ghouls timer - if (uiSummonGhoulsTimer <= diff) + void ExecuteEvent(uint32 eventId) override { - Talk(SAY_SUMMON_GHOULS); - if (Unit* random_pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(random_pTarget, SPELL_SUMMON_GHOULS); - uiSummonGhoulsTimer = 10000; - } else uiSummonGhoulsTimer -= diff; - - DoMeleeAttackIfReady(); - } - - void JustDied(Unit* /*killer*/) override - { - Talk(SAY_DEATH); + switch (eventId) + { + case EVENT_CURSE_FLESH: + DoCastVictim(SPELL_CURSE_OF_TWISTED_FLESH); + events.ScheduleEvent(EVENT_CURSE_FLESH, 37000); + break; + case EVENT_SUMMON_GHOULS: + Talk(SAY_SUMMON_GHOULS); + DoCast(me, SPELL_SUMMON_GHOULS); + events.ScheduleEvent(EVENT_SUMMON_GHOULS, 10000); + events.ScheduleEvent(EVENT_EXPLODE_GHOUL, 6000); + break; + case EVENT_SHADOW_BOLT: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true)) + DoCast(target, SPELL_SHADOW_BOLT); + events.ScheduleEvent(EVENT_SHADOW_BOLT, urand(8000, 12000)); + break; + case EVENT_STEAL_FLESH: + Talk(SAY_STEAL_FLESH); + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true)) + DoCast(target, SPELL_STEAL_FLESH); + events.ScheduleEvent(EVENT_STEAL_FLESH, 12345); + break; + case EVENT_EXPLODE_GHOUL: + Talk(SAY_EXPLODE_GHOUL); + DoCast(me, SPELL_EXPLODE_GHOUL, true); + break; + default: + break; + } + } + + void JustDied(Unit* /*killer*/) override + { + Talk(SAY_DEATH); + _JustDied(); + } - instance->SetData(DATA_SALRAMM_EVENT, DONE); - } + void KilledUnit(Unit* victim) override + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } + }; - void KilledUnit(Unit* victim) override + CreatureAI* GetAI(Creature* creature) const override { - if (victim->GetTypeId() != TYPEID_PLAYER) - return; - - Talk(SAY_SLAY); + return GetInstanceAI<boss_salrammAI>(creature); } - }; - }; void AddSC_boss_salramm() diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp index b8a9b295161..3c80be2734a 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp @@ -103,7 +103,7 @@ enum Says //Drakonian SAY_PHASE302 = 0, - SAY_PHASE305 = 1, + SAY_PHASE305 = 1 }; enum NPCs @@ -111,7 +111,6 @@ enum NPCs NPC_INFINITE_ADVERSARY = 27742, NPC_INFINITE_HUNTER = 27743, NPC_INFINITE_AGENT = 27744, - NPC_TIME_RIFT = 28409, NPC_ZOMBIE = 27737, NPC_GHOUL = 28249, NPC_NECROMANCER = 28200, @@ -128,7 +127,7 @@ enum NPCs NPC_CITY_MAN = 28167, NPC_CITY_MAN2 = 28169, NPC_CITY_MAN3 = 31126, - NPC_CITY_MAN4 = 31127, + NPC_CITY_MAN4 = 31127 }; enum Spells @@ -138,7 +137,7 @@ enum Spells SPELL_EXORCISM_N = 52445, SPELL_EXORCISM_H = 58822, SPELL_HOLY_LIGHT = 52444, - SPELL_ARCANE_DISRUPTION = 49590, + SPELL_ARCANE_DISRUPTION = 49590 }; enum GossipMenuArthas @@ -392,6 +391,7 @@ public: uint32 gossipStep; uint32 bossEvent; uint32 wave; + uint32 WavesCounter; uint64 utherGUID; uint64 jainaGUID; @@ -411,17 +411,19 @@ public: { Initialize(); - instance->SetData(DATA_ARTHAS_EVENT, NOT_STARTED); - switch (instance->GetData(DATA_ARTHAS_EVENT)) - { - case NOT_STARTED: - bStepping = true; - step = 0; - me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - bossEvent = DATA_MEATHOOK_EVENT; - gossipStep = 0; - break; - } + instance->SetBossState(DATA_ARTHAS, NOT_STARTED); + + bStepping = true; + step = 0; + me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + bossEvent = DATA_MEATHOOK; + gossipStep = 0; + } + + void AttackStart(Unit* who) + { + if (who && !who->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC)) + npc_escortAI::AttackStart(who); } void EnterCombat(Unit* /*who*/) override @@ -431,7 +433,7 @@ public: void JustDied(Unit* /*killer*/) override { - instance->SetData(DATA_ARTHAS_EVENT, FAIL); + instance->SetBossState(DATA_ARTHAS, FAIL); } void SpawnTimeRift(uint32 timeRiftID, uint64* guidVector) @@ -488,16 +490,15 @@ public: case 11: case 22: case 23: - case 26: case 55: case 56: SetHoldState(true); bStepping = true; break; case 7: - if (Unit* cityman0 = me->SummonCreature(NPC_CITY_MAN, 2091.977f, 1275.021f, 140.757f, 0.558f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000)) + if (Unit* cityman0 = me->FindNearestCreature(NPC_CITY_MAN, 160.0f)) citymenGUID[0] = cityman0->GetGUID(); - if (Unit* cityman1 = me->SummonCreature(NPC_CITY_MAN2, 2093.514f, 1275.842f, 140.408f, 3.801f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000)) + if (Unit* cityman1 = me->FindNearestCreature(NPC_CITY_MAN2, 160.0f)) citymenGUID[1] = cityman1->GetGUID(); break; case 8: @@ -534,10 +535,12 @@ public: case 21: Talk(SAY_PHASE301); break; - case 25: + case 26: SetRun(false); SpawnTimeRift(0, &infiniteDraconianGUID[0]); Talk(SAY_PHASE307); + SetHoldState(true); + bStepping = true; break; case 29: SetRun(false); @@ -565,8 +568,8 @@ public: Talk(SAY_PHASE403); break; case 36: - if (GameObject* pGate = instance->instance->GetGameObject(instance->GetData64(DATA_SHKAF_GATE))) - pGate->SetGoState(GO_STATE_ACTIVE); + if (GameObject* gate = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_SHKAF_GATE))) + gate->SetGoState(GO_STATE_ACTIVE); break; case 45: SetRun(true); @@ -575,18 +578,18 @@ public: me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); SetHoldState(true); break; - case 47: + case 48: SetRun(false); Talk(SAY_PHASE405); break; - case 48: + case 49: SetRun(true); Talk(SAY_PHASE406); break; - case 53: + case 50: Talk(SAY_PHASE407); break; - case 54: + case 51: gossipStep = 5; me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); SetHoldState(true); @@ -598,8 +601,6 @@ public: { npc_escortAI::UpdateAI(diff); - DoMeleeAttackIfReady(); - if (bStepping) { if (phaseTimer <= diff) @@ -765,6 +766,9 @@ public: stalkerGUID = pStalker->GetGUID(); me->SetTarget(stalkerGUID); } + + instance->DoUpdateWorldState(WORLDSTATE_WAVE_COUNT, 0); + JumpToNextStep(1000); break; case 25: @@ -892,14 +896,15 @@ public: } Talk(SAY_PHASE209); - bossEvent = DATA_MEATHOOK_EVENT; - instance->SetData(DATA_ARTHAS_EVENT, IN_PROGRESS); + bossEvent = DATA_MEATHOOK; + instance->SetBossState(DATA_ARTHAS, IN_PROGRESS); me->SetReactState(REACT_DEFENSIVE); SetDespawnAtFar(false); JumpToNextStep(5000); break; - case 41: //Summon wave group + // Summon wave groups - start the Infinite Corruptor timer + case 41: case 43: case 45: case 47: @@ -907,10 +912,15 @@ public: case 53: case 55: case 57: - if (instance->GetData(bossEvent) != DONE) + if (!wave && IsHeroic() && instance->GetData(DATA_INFINITE_COUNTER) == NOT_STARTED) + instance->SetData(DATA_INFINITE_COUNTER, IN_PROGRESS); + + if (instance->GetBossState(bossEvent) != DONE) { SpawnWaveGroup(wave, waveGUID); wave++; + WavesCounter++; + instance->DoUpdateWorldState(WORLDSTATE_WAVE_COUNT, WavesCounter); } JumpToNextStep(500); break; @@ -922,7 +932,7 @@ public: case 54: case 56: case 58: - if (instance->GetData(bossEvent) != DONE) + if (instance->GetBossState(bossEvent) != DONE) { uint32 mobCounter = 0; uint32 deadCounter = 0; @@ -946,12 +956,14 @@ public: break; case 49: //Summon Boss case 59: - if (instance->GetData(bossEvent) != DONE) + if (instance->GetBossState(bossEvent) != DONE) { + WavesCounter++; + instance->DoUpdateWorldState(WORLDSTATE_WAVE_COUNT, WavesCounter); uint32 uiBossID = 0; - if (bossEvent == DATA_MEATHOOK_EVENT) + if (bossEvent == DATA_MEATHOOK) uiBossID = NPC_MEATHOOK; - else if (bossEvent == DATA_SALRAMM_EVENT) + else if (bossEvent == DATA_SALRAMM) uiBossID = NPC_SALRAMM; if (Unit* pBoss = me->SummonCreature(uiBossID, 2232.19f, 1331.933f, 126.662f, 3.15f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 900000)) @@ -965,19 +977,19 @@ public: break; case 50: //Wait Boss death case 60: - if (instance->GetData(bossEvent) == DONE) + if (instance->GetBossState(bossEvent) == DONE) { JumpToNextStep(1000); - if (bossEvent == DATA_MEATHOOK_EVENT) - bossEvent = DATA_SALRAMM_EVENT; - else if (bossEvent == DATA_SALRAMM_EVENT) + if (bossEvent == DATA_MEATHOOK) + bossEvent = DATA_SALRAMM; + else if (bossEvent == DATA_SALRAMM) { SetHoldState(false); bStepping = false; - bossEvent = DATA_EPOCH_EVENT; + bossEvent = DATA_EPOCH; } } - else if (instance->GetData(bossEvent) == FAIL) + else if (instance->GetBossState(bossEvent) == FAIL) npc_escortAI::EnterEvadeMode(); else phaseTimer = 10000; @@ -1074,9 +1086,12 @@ public: phaseTimer = 1000; else { - if (step == 72) Talk(SAY_PHASE308); - if (step == 74) Talk(SAY_PHASE308); - if (step == 76) Talk(SAY_PHASE310); + if (step == 72) + Talk(SAY_PHASE308); + if (step == 74) + Talk(SAY_PHASE308); + if (step == 76) + Talk(SAY_PHASE310); SetHoldState(false); bStepping = false; SetRun(true); @@ -1097,7 +1112,7 @@ public: JumpToNextStep(1000); break; case 80: - if (instance->GetData(DATA_EPOCH_EVENT) != DONE) + if (instance->GetBossState(DATA_EPOCH) != DONE) { SpawnTimeRift(17, &epochGUID); if (Creature* epoch = ObjectAccessor::GetCreature(*me, epochGUID)) @@ -1107,12 +1122,12 @@ public: JumpToNextStep(18000); break; case 81: - if (instance->GetData(DATA_EPOCH_EVENT) != DONE) + if (instance->GetBossState(DATA_EPOCH) != DONE) Talk(SAY_PHASE315); JumpToNextStep(6000); break; case 82: - if (instance->GetData(DATA_EPOCH_EVENT) != DONE) + if (instance->GetBossState(DATA_EPOCH) != DONE) { if (Creature* epoch = ObjectAccessor::GetCreature(*me, epochGUID)) { @@ -1126,15 +1141,15 @@ public: JumpToNextStep(1000); break; case 83: - if (instance->GetData(DATA_EPOCH_EVENT) == DONE) + if (instance->GetBossState(DATA_EPOCH) == DONE) { gossipStep = 3; me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); bStepping = false; - bossEvent = DATA_MAL_GANIS_EVENT; + bossEvent = DATA_MAL_GANIS; JumpToNextStep(15000); } - else if (instance->GetData(DATA_EPOCH_EVENT) == FAIL) + else if (instance->GetBossState(DATA_EPOCH) == FAIL) npc_escortAI::EnterEvadeMode(); else phaseTimer = 10000; @@ -1153,8 +1168,8 @@ public: malganisGUID = malganis->GetGUID(); malganis->SetReactState(REACT_PASSIVE); } - if (GameObject* pGate = instance->instance->GetGameObject(instance->GetData64(DATA_MAL_GANIS_GATE_1))) - pGate->SetGoState(GO_STATE_ACTIVE); + if (GameObject* gate = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_MAL_GANIS_GATE_1))) + gate->SetGoState(GO_STATE_ACTIVE); SetHoldState(false); bStepping = false; JumpToNextStep(0); @@ -1174,12 +1189,12 @@ public: JumpToNextStep(1000); break; case 88: - if (instance->GetData(DATA_MAL_GANIS_EVENT) == DONE) + if (instance->GetBossState(DATA_MAL_GANIS) == DONE) { SetHoldState(false); JumpToNextStep(1000); } - else if (instance->GetData(DATA_MAL_GANIS_EVENT) == FAIL) + else if (instance->GetBossState(DATA_MAL_GANIS) == FAIL) npc_escortAI::EnterEvadeMode(); else phaseTimer = 10000; @@ -1192,7 +1207,7 @@ public: JumpToNextStep(7000); break; case 90: - instance->SetData(DATA_ARTHAS_EVENT, DONE); //Rewards: Achiev & Chest ;D + instance->SetBossState(DATA_ARTHAS, DONE); //Rewards: Achiev & Chest ;D me->SetTarget(instance->GetData64(DATA_MAL_GANIS_GATE_2)); //Look behind Talk(SAY_PHASE504); bStepping = false; @@ -1214,6 +1229,8 @@ public: if (HealthBelowPct(40)) DoCast(me, SPELL_HOLY_LIGHT); + + DoMeleeAttackIfReady(); } }; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h index e7d1033e55f..192654c87f1 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h @@ -19,19 +19,10 @@ #define DEF_CULLING_OF_STRATHOLME_H #define DataHeader "CS" +#define CoSScriptName "instance_culling_of_stratholme" +uint32 const EncounterCount = 5; -enum Data -{ - DATA_MEATHOOK_EVENT, - DATA_SALRAMM_EVENT, - DATA_EPOCH_EVENT, - DATA_MAL_GANIS_EVENT, - DATA_INFINITE_EVENT, - DATA_ARTHAS_EVENT, - DATA_CRATE_COUNT, -}; - -enum Data64 +enum DataTypes { DATA_ARTHAS, DATA_MEATHOOK, @@ -39,28 +30,35 @@ enum Data64 DATA_EPOCH, DATA_MAL_GANIS, DATA_INFINITE, + DATA_CRATE_COUNT, DATA_SHKAF_GATE, DATA_MAL_GANIS_GATE_1, DATA_MAL_GANIS_GATE_2, DATA_EXIT_GATE, - DATA_MAL_GANIS_CHEST + DATA_MAL_GANIS_CHEST, + DATA_INFINITE_COUNTER }; -enum Creatures +enum CreatureIds { - NPC_MEATHOOK = 26529, - NPC_SALRAMM = 26530, - NPC_EPOCH = 26532, - NPC_MAL_GANIS = 26533, - NPC_INFINITE = 32273, - NPC_ARTHAS = 26499, - NPC_JAINA = 26497, - NPC_UTHER = 26528, - NPC_CHROMIE_2 = 27915, - NPC_GENERIC_BUNNY = 28960, + NPC_MEATHOOK = 26529, + NPC_SALRAMM = 26530, + NPC_EPOCH = 26532, + NPC_MAL_GANIS = 26533, + NPC_INFINITE = 32273, + NPC_ARTHAS = 26499, + NPC_JAINA = 26497, + NPC_UTHER = 26528, + NPC_CHROMIE = 26527, + NPC_CHROMIE_2 = 27915, + NPC_CHROMIE_3 = 30997, + NPC_GENERIC_BUNNY = 28960, + + NPC_TIME_RIFT = 28409, + NPC_GUARDIAN_OF_TIME = 32281 }; -enum GameObjects +enum GameObjectIds { GO_SHKAF_GATE = 188686, GO_MALGANIS_GATE_1 = 187711, @@ -69,7 +67,7 @@ enum GameObjects GO_MALGANIS_CHEST_N = 190663, GO_MALGANIS_CHEST_H = 193597, GO_SUSPICIOUS_CRATE = 190094, - GO_PLAGUED_CRATE = 190095, + GO_PLAGUED_CRATE = 190095 }; enum WorldStatesCoT @@ -78,12 +76,28 @@ enum WorldStatesCoT WORLDSTATE_CRATES_REVEALED = 3480, WORLDSTATE_WAVE_COUNT = 3504, WORLDSTATE_TIME_GUARDIAN = 3931, - WORLDSTATE_TIME_GUARDIAN_SHOW = 3932, + WORLDSTATE_TIME_GUARDIAN_SHOW = 3932 }; enum CrateSpells { - SPELL_CRATES_CREDIT = 58109, + SPELL_CRATES_CREDIT = 58109 +}; + +enum Texts +{ + SAY_CRATES_COMPLETED = 0, + // Chromie + SAY_INFINITE_START = 0, // On Infinite Corruptor event start + SAY_INFINITE = 1, // On Infinite Corruptor event at 5 minutes + SAY_INFINITE_FAIL = 2, // On Infinite Corruptor event fail + // Infinite Corruptor + SAY_FAIL_EVENT = 2 // On Infinite Corruptor event fail +}; + +enum InstanceEvents +{ + EVENT_INFINITE_TIMER = 1 }; #endif diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp index 7af2b3f63aa..ab86b5d8f42 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp @@ -23,8 +23,6 @@ #include "TemporarySummon.h" #include "SpellInfo.h" -#define MAX_ENCOUNTER 5 - /* Culling of Stratholme encounters: 0 - Meathook 1 - Salramm the Fleshcrafter @@ -33,51 +31,52 @@ 4 - Infinite Corruptor (Heroic only) */ -enum Texts +Position const ChromieSummonPos[] = { - SAY_CRATES_COMPLETED = 0, + { 1813.298f, 1283.578f, 142.3258f, 3.878161f }, + { 2273.725f, 1483.684f, 128.7205f, 6.057528f } }; -Position const ChromieSummonPos = {1813.298f, 1283.578f, 142.3258f, 3.878161f}; +Position const InfiniteCorruptorPos = { 2335.47f, 1262.04f, 132.921f, 1.42079f }; +Position const TimeRiftPos = { 2334.626f, 1280.45f, 133.0066f, 1.727876f }; +Position const GuardianOfTimePos = { 2321.489f, 1268.383f, 132.8507f, 0.418879f }; + +DoorData const doorData[] = +{ + { GO_MALGANIS_GATE_2, DATA_MAL_GANIS, DOOR_TYPE_ROOM, BOUNDARY_NONE }, + { GO_EXIT_GATE, DATA_MAL_GANIS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END +}; class instance_culling_of_stratholme : public InstanceMapScript { public: - instance_culling_of_stratholme() : InstanceMapScript("instance_culling_of_stratholme", 595) { } - - InstanceScript* GetInstanceScript(InstanceMap* map) const override - { - return new instance_culling_of_stratholme_InstanceMapScript(map); - } + instance_culling_of_stratholme() : InstanceMapScript(CoSScriptName, 595) { } struct instance_culling_of_stratholme_InstanceMapScript : public InstanceScript { instance_culling_of_stratholme_InstanceMapScript(Map* map) : InstanceScript(map) { SetHeaders(DataHeader); - _arthasGUID = 0; - _meathookGUID = 0; - _salrammGUID = 0; - _epochGUID = 0; - _malGanisGUID = 0; - _infiniteGUID = 0; - _shkafGateGUID = 0; + SetBossNumber(EncounterCount); + LoadDoorData(doorData); + + _chromieGUID = 0; + _arthasGUID = 0; + _meathookGUID = 0; + _salrammGUID = 0; + _epochGUID = 0; + _malGanisGUID = 0; + _infiniteGUID = 0; + _shkafGateGUID = 0; _malGanisGate1GUID = 0; _malGanisGate2GUID = 0; - _exitGateGUID = 0; + _exitGateGUID = 0; _malGanisChestGUID = 0; - _genericBunnyGUID = 0; - memset(&_encounterState[0], 0, sizeof(uint32) * MAX_ENCOUNTER); - _crateCount = 0; - } - - bool IsEncounterInProgress() const override - { - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (_encounterState[i] == IN_PROGRESS) - return true; - - return false; + _genericBunnyGUID = 0; + _crateCount = 0; + _eventTimer = 0; + _infiniteCouterState = NOT_STARTED; } void FillInitialWorldStates(WorldPacket& data) override @@ -93,6 +92,9 @@ class instance_culling_of_stratholme : public InstanceMapScript { switch (creature->GetEntry()) { + case NPC_CHROMIE: + _chromieGUID = creature->GetGUID(); + break; case NPC_ARTHAS: _arthasGUID = creature->GetGUID(); break; @@ -110,10 +112,13 @@ class instance_culling_of_stratholme : public InstanceMapScript break; case NPC_INFINITE: _infiniteGUID = creature->GetGUID(); + DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN_SHOW, 1); break; case NPC_GENERIC_BUNNY: _genericBunnyGUID = creature->GetGUID(); break; + default: + break; } } @@ -129,55 +134,38 @@ class instance_culling_of_stratholme : public InstanceMapScript break; case GO_MALGANIS_GATE_2: _malGanisGate2GUID = go->GetGUID(); + AddDoor(go, true); break; case GO_EXIT_GATE: _exitGateGUID = go->GetGUID(); - if (_encounterState[3] == DONE) - HandleGameObject(_exitGateGUID, true); + AddDoor(go, true); break; case GO_MALGANIS_CHEST_N: case GO_MALGANIS_CHEST_H: _malGanisChestGUID = go->GetGUID(); - if (_encounterState[3] == DONE) - go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND); + break; + default: break; } } - void SetData(uint32 type, uint32 data) override + void OnGameObjectRemove(GameObject* go) override { - switch (type) + switch (go->GetEntry()) { - case DATA_MEATHOOK_EVENT: - _encounterState[0] = data; - break; - case DATA_SALRAMM_EVENT: - _encounterState[1] = data; + case GO_MALGANIS_GATE_2: + case GO_EXIT_GATE: + AddDoor(go, false); break; - case DATA_EPOCH_EVENT: - _encounterState[2] = data; + default: break; - case DATA_MAL_GANIS_EVENT: - _encounterState[3] = data; + } + } - switch (_encounterState[3]) - { - case NOT_STARTED: - HandleGameObject(_malGanisGate2GUID, true); - break; - case IN_PROGRESS: - HandleGameObject(_malGanisGate2GUID, false); - break; - case DONE: - HandleGameObject(_exitGateGUID, true); - if (GameObject* go = instance->GetGameObject(_malGanisChestGUID)) - go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND); - break; - } - break; - case DATA_INFINITE_EVENT: - _encounterState[4] = data; - break; + void SetData(uint32 type, uint32 data) override + { + switch (type) + { case DATA_CRATE_COUNT: _crateCount = data; if (_crateCount == 5) @@ -186,34 +174,70 @@ class instance_culling_of_stratholme : public InstanceMapScript bunny->CastSpell(bunny, SPELL_CRATES_CREDIT, true); // Summon Chromie and global whisper - if (Creature* chromie = instance->SummonCreature(NPC_CHROMIE_2, ChromieSummonPos)) + if (Creature* chromie = instance->SummonCreature(NPC_CHROMIE_2, ChromieSummonPos[0])) if (!instance->GetPlayers().isEmpty()) chromie->AI()->TalkToMap(SAY_CRATES_COMPLETED); } DoUpdateWorldState(WORLDSTATE_CRATES_REVEALED, _crateCount); break; + case DATA_INFINITE_COUNTER: + _infiniteCouterState = data; + if (data == IN_PROGRESS) + { + if (!_infiniteGUID) + { + _eventTimer = 25; + instance->SummonCreature(NPC_INFINITE, InfiniteCorruptorPos); + instance->SummonCreature(NPC_TIME_RIFT, TimeRiftPos); + instance->SummonCreature(NPC_GUARDIAN_OF_TIME, GuardianOfTimePos); + events.ScheduleEvent(EVENT_INFINITE_TIMER, 1); + } + } + break; + default: + break; + } + } + + bool SetBossState(uint32 type, EncounterState state) override + { + if (!InstanceScript::SetBossState(type, state)) + return false; + + switch (type) + { + case DATA_INFINITE: + if (state == DONE) + { + DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN_SHOW, 0); + DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN, 0); + } + break; + case DATA_MAL_GANIS: + if (state == DONE) + { + if (GameObject* go = instance->GetGameObject(_malGanisChestGUID)) + go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND); + instance->SummonCreature(NPC_CHROMIE_3, ChromieSummonPos[1]); + } + break; + default: + break; } - if (data == DONE) - SaveToDB(); + return true; } uint32 GetData(uint32 type) const override { switch (type) { - case DATA_MEATHOOK_EVENT: - return _encounterState[0]; - case DATA_SALRAMM_EVENT: - return _encounterState[1]; - case DATA_EPOCH_EVENT: - return _encounterState[2]; - case DATA_MAL_GANIS_EVENT: - return _encounterState[3]; - case DATA_INFINITE_EVENT: - return _encounterState[4]; case DATA_CRATE_COUNT: return _crateCount; + case DATA_INFINITE_COUNTER: + return _infiniteCouterState; + default: + break; } return 0; } @@ -244,58 +268,70 @@ class instance_culling_of_stratholme : public InstanceMapScript return _exitGateGUID; case DATA_MAL_GANIS_CHEST: return _malGanisChestGUID; + default: + break; } return 0; } - std::string GetSaveData() override + void Update(uint32 diff) override { - OUT_SAVE_INST_DATA; + events.Update(diff); - std::ostringstream saveStream; - saveStream << "C S " << _encounterState[0] << ' ' << _encounterState[1] << ' ' - << _encounterState[2] << ' ' << _encounterState[3] << ' ' << _encounterState[4]; - - OUT_SAVE_INST_DATA_COMPLETE; - return saveStream.str(); - } - - void Load(const char* in) override - { - if (!in) + while (uint32 eventId = events.ExecuteEvent()) { - OUT_LOAD_INST_DATA_FAIL; - return; - } - - OUT_LOAD_INST_DATA(in); - - char dataHead1, dataHead2; - uint16 data0, data1, data2, data3, data4; - - std::istringstream loadStream(in); - loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3 >> data4; - - if (dataHead1 == 'C' && dataHead2 == 'S') - { - _encounterState[0] = data0; - _encounterState[1] = data1; - _encounterState[2] = data2; - _encounterState[3] = data3; - _encounterState[4] = data4; - - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (_encounterState[i] == IN_PROGRESS) - _encounterState[i] = NOT_STARTED; - + switch (eventId) + { + case EVENT_INFINITE_TIMER: + DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN, _eventTimer); + + switch (_eventTimer) + { + case 25: + if (instance->HavePlayers()) + if (Creature* chromie = instance->GetCreature(_chromieGUID)) + chromie->AI()->TalkToMap(SAY_INFINITE_START); + break; + case 5: + if (instance->HavePlayers()) + if (Creature* chromie = instance->GetCreature(_chromieGUID)) + chromie->AI()->TalkToMap(SAY_INFINITE); + break; + case 0: + if (instance->HavePlayers()) + if (Creature* chromie = instance->GetCreature(_chromieGUID)) + chromie->AI()->TalkToMap(SAY_INFINITE_FAIL); + + if (Creature* infinite = instance->GetCreature(_infiniteGUID)) + { + if (Creature* guardian = infinite->FindNearestCreature(NPC_GUARDIAN_OF_TIME, 100.0f)) + infinite->Kill(guardian); + + if (Creature* rift = infinite->FindNearestCreature(NPC_TIME_RIFT, 100.0f)) + { + infinite->GetMotionMaster()->MovePoint(0, rift->GetPositionX(), rift->GetPositionY(), rift->GetPositionZ()); + rift->DespawnOrUnsummon(3000); + } + + infinite->DespawnOrUnsummon(3000); + infinite->AI()->Talk(SAY_FAIL_EVENT); + } + DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN_SHOW, 0); + return; + default: + break; + } + events.ScheduleEvent(EVENT_INFINITE_TIMER, 60000); + --_eventTimer; + break; + default: + break; + } } - else - OUT_LOAD_INST_DATA_FAIL; - - OUT_LOAD_INST_DATA_COMPLETE; } private: + uint64 _chromieGUID; uint64 _arthasGUID; uint64 _meathookGUID; uint64 _salrammGUID; @@ -308,9 +344,18 @@ class instance_culling_of_stratholme : public InstanceMapScript uint64 _exitGateGUID; uint64 _malGanisChestGUID; uint64 _genericBunnyGUID; - uint32 _encounterState[MAX_ENCOUNTER]; + uint32 _crateCount; + uint32 _eventTimer; + uint32 _infiniteCouterState; + + EventMap events; }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const override + { + return new instance_culling_of_stratholme_InstanceMapScript(map); + } }; void AddSC_instance_culling_of_stratholme() diff --git a/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp b/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp index 62c85491a20..0a6b2e88b26 100644 --- a/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp +++ b/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp @@ -153,7 +153,7 @@ public: SetCombatMovement(true); _Reset(); - + me->SetReactState(REACT_AGGRESSIVE); instance->SetData(DATA_ONYXIA_PHASE, Phase); instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); } @@ -162,12 +162,10 @@ public: { _EnterCombat(); Talk(SAY_AGGRO); - events.ScheduleEvent(EVENT_FLAME_BREATH, urand(10000, 20000)); events.ScheduleEvent(EVENT_TAIL_SWEEP, urand(15000, 20000)); events.ScheduleEvent(EVENT_CLEAVE, urand(2000, 5000)); events.ScheduleEvent(EVENT_WING_BUFFET, urand(10000, 20000)); - instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); } @@ -331,9 +329,10 @@ public: { if (HealthBelowPct(65)) { + if (Unit* target = me->GetVictim()) + tankGUID = target->GetGUID(); SetCombatMovement(false); Phase = PHASE_BREATH; - tankGUID = me->GetVictim()->GetGUID(); me->SetReactState(REACT_PASSIVE); me->AttackStop(); me->GetMotionMaster()->MovePoint(10, Phase2Location); diff --git a/src/server/scripts/Northrend/Gundrak/boss_eck.cpp b/src/server/scripts/Northrend/Gundrak/boss_eck.cpp index 4803cb4934f..9f8cc818958 100644 --- a/src/server/scripts/Northrend/Gundrak/boss_eck.cpp +++ b/src/server/scripts/Northrend/Gundrak/boss_eck.cpp @@ -45,13 +45,18 @@ public: { boss_eckAI(Creature* creature) : BossAI(creature, DATA_ECK_THE_FEROCIOUS_EVENT) { + Initialize(); + } + + void Initialize() + { Berserk = false; } void Reset() override { _Reset(); - Berserk = false; + Initialize(); } void EnterCombat(Unit* /*who*/) override @@ -85,9 +90,8 @@ public: events.ScheduleEvent(EVENT_SPIT, urand(6 * IN_MILLISECONDS, 14 * IN_MILLISECONDS)); break; case EVENT_SPRING: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1)) - if (target->GetTypeId() == TYPEID_PLAYER) - DoCast(target, RAND(SPELL_ECK_SPRING_1, SPELL_ECK_SPRING_2)); + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 35.0f, true)) + DoCast(target, RAND(SPELL_ECK_SPRING_1, SPELL_ECK_SPRING_2)); events.ScheduleEvent(EVENT_SPRING, urand(5 * IN_MILLISECONDS, 10 * IN_MILLISECONDS)); break; case EVENT_BERSERK: @@ -99,11 +103,6 @@ public: } } - void JustDied(Unit* /*killer*/) override - { - _JustDied(); - } - private: bool Berserk; }; diff --git a/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp b/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp index ee3069b5eb2..388d43e8dca 100644 --- a/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp +++ b/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp @@ -31,7 +31,7 @@ 4 - Eck the Ferocious */ -static Position EckSpawnPoint = {1643.877930f, 936.278015f, 107.204948f, 0.668432f}; +Position const EckSpawnPoint = { 1643.877930f, 936.278015f, 107.204948f, 0.668432f }; class instance_gundrak : public InstanceMapScript { @@ -136,7 +136,7 @@ public: memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); } - bool IsEncounterInProgress() const override + bool IsEncounterInProgress() const override { for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) if (m_auiEncounter[i] == IN_PROGRESS) diff --git a/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp b/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp index cea4b540f7b..e98e74634e2 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp @@ -75,7 +75,7 @@ public: { SetGazeOn(who); /// @todo use a script text - me->MonsterTextEmote(EMOTE_NEARBY, NULL, true); + me->TextEmote(EMOTE_NEARBY, nullptr, true); } else BossAI::MoveInLineOfSight(who); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp b/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp index 5b02b7a2009..209e689e615 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp @@ -66,14 +66,22 @@ public: struct boss_maexxnaAI : public BossAI { - boss_maexxnaAI(Creature* creature) : BossAI(creature, BOSS_MAEXXNA) { } + boss_maexxnaAI(Creature* creature) : BossAI(creature, BOSS_MAEXXNA) + { + Initialize(); + } + + void Initialize() + { + enraged = false; + } bool enraged; void EnterCombat(Unit* /*who*/) override { _EnterCombat(); - enraged = false; + Initialize(); events.ScheduleEvent(EVENT_WRAP, 20000); events.ScheduleEvent(EVENT_SPRAY, 40000); events.ScheduleEvent(EVENT_SHOCK, urand(5000, 10000)); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp b/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp index 94117e9dbbf..0e07ff027f6 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp @@ -72,7 +72,11 @@ public: struct boss_nothAI : public BossAI { - boss_nothAI(Creature* creature) : BossAI(creature, BOSS_NOTH) { } + boss_nothAI(Creature* creature) : BossAI(creature, BOSS_NOTH) + { + balconyCount = 0; + waveCount = 0; + } void Reset() override { diff --git a/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp b/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp index 3e8a54f7cec..116cee5f275 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp @@ -61,7 +61,10 @@ public: struct boss_patchwerkAI : public BossAI { - boss_patchwerkAI(Creature* creature) : BossAI(creature, BOSS_PATCHWERK) { } + boss_patchwerkAI(Creature* creature) : BossAI(creature, BOSS_PATCHWERK) + { + Enraged = false; + } bool Enraged; diff --git a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp index 0f5320a8fa1..ce5010c972f 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp @@ -90,9 +90,19 @@ class boss_sapphiron : public CreatureScript struct boss_sapphironAI : public BossAI { boss_sapphironAI(Creature* creature) : - BossAI(creature, BOSS_SAPPHIRON), _phase(PHASE_NULL), - _map(me->GetMap()) - { } + BossAI(creature, BOSS_SAPPHIRON), _map(me->GetMap()) + { + Initialize(); + _iceboltCount = 0; + } + + void Initialize() + { + _phase = PHASE_NULL; + + _canTheHundredClub = true; + _checkFrostResistTimer = 5 * IN_MILLISECONDS; + } void InitializeAI() override { @@ -115,10 +125,7 @@ class boss_sapphiron : public CreatureScript if (_phase == PHASE_FLIGHT) ClearIceBlock(); - _phase = PHASE_NULL; - - _canTheHundredClub = true; - _checkFrostResistTimer = 5 * IN_MILLISECONDS; + Initialize(); } void EnterCombat(Unit* /*who*/) override diff --git a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp index 0dfae16323b..8ae3b5790db 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp @@ -137,6 +137,9 @@ public: me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_STUNNED); me->SetReactState(REACT_PASSIVE); } + + polaritySwitch = false; + uiAddsTimer = 0; } bool checkStalaggAlive; @@ -287,9 +290,16 @@ public: { npc_stalaggAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); instance = creature->GetInstanceScript(); } + void Initialize() + { + powerSurgeTimer = urand(20000, 25000); + magneticPullTimer = 20000; + } + InstanceScript* instance; uint32 powerSurgeTimer; @@ -300,8 +310,7 @@ public: if (Creature* pThaddius = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_THADDIUS))) if (pThaddius->AI()) pThaddius->AI()->DoAction(ACTION_STALAGG_RESET); - powerSurgeTimer = urand(20000, 25000); - magneticPullTimer = 20000; + Initialize(); } void KilledUnit(Unit* /*victim*/) override @@ -379,9 +388,15 @@ public: { npc_feugenAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); instance = creature->GetInstanceScript(); } + void Initialize() + { + staticFieldTimer = 5000; + } + InstanceScript* instance; uint32 staticFieldTimer; @@ -391,7 +406,7 @@ public: if (Creature* pThaddius = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_THADDIUS))) if (pThaddius->AI()) pThaddius->AI()->DoAction(ACTION_FEUGEN_RESET); - staticFieldTimer = 5000; + Initialize(); } void KilledUnit(Unit* /*victim*/) override diff --git a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp index 173b6e2d094..2fc49be0903 100644 --- a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp +++ b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp @@ -126,6 +126,9 @@ class instance_naxxramas : public InstanceMapScript SapphironGUID = 0; KelthuzadGUID = 0; KelthuzadTriggerGUID = 0; + minHorsemenDiedTime = 0; + maxHorsemenDiedTime = 0; + AbominationCount = 0; playerDied = 0; @@ -447,7 +450,6 @@ class instance_naxxramas : public InstanceMapScript uint64 BaronGUID; uint64 SirGUID; uint64 HorsemenChestGUID; - uint64 HorsemenTeleporterGUID; time_t minHorsemenDiedTime; time_t maxHorsemenDiedTime; diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp index ac6fd29d8a1..9ba0806ffd2 100644 --- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp +++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp @@ -342,16 +342,13 @@ public: { boss_malygosAI(Creature* creature) : BossAI(creature, DATA_MALYGOS_EVENT) { + Initialize(); _despawned = false; // We determine if Malygos will be realocated to spawning position on reset triggered by boss despawn on evade _flySpeed = me->GetSpeed(MOVE_FLIGHT); // Get initial fly speed, otherwise on each wipe fly speed would add up if we get it } - void Reset() override + void Initialize() { - // EnterEvadeMode and Reset() links are cut for the sake of properly functioning despawner. - if (!_despawned) - _Reset(); - _summonDeaths = 0; _preparingPulsesChecker = 0; _arcaneOverloadGUID = 0; @@ -366,6 +363,15 @@ public: _firstCyclicMovementStarted = false; _performingSurgeOfPower = false; _performingDestroyPlatform = false; + } + + void Reset() override + { + // EnterEvadeMode and Reset() links are cut for the sake of properly functioning despawner. + if (!_despawned) + _Reset(); + + Initialize(); me->SetDisableGravity(true); me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER); @@ -1173,17 +1179,23 @@ public: { npc_melee_hover_diskAI(Creature* creature) : VehicleAI(creature) { + Initialize(); _instance = creature->GetInstanceScript(); me->SetReactState(REACT_PASSIVE); // TO DO: These were a bit faster than what they should be. Not sure what is the reason. me->SetSpeed(MOVE_FLIGHT, 1.25f); } + void Initialize() + { + _wpCount = 0; + } + void Reset() override { VehicleAI::Reset(); - _wpCount = 0; + Initialize(); } void PassengerBoarded(Unit* unit, int8 /*seat*/, bool apply) override @@ -1507,10 +1519,7 @@ public: void IsSummonedBy(Unit* summoner) override { if (Creature* creature = summoner->ToCreature()) - { - _malygos = creature; - _malygos->AI()->SetGUID(me->GetGUID(), DATA_LAST_OVERLOAD_GUID); - } + creature->AI()->SetGUID(me->GetGUID(), DATA_LAST_OVERLOAD_GUID); } void UpdateAI(uint32 /*diff*/) @@ -1539,7 +1548,6 @@ public: } private: - Creature* _malygos; InstanceScript* _instance; }; @@ -1559,6 +1567,7 @@ public: { npc_wyrmrest_skytalonAI(Creature* creature) : VehicleAI(creature) { + _summoner = NULL; } void IsSummonedBy(Unit* summoner) override diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp index 1489b78159b..d8a5cfae60d 100644 --- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp +++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp @@ -47,6 +47,8 @@ public: platformGUID = 0; exitPortalGUID = 0; alexstraszaBunnyGUID = 0; + heartOfMagicGUID = 0; + giftBoxBunnyGUID = 0; }; bool SetBossState(uint32 type, EncounterState state) override diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp index 019a85c1387..399f2eb8ac2 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp @@ -77,23 +77,28 @@ class boss_anomalus : public CreatureScript { boss_anomalusAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); instance = me->GetInstanceScript(); } + void Initialize() + { + Phase = 0; + uiSparkTimer = 5000; + uiChaoticRiftGUID = 0; + chaosTheory = true; + } + InstanceScript* instance; uint8 Phase; uint32 uiSparkTimer; - uint32 uiCreateRiftTimer; uint64 uiChaoticRiftGUID; bool chaosTheory; void Reset() override { - Phase = 0; - uiSparkTimer = 5000; - uiChaoticRiftGUID = 0; - chaosTheory = true; + Initialize(); instance->SetData(DATA_ANOMALUS_EVENT, NOT_STARTED); } @@ -197,10 +202,17 @@ class npc_chaotic_rift : public CreatureScript { npc_chaotic_riftAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); instance = me->GetInstanceScript(); SetCombatMovement(false); } + void Initialize() + { + uiChaoticEnergyBurstTimer = 1000; + uiSummonCrazedManaWraithTimer = 5000; + } + InstanceScript* instance; uint32 uiChaoticEnergyBurstTimer; @@ -208,8 +220,7 @@ class npc_chaotic_rift : public CreatureScript void Reset() override { - uiChaoticEnergyBurstTimer = 1000; - uiSummonCrazedManaWraithTimer = 5000; + Initialize(); me->SetDisplayId(me->GetCreatureTemplate()->Modelid2); DoCast(me, SPELL_ARCANEFORM, false); } diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp index bfe34ece6cf..7bc4174260b 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp @@ -68,9 +68,20 @@ public: { boss_keristraszaAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); instance = creature->GetInstanceScript(); } + void Initialize() + { + uiCrystalfireBreathTimer = 14 * IN_MILLISECONDS; + uiCrystalChainsCrystalizeTimer = DUNGEON_MODE(30 * IN_MILLISECONDS, 11 * IN_MILLISECONDS); + uiTailSweepTimer = 5 * IN_MILLISECONDS; + bEnrage = false; + + intenseCold = true; + } + InstanceScript* instance; std::list<uint64> intenseColdList; @@ -83,12 +94,7 @@ public: void Reset() override { - uiCrystalfireBreathTimer = 14*IN_MILLISECONDS; - uiCrystalChainsCrystalizeTimer = DUNGEON_MODE(30*IN_MILLISECONDS, 11*IN_MILLISECONDS); - uiTailSweepTimer = 5*IN_MILLISECONDS; - bEnrage = false; - - intenseCold = true; + Initialize(); intenseColdList.clear(); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED); diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp index e42d3d2bcfc..c08fd97a76f 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp @@ -72,7 +72,32 @@ public: { boss_magus_telestraAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); instance = creature->GetInstanceScript(); + bFireMagusDead = false; + bFrostMagusDead = false; + bArcaneMagusDead = false; + uiIsWaitingToAppearTimer = 0; + } + + void Initialize() + { + Phase = 0; + //These times are probably wrong + uiIceNovaTimer = 7 * IN_MILLISECONDS; + uiFireBombTimer = 0; + uiGravityWellTimer = 15 * IN_MILLISECONDS; + uiCooldown = 0; + + uiFireMagusGUID = 0; + uiFrostMagusGUID = 0; + uiArcaneMagusGUID = 0; + + for (uint8 n = 0; n < 3; ++n) + time[n] = 0; + + splitPersonality = 0; + bIsWaitingToAppear = false; } InstanceScript* instance; @@ -98,22 +123,7 @@ public: void Reset() override { - Phase = 0; - //These times are probably wrong - uiIceNovaTimer = 7*IN_MILLISECONDS; - uiFireBombTimer = 0; - uiGravityWellTimer = 15*IN_MILLISECONDS; - uiCooldown = 0; - - uiFireMagusGUID = 0; - uiFrostMagusGUID = 0; - uiArcaneMagusGUID = 0; - - for (uint8 n = 0; n < 3; ++n) - time[n] = 0; - - splitPersonality = 0; - bIsWaitingToAppear = false; + Initialize(); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetVisible(true); diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp index 222f0474c01..84523c1864d 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp @@ -68,12 +68,20 @@ public: struct boss_ormorokAI : public BossAI { - boss_ormorokAI(Creature* creature) : BossAI(creature, DATA_ORMOROK_EVENT) { } + boss_ormorokAI(Creature* creature) : BossAI(creature, DATA_ORMOROK_EVENT) + { + Initialize(); + } + + void Initialize() + { + frenzy = false; + } void Reset() { BossAI::Reset(); - frenzy = false; + Initialize(); } void EnterCombat(Unit* /*who*/) override diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp index 3539661ea19..ea23041da6f 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp @@ -57,7 +57,15 @@ class boss_drakos : public CreatureScript struct boss_drakosAI : public BossAI { - boss_drakosAI(Creature* creature) : BossAI(creature, DATA_DRAKOS) { } + boss_drakosAI(Creature* creature) : BossAI(creature, DATA_DRAKOS) + { + Initialize(); + } + + void Initialize() + { + postPull = false; + } void Reset() override { @@ -67,7 +75,7 @@ class boss_drakos : public CreatureScript events.ScheduleEvent(EVENT_STOMP, 17000); events.ScheduleEvent(EVENT_BOMB_SUMMON, 2000); - postPull = false; + Initialize(); } void EnterCombat(Unit* /*who*/) override @@ -150,7 +158,15 @@ class npc_unstable_sphere : public CreatureScript struct npc_unstable_sphereAI : public ScriptedAI { - npc_unstable_sphereAI(Creature* creature) : ScriptedAI(creature) { } + npc_unstable_sphereAI(Creature* creature) : ScriptedAI(creature) + { + Initialize(); + } + + void Initialize() + { + pulseTimer = 3000; + } void Reset() override { @@ -160,7 +176,7 @@ class npc_unstable_sphere : public CreatureScript me->AddAura(SPELL_UNSTABLE_SPHERE_PASSIVE, me); me->AddAura(SPELL_UNSTABLE_SPHERE_TIMER, me); - pulseTimer = 3000; + Initialize(); me->DespawnOrUnsummon(19000); } diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp index 3ae61bdd116..0dc05cb450d 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp @@ -85,16 +85,24 @@ class boss_eregos : public CreatureScript struct boss_eregosAI : public BossAI { - boss_eregosAI(Creature* creature) : BossAI(creature, DATA_EREGOS) { } + boss_eregosAI(Creature* creature) : BossAI(creature, DATA_EREGOS) + { + Initialize(); + } - void Reset() override + void Initialize() { - _Reset(); _phase = PHASE_NORMAL; _rubyVoid = true; _emeraldVoid = true; _amberVoid = true; + } + + void Reset() override + { + _Reset(); + Initialize(); DoAction(ACTION_SET_NORMAL_EVENTS); } diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp index c4e0986edd4..9dddf721d53 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp @@ -95,6 +95,7 @@ class boss_urom : public CreatureScript { boss_uromAI(Creature* creature) : BossAI(creature, DATA_UROM) { + Initialize(); platform = 0; for (uint8 i = 0; i < 3; ++i) @@ -103,19 +104,13 @@ class boss_urom : public CreatureScript std::random_shuffle(group, group + 3); } - void Reset() override + void Initialize() { - me->CastSpell(me, SPELL_EVOCATE); - - _Reset(); - x = 0.0f; y = 0.0f; canCast = false; canGoBack = false; - me->GetMotionMaster()->MoveIdle(); - teleportTimer = urand(30000, 35000); arcaneExplosionTimer = 9000; castArcaneExplosionTimer = 2000; @@ -123,6 +118,15 @@ class boss_urom : public CreatureScript timeBombTimer = urand(20000, 25000); } + void Reset() override + { + me->CastSpell(me, SPELL_EVOCATE); + + _Reset(); + + me->GetMotionMaster()->MoveIdle(); + } + void EnterCombat(Unit* /*who*/) override { _EnterCombat(); diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp index d07d68f28c9..17508517f44 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp @@ -59,7 +59,16 @@ class boss_varos : public CreatureScript struct boss_varosAI : public BossAI { - boss_varosAI(Creature* creature) : BossAI(creature, DATA_VAROS) { } + boss_varosAI(Creature* creature) : BossAI(creature, DATA_VAROS) + { + Initialize(); + } + + void Initialize() + { + firstCoreEnergize = false; + coreEnergizeOrientation = 0.0f; + } void InitializeAI() override { @@ -77,8 +86,7 @@ class boss_varos : public CreatureScript // not sure if this is handled by a timer or hp percentage events.ScheduleEvent(EVENT_CALL_AZURE, urand(15, 30) * IN_MILLISECONDS); - firstCoreEnergize = false; - coreEnergizeOrientation = 0.0f; + Initialize(); } void EnterCombat(Unit* /*who*/) override @@ -170,12 +178,18 @@ class npc_azure_ring_captain : public CreatureScript { npc_azure_ring_captainAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); instance = creature->GetInstanceScript(); } - void Reset() override + void Initialize() { targetGUID = 0; + } + + void Reset() override + { + Initialize(); me->SetWalk(true); //! HACK: Creature's can't have MOVEMENTFLAG_FLYING diff --git a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp index 259d7faa6fe..8a0921b604b 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp @@ -232,13 +232,19 @@ class npc_ruby_emerald_amber_drake : public CreatureScript { npc_ruby_emerald_amber_drakeAI(Creature* creature) : VehicleAI(creature) { + Initialize(); _instance = creature->GetInstanceScript(); } + void Initialize() + { + _healthWarning = true; + } + void Reset() override { _events.Reset(); - _healthWarning = true; + Initialize(); } void IsSummonedBy(Unit* summoner) override diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp index 40fa5a5c934..29de693bf3a 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp @@ -106,12 +106,35 @@ public: { boss_bjarngrimAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); instance = creature->GetInstanceScript(); m_uiStance = STANCE_DEFENSIVE; memset(&m_auiStormforgedLieutenantGUID, 0, sizeof(m_auiStormforgedLieutenantGUID)); canBuff = true; } + void Initialize() + { + m_bIsChangingStance = false; + + m_uiChargingStatus = 0; + m_uiCharge_Timer = 1000; + + m_uiChangeStance_Timer = urand(20000, 25000); + + m_uiReflection_Timer = 8000; + m_uiKnockAway_Timer = 20000; + m_uiPummel_Timer = 10000; + m_uiIronform_Timer = 25000; + + m_uiIntercept_Timer = 5000; + m_uiWhirlwind_Timer = 10000; + m_uiCleave_Timer = 8000; + + m_uiMortalStrike_Timer = 8000; + m_uiSlam_Timer = 10000; + } + InstanceScript* instance; bool m_bIsChangingStance; @@ -143,24 +166,7 @@ public: if (!me->HasAura(SPELL_TEMPORARY_ELECTRICAL_CHARGE)) me->AddAura(SPELL_TEMPORARY_ELECTRICAL_CHARGE, me); - m_bIsChangingStance = false; - - m_uiChargingStatus = 0; - m_uiCharge_Timer = 1000; - - m_uiChangeStance_Timer = urand(20000, 25000); - - m_uiReflection_Timer = 8000; - m_uiKnockAway_Timer = 20000; - m_uiPummel_Timer = 10000; - m_uiIronform_Timer = 25000; - - m_uiIntercept_Timer = 5000; - m_uiWhirlwind_Timer = 10000; - m_uiCleave_Timer = 8000; - - m_uiMortalStrike_Timer = 8000; - m_uiSlam_Timer = 10000; + Initialize(); for (uint8 i = 0; i < 2; ++i) { @@ -393,9 +399,16 @@ public: { npc_stormforged_lieutenantAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); instance = creature->GetInstanceScript(); } + void Initialize() + { + m_uiArcWeld_Timer = urand(20000, 21000); + m_uiRenewSteel_Timer = urand(10000, 11000); + } + InstanceScript* instance; uint32 m_uiArcWeld_Timer; @@ -403,8 +416,7 @@ public: void Reset() override { - m_uiArcWeld_Timer = urand(20000, 21000); - m_uiRenewSteel_Timer = urand(10000, 11000); + Initialize(); } void EnterCombat(Unit* who) override diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp index ae48dd7aa9a..ddd88681a05 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp @@ -76,9 +76,23 @@ public: { boss_ionarAI(Creature* creature) : ScriptedAI(creature), lSparkList(creature) { + Initialize(); instance = creature->GetInstanceScript(); } + void Initialize() + { + bIsSplitPhase = true; + bHasDispersed = false; + + uiSplitTimer = 25 * IN_MILLISECONDS; + + uiStaticOverloadTimer = urand(5 * IN_MILLISECONDS, 6 * IN_MILLISECONDS); + uiBallLightningTimer = urand(10 * IN_MILLISECONDS, 11 * IN_MILLISECONDS); + + uiDisperseHealth = 45 + urand(0, 10); + } + InstanceScript* instance; SummonList lSparkList; @@ -97,15 +111,7 @@ public: { lSparkList.DespawnAll(); - bIsSplitPhase = true; - bHasDispersed = false; - - uiSplitTimer = 25*IN_MILLISECONDS; - - uiStaticOverloadTimer = urand(5*IN_MILLISECONDS, 6*IN_MILLISECONDS); - uiBallLightningTimer = urand(10*IN_MILLISECONDS, 11*IN_MILLISECONDS); - - uiDisperseHealth = 45 + urand(0, 10); + Initialize(); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_DISABLE_MOVE); @@ -297,16 +303,22 @@ public: { npc_spark_of_ionarAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); instance = creature->GetInstanceScript(); } + void Initialize() + { + uiCheckTimer = 2 * IN_MILLISECONDS; + } + InstanceScript* instance; uint32 uiCheckTimer; void Reset() override { - uiCheckTimer = 2*IN_MILLISECONDS; + Initialize(); me->SetReactState(REACT_PASSIVE); } diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp index 98d7d629756..fc29369c28f 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp @@ -74,9 +74,19 @@ public: { boss_lokenAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); instance = creature->GetInstanceScript(); } + void Initialize() + { + m_uiArcLightning_Timer = 15000; + m_uiLightningNova_Timer = 20000; + m_uiResumePulsingShockwave_Timer = 1000; + + m_uiHealthAmountModifier = 1; + } + InstanceScript* instance; uint32 m_uiArcLightning_Timer; @@ -87,11 +97,7 @@ public: void Reset() override { - m_uiArcLightning_Timer = 15000; - m_uiLightningNova_Timer = 20000; - m_uiResumePulsingShockwave_Timer = 1000; - - m_uiHealthAmountModifier = 1; + Initialize(); instance->SetBossState(DATA_LOKEN, NOT_STARTED); instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMELY_DEATH_START_EVENT); diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp index 31805d3404f..4ca94f69c5b 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp @@ -78,9 +78,26 @@ public: { boss_volkhanAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); instance = creature->GetInstanceScript(); } + void Initialize() + { + m_bIsStriking = false; + m_bHasTemper = false; + m_bCanShatterGolem = false; + + m_uiPause_Timer = 3500; + m_uiShatteringStomp_Timer = 0; + m_uiShatter_Timer = 5000; + m_uiDelay_Timer = 1000; + m_uiSummonPhase = 0; + GolemsShattered = 0; + + m_uiHealthAmountModifier = 1; + } + InstanceScript* instance; std::list<uint64> m_lGolemGUIDList; @@ -100,18 +117,7 @@ public: void Reset() override { - m_bIsStriking = false; - m_bHasTemper = false; - m_bCanShatterGolem = false; - - m_uiPause_Timer = 3500; - m_uiShatteringStomp_Timer = 0; - m_uiShatter_Timer = 5000; - m_uiDelay_Timer = 1000; - m_uiSummonPhase = 0; - GolemsShattered = 0; - - m_uiHealthAmountModifier = 1; + Initialize(); DespawnGolem(); m_lGolemGUIDList.clear(); @@ -362,7 +368,19 @@ public: struct npc_molten_golemAI : public ScriptedAI { - npc_molten_golemAI(Creature* creature) : ScriptedAI(creature) { } + npc_molten_golemAI(Creature* creature) : ScriptedAI(creature) + { + Initialize(); + } + + void Initialize() + { + m_bIsFrozen = false; + + m_uiBlast_Timer = 20000; + m_uiDeathDelay_Timer = 0; + m_uiImmolation_Timer = 5000; + } bool m_bIsFrozen; @@ -372,11 +390,7 @@ public: void Reset() override { - m_bIsFrozen = false; - - m_uiBlast_Timer = 20000; - m_uiDeathDelay_Timer = 0; - m_uiImmolation_Timer = 5000; + Initialize(); } void AttackStart(Unit* who) override diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp index 0337a603e3b..63000df133e 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp @@ -76,12 +76,20 @@ class boss_sjonnir : public CreatureScript struct boss_sjonnirAI : public BossAI { - boss_sjonnirAI(Creature* creature) : BossAI(creature, DATA_SJONNIR) { } + boss_sjonnirAI(Creature* creature) : BossAI(creature, DATA_SJONNIR) + { + Initialize(); + } + + void Initialize() + { + abuseTheOoze = 0; + } void Reset() override { _Reset(); - abuseTheOoze = 0; + Initialize(); } void EnterCombat(Unit* who) override @@ -211,13 +219,21 @@ class npc_malformed_ooze : public CreatureScript struct npc_malformed_oozeAI : public ScriptedAI { - npc_malformed_oozeAI(Creature* creature) : ScriptedAI(creature) { } + npc_malformed_oozeAI(Creature* creature) : ScriptedAI(creature) + { + Initialize(); + } - void Reset() override + void Initialize() { _mergeTimer = 10000; } + void Reset() override + { + Initialize(); + } + void UpdateAI(uint32 diff) override { if (_mergeTimer <= diff) diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp index 4ff0bd1e5cb..11f616e8550 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp @@ -138,10 +138,22 @@ public: { npc_tribuna_controllerAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); instance = creature->GetInstanceScript(); SetCombatMovement(false); } + void Initialize() + { + uiKaddrakEncounterTimer = 1500; + uiMarnakEncounterTimer = 10000; + uiAbedneumEncounterTimer = 10000; + + bKaddrakActivated = false; + bMarnakActivated = false; + bAbedneumActivated = false; + } + InstanceScript* instance; uint32 uiKaddrakEncounterTimer; @@ -156,13 +168,7 @@ public: void Reset() override { - uiKaddrakEncounterTimer = 1500; - uiMarnakEncounterTimer = 10000; - uiAbedneumEncounterTimer = 10000; - - bKaddrakActivated = false; - bMarnakActivated = false; - bAbedneumActivated = false; + Initialize(); instance->HandleGameObject(instance->GetData64(DATA_GO_KADDRAK), false); instance->HandleGameObject(instance->GetData64(DATA_GO_MARNAK), false); @@ -290,9 +296,20 @@ public: { npc_brann_hosAI(Creature* creature) : npc_escortAI(creature) { + Initialize(); instance = creature->GetInstanceScript(); } + void Initialize() + { + bIsLowHP = false; + bIsBattle = false; + uiStep = 0; + uiPhaseTimer = 0; + uiControllerGUID = 0; + brannSparklinNews = true; + } + uint32 uiStep; uint32 uiPhaseTimer; @@ -309,12 +326,7 @@ public: { if (!HasEscortState(STATE_ESCORT_ESCORTING)) { - bIsLowHP = false; - bIsBattle = false; - uiStep = 0; - uiPhaseTimer = 0; - uiControllerGUID = 0; - brannSparklinNews = true; + Initialize(); DespawnDwarf(); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp index 595dcecd554..3c073578d49 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp @@ -301,19 +301,25 @@ class boss_algalon_the_observer : public CreatureScript { boss_algalon_the_observerAI(Creature* creature) : BossAI(creature, BOSS_ALGALON) { + Initialize(); _firstPull = true; _fedOnTears = false; } - void Reset() override + void Initialize() { - _Reset(); - me->SetReactState(REACT_PASSIVE); _phaseTwo = false; _fightWon = false; _hasYelled = false; } + void Reset() override + { + _Reset(); + me->SetReactState(REACT_PASSIVE); + Initialize(); + } + void KilledUnit(Unit* victim) override { if (victim->GetTypeId() == TYPEID_UNIT) @@ -715,13 +721,19 @@ class npc_living_constellation : public CreatureScript { npc_living_constellationAI(Creature* creature) : CreatureAI(creature) { + Initialize(); + } + + void Initialize() + { + _isActive = false; } void Reset() override { _events.Reset(); _events.ScheduleEvent(EVENT_ARCANE_BARRAGE, 2500); - _isActive = false; + Initialize(); } uint32 GetData(uint32 /*type*/) const override @@ -858,6 +870,7 @@ class npc_brann_bronzebeard_algalon : public CreatureScript { npc_brann_bronzebeard_algalonAI(Creature* creature) : CreatureAI(creature) { + _currentPoint = 0; } void DoAction(int32 action) override diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp index 60698aac95e..80b3882593c 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp @@ -138,14 +138,22 @@ class boss_steelbreaker : public CreatureScript struct boss_steelbreakerAI : public BossAI { - boss_steelbreakerAI(Creature* creature) : BossAI(creature, BOSS_ASSEMBLY_OF_IRON) { } + boss_steelbreakerAI(Creature* creature) : BossAI(creature, BOSS_ASSEMBLY_OF_IRON) + { + Initialize(); + } + + void Initialize() + { + phase = 0; + } uint32 phase; void Reset() override { _Reset(); - phase = 0; + Initialize(); me->RemoveAllAuras(); } @@ -275,14 +283,22 @@ class boss_runemaster_molgeim : public CreatureScript struct boss_runemaster_molgeimAI : public BossAI { - boss_runemaster_molgeimAI(Creature* creature) : BossAI(creature, BOSS_ASSEMBLY_OF_IRON) { } + boss_runemaster_molgeimAI(Creature* creature) : BossAI(creature, BOSS_ASSEMBLY_OF_IRON) + { + Initialize(); + } + + void Initialize() + { + phase = 0; + } uint32 phase; void Reset() override { _Reset(); - phase = 0; + Initialize(); me->RemoveAllAuras(); } @@ -432,14 +448,22 @@ class boss_stormcaller_brundir : public CreatureScript struct boss_stormcaller_brundirAI : public BossAI { - boss_stormcaller_brundirAI(Creature* creature) : BossAI(creature, BOSS_ASSEMBLY_OF_IRON) { } + boss_stormcaller_brundirAI(Creature* creature) : BossAI(creature, BOSS_ASSEMBLY_OF_IRON) + { + Initialize(); + } + + void Initialize() + { + phase = 0; + } uint32 phase; void Reset() override { _Reset(); - phase = 0; + Initialize(); me->RemoveAllAuras(); me->SetDisableGravity(false); me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_INTERRUPT, false); // Should be interruptable unless overridden by spell (Overload) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp index f0b8e123c63..34c5344e1cf 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp @@ -107,17 +107,23 @@ class boss_auriaya : public CreatureScript { boss_auriayaAI(Creature* creature) : BossAI(creature, BOSS_AURIAYA) { + Initialize(); } - void Reset() override + void Initialize() { - _Reset(); DefenderGUID = 0; defenderLives = 8; crazyCatLady = true; nineLives = false; } + void Reset() override + { + _Reset(); + Initialize(); + } + void EnterCombat(Unit* /*who*/) override { _EnterCombat(); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp index 071cf5bf14a..8091f77a531 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp @@ -226,14 +226,12 @@ class boss_flame_leviathan : public CreatureScript { boss_flame_leviathanAI(Creature* creature) : BossAI(creature, BOSS_LEVIATHAN), vehicle(creature->GetVehicleKit()) { + Initialize(); + _pursueTarget = 0; } - void InitializeAI() override + void Initialize() { - ASSERT(vehicle); - if (!me->isDead()) - Reset(); - ActiveTowersCount = 4; Shutdown = 0; ActiveTowers = false; @@ -243,6 +241,15 @@ class boss_flame_leviathan : public CreatureScript towerOfFrost = false; Shutout = true; Unbroken = true; + } + + void InitializeAI() override + { + ASSERT(vehicle); + if (!me->isDead()) + Reset(); + + Initialize(); DoCast(SPELL_INVIS_AND_STEALTH_DETECT); @@ -634,13 +641,19 @@ class boss_flame_leviathan_defense_cannon : public CreatureScript { boss_flame_leviathan_defense_cannonAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); + } + + void Initialize() + { + NapalmTimer = 5 * IN_MILLISECONDS; } uint32 NapalmTimer; void Reset() override { - NapalmTimer = 5*IN_MILLISECONDS; + Initialize(); DoCast(me, AURA_STEALTH_DETECTION); } @@ -781,14 +794,20 @@ class npc_mechanolift : public CreatureScript { npc_mechanoliftAI(Creature* creature) : PassiveAI(creature) { + Initialize(); ASSERT(me->GetVehicleKit()); } + void Initialize() + { + MoveTimer = 0; + } + uint32 MoveTimer; void Reset() override { - MoveTimer = 0; + Initialize(); me->GetMotionMaster()->MoveRandom(50); } @@ -956,11 +975,17 @@ public: { npc_mimirons_infernoAI(Creature* creature) : npc_escortAI(creature) { + Initialize(); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); me->CastSpell(me, AURA_DUMMY_YELLOW, true); me->SetReactState(REACT_PASSIVE); } + void Initialize() + { + infernoTimer = 2000; + } + void WaypointReached(uint32 /*waypointId*/) override { @@ -968,7 +993,7 @@ public: void Reset() override { - infernoTimer = 2000; + Initialize(); } uint32 infernoTimer; @@ -1047,14 +1072,20 @@ class npc_freyas_ward : public CreatureScript { npc_freyas_wardAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); me->CastSpell(me, AURA_DUMMY_GREEN, true); } + void Initialize() + { + summonTimer = 5000; + } + uint32 summonTimer; void Reset() override { - summonTimer = 5000; + Initialize(); } void UpdateAI(uint32 diff) override @@ -1090,14 +1121,20 @@ class npc_freya_ward_summon : public CreatureScript { npc_freya_ward_summonAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); creature->GetMotionMaster()->MoveRandom(100); } + void Initialize() + { + lashTimer = 5000; + } + uint32 lashTimer; void Reset() override { - lashTimer = 5000; + Initialize(); } void UpdateAI(uint32 diff) override @@ -1527,11 +1564,11 @@ class spell_auto_repair : public SpellScriptLoader if (!vehicle) return; - Player* driver = vehicle->GetPassenger(0) ? vehicle->GetPassenger(0)->ToPlayer() : NULL; + Unit* driver = vehicle->GetPassenger(0); if (!driver) return; - driver->MonsterTextEmote(EMOTE_REPAIR, driver, true); + driver->TextEmote(EMOTE_REPAIR, driver, true); InstanceScript* instance = driver->GetInstanceScript(); if (!instance) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp index 68bdbe0fdf3..ecebeb8d4e5 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp @@ -267,26 +267,16 @@ class boss_freya : public CreatureScript struct boss_freyaAI : public BossAI { - boss_freyaAI(Creature* creature) : BossAI(creature, BOSS_FREYA) { } - - uint64 ElementalGUID[3][2]; - - uint32 deforestation[6][2]; - uint32 elementalTimer[2]; - uint32 diffTimer; - uint8 trioWaveCount; - uint8 trioWaveController; - uint8 waveCount; - uint8 elderCount; - uint8 attunedToNature; - - bool checkElementalAlive[2]; - bool trioDefeated[2]; - bool random[3]; + boss_freyaAI(Creature* creature) : BossAI(creature, BOSS_FREYA) + { + Initialize(); + memset(elementalTimer, 0, sizeof(elementalTimer)); + diffTimer = 0; + attunedToNature = 0; + } - void Reset() override + void Initialize() { - _Reset(); trioWaveCount = 0; trioWaveController = 0; waveCount = 0; @@ -307,6 +297,27 @@ class boss_freya : public CreatureScript random[n] = false; } + uint64 ElementalGUID[3][2]; + + uint32 deforestation[6][2]; + uint32 elementalTimer[2]; + uint32 diffTimer; + uint8 trioWaveCount; + uint8 trioWaveController; + uint8 waveCount; + uint8 elderCount; + uint8 attunedToNature; + + bool checkElementalAlive[2]; + bool trioDefeated[2]; + bool random[3]; + + void Reset() override + { + _Reset(); + Initialize(); + } + void KilledUnit(Unit* who) override { if (who->GetTypeId() == TYPEID_PLAYER) @@ -689,8 +700,6 @@ class boss_elder_brightleaf : public CreatureScript events.ScheduleEvent(EVENT_SOLAR_FLARE, urand(5000, 7000)); events.ScheduleEvent(EVENT_UNSTABLE_SUN_BEAM, urand(7000, 12000)); events.ScheduleEvent(EVENT_FLUX, 5000); - elderCount = 0; - lumberjack = false; } void KilledUnit(Unit* who) override @@ -758,9 +767,6 @@ class boss_elder_brightleaf : public CreatureScript } } - if (lumberjack) - lumberjackTimer += diff; - DoMeleeAttackIfReady(); } @@ -768,21 +774,12 @@ class boss_elder_brightleaf : public CreatureScript { switch (action) { - case ACTION_ELDER_DEATH: - ++elderCount; - lumberjack = true; - break; case ACTION_ELDER_FREYA_KILLED: me->DespawnOrUnsummon(10000); _JustDied(); break; } } - - private: - uint32 lumberjackTimer; - uint8 elderCount; - bool lumberjack; }; CreatureAI* GetAI(Creature* creature) const override @@ -810,8 +807,6 @@ class boss_elder_stonebark : public CreatureScript events.ScheduleEvent(EVENT_TREMOR, urand(10000, 12000)); events.ScheduleEvent(EVENT_FISTS, urand(25000, 35000)); events.ScheduleEvent(EVENT_BARK, urand(37500, 40000)); - elderCount = 0; - lumberjack = false; } void KilledUnit(Unit* who) override @@ -885,9 +880,6 @@ class boss_elder_stonebark : public CreatureScript } } - if (lumberjack) - lumberjackTimer += diff; - DoMeleeAttackIfReady(); } @@ -895,21 +887,12 @@ class boss_elder_stonebark : public CreatureScript { switch (action) { - case ACTION_ELDER_DEATH: - ++elderCount; - lumberjack = true; - break; case ACTION_ELDER_FREYA_KILLED: me->DespawnOrUnsummon(10000); _JustDied(); break; } } - - private: - uint32 lumberjackTimer; - uint8 elderCount; - bool lumberjack; }; CreatureAI* GetAI(Creature* creature) const override @@ -937,8 +920,6 @@ class boss_elder_ironbranch : public CreatureScript events.ScheduleEvent(EVENT_IMPALE, urand(18000, 22000)); events.ScheduleEvent(EVENT_IRON_ROOTS, urand(12000, 17000)); events.ScheduleEvent(EVENT_THORN_SWARM, urand(7500, 12500)); - elderCount = 0; - lumberjack = false; } void KilledUnit(Unit* who) override @@ -999,9 +980,6 @@ class boss_elder_ironbranch : public CreatureScript } } - if (lumberjack) - lumberjackTimer += diff; - DoMeleeAttackIfReady(); } @@ -1009,21 +987,12 @@ class boss_elder_ironbranch : public CreatureScript { switch (action) { - case ACTION_ELDER_DEATH: - ++elderCount; - lumberjack = true; - break; case ACTION_ELDER_FREYA_KILLED: me->DespawnOrUnsummon(10000); _JustDied(); break; } } - - private: - uint32 lumberjackTimer; - uint8 elderCount; - bool lumberjack; }; CreatureAI* GetAI(Creature* creature) const override @@ -1041,15 +1010,21 @@ class npc_detonating_lasher : public CreatureScript { npc_detonating_lasherAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true); } - void Reset() override + void Initialize() { lashTimer = 5000; changeTargetTimer = 7500; } + void Reset() override + { + Initialize(); + } + void UpdateAI(uint32 diff) override { if (!UpdateVictim()) @@ -1099,16 +1074,24 @@ class npc_ancient_water_spirit : public CreatureScript { npc_ancient_water_spiritAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); instance = me->GetInstanceScript(); if (Creature* Freya = ObjectAccessor::GetCreature(*me, instance->GetData64(BOSS_FREYA))) waveCount = ENSURE_AI(boss_freya::boss_freyaAI, Freya->AI())->trioWaveCount; + else + waveCount = 0; } - void Reset() override + void Initialize() { tidalWaveTimer = 10000; } + void Reset() override + { + Initialize(); + } + void UpdateAI(uint32 diff) override { if (!UpdateVictim()) @@ -1159,17 +1142,25 @@ class npc_storm_lasher : public CreatureScript { npc_storm_lasherAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); instance = me->GetInstanceScript(); if (Creature* Freya = ObjectAccessor::GetCreature(*me, instance->GetData64(BOSS_FREYA))) waveCount = ENSURE_AI(boss_freya::boss_freyaAI, Freya->AI())->trioWaveCount; + else + waveCount = 0; } - void Reset() override + void Initialize() { lightningLashTimer = 10000; stormboltTimer = 5000; } + void Reset() override + { + Initialize(); + } + void UpdateAI(uint32 diff) override { if (!UpdateVictim()) @@ -1229,6 +1220,8 @@ class npc_snaplasher : public CreatureScript instance = me->GetInstanceScript(); if (Creature* Freya = ObjectAccessor::GetCreature(*me, instance->GetData64(BOSS_FREYA))) waveCount = ENSURE_AI(boss_freya::boss_freyaAI, Freya->AI())->trioWaveCount; + else + waveCount = 0; } void UpdateAI(uint32 /*diff*/) override @@ -1271,12 +1264,18 @@ class npc_ancient_conservator : public CreatureScript { npc_ancient_conservatorAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); } - void Reset() override + void Initialize() { natureFuryTimer = 7500; healthySporeTimer = 3500; + } + + void Reset() override + { + Initialize(); SummonHealthySpores(2); } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp index 196e410f239..5d4ddf1865c 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp @@ -105,6 +105,15 @@ class boss_general_vezax : public CreatureScript { boss_general_vezaxAI(Creature* creature) : BossAI(creature, BOSS_VEZAX) { + Initialize(); + } + + void Initialize() + { + shadowDodger = true; + smellSaronite = true; + animusDead = false; + vaporCount = 0; } bool shadowDodger; @@ -116,10 +125,7 @@ class boss_general_vezax : public CreatureScript { _Reset(); - shadowDodger = true; - smellSaronite = true; - animusDead = false; - vaporCount = 0; + Initialize(); } void EnterCombat(Unit* /*who*/) override diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp index a3d80beb546..42c0323a714 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp @@ -181,11 +181,18 @@ class npc_flash_freeze : public CreatureScript { npc_flash_freezeAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); instance = me->GetInstanceScript(); me->SetDisplayId(me->GetCreatureTemplate()->Modelid2); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_STUNNED | UNIT_FLAG_PACIFIED); } + void Initialize() + { + targetGUID = 0; + checkDespawnTimer = 1000; + } + InstanceScript* instance; uint64 targetGUID; @@ -193,8 +200,7 @@ class npc_flash_freeze : public CreatureScript void Reset() override { - targetGUID = 0; - checkDespawnTimer = 1000; + Initialize(); } void UpdateAI(uint32 diff) override @@ -312,9 +318,19 @@ class boss_hodir : public CreatureScript { boss_hodirAI(Creature* creature) : BossAI(creature, BOSS_HODIR) { + Initialize(); me->SetReactState(REACT_PASSIVE); } + void Initialize() + { + gettingColdInHereTimer = 0; + gettingColdInHere = false; + cheeseTheFreeze = false; + iHaveTheCoolestFriends = false; + iCouldSayThatThisCacheWasRare = false; + } + uint32 gettingColdInHereTimer; bool gettingColdInHere; @@ -324,11 +340,7 @@ class boss_hodir : public CreatureScript void Reset() override { - gettingColdInHereTimer = 0; - gettingColdInHere = false; - cheeseTheFreeze = false; - iHaveTheCoolestFriends = false; - iCouldSayThatThisCacheWasRare = false; + Initialize(); _Reset(); me->SetReactState(REACT_PASSIVE); @@ -526,16 +538,22 @@ class npc_icicle : public CreatureScript { npc_icicleAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); me->SetDisplayId(me->GetCreatureTemplate()->Modelid1); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_PACIFIED | UNIT_FLAG_NOT_SELECTABLE); me->SetReactState(REACT_PASSIVE); } + void Initialize() + { + icicleTimer = 2500; + } + uint32 icicleTimer; void Reset() override { - icicleTimer = 2500; + Initialize(); } void UpdateAI(uint32 diff) override @@ -574,16 +592,22 @@ class npc_snowpacked_icicle : public CreatureScript { npc_snowpacked_icicleAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); me->SetDisplayId(me->GetCreatureTemplate()->Modelid2); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_PACIFIED); me->SetReactState(REACT_PASSIVE); } + void Initialize() + { + despawnTimer = 12000; + } + uint32 despawnTimer; void Reset() override { - despawnTimer = 12000; + Initialize(); } void UpdateAI(uint32 diff) override diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp index 28a87b37f5b..f0f918f7e39 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp @@ -118,9 +118,17 @@ class boss_ignis : public CreatureScript { boss_ignis_AI(Creature* creature) : BossAI(creature, BOSS_IGNIS), _vehicle(me->GetVehicleKit()) { + Initialize(); ASSERT(_vehicle); } + void Initialize() + { + _slagPotGUID = 0; + _shattered = false; + _firstConstructKill = 0; + } + void Reset() override { _Reset(); @@ -140,9 +148,7 @@ class boss_ignis : public CreatureScript events.ScheduleEvent(EVENT_CONSTRUCT, 15000); events.ScheduleEvent(EVENT_END_POT, 40000); events.ScheduleEvent(EVENT_BERSERK, 480000); - _slagPotGUID = 0; - _shattered = false; - _firstConstructKill = 0; + Initialize(); instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_IGNIS_START_EVENT); } @@ -298,14 +304,20 @@ class npc_iron_construct : public CreatureScript { npc_iron_constructAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { + Initialize(); creature->SetReactState(REACT_PASSIVE); } - void Reset() override + void Initialize() { _brittled = false; } + void Reset() override + { + Initialize(); + } + void DamageTaken(Unit* /*attacker*/, uint32& damage) override { if (me->HasAura(SPELL_BRITTLE) && damage >= 5000) @@ -365,12 +377,19 @@ class npc_scorch_ground : public CreatureScript { npc_scorch_groundAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE |UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_PACIFIED); creature->SetDisplayId(16925); //model 2 in db cannot overwrite wdb fields } - void MoveInLineOfSight(Unit* who) override + void Initialize() + { + _heat = false; + _constructGUID = 0; + _heatTimer = 0; + } + void MoveInLineOfSight(Unit* who) override { if (!_heat) { @@ -387,10 +406,8 @@ class npc_scorch_ground : public CreatureScript void Reset() override { - _heat = false; + Initialize(); DoCast(me, SPELL_GROUND); - _constructGUID = 0; - _heatTimer = 0; } void UpdateAI(uint32 uiDiff) override diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp index f5fe255fdf3..d53ac6d91d6 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp @@ -327,8 +327,19 @@ class boss_razorscale : public CreatureScript { boss_razorscaleAI(Creature* creature) : BossAI(creature, BOSS_RAZORSCALE) { + Initialize(); // Do not let Razorscale be affected by Battle Shout buff me->ApplySpellImmune(0, IMMUNITY_ID, (SPELL_BATTLE_SHOUT), true); + FlyCount = 0; + EnrageTimer = 0; + Enraged = false; + phase = PHASE_GROUND; + } + + void Initialize() + { + PermaGround = false; + HarpoonCounter = 0; } Phases phase; @@ -345,8 +356,7 @@ class boss_razorscale : public CreatureScript me->SetCanFly(true); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetReactState(REACT_PASSIVE); - PermaGround = false; - HarpoonCounter = 0; + Initialize(); if (Creature* commander = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_EXPEDITION_COMMANDER))) commander->AI()->DoAction(ACTION_COMMANDER_RESET); } @@ -594,7 +604,16 @@ class npc_expedition_commander : public CreatureScript { npc_expedition_commanderAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); instance = me->GetInstanceScript(); + memset(Engineer, 0, sizeof(Engineer)); + memset(Defender, 0, sizeof(Defender)); + } + + void Initialize() + { + AttackStartTimer = 0; + Phase = 0; Greet = false; } @@ -604,14 +623,12 @@ class npc_expedition_commander : public CreatureScript bool Greet; uint32 AttackStartTimer; uint8 Phase; - Creature* Engineer[4]; - Creature* Defender[4]; + uint64 Engineer[4]; + uint64 Defender[4]; void Reset() override { - AttackStartTimer = 0; - Phase = 0; - Greet = false; + Initialize(); summons.clear(); } @@ -659,31 +676,40 @@ class npc_expedition_commander : public CreatureScript case 2: for (uint8 n = 0; n < RAID_MODE(2, 4); n++) { - Engineer[n] = me->SummonCreature(NPC_ENGINEER, PosEngSpawn, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000); - Engineer[n]->SetWalk(false); - Engineer[n]->SetSpeed(MOVE_RUN, 0.5f); - Engineer[n]->SetHomePosition(PosEngRepair[n]); - Engineer[n]->GetMotionMaster()->MoveTargetedHome(); + if (Creature* summonedEngineer = me->SummonCreature(NPC_ENGINEER, PosEngSpawn, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000)) + { + summonedEngineer->SetWalk(false); + summonedEngineer->SetSpeed(MOVE_RUN, 0.5f); + summonedEngineer->SetHomePosition(PosEngRepair[n]); + summonedEngineer->GetMotionMaster()->MoveTargetedHome(); + Engineer[n] = summonedEngineer->GetGUID(); + } } - Engineer[0]->AI()->Talk(SAY_AGGRO_3); + if (Creature* firstSummon = ObjectAccessor::GetCreature(*me, Engineer[0])) + firstSummon->AI()->Talk(SAY_AGGRO_3); Phase = 3; AttackStartTimer = 14000; break; case 3: for (uint8 n = 0; n < 4; n++) { - Defender[n] = me->SummonCreature(NPC_DEFENDER, PosDefSpawn[n], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000); - Defender[n]->SetWalk(false); - Defender[n]->SetHomePosition(PosDefCombat[n]); - Defender[n]->GetMotionMaster()->MoveTargetedHome(); + if (Creature* summonedDefender = me->SummonCreature(NPC_DEFENDER, PosDefSpawn[n], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000)) + { + summonedDefender->SetWalk(false); + summonedDefender->SetHomePosition(PosDefCombat[n]); + summonedDefender->GetMotionMaster()->MoveTargetedHome(); + Defender[n] = summonedDefender->GetGUID(); + } } Phase = 4; break; case 4: for (uint8 n = 0; n < RAID_MODE(2, 4); n++) - Engineer[n]->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_USE_STANDING); + if (Creature* summonedEngineer = ObjectAccessor::GetCreature(*me, Engineer[n])) + summonedEngineer->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_USE_STANDING); for (uint8 n = 0; n < 4; ++n) - Defender[n]->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY2H); + if (Creature* summonedDefender = ObjectAccessor::GetCreature(*me, Defender[n])) + summonedDefender->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY2H); Talk(SAY_AGGRO_2); AttackStartTimer = 16000; Phase = 5; @@ -694,7 +720,8 @@ class npc_expedition_commander : public CreatureScript Razorscale->AI()->DoAction(ACTION_EVENT_START); me->SetInCombatWith(Razorscale); } - Engineer[0]->AI()->Talk(SAY_AGGRO_1); + if (Creature* firstEngineer = ObjectAccessor::GetCreature(*me, Engineer[0])) + firstEngineer->AI()->Talk(SAY_AGGRO_1); Phase = 6; break; } @@ -748,10 +775,20 @@ class npc_mole_machine_trigger : public CreatureScript { npc_mole_machine_triggerAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); SetCombatMovement(false); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_PACIFIED); } + void Initialize() + { + SummonGobTimer = 2000; + SummonNpcTimer = 6000; + DissapearTimer = 10000; + GobSummoned = false; + NpcSummoned = false; + } + uint32 SummonGobTimer; uint32 SummonNpcTimer; uint32 DissapearTimer; @@ -760,11 +797,7 @@ class npc_mole_machine_trigger : public CreatureScript void Reset() override { - SummonGobTimer = 2000; - SummonNpcTimer = 6000; - DissapearTimer = 10000; - GobSummoned = false; - NpcSummoned = false; + Initialize(); } void UpdateAI(uint32 Diff) override @@ -851,15 +884,23 @@ class npc_darkrune_watcher : public CreatureScript struct npc_darkrune_watcherAI : public ScriptedAI { - npc_darkrune_watcherAI(Creature* creature) : ScriptedAI(creature){ } + npc_darkrune_watcherAI(Creature* creature) : ScriptedAI(creature) + { + Initialize(); + } + + void Initialize() + { + ChainTimer = urand(10000, 15000); + LightTimer = urand(1000, 3000); + } uint32 ChainTimer; uint32 LightTimer; void Reset() override { - ChainTimer = urand(10000, 15000); - LightTimer = urand(1000, 3000); + Initialize(); } void UpdateAI(uint32 Diff) override @@ -900,14 +941,22 @@ class npc_darkrune_guardian : public CreatureScript struct npc_darkrune_guardianAI : public ScriptedAI { - npc_darkrune_guardianAI(Creature* creature) : ScriptedAI(creature){ } + npc_darkrune_guardianAI(Creature* creature) : ScriptedAI(creature) + { + Initialize(); + } + + void Initialize() + { + StormTimer = urand(3000, 6000); + killedByBreath = false; + } uint32 StormTimer; void Reset() override { - StormTimer = urand(3000, 6000); - killedByBreath = false; + Initialize(); } uint32 GetData(uint32 type) const override @@ -955,7 +1004,17 @@ class npc_darkrune_sentinel : public CreatureScript struct npc_darkrune_sentinelAI : public ScriptedAI { - npc_darkrune_sentinelAI(Creature* creature) : ScriptedAI(creature){ } + npc_darkrune_sentinelAI(Creature* creature) : ScriptedAI(creature) + { + Initialize(); + } + + void Initialize() + { + HeroicTimer = urand(4000, 8000); + WhirlTimer = urand(20000, 25000); + ShoutTimer = urand(15000, 30000); + } uint32 HeroicTimer; uint32 WhirlTimer; @@ -963,9 +1022,7 @@ class npc_darkrune_sentinel : public CreatureScript void Reset() override { - HeroicTimer = urand(4000, 8000); - WhirlTimer = urand(20000, 25000); - ShoutTimer = urand(15000, 30000); + Initialize(); } void UpdateAI(uint32 Diff) override diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp index 1d2b1b24322..18b9a3040fe 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp @@ -196,6 +196,18 @@ class boss_xt002 : public CreatureScript { boss_xt002_AI(Creature* creature) : BossAI(creature, BOSS_XT002) { + Initialize(); + _transferHealth = 0; + } + + void Initialize() + { + _healthRecovered = false; + _gravityBombCasualty = false; + _hardMode = false; + + _phase = 1; + _heartExposed = 0; } void Reset() override @@ -206,12 +218,7 @@ class boss_xt002 : public CreatureScript me->SetReactState(REACT_AGGRESSIVE); DoCast(me, SPELL_STAND); - _healthRecovered = false; - _gravityBombCasualty = false; - _hardMode = false; - - _phase = 1; - _heartExposed = 0; + Initialize(); instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_MUST_DECONSTRUCT_FASTER); } @@ -390,8 +397,9 @@ class boss_xt002 : public CreatureScript Talk(SAY_HEART_CLOSED); Talk(EMOTE_HEART_CLOSED); - DoCast(me, SPELL_STAND); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetReactState(REACT_AGGRESSIVE); + DoCast(me, SPELL_STAND); _phase = 1; @@ -489,14 +497,20 @@ class npc_scrapbot : public CreatureScript { npc_scrapbotAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); _instance = me->GetInstanceScript(); } + void Initialize() + { + _rangeCheckTimer = 500; + } + void Reset() override { me->SetReactState(REACT_PASSIVE); - _rangeCheckTimer = 500; + Initialize(); if (Creature* pXT002 = ObjectAccessor::GetCreature(*me, _instance->GetData64(BOSS_XT002))) me->GetMotionMaster()->MoveFollow(pXT002, 0.0f, 0.0f); @@ -546,14 +560,20 @@ class npc_pummeller : public CreatureScript { npc_pummellerAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); _instance = creature->GetInstanceScript(); } - void Reset() override + void Initialize() { _arcingSmashTimer = TIMER_ARCING_SMASH; _trampleTimer = TIMER_TRAMPLE; _uppercutTimer = TIMER_UPPERCUT; + } + + void Reset() override + { + Initialize(); if (Creature* xt002 = ObjectAccessor::GetCreature(*me, _instance->GetData64(BOSS_XT002))) { @@ -647,12 +667,18 @@ class npc_boombot : public CreatureScript { npc_boombotAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); _instance = creature->GetInstanceScript(); } - void Reset() override + void Initialize() { _boomed = false; + } + + void Reset() override + { + Initialize(); DoCast(SPELL_AURA_BOOMBOT); // For achievement @@ -726,12 +752,18 @@ class npc_life_spark : public CreatureScript { npc_life_sparkAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); + } + + void Initialize() + { + _shockTimer = 0; // first one is immediate. } void Reset() override { DoCast(me, SPELL_STATIC_CHARGED); - _shockTimer = 0; // first one is immediate. + Initialize(); } void UpdateAI(uint32 diff) override @@ -1006,37 +1038,6 @@ class spell_xt002_submerged : public SpellScriptLoader } }; -class spell_xt002_stand : public SpellScriptLoader -{ - public: - spell_xt002_stand() : SpellScriptLoader("spell_xt002_stand") { } - - class spell_xt002_stand_SpellScript : public SpellScript - { - PrepareSpellScript(spell_xt002_stand_SpellScript); - - void HandleScript(SpellEffIndex /*eff*/) - { - Creature* target = GetHitCreature(); - if (!target) - return; - - target->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - target->SetByteValue(UNIT_FIELD_BYTES_1, 0, UNIT_STAND_STATE_STAND); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_xt002_stand_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_xt002_stand_SpellScript(); - } -}; - class achievement_nerf_engineering : public AchievementCriteriaScript { public: @@ -1095,7 +1096,6 @@ void AddSC_boss_xt002() new spell_xt002_heart_overload_periodic(); new spell_xt002_tympanic_tantrum(); new spell_xt002_submerged(); - new spell_xt002_stand(); new achievement_nerf_engineering(); new achievement_heartbreaker(); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp index 2471b705b90..d3012dc99ba 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp @@ -427,9 +427,17 @@ class boss_voice_of_yogg_saron : public CreatureScript { boss_voice_of_yogg_saronAI(Creature* creature) : BossAI(creature, BOSS_YOGG_SARON) { + Initialize(); SetCombatMovement(false); } + void Initialize() + { + _guardiansCount = 0; + _guardianTimer = 20000; + _illusionShattered = false; + } + void MoveInLineOfSight(Unit* who) override { @@ -467,9 +475,7 @@ class boss_voice_of_yogg_saron : public CreatureScript instance->SetData(DATA_DRIVE_ME_CRAZY, uint32(true)); instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); - _guardiansCount = 0; - _guardianTimer = 20000; - _illusionShattered = false; + Initialize(); bool clockwise = false; std::list<TempSummon*> clouds; @@ -1014,7 +1020,10 @@ class boss_brain_of_yogg_saron : public CreatureScript struct boss_brain_of_yogg_saronAI : public PassiveAI { - boss_brain_of_yogg_saronAI(Creature* creature) : PassiveAI(creature), _instance(creature->GetInstanceScript()), _summons(creature) { } + boss_brain_of_yogg_saronAI(Creature* creature) : PassiveAI(creature), _instance(creature->GetInstanceScript()), _summons(creature) + { + _tentaclesKilled = 0; + } void Reset() override { @@ -1953,7 +1962,7 @@ class spell_yogg_saron_target_selectors : public SpellScriptLoader // 63744, class SanityReduction : public SpellScript { public: - SanityReduction() : SpellScript() { } + SanityReduction() : SpellScript(), _stacks(0) { } SanityReduction(uint8 stacks) : SpellScript(), _stacks(stacks) { } void RemoveSanity(SpellEffIndex /*effIndex*/) diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp index 7a1566df71d..ee52df58c80 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp @@ -264,6 +264,9 @@ class npc_annhylde_the_caller : public CreatureScript { npc_annhylde_the_callerAI(Creature* creature) : ScriptedAI(creature) { + x = 0.f; + y = 0.f; + z = 0.f; _instance = creature->GetInstanceScript(); } diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp index eb60444f9c2..6e0dbecafb4 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp @@ -115,7 +115,15 @@ class boss_keleseth : public CreatureScript struct boss_kelesethAI : public BossAI { - boss_kelesethAI(Creature* creature) : BossAI(creature, DATA_PRINCE_KELESETH) { } + boss_kelesethAI(Creature* creature) : BossAI(creature, DATA_PRINCE_KELESETH) + { + Initialize(); + } + + void Initialize() + { + onTheRocks = true; + } void Reset() override { @@ -124,7 +132,7 @@ class boss_keleseth : public CreatureScript events.ScheduleEvent(EVENT_FROST_TOMB, urand(14, 19)*IN_MILLISECONDS); events.ScheduleEvent(EVENT_SUMMON_SKELETONS, 6*IN_MILLISECONDS); - onTheRocks = true; + Initialize(); } void EnterCombat(Unit* who) override diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp index 245cf46336d..b3285bd492e 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp @@ -92,20 +92,11 @@ public: { boss_palehoofAI(Creature* creature) : BossAI(creature, DATA_GORTOK_PALEHOOF) { + Initialize(); } - uint32 uiArcingSmashTimer; - uint32 uiImpaleTimer; - uint32 uiWhiteringRoarTimer; - uint32 uiWaitingTimer; - Phase currentPhase; - uint8 AddCount; - Phase Sequence[4]; - - void Reset() override + void Initialize() { - _Reset(); - /// There is a good reason to store them like this, we are going to shuffle the order. for (uint32 i = PHASE_FRENZIED_WORGEN; i < PHASE_GORTOK_PALEHOOF; ++i) Sequence[i] = Phase(i); @@ -117,11 +108,25 @@ public: uiImpaleTimer = 12000; uiWhiteringRoarTimer = 10000; - me->GetMotionMaster()->MoveTargetedHome(); - AddCount = 0; currentPhase = PHASE_NONE; + } + + uint32 uiArcingSmashTimer; + uint32 uiImpaleTimer; + uint32 uiWhiteringRoarTimer; + Phase currentPhase; + uint8 AddCount; + Phase Sequence[4]; + + void Reset() override + { + _Reset(); + + Initialize(); + + me->GetMotionMaster()->MoveTargetedHome(); for (uint8 i = DATA_FRENZIED_WORGEN; i <= DATA_FEROCIOUS_RHINO; ++i) if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetData64(i))) @@ -263,9 +268,17 @@ public: { npc_ravenous_furbolgAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); instance = creature->GetInstanceScript(); } + void Initialize() + { + uiChainLightingTimer = 5000; + uiCrazedTimer = 10000; + uiTerrifyingRoarTimer = 15000; + } + uint32 uiChainLightingTimer; uint32 uiCrazedTimer; uint32 uiTerrifyingRoarTimer; @@ -274,9 +287,7 @@ public: void Reset() override { - uiChainLightingTimer = 5000; - uiCrazedTimer = 10000; - uiTerrifyingRoarTimer = 15000; + Initialize(); me->GetMotionMaster()->MoveTargetedHome(); @@ -371,9 +382,17 @@ public: { npc_frenzied_worgenAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); instance = creature->GetInstanceScript(); } + void Initialize() + { + uiMortalWoundTimer = 5000; + uiEnrage1Timer = 15000; + uiEnrage2Timer = 10000; + } + uint32 uiMortalWoundTimer; uint32 uiEnrage1Timer; uint32 uiEnrage2Timer; @@ -382,9 +401,7 @@ public: void Reset() override { - uiMortalWoundTimer = 5000; - uiEnrage1Timer = 15000; - uiEnrage2Timer = 10000; + Initialize(); me->GetMotionMaster()->MoveTargetedHome(); @@ -481,9 +498,17 @@ public: { npc_ferocious_rhinoAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); instance = creature->GetInstanceScript(); } + void Initialize() + { + uiStompTimer = 10000; + uiGoreTimer = 15000; + uiGrievousWoundTimer = 20000; + } + uint32 uiStompTimer; uint32 uiGoreTimer; uint32 uiGrievousWoundTimer; @@ -492,9 +517,7 @@ public: void Reset() override { - uiStompTimer = 10000; - uiGoreTimer = 15000; - uiGrievousWoundTimer = 20000; + Initialize(); me->GetMotionMaster()->MoveTargetedHome(); @@ -596,9 +619,17 @@ public: { npc_massive_jormungarAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); instance = creature->GetInstanceScript(); } + void Initialize() + { + uiAcidSpitTimer = 3000; + uiAcidSplatterTimer = 12000; + uiPoisonBreathTimer = 10000; + } + uint32 uiAcidSpitTimer; uint32 uiAcidSplatterTimer; uint32 uiPoisonBreathTimer; @@ -607,9 +638,7 @@ public: void Reset() override { - uiAcidSpitTimer = 3000; - uiAcidSplatterTimer = 12000; - uiPoisonBreathTimer = 10000; + Initialize(); me->GetMotionMaster()->MoveTargetedHome(); @@ -697,17 +726,23 @@ public: { npc_palehoof_orbAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); instance = creature->GetInstanceScript(); } + void Initialize() + { + currentPhase = PHASE_NONE; + SummonTimer = 5000; + } + InstanceScript* instance; uint32 SummonTimer; Phase currentPhase; void Reset() override { - currentPhase = PHASE_NONE; - SummonTimer = 5000; + Initialize(); //! HACK: Creature's can't have MOVEMENTFLAG_FLYING me->AddUnitMovementFlag(MOVEMENTFLAG_FLYING); me->RemoveAurasDueToSpell(SPELL_ORB_VISUAL); diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp index ea44d76e7e6..af5dc4a4e03 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp @@ -169,8 +169,24 @@ public: { boss_skadiAI(Creature* creature) : ScriptedAI(creature), Summons(me) { + Initialize(); instance = creature->GetInstanceScript(); m_uiGraufGUID = 0; + m_uiMovementTimer = 0; + m_uiSummonTimer = 0; + } + + void Initialize() + { + m_uiCrushTimer = 8000; + m_uiPoisonedSpearTimer = 10000; + m_uiWhirlwindTimer = 20000; + m_uiMountTimer = 3000; + m_uiWaypointId = 0; + m_bSaidEmote = false; + m_uiSpellHitCount = 0; + + Phase = SKADI; } InstanceScript* instance; @@ -194,15 +210,7 @@ public: { triggersGUID.clear(); - m_uiCrushTimer = 8000; - m_uiPoisonedSpearTimer = 10000; - m_uiWhirlwindTimer = 20000; - m_uiMountTimer = 3000; - m_uiWaypointId = 0; - m_bSaidEmote = false; - m_uiSpellHitCount = 0; - - Phase = SKADI; + Initialize(); Summons.DespawnAll(); me->SetSpeed(MOVE_FLIGHT, 3.0f); diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp index 621ef20e7e4..6ace4eb61a1 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp @@ -137,13 +137,20 @@ class boss_svala : public CreatureScript { boss_svalaAI(Creature* creature) : BossAI(creature, DATA_SVALA_SORROWGRAVE) { + Initialize(); _introCompleted = false; } + void Initialize() + { + _arthasGUID = 0; + _sacrificed = false; + } + void Reset() override { _Reset(); - _sacrificed = false; + SetCombatMovement(true); if (_introCompleted) @@ -153,7 +160,7 @@ class boss_svala : public CreatureScript me->SetDisableGravity(events.IsInPhase(NORMAL)); - _arthasGUID = 0; + Initialize(); instance->SetData64(DATA_SACRIFICED_PLAYER, 0); } @@ -398,17 +405,23 @@ class npc_ritual_channeler : public CreatureScript { npc_ritual_channelerAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); instance = creature->GetInstanceScript(); SetCombatMovement(false); } + void Initialize() + { + paralyzeTimer = 1600; + } + InstanceScript* instance; uint32 paralyzeTimer; void Reset() override { - paralyzeTimer = 1600; + Initialize(); if (IsHeroic()) DoCast(me, SPELL_SHADOWS_IN_THE_DARK); @@ -514,16 +527,24 @@ class npc_scourge_hulk : public CreatureScript struct npc_scourge_hulkAI : public ScriptedAI { - npc_scourge_hulkAI(Creature* creature) : ScriptedAI(creature) { } + npc_scourge_hulkAI(Creature* creature) : ScriptedAI(creature) + { + Initialize(); + } + + void Initialize() + { + mightyBlow = urand(4000, 9000); + volatileInfection = urand(10000, 14000); + killedByRitualStrike = false; + } uint32 mightyBlow; uint32 volatileInfection; void Reset() override { - mightyBlow = urand(4000, 9000); - volatileInfection = urand(10000, 14000); - killedByRitualStrike = false; + Initialize(); } uint32 GetData(uint32 type) const override diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp index 01e09ca2f9a..1d3fcba09de 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp @@ -15,22 +15,16 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* Script Data Start -SDName: Boss ymiron -SDAuthor: LordVanMartin -SD%Complete: -SDComment: -SDCategory: -Script Data End */ - #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "utgarde_pinnacle.h" #include "SpellInfo.h" +#include "SpellScript.h" enum Spells { SPELL_BANE = 48294, + SPELL_BANE_HIT = 59203, // Checked for King's Bane achievement. SPELL_DARK_SLASH = 48292, SPELL_FETID_ROT = 48291, SPELL_SCREAMS_OF_THE_DEAD = 51750, @@ -47,8 +41,7 @@ enum Spells SPELL_SPIRIT_FOUNT = 48380 }; -//not in db -enum Yells +enum Texts { SAY_AGGRO = 0, SAY_SLAY = 1, @@ -59,18 +52,27 @@ enum Yells SAY_SUMMON_TORGYN = 6 }; -enum Creatures +enum Events { - NPC_BJORN = 27303, - NPC_BJORN_VISUAL = 27304, - NPC_HALDOR = 27307, - NPC_HALDOR_VISUAL = 27310, - NPC_RANULF = 27308, - NPC_RANULF_VISUAL = 27311, - NPC_TORGYN = 27309, - NPC_TORGYN_VISUAL = 27312, - NPC_SPIRIT_FOUNT = 27339, - NPC_AVENGING_SPIRIT = 27386 + EVENT_BANE = 1, + EVENT_FETID_ROT, + EVENT_DARK_SLASH, + EVENT_ANCESTORS_VENGEANCE, + EVENT_RESUME_COMBAT, // Handles react state and schedules the next event after roleplay ends. + EVENT_BJORN_SPIRIT_FOUNT, + EVENT_HALDOR_SPIRIT_STRIKE, + EVENT_RANULF_SPIRIT_BURST, + EVENT_TORGYN_SUMMON_AVENGING_SPIRITS +}; + +enum EventGroups +{ + EVENT_GROUP_BASE_SPELLS = 1 +}; + +enum MovePoints +{ + POINT_BOAT }; struct ActiveBoatStruct @@ -78,14 +80,15 @@ struct ActiveBoatStruct uint32 npc; int32 say; float MoveX, MoveY, MoveZ, SpawnX, SpawnY, SpawnZ, SpawnO; + uint32 event; }; static ActiveBoatStruct ActiveBoat[4] = { - {NPC_BJORN_VISUAL, SAY_SUMMON_BJORN, 404.379f, -335.335f, 104.756f, 413.594f, -335.408f, 107.995f, 3.157f}, - {NPC_HALDOR_VISUAL, SAY_SUMMON_HALDOR, 380.813f, -335.069f, 104.756f, 369.994f, -334.771f, 107.995f, 6.232f}, - {NPC_RANULF_VISUAL, SAY_SUMMON_RANULF, 381.546f, -314.362f, 104.756f, 370.841f, -314.426f, 107.995f, 6.232f}, - {NPC_TORGYN_VISUAL, SAY_SUMMON_TORGYN, 404.310f, -314.761f, 104.756f, 413.992f, -314.703f, 107.995f, 3.157f} + {NPC_BJORN_VISUAL, SAY_SUMMON_BJORN, 404.379f, -335.335f, 104.756f, 413.594f, -335.408f, 107.995f, 3.157f, EVENT_BJORN_SPIRIT_FOUNT}, + {NPC_HALDOR_VISUAL, SAY_SUMMON_HALDOR, 380.813f, -335.069f, 104.756f, 369.994f, -334.771f, 107.995f, 6.232f, EVENT_HALDOR_SPIRIT_STRIKE}, + {NPC_RANULF_VISUAL, SAY_SUMMON_RANULF, 381.546f, -314.362f, 104.756f, 370.841f, -314.426f, 107.995f, 6.232f, EVENT_RANULF_SPIRIT_BURST}, + {NPC_TORGYN_VISUAL, SAY_SUMMON_TORGYN, 404.310f, -314.761f, 104.756f, 413.992f, -314.703f, 107.995f, 3.157f, EVENT_TORGYN_SUMMON_AVENGING_SPIRITS} }; enum Misc @@ -102,84 +105,49 @@ public: { boss_ymironAI(Creature* creature) : BossAI(creature, DATA_KING_YMIRON) { + Initialize(); + // This ensures a random sequence of ancestors. Not sure if the order should change on reset or not, reason why this is left out of Initialize(). for (int i = 0; i < 4; ++i) - m_uiActiveOrder[i] = i; + ActiveOrder[i] = i; for (int i = 0; i < 3; ++i) { int r = i + (rand32() % (4 - i)); - int temp = m_uiActiveOrder[i]; - m_uiActiveOrder[i] = m_uiActiveOrder[r]; - m_uiActiveOrder[r] = temp; + int temp = ActiveOrder[i]; + ActiveOrder[i] = ActiveOrder[r]; + ActiveOrder[r] = temp; } } - bool m_bIsWalking; - bool m_bIsPause; - bool m_bIsActiveWithBJORN; - bool m_bIsActiveWithHALDOR; - bool m_bIsActiveWithRANULF; - bool m_bIsActiveWithTORGYN; - bool kingsBane; // Achievement King's Bane - - uint8 m_uiActiveOrder[4]; - uint8 m_uiActivedNumber; - - uint32 m_uiFetidRot_Timer; - uint32 m_uiBane_Timer; - uint32 m_uiDarkSlash_Timer; - uint32 m_uiAncestors_Vengeance_Timer; - - uint32 m_uiAbility_BJORN_Timer; - uint32 m_uiAbility_HALDOR_Timer; - uint32 m_uiAbility_RANULF_Timer; - uint32 m_uiAbility_TORGYN_Timer; - - uint32 m_uiPause_Timer; - uint32 m_uiHealthAmountModifier; - uint32 m_uiHealthAmountMultipler; - - uint64 m_uiActivedCreatureGUID; - uint64 m_uiOrbGUID; + void Initialize() + { + kingsBane = true; + ActivedNumber = 0; + HealthAmountModifier = 1; + HealthAmountMultipler = DUNGEON_MODE(20, 25); + ActiveAncestorGUID = 0; + SpiritFountGUID = 0; + } void Reset() override { _Reset(); - m_bIsWalking = false; - m_bIsPause = false; - m_bIsActiveWithBJORN = false; - m_bIsActiveWithHALDOR = false; - m_bIsActiveWithRANULF = false; - m_bIsActiveWithTORGYN = false; - kingsBane = true; - - m_uiFetidRot_Timer = urand(8000, 13000); - m_uiBane_Timer = urand(18000, 23000); - m_uiDarkSlash_Timer = urand(28000, 33000); - m_uiAncestors_Vengeance_Timer = DUNGEON_MODE(60000, 45000); - m_uiPause_Timer = 0; - - m_uiAbility_BJORN_Timer = 0; - m_uiAbility_HALDOR_Timer = 0; - m_uiAbility_RANULF_Timer = 0; - m_uiAbility_TORGYN_Timer = 0; - - m_uiActivedNumber = 0; - m_uiHealthAmountModifier = 1; - m_uiHealthAmountMultipler = DUNGEON_MODE(20, 25); - - m_uiActivedCreatureGUID = 0; - m_uiOrbGUID = 0; + Initialize(); + me->SetReactState(REACT_AGGRESSIVE); } void EnterCombat(Unit* /*who*/) override { _EnterCombat(); Talk(SAY_AGGRO); + events.ScheduleEvent(EVENT_BANE, urand(18000, 23000), EVENT_GROUP_BASE_SPELLS); + events.ScheduleEvent(EVENT_FETID_ROT, urand(8000, 13000), EVENT_GROUP_BASE_SPELLS); + events.ScheduleEvent(EVENT_DARK_SLASH, urand(28000, 33000), EVENT_GROUP_BASE_SPELLS); + events.ScheduleEvent(EVENT_ANCESTORS_VENGEANCE, DUNGEON_MODE(60000, 45000), EVENT_GROUP_BASE_SPELLS); } void SpellHitTarget(Unit* who, SpellInfo const* spell) override { - if (who && who->GetTypeId() == TYPEID_PLAYER && spell->Id == 59302) + if (who && who->GetTypeId() == TYPEID_PLAYER && spell->Id == SPELL_BANE_HIT) kingsBane = false; } @@ -191,161 +159,115 @@ public: return 0; } - void UpdateAI(uint32 diff) override + void MovementInform(uint32 type, uint32 pointId) override { - if (m_bIsWalking) + if (type != POINT_MOTION_TYPE) + return; + + if (pointId == POINT_BOAT) // Check might not be needed. { - if (m_uiPause_Timer <= diff) + Talk(ActiveBoat[ActiveOrder[ActivedNumber]].say); + if (Creature* ancestor = me->SummonCreature(ActiveBoat[ActiveOrder[ActivedNumber]].npc, ActiveBoat[ActiveOrder[ActivedNumber]].SpawnX, ActiveBoat[ActiveOrder[ActivedNumber]].SpawnY, ActiveBoat[ActiveOrder[ActivedNumber]].SpawnZ, ActiveBoat[ActiveOrder[ActivedNumber]].SpawnO, TEMPSUMMON_CORPSE_DESPAWN, 0)) { - Talk(ActiveBoat[m_uiActiveOrder[m_uiActivedNumber]].say); - DoCast(me, SPELL_CHANNEL_YMIRON_TO_SPIRIT); // should be on spirit - if (Creature* temp = me->SummonCreature(ActiveBoat[m_uiActiveOrder[m_uiActivedNumber]].npc, ActiveBoat[m_uiActiveOrder[m_uiActivedNumber]].SpawnX, ActiveBoat[m_uiActiveOrder[m_uiActivedNumber]].SpawnY, ActiveBoat[m_uiActiveOrder[m_uiActivedNumber]].SpawnZ, ActiveBoat[m_uiActiveOrder[m_uiActivedNumber]].SpawnO, TEMPSUMMON_CORPSE_DESPAWN, 0)) - { - m_uiActivedCreatureGUID = temp->GetGUID(); - temp->CastSpell(me, SPELL_CHANNEL_SPIRIT_TO_YMIRON, true); - temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); - temp->SetDisableGravity(true); - switch (m_uiActiveOrder[m_uiActivedNumber]) - { - case 0: m_bIsActiveWithBJORN = true; break; - case 1: m_bIsActiveWithHALDOR = true; break; - case 2: m_bIsActiveWithRANULF = true; break; - case 3: m_bIsActiveWithTORGYN = true; break; - } - } - - m_bIsPause = true; - m_bIsWalking = false; - m_uiPause_Timer = 3000; - } else m_uiPause_Timer -= diff; - return; + DoCast(ancestor, SPELL_CHANNEL_YMIRON_TO_SPIRIT); + ancestor->CastSpell(me, SPELL_CHANNEL_SPIRIT_TO_YMIRON, true); + ancestor->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); + ancestor->SetDisableGravity(true); + ActiveAncestorGUID = ancestor->GetGUID(); + } + events.ScheduleEvent(EVENT_RESUME_COMBAT, 5000); } - else if (m_bIsPause) + } + + void JustSummoned(Creature* summon) override + { + switch (summon->GetEntry()) { - if (m_uiPause_Timer <= diff) - { - m_uiAbility_BJORN_Timer = 5000; - m_uiAbility_HALDOR_Timer = 5000; - m_uiAbility_RANULF_Timer = 5000; - m_uiAbility_TORGYN_Timer = 5000; - - m_bIsPause = false; - m_uiPause_Timer = 0; - } else m_uiPause_Timer -= diff; - return; + case NPC_SPIRIT_FOUNT: + summon->CastSpell(summon, SPELL_SPIRIT_FOUNT, true); + summon->SetDisplayId(11686); + SpiritFountGUID = summon->GetGUID(); + break; + case NPC_AVENGING_SPIRIT: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + { + summon->AddThreat(target, 0.0f); + summon->AI()->AttackStart(target); + } + break; + default: + break; } - //Return since we have no target - if (!UpdateVictim()) - return; + summons.Summon(summon); + } - if (!m_bIsPause) + void DamageTaken(Unit* /*attacker*/, uint32& damage) override + { + if (me->HealthBelowPctDamaged(100 - HealthAmountMultipler * HealthAmountModifier, damage)) { - // Normal spells ------------------------------------------------------------------------ - if (m_uiBane_Timer <= diff) - { - DoCast(me, SPELL_BANE); - m_uiBane_Timer = urand(20000, 25000); - } else m_uiBane_Timer -= diff; + uint8 Order = HealthAmountModifier - 1; + ++HealthAmountModifier; - if (m_uiFetidRot_Timer <= diff) - { - DoCastVictim(SPELL_FETID_ROT); - m_uiFetidRot_Timer = urand(10000, 15000); - } else m_uiFetidRot_Timer -= diff; + me->InterruptNonMeleeSpells(true); + DoCast(me, SPELL_SCREAMS_OF_THE_DEAD); - if (m_uiDarkSlash_Timer <= diff) - { - DoCastVictim(SPELL_DARK_SLASH); - m_uiDarkSlash_Timer = urand(30000, 35000); - } else m_uiDarkSlash_Timer -= diff; + me->AttackStop(); + me->SetReactState(REACT_PASSIVE); + me->GetMotionMaster()->MovePoint(POINT_BOAT, ActiveBoat[ActiveOrder[Order]].MoveX, ActiveBoat[ActiveOrder[Order]].MoveY, ActiveBoat[ActiveOrder[Order]].MoveZ); - if (m_uiAncestors_Vengeance_Timer <= diff) - { - DoCast(me, SPELL_ANCESTORS_VENGEANCE); - m_uiAncestors_Vengeance_Timer = DUNGEON_MODE(urand(60000, 65000), urand(45000, 50000)); - } else m_uiAncestors_Vengeance_Timer -= diff; + DespawnBoatGhosts(ActiveAncestorGUID); + DespawnBoatGhosts(SpiritFountGUID); - // Abilities ------------------------------------------------------------------------------ - if (m_bIsActiveWithBJORN && m_uiAbility_BJORN_Timer <= diff) - { - //DoCast(me, SPELL_SUMMON_SPIRIT_FOUNT); // works fine, but using summon has better control - if (Creature* temp = me->SummonCreature(NPC_SPIRIT_FOUNT, 385.0f + rand32() % 10, -330.0f + rand32() % 10, 104.756f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 180000)) - { - temp->SetSpeed(MOVE_RUN, 0.4f); - temp->CastSpell(temp, SPELL_SPIRIT_FOUNT, true); - temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); - temp->SetDisplayId(11686); - m_uiOrbGUID = temp->GetGUID(); - } - m_bIsActiveWithBJORN = false; // only one orb - } else m_uiAbility_BJORN_Timer -= diff; + events.CancelEvent(ActiveBoat[ActiveOrder[ActivedNumber]].event); // Cancels the event started on the previous transition. + events.DelayEvents(10000, EVENT_GROUP_BASE_SPELLS); - if (m_bIsActiveWithHALDOR && m_uiAbility_HALDOR_Timer <= diff) - { - DoCastVictim(SPELL_SPIRIT_STRIKE); - m_uiAbility_HALDOR_Timer = 5000; // overtime - } else m_uiAbility_HALDOR_Timer -= diff; + ActivedNumber = Order; + } + } - if (m_bIsActiveWithRANULF && m_uiAbility_RANULF_Timer <= diff) - { + void ExecuteEvent(uint32 eventId) override + { + switch (eventId) + { + case EVENT_BANE: + DoCast(SPELL_BANE); + events.ScheduleEvent(EVENT_BANE, urand(20000, 25000)); + break; + case EVENT_FETID_ROT: + DoCastVictim(SPELL_FETID_ROT); + events.ScheduleEvent(EVENT_FETID_ROT, urand(10000, 15000)); + break; + case EVENT_DARK_SLASH: + DoCastVictim(SPELL_DARK_SLASH); + events.ScheduleEvent(EVENT_DARK_SLASH, urand(30000, 35000)); + break; + case EVENT_ANCESTORS_VENGEANCE: + DoCast(me, SPELL_ANCESTORS_VENGEANCE); + events.ScheduleEvent(EVENT_ANCESTORS_VENGEANCE, DUNGEON_MODE(urand(60000, 65000), urand(45000, 50000))); + break; + case EVENT_RESUME_COMBAT: + me->SetReactState(REACT_AGGRESSIVE); + events.ScheduleEvent(ActiveBoat[ActiveOrder[ActivedNumber]].event, 5000); + break; + case EVENT_BJORN_SPIRIT_FOUNT: + DoCast(SPELL_SUMMON_SPIRIT_FOUNT); + break; + case EVENT_HALDOR_SPIRIT_STRIKE: + DoCastVictim(SPELL_SPIRIT_STRIKE); + events.ScheduleEvent(EVENT_HALDOR_SPIRIT_STRIKE, 5000); + break; + case EVENT_RANULF_SPIRIT_BURST: DoCast(me, SPELL_SPIRIT_BURST); - m_uiAbility_RANULF_Timer = 10000; // overtime - } else m_uiAbility_RANULF_Timer -= diff; - - if (m_bIsActiveWithTORGYN && m_uiAbility_TORGYN_Timer <= diff) - { - float x, y, z; - x = me->GetPositionX()-5; - y = me->GetPositionY()-5; - z = me->GetPositionZ(); + events.ScheduleEvent(EVENT_RANULF_SPIRIT_BURST, 10000); + break; + case EVENT_TORGYN_SUMMON_AVENGING_SPIRITS: for (uint8 i = 0; i < 4; ++i) - { - //DoCast(me, SPELL_SUMMON_AVENGING_SPIRIT); // works fine, but using summon has better control - if (Creature* temp = me->SummonCreature(NPC_AVENGING_SPIRIT, x + rand32() % 10, y + rand32() % 10, z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000)) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - { - temp->AddThreat(target, 0.0f); - temp->AI()->AttackStart(target); - } - } - } - m_uiAbility_TORGYN_Timer = 15000; // overtime - } else m_uiAbility_TORGYN_Timer -= diff; - - // Health check ----------------------------------------------------------------------------- - if (me->HealthBelowPct(100 - m_uiHealthAmountMultipler * m_uiHealthAmountModifier)) - { - uint8 m_uiOrder = m_uiHealthAmountModifier - 1; - ++m_uiHealthAmountModifier; - - me->InterruptNonMeleeSpells(true); - DoCast(me, SPELL_SCREAMS_OF_THE_DEAD); - me->GetMotionMaster()->Clear(); - me->StopMoving(); - me->AttackStop(); - me->GetMotionMaster()->MovePoint(0, ActiveBoat[m_uiActiveOrder[m_uiOrder]].MoveX, ActiveBoat[m_uiActiveOrder[m_uiOrder]].MoveY, ActiveBoat[m_uiActiveOrder[m_uiOrder]].MoveZ); - - DespawnBoatGhosts(m_uiActivedCreatureGUID); - DespawnBoatGhosts(m_uiOrbGUID); - - m_bIsActiveWithBJORN = false; - m_bIsActiveWithHALDOR = false; - m_bIsActiveWithRANULF = false; - m_bIsActiveWithTORGYN = false; - - m_uiBane_Timer += 8000; - m_uiFetidRot_Timer += 8000; - m_uiDarkSlash_Timer += 8000; - m_uiAncestors_Vengeance_Timer += 8000; - - m_uiActivedNumber = m_uiOrder; - m_bIsWalking = true; - m_uiPause_Timer = 2000; - return; - } - DoMeleeAttackIfReady(); + DoCast(SPELL_SUMMON_AVENGING_SPIRIT); + events.ScheduleEvent(EVENT_TORGYN_SUMMON_AVENGING_SPIRITS, 15000); + break; + default: + break; } } @@ -361,14 +283,24 @@ public: Talk(SAY_SLAY); } - void DespawnBoatGhosts(uint64& m_uiCreatureGUID) + void DespawnBoatGhosts(uint64& CreatureGUID) { - if (m_uiCreatureGUID) - if (Creature* temp = ObjectAccessor::GetCreature(*me, m_uiCreatureGUID)) + // @todo: fire visual after ancestor despawns. + if (CreatureGUID) + if (Creature* temp = ObjectAccessor::GetCreature(*me, CreatureGUID)) temp->DisappearAndDie(); - m_uiCreatureGUID = 0; + CreatureGUID = 0; } + + private: + bool kingsBane; // Achievement King's Bane + uint8 ActiveOrder[4]; + uint8 ActivedNumber; + uint32 HealthAmountModifier; + uint32 HealthAmountMultipler; + uint64 ActiveAncestorGUID; + uint64 SpiritFountGUID; }; CreatureAI* GetAI(Creature* creature) const override diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h index cccfcede80b..5373446ba02 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h @@ -59,7 +59,19 @@ enum CreatureIds NPC_RAVENOUS_FURBOLG = 26684, NPC_MASSIVE_JORMUNGAR = 26685, NPC_FEROCIOUS_RHINO = 26686, - NPC_PALEHOOF_ORB = 26688 + NPC_PALEHOOF_ORB = 26688, + + // Ymiron + NPC_BJORN = 27303, + NPC_BJORN_VISUAL = 27304, + NPC_HALDOR = 27307, + NPC_HALDOR_VISUAL = 27310, + NPC_RANULF = 27308, + NPC_RANULF_VISUAL = 27311, + NPC_TORGYN = 27309, + NPC_TORGYN_VISUAL = 27312, + NPC_SPIRIT_FOUNT = 27339, + NPC_AVENGING_SPIRIT = 27386 }; enum GameObjectIds diff --git a/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp index ea5c5b9ee48..8a88abb9d06 100644 --- a/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp +++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp @@ -184,13 +184,19 @@ class npc_tempest_minion : public CreatureScript { npc_tempest_minionAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); instance = creature->GetInstanceScript(); } + void Initialize() + { + OverchargedTimer = 0; + } + void Reset() override { events.Reset(); - OverchargedTimer = 0; + Initialize(); } void JustDied(Unit* /*killer*/) override diff --git a/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp index caba44a7100..36c952d14a1 100644 --- a/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp +++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp @@ -185,14 +185,20 @@ public: { npc_frozen_orbAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); } - void Reset() override + void Initialize() { done = false; killTimer = 60000; // if after this time there is no victim -> destroy! } + void Reset() override + { + Initialize(); + } + void EnterCombat(Unit* /*who*/) override { DoZoneInCombat(); diff --git a/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp b/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp index cca2b347af7..5857f695023 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp @@ -57,9 +57,19 @@ public: { boss_cyanigosaAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); instance = creature->GetInstanceScript(); } + void Initialize() + { + uiArcaneVacuumTimer = 10000; + uiBlizzardTimer = 15000; + uiManaDestructionTimer = 30000; + uiTailSweepTimer = 20000; + uiUncontrollableEnergyTimer = 25000; + } + uint32 uiArcaneVacuumTimer; uint32 uiBlizzardTimer; uint32 uiManaDestructionTimer; @@ -70,11 +80,7 @@ public: void Reset() override { - uiArcaneVacuumTimer = 10000; - uiBlizzardTimer = 15000; - uiManaDestructionTimer = 30000; - uiTailSweepTimer = 20000; - uiUncontrollableEnergyTimer = 25000; + Initialize(); instance->SetData(DATA_CYANIGOSA_EVENT, NOT_STARTED); } diff --git a/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp b/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp index b63709b34c8..6cc90bcd4ed 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp @@ -56,9 +56,19 @@ public: { boss_erekemAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); instance = creature->GetInstanceScript(); } + void Initialize() + { + uiBloodlustTimer = 15000; + uiChainHealTimer = 0; + uiEarthShockTimer = urand(2000, 8000); + uiLightningBoltTimer = urand(5000, 10000); + uiEarthShieldTimer = 20000; + } + uint32 uiBloodlustTimer; uint32 uiChainHealTimer; uint32 uiEarthShockTimer; @@ -69,11 +79,7 @@ public: void Reset() override { - uiBloodlustTimer = 15000; - uiChainHealTimer = 0; - uiEarthShockTimer = urand(2000, 8000); - uiLightningBoltTimer = urand(5000, 10000); - uiEarthShieldTimer = 20000; + Initialize(); if (instance->GetData(DATA_WAVE_COUNT) == 6) instance->SetData(DATA_1ST_BOSS_EVENT, NOT_STARTED); else if (instance->GetData(DATA_WAVE_COUNT) == 12) @@ -264,9 +270,17 @@ public: { npc_erekem_guardAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); instance = creature->GetInstanceScript(); } + void Initialize() + { + uiStrikeTimer = urand(4000, 8000); + uiHowlingScreechTimer = urand(8000, 13000); + uiGushingWoundTimer = urand(1000, 3000); + } + uint32 uiGushingWoundTimer; uint32 uiHowlingScreechTimer; uint32 uiStrikeTimer; @@ -275,9 +289,7 @@ public: void Reset() override { - uiStrikeTimer = urand(4000, 8000); - uiHowlingScreechTimer = urand(8000, 13000); - uiGushingWoundTimer = urand(1000, 3000); + Initialize(); } void AttackStart(Unit* who) override diff --git a/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp b/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp index 4aede5e5f46..ba72f6f52ca 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp @@ -85,9 +85,19 @@ public: { boss_ichoronAI(Creature* creature) : ScriptedAI(creature), m_waterElements(creature) { + Initialize(); instance = creature->GetInstanceScript(); } + void Initialize() + { + bIsExploded = false; + bIsFrenzy = false; + dehydration = true; + uiBubbleCheckerTimer = 1000; + uiWaterBoltVolleyTimer = urand(10000, 15000); + } + bool bIsExploded; bool bIsFrenzy; bool dehydration; @@ -101,11 +111,7 @@ public: void Reset() override { - bIsExploded = false; - bIsFrenzy = false; - dehydration = true; - uiBubbleCheckerTimer = 1000; - uiWaterBoltVolleyTimer = urand(10000, 15000); + Initialize(); me->SetVisible(true); DespawnWaterElements(); @@ -340,16 +346,22 @@ public: { npc_ichor_globuleAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); instance = creature->GetInstanceScript(); } + void Initialize() + { + uiRangeCheck_Timer = 1000; + } + InstanceScript* instance; uint32 uiRangeCheck_Timer; void Reset() override { - uiRangeCheck_Timer = 1000; + Initialize(); DoCast(me, SPELL_WATER_GLOBULE); } diff --git a/src/server/scripts/Northrend/zone_sholazar_basin.cpp b/src/server/scripts/Northrend/zone_sholazar_basin.cpp index a4d6ab31846..3f35fc0e172 100644 --- a/src/server/scripts/Northrend/zone_sholazar_basin.cpp +++ b/src/server/scripts/Northrend/zone_sholazar_basin.cpp @@ -977,15 +977,15 @@ public: void HandleScript(SpellEffIndex /*effIndex*/) { - if (Player* player = GetHitUnit()->ToPlayer()) + if (Unit* target = GetHitUnit()) { switch (GetSpellInfo()->Id) { case SPELL_CORRECT_TRACKS: - player->MonsterSay(sObjectMgr->GetTrinityStringForDBCLocale(SAY_CORRECT_TRACKS), LANG_UNIVERSAL, player); + target->Say(SAY_CORRECT_TRACKS, target); break; case SPELL_INCORRECT_TRACKS: - player->MonsterSay(sObjectMgr->GetTrinityStringForDBCLocale(SAY_INCORRECT_TRACKS), LANG_UNIVERSAL, player); + target->Say(SAY_INCORRECT_TRACKS, target); break; default: break; diff --git a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp index d9a66f7b420..8bc0ba1722a 100644 --- a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp +++ b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp @@ -39,7 +39,6 @@ enum Events EVENT_DARK_SHELL }; - class boss_pandemonius : public CreatureScript { public: @@ -81,7 +80,7 @@ public: switch (eventId) { case EVENT_VOID_BLAST: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) { DoCast(target, SPELL_VOID_BLAST); ++VoidBlastCounter; diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp index 08fc588e923..22cd886d99b 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp @@ -31,8 +31,6 @@ EndScriptData */ #include "Player.h" #include "SpellInfo.h" -#define EMOTE_UNABLE_TO_SUMMON "%s is unable to summon Maiev Shadowsong and enter Phase 4. Resetting Encounter." - // Other defines #define CENTER_X 676.740f #define CENTER_Y 305.297f @@ -605,7 +603,7 @@ public: if (Conversation[count].emote) creature->HandleEmoteCommand(Conversation[count].emote); // Make the Creature do some animation! if (Conversation[count].text.size()) - creature->MonsterYell(Conversation[count].text.c_str(), LANG_UNIVERSAL, NULL); // Have the Creature yell out some text + creature->Yell(Conversation[count].text.c_str(), LANG_UNIVERSAL); // Have the Creature yell out some text if (Conversation[count].sound) DoPlaySoundToSet(creature, Conversation[count].sound); // Play some sound on the creature } @@ -761,7 +759,6 @@ public: if (!MaievGUID) // If Maiev cannot be summoned, reset the encounter and post some errors to the console. { EnterEvadeMode(); - me->MonsterTextEmote(EMOTE_UNABLE_TO_SUMMON, NULL); TC_LOG_ERROR("scripts", "SD2 ERROR: Unable to summon Maiev Shadowsong (entry: 23197). Check your database to see if you have the proper SQL for Maiev Shadowsong (entry: 23197)"); } } diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp index 7e24f4b54b2..683efcdbcf0 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp @@ -281,7 +281,7 @@ public: if (continueTriggering) { DoCast(me, SPELL_BLESSING_OF_THE_TIDES); - me->MonsterYell(SAY_GAIN_BLESSING_OF_TIDES, LANG_UNIVERSAL, NULL); + me->Yell(SAY_GAIN_BLESSING_OF_TIDES, LANG_UNIVERSAL); DoPlaySoundToSet(me, SOUND_GAIN_BLESSING_OF_TIDES); } } diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp index a0ff469733c..83b8722ce47 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp @@ -234,7 +234,7 @@ public: if (SpoutTimer <= diff) { - me->MonsterTextEmote(EMOTE_SPOUT, NULL, true); + me->TextEmote(EMOTE_SPOUT, nullptr, true); me->SetReactState(REACT_PASSIVE); me->GetMotionMaster()->MoveRotate(20000, urand(0, 1) ? ROTATE_DIRECTION_LEFT : ROTATE_DIRECTION_RIGHT); SpoutTimer = 45000; diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp index bd16fe9edd2..15c660b4ad7 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp @@ -114,7 +114,6 @@ class boss_broggok : public CreatureScript break; } } - }; CreatureAI* GetAI(Creature* creature) const override diff --git a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp index 82f101980fe..5baaebc0d7b 100644 --- a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp @@ -40,7 +40,6 @@ enum Says enum Spells { SPELL_MORTAL_WOUND = 30641, - H_SPELL_MORTAL_WOUND = 36814, SPELL_SURGE = 34645, SPELL_RETALIATION = 22857 }; @@ -78,7 +77,6 @@ class boss_watchkeeper_gargolmar : public CreatureScript } void MoveInLineOfSight(Unit* who) override - { if (!me->GetVictim() && me->CanCreatureAttack(who)) { diff --git a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp index ae5ad009942..45262f9109c 100644 --- a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp @@ -181,7 +181,7 @@ class instance_magtheridons_lair : public InstanceMapScript Creature* Magtheridon = instance->GetCreature(MagtheridonGUID); if (Magtheridon && Magtheridon->IsAlive()) { - Magtheridon->MonsterTextEmote(EMOTE_BONDS_WEAKEN, NULL); + Magtheridon->TextEmote(EMOTE_BONDS_WEAKEN); CageTimer = 120000; } HandleGameObject(DoorGUID, false); diff --git a/src/server/scripts/Outland/zone_shattrath_city.cpp b/src/server/scripts/Outland/zone_shattrath_city.cpp index 9a62cde005c..c2e7df19ca1 100644 --- a/src/server/scripts/Outland/zone_shattrath_city.cpp +++ b/src/server/scripts/Outland/zone_shattrath_city.cpp @@ -30,7 +30,6 @@ npc_shattrathflaskvendors npc_zephyr npc_kservant npc_ishanah -npc_khadgar EndContentData */ #include "ScriptMgr.h" @@ -469,73 +468,6 @@ public: } }; -/*###### -# npc_khadgar -######*/ - -#define KHADGAR_GOSSIP_1 "I've heard your name spoken only in whispers, mage. Who are you?" -#define KHADGAR_GOSSIP_2 "Go on, please." -#define KHADGAR_GOSSIP_3 "I see." //6th too this -#define KHADGAR_GOSSIP_4 "What did you do then?" -#define KHADGAR_GOSSIP_5 "What happened next?" -#define KHADGAR_GOSSIP_7 "There was something else I wanted to ask you." - -class npc_khadgar : public CreatureScript -{ -public: - npc_khadgar() : CreatureScript("npc_khadgar") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - player->PlayerTalkClass->ClearMenus(); - switch (action) - { - case GOSSIP_ACTION_INFO_DEF+1: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, KHADGAR_GOSSIP_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - player->SEND_GOSSIP_MENU(9876, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+2: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, KHADGAR_GOSSIP_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3); - player->SEND_GOSSIP_MENU(9877, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+3: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, KHADGAR_GOSSIP_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+4); - player->SEND_GOSSIP_MENU(9878, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+4: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, KHADGAR_GOSSIP_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5); - player->SEND_GOSSIP_MENU(9879, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+5: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, KHADGAR_GOSSIP_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+6); - player->SEND_GOSSIP_MENU(9880, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+6: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, KHADGAR_GOSSIP_7, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+7); - player->SEND_GOSSIP_MENU(9881, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+7: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, KHADGAR_GOSSIP_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - player->SEND_GOSSIP_MENU(9243, creature->GetGUID()); - break; - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (player->GetQuestStatus(10211) != QUEST_STATUS_INCOMPLETE) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, KHADGAR_GOSSIP_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - - player->SEND_GOSSIP_MENU(9243, creature->GetGUID()); - - return true; - } -}; - void AddSC_shattrath_city() { new npc_raliq_the_drunk(); @@ -544,5 +476,4 @@ void AddSC_shattrath_city() new npc_zephyr(); new npc_kservant(); new npc_ishanah(); - new npc_khadgar(); } diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index e198a6a0c61..e14a9934fac 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -3682,6 +3682,37 @@ class spell_gen_gm_freeze : public SpellScriptLoader } }; +class spell_gen_stand : public SpellScriptLoader +{ +public: + spell_gen_stand() : SpellScriptLoader("spell_gen_stand") { } + + class spell_gen_stand_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_stand_SpellScript); + + void HandleScript(SpellEffIndex /*eff*/) + { + Creature* target = GetHitCreature(); + if (!target) + return; + + target->SetByteValue(UNIT_FIELD_BYTES_1, 0, UNIT_STAND_STATE_STAND); + target->HandleEmoteCommand(EMOTE_STATE_NONE); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_gen_stand_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_gen_stand_SpellScript(); + } +}; + void AddSC_generic_spell_scripts() { new spell_gen_absorb0_hitlimit1(); @@ -3763,4 +3794,5 @@ void AddSC_generic_spell_scripts() new spell_gen_whisper_gulch_yogg_saron_whisper(); new spell_gen_eject_all_passengers(); new spell_gen_gm_freeze(); + new spell_gen_stand(); } diff --git a/src/server/scripts/Spells/spell_quest.cpp b/src/server/scripts/Spells/spell_quest.cpp index e135bb08e73..92eeef5e8a8 100644 --- a/src/server/scripts/Spells/spell_quest.cpp +++ b/src/server/scripts/Spells/spell_quest.cpp @@ -280,8 +280,8 @@ class spell_q11396_11399_force_shield_arcane_purple_x3 : public SpellScriptLoade void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { Unit* target = GetTarget(); - target->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - target->AddUnitState(UNIT_STATE_ROOT); + target->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + target->AddUnitState(UNIT_STATE_ROOT); } void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) @@ -1777,7 +1777,7 @@ class spell_q12847_summon_soul_moveto_bunny : public SpellScriptLoader } }; - SpellScript *GetSpellScript() const override + SpellScript* GetSpellScript() const override { return new spell_q12847_summon_soul_moveto_bunny_SpellScript(); } diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp index 944ebe27b7b..ff42743c496 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -33,7 +33,6 @@ npc_guardian 100% guardianAI used to prevent players from accessin npc_garments_of_quests 80% NPC's related to all Garments of-quests 5621, 5624, 5625, 5648, 565 npc_injured_patient 100% patients for triage-quests (6622 and 6624) npc_doctor 100% Gustaf Vanhowzen and Gregory Victor, quest 6622 and 6624 (Triage) -npc_mount_vendor 100% Regular mount vendors all over the world. Display gossip if player doesn't meet the requirements to buy npc_sayge 100% Darkmoon event fortune teller, buff player based on answers given npc_snake_trap_serpents 80% AI for snakes that summoned by Snake Trap npc_shadowfiend 100% restore 5% of owner's mana when shadowfiend die from damage @@ -1176,101 +1175,6 @@ public: }; /*###### -## npc_mount_vendor -######*/ - -class npc_mount_vendor : public CreatureScript -{ -public: - npc_mount_vendor() : CreatureScript("npc_mount_vendor") { } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - bool canBuy = false; - uint32 vendor = creature->GetEntry(); - uint8 race = player->getRace(); - - switch (vendor) - { - case 384: //Katie Hunter - case 1460: //Unger Statforth - case 2357: //Merideth Carlson - case 4885: //Gregor MacVince - if (player->GetReputationRank(72) != REP_EXALTED && race != RACE_HUMAN) - player->SEND_GOSSIP_MENU(5855, creature->GetGUID()); - else canBuy = true; - break; - case 1261: //Veron Amberstill - if (player->GetReputationRank(47) != REP_EXALTED && race != RACE_DWARF) - player->SEND_GOSSIP_MENU(5856, creature->GetGUID()); - else canBuy = true; - break; - case 3362: //Ogunaro Wolfrunner - if (player->GetReputationRank(76) != REP_EXALTED && race != RACE_ORC) - player->SEND_GOSSIP_MENU(5841, creature->GetGUID()); - else canBuy = true; - break; - case 3685: //Harb Clawhoof - if (player->GetReputationRank(81) != REP_EXALTED && race != RACE_TAUREN) - player->SEND_GOSSIP_MENU(5843, creature->GetGUID()); - else canBuy = true; - break; - case 4730: //Lelanai - if (player->GetReputationRank(69) != REP_EXALTED && race != RACE_NIGHTELF) - player->SEND_GOSSIP_MENU(5844, creature->GetGUID()); - else canBuy = true; - break; - case 4731: //Zachariah Post - if (player->GetReputationRank(68) != REP_EXALTED && race != RACE_UNDEAD_PLAYER) - player->SEND_GOSSIP_MENU(5840, creature->GetGUID()); - else canBuy = true; - break; - case 7952: //Zjolnir - if (player->GetReputationRank(530) != REP_EXALTED && race != RACE_TROLL) - player->SEND_GOSSIP_MENU(5842, creature->GetGUID()); - else canBuy = true; - break; - case 7955: //Milli Featherwhistle - if (player->GetReputationRank(54) != REP_EXALTED && race != RACE_GNOME) - player->SEND_GOSSIP_MENU(5857, creature->GetGUID()); - else canBuy = true; - break; - case 16264: //Winaestra - if (player->GetReputationRank(911) != REP_EXALTED && race != RACE_BLOODELF) - player->SEND_GOSSIP_MENU(10305, creature->GetGUID()); - else canBuy = true; - break; - case 17584: //Torallius the Pack Handler - if (player->GetReputationRank(930) != REP_EXALTED && race != RACE_DRAENEI) - player->SEND_GOSSIP_MENU(10239, creature->GetGUID()); - else canBuy = true; - break; - } - - if (canBuy) - { - if (creature->IsVendor()) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); - } - return true; - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - player->PlayerTalkClass->ClearMenus(); - if (action == GOSSIP_ACTION_TRADE) - player->GetSession()->SendListInventory(creature->GetGUID()); - - return true; - } -}; - - -/*###### ## npc_sayge ######*/ @@ -2490,7 +2394,6 @@ void AddSC_npcs_special() new npc_injured_patient(); new npc_garments_of_quests(); new npc_guardian(); - new npc_mount_vendor(); new npc_sayge(); new npc_steam_tonk(); new npc_tonk_mine(); diff --git a/src/server/shared/Networking/AsyncAcceptor.h b/src/server/shared/Networking/AsyncAcceptor.h index a8b688e6b26..c8f8e2dbd90 100644 --- a/src/server/shared/Networking/AsyncAcceptor.h +++ b/src/server/shared/Networking/AsyncAcceptor.h @@ -32,8 +32,6 @@ public: _acceptor(ioService, tcp::endpoint(boost::asio::ip::address::from_string(bindIp), port)), _socket(ioService) { - boost::system::error_code error; - _acceptor.non_blocking(true, error); } template <class T> @@ -47,12 +45,13 @@ public: { try { - // this-> is required here to fix an segmentation fault in gcc 4.7.2 - reason is lambdas in a templated class - mgrHandler(std::move(this->_socket)); + _socket.non_blocking(true); + + mgrHandler(std::move(_socket)); } catch (boost::system::system_error const& err) { - TC_LOG_INFO("network", "Failed to retrieve client's remote address %s", err.what()); + TC_LOG_INFO("network", "Failed to initialize client's socket %s", err.what()); } } diff --git a/src/server/shared/Networking/MessageBuffer.h b/src/server/shared/Networking/MessageBuffer.h index 2115bea3f47..2dcd4fbc161 100644 --- a/src/server/shared/Networking/MessageBuffer.h +++ b/src/server/shared/Networking/MessageBuffer.h @@ -81,7 +81,7 @@ public: } } - void Write(void* data, std::size_t size) + void Write(void const* data, std::size_t size) { if (size) { diff --git a/src/server/shared/Networking/NetworkThread.h b/src/server/shared/Networking/NetworkThread.h index 5ed7f25ed77..043aee56504 100644 --- a/src/server/shared/Networking/NetworkThread.h +++ b/src/server/shared/Networking/NetworkThread.h @@ -85,8 +85,8 @@ public: } protected: - virtual void SocketAdded(std::shared_ptr<SocketType> sock) { } - virtual void SocketRemoved(std::shared_ptr<SocketType> sock) { } + virtual void SocketAdded(std::shared_ptr<SocketType> /*sock*/) { } + virtual void SocketRemoved(std::shared_ptr<SocketType> /*sock*/) { } void AddNewSockets() { diff --git a/src/server/shared/Networking/Socket.h b/src/server/shared/Networking/Socket.h index 17f48343485..d1f143aeb1e 100644 --- a/src/server/shared/Networking/Socket.h +++ b/src/server/shared/Networking/Socket.h @@ -111,11 +111,12 @@ public: void QueuePacket(MessageBuffer&& buffer, std::unique_lock<std::mutex>& guard) { - _writeQueue.push(std::move(buffer)); #ifdef BOOST_ASIO_HAS_IOCP AsyncProcessQueue(guard); +#else + (void)guard; #endif } diff --git a/src/server/shared/Networking/SocketMgr.h b/src/server/shared/Networking/SocketMgr.h index ed638ab89f3..dbe2b8ec902 100644 --- a/src/server/shared/Networking/SocketMgr.h +++ b/src/server/shared/Networking/SocketMgr.h @@ -60,7 +60,7 @@ public: virtual void StopNetwork() { if (_threadCount != 0) - for (size_t i = 0; i < _threadCount; ++i) + for (int32 i = 0; i < _threadCount; ++i) _threads[i].Stop(); Wait(); @@ -69,7 +69,7 @@ public: void Wait() { if (_threadCount != 0) - for (size_t i = 0; i < _threadCount; ++i) + for (int32 i = 0; i < _threadCount; ++i) _threads[i].Wait(); } @@ -77,7 +77,7 @@ public: { size_t min = 0; - for (size_t i = 1; i < _threadCount; ++i) + for (int32 i = 1; i < _threadCount; ++i) if (_threads[i].GetConnectionCount() < _threads[min].GetConnectionCount()) min = i; @@ -97,7 +97,7 @@ public: int32 GetNetworkThreadCount() const { return _threadCount; } protected: - SocketMgr() : _threads(nullptr), _threadCount(1) + SocketMgr() : _acceptor(nullptr), _threads(nullptr), _threadCount(1) { } |