diff options
35 files changed, 758 insertions, 219 deletions
diff --git a/sql/updates/world/2015_12_14_00_world.sql b/sql/updates/world/2015_12_14_00_world.sql new file mode 100644 index 00000000000..85faf4448e2 --- /dev/null +++ b/sql/updates/world/2015_12_14_00_world.sql @@ -0,0 +1,32 @@ +-- instructor razuvious cleanup +DELETE FROM `creature_text` WHERE `entry`=16061; +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`probability`,`sound`,`BroadcastTextId`,`TextRange`,`comment`) VALUES +(16061,0,0,"Do as I taught you!",14,100,8855,13075,3,"Razuvious SAY_AGGRO #1"), +(16061,0,1,"The time for practice is over! Show me what you have learned!",14,100,8859,13078,3,"Razuvious SAY_AGGRO #2"), +(16061,0,2,"Show them no mercy!",14,100,8856,13076,3,"Razuvious SAY_AGGRO #3"), +(16061,1,0,"%s lets loose a triumphant shout.",41,30,0,13082,3,"Razuvious SAY_SLAY"), +(16061,2,0,"You should have stayed home.",14,50,8861,13081,3,"Razuvious SAY_TAUNTED #1"), +(16061,2,1,"You disappoint me, students!",14,50,8858,13077,3,"Razuvious SAY_TAUNTED #2"), +(16061,2,2,"I'm just getting warmed up!",14,50,8852,13072,3,"Razuvious SAY_TAUNTED #3"), +(16061,2,3,"Stand and fight!",14,50,8853,13073,3,"Razuvious SAY_TAUNTED #4"), +(16061,2,4,"Sweep the leg... Do you have a problem with that?",14,50,8861,13080,3,"Razuvious SAY_TAUNTED #5"), +(16061,3,0,"An honorable... death.",14,100,8860,13079,3,"Razuvious SAY_DEATH"); + +-- move understudies to summon groups for proper reset behavior +DELETE FROM `creature` WHERE `guid` IN (128184,128185); +DELETE FROM `linked_respawn` WHERE `guid` IN (128184,128185); +DELETE FROM `creature_summon_groups` WHERE `summonerId`=16061 AND `summonerType`=0; +INSERT INTO `creature_summon_groups` (`summonerId`,`summonerType`,`groupId`,`entry`,`position_x`,`position_y`,`position_z`,`orientation`,`summonType`) VALUES +(16061,0,1,16803,2757.476,-3111.519,267.7678,3.926991,8), +(16061,0,1,16803,2762.049,-3084.467,267.7678,2.129302,8), +(16061,0,2,16803,2778.911,-3114.142,267.7678,5.288348,8), +(16061,0,2,16803,2781.866,-3088.187,267.7678,0.9075712,8); + +-- "Hopeless" debuff on death may only target understudies +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=29125; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`NegativeCondition`,`Comment`) VALUES +(13,1,29125,31,0,3,16803,0,"Instructor Razuvious - Hopeless debuff - only target Death Knight Understudy"); + +-- transition understudies to scripted AI to prevent them overriding player control +UPDATE `creature_template` SET `AIName`="",`ScriptName`="npc_dk_understudy" WHERE `entry`=16803; +DELETE FROM `smart_scripts` WHERE `entryorguid`=16803 AND `source_type`=0; diff --git a/sql/updates/world/2015_12_15_00_world.sql b/sql/updates/world/2015_12_15_00_world.sql new file mode 100644 index 00000000000..f27bb448bbd --- /dev/null +++ b/sql/updates/world/2015_12_15_00_world.sql @@ -0,0 +1,2 @@ +-- +DELETE FROM `creature` WHERE `guid` IN (111277, 111300); diff --git a/sql/updates/world/2015_12_15_01_world.sql b/sql/updates/world/2015_12_15_01_world.sql new file mode 100644 index 00000000000..86fbec83c38 --- /dev/null +++ b/sql/updates/world/2015_12_15_01_world.sql @@ -0,0 +1,2 @@ +-- trinity_string 2022 (ticket message) +UPDATE `trinity_string` SET `content_default`='|cff00ff00Ticket Message|r: [%s]|r ' WHERE `entry`=2022; diff --git a/sql/updates/world/2015_12_15_02_world.sql b/sql/updates/world/2015_12_15_02_world.sql new file mode 100644 index 00000000000..eda5c26550f --- /dev/null +++ b/sql/updates/world/2015_12_15_02_world.sql @@ -0,0 +1,22 @@ +-- +UPDATE `creature_text` SET `sound`=14211 WHERE `BroadcastTextID`=25357; +UPDATE `creature_text` SET `sound`=14212 WHERE `BroadcastTextID`=25358; +UPDATE `creature_text` SET `sound`=14756 WHERE `BroadcastTextID`=25362; +UPDATE `creature_text` SET `sound`=14212 WHERE `BroadcastTextID`=28189; +UPDATE `creature_text` SET `sound`=14664 WHERE `BroadcastTextID`=25359; +UPDATE `creature_text` SET `sound`=14665 WHERE `BroadcastTextID`=25360; +UPDATE `creature_text` SET `sound`=14757 WHERE `BroadcastTextID`=25363; +UPDATE `creature_text` SET `sound`=14666 WHERE `BroadcastTextID`=25366; +UPDATE `creature_text` SET `sound`=14213 WHERE `BroadcastTextID`=25361; +UPDATE `creature_text` SET `sound`=14758 WHERE `BroadcastTextID`=25364; +UPDATE `creature_text` SET `sound`=14214 WHERE `BroadcastTextID`=25365; +UPDATE `creature_text` SET `sound`=14196 WHERE `BroadcastTextID`=25841; +UPDATE `creature_text` SET `sound`=14489 WHERE `BroadcastTextID`=25842; +UPDATE `creature_text` SET `sound`=14197 WHERE `BroadcastTextID`=25847; +UPDATE `creature_text` SET `sound`=14667 WHERE `BroadcastTextID`=25844; +UPDATE `creature_text` SET `sound`=14490 WHERE `BroadcastTextID`=25843; +UPDATE `creature_text` SET `sound`=14668 WHERE `BroadcastTextID`=25845; +UPDATE `creature_text` SET `sound`=14491 WHERE `BroadcastTextID`=25848; +UPDATE `creature_text` SET `sound`=14669 WHERE `BroadcastTextID`=25846; +UPDATE `creature_text` SET `sound`=14492 WHERE `BroadcastTextID`=25849; +UPDATE `creature_text` SET `sound`=14670 WHERE `BroadcastTextID`=25850; diff --git a/sql/updates/world/2015_12_15_03_world.sql b/sql/updates/world/2015_12_15_03_world.sql new file mode 100644 index 00000000000..99cc9e14646 --- /dev/null +++ b/sql/updates/world/2015_12_15_03_world.sql @@ -0,0 +1,5 @@ +DELETE FROM `areatrigger_scripts` WHERE `entry` IN (5732 /*entrance Lord Marrowgar*/, 5708/*Blood Prince Council*/, 5709 /*entrance Lady Deathwhisper*/); +INSERT INTO `areatrigger_scripts` (`entry`, `ScriptName`) VALUES +(5732, 'at_lord_marrowgar_entrance'), +(5708, 'at_blood_prince_council_start_intro'), +(5709, 'at_lady_deathwhisper_entrance'); diff --git a/sql/updates/world/2015_12_16_00_world.sql b/sql/updates/world/2015_12_16_00_world.sql new file mode 100644 index 00000000000..62d640117f7 --- /dev/null +++ b/sql/updates/world/2015_12_16_00_world.sql @@ -0,0 +1,91 @@ +-- +-- Sulaa Waypointscript +UPDATE `creature` SET spawndist = 0, MovementType = 0 WHERE guid = 61958; +UPDATE `creature_template_addon` SET bytes1 = 0 WHERE Entry = 17219; + +-- Sulaa SAI +SET @ENTRY := 17219; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,25,0,100,0,0,0,0,0,53,0,17219,1,0,0,0,1,0,0,0,0,0,0,0,"Sulaa - On Reset - Start Waypoint"), +(@ENTRY,0,1,0,64,0,100,0,0,0,0,0,54,20000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sulaa - On Gossip Hello - Pause Waypoint"), +(@ENTRY,0,2,0,40,0,100,0,1,17219,0,0,80,@ENTRY*100+00,2,0,0,0,0,1,0,0,0,0,0,0,0,"Sulaa - On Waypoint 1 Reached - Run Script"), +(@ENTRY,0,3,0,40,0,100,0,4,17219,0,0,80,@ENTRY*100+01,2,0,0,0,0,1,0,0,0,0,0,0,0,"Sulaa - On Waypoint 4 Reached - Run Script"), +(@ENTRY,0,4,0,40,0,100,0,8,17219,0,0,80,@ENTRY*100+02,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sulaa - On Waypoint 8 Reached - Pause Waypoint"), +(@ENTRY,0,5,0,40,0,100,0,12,17219,0,0,80,@ENTRY*100+03,2,0,0,0,0,1,0,0,0,0,0,0,0,"Sulaa - On Waypoint 12 Reached - Run Script"); + +-- Actionlist SAI +SET @ENTRY := 1721900; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY 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 +(@ENTRY,9,0,0,0,0,100,0,0,0,0,0,54,300000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sulaa - On Script - Pause Waypoint"), +(@ENTRY,9,1,0,0,0,100,0,2000,2000,0,0,11,32992,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sulaa - On Script - Cast 'Ice Cast Visual'"), +(@ENTRY,9,2,0,0,0,100,0,5000,5000,0,0,45,1,1,0,0,0,0,10,67179,18814,0,0,0,0,0,"Sulaa - On Script - Set Data 1 1"), +(@ENTRY,9,3,0,0,0,100,0,0,0,0,0,45,1,1,0,0,0,0,10,67176,18814,0,0,0,0,0,"Sulaa - On Script - Set Data 1 1"), +(@ENTRY,9,4,0,0,0,100,0,2000,2000,0,0,5,4,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sulaa - On Script - Play Emote 4"), +(@ENTRY,9,5,0,0,0,100,0,0,0,0,0,45,1,1,0,0,0,0,10,67175,18814,0,0,0,0,0,"Sulaa - On Script - Set Data 1 1"), +(@ENTRY,9,6,0,0,0,100,0,0,0,0,0,45,1,1,0,0,0,0,10,67180,18814,0,0,0,0,0,"Sulaa - On Script - Set Data 1 1"), +(@ENTRY,9,7,0,0,0,100,0,2000,2000,0,0,45,1,1,0,0,0,0,10,67173,18814,0,0,0,0,0,"Sulaa - On Script - Set Data 1 1"), +(@ENTRY,9,8,0,0,0,100,0,0,0,0,0,45,1,1,0,0,0,0,10,67178,18814,0,0,0,0,0,"Sulaa - On Script - Set Data 1 1"); + +-- Actionlist SAI +SET @ENTRY := 1721901; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY 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 +(@ENTRY,9,0,0,0,0,100,0,0,0,0,0,54,8000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sulaa - On Script - Pause Waypoint"), +(@ENTRY,9,1,0,0,0,100,0,2000,2000,0,0,11,32992,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sulaa - On Script - Cast 'Ice Cast Visual'"), +(@ENTRY,9,2,0,0,0,100,0,5000,5000,0,0,45,1,1,0,0,0,0,10,67179,18814,0,0,0,0,0,"Sulaa - On Script - Set Data 1 1"), +(@ENTRY,9,3,0,0,0,100,0,0,0,0,0,45,1,1,0,0,0,0,10,67181,18814,0,0,0,0,0,"Sulaa - On Script - Set Data 1 1"), +(@ENTRY,9,4,0,0,0,100,0,0,0,0,0,45,1,1,0,0,0,0,10,67182,18814,0,0,0,0,0,"Sulaa - On Script - Set Data 1 1"); + +-- Actionlist SAI +SET @ENTRY := 1721902; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY 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 +(@ENTRY,9,0,0,0,0,100,0,0,0,0,0,54,8000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sulaa - On Script - Pause Waypoint"), +(@ENTRY,9,1,0,0,0,100,0,2000,2000,0,0,11,32992,0,0,0,0,0,1,0,0,0,0,0,0,0,"On Script - Cast 'Ice Cast Visual'"), +(@ENTRY,9,2,0,0,0,100,0,5000,5000,0,0,45,1,1,0,0,0,0,10,67176,18814,0,0,0,0,0,"On Script - Set Data 1 1"), +(@ENTRY,9,3,0,0,0,100,0,0,0,0,0,45,1,1,0,0,0,0,10,67171,18814,0,0,0,0,0,"On Script - Set Data 1 1"), +(@ENTRY,9,4,0,0,0,100,0,0,0,0,0,45,1,1,0,0,0,0,10,67172,18814,0,0,0,0,0,"On Script - Set Data 1 1"); + +-- Actionlist SAI +SET @ENTRY := 1721903; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY 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 +(@ENTRY,9,0,0,0,0,100,0,0,0,0,0,54,12000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sulaa - On Script - Pause Waypoint"), +(@ENTRY,9,1,0,0,0,100,0,3000,3000,0,0,90,8,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sulaa - On Script - Set Flag Standstate Kneel"), +(@ENTRY,9,2,0,0,0,100,0,7000,7000,0,0,91,8,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sulaa - On Script - Remove Flag Standstate Kneel"); + + +DELETE FROM `waypoints` WHERE `entry`=17219; +INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES +(17219,1,-3778.78,-11409.2,-137.952, 'Sulaa'), +(17219,2,-3778.9,-11411.9,-137.96, 'Sulaa'), +(17219,3,-3779.4,-11415.4,-137.982, 'Sulaa'), +(17219,4,-3775.53,-11420.1,-137.955, 'Sulaa'), +(17219,5,-3777.94,-11421.6,-137.988, 'Sulaa'), +(17219,6,-3781.69,-11422.3,-138.036, 'Sulaa'), +(17219,7,-3788.19,-11418.6,-138.097, 'Sulaa'), +(17219,8,-3789.85,-11414.1,-138.101, 'Sulaa'), +(17219,9,-3788.37,-11413.7,-138.081, 'Sulaa'), +(17219,10,-3783.87,-11414.4,-138.031, 'Sulaa'), +(17219,11,-3779.87,-11410.7,-137.97, 'Sulaa'), +(17219,12,-3777.9,-11407.2,-137.934, 'Sulaa'); + +-- Exodar Invisible Stalker SAI +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=18814; +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (-67179, -67176, -67175, -67180, -67173, -67178, -67181, -67182, -67171, -67172) 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 +(-67179,0,0,0,38,0,100,0,1,1,0,0,11,32995,0,0,0,0,0,1,0,0,0,0,0,0,0,"Exodar Invisible Stalker - On Data Set 1 1 - Cast 'Water Elemental Impact Visual'"), +(-67176,0,0,0,38,0,100,0,1,1,0,0,11,32995,0,0,0,0,0,1,0,0,0,0,0,0,0,"Exodar Invisible Stalker - On Data Set 1 1 - Cast 'Water Elemental Impact Visual'"), +(-67175,0,0,0,38,0,100,0,1,1,0,0,11,32995,0,0,0,0,0,1,0,0,0,0,0,0,0,"Exodar Invisible Stalker - On Data Set 1 1 - Cast 'Water Elemental Impact Visual'"), +(-67180,0,0,0,38,0,100,0,1,1,0,0,11,32995,0,0,0,0,0,1,0,0,0,0,0,0,0,"Exodar Invisible Stalker - On Data Set 1 1 - Cast 'Water Elemental Impact Visual'"), +(-67173,0,0,0,38,0,100,0,1,1,0,0,11,32995,0,0,0,0,0,1,0,0,0,0,0,0,0,"Exodar Invisible Stalker - On Data Set 1 1 - Cast 'Water Elemental Impact Visual'"), +(-67178,0,0,0,38,0,100,0,1,1,0,0,11,32995,0,0,0,0,0,1,0,0,0,0,0,0,0,"Exodar Invisible Stalker - On Data Set 1 1 - Cast 'Water Elemental Impact Visual'"), +(-67181,0,0,0,38,0,100,0,1,1,0,0,11,32995,0,0,0,0,0,1,0,0,0,0,0,0,0,"Exodar Invisible Stalker - On Data Set 1 1 - Cast 'Water Elemental Impact Visual'"), +(-67182,0,0,0,38,0,100,0,1,1,0,0,11,32995,0,0,0,0,0,1,0,0,0,0,0,0,0,"Exodar Invisible Stalker - On Data Set 1 1 - Cast 'Water Elemental Impact Visual'"), +(-67171,0,0,0,38,0,100,0,1,1,0,0,11,32995,0,0,0,0,0,1,0,0,0,0,0,0,0,"Exodar Invisible Stalker - On Data Set 1 1 - Cast 'Water Elemental Impact Visual'"), +(-67172,0,0,0,38,0,100,0,1,1,0,0,11,32995,0,0,0,0,0,1,0,0,0,0,0,0,0,"Exodar Invisible Stalker - On Data Set 1 1 - Cast 'Water Elemental Impact Visual'"); + +UPDATE `creature_template` SET `InhabitType`=4 WHERE `entry`=17436; diff --git a/sql/updates/world/2015_12_16_01_world.sql b/sql/updates/world/2015_12_16_01_world.sql new file mode 100644 index 00000000000..73c9675e5be --- /dev/null +++ b/sql/updates/world/2015_12_16_01_world.sql @@ -0,0 +1,53 @@ +DELETE FROM `creature_text` WHERE `entry` IN(26860,26862,27102,27037); +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextID`, `comment`) VALUES +(26860, 0, 0, 'I''ve never seen you so eager to cause harm to someone, sister. Such a pleasant development... very well, go!', 12, 0, 100, 25, 0, 0, 26229, 'Conqueror Krenna to Player'), +(26860, 1, 0, 'That spineless troll has failed me for the last time. Anthis! Break his legs!', 12, 0, 100, 53, 0, 0, 26227, 'Conqueror Krenna to Player'), +(26862, 0, 0, 'At once, my lady!', 12, 0, 100, 0, 0, 0, 26228, 'Anthis to Player'), +(27102, 0, 0, 'Let me take care of it, sister.', 12, 0, 100, 0, 0, 0, 27108, 'Gorgonna to Player'), +(27102, 1, 0, 'What were you thinking, provoking her like that?', 15, 0, 100, 0, 0, 0, 27109, 'Gorgonna to Player'), +(27102, 2, 0, 'I used good judgment when you showed none. I don''t want to see you lead us into ruin, Krenna!', 12, 0, 100, 0, 0, 0, 27027, 'Gorgonna to Player'), +(27102, 3, 0, 'We''ll see about that.', 12, 0, 100, 0, 0, 0, 27028, 'Gorgonna to Player'), +(27102, 4, 0, 'You... half-idiot! You really did it this time. I''m going to have to make it look like your leg''s broken.', 12, 0, 100, 0, 0, 0, 27110, 'Gorgonna to Player'), +(27102, 5, 0, 'Now don''t move if you ever want to walk again!', 12, 0, 100, 0, 0, 0, 27111, 'Gorgonna to Player'), +(27037, 0, 0, 'No, please! Don''t!', 12, 0, 100, 430, 0, 0, 27112, 'Hidetrader Jun''ik to Player'); + +DELETE FROM `smart_scripts` WHERE `entryorguid`=26860 AND `source_type`=0 AND `id`>0; +DELETE FROM `smart_scripts` WHERE `entryorguid`=27102 AND `source_type`=0; +DELETE FROM `smart_scripts` WHERE `entryorguid`IN(2686000,2710200) AND `source_type`=9; +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry` IN(27102); + +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 +(26860, 0, 1, 2, 20, 0, 100, 0, 12178, 0, 0, 0, 64, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Conqueror Krenna - On Quest return (12178) - Store Targetlist'), +(26860, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 80, 2686000, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Conqueror Krenna - On Quest return (12178) - Run Script'), + +(27102, 0, 0, 5, 38, 0, 100, 0, 2, 2, 0, 0, 53, 1, 27102, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Gorgonna - On Data Set 2 2 - Start WP'), +(27102, 0, 1, 2, 40, 0, 100, 0, 3, 27102, 0, 0, 54, 9000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Gorgonna - Reached WP3 - Pause WP'), +(27102, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 80, 2710200, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Gorgonna - Reached WP3 - Run Script'), +(27102, 0, 3, 0, 40, 0, 100, 0, 4, 27102, 0, 0, 66, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 2.80998, 'Gorgonna - Reached WP4 - Set Orientation'), +(27102, 0, 4, 0, 38, 0, 100, 0, 1, 1, 0, 0, 5, 66, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Gorgonna - On Data Set 1 1 - Play Emote OneShotSalute'), +(27102, 0, 5, 0, 61, 0, 100, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 0, 0, 'Gorgonna - On Data Set 2 2 - Say Line 1'), + +(2710200, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 1, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Gorgonna - Script - Say Line 4 '), +(2710200, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 19, 27037, 0, 0, 0, 0, 0, 0, 'Gorgonna - Script - Say Line 0 (Hidetrader Jun''ik)'), +(2710200, 9, 2, 0, 0, 0, 100, 0, 7000, 7000, 0, 0, 1, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Gorgonna - Script - Say Line 5 '), +(2710200, 9, 3, 0, 0, 0, 100, 0, 1000, 1000, 0, 0, 11, 42908, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Gorgonna - Script - Cast Cosmetic - Combat Kick'), +(2710200, 9, 4, 0, 0, 0, 100, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 21, 50, 0, 0, 0, 0, 0, 0, 'Gorgonna - Script - Turn Run Off'), + +(2686000, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Conqueror Krenna - Script - Say Line 1'), +(2686000, 9, 1, 0, 0, 0, 100, 0, 7000, 7000, 0, 0, 1, 0, 0, 0, 0, 0, 0, 19, 26862, 0, 0, 0, 0, 0, 0, 'Conqueror Krenna - Script - Say Line 0 (Anthis)'), +(2686000, 9, 2, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 0, 0, 0, 0, 0, 0, 10, 117164, 27102, 0, 0, 0, 0, 0, 'Conqueror Krenna - Script - Say Line 0 (Gorgonna)'), +(2686000, 9, 3, 0, 0, 0, 100, 0, 6000, 6000, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Conqueror Krenna - Script - Say Line 0'), -- 15:45:27.765 +(2686000, 9, 4, 0, 0, 0, 100, 0, 1000, 1000, 0, 0, 45, 1, 1, 0, 0, 0, 0, 10, 117164, 27102, 0, 0, 0, 0, 0, 'Conqueror Krenna - Script - Set Data (Gorgonna)'), +(2686000, 9, 5, 0, 0, 0, 100, 0, 1000, 1000, 0, 0, 45, 1, 1, 0, 0, 0, 0, 10, 117164, 27102, 0, 0, 0, 0, 0, 'Conqueror Krenna - Script - Set Data (Gorgonna)'), +(2686000, 9, 6, 0, 0, 0, 100, 0, 0, 0, 0, 0, 100, 1, 0, 0, 0, 0, 0, 10, 117164, 27102, 0, 0, 0, 0, 0, 'Conqueror Krenna - Script - Send Targetlist (Gorgonna)'), +(2686000, 9, 7, 0, 0, 0, 100, 0, 1000, 1000, 0, 0, 45, 2, 2, 0, 0, 0, 0, 10, 117164, 27102, 0, 0, 0, 0, 0, 'Conqueror Krenna - Script - Set Data (Gorgonna)'); + + +DELETE FROM `waypoints` WHERE `entry`=27102; + +INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES +(27102, 1, 3257.147, -2228.854, 116.0879, 'Gorgonna'), +(27102, 2, 3244.31, -2251.519, 114.7344, 'Gorgonna'), +(27102, 3, 3237.79, -2265.45, 114.2664, 'Gorgonna'), +(27102, 4, 3275.846, -2208.026, 117.0294, 'Gorgonna'); + diff --git a/sql/updates/world/2015_12_16_02_world335.sql b/sql/updates/world/2015_12_16_02_world335.sql new file mode 100644 index 00000000000..20c1ac94a39 --- /dev/null +++ b/sql/updates/world/2015_12_16_02_world335.sql @@ -0,0 +1,7 @@ + DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` in(19,20) AND `SourceEntry`=254; + + INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES + (19, 0, 254, 0, 0, 29, 0, 314, 200, 0, 1, 0, 0, '', 'Show quest \'Digging Through the Dirt\' only if no Eliza nearby'), + (20, 0, 254, 0, 0, 29, 0, 314, 200, 0, 1, 0, 0, '', 'Show quest \'Digging Through the Dirt\' only if no Eliza nearby'), + (19, 0, 254, 0, 0, 8, 0, 253, 0, 0, 1, 0, 0, '', 'Show quest \'Digging Through the Dirt\' only if quest \'Bride of the Embalmer\' is not rewarded'), + (19, 0, 254, 0, 0, 28, 0, 253, 0, 0, 1, 0, 0, '', 'Show quest \'Digging Through the Dirt\' only if quest \'Bride of the Embalmer\' is not completed'); diff --git a/sql/updates/world/2015_12_17_00_world.sql b/sql/updates/world/2015_12_17_00_world.sql new file mode 100644 index 00000000000..8419473b203 --- /dev/null +++ b/sql/updates/world/2015_12_17_00_world.sql @@ -0,0 +1,3 @@ +-- +UPDATE `smart_scripts` SET `target_type`=1, `target_param1`=0 WHERE `entryorguid`=2710200 AND `source_type`=9 AND `id`=4; +UPDATE `smart_scripts` SET `target_type`=21, `target_param1`=50 WHERE `entryorguid`=2710200 AND `source_type`=9 AND `id`=3; diff --git a/sql/updates/world/2015_12_18_00_world_335.sql b/sql/updates/world/2015_12_18_00_world_335.sql new file mode 100644 index 00000000000..3fb3e5a6e1e --- /dev/null +++ b/sql/updates/world/2015_12_18_00_world_335.sql @@ -0,0 +1,2 @@ +-- +UPDATE `creature_addon` SET `bytes1`=8 WHERE `guid`=4216; diff --git a/sql/updates/world/2015_12_18_01_world.sql b/sql/updates/world/2015_12_18_01_world.sql new file mode 100644 index 00000000000..2ccc93def23 --- /dev/null +++ b/sql/updates/world/2015_12_18_01_world.sql @@ -0,0 +1,3 @@ +-- +DELETE FROM `creature_template_addon` WHERE `entry` = 16491; +INSERT INTO `creature_template_addon` (`entry`,`auras`) VALUES (16491, '39804'); diff --git a/sql/updates/world/2015_12_18_02_world.sql b/sql/updates/world/2015_12_18_02_world.sql new file mode 100644 index 00000000000..f590d18a8ab --- /dev/null +++ b/sql/updates/world/2015_12_18_02_world.sql @@ -0,0 +1,2 @@ +-- +DELETE FROM `creature` WHERE `id`= 27032 AND `guid`= 110149; diff --git a/sql/updates/world/2015_12_18_03_world_335.sql b/sql/updates/world/2015_12_18_03_world_335.sql new file mode 100644 index 00000000000..de778343a0e --- /dev/null +++ b/sql/updates/world/2015_12_18_03_world_335.sql @@ -0,0 +1,5 @@ +-- +UPDATE `smart_scripts` SET `event_flags`=(`event_flags`|1) WHERE `entryorguid`=702 AND `source_type`=0 AND `id`=2; +UPDATE `smart_scripts` SET `event_flags`=(`event_flags`|1) WHERE `entryorguid`=1393 AND `source_type`=0 AND `id`=1; +UPDATE `smart_scripts` SET `event_param3`=15000 AND `event_param4`=15000 WHERE `entryorguid`=26073 AND `source_type`=0 AND `id`=9; +UPDATE `smart_scripts` SET `event_param3`=4000 AND `event_param4`=7000 WHERE`entryorguid`=11353 AND `source_type`=0 AND `id`=0; diff --git a/sql/updates/world/2015_12_18_04_world.sql b/sql/updates/world/2015_12_18_04_world.sql new file mode 100644 index 00000000000..c8c3352319c --- /dev/null +++ b/sql/updates/world/2015_12_18_04_world.sql @@ -0,0 +1,8 @@ +-- +DELETE FROM `smart_scripts` WHERE `entryorguid` = 30838 AND `source_type` = 0 AND `id`=8; +DELETE FROM `smart_scripts` WHERE `entryorguid` = 30839 AND `source_type` = 0 AND `id`=8; +DELETE FROM `smart_scripts` WHERE `entryorguid` = 30840 AND `source_type` = 0 AND `id`=10; +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 +(30839,0,8,0,54,0,100,0,0,0,0,0,49,0,0,0,0,0,0,19,30831,30,0,0,0,0,0,'Jayde - In Just summoned - Start attack'), +(30840,0,10,0,54,0,100,0,0,0,0,0,49,0,0,0,0,0,0,19,30829,30,0,0,0,0,0,'Munch - In Just summoned - Start attack'), +(30838,0,8,0,54,0,100,0,0,0,0,0,49,0,0,0,0,0,0,19,30830,30,0,0,0,0,0,'Highlord Darion Mograine - In Just summoned - Start attack'); diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp index 768def2ff4d..20d30704c13 100644 --- a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp +++ b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp @@ -83,12 +83,23 @@ uint32 AuctionHouseMgr::GetAuctionDeposit(AuctionHouseEntry const* entry, uint32 float multiplier = CalculatePct(float(entry->depositPercent), 3); uint32 timeHr = (((time / 60) / 60) / 12); - uint32 deposit = uint32(((multiplier * MSV * count / 3) * timeHr * 3) * sWorld->getRate(RATE_AUCTION_DEPOSIT)); + uint32 deposit = uint32(MSV * multiplier * sWorld->getRate(RATE_AUCTION_DEPOSIT)); + float remainderbase = float(MSV * multiplier * sWorld->getRate(RATE_AUCTION_DEPOSIT)) - deposit; + + deposit *= timeHr * count; + + int i = count; + while (i > 0 && (remainderbase * i) != uint32(remainderbase * i)) + i--; + + if (i) + deposit += remainderbase * i * timeHr; TC_LOG_DEBUG("auctionHouse", "MSV: %u", MSV); TC_LOG_DEBUG("auctionHouse", "Items: %u", count); TC_LOG_DEBUG("auctionHouse", "Multiplier: %f", multiplier); TC_LOG_DEBUG("auctionHouse", "Deposit: %u", deposit); + TC_LOG_DEBUG("auctionHouse", "Deposit rm: %f", remainderbase * count); if (deposit < AH_MINIMUM_DEPOSIT * sWorld->getRate(RATE_AUCTION_DEPOSIT)) return AH_MINIMUM_DEPOSIT * sWorld->getRate(RATE_AUCTION_DEPOSIT); @@ -389,6 +400,116 @@ bool AuctionHouseMgr::RemoveAItem(ObjectGuid::LowType id, bool deleteItem) return true; } +void AuctionHouseMgr::PendingAuctionAdd(Player* player, AuctionEntry* aEntry) +{ + PlayerAuctions* thisAH; + auto itr = pendingAuctionMap.find(player->GetGUID()); + if (itr != pendingAuctionMap.end()) + thisAH = itr->second.first; + else + { + thisAH = new PlayerAuctions; + pendingAuctionMap[player->GetGUID()] = AuctionPair(thisAH, 0); + } + thisAH->push_back(aEntry); +} + +uint32 AuctionHouseMgr::PendingAuctionCount(const Player* player) const +{ + auto const itr = pendingAuctionMap.find(player->GetGUID()); + if (itr != pendingAuctionMap.end()) + return itr->second.first->size(); + + return 0; +} + +void AuctionHouseMgr::PendingAuctionProcess(Player* player) +{ + auto iterMap = pendingAuctionMap.find(player->GetGUID()); + if (iterMap == pendingAuctionMap.end()) + return; + + PlayerAuctions* thisAH = iterMap->second.first; + + SQLTransaction trans = CharacterDatabase.BeginTransaction(); + + uint32 totalItems = 0; + for (auto itrAH = thisAH->begin(); itrAH != thisAH->end(); ++itrAH) + { + AuctionEntry* AH = (*itrAH); + totalItems += AH->itemCount; + } + + uint32 totaldeposit = 0; + auto itr = (*thisAH->begin()); + + if (Item* item = GetAItem(itr->itemGUIDLow)) + totaldeposit = GetAuctionDeposit(itr->auctionHouseEntry, itr->etime, item, totalItems); + + uint32 depositremain = totaldeposit; + for (auto itr = thisAH->begin(); itr != thisAH->end(); ++itr) + { + AuctionEntry* AH = (*itr); + + if (next(itr) == thisAH->end()) + AH->deposit = depositremain; + else + { + AH->deposit = totaldeposit / thisAH->size(); + depositremain -= AH->deposit; + } + + AH->DeleteFromDB(trans); + AH->SaveToDB(trans); + } + + CharacterDatabase.CommitTransaction(trans); + pendingAuctionMap.erase(player->GetGUID()); + delete thisAH; + player->ModifyMoney(-int32(totaldeposit)); +} + +void AuctionHouseMgr::UpdatePendingAuctions() +{ + for (auto itr = pendingAuctionMap.begin(); itr != pendingAuctionMap.end();) + { + ObjectGuid playerGUID = itr->first; + if (Player* player = ObjectAccessor::FindConnectedPlayer(playerGUID)) + { + // Check if there were auctions since last update process if not + if (PendingAuctionCount(player) == itr->second.second) + { + ++itr; + PendingAuctionProcess(player); + } + else + { + ++itr; + pendingAuctionMap[playerGUID].second = PendingAuctionCount(player); + } + } + else + { + // Expire any auctions that we couldn't get a deposit for + TC_LOG_WARN("auctionHouse", "Player %s was offline, unable to retrieve deposit!", playerGUID.ToString().c_str()); + PlayerAuctions* thisAH = itr->second.first; + ++itr; + SQLTransaction trans = CharacterDatabase.BeginTransaction(); + for (auto AHitr = thisAH->begin(); AHitr != thisAH->end();) + { + AuctionEntry* AH = (*AHitr); + ++AHitr; + AH->expire_time = time(NULL); + AH->DeleteFromDB(trans); + AH->SaveToDB(trans); + } + CharacterDatabase.CommitTransaction(trans); + pendingAuctionMap.erase(playerGUID); + delete thisAH; + } + } +} + void AuctionHouseMgr::Update() { mHordeAuctions.Update(); diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.h b/src/server/game/AuctionHouse/AuctionHouseMgr.h index 45cdba361f3..1f885837a44 100644 --- a/src/server/game/AuctionHouse/AuctionHouseMgr.h +++ b/src/server/game/AuctionHouse/AuctionHouseMgr.h @@ -22,6 +22,7 @@ #include "Common.h" #include "DatabaseEnv.h" #include "DBCStructure.h" +#include <set> class Item; class Player; @@ -82,6 +83,7 @@ struct AuctionEntry time_t expire_time; ObjectGuid::LowType bidder; uint32 deposit; //deposit can be calculated only when creating auction + uint32 etime; AuctionHouseEntry const* auctionHouseEntry; // in AuctionHouse.dbc // helpers @@ -151,6 +153,8 @@ class AuctionHouseMgr } typedef std::unordered_map<ObjectGuid::LowType, Item*> ItemMap; + typedef std::vector<AuctionEntry*> PlayerAuctions; + typedef std::pair<PlayerAuctions*, uint32> AuctionPair; AuctionHouseObject* GetAuctionsMap(uint32 factionTemplateId); AuctionHouseObject* GetAuctionsMapByHouseId(uint8 auctionHouseId); @@ -184,7 +188,10 @@ class AuctionHouseMgr void AddAItem(Item* it); bool RemoveAItem(ObjectGuid::LowType id, bool deleteItem = false); - + void PendingAuctionAdd(Player* player, AuctionEntry* aEntry); + uint32 PendingAuctionCount(const Player* player) const; + void PendingAuctionProcess(Player* player); + void UpdatePendingAuctions(); void Update(); private: @@ -193,6 +200,8 @@ class AuctionHouseMgr AuctionHouseObject mAllianceAuctions; AuctionHouseObject mNeutralAuctions; + std::map<ObjectGuid, AuctionPair> pendingAuctionMap; + ItemMap mAitems; }; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index a8f015a8749..ceab7d06c96 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -1535,6 +1535,7 @@ void Player::Update(uint32 p_time) //because we don't want player's ghost teleported from graveyard if (IsHasDelayedTeleport() && IsAlive()) TeleportTo(m_teleport_dest, m_teleport_options); + } void Player::setDeathState(DeathState s) @@ -5836,8 +5837,6 @@ void Player::UpdateCombatSkills(Unit* victim, WeaponAttackType attType, bool def uint8 plevel = getLevel(); // if defense than victim == attacker uint8 greylevel = Trinity::XP::GetGrayLevel(plevel); uint8 moblevel = victim->getLevelForTarget(this); - if (moblevel < greylevel) - return; if (moblevel > plevel + 5) moblevel = plevel + 5; diff --git a/src/server/game/Handlers/AuctionHouseHandler.cpp b/src/server/game/Handlers/AuctionHouseHandler.cpp index 8ecf86680ca..a9680ff69bb 100644 --- a/src/server/game/Handlers/AuctionHouseHandler.cpp +++ b/src/server/game/Handlers/AuctionHouseHandler.cpp @@ -303,18 +303,21 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) AH->buyout = buyout; AH->expire_time = time(NULL) + auctionTime; AH->deposit = deposit; + AH->etime = etime; AH->auctionHouseEntry = auctionHouseEntry; TC_LOG_INFO("network", "CMSG_AUCTION_SELL_ITEM: Player %s (guid %d) is selling item %s entry %u (guid %d) with count %u with initial bid %u with buyout %u and with time %u (in sec) in auctionhouse %u", _player->GetName().c_str(), _player->GetGUID().GetCounter(), item->GetTemplate()->Name1.c_str(), item->GetEntry(), item->GetGUID().GetCounter(), item->GetCount(), bid, buyout, auctionTime, AH->GetHouseId()); sAuctionMgr->AddAItem(item); auctionHouse->AddAuction(AH); + sAuctionMgr->PendingAuctionAdd(_player, AH); _player->MoveItemFromInventory(item->GetBagSlot(), item->GetSlot(), true); SQLTransaction trans = CharacterDatabase.BeginTransaction(); item->DeleteFromInventoryDB(trans); item->SaveToDB(trans); + AH->SaveToDB(trans); _player->SaveInventoryAndGoldToDB(trans); CharacterDatabase.CommitTransaction(trans); @@ -351,12 +354,14 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) AH->buyout = buyout; AH->expire_time = time(NULL) + auctionTime; AH->deposit = deposit; + AH->etime = etime; AH->auctionHouseEntry = auctionHouseEntry; TC_LOG_INFO("network", "CMSG_AUCTION_SELL_ITEM: Player %s (guid %d) is selling item %s entry %u (guid %d) with count %u with initial bid %u with buyout %u and with time %u (in sec) in auctionhouse %u", _player->GetName().c_str(), _player->GetGUID().GetCounter(), newItem->GetTemplate()->Name1.c_str(), newItem->GetEntry(), newItem->GetGUID().GetCounter(), newItem->GetCount(), bid, buyout, auctionTime, AH->GetHouseId()); sAuctionMgr->AddAItem(newItem); auctionHouse->AddAuction(AH); + sAuctionMgr->PendingAuctionAdd(_player, AH); for (uint32 j = 0; j < itemsCount; ++j) { @@ -396,8 +401,6 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) GetPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CREATE_AUCTION, 1); } - - _player->ModifyMoney(-int32(deposit)); } //this function is called when client bids or buys out auction diff --git a/src/server/game/Quests/QuestDef.cpp b/src/server/game/Quests/QuestDef.cpp index a3f662f2ade..1e4bb96303e 100644 --- a/src/server/game/Quests/QuestDef.cpp +++ b/src/server/game/Quests/QuestDef.cpp @@ -22,6 +22,13 @@ Quest::Quest(Field* questRecord) { + EmoteOnIncomplete = 0; + EmoteOnComplete = 0; + _reqItemsCount = 0; + _reqCreatureOrGOcount = 0; + _rewItemsCount = 0; + _rewChoiceItemsCount = 0; + Id = questRecord[0].GetUInt32(); Method = questRecord[1].GetUInt8(); Level = questRecord[2].GetInt16(); @@ -54,12 +61,18 @@ Quest::Quest(Field* questRecord) { RewardItemId[i] = questRecord[27+i*2].GetUInt32(); RewardItemIdCount[i] = questRecord[28+i*2].GetUInt16(); + + if (RewardItemId[i]) + ++_rewItemsCount; } for (int i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i) { RewardChoiceItemId[i] = questRecord[35+i*2].GetUInt32(); RewardChoiceItemCount[i] = questRecord[36+i*2].GetUInt16(); + + if (RewardChoiceItemId[i]) + ++_rewChoiceItemsCount; } for (int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) @@ -80,65 +93,40 @@ Quest::Quest(Field* questRecord) CompletedText = questRecord[70].GetString(); for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i) + { RequiredNpcOrGo[i] = questRecord[71+i].GetInt32(); - - for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i) RequiredNpcOrGoCount[i] = questRecord[75+i].GetUInt16(); + ObjectiveText[i] = questRecord[100+i].GetString(); - for (int i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i) - ItemDrop[i] = questRecord[79+i].GetUInt32(); + if (RequiredNpcOrGo[i]) + ++_reqCreatureOrGOcount; + } for (int i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i) + { + ItemDrop[i] = questRecord[79+i].GetUInt32(); ItemDropQuantity[i] = questRecord[83+i].GetUInt16(); + } for (int i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i) + { RequiredItemId[i] = questRecord[87+i].GetUInt32(); - - for (int i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i) RequiredItemCount[i] = questRecord[93+i].GetUInt16(); - // int8 Unknown0 = questRecord[99].GetUInt8(); - - for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i) - ObjectiveText[i] = questRecord[100+i].GetString(); - - EmoteOnIncomplete = 0; - EmoteOnComplete = 0; - - //int32 VerifiedBuild = questRecord[104].GetInt32(); - - _reqItemsCount = 0; - _reqCreatureOrGOcount = 0; - _rewItemsCount = 0; - _rewChoiceItemsCount = 0; - - for (int i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i) if (RequiredItemId[i]) ++_reqItemsCount; + } - for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i) - if (RequiredNpcOrGo[i]) - ++_reqCreatureOrGOcount; - - for (int i = 0; i < QUEST_REWARDS_COUNT; ++i) - if (RewardItemId[i]) - ++_rewItemsCount; - - for (int i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i) - if (RewardChoiceItemId[i]) - ++_rewChoiceItemsCount; + // int8 Unknown0 = questRecord[99].GetUInt8(); + // int32 VerifiedBuild = questRecord[104].GetInt32(); for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) + { DetailsEmote[i] = 0; - - for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) DetailsEmoteDelay[i] = 0; - - for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) OfferRewardEmote[i] = 0; - - for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) OfferRewardEmoteDelay[i] = 0; + } } void Quest::LoadQuestDetails(Field* fields) diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 2d990ad3ed2..debe4ac3cbf 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -3053,6 +3053,7 @@ void SpellMgr::LoadSpellInfoCorrections() case 52479: // Gift of the Harvester case 48246: // Ball of Flame case 36327: // Shoot Arcane Explosion Arrow + case 55479: // Force Obedience spellInfo->MaxAffectedTargets = 1; break; case 36384: // Skartax Purple Beam diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 93adc30f9c4..2aa65324a3a 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1787,6 +1787,7 @@ void World::SetInitialWorldSettings() m_timers[WUPDATE_WEATHERS].SetInterval(1*IN_MILLISECONDS); m_timers[WUPDATE_AUCTIONS].SetInterval(MINUTE*IN_MILLISECONDS); + m_timers[WUPDATE_AUCTIONS_PENDING].SetInterval(250); m_timers[WUPDATE_UPTIME].SetInterval(m_int_configs[CONFIG_UPTIME_UPDATE]*MINUTE*IN_MILLISECONDS); //Update "uptime" table based on configuration entry in minutes. m_timers[WUPDATE_CORPSES].SetInterval(20 * MINUTE * IN_MILLISECONDS); @@ -2057,6 +2058,13 @@ void World::Update(uint32 diff) sAuctionMgr->Update(); } + if (m_timers[WUPDATE_AUCTIONS_PENDING].Passed()) + { + m_timers[WUPDATE_AUCTIONS_PENDING].Reset(); + + sAuctionMgr->UpdatePendingAuctions(); + } + /// <li> Handle AHBot operations if (m_timers[WUPDATE_AHBOT].Passed()) { diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index ed5e218b084..64ebafbd6e8 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -69,6 +69,7 @@ enum ShutdownExitCode enum WorldTimers { WUPDATE_AUCTIONS, + WUPDATE_AUCTIONS_PENDING, WUPDATE_WEATHERS, WUPDATE_UPTIME, WUPDATE_CORPSES, diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp index aeaf8a70ba5..cfeb31d5526 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp @@ -136,11 +136,12 @@ enum Events enum Actions { - ACTION_STAND_UP = 1, - ACTION_CAST_INVOCATION = 2, - ACTION_REMOVE_INVOCATION = 3, - ACTION_KINETIC_BOMB_JUMP = 4, - ACTION_FLAME_BALL_CHASE = 5, + ACTION_START_INTRO = 1, + ACTION_STAND_UP = 2, + ACTION_CAST_INVOCATION = 3, + ACTION_REMOVE_INVOCATION = 4, + ACTION_KINETIC_BOMB_JUMP = 5, + ACTION_FLAME_BALL_CHASE = 6, }; enum Points @@ -162,6 +163,7 @@ class StandUpEvent : public BasicEvent bool Execute(uint64 /*eventTime*/, uint32 /*diff*/) { _owner.HandleEmoteCommand(EMOTE_ONESHOT_ROAR); + _owner.SetReactState(REACT_AGGRESSIVE); return true; } @@ -382,8 +384,6 @@ class boss_prince_keleseth_icc : public CreatureScript if (!me->isDead()) JustRespawned(); - - me->SetReactState(REACT_DEFENSIVE); } void Reset() override @@ -395,7 +395,6 @@ class boss_prince_keleseth_icc : public CreatureScript _isEmpowered = false; me->SetHealth(_spawnHealth); instance->SetData(DATA_ORB_WHISPERER_ACHIEVEMENT, uint32(true)); - me->SetReactState(REACT_DEFENSIVE); } void EnterCombat(Unit* /*who*/) override @@ -597,8 +596,6 @@ class boss_prince_taldaram_icc : public CreatureScript if (!me->isDead()) JustRespawned(); - - me->SetReactState(REACT_DEFENSIVE); } void Reset() override @@ -610,12 +607,6 @@ class boss_prince_taldaram_icc : public CreatureScript _isEmpowered = false; me->SetHealth(_spawnHealth); instance->SetData(DATA_ORB_WHISPERER_ACHIEVEMENT, uint32(true)); - me->SetReactState(REACT_DEFENSIVE); - } - - void MoveInLineOfSight(Unit* /*who*/) override - - { } void EnterCombat(Unit* /*who*/) override @@ -821,8 +812,6 @@ class boss_prince_valanar_icc : public CreatureScript if (!me->isDead()) JustRespawned(); - - me->SetReactState(REACT_DEFENSIVE); } void Reset() override @@ -834,12 +823,6 @@ class boss_prince_valanar_icc : public CreatureScript _isEmpowered = false; me->SetHealth(me->GetMaxHealth()); instance->SetData(DATA_ORB_WHISPERER_ACHIEVEMENT, uint32(true)); - me->SetReactState(REACT_DEFENSIVE); - } - - void MoveInLineOfSight(Unit* /*who*/) override - - { } void EnterCombat(Unit* /*who*/) override @@ -905,6 +888,7 @@ class boss_prince_valanar_icc : public CreatureScript default: break; } + summons.Summon(summon); if (me->IsInCombat()) DoZoneInCombat(summon); @@ -1070,25 +1054,28 @@ class npc_blood_queen_lana_thel : public CreatureScript me->SetVisible(true); } - void MoveInLineOfSight(Unit* who) override - + void DoAction(int32 action) override { - if (_introDone) - return; - - if (!me->IsWithinDistInMap(who, 35.0f, false)) - return; - - _introDone = true; - Talk(SAY_INTRO_1); - _events.SetPhase(1); - _events.ScheduleEvent(EVENT_INTRO_1, 14000); - // summon a visual trigger - if (Creature* summon = DoSummon(NPC_FLOATING_TRIGGER, triggerPos, 15000, TEMPSUMMON_TIMED_DESPAWN)) + switch (action) { - summon->CastSpell(summon, SPELL_OOC_INVOCATION_VISUAL, true); - summon->SetSpeed(MOVE_FLIGHT, 0.15f, true); - summon->GetMotionMaster()->MovePoint(0, triggerEndPos); + case ACTION_START_INTRO: + if (!_introDone) + { + _introDone = true; + Talk(SAY_INTRO_1); + _events.SetPhase(1); + _events.ScheduleEvent(EVENT_INTRO_1, 14000); + // summon a visual trigger + if (Creature* summon = DoSummon(NPC_FLOATING_TRIGGER, triggerPos, 15000, TEMPSUMMON_TIMED_DESPAWN)) + { + summon->CastSpell(summon, SPELL_OOC_INVOCATION_VISUAL, true); + summon->SetSpeed(MOVE_FLIGHT, 0.15f, true); // todo: creature is swimming, check if this is blizzlike or not. + summon->GetMotionMaster()->MovePoint(0, triggerEndPos); + } + } + break; + default: + break; } } @@ -1328,7 +1315,6 @@ class npc_dark_nucleus : public CreatureScript } void MoveInLineOfSight(Unit* who) override - { ScriptedAI::MoveInLineOfSight(who); } @@ -1670,6 +1656,21 @@ class spell_blood_council_shadow_prison_damage : public SpellScriptLoader } }; +class at_blood_prince_council_start_intro : public AreaTriggerScript +{ + public: + at_blood_prince_council_start_intro() : AreaTriggerScript("at_blood_prince_council_start_intro") { } + + bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override + { + if (InstanceScript* instance = player->GetInstanceScript()) + if (Creature* bloodQueen = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_BLOOD_QUEEN_LANA_THEL_COUNCIL))) + bloodQueen->AI()->DoAction(ACTION_START_INTRO); + + return true; + } +}; + void AddSC_boss_blood_prince_council() { new boss_blood_council_controller(); @@ -1689,4 +1690,5 @@ void AddSC_boss_blood_prince_council() new spell_valanar_kinetic_bomb_absorb(); new spell_blood_council_shadow_prison(); new spell_blood_council_shadow_prison_damage(); + new at_blood_prince_council_start_intro(); } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp index 365e0a1588d..54c24769246 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp @@ -268,7 +268,6 @@ class boss_deathbringer_saurfang : public CreatureScript void Reset() override { _Reset(); - me->SetReactState(REACT_DEFENSIVE); events.SetPhase(PHASE_COMBAT); Initialize(); me->SetPower(POWER_ENERGY, 0); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp index e3e89d865ff..f76c415ab92 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp @@ -93,7 +93,6 @@ class boss_festergut : public CreatureScript void Reset() override { _Reset(); - me->SetReactState(REACT_DEFENSIVE); events.ScheduleEvent(EVENT_BERSERK, 300000); events.ScheduleEvent(EVENT_INHALE_BLIGHT, urand(25000, 30000)); events.ScheduleEvent(EVENT_GAS_SPORE, urand(20000, 25000)); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp index 3a745e2c98c..78a279b94fd 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp @@ -174,6 +174,11 @@ enum DeprogrammingData POINT_DESPAWN = 384721, }; +enum Actions +{ + ACTION_START_INTRO +}; + #define NPC_DARNAVAN RAID_MODE<uint32>(NPC_DARNAVAN_10, NPC_DARNAVAN_25, NPC_DARNAVAN_10, NPC_DARNAVAN_25) #define NPC_DARNAVAN_CREDIT RAID_MODE<uint32>(NPC_DARNAVAN_CREDIT_10, NPC_DARNAVAN_CREDIT_25, NPC_DARNAVAN_CREDIT_10, NPC_DARNAVAN_CREDIT_25) #define QUEST_DEPROGRAMMING RAID_MODE<uint32>(QUEST_DEPROGRAMMING_10, QUEST_DEPROGRAMMING_25, QUEST_DEPROGRAMMING_10, QUEST_DEPROGRAMMING_25) @@ -241,20 +246,26 @@ class boss_lady_deathwhisper : public CreatureScript me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, false); } - void MoveInLineOfSight(Unit* who) override - + void DoAction(int32 action) override { - if (!_introDone && me->IsWithinDistInMap(who, 110.0f)) + switch (action) { - _introDone = true; - Talk(SAY_INTRO_1); - events.SetPhase(PHASE_INTRO); - events.ScheduleEvent(EVENT_INTRO_2, 11000, 0, PHASE_INTRO); - events.ScheduleEvent(EVENT_INTRO_3, 21000, 0, PHASE_INTRO); - events.ScheduleEvent(EVENT_INTRO_4, 31500, 0, PHASE_INTRO); - events.ScheduleEvent(EVENT_INTRO_5, 39500, 0, PHASE_INTRO); - events.ScheduleEvent(EVENT_INTRO_6, 48500, 0, PHASE_INTRO); - events.ScheduleEvent(EVENT_INTRO_7, 58000, 0, PHASE_INTRO); + case ACTION_START_INTRO: + if (!_introDone) + { + _introDone = true; + Talk(SAY_INTRO_1); + events.SetPhase(PHASE_INTRO); + events.ScheduleEvent(EVENT_INTRO_2, 11000, 0, PHASE_INTRO); + events.ScheduleEvent(EVENT_INTRO_3, 21000, 0, PHASE_INTRO); + events.ScheduleEvent(EVENT_INTRO_4, 31500, 0, PHASE_INTRO); + events.ScheduleEvent(EVENT_INTRO_5, 39500, 0, PHASE_INTRO); + events.ScheduleEvent(EVENT_INTRO_6, 48500, 0, PHASE_INTRO); + events.ScheduleEvent(EVENT_INTRO_7, 58000, 0, PHASE_INTRO); + } + break; + default: + break; } } @@ -1024,6 +1035,21 @@ class spell_cultist_dark_martyrdom : public SpellScriptLoader } }; +class at_lady_deathwhisper_entrance : public AreaTriggerScript +{ + public: + at_lady_deathwhisper_entrance() : AreaTriggerScript("at_lady_deathwhisper_entrance") { } + + bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override + { + if (InstanceScript* instance = player->GetInstanceScript()) + if (Creature* ladyDeathwhisper = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_LADY_DEATHWHISPER))) + ladyDeathwhisper->AI()->DoAction(ACTION_START_INTRO); + + return true; + } +}; + void AddSC_boss_lady_deathwhisper() { new boss_lady_deathwhisper(); @@ -1033,4 +1059,5 @@ void AddSC_boss_lady_deathwhisper() new npc_darnavan(); new spell_deathwhisper_mana_barrier(); new spell_cultist_dark_martyrdom(); + new at_lady_deathwhisper_entrance(); } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp index 2fbd1293891..993fc75fcde 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp @@ -89,11 +89,15 @@ enum MiscInfo //DATA_SPIKE_IMMUNE_1, = 2, // Reserved & used //DATA_SPIKE_IMMUNE_2, = 3, // Reserved & used - ACTION_CLEAR_SPIKE_IMMUNITIES = 1, - MAX_BONE_SPIKE_IMMUNE = 3, }; +enum Actions +{ + ACTION_CLEAR_SPIKE_IMMUNITIES = 1, + ACTION_TALK_ENTER_ZONE = 2 +}; + class BoneSpikeTargetSelector : public std::unary_function<Unit*, bool> { public: @@ -131,7 +135,6 @@ class boss_lord_marrowgar : public CreatureScript _boneStormDuration = RAID_MODE<uint32>(20000, 30000, 20000, 30000); _baseSpeed = creature->GetSpeedRate(MOVE_RUN); _coldflameLastPos.Relocate(creature); - _introDone = false; _boneSlice = false; } @@ -146,6 +149,7 @@ class boss_lord_marrowgar : public CreatureScript events.ScheduleEvent(EVENT_COLDFLAME, 5000, EVENT_GROUP_SPECIAL); events.ScheduleEvent(EVENT_WARN_BONE_STORM, urand(45000, 50000)); events.ScheduleEvent(EVENT_ENRAGE, 600000); + _introDone = false; _boneSlice = false; _boneSpikeImmune.clear(); } @@ -179,16 +183,6 @@ class boss_lord_marrowgar : public CreatureScript Talk(SAY_KILL); } - void MoveInLineOfSight(Unit* who) override - - { - if (!_introDone && me->IsWithinDistInMap(who, 70.0f)) - { - Talk(SAY_ENTER_ZONE); - _introDone = true; - } - } - void UpdateAI(uint32 diff) override { if (!UpdateVictim() || !CheckInRoom()) @@ -324,10 +318,21 @@ class boss_lord_marrowgar : public CreatureScript void DoAction(int32 action) override { - if (action != ACTION_CLEAR_SPIKE_IMMUNITIES) - return; - - _boneSpikeImmune.clear(); + switch (action) + { + case ACTION_CLEAR_SPIKE_IMMUNITIES: + _boneSpikeImmune.clear(); + break; + case ACTION_TALK_ENTER_ZONE: + if (!_introDone) + { + Talk(SAY_ENTER_ZONE); + _introDone = true; + } + break; + default: + break; + } } private: @@ -742,6 +747,22 @@ class spell_marrowgar_bone_slice : public SpellScriptLoader } }; +class at_lord_marrowgar_entrance : public AreaTriggerScript +{ + public: + at_lord_marrowgar_entrance() : AreaTriggerScript("at_lord_marrowgar_entrance") { } + + bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override + { + if (InstanceScript* instance = player->GetInstanceScript()) + if (Creature* lordMarrowgar = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_LORD_MARROWGAR))) + lordMarrowgar->AI()->DoAction(ACTION_TALK_ENTER_ZONE); + + return true; + } + +}; + void AddSC_boss_lord_marrowgar() { new boss_lord_marrowgar(); @@ -753,4 +774,5 @@ void AddSC_boss_lord_marrowgar() new spell_marrowgar_bone_spike_graveyard(); new spell_marrowgar_bone_storm(); new spell_marrowgar_bone_slice(); + new at_lord_marrowgar_entrance(); } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp index be134a06173..4c67c0a7163 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp @@ -236,7 +236,6 @@ class boss_professor_putricide : public CreatureScript summons.DespawnAll(); SetPhase(PHASE_COMBAT_1); _experimentState = EXPERIMENT_STATE_OOZE; - me->SetReactState(REACT_DEFENSIVE); me->SetWalk(false); if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == POINT_MOTION_TYPE) me->GetMotionMaster()->MovementExpired(); @@ -616,7 +615,7 @@ class boss_professor_putricide : public CreatureScript DoCast(me, SPELL_TEAR_GAS_PERIODIC_TRIGGER, true); break; case EVENT_RESUME_ATTACK: - me->SetReactState(REACT_DEFENSIVE); + me->SetReactState(REACT_AGGRESSIVE); AttackStart(me->GetVictim()); // remove Tear Gas me->RemoveAurasDueToSpell(SPELL_TEAR_GAS_PERIODIC_TRIGGER); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp index 1a2ebd179fe..d03925f734a 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp @@ -168,11 +168,6 @@ class boss_rotface : public CreatureScript Talk(SAY_SLIME_SPRAY); } - void MoveInLineOfSight(Unit* /*who*/) override - { - // don't enter combat - } - void JustSummoned(Creature* summon) override { if (summon->GetEntry() == NPC_VILE_GAS_STALKER) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp index 65d99b022dc..8917af0038f 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp @@ -234,7 +234,6 @@ class boss_sindragosa : public CreatureScript void Reset() override { BossAI::Reset(); - me->SetReactState(REACT_DEFENSIVE); DoCast(me, SPELL_TANK_MARKER, true); events.ScheduleEvent(EVENT_BERSERK, 600000); events.ScheduleEvent(EVENT_CLEAVE, 10000, EVENT_GROUP_LAND_PHASE); @@ -659,7 +658,6 @@ class npc_spinestalker : public CreatureScript _events.ScheduleEvent(EVENT_BELLOWING_ROAR, urand(20000, 25000)); _events.ScheduleEvent(EVENT_CLEAVE_SPINESTALKER, urand(10000, 15000)); _events.ScheduleEvent(EVENT_TAIL_SWEEP, urand(8000, 12000)); - me->SetReactState(REACT_DEFENSIVE); if (!_summoned) { @@ -699,6 +697,7 @@ class npc_spinestalker : public CreatureScript me->GetMotionMaster()->MoveIdle(); me->StopMoving(); me->GetMotionMaster()->MovePoint(POINT_FROSTWYRM_FLY_IN, SpinestalkerFlyPos); + me->SetReactState(REACT_DEFENSIVE); } } @@ -714,6 +713,7 @@ class npc_spinestalker : public CreatureScript me->SetHomePosition(SpinestalkerLandPos); me->SetFacingTo(SpinestalkerLandPos.GetOrientation()); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + me->SetReactState(REACT_AGGRESSIVE); } void UpdateAI(uint32 diff) override @@ -794,7 +794,6 @@ class npc_rimefang : public CreatureScript _events.Reset(); _events.ScheduleEvent(EVENT_FROST_BREATH_RIMEFANG, urand(12000, 15000)); _events.ScheduleEvent(EVENT_ICY_BLAST, urand(30000, 35000)); - me->SetReactState(REACT_DEFENSIVE); Initialize(); if (!_summoned) @@ -835,6 +834,7 @@ class npc_rimefang : public CreatureScript me->GetMotionMaster()->MoveIdle(); me->StopMoving(); me->GetMotionMaster()->MovePoint(POINT_FROSTWYRM_FLY_IN, RimefangFlyPos); + me->SetReactState(REACT_DEFENSIVE); } } @@ -850,6 +850,7 @@ class npc_rimefang : public CreatureScript me->SetHomePosition(RimefangLandPos); me->SetFacingTo(RimefangLandPos.GetOrientation()); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + me->SetReactState(REACT_AGGRESSIVE); } void EnterCombat(Unit* /*victim*/) override diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h index e739f5a5036..224aa6cda45 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h @@ -72,50 +72,51 @@ enum TeleporterSpells enum DataTypes { // Encounter States/Boss GUIDs - DATA_LORD_MARROWGAR = 0, - DATA_LADY_DEATHWHISPER = 1, - DATA_ICECROWN_GUNSHIP_BATTLE = 2, - DATA_DEATHBRINGER_SAURFANG = 3, - DATA_FESTERGUT = 4, - DATA_ROTFACE = 5, - DATA_PROFESSOR_PUTRICIDE = 6, - DATA_BLOOD_PRINCE_COUNCIL = 7, - DATA_BLOOD_QUEEN_LANA_THEL = 8, - DATA_SISTER_SVALNA = 9, - DATA_VALITHRIA_DREAMWALKER = 10, - DATA_SINDRAGOSA = 11, - DATA_THE_LICH_KING = 12, + DATA_LORD_MARROWGAR = 0, + DATA_LADY_DEATHWHISPER = 1, + DATA_ICECROWN_GUNSHIP_BATTLE = 2, + DATA_DEATHBRINGER_SAURFANG = 3, + DATA_FESTERGUT = 4, + DATA_ROTFACE = 5, + DATA_PROFESSOR_PUTRICIDE = 6, + DATA_BLOOD_PRINCE_COUNCIL = 7, + DATA_BLOOD_QUEEN_LANA_THEL = 8, + DATA_SISTER_SVALNA = 9, + DATA_VALITHRIA_DREAMWALKER = 10, + DATA_SINDRAGOSA = 11, + DATA_THE_LICH_KING = 12, // Additional data - DATA_SAURFANG_EVENT_NPC = 13, - DATA_BONED_ACHIEVEMENT = 14, - DATA_OOZE_DANCE_ACHIEVEMENT = 15, - DATA_PUTRICIDE_TABLE = 16, - DATA_NAUSEA_ACHIEVEMENT = 17, - DATA_ORB_WHISPERER_ACHIEVEMENT = 18, - DATA_PRINCE_KELESETH_GUID = 19, - DATA_PRINCE_TALDARAM_GUID = 20, - DATA_PRINCE_VALANAR_GUID = 21, - DATA_BLOOD_PRINCES_CONTROL = 22, - DATA_SINDRAGOSA_FROSTWYRMS = 23, - DATA_SPINESTALKER = 24, - DATA_RIMEFANG = 25, - DATA_COLDFLAME_JETS = 26, - DATA_TEAM_IN_INSTANCE = 27, - DATA_BLOOD_QUICKENING_STATE = 28, - DATA_HEROIC_ATTEMPTS = 29, - DATA_CROK_SCOURGEBANE = 30, - DATA_CAPTAIN_ARNATH = 31, - DATA_CAPTAIN_BRANDON = 32, - DATA_CAPTAIN_GRONDEL = 33, - DATA_CAPTAIN_RUPERT = 34, - DATA_VALITHRIA_TRIGGER = 35, - DATA_VALITHRIA_LICH_KING = 36, - DATA_HIGHLORD_TIRION_FORDRING = 37, - DATA_ARTHAS_PLATFORM = 38, - DATA_TERENAS_MENETHIL = 39, - DATA_ENEMY_GUNSHIP = 40, - DATA_UPPERSPIRE_TELE_ACT = 41, + DATA_SAURFANG_EVENT_NPC = 13, + DATA_BONED_ACHIEVEMENT = 14, + DATA_OOZE_DANCE_ACHIEVEMENT = 15, + DATA_PUTRICIDE_TABLE = 16, + DATA_NAUSEA_ACHIEVEMENT = 17, + DATA_ORB_WHISPERER_ACHIEVEMENT = 18, + DATA_PRINCE_KELESETH_GUID = 19, + DATA_PRINCE_TALDARAM_GUID = 20, + DATA_PRINCE_VALANAR_GUID = 21, + DATA_BLOOD_PRINCES_CONTROL = 22, + DATA_SINDRAGOSA_FROSTWYRMS = 23, + DATA_SPINESTALKER = 24, + DATA_RIMEFANG = 25, + DATA_COLDFLAME_JETS = 26, + DATA_TEAM_IN_INSTANCE = 27, + DATA_BLOOD_QUICKENING_STATE = 28, + DATA_HEROIC_ATTEMPTS = 29, + DATA_CROK_SCOURGEBANE = 30, + DATA_CAPTAIN_ARNATH = 31, + DATA_CAPTAIN_BRANDON = 32, + DATA_CAPTAIN_GRONDEL = 33, + DATA_CAPTAIN_RUPERT = 34, + DATA_VALITHRIA_TRIGGER = 35, + DATA_VALITHRIA_LICH_KING = 36, + DATA_HIGHLORD_TIRION_FORDRING = 37, + DATA_ARTHAS_PLATFORM = 38, + DATA_TERENAS_MENETHIL = 39, + DATA_ENEMY_GUNSHIP = 40, + DATA_UPPERSPIRE_TELE_ACT = 41, + DATA_BLOOD_QUEEN_LANA_THEL_COUNCIL = 42 }; enum CreaturesIds @@ -247,6 +248,7 @@ enum CreaturesIds NPC_KINETIC_BOMB_TARGET = 38458, NPC_KINETIC_BOMB = 38454, NPC_SHOCK_VORTEX = 38422, + NPC_BLOOD_QUEEN_LANA_THEL_COUNCIL = 38004, // Blood-Queen Lana'thel NPC_BLOOD_QUEEN_LANA_THEL = 37955, diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp index 5354d1772b6..718c0ebe231 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp @@ -173,6 +173,12 @@ class instance_icecrown_citadel : public InstanceMapScript switch (creature->GetEntry()) { + case NPC_LORD_MARROWGAR: + LordMarrowgarGUID = creature->GetGUID(); + break; + case NPC_LADY_DEATHWHISPER: + LadyDeahtwhisperGUID = creature->GetGUID(); + break; case NPC_KOR_KRON_GENERAL: if (TeamInInstance == ALLIANCE) creature->UpdateEntry(NPC_ALLIANCE_COMMANDER); @@ -249,6 +255,9 @@ class instance_icecrown_citadel : public InstanceMapScript case NPC_BLOOD_ORB_CONTROLLER: BloodCouncilControllerGUID = creature->GetGUID(); break; + case NPC_BLOOD_QUEEN_LANA_THEL_COUNCIL: + BloodQueenLanaThelCouncilGUID = creature->GetGUID(); + break; case NPC_BLOOD_QUEEN_LANA_THEL: BloodQueenLanaThelGUID = creature->GetGUID(); break; @@ -712,6 +721,10 @@ class instance_icecrown_citadel : public InstanceMapScript { switch (type) { + case DATA_LORD_MARROWGAR: + return LordMarrowgarGUID; + case DATA_LADY_DEATHWHISPER: + return LadyDeahtwhisperGUID; case DATA_ICECROWN_GUNSHIP_BATTLE: return GunshipGUID; case DATA_ENEMY_GUNSHIP: @@ -738,6 +751,8 @@ class instance_icecrown_citadel : public InstanceMapScript return BloodCouncilGUIDs[2]; case DATA_BLOOD_PRINCES_CONTROL: return BloodCouncilControllerGUID; + case DATA_BLOOD_QUEEN_LANA_THEL_COUNCIL: + return BloodQueenLanaThelCouncilGUID; case DATA_BLOOD_QUEEN_LANA_THEL: return BloodQueenLanaThelGUID; case DATA_CROK_SCOURGEBANE: @@ -1425,6 +1440,8 @@ class instance_icecrown_citadel : public InstanceMapScript protected: EventMap Events; + ObjectGuid LordMarrowgarGUID; + ObjectGuid LadyDeahtwhisperGUID; ObjectGuid LadyDeathwisperElevatorGUID; ObjectGuid GunshipGUID; ObjectGuid EnemyGunshipGUID; @@ -1452,6 +1469,7 @@ class instance_icecrown_citadel : public InstanceMapScript ObjectGuid PutricideTableGUID; ObjectGuid BloodCouncilGUIDs[3]; ObjectGuid BloodCouncilControllerGUID; + ObjectGuid BloodQueenLanaThelCouncilGUID; ObjectGuid BloodQueenLanaThelGUID; ObjectGuid CrokScourgebaneGUID; ObjectGuid CrokCaptainGUIDs[4]; diff --git a/src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp b/src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp index 1683667a02a..f94f7b227bf 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp @@ -17,43 +17,40 @@ #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "SpellInfo.h" #include "naxxramas.h" -//Razuvious - NO TEXT sound only -//8852 aggro01 - Hah hah, I'm just getting warmed up! -//8853 aggro02 Stand and fight! -//8854 aggro03 Show me what you've got! -//8861 slay1 - You should've stayed home! -//8863 slay2- -//8858 cmmnd3 - You disappoint me, students! -//8855 cmmnd1 - Do as I taught you! -//8856 cmmnd2 - Show them no mercy! -//8859 cmmnd4 - The time for practice is over! Show me what you've learned! -//8861 Sweep the leg! Do you have a problem with that? -//8860 death - An honorable... death... -//8947 - Aggro Mixed? - ? - -#define SOUND_AGGRO RAND(8852, 8853, 8854) -#define SOUND_SLAY RAND(8861, 8863) -#define SOUND_COMMND RAND(8855, 8856, 8858, 8859, 8861) -#define SOUND_DEATH 8860 -#define SOUND_AGGROMIX 8847 +enum Yells +{ + SAY_AGGRO = 0, + SAY_SLAY = 1, + SAY_TAUNTED = 2, + SAY_DEATH = 3 +}; enum Spells { - SPELL_UNBALANCING_STRIKE = 26613, - SPELL_DISRUPTING_SHOUT = 29107, - SPELL_JAGGED_KNIFE = 55550, - SPELL_HOPELESS = 29125 + SPELL_UNBALANCING_STRIKE = 26613, + SPELL_DISRUPTING_SHOUT = 29107, + SPELL_JAGGED_KNIFE = 55550, + SPELL_HOPELESS = 29125, + SPELL_UNDERSTUDY_TAUNT = 29060, + SPELL_UNDERSTUDY_BLOOD_STRIKE = 61696, + SPELL_FORCE_OBEDIENCE = 55479 }; enum Events { - EVENT_NONE, + EVENT_ATTACK = 1, EVENT_STRIKE, EVENT_SHOUT, - EVENT_KNIFE, - EVENT_COMMAND, + EVENT_KNIFE +}; + +enum SummonGroups +{ + SUMMON_GROUP_10MAN = 1, + SUMMON_GROUP_25MAN = 2 }; class boss_razuvious : public CreatureScript @@ -70,36 +67,60 @@ public: { boss_razuviousAI(Creature* creature) : BossAI(creature, BOSS_RAZUVIOUS) { } - void KilledUnit(Unit* /*victim*/) override + void SummonAdds() { - if (!(rand32() % 3)) - DoPlaySoundToSet(me, SOUND_SLAY); + me->SummonCreatureGroup(SUMMON_GROUP_10MAN); + if (Is25ManRaid()) + me->SummonCreatureGroup(SUMMON_GROUP_25MAN); } - void DamageTaken(Unit* pDone_by, uint32& uiDamage) override + void InitializeAI() override { - // Damage done by the controlled Death Knight understudies should also count toward damage done by players - if (pDone_by->GetTypeId() == TYPEID_UNIT && (pDone_by->GetEntry() == 16803 || pDone_by->GetEntry() == 29941)) + if (!me->isDead()) { - me->LowerPlayerDamageReq(uiDamage); + Reset(); + SummonAdds(); } } + void JustReachedHome() override + { + _JustReachedHome(); + SummonAdds(); + me->GetMotionMaster()->Initialize(); + } + + void KilledUnit(Unit* victim) override + { + if (victim->GetTypeId() == TYPEID_PLAYER || (victim->GetTypeId() == TYPEID_UNIT && victim->GetEntry() == NPC_DK_UNDERSTUDY)) + Talk(SAY_SLAY); + } + + void SpellHit(Unit* caster, SpellInfo const* spell) override + { + if (spell->Id == SPELL_UNDERSTUDY_TAUNT) + Talk(SAY_TAUNTED, caster); + } + void JustDied(Unit* /*killer*/) override { - _JustDied(); - DoPlaySoundToSet(me, SOUND_DEATH); - me->CastSpell(me, SPELL_HOPELESS, true); /// @todo this may affect other creatures + Talk(SAY_DEATH); + DoCastAOE(SPELL_HOPELESS, true); + + events.Reset(); + instance->SetBossState(BOSS_RAZUVIOUS, DONE); } void EnterCombat(Unit* /*who*/) override { _EnterCombat(); - DoPlaySoundToSet(me, SOUND_AGGRO); - events.ScheduleEvent(EVENT_STRIKE, 30000); - events.ScheduleEvent(EVENT_SHOUT, 25000); - events.ScheduleEvent(EVENT_COMMAND, 40000); - events.ScheduleEvent(EVENT_KNIFE, 10000); + me->StopMoving(); + summons.DoZoneInCombat(); + Talk(SAY_AGGRO); + events.ScheduleEvent(EVENT_ATTACK, 7 * IN_MILLISECONDS); + events.ScheduleEvent(EVENT_STRIKE, 21 * IN_MILLISECONDS); + events.ScheduleEvent(EVENT_SHOUT, 16 * IN_MILLISECONDS); + events.ScheduleEvent(EVENT_KNIFE, 10 * IN_MILLISECONDS); } void UpdateAI(uint32 diff) override @@ -113,33 +134,112 @@ public: { switch (eventId) { + case EVENT_ATTACK: + SetCombatMovement(true); + if (Unit* victim = me->GetVictim()) + me->GetMotionMaster()->MoveChase(victim); + break; case EVENT_STRIKE: DoCastVictim(SPELL_UNBALANCING_STRIKE); - events.ScheduleEvent(EVENT_STRIKE, 30000); + events.ScheduleEvent(EVENT_STRIKE, 6 * IN_MILLISECONDS); return; case EVENT_SHOUT: DoCastAOE(SPELL_DISRUPTING_SHOUT); - events.ScheduleEvent(EVENT_SHOUT, 25000); + events.ScheduleEvent(EVENT_SHOUT, 16 * IN_MILLISECONDS); return; case EVENT_KNIFE: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 45.0f)) DoCast(target, SPELL_JAGGED_KNIFE); - events.ScheduleEvent(EVENT_KNIFE, 10000); - return; - case EVENT_COMMAND: - DoPlaySoundToSet(me, SOUND_COMMND); - events.ScheduleEvent(EVENT_COMMAND, 40000); + events.ScheduleEvent(EVENT_KNIFE, urandms(10,15)); return; } } DoMeleeAttackIfReady(); } + + void Reset() override + { + SetCombatMovement(false); + _Reset(); + } }; }; +class npc_dk_understudy : public CreatureScript +{ + public: + npc_dk_understudy() : CreatureScript("npc_dk_understudy") { } + + struct npc_dk_understudyAI : public ScriptedAI + { + npc_dk_understudyAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()), bloodStrikeTimer(0) { } + + void EnterCombat(Unit* /*who*/) override + { + me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); + if (Creature* razuvious = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_RAZUVIOUS))) + razuvious->AI()->DoZoneInCombat(nullptr, 250.0f); + } + + void JustReachedHome() override + { + if (_instance->GetBossState(BOSS_RAZUVIOUS) == DONE) + me->DespawnOrUnsummon(); + else + ScriptedAI::JustReachedHome(); + } + + void UpdateAI(uint32 diff) override + { + if (!me->isPossessedByPlayer() && !UpdateVictim()) + return; + + if (!me->isPossessedByPlayer()) + { + if (diff < bloodStrikeTimer) + bloodStrikeTimer -= diff; + else + DoCastVictim(SPELL_UNDERSTUDY_BLOOD_STRIKE); + } + + DoMeleeAttackIfReady(); + } + + void OnCharmed(bool apply) override + { + ScriptedAI::OnCharmed(apply); + if (apply) + { + if (!me->IsInCombat()) + EnterCombat(nullptr); + me->StopMoving(); + me->SetReactState(REACT_PASSIVE); + _charmer = me->GetCharmerGUID(); + } + else + { + me->SetReactState(REACT_AGGRESSIVE); + if (Unit* charmer = ObjectAccessor::GetUnit(*me, _charmer)) + me->AddThreat(charmer, 100000.0f); + DoZoneInCombat(nullptr, 250.0f); + } + } + private: + InstanceScript* const _instance; + ObjectGuid _charmer; + uint32 bloodStrikeTimer; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<npc_dk_understudyAI>(creature); + } +}; + void AddSC_boss_razuvious() { new boss_razuvious(); + new npc_dk_understudy(); } diff --git a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp index 53ce68d3efc..0e572835a51 100644 --- a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp +++ b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp @@ -60,7 +60,6 @@ DoorData const doorData[] = MinionData const minionData[] = { - { NPC_DK_UNDERSTUDY, BOSS_RAZUVIOUS }, { NPC_SIR, BOSS_HORSEMEN }, { NPC_THANE, BOSS_HORSEMEN }, { NPC_LADY, BOSS_HORSEMEN }, @@ -143,6 +142,9 @@ class instance_naxxramas : public InstanceMapScript case NPC_FAERLINA: FaerlinaGUID = creature->GetGUID(); break; + case NPC_RAZUVIOUS: + RazuviousGUID = creature->GetGUID(); + break; case NPC_THANE: ThaneGUID = creature->GetGUID(); break; @@ -378,6 +380,8 @@ class instance_naxxramas : public InstanceMapScript return AnubRekhanGUID; case DATA_FAERLINA: return FaerlinaGUID; + case DATA_RAZUVIOUS: + return RazuviousGUID; case DATA_THANE: return ThaneGUID; case DATA_LADY: @@ -652,6 +656,8 @@ class instance_naxxramas : public InstanceMapScript ObjectGuid HeiganGUID; /* The Military Quarter */ + // Instructor Razuvious + ObjectGuid RazuviousGUID; // Gothik the Harvester ObjectGuid GothikGateGUID; // The Four Horsemen diff --git a/src/server/scripts/Northrend/Naxxramas/naxxramas.h b/src/server/scripts/Northrend/Naxxramas/naxxramas.h index d2b99784953..e4d15cf84ba 100644 --- a/src/server/scripts/Northrend/Naxxramas/naxxramas.h +++ b/src/server/scripts/Northrend/Naxxramas/naxxramas.h @@ -66,6 +66,7 @@ enum Data64 { DATA_ANUBREKHAN, DATA_FAERLINA, + DATA_RAZUVIOUS, DATA_THANE, DATA_LADY, DATA_BARON, @@ -87,6 +88,7 @@ enum CreaturesIds { NPC_ANUBREKHAN = 15956, NPC_FAERLINA = 15953, + NPC_RAZUVIOUS = 16061, NPC_THANE = 16064, NPC_LADY = 16065, NPC_BARON = 30549, |