From 6a074af1967272fe67a54c61d325a352dc18d9cd Mon Sep 17 00:00:00 2001 From: Nefertumm Date: Wed, 27 Feb 2019 19:16:56 -0300 Subject: [PATCH] fix(Core/DB/Quest): Battle for the Undercity (#1479) - Closes #204 --- .../rev_1550359453246256000.sql | 1065 +++++ src/server/game/Spells/SpellMgr.cpp | 7 + .../EasternKingdoms/zone_undercity.cpp | 3711 ++++++++++++++++- 3 files changed, 4770 insertions(+), 13 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1550359453246256000.sql diff --git a/data/sql/updates/pending_db_world/rev_1550359453246256000.sql b/data/sql/updates/pending_db_world/rev_1550359453246256000.sql new file mode 100644 index 000000000..d21f34624 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1550359453246256000.sql @@ -0,0 +1,1065 @@ +-- Undercity Fight +-- The Battle for the Undercity - Alliance +SET @WRYNN := 32401; +SET @JAINA := 32402; +SET @BROLL := 32376; +SET @VALEERA := 32378; +SET @SWSOLDIER := 32387; +SET @SWSOLDIER2 := 31639; +SET @ALLIANCETANK := 31638; +SET @ALLIANCEPLANE := 32388; +SET @DEMOLISHER := 31652; +SET @WSGUARD := 31739; +SET @PLAGUEDFELBEAST := 32392; +SET @GUARDIAN := 32390; +SET @DREADLORD := 32391; +SET @BLIGHTDOCTOR := 32397; +SET @COLLABORATOR := 32396; +SET @BETRAYER := 32394; +SET @CHEMIST := 32395; +SET @GENERATOR := 36212; +SET @PUTRESS := 31530; +SET @BLIGHTWORM := 32483; +SET @KHANOK := 32511; +SET @FAILEDEXPERIMENT := 32519; +SET @THRALL := 32518; +SET @SYLVANAS := 32365; +SET @VARIMATHRAS := 31565; +SET @SAURFANG := 32315; +SET @VOICE := 32277; +SET @VOLJIN := 31649; +SET @SPELLPHASE128 := 60815; +SET @SPELLPHASE64 := 59062; +SET @BLIGHTBREATH := 61125; +SET @INGEST := 61123; +SET @SPELLMISSILES := 54900; +SET @BLIGHTEMPOWERMENT := 59449; +SET @WRYNNBUFF := 60964; +SET @QUEST := 13377; +SET @QUEST_H := 13267; +SET @PORTAL := 193956; +SET @CGUID := 3109763; +SET @GGUID := 2134392; + +-- ALLIANCE EVENT +UPDATE `creature_template` SET HealthModifier=915.547520661157 WHERE entry=32483; + +UPDATE `creature_template` SET InhabitType=4, minlevel=74, maxlevel=75 WHERE entry=@ALLIANCEPLANE; +UPDATE `creature_template` SET minlevel=75, maxlevel=76 WHERE entry=@SWSOLDIER; + +UPDATE `creature_template` SET unit_flags=0, minlevel=74, maxlevel=76 WHERE entry IN (@PLAGUEDFELBEAST,@GUARDIAN,@DREADLORD,@BLIGHTDOCTOR,@COLLABORATOR,@BETRAYER,@CHEMIST); +UPDATE `creature_template` SET unit_flags=256 WHERE entry=@WRYNN; +UPDATE `creature_template` SET unit_flags=unit_flags|512, faction=2142 WHERE entry=@JAINA; +UPDATE `creature_template` SET type_flags=type_flags|4096 WHERE entry IN(@WRYNN, @JAINA); +UPDATE `creature_template` SET minlevel=80, maxlevel=80 WHERE entry IN(@BROLL, @VALEERA, @WRYNN, @JAINA); +UPDATE `creature_template` SET unit_flags=32768 WHERE entry=@BLIGHTWORM; +UPDATE `creature_template` SET minlevel=83, maxlevel=83 WHERE entry IN(@BLIGHTWORM, @PUTRESS); +UPDATE `creature_template` SET unit_flags=unit_flags|256|512, flags_extra=flags_extra|128, InhabitType=4 WHERE entry=@GENERATOR; + +UPDATE `creature_template` SET ScriptName="npc_varian_wrynn" WHERE entry=@WRYNN; +UPDATE `creature_template` SET ScriptName="npc_jaina_proudmoore_bfu" WHERE entry=@JAINA; +UPDATE `creature_template` SET ScriptName="boss_blight_worm" WHERE entry=@BLIGHTWORM; + +DELETE FROM `spell_script_names` WHERE spell_id IN(@INGEST); +INSERT INTO `spell_script_names` (spell_id, Scriptname) VALUES +(@INGEST, 'spell_blight_worm_ingest'); + +DELETE FROM `creature_text` WHERE CreatureID IN(@WRYNN, @JAINA, @PUTRESS, @THRALL, @SYLVANAS, @VARIMATHRAS, @SAURFANG, @VOICE); +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `Text`, `Type`, `Language`, `Sound`, `comment`, `BroadcastTextId`) VALUES +(@WRYNN, 0, 'Heroes of the Alliance, your King calls! Gather behind me at the entrance to the sewers of the Undercity!', 14, 0, 16103, 'Wrynn - Battle for Undercity',32843), +(@WRYNN, 1, 'Hidden inside this defiled city is the wretch responsible for murdering our brothers and sisters at the Wrathgate! He must be brought to justice!', 14, 0, 16104, 'Wrynn - battle for Undercity',32979), +(@WRYNN, 2, 'Soon we will march upon this cursed place and cleanse it of its evil!', 14, 0, 16102, 'Wrynn - Battle for Undercity (Alliance)',32844), +(@WRYNN, 3, 'The hour of redemption is close at hand! Prepare yourselves!', 14, 0, 16101, 'Wrynn - Battle for Undercity (Alliance)',32847), +(@WRYNN, 4, 'The march upon the Undercity begins now! Be empowered by your King''s strength! Follow me, heroes! FOR THE GLORY OF THE ALLIANCE!', 14, 0, 16100, 'Wrynn - Battle for Undercity (Alliance)',32849), +(@WRYNN, 5, 'Onward, brothers and sisters! Destiny awaits!', 14, 0, 16079, 'Wrynn - Battle for Undercity (Alliance)',32856), +(@WRYNN, 6, 'Our descent into the depths of depravity begins! Be on guard! Jaina, lend us your strength!', 12, 0, 16080, 'Wrynn - Battle for Undercity (Alliance)',32858), +(@WRYNN, 7, 'What is this?! Stand your ground! Do not give them an inch!', 12, 0, 16081, 'Wrynn - Battle for Undercity (Alliance)',36090), +(@WRYNN, 8, 'Soldiers, fall in! Guard the halls!', 14, 0, 16082, 'Wrynn - Battle for Undercity',32938), +(@WRYNN, 9, 'Your aberrations are no match for the Alliance, Putress! We''re coming for you!', 14, 0, 16083, 'Wrynn - Battle for Undercity (Alliance)',32937), +(@WRYNN, 10, 'Horde. By the looks of the struggle, they are here in force - somewhere.', 12, 0, 16084, 'Wrynn - Battle for Undercity (Alliance)',32940), +(@WRYNN, 11, 'Stay alert and on guard. There''s no telling what horrors await us.', 12, 0, 16085, 'Wrynn - Battle for Undercity (Alliance)',32941), +(@WRYNN, 12, 'ONWARD!', 12, 0, 16086, 'Wrynn - Battle for Undercity (Alliance)',12821), +(@WRYNN, 13, 'The main chamber is this way! Let''s go!', 12, 0, 16087, 'Wrynn - Battle for Undercity (Alliance)',32945), +(@WRYNN, 14, 'THERE!', 12, 0, 16088, 'Wrynn - Battle for Undercity (Alliance)',24654), +(@WRYNN, 15, 'There''s nowhere to run, monster!', 14, 0, 16089, 'Wrynn - Battle for Undercity (Alliance)',32947), +(@WRYNN, 16, 'And justice is served!', 14, 0, 16090, 'Wrynn - Battle for Undercity (Alliance)',32961), +(@WRYNN, 17, 'What say you now, Putress?', 12, 0, 16091, 'Wrynn - Battle for Undercity (Alliance)',32962), +(@WRYNN, 18, 'Look around you, brothers and sisters. Open your eyes! Look at what they have done to our kingdom!', 12, 0, 16092, 'Wrynn - Battle for Undercity (Alliance)',32963), +(@WRYNN, 19, 'How much longer will we allow these savages free reign in our world?', 12, 0, 16093, 'Wrynn - Battle for Undercity (Alliance)',32964), +(@WRYNN, 20, 'I have seen the Horde''s world. I have been inside their cities. Inside their minds...', 12, 0, 16094, 'Wrynn - Battle for Undercity (Alliance)',32965), +(@WRYNN, 21, 'I know what evil lies in the hearts of orcs.', 12, 0, 16095, 'Wrynn - Battle for Undercity (Alliance)',32966), +(@WRYNN, 22, 'THRALL! HERE?', 12, 0, 16096, 'Wrynn - Battle for Undercity (Alliance)',32968), +(@WRYNN, 23, 'ONWARD! We end this now!', 12, 0, 16097, 'Wrynn - Battle for Undercity (Alliance)',32969), +(@WRYNN, 24, 'The orcs have a battle cry: LOK''TAR OGAR! It means "victory or death." Fitting...', 12, 0, 16098, 'Wrynn - Battle for Undercity (Alliance)',32970), +(@WRYNN, 25, 'To the throne room!', 12, 0, 16099, 'Wrynn - Battle for Undercity (Alliance)',32971), +(@WRYNN, 26, 'I was away for too long. My absence cost us the lives of some of our greatest heroes. Trash like you and this evil witch were allowed to roam free -- unchecked.', 12, 0, 16073, 'Wrynn - Battle for Undercity (Alliance)',32691), +(@WRYNN, 27, 'The time has come to make things right. To disband your treacherous kingdom of murderers and thieves. Putress was the first strike. Many more will come.', 12, 0, 16074, 'Wrynn - Battle for Undercity (Alliance)',32693), +(@WRYNN, 28, 'I''ve waited a long time for this, Thrall. For every time I was thrown into one of your damned arenas... for every time I killed a green-skinned aberration like you... I could only think of one thing.', 12, 0, 16075, 'Wrynn - Battle for Undercity (Alliance)',32697), +(@WRYNN, 29, 'What our world could be without you and your twisted Horde... It ends now, Warchief.', 12, 0, 16076, 'Wrynn - Battle for Undercity (Alliance)',32699), +(@WRYNN, 30, 'ATTACK! FOR STORMWIND! FOR BOLVAR! FOR THE ALLIANCE!', 12, 0, 16077, 'Wrynn - Battle for Undercity (Alliance)',32700), +(@JAINA, 0, 'Right away, your majesty!', 12, 0, 16126, 'Jaina - Battle for Undercity (Alliance)', 32865), +(@JAINA, 1, 'What''s happened here? There are corpses everywhere... the stench... overwhelming...', 12, 0, 16127, 'Jaina - Battle for Undercity (Alliance)',32939), +(@JAINA, 2, 'Varian, stop! I won''t help you do this!', 12, 0, 16128, 'Jaina - Battle for Undercity (Alliance)',32972), +(@JAINA, 3, 'VARIAN, NO! STOP!', 14, 0, 16122, 'Jaina - Battle for Undercity (Alliance)',32709), +(@JAINA, 4, 'It did not have to be like this...', 12, 0, 16123, 'Jaina - Battle for Undercity (Alliance)',32711), +(@PUTRESS, 0, 'Do not let them pass, minions!', 14, 0, 16289, 'Putress - Battle for Undercity (Alliance)',32943), +(@PUTRESS, 1, 'KILL THEM! My work must not be interrupted!', 14, 0, 16290, 'Putress - Battle for Undercity (Alliance)',32944), +(@PUTRESS, 2, 'Stare into the abyss and watch as it blackens your souls!', 14, 0, 16294, 'Putress - Battle for Undercity (Alliance)',32949), +(@PUTRESS, 3, 'You are no match for my creations!', 14, 0, 16295, 'Putress - Battle for Undercity (Alliance)',32952), +(@PUTRESS, 4, 'This cannot be happening!', 14, 0, 16296, 'Putress - Battle for Undercity (Alliance)',32953), +(@PUTRESS, 5, 'It will not end like this! I''ve worked too hard! So many years... I... I will consume more energy!', 14, 0, 16291, 'Putress - Battle for Undercity (Alliance)',32948), +(@PUTRESS, 6, 'The power washes through me! I see... EVERTHING!', 14, 0, 16292, 'Putress - Battle for Undercity (Alliance)',32950), +(@PUTRESS, 7, 'MORE SUFFERING AWAITS!', 14, 0, 16293, 'Putress - Battle for Undercity (Alliance)',32951), +(@THRALL, 0, 'WE ARE VICTORIOUS!', 12, 1, 16212, 'Thrall - Battle for Undercity (Alliance)',32643), +(@THRALL, 1, 'The Undercity belongs to the Horde once more! LOK''TAR!', 12, 1, 16214, 'Thrall - Battle for Undercity (Alliance)',32644), +(@THRALL, 2, 'HEROES OF THE HORDE, YOUR WARCHIEF CALLS!', 14, 0, 16187, 'Thrall - Battle for Undercity (Horde)',32339), +(@THRALL, 3, 'Gather behind me at the gates of the Undercity! Soon we march upon our fallen city and reclaim it - FOR THE HORDE!', 14, 0, 16188, 'Thrall - Battle for Undercity (Horde)',32361), +(@THRALL, 4, 'Blood and thunder, champions of the Horde! We fight on this day for our fallen brothers and sisters! Mourn them not for they all died with honor in their hearts!', 14, 0, 16189, 'Thrall - Battle for Undercity (Horde)',32340), +(@THRALL, 5, 'Though we face great conflict, our might combined shall obliterate those who would oppose us! The grave injustices committed against the Horde will be met by an unstoppable force of reckoning!', 14, 0, 16190, 'Thrall - Battle for Undercity (Horde)',32341), +(@THRALL, 6, 'I call to you great spirits! Grant the Horde your blessing! For on this day our cause is righteous and just!', 14, 0, 16191, 'Thrall - Battle for Undercity (Horde)',32342), +(@THRALL, 7, 'Spirits of wind, carry to Saurfang the Younger the song of war! May ALL of our fallen brethren be vindicated by this battle!', 14, 0, 16192, 'Thrall - Battle for Undercity (Horde)',32362), +(@THRALL, 8, 'The battle for the Undercity begins now! Sound the horns of war! Champions of the Horde, be empowered by the might of your Warchief!', 14, 0, 16193, 'Thrall - Battle for Undercity (Horde)',32363), +(@THRALL, 9, 'ONWARD!', 14, 0, 16195, 'Thrall - Battle for Undercity (Horde)',32366), +(@THRALL, 10, 'Great wind brother, clear our path!', 14, 0, 16196, 'Thrall - Battle for Undercity (Horde)',32367), +(@THRALL, 11, 'You must answer to the elements, demon!', 14, 0, 16197, 'Thrall - Battle for Undercity (Horde)',32368), +(@THRALL, 12, 'Great water spirit, wash away this corruption!', 12, 0, 16194, 'Thrall - Battle for Undercity (Horde)',32369), +(@THRALL, 13, 'ATTACK!!!!', 14, 0, 16198, 'Thrall - Battle for Undercity (Horde)',32396), +(@THRALL, 14, 'The courtyard is ours! Onward to the inner sanctum!', 14, 0, 16199, 'Thrall - Battle for Undercity (Horde)',32460), +(@THRALL, 15, 'HOLD! They''ve destroyed the elevator!', 12, 0, 16200, 'Thrall - Battle for Undercity (Horde)',32461), +(@THRALL, 16, 'Great air spirit, hear my call once more!', 12, 0, 16201, 'Thrall - Battle for Undercity (Horde)',32490), +(@THRALL, 17, 'The spirits of air have heard my call. Cyclones will lower us to safety. Now we jump!', 12, 0, 16202, 'Thrall - Battle for Undercity (Horde)',32491), +(@THRALL, 18, 'We have breached the inner sanctum, heroes! We press on!', 14, 0, 16203, 'Thrall - Battle for Undercity (Horde)',32494), +(@THRALL, 19, 'Lead the way, Dark Lady. We will follow.', 12, 0, 16204, 'Thrall - Battle for Undercity (Horde)',32496), +(@THRALL, 20, 'Is that all, demon? Have you nothing left to throw at us?', 14, 0, 16205, 'Thrall - Battle for Undercity (Horde)',32553), +(@THRALL, 21, 'We come for you! Prepare yourself!', 14, 0, 16206, 'Thrall - Battle for Undercity (Horde)',32564), +(@THRALL, 22, 'COWARD! You think to stop the Warchief of the Horde with pebbles? I will show you the true power of the elements!', 14, 0, 16207, 'Thrall - Battle for Undercity (Horde)',32565), +(@THRALL, 23, 'Great spirits of the earth, help us in our hour of need!', 14, 0, 16208, 'Thrall - Battle for Undercity (Horde)',32575), +(@THRALL, 24, 'LET''S GO! QUICKLY!', 14, 0, 16210, 'Thrall - Battle for Undercity (Horde)',32583), +(@THRALL, 25, 'What is this?', 14, 0, 16211, 'Thrall - Battle for Undercity (Horde)',13820), +(@THRALL, 26, 'WE ARE VICTORIOUS!', 14, 0, 16212, 'Thrall - Battle for Undercity (Horde)',32643), +(@THRALL, 27, 'The Undercity belongs to the Horde once more! LOK''TAR!', 14, 0, 16214, 'Thrall - Battle for Undercity (Horde)',32644), +(@THRALL, 28, 'Dark Lady, join me! You have fought hard and spilled much blood for this right. The Royal Quarter belongs to you!', 12, 0, 16215, 'Thrall - Battle for Undercity (Horde)',32646), +(@THRALL, 29, 'We shall, Sylvanas...', 12, 0, 16216, 'Thrall - Battle for Undercity (Horde)',32648), +(@THRALL, 30, 'Alliance horns? Stay on guard!', 12, 0, 16217, 'Thrall - Battle for Undercity (Horde)',32649), +(@THRALL, 31, 'It ends like it began...', 12, 0, 16218, 'Thrall - Battle for Undercity (Horde)',32728), +(@THRALL, 32, 'All that we have fought for in this world is lost. The hopes and dreams carried by my father and mother... by Doomhammer... Gone...', 12, 0, 16219, 'Thrall - Battle for Undercity (Horde)',32729), +(@THRALL, 33, 'If only you were here right now, old friend. You would know what to do.', 12, 0, 16220, 'Thrall - Battle for Undercity (Horde)',32730), +(@THRALL, 34, '%s nods.', 16, 0, 0, 'Thrall - Battle for Undercity (Horde)',3065), +(@THRALL, 35, 'It''s good to have you back, Varok, old friend. I''m sorry about your boy.', 12, 0, 16221, 'Thrall - Battle for Undercity (Horde)',32735), +(@SYLVANAS, 0, '%s begins to dance.', 16, 0, 0, 'Sylvanas - Battle for Undercity (Horde)',1480), +(@SYLVANAS, 1, 'The shaft is trapped, Warchief. A fall would mean certain death.', 12, 0, 16300, 'Sylvanas - Battle for Undercity (Horde)',32462), +(@SYLVANAS, 2, 'What have they done to my beautiful city!', 12, 0, 16301, 'Sylvanas - Battle for Undercity (Horde)',32489), +(@SYLVANAS, 3, 'The only redemption for the traitors responsible for this will be an agonizing death. My vengeance will be swift and without mercy!', 12, 0, 16302, 'Sylvanas - Battle for Undercity (Horde)',32495), +(@SYLVANAS, 4, 'Very well, Warchief. The Royal Quarter is this way. Stay on guard. There''s no telling what Varimathras and Putress have in store for us.', 12, 0, 16303, 'Sylvanas - Battle for Undercity (Horde)',32497), +(@SYLVANAS, 5, 'HOLD! I sense dark magic. Demon magic... Stand ready!', 12, 0, 16304, 'Sylvanas - Battle for Undercity (Horde)',32520), +(@SYLVANAS, 6, 'The Royal Quarter is just up ahead, Warchief.', 12, 0, 16305, 'Sylvanas - Battle for Undercity (Horde)',32567), +(@SYLVANAS, 7, 'Such will be the fate of all enemies of the Horde, Warchief. Now we must deal with the wretch, Putress.', 12, 0, 16306, 'Sylvanas - Battle for Undercity (Horde)',32647), +(@VARIMATHRAS, 0, 'Welcome to my kingdom of darkness!', 14, 0, 16156, 'Varimathras - Battle for Undercity (Horde)',32375), +(@VARIMATHRAS, 1, 'Did you enjoy my minion''s terrible creation? Potent, is it not?', 14, 0, 16157, 'Varimathras - Battle for Undercity (Horde)',32376), +(@VARIMATHRAS, 2, 'But enough prattling! You wish to reclaim your city? Come then, heroes! Your souls will fuel the host! You will have this place back in pieces!', 14, 0, 16158, 'Varimathras - Battle for Undercity (Horde)',32383), +(@VARIMATHRAS, 3, 'Clever girl...', 14, 0, 16159, 'Varimathras - Battle for Undercity (Horde)',32521), +(@VARIMATHRAS, 4, 'My brothers have grown hungry. Your souls will sate their appetites.', 14, 0, 16160, 'Varimathras - Battle for Undercity (Horde)',32524), +(@VARIMATHRAS, 5, 'Bring down the halls! NOW!', 14, 0, 16161, 'Varimathras - Battle for Undercity (Horde)',32568), +(@VARIMATHRAS, 6, 'Welcome to your future -- what little there is left of it...', 14, 0, 16163, 'Varimathras - Battle for Undercity (Horde)',32580), +(@VARIMATHRAS, 7, 'Too long... Tireless, endless planning... It will not end like this...', 14, 0, 16164, 'Varimathras - Battle for Undercity (Horde)',32610), +(@VARIMATHRAS, 8, 'Need more time... The Master is near...', 14, 0, 16165, 'Varimathras - Battle for Undercity (Horde)',32611), +(@VARIMATHRAS, 9, 'Such power! Can you not feel it, mortals? Cease this foolishness and join me!', 14, 0, 16166, 'Varimathras - Battle for Undercity (Horde)',32612), +(@VARIMATHRAS, 10, 'I will not fail! Not again!', 14, 0, 16167, 'Varimathras - Battle for Undercity (Horde)',39424), +(@VARIMATHRAS, 11, 'I cannot hold... Destabilizing...', 14, 0, 16168, 'Varimathras - Battle for Undercity (Horde)',32614), +(@VARIMATHRAS, 12, 'A thousand-thousand pardons, Master! I will deal with these intruders myself!', 14, 0, 16162, 'Varimathras - Battle for Undercity (Horde)',32579), +(@VARIMATHRAS, 13, 'Years... wasted...', 14, 0, 16169, 'Varimathras - Battle for Undercity (Horde)',32617), +(@VOICE, 0, 'YOU HAVE FAILED ME, VARIMATHRAS!', 14, 0, 16180, 'Distant Voice - Battle for Undercity (Horde)',32618), +(@SAURFANG, 0, 'I know what he would do.', 12, 0, 16286, 'High Overlord Saurfang - Battle for Undercity (Horde)',32731), +(@SAURFANG, 1, 'He would say to you: Thrall. Lead your people.', 12, 0, 16287, 'High Overlord Saurfang - Battle for Undercity (Horde)',32732), +(@SAURFANG, 2, 'Let''s go home, old friend.', 12, 0, 16288, 'High Overlord Saurfang - Battle for Undercity (Horde)',32733); + +DELETE FROM `script_waypoint` WHERE entry=@WRYNN; +INSERT INTO `script_waypoint` (entry, pointid, location_x, location_y, location_z, point_comment) VALUES +(@WRYNN, 0, 1769.599976, 764.603027, 56.379799, 'Wrynn - Battle for Undercity - Point 0'), +(@WRYNN, 1, 1737.061401, 734.176514, 48.846516, 'Wrynn - Battle for Undercity - Point 1'), +(@WRYNN, 2, 1682.674927, 724.014771, 76.586487, 'Wrynn - Battle for Undercity - Point 2'), +(@WRYNN, 3, 1668.876953, 726.333923, 79.350388, 'Wrynn - Battle for Undercity - Point 3'), +(@WRYNN, 4, 1659.442505, 728.100220, 80.636276, 'Wrynn - Battle for Undercity - Point 4'), +(@WRYNN, 5, 1650.706177, 730.601318, 80.140228, 'Wrynn - Battle for Undercity - Point 5'), +(@WRYNN, 6, 1640.455078, 731.206543, 78.431183, 'Wrynn - Battle for Undercity - Point 6'), +(@WRYNN, 7, 1630.264893, 729.969604, 76.064507, 'Wrynn - Battle for Undercity - Point 7'), +(@WRYNN, 8, 1623.391113, 727.724854, 73.552124, 'Wrynn - Battle for Undercity - Point 8'), +(@WRYNN, 9, 1614.849243, 725.338257, 69.028702, 'Wrynn - Battle for Undercity - Point 9'), +(@WRYNN, 10, 1609.030518, 721.665405, 67.251274, 'Wrynn - Battle for Undercity - Point 10'), +(@WRYNN, 11, 1602.738281, 717.242432, 64.603981, 'Wrynn - Battle for Undercity - Point 11'), +(@WRYNN, 12, 1599.945068, 710.074402, 61.798687, 'Wrynn - Battle for Undercity - Point 12'), +(@WRYNN, 13, 1596.872314, 700.400757, 57.862572, 'Wrynn - Battle for Undercity - Point 13'), +(@WRYNN, 14, 1594.679688, 691.449402, 54.076141, 'Wrynn - Battle for Undercity - Point 14'), +(@WRYNN, 15, 1593.728149, 682.279663, 51.790394, 'Wrynn - Battle for Undercity - Point 15'), +(@WRYNN, 16, 1595.317505, 674.509521, 49.216564, 'Wrynn - Battle for Undercity - Point 16'), +(@WRYNN, 17, 1598.770386, 666.729309, 45.928894, 'Wrynn - Battle for Undercity - Point 17'), +(@WRYNN, 18, 1604.125122, 659.070557, 52.987282, 'Wrynn - Battle for Undercity - Point 18'), +(@WRYNN, 19, 1611.547852, 652.845032, 37.432785, 'Wrynn - Battle for Undercity - Point 19'), +(@WRYNN, 20, 1618.446655, 649.685547, 36.362904, 'Wrynn - Battle for Undercity - Point 20'), +(@WRYNN, 21, 1627.054077, 648.112671, 33.163338, 'Wrynn - Battle for Undercity - Point 21'), +(@WRYNN, 22, 1635.322021, 647.447998, 29.125357, 'Wrynn - Battle for Undercity - Point 22'), +(@WRYNN, 23, 1643.719238, 647.232239, 25.528500, 'Wrynn - Battle for Undercity - Point 23'), +(@WRYNN, 24, 1652.585449, 647.011597, 23.371178, 'Wrynn - Battle for Undercity - Point 24'), +(@WRYNN, 25, 1661.797974, 646.665466, 19.748022, 'Wrynn - Battle for Undercity - Point 25'), +(@WRYNN, 26, 1669.443848, 643.789185, 16.222963, 'Wrynn - Battle for Undercity - Point 26'), +(@WRYNN, 27, 1678.117676, 640.330322, 11.936049, 'Wrynn - Battle for Undercity - Point 27'), +(@WRYNN, 28, 1683.575317, 635.935852, 10.046909, 'Wrynn - Battle for Undercity - Point 28'), +(@WRYNN, 29, 1686.576904, 629.480652, 8.213016, 'Wrynn - Battle for Undercity - Point 29'), +(@WRYNN, 30, 1690.336060, 622.338562, 4.941149, 'Wrynn - Battle for Undercity - Point 30'), +(@WRYNN, 31, 1694.002075, 615.171814, 3.019691, 'Wrynn - Battle for Undercity - Point 31'), +(@WRYNN, 32, 1694.130249, 610.749695, 2.907817, 'Wrynn - Battle for Undercity - Point 32'), +(@WRYNN, 33, 1693.700684, 603.755859, -0.0658589, 'Wrynn - Battle for Undercity - Point 33'), +(@WRYNN, 34, 1689.332153, 598.286316, -4.565350, 'Wrynn - Battle for Undercity - Point 34'), +(@WRYNN, 35, 1685.521240, 592.829468, -7.215833, 'Wrynn - Battle for Undercity - Point 35'), +(@WRYNN, 36, 1683.787842, 588.381287, -9.208620, 'Wrynn - Battle for Undercity - Point 36'), +(@WRYNN, 37, 1681.923584, 582.116272, -12.279209, 'Wrynn - Battle for Undercity - Point 37'), +(@WRYNN, 38, 1680.744385, 576.785156, -14.403152, 'Wrynn - Battle for Undercity - Point 38'), +(@WRYNN, 39, 1663.923828, 567.914734, -16.738506, 'Wrynn - Battle for Undercity - Point 39'), +(@WRYNN, 40, 1665.390015, 543.867737, -11.672810, 'Wrynn - Battle for Undercity - Point 40'), +(@WRYNN, 41, 1664.583374, 478.784821, -11.890515, 'Wrynn - Battle for Undercity - Point 41'), +(@WRYNN, 42, 1629.231689, 479.139526, -22.868773, 'Wrynn - Battle for Undercity - Point 42'), +(@WRYNN, 43, 1628.975586, 437.496094, -34.263428, 'Wrynn - Battle for Undercity - Point 43'), +(@WRYNN, 44, 1596.610352, 438.078033, -46.335011, 'Wrynn - Battle for Undercity - Point 44'), +(@WRYNN, 45, 1598.358521, 422.436493, -46.385242, 'Wrynn - Battle for Undercity - Point 45'), /*jaina text 2*/ +(@WRYNN, 46, 1590.335083, 420.340851, -45.410774, 'Wrynn - Battle for Undercity - Point 46'), /*varian text 11,12,13 - putress text 1*/ +(@WRYNN, 47, 1564.603638, 422.171417, -62.178089, 'Wrynn - Battle for Undercity - Point 47'), +(@WRYNN, 48, 1551.077881, 414.807404, -61.620495, 'Wrynn - Battle for Undercity - Point 48'), +(@WRYNN, 49, 1513.628052, 405.122131, -62.200069, 'Wrynn - Battle for Undercity - Point 49'), /*guardian spawn*/ +(@WRYNN, 50, 1501.178345, 411.828796, -61.185028, 'Wrynn - Battle for Undercity - Point 50'), /*dreadlords kammer spawm - varian text 14*/ +(@WRYNN, 51, 1494.877441, 420.079041, -62.185028, 'Wrynn - Battle for Undercity - Point 51'), +(@WRYNN, 52, 1504.596924, 427.219635, -64.004326, 'Wrynn - Battle for Undercity - Point 52'), +(@WRYNN, 53, 1507.520386, 436.379578, -65.228706, 'Wrynn - Battle for Undercity - Point 53'), +(@WRYNN, 54, 1502.412598, 444.093079, -63.657303, 'Wrynn - Battle for Undercity - Point 54'), +(@WRYNN, 55, 1492.878906, 449.624390, -61.303787, 'Wrynn - Battle for Undercity - Point 55'), +(@WRYNN, 56, 1481.203491, 448.626282, -61.926937, 'Wrynn - Battle for Undercity - Point 56'), +(@WRYNN, 57, 1470.947510, 441.626587, -64.884033, 'Wrynn - Battle for Undercity - Point 57'), +(@WRYNN, 58, 1459.560913, 439.790375, -65.719994, 'Wrynn - Battle for Undercity - Point 58'), +(@WRYNN, 59, 1453.266724, 445.335358, -65.725746, 'Wrynn - Battle for Undercity - Point 59'), +(@WRYNN, 60, 1437.707886, 461.207367, -70.461746, 'Wrynn - Battle for Undercity - Point 60'), +(@WRYNN, 61, 1431.330811, 455.469543, -70.235573, 'Wrynn - Battle for Undercity - Point 61'), +(@WRYNN, 62, 1418.527588, 442.289429, -77.236946, 'Wrynn - Battle for Undercity - Point 62'), +(@WRYNN, 63, 1419.539307, 437.509705, -77.238396, 'Wrynn - Battle for Undercity - Point 63'), /*varian pause 5 sek - varian text 15*/ +(@WRYNN, 64, 1433.060913, 425.915497, -84.968437, 'Wrynn - Battle for Undercity - Point 64'), +(@WRYNN, 65, 1431.568481, 413.905151, -85.247482, 'Wrynn - Battle for Undercity - Point 65'), /*varian text 16 - putress text 3 - putress fight*/ +(@WRYNN, 66, 1418.656860, 415.891388, -84.964584, 'Wrynn - Battle for Undercity - Point 66'), /*varian text 17,18,19*/ +(@WRYNN, 67, 1410.952026, 402.416718, -84.964584, 'Wrynn - Battle for Undercity - Point 67'), +(@WRYNN, 68, 1399.726563, 412.947327, -77.533615, 'Wrynn - Battle for Undercity - Point 68'), +(@WRYNN, 69, 1392.010620, 417.122741, -77.238647, 'Wrynn - Battle for Undercity - Point 69'), +(@WRYNN, 70, 1373.964722, 400.569214, -73.440285, 'Wrynn - Battle for Undercity - Point 70'), +(@WRYNN, 71, 1369.379150, 393.808319, -72.218079, 'Wrynn - Battle for Undercity - Point 71'), +(@WRYNN, 72, 1365.540161, 381.257690, -69.920845, 'Wrynn - Battle for Undercity - Point 72'), +(@WRYNN, 73, 1370.115479, 369.879608, -70.396088, 'Wrynn - Battle for Undercity - Point 73'), +(@WRYNN, 74, 1380.718506, 366.849944, -65.725105, 'Wrynn - Battle for Undercity - Point 74'), +(@WRYNN, 75, 1419.407593, 355.772522, -66.002243, 'Wrynn - Battle for Undercity - Point 75'), +(@WRYNN, 76, 1427.617798, 350.418640, -64.184349, 'Wrynn - Battle for Undercity - Point 76'), +(@WRYNN, 77, 1449.683838, 344.867645, -62.260105, 'Wrynn - Battle for Undercity - Point 77'), +(@WRYNN, 78, 1471.418701, 364.907532, -62.187069, 'Wrynn - Battle for Undercity - Point 78'), +(@WRYNN, 79, 1468.382813, 369.370148, -59.438568, 'Wrynn - Battle for Undercity - Point 79'), +(@WRYNN, 80, 1438.317871, 402.571381, -57.817539, 'Wrynn - Battle for Undercity - Point 80'), +(@WRYNN, 81, 1410.944824, 429.138214, -54.993443, 'Wrynn - Battle for Undercity - Point 81'), +(@WRYNN, 82, 1378.896240, 438.826721, -52.780880, 'Wrynn - Battle for Undercity - Point 82'), +(@WRYNN, 83, 1361.706055, 437.253357, -54.116314, 'Wrynn - Battle for Undercity - Point 83'), +(@WRYNN, 84, 1341.773682, 430.280029, -56.126289, 'Wrynn - Battle for Undercity - Point 84'), +(@WRYNN, 85, 1329.199707, 420.427979, -58.596973, 'Wrynn - Battle for Undercity - Point 85'), +(@WRYNN, 86, 1316.311157, 405.356354, -61.681793, 'Wrynn - Battle for Undercity - Point 86'), +(@WRYNN, 87, 1310.210815, 386.160828, -65.063904, 'Wrynn - Battle for Undercity - Point 87'), +(@WRYNN, 88, 1302.375732, 360.250671, -67.294189, 'Wrynn - Battle for Undercity - Point 88'); + +DELETE FROM `creature` WHERE id IN (@WRYNN, @JAINA, @BROLL, @VALEERA, @SWSOLDIER, @ALLIANCETANK, @ALLIANCEPLANE) AND phasemask=128; +DELETE FROM `creature` WHERE id IN (@THRALL, @SYLVANAS, @VOLJIN, @DEMOLISHER, @WSGUARD) AND phasemask=64; +INSERT INTO `creature` (guid, id, map, spawnMask, phaseMask, position_x, position_y, position_z, orientation) VALUES +(@CGUID+1, @WRYNN, 0, 1, 128, 1769.597290, 764.603149, 56.379799, 3.538394), +(@CGUID+2, @JAINA, 0, 1, 128, 1771.324097, 760.024414, 55.704029, 2.949347), +(@CGUID+3, @BROLL, 0, 1, 128, 1766.193848, 768.037537, 56.619080, 3.858048), +(@CGUID+4, @VALEERA, 0, 1, 128, 1762.391235, 769.963318, 56.734879, 4.454149), +(@CGUID+5, @SWSOLDIER, 0, 1, 128, 1716.395142, 709.999634, 57.807465, 2.394830), +(@CGUID+6, @SWSOLDIER, 0, 1, 128, 1719.503662, 718.229919, 55.423946, 2.551910), +(@CGUID+7, @SWSOLDIER, 0, 1, 128, 1728.385986, 736.765991, 51.161797, 3.301965), +(@CGUID+8, @SWSOLDIER, 0, 1, 128, 1727.833984, 730.510620, 50.914570, 2.697203), +(@CGUID+9, @SWSOLDIER, 0, 1, 128, 1719.004395, 753.495544, 60.956600, 4.102753), +(@CGUID+10, @SWSOLDIER, 0, 1, 128, 1724.285600, 746.973328, 55.311218, 3.301972), +(@CGUID+11, @ALLIANCETANK, 0, 1, 128, 1745.139038, 724.722717, 47.574627, 2.760039), +(@CGUID+12, @ALLIANCETANK, 0, 1, 128, 1728.556152, 703.220215, 52.028885, 1.868613), +(@CGUID+13, @ALLIANCEPLANE, 0, 1, 128, 1737.992431, 714.137634, 67.690857, 2.795380), +(@CGUID+14, @ALLIANCEPLANE, 0, 1, 128, 1724.187389, 759.409973, 77.101479, 4.146400), +(@CGUID+15, @ALLIANCEPLANE, 0, 1, 128, 1730.264893, 741.177795, 74.171043, 3.946126), +(@CGUID+22, @THRALL, 0, 1, 64, 1945.722415, 234.059845, 43.810997, 3.155253), +(@CGUID+23, @SYLVANAS, 0, 1, 64, 1945.256714, 240.222763, 43.904449, 2.899998), +(@CGUID+24, @VOLJIN, 0, 1, 64, 1945.106445, 245.354813, 44.025818, 3.390873), +(@CGUID+25, @DEMOLISHER, 0, 1, 64, 1946.061523, 253.797592, 44.167881, 3.238506), +(@CGUID+26, @DEMOLISHER, 0, 1, 64, 1941.016968, 219.872681, 45.765697, 3.053928), +(@CGUID+27, @DEMOLISHER, 0, 1, 64, 1914.027710, 255.944031, 52.913757, 3.372014), +(@CGUID+28, @DEMOLISHER, 0, 1, 64, 1912.139648, 267.574860, 53.414268, 3.395576), +(@CGUID+29, @WSGUARD, 0, 1, 64, 1906.703613, 225.307816, 53.251461, 2.865430), +(@CGUID+30, @WSGUARD, 0, 1, 64, 1906.729736, 230.326752, 53.106655, 2.916481), +(@CGUID+31, @WSGUARD, 0, 1, 64, 1903.130005, 243.202081, 53.967991, 3.301327), +(@CGUID+32, @WSGUARD, 0, 1, 64, 1903.377075, 247.629807, 54.400906, 3.430917); + +DELETE FROM `gameobject` WHERE id=@PORTAL AND map=0; +INSERT INTO `gameobject` (guid, id, map, spawnMask, phaseMask, position_x, position_y, position_z, orientation) VALUES +(@GGUID+0, @PORTAL, 0, 1, 128, 1775.205688, 763.229919, 55.140560, 3.033357); + +UPDATE `creature` SET modelid=25341 WHERE id=@ALLIANCETANK; +UPDATE `creature_template` SET `speed_run`=0.8 WHERE `entry`=32401; + +DELETE FROM `spell_area` WHERE spell=@SPELLPHASE128 AND AREA IN(85, 1497) AND quest_start=@QUEST; +DELETE FROM `spell_area` WHERE spell=@SPELLPHASE64 AND AREA IN(85, 1497) AND quest_start=@QUEST_H; +INSERT INTO `spell_area` (spell, AREA, quest_start, autocast, quest_start_status) VALUES +(@SPELLPHASE128, 85, @QUEST, 1, 10), /*Tirisfal*/ +(@SPELLPHASE128, 1497, @QUEST, 1, 10), /*Undercity*/ +(@SPELLPHASE64, 85, @QUEST_H, 1, 10), +(@SPELLPHASE64, 1497, @QUEST_H, 1, 10); + +DELETE FROM `waypoint_data` WHERE id IN(@SWSOLDIER*10, ((@SWSOLDIER*10)+1), ((@SWSOLDIER*10)+2), ((@SWSOLDIER*10)+3), @DREADLORD*10, @JAINA*10, (@JAINA*10)+1); +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES +(@SWSOLDIER*10, 1, 1687.26, 598.36, -5.22, 0, 0, 1, 0, 100, 0), +(@SWSOLDIER*10, 2, 1673.14, 579.10, -13.93, 0, 0, 1, 0, 100, 0), +(@SWSOLDIER*10, 3, 1661.91, 541.10, -11.69, 0.04, 0, 1, 0, 100, 0), +((@SWSOLDIER*10)+1, 1, 1687.26, 598.36, -5.22, 0, 0, 1, 0, 100, 0), +((@SWSOLDIER*10)+1, 2, 1673.14, 579.10, -13.93, 0, 0, 1, 0, 100, 0), +((@SWSOLDIER*10)+1, 3, 1665.15, 540.85, -11.67, 0, 0, 1, 0, 100, 0), +((@SWSOLDIER*10)+1, 4, 1666.42, 475.71, -11.89, 1.92, 0, 1, 0, 100, 0), +((@SWSOLDIER*10)+2, 1, 1687.26, 598.36, -5.22, 0, 0, 1, 0, 100, 0), +((@SWSOLDIER*10)+2, 2, 1683.50, 574.24, -13.97, 0, 0, 1, 0, 100, 0), +((@SWSOLDIER*10)+2, 3, 1686.05, 554.10, -16.99, 2.86, 0, 1, 0, 100, 0), +((@SWSOLDIER*10)+3, 1, 1687.26, 598.36, -5.22, 0, 0, 1, 0, 100, 0), +((@SWSOLDIER*10)+3, 2, 1683.50, 574.24, -13.97, 0, 0, 1, 0, 100, 0), +((@SWSOLDIER*10)+3, 3, 1676.22, 543.33, -16.08, 1.61, 0, 1, 0, 100, 0), +(@DREADLORD*10, 1, 1451.28, 446.47, -66.10, 0, 0, 1, 0, 100, 0), +(@DREADLORD*10, 2, 1458.57, 440.21, -65.73, 0, 0, 1, 0, 100, 0), +(@DREADLORD*10, 3, 1468.53, 441.33, -64.91, 0, 0, 1, 0, 100, 0), +(@DREADLORD*10, 4, 1479.02, 447.63, -62.22, 0, 0, 1, 0, 100, 0), +(@DREADLORD*10, 5, 1491.44, 450.06, -61.20, 0, 0, 1, 0, 100, 0), +(@DREADLORD*10, 6, 1503.07, 442.98, -63.80, 0, 0, 1, 0, 100, 0), +(@DREADLORD*10, 7, 1507.74, 435.07, -64.23, 0, 0, 1, 0, 100, 0), +(@DREADLORD*10, 8, 1504.99, 427.69, -64.00, 0, 0, 1, 0, 100, 0), +(@DREADLORD*10, 9, 1495.37, 421.71, -62.18, 0, 0, 1, 0, 100, 0), +(@JAINA*10, 1, 1733.68, 736.60, 49.67, 0, 0, 1, 0, 100, 0), +(@JAINA*10, 2, 1684.00, 732.47, 76.46, 0, 0, 1, 0, 100, 0), +((@JAINA*10)+1, 1, 1666.05, 733.04, 79.92, 0, 0, 1, 0, 100, 0), +((@JAINA*10)+1, 2, 1650.68, 734.12, 80.62, 0, 0, 1, 0, 100, 0), +((@JAINA*10)+1, 3, 1630.44, 735.70, 75.98, 0, 0, 1, 0, 100, 0), +((@JAINA*10)+1, 4, 1616.05, 730.20, 69.88, 0, 0, 1, 0, 100, 0), +((@JAINA*10)+1, 5, 1600.15, 717.58, 63.86, 0, 0, 1, 0, 100, 0), +((@JAINA*10)+1, 6, 1590.42, 691.69, 54.16, 0, 0, 1, 0, 100, 0), +((@JAINA*10)+1, 7, 1587.20, 676.61, 50.55, 0, 0, 1, 0, 100, 0), +((@JAINA*10)+1, 8, 1596.85, 661.04, 42.98, 0, 0, 1, 0, 100, 0), +((@JAINA*10)+1, 9, 1607.72, 646.74, 37.24, 0, 0, 1, 0, 100, 0), +((@JAINA*10)+1, 10, 1618.62, 643.26, 36.51, 0, 0, 1, 0, 100, 0), +((@JAINA*10)+1, 11, 1637.74, 643.18, 28.24, 0, 0, 1, 0, 100, 0), +((@JAINA*10)+1, 12, 1666.07, 642.12, 17.06, 0, 0, 1, 0, 100, 0), +((@JAINA*10)+1, 13, 1679.35, 631.27, 10.92, 0, 0, 1, 0, 100, 0), +((@JAINA*10)+1, 14, 1687.66, 613.39, 2.97, 0, 0, 1, 0, 100, 0), +((@JAINA*10)+1, 15, 1684.68, 603.19, -2.52, 0, 0, 1, 0, 100, 0), +((@JAINA*10)+1, 16, 1675.13, 580.00, -13.72, 0, 0, 1, 0, 100, 0); + +-- Battle for the Undercity - Start +DELETE FROM `disables` WHERE `sourceType`=1 AND `entry`=13267; +SET @QUEST := 13266; +SET @QUEST2 := 13267; +SET @SPELLPHASE64 := 59062; +SET @SPELLPHASE128 := 60815; +DELETE FROM `spell_area` WHERE spell=@SPELLPHASE64 AND AREA IN(85, 1497) AND quest_start IN (@QUEST, @QUEST2); +INSERT INTO `spell_area` (`spell`, `area`, `quest_start`, `quest_end`, `aura_spell`, `racemask`, `gender`, `autocast`, `quest_start_status`, `quest_end_status`) VALUES +(@SPELLPHASE64, 85, @QUEST, @QUEST2, 0, 0, 2, 1, 74, 11), /*Tirisfal*/ +(@SPELLPHASE64, 1497, @QUEST, @QUEST2, 0, 0, 2, 1, 74, 11); /*Undercity*/ + +-- Vol'jin SAI +SET @ENTRY := 31649; +UPDATE `creature_template` SET `AIName`="SmartAI", `ScriptName`="" 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,19,0,100,0,13267,0,0,0,75,59062,0,0,0,0,0,7,0,0,0,0,0,0,0,"Vol'jin - On Quest 'The Battle For The Undercity' Taken - Add Aura 'WGH Phase'"); + +-- +-- Battle for the Undercity - Horde - Mainevent +SET @CGUID := 3109796; +SET @OGUID := 2134393; +-- Templateadjustements +UPDATE `creature_template` SET `minlevel`=80, `maxlevel`=80 WHERE `entry` IN (31739, 31652,32315); +UPDATE `creature_template` SET `minlevel`=80, `maxlevel`=80, `faction`=14, `flags_extra`=130, `unit_flags`=256 WHERE `entry` IN (31576, 31577,31811); +UPDATE `creature_template` SET `InhabitType`=4 WHERE `entry` IN (31811, 32200, 32159, 31814, 32277); +UPDATE `creature_template` SET `minlevel`=80, `maxlevel`=80, `faction`=35, `flags_extra`=2, `unit_flags`=256 WHERE `entry` IN (31688); +UPDATE `creature_template` SET `speed_walk`=0.8, `speed_run`=1 WHERE `entry`=31782; +-- attackable creatures +-- boss +UPDATE `creature_template` SET `minlevel`=80, `maxlevel`=80, `faction`=14, `flags_extra`=0 WHERE `entry` IN (31565, 31844, 32511, 32271); +-- 74 -76 +UPDATE `creature_template` SET `minlevel`=74, `maxlevel`=76, `faction`=14, `flags_extra`=0 WHERE `entry` IN (32270, 32269, 31528, 31526, 31532, 31516, 31482, 32393, 32391, 31529, 31528, 32159); +-- special unitflags +UPDATE `creature_template` SET `unit_flags`=0 WHERE `entry` IN (32393, 32391, 31529, 31528, 32159, 31528, 32511, 32269, 32270); +-- creature_addons + +-- guards +DELETE FROM `creature_addon` WHERE `guid` IN (3109792,3109793,3109794,3109795,3109787); +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES +(3109792,0,0,0,1,27, ''), +(3109793,0,0,0,1,27, ''), +(3109794,0,0,0,1,27, ''), +(3109795,0,0,0,1,27, ''), +-- voljin mount +(3109787,0,14339,0,1,0, ''); + +DELETE FROM `creature_template_addon` WHERE `entry`=31576; +INSERT INTO `creature_template_addon` (`entry`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES +(31576,0,0,0,1,0, '59236'); + +-- SAIs +-- Horde Demolisher SAI +SET @ENTRY := 31652; +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,1,0,100,0,2000,5000,4000,7000,11,62306,2,0,0,0,0,19,15384,200,0,0,0,0,0,"Horde Demolisher - Out of Combat - Cast 'Hurl Boulder'"); + +-- Whirlwind SAI +SET @ENTRY := 31782; +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,1,0,100,0,10,10,10,10,45,5,5,0,0,0,0,19,31576,9,0,0,0,0,0,"Vortex - Out of Combat - Set Data 5 5"); + +-- Invisible Stalker [Wrath Gate Horde CE 01] (UC) SAI +SET @ENTRY := 31576; +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,38,0,100,0,5,5,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Invisible Stalker [Wrath Gate Horde CE 01] (UC) - On Data Set 5 5 - Despawn Instant"); + +-- Blight Slinger SAI +SET @ENTRY := 31526; +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,5,54,0,100,0,0,0,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Blight Slinger - On Just Summoned - Disable Combat Movement"), +(@ENTRY,0,1,0,1,0,100,0,2000,5000,12000,15000,11,48211,0,0,0,0,0,19,31577,100,0,0,0,0,0,"Blight Slinger - Out of Combat - Cast 'Blight Bomb'"), +(@ENTRY,0,2,0,1,0,50,0,60000,60000,5000,15000,11,57606,0,0,0,0,0,21,200,0,0,0,0,0,0,"Blight Slinger - Out of Combat - Cast 'Plague Barrel'"), +(@ENTRY,0,3,0,0,0,50,0,60000,60000,5000,15000,11,57606,0,0,0,0,0,21,200,0,0,0,0,0,0,"Blight Slinger - In Combat - Cast 'Plague Barrel'"), +(@ENTRY,0,4,0,0,0,100,0,2000,5000,12000,15000,11,48211,0,0,0,0,0,19,31577,100,0,0,0,0,0,"Blight Slinger - In Combat - Cast 'Blight Bomb'"), +(@ENTRY,0,5,0,61,0,100,0,0,0,0,0,18,514,0,0,0,0,0,1,0,0,0,0,0,0,0,"Blight Slinger - On Just Summoned - Set Flags Not Attackable & Immune To NPC's"); + +-- Tidal Wave SAI +SET @ENTRY := 31765; +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,1,54,0,100,0,0,0,0,0,11,59635,2,0,0,0,0,1,0,0,0,0,0,0,0,"Tidal Wave - On Just Summoned - Cast 'Tidal Wave'"), +(@ENTRY,0,1,2,61,0,100,0,0,0,0,0,69,0,0,0,0,0,0,8,0,0,0,1735.787,238.951,62.796,6.225,"Tidal Wave - On Just Summoned - Move To Position"), +(@ENTRY,0,2,0,61,0,100,0,0,0,0,0,41,20000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Tidal Wave - On Just Summoned - Despawn In 20000 ms"), +(@ENTRY,0,3,0,1,0,100,0,10,10,10,10,45,5,5,0,0,0,0,9,31576,0,200,0,0,0,0,"Tidal Wave - Out of Combat - Set Data 5 5"); + +-- Blight Aberration SAI +SET @ENTRY := 31844; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,54,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Blight Aberration - On Just Summoned - Say Line 0"), +(@ENTRY,0,1,0,1,0,100,0,4000,4000,4000,4000,49,0,0,0,0,0,0,19,32518,200,0,0,0,0,0,"Blight Aberration - Out of Combat - Start Attacking"), +(@ENTRY,0,2,0,0,0,100,0,4000,4000,4000,4000,49,0,0,0,0,0,0,19,32518,200,0,0,0,0,0,"Blight Aberration - In Combat - Start Attacking"); + +-- Treacherous Guardian SAI +SET @ENTRY := 31532; +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,4,0,10,0,0,0,0,0,11,59395,0,0,0,0,0,2,0,0,0,0,0,0,0,"Treacherous Guardian - On Aggro - Cast 'Abomination Hook'"), +(@ENTRY,0,1,0,1,0,100,0,2000,2000,2000,2000,49,0,0,0,0,0,0,19,32518,200,0,0,0,0,0,"Treacherous Guardian - Out of Combat - Start Attacking"); + +-- Blight Doctor SAI +SET @ENTRY := 31516; +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,1,0,100,0,2000,2000,2000,2000,49,0,0,0,0,0,0,19,32518,200,0,0,0,0,0,"Blight Doctor - Out of Combat - Start Attacking"); + +-- Apothecary Chemist SAI +SET @ENTRY := 31482; +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,1,0,100,0,2000,2000,2000,2000,49,0,0,0,0,0,0,19,32518,200,0,0,0,0,0,"Apothecary Chemist - Out of Combat - Start Attacking"); + +-- Skeleton SAI +SET @ENTRY := 6412; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,54,0,100,0,0,0,0,0,41,15000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Skeleton - On Just Summoned - Despawn In 15000 ms"); + +-- Grand Apothecary Putress SAI +SET @ENTRY := 31530; +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,0,0,100,0,5000,10000,8000,12000,11,59460,0,0,0,0,0,21,100,0,0,0,0,0,0,"Grand Apothecary Putress - In Combat - Cast 'Throw Blight Barrel'"); + +-- Felguard Marauder SAI +SET @ENTRY := 32393; +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,60,0,100,0,2000,2000,2000,2000,49,0,0,0,0,0,0,19,32518,200,0,0,0,0,0,"Felguard Marauder - On Update - Start Attacking"); + +-- Perfidious Dreadlord SAI +SET @ENTRY := 32391; +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,60,0,100,0,2000,2000,2000,2000,49,0,0,0,0,0,0,19,32518,200,0,0,0,0,0,"Perfidious Dreadlord - On Update - Start Attacking"); + +-- Ravishing Betrayer SAI +SET @ENTRY := 31529; +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,60,0,100,0,2000,2000,2000,2000,49,0,0,0,0,0,0,19,32518,200,0,0,0,0,0,"Ravishing Betrayer - On Update - Start Attacking"); + +-- Doomguard Pillager SAI +SET @ENTRY := 32159; +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,1,54,0,100,0,0,0,0,0,8,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Doomguard Pillager - On Just Summoned - Set Reactstate Passive"), +(@ENTRY,0,1,0,61,0,100,0,0,0,0,0,53,1,@ENTRY*100+00,0,0,0,0,1,0,0,0,0,0,0,0,"Doomguard Pillager - On Just Summoned - Start Waypoint"), +(@ENTRY,0,2,3,40,0,100,0,6,@ENTRY*100+00,0,0,101,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Doomguard Pillager - On Waypoint 6 Reached - Set Home Position"), +(@ENTRY,0,3,4,61,0,100,0,6,@ENTRY*100+00,0,0,8,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Doomguard Pillager - On Waypoint 6 Reached - Set Reactstate Aggressive"), +(@ENTRY,0,4,0,61,0,100,0,6,@ENTRY*100+00,0,0,49,0,0,0,0,0,0,19,32518,200,0,0,0,0,0,"Doomguard Pillager - On Waypoint 6 Reached - Start Attacking"); + +-- Khanok the Impassable SAI +SET @ENTRY := 32511; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,54,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Khanok the Impassable - On Just Summoned - Say Line 0"), +(@ENTRY,0,1,0,60,0,100,0,2000,2000,2000,2000,49,0,0,0,0,0,0,19,32518,200,0,0,0,0,0,"Khanok the Impassable - On Update - Start Attacking"), +(@ENTRY,0,2,0,0,0,100,0,3000,5000,15000,18000,11,69633,0,0,0,0,0,21,200,0,0,0,0,0,0,"Khanok the Impassable - In Combat - Cast 'Veil of Shadow'"); + +-- Legion Overlord SAI +SET @ENTRY := 32271; +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,60,0,100,0,2000,2000,2000,2000,49,0,0,0,0,0,0,19,32518,200,0,0,0,0,0,"Legion Overlord - On Update - Start Attacking"); + +-- Legion Invader SAI +SET @ENTRY := 32269; +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,60,0,100,0,2000,2000,2000,2000,49,0,0,0,0,0,0,19,32518,200,0,0,0,0,0,"Legion Invader - On Update - Start Attacking"); + +-- Legion Dreadwhisperer SAI +SET @ENTRY := 32270; +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,60,0,100,0,2000,2000,2000,2000,49,0,0,0,0,0,0,19,32518,200,0,0,0,0,0,"Legion Dreadwhisperer - On Update - Start Attacking"); + +-- Varimathras SAI +SET @ENTRY := 31565; +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,5,6,0,100,0,0,0,0,0,1,13,0,0,0,0,0,1,0,0,0,0,0,0,0,"Varimathras - On Just Died - Say Line 13"), +(@ENTRY,0,1,0,0,0,100,0,5000,10000,20000,20000,75,59434,0,0,0,0,0,21,200,0,0,0,0,0,0,"Varimathras - In Combat - Add Aura 'Carrion Swarm'"), +(@ENTRY,0,2,0,0,0,100,0,4000,8000,18000,25000,11,17238,0,0,0,0,0,2,0,0,0,0,0,0,0,"Varimathras - In Combat - Cast 'Drain Life'"), +(@ENTRY,0,3,0,4,0,100,1,0,10,0,0,75,59424,0,0,0,0,0,1,0,0,0,0,0,0,0,"Varimathras - On Aggro - Add Aura 'Might of Varimathras' (No Repeat)"), +(@ENTRY,0,4,0,0,0,100,0,4000,8000,4000,8000,11,20741,0,0,0,0,0,5,0,0,0,0,0,0,0,"Varimathras - In Combat - Cast 'Shadow Bolt Volley'"), +(@ENTRY,0,5,0,61,0,100,0,0,0,0,0,12,32277,3,20000,0,0,0,8,0,0,0,1290.169,318.852,-27.933,3.861,"Varimathras - On Just Died - Summon Creature 'A Distant Voice'"); + +-- A Distant Voice SAI +SET @ENTRY := 32277; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,54,0,100,0,0,0,0,0,1,5,0,0,0,0,0,1,0,0,0,0,0,0,0,"A Distant Voice - On Just Summoned - Say Line 5"); + +-- conditions +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceGroup`=1 AND `SourceEntry`=59449; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 1, 59449, 0, 0, 31, 0, 3, 31530, 0, 0, 0, 0, '', 'SPELL_BLIGHT_EMPOWERMENT only targets NPC_PUTRESS'); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceGroup`=1 AND `SourceEntry`=60224; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 1, 60224, 0, 0, 31, 0, 3, 31811, 0, 0, 0, 0, '', 'Open Portals only targets Portals'); + +-- creaturespawns +DELETE FROM `creature` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+88; +DELETE FROM `creature` WHERE `id` IN (31576, 31577); +INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `VerifiedBuild`) VALUES +-- bomb bunny +(@CGUID, 15384, 0, 0, 0, 1, 64, 0, 0, 1874.08, 237.364, 93.4084, 6.07287, 300, 0, 0, 4121, 0, 0, 0, 0, 0, 0), +-- plaguebunny +(@CGUID+1, 31576, 0, 0, 0, 1, 64, 0, 0, 1878.9, 233.153, 59.7344, 3.03575, 480, 0, 0, 42, 0, 0, 0, 33554432, 0, 0), +(@CGUID+2, 31576, 0, 0, 0, 1, 64, 0, 0, 1871.73, 238.699, 62.2751, 2.6509, 480, 0, 0, 42, 0, 0, 0, 33554432, 0, 0), +(@CGUID+3, 31576, 0, 0, 0, 1, 64, 0, 0, 1863.21, 234.608, 62.2751, 3.49363, 480, 0, 0, 42, 0, 0, 0, 33554432, 0, 0), +(@CGUID+4, 31576, 0, 0, 0, 1, 64, 0, 0, 1854.89, 229.172, 62.2751, 1.80895, 480, 0, 0, 42, 0, 0, 0, 33554432, 0, 0), +(@CGUID+5, 31576, 0, 0, 0, 1, 64, 0, 0, 1855.02, 236.031, 62.2751, 1.55134, 480, 0, 0, 42, 0, 0, 0, 33554432, 0, 0), +(@CGUID+6, 31576, 0, 0, 0, 1, 64, 0, 0, 1855.15, 242.756, 62.2753, 1.55134, 480, 0, 0, 42, 0, 0, 0, 33554432, 0, 0), +(@CGUID+7, 31576, 0, 0, 0, 1, 64, 0, 0, 1858.23, 248.415, 62.2758, 5.42729, 480, 0, 0, 42, 0, 0, 0, 33554432, 0, 0), +(@CGUID+8, 31576, 0, 0, 0, 1, 64, 0, 0, 1862.38, 246.289, 62.2752, 1.30394, 480, 0, 0, 42, 0, 0, 0, 33554432, 0, 0), +(@CGUID+9, 31576, 0, 0, 0, 1, 64, 0, 0, 1865.23, 238.806, 62.2752, 2.81191, 480, 0, 0, 42, 0, 0, 0, 33554432, 0, 0), +(@CGUID+10, 31576, 0, 0, 0, 1, 64, 0, 0, 1877.96, 240.234, 59.9565, 0.438431, 480, 0, 0, 42, 0, 0, 0, 33554432, 0, 0), +(@CGUID+11, 31576, 0, 0, 0, 1, 64, 0, 0, 1859.32, 227.461, 62.2753, 3.59809, 480, 0, 0, 42, 0, 0, 0, 33554432, 0, 0), +(@CGUID+12, 31576, 0, 0, 0, 1, 64, 0, 0, 1841.62, 240.558, 62.2522, 2.5056, 480, 0, 0, 42, 0, 0, 0, 33554432, 0, 0), +(@CGUID+13, 31576, 0, 0, 0, 1, 64, 0, 0, 1842.92, 237.159, 62.2752, 2.03122, 480, 0, 0, 42, 0, 0, 0, 33554432, 0, 0), +(@CGUID+14, 31576, 0, 0, 0, 1, 64, 0, 0, 1849.7, 238.891, 62.2752, 0.249935, 480, 0, 0, 42, 0, 0, 0, 33554432, 0, 0), +(@CGUID+15, 31576, 0, 0, 0, 1, 64, 0, 0, 1823.08, 222.426, 60.317, 4.39368, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+16, 31576, 0, 0, 0, 1, 64, 0, 0, 1812.59, 225.765, 59.7123, 3.26664, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+17, 31576, 0, 0, 0, 1, 64, 0, 0, 1798.05, 221.197, 61.3544, 3.66483, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+18, 31576, 0, 0, 0, 1, 64, 0, 0, 1790.04, 216.575, 59.9411, 3.66483, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+19, 31576, 0, 0, 0, 1, 64, 0, 0, 1783.97, 213.077, 59.7476, 3.66483, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+20, 31576, 0, 0, 0, 1, 64, 0, 0, 1778.68, 217.262, 59.718, 1.50656, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+21, 31576, 0, 0, 0, 1, 64, 0, 0, 1783.82, 222.802, 59.5176, 0.363804, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+22, 31576, 0, 0, 0, 1, 64, 0, 0, 1788.33, 227.829, 59.5589, 1.97544, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+23, 31576, 0, 0, 0, 1, 64, 0, 0, 1784.93, 231.663, 59.7863, 3.07343, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+24, 31576, 0, 0, 0, 1, 64, 0, 0, 1777.94, 232.14, 60.1759, 3.07343, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+25, 31576, 0, 0, 0, 1, 64, 0, 0, 1773.18, 231.968, 60.3793, 3.3114, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+26, 31576, 0, 0, 0, 1, 64, 0, 0, 1763.73, 237.786, 60.9243, 3.07579, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+27, 31576, 0, 0, 0, 1, 64, 0, 0, 1756.74, 238.246, 61.223, 3.07579, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+28, 31576, 0, 0, 0, 1, 64, 0, 0, 1746.56, 232.499, 61.8146, 4.09837, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+29, 31576, 0, 0, 0, 1, 64, 0, 0, 1746.06, 231.327, 62.1128, 4.52956, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+30, 31576, 0, 0, 0, 1, 64, 0, 0, 1744.3, 225.265, 62.0763, 3.86275, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+31, 31576, 0, 0, 0, 1, 64, 0, 0, 1741.67, 222.954, 62.044, 3.86275, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+32, 31576, 0, 0, 0, 1, 64, 0, 0, 1737.98, 219.714, 61.9661, 3.86275, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+33, 31576, 0, 0, 0, 1, 64, 0, 0, 1737.98, 219.714, 61.9661, 3.86275, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+34, 31576, 0, 0, 0, 1, 64, 0, 0, 1734.71, 219.279, 62.0795, 2.68466, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+35, 31576, 0, 0, 0, 1, 64, 0, 0, 1733.06, 222.136, 62.4888, 1.50656, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+36, 31576, 0, 0, 0, 1, 64, 0, 0, 1740.24, 230.244, 62.3222, 1.39817, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+37, 31576, 0, 0, 0, 1, 64, 0, 0, 1740.93, 234.846, 62.439, 1.67149, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+38, 31576, 0, 0, 0, 1, 64, 0, 0, 1741.74, 244.187, 62.1851, 1.23795, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+39, 31576, 0, 0, 0, 1, 64, 0, 0, 1744.03, 250.8, 62.0583, 1.23795, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+40, 31576, 0, 0, 0, 1, 64, 0, 0, 1742.58, 257.486, 61.9118, 3.0051, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+41, 31576, 0, 0, 0, 1, 64, 0, 0, 1738.42, 258.057, 61.978, 3.0051, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+42, 31576, 0, 0, 0, 1, 64, 0, 0, 1738.42, 258.057, 61.978, 3.0051, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+43, 31576, 0, 0, 0, 1, 64, 0, 0, 1734.44, 262.346, 62.1117, 2.14038, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+44, 31576, 0, 0, 0, 1, 64, 0, 0, 1768.98, 239.185, 60.8268, 0.0584733, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+45, 31576, 0, 0, 0, 1, 64, 0, 0, 1776.19, 241.782, 60.6032, 1.35674, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+46, 31576, 0, 0, 0, 1, 64, 0, 0, 1777, 248.167, 60.1396, 1.98348, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+47, 31576, 0, 0, 0, 1, 64, 0, 0, 1775.32, 253.42, 59.7834, 1.35674, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+48, 31576, 0, 0, 0, 1, 64, 0, 0, 1776.81, 260.261, 59.5558, 1.35674, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+49, 31576, 0, 0, 0, 1, 64, 0, 0, 1778.68, 265.538, 59.8382, 0.649878, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+50, 31576, 0, 0, 0, 1, 64, 0, 0, 1783.05, 268.377, 59.6135, 0.138584, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+51, 31576, 0, 0, 0, 1, 64, 0, 0, 1789.48, 267.423, 59.6221, 5.24367, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+52, 31576, 0, 0, 0, 1, 64, 0, 0, 1789.67, 262.224, 59.6186, 4.02081, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+53, 31576, 0, 0, 0, 1, 64, 0, 0, 1786.62, 258.541, 59.5238, 4.02081, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+54, 31576, 0, 0, 0, 1, 64, 0, 0, 1786.49, 251.731, 59.4535, 4.60986, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+55, 31576, 0, 0, 0, 1, 64, 0, 0, 1785.77, 244.768, 59.8426, 4.60986, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+56, 31576, 0, 0, 0, 1, 64, 0, 0, 1785.35, 240.702, 60.4073, 4.60986, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+57, 31576, 0, 0, 0, 1, 64, 0, 0, 1794.47, 246.206, 60.3204, 1.53974, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+58, 31576, 0, 0, 0, 1, 64, 0, 0, 1797.73, 254.984, 59.8279, 0.832876, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+59, 31576, 0, 0, 0, 1, 64, 0, 0, 1810.96, 257.323, 59.9768, 6.25369, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+60, 31576, 0, 0, 0, 1, 64, 0, 0, 1816.65, 258.938, 60.0562, 1.12976, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+61, 31576, 0, 0, 0, 1, 64, 0, 0, 1819.64, 265.263, 59.9507, 1.12976, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+62, 31576, 0, 0, 0, 1, 64, 0, 0, 1823.2, 269.927, 60.2139, 0.187279, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+63, 31576, 0, 0, 0, 1, 64, 0, 0, 1829.72, 270.662, 59.9834, 5.85314, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+64, 31576, 0, 0, 0, 1, 64, 0, 0, 1834.98, 264.464, 59.9598, 4.12369, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+65, 31576, 0, 0, 0, 1, 64, 0, 0, 1831.66, 259.237, 59.6257, 4.44178, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+66, 31576, 0, 0, 0, 1, 64, 0, 0, 1829.79, 252.492, 59.7142, 4.44178, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+67, 31576, 0, 0, 0, 1, 64, 0, 0, 1828.86, 249.119, 59.9189, 4.44178, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+68, 31576, 0, 0, 0, 1, 64, 0, 0, 1827.86, 241.552, 60.3116, 4.71746, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+69, 31576, 0, 0, 0, 1, 64, 0, 0, 1827.9, 234.552, 60.5472, 4.71746, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+70, 31576, 0, 0, 0, 1, 64, 0, 0, 1828.01, 229.652, 60.2061, 4.95307, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+71, 31576, 0, 0, 0, 1, 64, 0, 0, 1829.67, 222.854, 60.6297, 4.95307, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+72, 31576, 0, 0, 0, 1, 64, 0, 0, 1831.22, 215.795, 60.3681, 4.59965, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+73, 31576, 0, 0, 0, 1, 64, 0, 0, 1829.98, 210.553, 60.2592, 3.92813, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+74, 31576, 0, 0, 0, 1, 64, 0, 0, 1826.98, 208.253, 60.0893, 3.34144, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+75, 31576, 0, 0, 0, 1, 64, 0, 0, 1823.55, 207.558, 59.9448, 3.34144, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+76, 31576, 0, 0, 0, 1, 64, 0, 0, 1808.84, 204.643, 60.3994, 3.13645, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+77, 31576, 0, 0, 0, 1, 64, 0, 0, 1819.93, 212.898, 61.466, 0.748837, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+78, 31576, 0, 0, 0, 1, 64, 0, 0, 1814.87, 219.419, 59.6503, 3.10582, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+79, 31576, 0, 0, 0, 1, 64, 0, 0, 1818.59, 232.166, 59.8028, 0.46845, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+80, 31576, 0, 0, 0, 1, 64, 0, 0, 1819.01, 243.888, 60.0049, 1.70153, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+81, 31576, 0, 0, 0, 1, 64, 0, 0, 1821.36, 253.183, 60.02, 0.874501, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+82, 31576, 0, 0, 0, 1, 64, 0, 0, 1823.6, 255.991, 59.9793, 1.11012, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+83, 31576, 0, 0, 0, 1, 64, 0, 0, 1825.97, 261.886, 59.8165, 1.69681, 300, 0, 0, 5342, 0, 0, 0, 33554688, 0, 0), +(@CGUID+84, 31577, 0, 0, 0, 1, 64, 0, 0, 1806.04, 222.459, 60.302, 4.59494, 300, 0, 0, 42, 0, 0, 0, 33554432, 0, 0), +(@CGUID+85, 31577, 0, 0, 0, 1, 64, 0, 0, 1785.33, 224.625, 59.3333, 3.46711, 300, 0, 0, 42, 0, 0, 0, 33554432, 0, 0), +(@CGUID+86, 31577, 0, 0, 0, 1, 64, 0, 0, 1783.18, 255.054, 59.5311, 1.57352, 300, 0, 0, 42, 0, 0, 0, 33554432, 0, 0), +(@CGUID+87, 31577, 0, 0, 0, 1, 64, 0, 0, 1824.48, 255.662, 59.9497, 0.0419888, 300, 0, 0, 42, 0, 0, 0, 33554432, 0, 0), +(@CGUID+88, 31577, 0, 0, 0, 1, 64, 0, 0, 1827.12, 223.765, 60.4512, 4.76066, 300, 0, 0, 42, 0, 0, 0, 33554432, 0, 0); + +-- movement for plaguebunnies +UPDATE `creature` SET `spawndist`=3,`MovementType`=1, `spawntimesecs`=900 WHERE `id` IN (31576); +UPDATE `creature` SET `spawndist`=3,`MovementType`=1, `spawntimesecs`=15 WHERE `id` IN (31577); +-- gameobjectspawns +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+90; +DELETE FROM `gameobject` WHERE `id` IN (193427, 193411, 194935); +INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `VerifiedBuild`) VALUES +(@OGUID+0, 193427, 0, 0, 0, 1, 64, 1960.43, 235.696, 40.3143, 3.18104, 0, 0, 0.999806, -0.0197224, 300, 0, 1, 0), +(@OGUID+1, 193411, 0, 0, 0, 1, 64, 1878.28, 232.168, 84.6498, 3.23287, 0, 0, 0.998959, -0.045624, 300, 0, 1, 0), +(@OGUID+2, 193411, 0, 0, 0, 1, 64, 1874.24, 246.454, 82.7732, 3.14255, 0, 0, 1, -0.000479384, 300, 0, 1, 0), +(@OGUID+3, 193411, 0, 0, 0, 1, 64, 1874.09, 229.207, 75.3687, 3.18968, 0, 0, 0.999711, -0.0240432, 300, 0, 1, 0), +(@OGUID+4, 193411, 0, 0, 0, 1, 64, 1874.23, 245.847, 67.2015, 3.20146, 0, 0, 0.999552, -0.0299315, 300, 0, 1, 0), +(@OGUID+5, 193411, 0, 0, 0, 1, 64, 1874.28, 237.972, 93.9793, 3.42138, 0, 0, 0.990231, -0.139436, 300, 0, 1, 0), +(@OGUID+6, 193411, 0, 0, 0, 1, 64, 1876.28, 230.714, 100.723, 3.03889, 0, 0, 0.998682, 0.0513306, 300, 0, 1, 0), +(@OGUID+7, 193411, 0, 0, 0, 1, 64, 1873.18, 235.87, 101.615, 1.45238, 0, 0, 0.664025, 0.74771, 300, 0, 1, 0), +(@OGUID+8, 193411, 0, 0, 0, 1, 64, 1874.23, 245.683, 89.8034, 2.88573, 0, 0, 0.991828, 0.127582, 300, 0, 1, 0), +(@OGUID+9, 193411, 0, 0, 0, 1, 64, 1874.23, 245.683, 89.8034, 2.88573, 0, 0, 0.991828, 0.127582, 300, 0, 1, 0), +(@OGUID+10, 193411, 0, 0, 0, 1, 64, 1874.58, 226.272, 60.8, 3.19597, 0, 0, 0.99963, -0.0271832, 300, 0, 1, 0), +(@OGUID+11, 193427, 0, 0, 0, 1, 64, 1946.1, 276.333, 40.703, 3.65542, 0, 0, 0.967178, -0.254099, 300, 0, 1, 0), +(@OGUID+12, 194935, 0, 0, 0, 1, 64, 1624.92, 257.038, 62.594, 5.46731, 0, 0, 0.396718, -0.917941, 300, 0, 1, 0), +(@OGUID+13, 194935, 0, 0, 0, 1, 64, 1595.75, 253.342, 60.1496, 4.72117, 0, 0, 0.703994, -0.710205, 300, 0, 1, 0), +(@OGUID+14, 194935, 0, 0, 0, 1, 64, 1595.74, 227.646, 60.1496, 1.5678, 0, 0, 0.706046, 0.708166, 300, 0, 1, 0), +(@OGUID+15, 194935, 0, 0, 0, 1, 64, 1609.64, 248.736, 60.1426, 3.83446, 0, 0, 0.94059, -0.339545, 300, 0, 1, 0), +(@OGUID+16 , 193411, 0, 0, 0, 1, 64, 1453.42, 335.493, -62.5174, 4.05461, 0, 0, 0.897596, -0.440818, 300, 0, 1, 0), +(@OGUID+17 , 193411, 0, 0, 0, 1, 64, 1456.89, 364.333, -59.4405, 1.5649, 0, 0, 0.705019, 0.709188, 300, 0, 1, 0), +(@OGUID+18 , 193411, 0, 0, 0, 1, 64, 1481.88, 388.683, -62.1856, 2.13824, 0, 0, 0.876778, 0.480895, 300, 0, 1, 0), +(@OGUID+19 , 193411, 0, 0, 0, 1, 64, 1511.52, 401.505, -61.2111, 5.1581, 0, 0, 0.533339, -0.845902, 300, 0, 1, 0), +(@OGUID+20 , 193411, 0, 0, 0, 1, 64, 1506.84, 346.802, -60.0886, 2.75871, 0, 0, 0.981731, 0.190274, 300, 0, 1, 0), +(@OGUID+21 , 193411, 0, 0, 0, 1, 64, 1477.54, 307.085, -61.5058, 2.61734, 0, 0, 0.965841, 0.259135, 300, 0, 1, 0), +(@OGUID+22 , 193411, 0, 0, 0, 1, 64, 1543.57, 355.802, -62.1968, 3.74439, 0, 0, 0.954922, -0.296855, 300, 0, 1, 0), +(@OGUID+23 , 193411, 0, 0, 0, 1, 64, 1540.32, 353.585, -56.6931, 1.53742, 0, 0, 0.695208, 0.718809, 300, 0, 1, 0), +(@OGUID+24 , 193411, 0, 0, 0, 1, 64, 1601.04, 378.756, -62.1777, 0.991561, 0, 0, 0.475718, 0.879598, 300, 0, 1, 0), +(@OGUID+25 , 193411, 0, 0, 0, 1, 64, 1603.98, 379.611, -62.1777, 1.46673, 0, 0, 0.669372, 0.742927, 300, 0, 1, 0), +(@OGUID+26 , 193411, 0, 0, 0, 1, 64, 1604.17, 383.102, -57.9169, 0.539957, 0, 0, 0.266711, 0.963777, 300, 0, 1, 0), +(@OGUID+27 , 193411, 0, 0, 0, 1, 64, 1568.78, 412.155, -61.1779, 5.20444, 0, 0, 0.513598, -0.858031, 300, 0, 1, 0), +(@OGUID+28 , 193411, 0, 0, 0, 1, 64, 1602.7, 353.503, -53.858, 5.8249, 0, 0, 0.227142, -0.973862, 300, 0, 1, 0), +(@OGUID+29 , 193411, 0, 0, 0, 1, 64, 1590.49, 330.835, -52.9793, 3.46086, 0, 0, 0.987286, -0.158956, 300, 0, 1, 0), +(@OGUID+30 , 193411, 0, 0, 0, 1, 64, 1590.81, 292.303, -62.1775, 4.28945, 0, 0, 0.839774, -0.542937, 300, 0, 1, 0), +(@OGUID+31 , 193411, 0, 0, 0, 1, 64, 1602.23, 294.641, -62.1775, 4.529, 0, 0, 0.768884, -0.639388, 300, 0, 1, 0), +(@OGUID+32 , 193411, 0, 0, 0, 1, 64, 1602.23, 294.641, -62.1775, 4.529, 0, 0, 0.768884, -0.639388, 300, 0, 1, 0), +(@OGUID+33 , 193411, 0, 0, 0, 1, 64, 1607.56, 290.896, -56.8781, 4.54471, 0, 0, 0.763837, -0.64541, 300, 0, 1, 0), +(@OGUID+34 , 193411, 0, 0, 0, 1, 64, 1614.51, 298.322, -56.8781, 0.853339, 0, 0, 0.413841, 0.910349, 300, 0, 1, 0), +(@OGUID+35 , 193411, 0, 0, 0, 1, 64, 1660.16, 285.825, -62.1776, 0.625572, 0, 0, 0.307711, 0.95148, 300, 0, 1, 0), +(@OGUID+36 , 193411, 0, 0, 0, 1, 64, 1531.4, 285.285, -60.7004, 3.17812, 0, 0, 0.999833, -0.0182612, 300, 0, 1, 0), +(@OGUID+37 , 193411, 0, 0, 0, 1, 64, 1528.29, 281.747, -57.7498, 5.65605, 0, 0, 0.308456, -0.951239, 300, 0, 1, 0), +(@OGUID+38 , 193411, 0, 0, 0, 1, 64, 1537.88, 259.074, -55.5924, 2.54587, 0, 0, 0.955967, 0.293475, 300, 0, 1, 0), +(@OGUID+39 , 193411, 0, 0, 0, 1, 64, 1544.71, 253.619, -56.8771, 5.65998, 0, 0, 0.306586, -0.951843, 300, 0, 1, 0), +(@OGUID+40 , 193411, 0, 0, 0, 1, 64, 1584.04, 299.732, -54.4093, 4.33658, 0, 0, 0.826748, -0.562573, 300, 0, 1, 0), +(@OGUID+41 , 193411, 0, 0, 0, 1, 64, 1582.81, 291.267, -55.0051, 4.5722, 0, 0, 0.754895, -0.655846, 300, 0, 1, 0), +(@OGUID+42 , 193411, 0, 0, 0, 1, 64, 1541.92, 291.825, -62.1813, 2.23957, 0, 0, 0.900006, 0.435878, 300, 0, 1, 0), +(@OGUID+43 , 193411, 0, 0, 0, 1, 64, 1604.12, 278.389, -55.3429, 0.499907, 0, 0, 0.247359, 0.968924, 300, 0, 1, 0), +(@OGUID+44 , 193411, 0, 0, 0, 1, 64, 1592.44, 239.817, -52.1429, 2.90715, 0, 0, 0.993138, 0.116952, 300, 0, 1, 0), +(@OGUID+45 , 193411, 0, 0, 0, 1, 64, 1594.89, 243.881, -50.6695, 0.562737, 0, 0, 0.277671, 0.960676, 300, 0, 1, 0), +(@OGUID+46 , 193411, 0, 0, 0, 1, 64, 1602.41, 239.384, -50.6731, 2.96999, 0, 0, 0.996321, 0.0856981, 300, 0, 1, 0), +(@OGUID+47 , 193411, 0, 0, 0, 1, 64, 1595.21, 234.96, -51.1047, 1.56412, 0, 0, 0.704744, 0.709462, 300, 0, 1, 0), +(@OGUID+48 , 193411, 0, 0, 0, 1, 64, 1586.99, 247.438, -45.8725, 0.16219, 0, 0, 0.0810061, 0.996714, 300, 0, 1, 0), +(@OGUID+49 , 193411, 0, 0, 0, 1, 64, 1586.15, 232.445, -45.4211, 5.65212, 0, 0, 0.310322, -0.950632, 300, 0, 1, 0), +(@OGUID+50 , 193411, 0, 0, 0, 1, 64, 1569.47, 233.672, -43.9897, 4.67823, 0, 0, 0.71908, -0.694927, 300, 0, 1, 0), +(@OGUID+51 , 193411, 0, 0, 0, 1, 64, 1553.55, 261.757, -40.9026, 2.51839, 0, 0, 0.951843, 0.306585, 300, 0, 1, 0), +(@OGUID+52 , 193411, 0, 0, 0, 1, 64, 1578.84, 273.595, -43.1027, 0.719825, 0, 0, 0.352192, 0.935928, 300, 0, 1, 0), +(@OGUID+53 , 193411, 0, 0, 0, 1, 64, 1595.94, 280.278, -43.1027, 0.433154, 0, 0, 0.214888, 0.976639, 300, 0, 1, 0), +(@OGUID+54 , 193411, 0, 0, 0, 1, 64, 1615.92, 279.471, -43.1027, 0.904388, 0, 0, 0.43694, 0.899491, 300, 0, 1, 0), +(@OGUID+55 , 193411, 0, 0, 0, 1, 64, 1567.56, 208.686, -43.1022, 5.05914, 0, 0, 0.574523, -0.818488, 300, 0, 1, 0), +(@OGUID+56 , 193411, 0, 0, 0, 1, 64, 1599.55, 201.64, -43.1022, 6.06052, 0, 0, 0.111102, -0.993809, 300, 0, 1, 0), +(@OGUID+57 , 193411, 0, 0, 0, 1, 64, 1622.07, 208.441, -43.1022, 0.405655, 0, 0, 0.20144, 0.979501, 300, 0, 1, 0), +(@OGUID+58 , 193411, 0, 0, 0, 1, 64, 1629.86, 220.241, -43.1022, 1.16356, 0, 0, 0.549514, 0.835485, 300, 0, 1, 0), +(@OGUID+59 , 193411, 0, 0, 0, 1, 64, 1634.62, 243.272, -43.1022, 1.41489, 0, 0, 0.649895, 0.760024, 300, 0, 1, 0), +(@OGUID+60 , 193411, 0, 0, 0, 1, 64, 1629.99, 261.306, -43.1022, 1.94111, 0, 0, 0.825199, 0.564842, 300, 0, 1, 0), +(@OGUID+61 , 193411, 0, 0, 0, 1, 64, 1589.92, 240.086, -27.6796, 0.456706, 0, 0, 0.226374, 0.974041, 300, 0, 1, 0), +(@OGUID+62 , 193411, 0, 0, 0, 1, 64, 1587.86, 237.634, -36.8898, 0.362458, 0, 0, 0.180238, 0.983623, 300, 0, 1, 0), +(@OGUID+63 , 193411, 0, 0, 0, 1, 64, 1587.47, 277.012, -55.343, 2.29061, 0, 0, 0.910836, 0.412768, 300, 0, 1, 0), +(@OGUID+64 , 193411, 0, 0, 0, 1, 64, 1548.18, 242.907, -41.3605, 0.433146, 0, 0, 0.214884, 0.97664, 300, 0, 1, 0), +(@OGUID+65 , 193411, 0, 0, 0, 1, 64, 1544.82, 244.546, -41.3605, 6.14613, 0, 0, 0.068473, -0.997653, 300, 0, 1, 0), +(@OGUID+66 , 193411, 0, 0, 0, 1, 64, 1540.88, 244.103, -41.3605, 0.923235, 0, 0, 0.445397, 0.895333, 300, 0, 1, 0), +(@OGUID+67 , 193411, 0, 0, 0, 1, 64, 1538.84, 239.788, -41.3605, 1.98352, 0, 0, 0.836991, 0.547217, 300, 0, 1, 0), +(@OGUID+68 , 193411, 0, 0, 0, 1, 64, 1542.63, 235.411, -41.3605, 3.04617, 0, 0, 0.998862, 0.0476949, 300, 0, 1, 0), +(@OGUID+69 , 193411, 0, 0, 0, 1, 64, 1547.68, 237.42, -41.3605, 4.18185, 0, 0, 0.867755, -0.496993, 300, 0, 1, 0), +(@OGUID+70 , 193411, 0, 0, 0, 1, 64, 1805.84, 296.901, 70.398, 1.58611, 0, 0, 0.712501, 0.701671, 300, 0, 1, 0), +(@OGUID+71 , 193411, 0, 0, 0, 1, 64, 1761.15, 276.338, 74.0143, 5.78013, 0, 0, 0.248882, -0.968534, 300, 0, 1, 0), +(@OGUID+72 , 193411, 0, 0, 0, 1, 64, 1775.15, 274.509, 71.9973, 1.4251, 0, 0, 0.653765, 0.756697, 300, 0, 1, 0), +(@OGUID+73 , 193411, 0, 0, 0, 1, 64, 1787.44, 275.035, 74.4691, 0.148827, 0, 0, 0.0743447, 0.997233, 300, 0, 1, 0), +(@OGUID+74 , 193411, 0, 0, 0, 1, 64, 1836.57, 274.92, 73.3538, 6.01182, 0, 0, 0.135266, -0.990809, 300, 0, 1, 0), +(@OGUID+75 , 193411, 0, 0, 0, 1, 64, 1839.66, 265.901, 73.3537, 3.40431, 0, 0, 0.991385, -0.130979, 300, 0, 1, 0), +(@OGUID+76 , 193411, 0, 0, 0, 1, 64, 1765.9, 223.609, 64.2024, 1.52328, 0, 0, 0.690108, 0.723707, 300, 0, 1, 0), +(@OGUID+77 , 193411, 0, 0, 0, 1, 64, 1763.4, 232.135, 66.073, 2.14767, 0, 0, 0.879035, 0.476757, 300, 0, 1, 0), +(@OGUID+78 , 193411, 0, 0, 0, 1, 64, 1763.15, 244.945, 65.5851, 0.812492, 0, 0, 0.395164, 0.918611, 300, 0, 1, 0), +(@OGUID+79 , 193411, 0, 0, 0, 1, 64, 1807.3, 238.017, 62.7538, 1.41725, 0, 0, 0.65079, 0.759257, 300, 0, 1, 0), +(@OGUID+80 , 193411, 0, 0, 0, 1, 64, 1835.5, 201.512, 73.3537, 3.04303, 0, 0, 0.998786, 0.0492627, 300, 0, 1, 0), +(@OGUID+81 , 193411, 0, 0, 0, 1, 64, 1822.18, 201.616, 73.3546, 2.52466, 0, 0, 0.952801, 0.303596, 300, 0, 1, 0), +(@OGUID+82 , 193411, 0, 0, 0, 1, 64, 1774.42, 202.03, 73.3536, 3.11371, 0, 0, 0.999903, 0.013939, 300, 0, 1, 0), +(@OGUID+83 , 193411, 0, 0, 0, 1, 64, 1760.38, 201.995, 73.3546, 3.2433, 0, 0, 0.998707, -0.050834, 300, 0, 1, 0), +(@OGUID+84 , 193411, 0, 0, 0, 1, 64, 1747.98, 189.804, 73.3024, 3.95016, 0, 0, 0.919384, -0.393362, 300, 0, 1, 0), +(@OGUID+85 , 193411, 0, 0, 0, 1, 64, 1747.06, 176.08, 73.3033, 5.39529, 0, 0, 0.429507, -0.903063, 300, 0, 1, 0), +(@OGUID+86 , 193411, 0, 0, 0, 1, 64, 1807.86, 178.109, 70.3984, 4.79838, 0, 0, 0.676061, -0.736846, 300, 0, 1, 0), +(@OGUID+87 , 193411, 0, 0, 0, 1, 64, 1803.19, 178.182, 70.3984, 4.67664, 0, 0, 0.719631, -0.694356, 300, 0, 1, 0), +(@OGUID+88 , 193411, 0, 0, 0, 1, 64, 1843.8, 235.629, 102.325, 0.553304, 0, 0, 0.273136, 0.961975, 300, 0, 1, 0), +(@OGUID+89 , 193411, 0, 0, 0, 1, 64, 1841.7, 234.17, 100.13, 1.05596, 0, 0, 0.503789, 0.863827, 300, 0, 1, 0), +(@OGUID+90 , 193411, 0, 0, 0, 1, 64, 1877.61, 252.04, 65.048, 2.79169, 0, 0, 0.984735, 0.17406, 300, 0, 1, 0); + +-- go flags +UPDATE `gameobject_template_addon` SET `flags`=4 WHERE `entry`=194935; + +-- scriptassignments +UPDATE `creature_template` SET `ScriptName`='npc_lady_sylvanas_windrunner_bfu' WHERE `entry`=32365; +UPDATE `creature_template` SET `ScriptName`='npc_thrall_bfu' WHERE `entry`=32518; + +-- npcflags +UPDATE `creature_template` SET `npcflag` = 2 WHERE `entry` = 32518; + +-- questflags +UPDATE `quest_template_addon` SET `SpecialFlags`=2 WHERE `Id`=13267; + +-- spelltargetposition +DELETE FROM `spell_target_position` WHERE `id` IN (56347, 60699); +INSERT INTO `spell_target_position` (`ID`, `EffectIndex`, `MapID`, `PositionX`, `PositionY`, `PositionZ`, `Orientation`, `VerifiedBuild`) VALUES +(56347, 0, 0, 1289.48, 314.33, -57.32, 01.03, 0), +(60699, 0, 1, 1179.797, -4148.077, 51.916, 0.434, 0); + +-- waypoints thrall +DELETE FROM `script_waypoint` WHERE `entry`=32518; +INSERT INTO `script_waypoint` (`entry`, `pointid`, `location_x`, `location_y`, `location_z`, `waittime`, `point_comment`) VALUES +(32518, 1, 1944.73, 234.148, 44.0474, 3000, 'Thrall Bfu'), +(32518, 2, 1888.247, 236.373, 57.508, 0, 'Thrall Bfu'), +(32518, 3, 1877.9, 237.556, 59.9718, 0, 'Thrall Bfu'), +(32518, 4, 1874.54, 237.608, 62.2752, 0, 'Thrall Bfu'), +(32518, 5, 1874.54, 237.608, 62.2752, 0, 'Thrall Bfu'), +(32518, 6, 1863.62, 237.778, 62.2752, 0, 'Thrall Bfu'), +(32518, 7, 1862.67, 246.532, 62.2752, 0, 'Thrall Bfu'), +(32518, 8, 1860.18, 248.416, 62.2752, 0, 'Thrall Bfu'), +(32518, 9, 1854.9, 247.92, 62.2752, 0, 'Thrall Bfu'), +(32518, 10, 1853.17, 239.223, 62.2752, 0, 'Thrall Bfu'), +(32518, 11, 1844.23, 238.472, 62.2752, 0, 'Thrall Bfu'), +(32518, 12, 1817.080, 249.271, 59.974, 0, 'Thrall Bfu'), +(32518, 13, 1793.462, 238.152, 60.585, 0, 'Thrall Bfu'), +(32518, 14, 1767.57, 239.055, 60.8451, 0, 'Thrall Bfu'), +(32518, 15, 1743.4, 239.431, 62.1031, 0, 'Thrall Bfu'), +(32518, 16, 1740.37, 222.003, 62.0531, 0, 'Thrall Bfu'), +(32518, 17, 1720.72, 220.516, 64.2658, 0, 'Thrall Bfu'), +(32518, 18, 1719.71, 226.973, 64.2641, 0, 'Thrall Bfu'), +(32518, 19, 1717.66, 234.643, 62.5978, 0, 'Thrall Bfu'), +(32518, 20, 1706.27, 239.379, 62.5978, 0, 'Thrall Bfu'), +(32518, 21, 1685.27, 239.077, 62.5964, 0, 'Thrall Bfu'), +(32518, 22, 1666.84, 239.806, 62.5964, 0, 'Thrall Bfu'), +(32518, 23, 1641.9, 239.951, 62.592, 0, 'Thrall Bfu'), +(32518, 24, 1620.67, 218.871, 62.5944, 0, 'Thrall Bfu'), +(32518, 25, 1617.78, 221.925, 62.5944, 0, 'Thrall Bfu'), +(32518, 26, 1611.24, 228.911, 60.1416, 0, 'Thrall Bfu'), +(32518, 27, 1608.78, 231.429, 60.1416, 0, 'Thrall Bfu'), +(32518, 28, 1604.46, 234.916, 60.1492, 0, 'Thrall Bfu'), +(32518, 29, 1595.82, 235.367, 60.1492, 0, 'Thrall Bfu'), +(32518, 30, 1586.86, 240.629, 60.1492, 0, 'Thrall Bfu'), +(32518, 31, 1578.68, 240.715, 60.1492, 0, 'Thrall Bfu'), +(32518, 32, 1575.42, 240.69, 60.1492, 0, 'Thrall Bfu'), +(32518, 33, 1563.03, 240.533, 55.2408, 0, 'Thrall Bfu'), +(32518, 34, 1558.878, 240.572, 55.240, 0, 'Thrall Bfu'), +-- after jump +(32518, 35, 1533.33, 240.758, -41.3781, 0, 'Thrall Bfu'), +(32518, 36, 1524.34, 240.821, -41.3899, 0, 'Thrall Bfu'), +(32518, 37, 1525.55, 235.061, -41.3899, 0, 'Thrall Bfu'), +(32518, 38, 1526.56, 228.133, -42.0445, 0, 'Thrall Bfu'), +(32518, 39, 1528.63, 218.123, -43.0565, 0, 'Thrall Bfu'), +(32518, 40, 1530.71, 213.419, -43.0565, 0, 'Thrall Bfu'), +(32518, 41, 1538.71, 216.271, -43.0565, 0, 'Thrall Bfu'), +(32518, 42, 1547.72, 220.016, -43.0764, 0, 'Thrall Bfu'), +(32518, 43, 1556.59, 224.959, -43.1031, 0, 'Thrall Bfu'), +(32518, 44, 1558.63, 229.165, -43.1031, 0, 'Thrall Bfu'), +(32518, 45, 1558.56, 241.733, -43.1031, 0, 'Thrall Bfu'), +(32518, 46, 1560.21, 240.862, -43.1031, 0, 'Thrall Bfu'), +-- stairs up - till stairs down left +(32518, 47, 1569.45, 240.298, -44.7601, 0, 'Thrall Bfu'), +(32518, 48, 1586.3, 240.669, -52.1491, 0, 'Thrall Bfu'), +(32518, 49, 1587.33, 248.973, -52.1506, 0, 'Thrall Bfu'), +(32518, 50, 1595.64, 248.381, -52.151, 0, 'Thrall Bfu'), +(32518, 51, 1596.16, 260.392, -57.1616, 0, 'Thrall Bfu'), +(32518, 52, 1585.79, 257.402, -62.1597, 0, 'Thrall Bfu'), +(32518, 53, 1585.79, 257.402, -62.1597, 0, 'Thrall Bfu'), +(32518, 54, 1581.01, 255.52, -61.9069, 0, 'Thrall Bfu'), +(32518, 55, 1573.75, 262.775, -59.0779, 0, 'Thrall Bfu'), +(32518, 56, 1565.8, 270.507, -60.7023, 0, 'Thrall Bfu'), +(32518, 57, 1553.21, 283.393, -60.7715, 0, 'Thrall Bfu'), +-- stair down left - till stair down right +(32518, 58, 1545.87, 289.971, -62.1821, 0, 'Thrall Bfu'), +(32518, 59, 1572.38, 305.229, -62.1792, 0, 'Thrall Bfu'), +(32518, 60, 1596.81, 308.933, -62.1791, 0, 'Thrall Bfu'), +(32518, 61, 1596.4, 321.779, -62.1791, 0, 'Thrall Bfu'), +-- stair down right - till Khanok Point +(32518, 62, 1596.47, 346.992, -62.1791, 0, 'Thrall Bfu'), +(32518, 63, 1596.93, 368.347, -62.1791, 0, 'Thrall Bfu'), +(32518, 64, 1589.06, 376.615, -62.1791, 0, 'Thrall Bfu'), +(32518, 65, 1589.17, 382.068, -62.1791, 0, 'Thrall Bfu'), +-- won Khanok announce point +(32518, 66, 1570.40, 374.489, -62.177, 0, 'Thrall Bfu'), +-- announcepoint - till front of chamber +(32518, 67, 1560.69, 372.194, -61.62, 0, 'Thrall Bfu'), +(32518, 68, 1546.51, 369.277, -62.1819, 0, 'Thrall Bfu'), +(32518, 69, 1537.62, 367.669, -62.1807, 0, 'Thrall Bfu'), +(32518, 70, 1530.31, 363.665, -57.1518, 0, 'Thrall Bfu'), +(32518, 71, 1527.01, 361.818, -57.1518, 0, 'Thrall Bfu'), +(32518, 72, 1523.22, 368.423, -54.6721, 0, 'Thrall Bfu'), +(32518, 73, 1518.85, 374.974, -51.0651, 0, 'Thrall Bfu'), +(32518, 74, 1514.82, 382.375, -52.2415, 0, 'Thrall Bfu'), +(32518, 75, 1510.26, 390.622, -56.9403, 0, 'Thrall Bfu'), +(32518, 76, 1509.06, 393.642, -57.1529, 0, 'Thrall Bfu'), +(32518, 77, 1505.32, 391.25, -57.1529, 0, 'Thrall Bfu'), +(32518, 78, 1498.05, 386.996, -62.2593, 0, 'Thrall Bfu'), +(32518, 79, 1487.15, 380.27, -62.1865, 0, 'Thrall Bfu'), +(32518, 80, 1472.91, 364.5, -62.1865, 0, 'Thrall Bfu'), +(32518, 81, 1468.84, 369.123, -59.4315, 0, 'Thrall Bfu'), +-- front of chamber till front of valimathras +(32518, 82, 1463.32, 375.153, -59.4508, 0, 'Thrall Bfu'), +(32518, 83, 1458.59, 380.315, -59.4218, 0, 'Thrall Bfu'), +(32518, 84, 1437.06, 403.65, -57.8186, 0, 'Thrall Bfu'), +(32518, 85, 1427.42, 413.787, -56.9018, 0, 'Thrall Bfu'), +(32518, 86, 1411.39, 428.74, -54.993, 0, 'Thrall Bfu'), +(32518, 87, 1403.69, 433.122, -54.7038, 0, 'Thrall Bfu'), +(32518, 88, 1381.07, 438.253, -52.7791, 0, 'Thrall Bfu'), +(32518, 89, 1360.36, 436.695, -54.3051, 0, 'Thrall Bfu'), +(32518, 90, 1343.09, 430.21, -56.1262, 0, 'Thrall Bfu'), +(32518, 100, 1327.67, 418.744, -59.0869, 0, 'Thrall Bfu'), +(32518, 101, 1316.95, 405.483, -61.6812, 0, 'Thrall Bfu'), +(32518, 102, 1310.51, 389.42, -64.3699, 0, 'Thrall Bfu'), +(32518, 103, 1305.78, 371.107, -67.2918, 0, 'Thrall Bfu'), +(32518, 104, 1302.32, 358.314, -67.2964, 0, 'Thrall Bfu'), +-- vitory horde +(32518, 105, 1299.57, 348.107, -65.0272, 0, 'Thrall Bfu'), +(32518, 106, 1285.4, 349.609, -65.0272, 0, 'Thrall Bfu'), +(32518, 107, 1273.32, 347.801, -65.0272, 0, 'Thrall Bfu'), +(32518, 108, 1259.2, 333.983, -65.0272, 0, 'Thrall Bfu'), +(32518, 109, 1261.74, 333.245, -65.0272, 0, 'Thrall Bfu'), +-- victory throne +(32518, 110, 1268.74, 331.421, -63.1383, 0, 'Thrall Bfu'), +(32518, 111, 1274.84, 329.833, -60.0831, 0, 'Thrall Bfu'), +(32518, 112, 1283.23, 321.748, -58.5266, 0, 'Thrall Bfu'), +(32518, 113, 1287.16, 317.115, -57.3209, 0, 'Thrall Bfu'), +-- thrall facing allaince +(32518, 114, 1291.66, 322.46, -57.762, 0, 'Thrall Bfu'), +(32518, 115, 1294.18, 331.684, -60.0831, 0, 'Thrall Bfu'), +(32518, 116, 1297.01, 342.056, -60.0831, 0, 'Thrall Bfu'), +(32518, 117, 1298.1, 346.239, -65.0275, 0, 'Thrall Bfu'), +-- left +(32518, 118, 1308.33, 346.775, -65.027, 16000, 'Thrall Bfu'), +(32518, 119, 1304.43, 348.332, -65.027, 0, 'Thrall Bfu'), +(32518, 120, 1305.80, 353.217, -66.768, 0, 'Thrall Bfu'); + +-- waypoint sylvanas - Spawnpoints till UC Gates +DELETE FROM `waypoint_data` WHERE `id` IN (3236500,32365000,316880,3168800,3173900); +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES +(3236500, 1, 1888.12, 239.214, 57.5389, 0, 0, 1, 0, 100, 0), +-- waypoint sylvanas - UC Gates till Valimathras Intro +(32365000, 1, 1878.07, 236.147, 59.9309, 0, 0, 0, 0, 100, 0), +(32365000, 2, 1873.99, 236.114, 62.2753, 0, 0, 0, 0, 100, 0), +(32365000, 3, 1867.68, 236.064, 62.2753, 0, 0, 0, 0, 100, 0), +(32365000, 4, 1864.06, 236.035, 62.2753, 0, 0, 0, 0, 100, 0), +(32365000, 5, 1861.88, 229.133, 62.2753, 0, 0, 0, 0, 100, 0), +(32365000, 6, 1861.88, 229.133, 62.2753, 0, 0, 0, 0, 100, 0), +(32365000, 7, 1856.69, 227.579, 62.2753, 0, 0, 0, 0, 100, 0), +(32365000, 8, 1853.99, 230.695, 62.2753, 0, 0, 0, 0, 100, 0), +(32365000, 9, 1853.99, 230.695, 62.2753, 0, 0, 0, 0, 100, 0), +(32365000, 10, 1853.87, 236.354, 62.2753, 0, 0, 0, 0, 100, 0), +(32365000, 11, 1848.71, 236.182, 62.2753, 0, 0, 0, 0, 100, 0), +-- waypoint whirlwind spawn 1 - Spawnpoint till Valimathras Intro +(316880, 1, 1880, 237.824, 59.4729, 0, 0, 0, 0, 100, 0), +(316880, 2, 1874.53, 238.094, 62.2751, 0, 0, 0, 0, 100, 0), +(316880, 3, 1864.51, 238.45, 62.2751, 0, 0, 0, 0, 100, 0), +(316880, 4, 1863.06, 233.645, 62.2751, 0, 0, 0, 0, 100, 0), +(316880, 5, 1861.4, 228.164, 62.2751, 0, 0, 0, 0, 100, 0), +(316880, 6, 1857.78, 228.028, 62.2751, 0, 0, 0, 0, 100, 0), +(316880, 7, 1853.63, 228.254, 62.2751, 0, 0, 0, 0, 100, 0), +(316880, 8, 1853.23, 231.844, 62.2751, 0, 0, 0, 0, 100, 0), +(316880, 9, 1853.03, 237.559, 62.2751, 0, 0, 0, 0, 100, 0), +(316880, 10, 1846.6, 237.699, 62.2751, 0, 0, 0, 0, 100, 0), +(316880, 11, 1843.31, 236.508, 62.2751, 0, 0, 0, 0, 100, 0), +(316880, 12, 1834.2, 233.346, 59.9925, 0, 0, 0, 0, 100, 0), +(316880, 13, 1834.2, 233.346, 59.9925, 0, 0, 0, 0, 100, 0), +-- waypoint whirlwind spawn 2 - Spawnpoint till Valimathras Intro +(3168800, 1, 1877.77, 238.831, 60.0011, 0, 0, 0, 0, 100, 0), +(3168800, 2, 1871.82, 238.985, 62.2751, 0, 0, 0, 0, 100, 0), +(3168800, 3, 1866.11, 239.132, 62.2751, 0, 0, 0, 0, 100, 0), +(3168800, 4, 1862.72, 241.245, 62.2751, 0, 0, 0, 0, 100, 0), +(3168800, 5, 1862.38, 247.837, 62.2751, 0, 0, 0, 0, 100, 0), +(3168800, 6, 1854.69, 247.941, 62.2751, 0, 0, 0, 0, 100, 0), +(3168800, 7, 1854.02, 241.464, 62.2751, 0, 0, 0, 0, 100, 0), +(3168800, 8, 1850.92, 240.056, 62.2751, 0, 0, 0, 0, 100, 0), +(3168800, 9, 1840.91, 239.836, 61.73, 0, 0, 0, 0, 100, 0), +(3168800, 10, 1832.81, 243.255, 59.9357, 0, 0, 0, 0, 100, 0), +-- Doomguard Pillager +(3173900, 1, 1574.43, 374.9, -62.1772, 0, 0, 1, 0, 100, 0), +(3173900, 2, 1552.25, 369.544, -62.1821, 0, 0, 1, 0, 100, 0), +(3173900, 3, 1542.96, 367.098, -62.1829, 0, 0, 1, 0, 100, 0), +(3173900, 4, 1525.8, 359.98, -57.1519, 0, 0, 1, 0, 100, 0), +(3173900, 5, 1515.02, 352.861, -60.7845, 0, 0, 1, 0, 100, 0), +(3173900, 6, 1511.13, 346.368, -60.0907, 0, 0, 1, 0, 100, 0), +(3173900, 7, 1495.81, 332.048, -60.0952, 0, 0, 1, 0, 100, 0), +(3173900, 8, 1480.89, 319.797, -60.4015, 0, 0, 1, 0, 100, 0), +(3173900, 9, 1476.33, 311.81, -57.1519, 0, 0, 1, 0, 100, 0), +(3173900, 10, 1468.84, 316.665, -54.2759, 0, 0, 1, 0, 100, 0), +(3173900, 11, 1462.64, 319.917, -51.0553, 0, 0, 1, 0, 100, 0), +(3173900, 12, 1444.03, 330.492, -57.1526, 0, 0, 1, 0, 100, 0), +(3173900, 13, 1448.13, 336.164, -59.0239, 0, 0, 1, 0, 100, 0), +(3173900, 14, 1456.4, 347.434, -62.1912, 0, 0, 1, 0, 100, 0), +(3173900, 15, 1470.57, 362.915, -62.1857, 0, 0, 1, 0, 100, 0), +(3173900, 16, 1480.66, 372.619, -62.1857, 0, 0, 1, 0, 100, 0), +(3173900, 17, 1498.48, 386.491, -62.2437, 0, 0, 1, 0, 100, 0), +(3173900, 18, 1508.47, 392.468, -57.1531, 0, 0, 1, 0, 100, 0), +(3173900, 19, 1521.66, 400.009, -62.3005, 0, 0, 1, 0, 100, 0), +(3173900, 20, 1527.85, 403.27, -62.1842, 0, 0, 1, 0, 100, 0), +(3173900, 21, 1546.71, 412.482, -62.1761, 0, 0, 1, 0, 100, 0), +(3173900, 22, 1561.51, 416.615, -62.1763, 0, 0, 1, 0, 100, 0), +(3173900, 23, 1581.73, 415.636, -62.1797, 0, 0, 1, 0, 100, 0), +(3173900, 24, 1602.73, 415.015, -62.1789, 0, 0, 1, 0, 100, 0), +(3173900, 25, 1623.72, 414.409, -62.1775, 0, 0, 1, 0, 100, 0), +(3173900, 26, 1637.7, 413.801, -62.1774, 0, 0, 1, 0, 100, 0), +(3173900, 27, 1664.38, 406.381, -62.1995, 0, 0, 1, 0, 100, 0), +(3173900, 28, 1683.74, 398.242, -62.2532, 0, 0, 1, 0, 100, 0), +(3173900, 29, 1702.95, 385.963, -62.2453, 0, 0, 1, 0, 100, 0), +(3173900, 30, 1719.42, 372.958, -60.4869, 0, 0, 1, 0, 100, 0), +(3173900, 31, 1734.5, 358.384, -60.486, 0, 0, 1, 0, 100, 0), +(3173900, 32, 1746.9, 341.481, -60.4833, 0, 0, 1, 0, 100, 0), +(3173900, 33, 1757.75, 323.507, -62.245, 0, 0, 1, 0, 100, 0), +(3173900, 34, 1767.49, 299.821, -62.1544, 0, 0, 1, 0, 100, 0), +(3173900, 35, 1771.75, 279.27, -62.1764, 0, 0, 1, 0, 100, 0), +(3173900, 36, 1774.98, 258.533, -62.1764, 0, 0, 1, 0, 100, 0), +(3173900, 37, 1774.33, 237.676, -62.1764, 0, 0, 1, 0, 100, 0), +(3173900, 38, 1773.21, 223.721, -62.1764, 0, 0, 1, 0, 100, 0), +(3173900, 39, 1768.56, 191.049, -61.6204, 0, 0, 1, 0, 100, 0); + + +DELETE FROM `waypoints` WHERE `entry`=3215900; +INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES +(3215900, 1, 1582.04, 408.649, -33.0274, 'Doomguard Pillager'), +(3215900, 2, 1591.27, 382.782, -36.0157, 'Doomguard Pillager'), +(3215900, 3, 1626.62, 401.262, -41.3528, 'Doomguard Pillager'), +(3215900, 4, 1596.45, 409.824, -46.6646, 'Doomguard Pillager'), +(3215900, 5, 1612.5, 391.512, -55.0201, 'Doomguard Pillager'), +(3215900, 6, 1583.25, 383.358, -62.2586, 'Doomguard Pillager'); + +-- creature texts +DELETE FROM `creature_text` WHERE `CreatureID` IN (31739,31844,32511); +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `comment`) VALUES +(31739, 0, 0, 'We''ll burn it to the ground before giving it to you!', 14, 0, 100, 0, 0, 0, 32330, 'Horde Guard BfU'), +(31739, 1, 0, 'That wretch Putress won''t get away with this!', 12, 0, 100, 0, 0, 0, 32266, 'Horde Guard BfU'), +(31739, 2, 0, 'For the Horde!', 14, 0, 100, 0, 0, 0, 4921, 'Horde Guard BfU'), +(31844, 0, 0, 'YAAAAAAAARGGGGHHHHH!!!!', 14, 0, 100, 0, 0, 0, 32437, 'Blight Aberration'), +(32511, 0, 0, 'No hope for you!', 11, 0, 100, 0, 0, 0, 32545, 'Khanok'); + +DELETE FROM `creature_text` WHERE `CreatureID`=32277 AND `GroupID`=5; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `comment`) VALUES +(32277, 5, 0, 'YOU HAVE FAILED ME, VARIMATHRAS!', 14, 0, 100, 0, 0, 0, 32618, 'A distant voice'); + +UPDATE `creature_questender` SET `id`=32518 WHERE `id`=31650 AND `quest`=13267; +UPDATE `creature_text` SET `emote`=1 WHERE `CreatureID` IN (32401, 32402, 32518, 32365, 31565); +UPDATE `creature_template` SET `mechanic_immune_mask`=8388624 WHERE `entry` IN (31565,31530); -- kahnok & varimathras +UPDATE `creature_template` SET `exp`=2 WHERE `entry` IN (32365, 32402); -- sylvanas hp +UPDATE `creature_template` SET `HealthModifier`=500 WHERE `entry`=32365; +UPDATE `creature_model_info` SET `BoundingRadius`=10, `CombatReach`=10 WHERE `DisplayID` IN (27755, 27992, 27788); -- hitbox von (31844, 32511, 32483); +UPDATE `creature_model_info` SET `BoundingRadius`=2, `CombatReach`=2 WHERE `DisplayID` = 27611; -- Putress +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=3 AND `SourceGroup`=1637 AND `SourceEntry`=34486; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`, `NegativeCondition`) VALUES +(3,1637,34486,0,0,1,0,60815,0,0,0,"","Do not show loot if we have aura 60815 for undercity fight", 1); + +UPDATE `gameobject_template_addon` SET `flags`=`flags`|0x00000800 WHERE `entry` IN (20656, 20655, 20657); + +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_undercity_buffs'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES (60964, 'spell_undercity_buffs'), +(64670, 'spell_undercity_buffs'); + +-- CREATURE_FLAG_EXTRA_IGNORE_PATHFINDING +UPDATE `creature_template` SET `flags_extra`=`flags_extra`|0x20000000, `InhabitType`=3 WHERE `entry` IN (32401,32391,32390,32395,32394,32392,32397,32396,32387,32510,31739,32519); + +-- Vol'jin SAI +SET @ENTRY := 31649; +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,19,0,100,0,13267,0,0,0,75,59062,0,0,0,0,0,7,0,0,0,0,0,0,0,"Vol'jin - On Quest '' Taken - Add Aura 'WGH Phase'"), +(@ENTRY,0,1,0,20,0,100,0,13266,0,0,0,7,13267,0,0,0,0,0,7,0,0,0,0,0,0,0,"Vol'jin - On Quest 'A Life Without Regret' Finished - Add Quest 'The Battle For The Undercity'"), +(@ENTRY,0,2,0,1,0,100,0,2000,2000,40000,40000,1,0,30000,0,0,0,0,1,0,0,0,0,0,0,0,"Vol'jin - Out of Combat - Say Line 0"); +DELETE FROM `creature_text` WHERE `CreatureID`=31649; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(31649, 0, 0, 'Ello, mon! Da Battle for the Undercity is already going on. Thrall is fighting inside, you might be able to find him. You can also wait for him here, he will be back anytime now.', 14, 0, 100, 0, 0, 0, 0, 0, 'Vol''jin'); +-- Conditions for Text Warning +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceGroup`=3 AND `SourceEntry`=31649; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorType`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(22,3,31649,0,0,29,1,32518,30,0,1,0,0,"","Do Not Run Vol''jin Text announce if Thrall is in range"); diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index a78716cf4..8f77de4d6 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -6051,6 +6051,13 @@ void SpellMgr::LoadDbcDataCorrections() case 71024: spellInfo->EffectImplicitTargetA[0] = TARGET_DEST_DYNOBJ_NONE; break; + // Battle for the Undercity + case 59892: // Cyclone fall + spellInfo->Effect[EFFECT_0] = SPELL_EFFECT_APPLY_AREA_AURA_FRIEND; + spellInfo->EffectRadiusIndex[0] = EFFECT_RADIUS_10_YARDS; + spellInfo->AttributesEx &= ~SPELL_ATTR0_CANT_CANCEL; + spellInfo->AttributesEx3 |= SPELL_ATTR3_ONLY_TARGET_PLAYERS; + break; // /////////////////////////////////////////// // ////////////////ITEMS////////////////////// diff --git a/src/server/scripts/EasternKingdoms/zone_undercity.cpp b/src/server/scripts/EasternKingdoms/zone_undercity.cpp index 099ba8e94..8aa28a400 100644 --- a/src/server/scripts/EasternKingdoms/zone_undercity.cpp +++ b/src/server/scripts/EasternKingdoms/zone_undercity.cpp @@ -17,10 +17,15 @@ npc_highborne_lamenter npc_parqual_fintallas EndContentData */ +#include "Player.h" #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "ScriptedGossip.h" -#include "Player.h" +#include "ScriptedEscortAI.h" +#include "SpellAuras.h" +#include "ObjectAccessor.h" +#include "SpellScript.h" +#include "SpellAuraEffects.h" /*###### ## npc_lady_sylvanas_windrunner @@ -84,7 +89,7 @@ class npc_lady_sylvanas_windrunner : public CreatureScript public: npc_lady_sylvanas_windrunner() : CreatureScript("npc_lady_sylvanas_windrunner") { } - bool OnQuestReward(Player* player, Creature* creature, const Quest *_Quest, uint32 /*slot*/) + bool OnQuestReward(Player* player, Creature* creature, const Quest *_Quest, uint32 /*slot*/) override { if (_Quest->GetQuestId() == QUEST_JOURNEY_TO_UNDERCITY) creature->AI()->SetGUID(player->GetGUID(), GUID_EVENT_INVOKER); @@ -98,7 +103,7 @@ public: { } - void Reset() + void Reset() override { LamentEvent = false; targetGUID = 0; @@ -106,7 +111,7 @@ public: _events.Reset(); } - void EnterCombat(Unit* /*who*/) + void EnterCombat(Unit* /*who*/) override { _events.ScheduleEvent(EVENT_FADE, 30000); _events.ScheduleEvent(EVENT_SUMMON_SKELETON, 20000); @@ -115,7 +120,7 @@ public: _events.ScheduleEvent(EVENT_MULTI_SHOT, 10000); } - void SetGUID(uint64 guid, int32 type) + void SetGUID(uint64 guid, int32 type) override { if (type == GUID_EVENT_INVOKER) { @@ -133,7 +138,7 @@ public: } } - void JustSummoned(Creature* summoned) + void JustSummoned(Creature* summoned) override { if (summoned->GetEntry() == NPC_HIGHBORNE_BUNNY) { @@ -144,7 +149,7 @@ public: } } - void UpdateAI(uint32 diff) + void UpdateAI(uint32 diff) override { if (!UpdateVictim() && !LamentEvent) return; @@ -222,7 +227,7 @@ public: uint64 playerGUID; }; - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const override { return new npc_lady_sylvanas_windrunnerAI(creature); } @@ -251,7 +256,7 @@ public: bool EventMove; bool EventCast; - void Reset() + void Reset() override { EventMoveTimer = 10000; EventCastTimer = 17500; @@ -259,9 +264,9 @@ public: EventCast = true; } - void EnterCombat(Unit* /*who*/) { } + void EnterCombat(Unit* /*who*/) override { } - void UpdateAI(uint32 diff) + void UpdateAI(uint32 diff) override { if (EventMove) { @@ -303,7 +308,7 @@ class npc_parqual_fintallas : public CreatureScript public: npc_parqual_fintallas() : CreatureScript("npc_parqual_fintallas") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override { player->PlayerTalkClass->ClearMenus(); if (action == GOSSIP_ACTION_INFO_DEF+1) @@ -319,7 +324,7 @@ public: return true; } - bool OnGossipHello(Player* player, Creature* creature) + bool OnGossipHello(Player* player, Creature* creature) override { if (creature->IsQuestGiver()) player->PrepareQuestMenu(creature->GetGUID()); @@ -338,6 +343,3678 @@ public: } }; +enum Factions +{ + FACTION_HOSTILE = 14, + FACTION_FRIENDLY_TO_ALL = 35 +}; + +/*###### +## ALLIANCE +#######*/ + +enum WrynnMisc +{ + // Creatures + NPC_WRYNN = 32401, + + // Texts + WRYNN_SAY_PREP_1 = 0, + WRYNN_SAY_PREP_2 = 1, + WRYNN_SAY_PREP_3 = 2, + WRYNN_SAY_PREP_4 = 3, + WRYNN_SAY_PREP_5 = 4, + WRYNN_SAY_PREP_6 = 5, + WRYNN_SAY_SEWERS_1 = 6, + WRYNN_SAY_SEWERS_2 = 7, + WRYNN_SAY_SEWERS_3 = 8, + WRYNN_SAY_SEWERS_4 = 9, + WRYNN_SAY_APO_1 = 10, + WRYNN_SAY_APO_2 = 11, + WRYNN_SAY_APO_3 = 12, + WRYNN_SAY_APO_4 = 13, + WRYNN_SAY_APO_5 = 14, + WRYNN_SAY_APO_6 = 15, + WRYNN_SAY_APO_7 = 16, + WRYNN_SAY_APO_8 = 17, + WRYNN_SAY_APO_9 = 18, + WRYNN_SAY_APO_10 = 19, + WRYNN_SAY_APO_11 = 20, + WRYNN_SAY_APO_12 = 21, + WRYNN_SAY_THRONE_1 = 22, + WRYNN_SAY_THRONE_2 = 23, + WRYNN_SAY_THRONE_3 = 24, + WRYNN_SAY_THRONE_4 = 25, + WRYNN_SAY_THRONE_5 = 26, + WRYNN_SAY_THRONE_6 = 27, + WRYNN_SAY_THRONE_7 = 28, + WRYNN_SAY_THRONE_8 = 29, + WRYNN_SAY_THRONE_9 = 30, + + // Spells + SPELL_WHIRLWIND = 41056, + SPELL_WRYNN_BUFF = 60964, + SPELL_HEROIC_LEAP = 57793, + + // Events + EVENT_WHIRLWIND = 1, + EVENT_HEROIC_LEAP = 2, + EVENT_AGGRO_JAINA = 3, + EVENT_WRYNN_BUFF = 4 +}; + +enum JainaMisc +{ + // Creatures + NPC_JAINA = 32402, + + // Texts + JAINA_SAY_SEWERS_1 = 0, + JAINA_SAY_APO_1 = 1, + JAINA_SAY_THRONE_1 = 2, + JAINA_SAY_THRONE_2 = 3, + JAINA_SAY_THRONE_3 = 4, + + // Spells + SPELL_FIREBALL = 20692, + SPELL_BLIZZARD = 20680, + SPELL_ELEMENTALS = 20681, + SPELL_DEEPFREEZE = 61224, + SPELL_JAINA_BUFF = 61011, + + // Events + EVENT_FIREBALL = 1, + EVENT_BLIZZARD = 2, + EVENT_ELEMENTAL = 3 +}; + +/*###### +## HORDE +#######*/ + +enum ThrallMisc +{ + // Creatures + NPC_THRALL = 32518, + + // Gossips + GOSSIP_THRALL = 60193, + + // Texts + THRALL_SAY_THRONE_A_1 = 0, + THRALL_SAY_THRONE_A_2 = 1, + + THRALL_SAY_PREP_1 = 2, + THRALL_SAY_PREP_2 = 3, + THRALL_SAY_PREP_3 = 4, + THRALL_SAY_PREP_4 = 5, + THRALL_SAY_PREP_5 = 6, + THRALL_SAY_PREP_6 = 7, + THRALL_SAY_PREP_7 = 8, + THRALL_SAY_PREP_8 = 9, + THRALL_SAY_COURTYARD_1 = 10, + THRALL_SAY_COURTYARD_2 = 11, + THRALL_SAY_COURTYARD_3 = 12, + THRALL_SAY_COURTYARD_4 = 13, + THRALL_SAY_COURTYARD_5 = 14, + THRALL_SAY_ELEVATOR_1 = 15, + THRALL_SAY_ELEVATOR_2 = 16, + THRALL_SAY_ELEVATOR_3 = 17, + THRALL_SAY_SANCTUM_1 = 18, + THRALL_SAY_SANCTUM_2 = 19, + THRALL_SAY_SANCTUM_3 = 20, + THRALL_SAY_SANCTUM_4 = 21, + THRALL_SAY_SANCTUM_5 = 22, + THRALL_SAY_SANCTUM_6 = 23, + THRALL_SAY_SANCTUM_7 = 24, + THRALL_SAY_THRONE_1 = 25, + THRALL_SAY_THRONE_2 = 26, + THRALL_SAY_THRONE_3 = 27, + THRALL_SAY_THRONE_4 = 28, + THRALL_SAY_THRONE_5 = 29, + THRALL_SAY_THRONE_6 = 30, + THRALL_SAY_THRONE_7 = 31, + THRALL_SAY_THRONE_8 = 32, + THRALL_SAY_THRONE_9 = 33, + THRALL_SAY_THRONE_10 = 34, + THRALL_SAY_THRONE_11 = 35, + + + // Sounds + SOUND_THRALL_1 = 16212, + SOUND_THRALL_2 = 16214, + + // Spells + SPELL_THRALL_BUFF = 64670, + SPELL_TIDAL_WAVE = 59635, + SPELL_TIDAL_WAVE_SUMMON = 59627, + SPELL_TIDAY_FURY = 59631, + SPELL_TIDAY_FURY_EFFECT = 59629, + SPELL_CALL_OF_AIR = 59898, + SPELL_CYCLONE_FALL = 59892, + SPELL_CALL_OF_EARTH = 60207, + SPELL_PORTAL_COLLAPSE = 60285, + SPELL_TELEPORT_SPAWN_VISUAL = 60427, + SPELL_SUMMONED_DEMON = 7741, + SPELL_DEEP_FREEZE = 60511, + SPELL_GREATER_MASS_TELEPORT = 60516, + SPELL_WATER_REVENANT_ENTRANCE = 55760, + SPELL_TELEPORT_OG = 60699, + + // Combatspells + SPELL_CHAIN_LIGHTNING = 59517, + SPELL_LAVA_BURST = 59519, + SPELL_THUNDER = 59507, + SPELL_HEROIC_VANGUARD = 59506, + + // Events + EVENT_CHAIN_LIGHTNING = 1, + EVENT_LAVA_BURST = 2, + EVENT_THUNDER = 3, + EVENT_AGGRO_SYLVANAS = 4, + EVENT_THRALL_BUFF = 5, + + // Creatures + NPC_WARSONG_BATTLEGUARD = 31739, + NPC_VORTEX = 31782, + NPC_TIDAL_WAVE = 31765, + NPC_WHIRLWIND = 31688, + NPC_CAVE_DUMMY = 32200, + NPC_SLINGER_TRIGGER = 31577, + NPC_OVERLORD_SAURFANG = 32315, + NPC_DISTANT_VOICE = 32277, + NPC_PLAGUE_TRIGGER = 31576, + NPC_BLIGHT_ABBERATION = 31844, + + // Gameobjects + GO_BLOCKED_PASSAGE = 194935, + GO_HORDE_BANNER = 194004, + GO_PORTAL_ORGRIMMAR = 193427, + + // Mounts + MODEL_WHITE_WULF = 14575 +}; + +enum SlyvanasMisc +{ + // Creatures + NPC_SYLVANAS = 32365, + + // Texts + SYLVANAS_SAY_COURTYARD_1 = 0, + SYLVANAS_SAY_ELEVATOR_1 = 1, + SYLVANAS_SAY_SANCTUM_1 = 2, + SYLVANAS_SAY_SANCTUM_2 = 3, + SYLVANAS_SAY_SANCTUM_3 = 4, + SYLVANAS_SAY_SANCTUM_4 = 5, + SYLVANAS_SAY_SANCTUM_5 = 6, + SYLVANAS_SAY_THRONE_1 = 7, + + // Spells + SPELL_SYLVANAS_BUFF = 59756, + SPELL_SHRIEK_OF_HIGHBORN = 59514, + SPELL_LEAP_TO_PLATFORM = 56347, + + // Events + EVENT_SHRIEK_OF_HIGHBORN = 1, + EVENT_SYLVANAS_BUFF = 6, + + // Mounts + MODEL_SKELETON_MOUNT = 10721 +}; + +enum SaurfangMisc +{ + // Texts + SAY_SAURFANG_ARRIVAL_1 = 0, + SAY_SAURFANG_ARRIVAL_2 = 1, + SAY_SAURFANG_ARRIVAL_3 = 2 +}; + +/*###### +## ENEMY +#######*/ + +enum BlightWormMisc +{ + // Creatures + NPC_BLIGHTWORM = 32483, + + // Spells + SPELL_INGEST = 61123, + SPELL_INGEST_TRIGGER = 61124, + SPELL_BLIGHT_BREATH = 61125, + + // Events + EVENT_INFEST = 1, + EVENT_BLIGHT_BREATH = 2 +}; + +enum PutressMisc +{ + // Creatures + NPC_PUTRESS = 31530, + + NPC_EXPERIMENT = 32519, + NPC_GENERATOR = 36212, + + // Spells + SPELL_BLIGHT_EMPOWERMENT = 59449, + SPELL_BLIGHT_OVERLOAD = 61181, + SPELL_BLIGHT_BARREL = 59460, + SPELL_UNHOLY_FRENZY = 60300, + SPELL_PUTRESS_CASTING_STATE = 59447, + + // Texts + PUTRESS_SAY_1 = 0, + PUTRESS_SAY_2 = 1, + PUTRESS_SAY_3 = 2, + PUTRESS_SAY_4 = 3, + PUTRESS_SAY_5 = 4, + PUTRESS_SAY_6 = 5, + PUTRESS_SAY_7 = 6, + PUTRESS_SAY_8 = 7, + + // Sounds + SOUND_PUTRESS = 16920, +}; + +enum KhanokMisc +{ + // Creatures + NPC_KHANOK = 32511 +}; + +enum ValimathrasMisc +{ + // Creatures + NPC_VARIMATHRAS = 31565, + NPC_VARIMATHRAS_PORTAL = 31811, + + // Texts + SAY_VALIMATHRAS_INTRO_0 = 0, + SAY_VALIMATHRAS_INTRO_1 = 1, + SAY_VALIMATHRAS_INTRO_2 = 2, + SAY_VALIMATHRAS_INNER_SANKTUM_0 = 3, + SAY_VALIMATHRAS_INNER_SANKTUM_1 = 4, + SAY_CLOSE_DOOR = 5, + SAY_THRONE_1 = 6, + SAY_THRONE_2 = 7, + SAY_THRONE_3 = 8, + SAY_THRONE_4 = 9, + SAY_THRONE_5 = 10, + SAY_THRONE_6 = 11, + SAY_VALIMATHRAS_ATTACK = 12, + + // Spells + SPELL_VALIMATHRAS_PORTAL = 68424, + SPELL_CARION_SWARM = 59434, + SPELL_DRAIN_LIFE = 17238, + SPELL_MIGHT_OF_VARIMATHRAS = 59424, + SPELL_SHADOW_BOLT_VOLLEY = 20741, + SPELL_AURA_OF_VARIMATHRAS = 60289, + SPELL_LEGION_PORTAL = 59680, + SPELL_OPENING_LEGION_PORTALS = 60224, +}; + +enum TrashMisc +{ + // Creatures + NPC_DREADLORD = 32391, + NPC_GUARDIAN = 32390, + NPC_CHEMIST = 32395, + NPC_BETRAYER = 32394, + NPC_FELBEAST = 32392, + NPC_DOCTOR = 32397, + NPC_COLLABORATOR = 32396, + NPC_SW_SOLDIER = 32387, + NPC_HORDE_SOLDIER = 32510, + NPC_HORDE_GUARD = 31739, + + // Horde + NPC_TREACHEROUS_GUARDIAN_H = 31532, + NPC_DREADLORD_H = 31531, + NPC_FELBEAST_H = 31528, + NPC_MARAUDER_H = 31527, + NPC_BETRAYER_H = 31529, + NPC_CHEMIST_H = 31482, + NPC_COLLABORATOR_H = 31524, + NPC_DOCTOR_H = 31516, + NPC_DOOMGUARD_PILLARGER = 32159, + NPC_BLIGHT_SLINGER = 31526, + NPC_BLIGHT_SPREADER = 31831, + NPC_FELGUARD_MORADEUR = 32393, + NPC_LEGION_OVERLORD = 32271, + NPC_LEGION_INVADER = 32269, + NPC_LEGION_DREADWHISPER = 32270, + + // Texts + SAY_BURN_UC = 0, + SAY_PUTRESS_ANGER = 1, + SAY_FOR_THE_HORDE = 2 +}; + +enum QuestMisc +{ + QUEST_BATTLE_A = 13377, + QUEST_BATTLE_H = 13267, + + SPELL_PHASING_HORDE = 59062, + + NPC_VOICE = 32277, + + VOICE_SAY_THRONE = 0, + + WAVE_MAXCOUNT = 12, + GENERATOR_MAXCOUNT = 5, + ALLIANCE_FORCE_MAXCOUNT = 6, + HORDE_FORCE_MAXCOUNT = 6, + WAVE_COURTYARD_FIGHT = 9, + + ZONE_TIRISFAL = 85, + ZONE_UNDERCITY = 1497 +}; + +enum Worldstates +{ + // Alliance + WORLD_STATE_MANHUNT_COUNTDOWN_A = 3958, + WORLD_STATE_MANHUNT_STARTS_A = 3966, + WORLD_STATE_SEWERS_FIGHT_A = 3962, + WORLD_STATE_SEWERS_DONE_A = 3964, + WORLD_STATE_APOTHECARIUM_FIGHT_A = 3972, + WORLD_STATE_APOTHECARIUM_DONE_A = 3971, + WORLD_STATE_FAIL_A = 3963, + + // Horde + WORLD_STATE_BATTLE_COUNTDOWN_H = 3876, + WORLD_STATE_BATTLE_START_H = 3875, + WORLD_STATE_COURTYARD_FIGHT_H = 3885, + WORLD_STATE_COURTYARD_DONE_H = 3886, + WORLD_STATE_INNER_SANKTUM_FIGHT_H = 3887, + WORLD_STATE_INNER_SANKTUM_DONE_H = 3888, + WORLD_STATE_APOTHECARIUM_FIGHT_H = 3891, // unused + WORLD_STATE_APOTHECARIUM_DONE_H = 3892, // unused + WORLD_STATE_ROYAL_QUARTER_FIGHT_H = 3889, + WORLD_STATE_ROYAL_QUARTER_DONE_H = 3890, + WORLD_STATE_FAIL_H = 3878 +}; + +struct Location +{ + float x, y, z, o; +}; + +static Location AllianceSpawn[] = +{ + { 1603.97f, 718.02f, 65.10f, 0 }, // guardian // sewers + { 1604.78f, 657.22f, 40.80f, 0 }, // wave 1 + { 1632.13f, 649.19f, 30.67f, 0 }, // wave 2 + { 1683.66f, 590.37f, -8.59f, 0 }, // wave 3 + { 1665.51f, 543.32f, -13.23f, 0 }, // wave 4 + { 1684.25f, 542.06f, -11.99f, 0 }, + { 1680.86f, 596.73f, -6.37f, 0 }, + { 1676.41f, 558.28f, -18.46f, 0 }, // Blightworm + { 1685.16f, 620.41f, 5.74f, 0 }, // soldiers + { 0.0f, 0.0f, 0.0f, 0 }, // trash wave + { 1500.03f, 409.59f, -62.18f, 0 }, // guardians + { 1444.25f, 453.86f, -70.48f, 0 }, // dreadlords + { 1432.43f, 403.20f, -85.26f, 0 }, // putress + { 1456.51f, 417.55f, -84.95f, 0 }, // experiment + { 1415.38f, 377.54f, -84.95f, 0 }, // experiment + { 1422.69f, 446.36f, -76.22f, 0 }, // experiment + { 1386.19f, 412.01f, -77.17f, 0 }, // experiment + { 1300.75f, 347.39f, -65.02f, 0 }, // thrall + { 1296.79f, 348.37f, -65.02f, 0 }, // sylvanas + { 1293.46f, 351.19f, -65.02f, 0 }, // horde soldier 32510 + { 1293.79f, 347.75f, -65.02f, 0 }, + { 1296.24f, 345.34f, -65.02f, 0 }, + { 1300.41f, 344.47f, -65.02f, 0 }, + { 1303.96f, 345.26f, -65.02f, 0 }, + { 1305.43f, 348.06f, -65.02f, 0 }, + { 1306.92f, 390.59f, -64.33f, 4.472f }, // aliance soldiers + { 1311.03f, 390.10f, -64.19f, 4.472f }, + { 1315.31f, 388.98f, -64.18f, 4.472f }, + { 1316.38f, 392.82f, -63.32f, 4.472f }, + { 1311.93f, 394.38f, -63.25f, 4.472f }, + { 1307.92f, 395.53f, -63.24f, 4.472f }, +}; + +static Location AllianceWP[] = +{ + { 1737.06f, 734.176f, 48.8f, 0 }, // Jaina sewers UNUSED + { 1682.92f, 730.89f, 76.84f, 0 }, // UNUSED + { 1662.18f, 540.67f, -11.64f, 0.60f }, // soldiers + { 1676.45f, 544.81f, -16.45f, 2.23f }, + { 1687.14f, 555.37f, -16.62f, 2.35f }, + { 1666.22f, 477.69f, -11.89f, 2.14f }, + { 1594.92f, 422.44f, -46.38f, 0 }, // jaina balcony + { 1423.19f, 412.73f, -84.60f, 0 }, // jaina putress + { 1311.93f, 394.38f, -63.25f, 0 }, // jaina throne room wait + { 1300.75f, 347.39f, -65.02f, 0 }, // jaina throne room +}; + +static Location HordeSpawn[] = +{ + { 1581.94f, 383.22f, -62.22f, 0 } // Khanok +}; + +static Location ThrallSpawn[] = +{ + // Vortex + { 1880.0001f, 237.8242f, 59.472f, 3.060f }, + // NPC_DOCTOR_H + { 1808.29f, 264.223f, 65.3997f, 5.41411f }, + { 1792.05f, 282.213f, 70.3996f, 5.46674f }, + { 1798.03f, 197.815f, 70.3997f, 0.550926f }, + // NPC_CHEMIST_H + { 1806.59f, 266.874f, 65.3997f, 5.528f }, + { 1808.18f, 211.038f, 65.3996f, 0.799897f }, + { 1803.01f, 213.037f, 65.3996f, 0.496734f }, + { 1803.01f, 213.037f, 65.3996f, 0.496734f }, + { 1809.58f, 197.105f, 70.3999f, 0.593338f }, + { 1816.2f, 196.655f, 70.3999f, 0.820318f }, + { 1791.75f, 197.267f, 70.3999f, 0.584698f }, + { 1814.45f, 279.218f, 70.3998f, 5.52878f }, + { 1793.98f, 280.346f, 70.3996f, 5.50522f }, + // NPC_TREACHEROUS_GUARDIAN_H + { 1806.31f, 213.05f, 65.3998f, 0.52893f }, + { 1813.54f, 197.01f, 70.3999f, 0.807745f }, + { 1789.15f, 197.6f, 70.3999f, 0.367921f }, + { 1804.79f, 263.79f, 65.3998f, 5.49265f }, + { 1818.12f, 280.6f, 70.3997f, 5.59475f }, + { 1790.19f, 279.868f, 70.3997f, 5.77539f }, + // NPC_BLIGHT_SLINGER + { 1827.64f, 196.716f, 70.3996f, 1.61907f }, + { 1778.47f, 195.17f, 70.3996f, 0.989177f }, + { 1826.86f, 280.42f, 70.3997f, 4.69234f }, + { 1779.52f, 280.479f, 70.3996f, 5.37171f }, + // NPC_VARIMATHRAS + { 1810.926f, 236.826f, 62.753f, 0.148f }, + // NPC_VARIMATHRAS_PORTAL + { 1805.194f, 235.725f, 65.173f, 0.334f }, + // NPC_TREACHEROUS_GUARDIAN_H + { 1753.151f, 238.632f, 61.372f, 0.049f }, + // NPC_DOCTOR_H + { 1785.647f, 212.416f, 59.686f, 1.663f }, + // NPC_CHEMIST_H + { 1784.802f, 265.842f, 59.458f, 4.722f }, + // NPC_BLIGHT_ABBERATION + { 1805.753f, 285.499f, 70.399f, 4.691f }, + // NPC_WARSONG_BATTLEGUARD + { 1835.734f, 261.468f, 59.901f, 3.720f }, + { 1821.705f, 256.014f, 60.016f, 3.512f }, + { 1837.801f, 216.490f, 60.105f, 2.381f }, + { 1826.564f, 227.173f, 60.198f, 2.381f }, + { 1804.952f, 199.451f, 70.399f, 1.478f }, + { 1805.011f, 211.147f, 65.399f, 1.607f }, + { 1805.447f, 277.378f, 70.400f, 4.627f }, + { 1805.389f, 265.287f, 65.399f, 4.718f }, + // GO_HORDE_BANNER + { 1750.697f, 232.644f, 64.748f, 6.151f }, + { 1750.706f, 245.729f, 65.585f, 0.009f }, + { 1737.508f, 239.323f, 62.641f, 0.054f }, + { 1634.253f, 226.927f, 62.592f, 0.983f }, + { 1628.978f, 231.074f, 62.592f, 0.411f }, + { 1589.801f, 236.328f, 60.149f, 0.157f }, + { 1589.135f, 243.569f, 60.149f, 5.887f }, + // NPC_WARSONG_BATTLEGUARD + { 1590.156f, 243.612f, 60.151f, 5.159f }, + { 1631.783f, 249.797f, 62.591f, 5.523f }, + // NPC_CAVE_BUNNY + { 1543.961548f, 240.997314f, 52.765247f, 4.885232f }, + { 1543.961548f, 240.997314f, 45.870247f, 4.885232f }, + { 1543.961548f, 240.997314f, 32.318245f, 4.885232f }, + { 1543.961548f, 240.997314f, 18.325245f, 4.885232f }, + { 1543.961548f, 240.997314f, 4.570244f, 4.885232f }, + { 1543.961548f, 240.997314f, -7.679757f, 4.885232f }, + { 1543.961548f, 240.997314f, -20.867758f, 4.885232f }, + { 1543.961548f, 240.997314f, -33.817757f, 4.885232f }, + { 1543.961548f, 240.997314f, -41.360523f, 4.885232f }, + // Jumppoint Thrall + { 1542.196f, 241.254f, -41.360f, 3.276f }, + // Jumppoint Sylvanas + { 1543.511f, 236.552f, -41.360f, 3.050f }, + // NPC_WARSONG_BATTLEGUARD + { 1527.904f, 206.368f, -43.058f, 1.179f }, + { 1534.110f, 216.822f, -43.058f, 4.569f }, + // Undercity Top Trashpackspawn + { 1585.577f, 240.465f, -52.150f, 3.193f }, + // Undercity Buttom Trashpackspawn Left + { 1528.291f, 269.948f, -62.178f, 0.672f }, + // Undercity Buttom Trashpackspawn Right + { 1618.600f, 302.468f, -62.177f, 0.466f }, + // NPC_BLIGHT_ABBERATION Jump Location + { 1805.845f, 251.430f, 60.587f, 4.722f }, + // Valimathras Inner Sanctum Spawn + { 1596.689f, 422.276f, -46.387f, 4.720f }, + // Valimathras Inner Sanctum Portal Spawn + { 1596.665f, 425.150f, -43.357f, 4.704f }, + // NPC_KHANOK - Inner Sunktum Spawn Left + { 1544.917f, 367.955f, -62.182f, 0.243f }, + // NPC_KHANOK - Inner Sunktum Spawn Right + { 1643.633f, 368.598f, -62.156f, 2.873f }, + // NPC_KHANOK - Inner Sunktum Spawn Top + { 1591.325f, 397.874f, -4.130f, 6.191f }, + // NPC_KHANOK - Inner Sunktum Middle + { 1573.400f, 398.450f, -65.862f, 5.618f }, + // NPC_WARSONG_BATTLEGUARD - NPC_KHANOK WinSpawn + { 1590.502f, 375.876f, -62.177f, 3.237f }, + // Valimathras Room Preparation + // Stones + { 1437.063f, 403.759f, -57.818f, 5.517f }, + { 1442.303f, 392.866f, -58.111f, 5.450552f }, + { 1447.207f, 397.880f, -58.102f, 5.403430f }, + // Valimathras + { 1290.323f, 315.996f, -57.320f, 1.322530f }, + // Valimathras Portals + { 1326.634f, 58.580f, -60.661907f, 4.008590f }, + { 1341.374f, 310.516f, -60.661415f, 2.838340f }, + { 1304.504f, 276.763f, -60.661442f, 1.833025f }, + { 1258.071f, 289.268f, -60.661636f, 0.741321f }, + { 1245.688f, 336.614f, -60.661243f, 5.983858f }, + { 1280.382f, 371.556f, -60.661404f, 4.931426f }, + // Valimathras Trashspawn + { 1325.059f, 332.652f, -65.027f, 2.186f }, + { 1270.474f, 350.982f, -65.027f, 0.034f }, +}; + +#define GOSSIP_WRYNN "Reporting for duty, your majesty! Let the assault begin!" +#define GOSSIP_THRALL "I am ready, Warchief." + +/*###### +## ALLIANCE +#######*/ + +/*###### +## npc_varian_wrynn +######*/ + +class npc_varian_wrynn : public CreatureScript +{ +public: + npc_varian_wrynn() : CreatureScript("npc_varian_wrynn") { } + + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override + { + player->PlayerTalkClass->ClearMenus(); + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: + player->CLOSE_GOSSIP_MENU(); + if (auto ai = CAST_AI(npc_varian_wrynn::npc_varian_wrynnAI, creature->AI())) + { + ai->Start(true, true, player->GetGUID()); + if (Creature* jaina = GetClosestCreatureWithEntry(creature, NPC_JAINA, 50.0f)) + ai->jainaGUID = jaina->GetGUID(); + else + ai->jainaGUID = 0; + ai->SetDespawnAtEnd(false); + ai->SetDespawnAtFar(false); + } + break; + } + return true; + } + + bool OnGossipHello(Player* player, Creature* creature) override + { + if (creature->IsQuestGiver()) + player->PrepareQuestMenu(creature->GetGUID()); + + if (player->GetQuestStatus(QUEST_BATTLE_A) == QUEST_STATUS_INCOMPLETE) + player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_WRYNN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + + player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); + + return true; + } + + struct npc_varian_wrynnAI : public npc_escortAI + { + npc_varian_wrynnAI(Creature* creature) : npc_escortAI(creature) + { + memset(generatorGUID, 0, sizeof(generatorGUID)); + memset(allianceForcesGUID, 0, sizeof(allianceForcesGUID)); + memset(hordeForcesGUID, 0, sizeof(hordeForcesGUID)); + } + + bool bStepping; + bool summoned; + + uint32 step; + uint32 phaseTimer; + + uint32 whirlwindTimer; + + uint64 jainaGUID; + uint64 putressGUID; + uint64 blightWormGUID; + uint64 khanokGUID; + uint64 thrallGUID; + uint64 sylvanasGUID; + + uint64 generatorGUID[GENERATOR_MAXCOUNT]; + uint64 allianceForcesGUID[ALLIANCE_FORCE_MAXCOUNT]; + uint64 hordeForcesGUID[HORDE_FORCE_MAXCOUNT]; + + EventMap _events; + + void Reset() override + { + if (!HasEscortState(STATE_ESCORT_ESCORTING)) + { + me->SetCorpseDelay(1); + me->SetRespawnTime(1); + me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + + bStepping = false; + step = 0; + phaseTimer = 0; + jainaGUID = 0; + _events.ScheduleEvent(EVENT_WHIRLWIND, 5 * IN_MILLISECONDS); + _events.ScheduleEvent(EVENT_HEROIC_LEAP, 10 * IN_MILLISECONDS); + _events.ScheduleEvent(EVENT_AGGRO_JAINA, 2 * IN_MILLISECONDS); + _events.ScheduleEvent(EVENT_WRYNN_BUFF, 2 * IN_MILLISECONDS); + me->ApplySpellImmune(0, IMMUNITY_ID, SPELL_SYLVANAS_BUFF, true); + + if (Creature* putress = ObjectAccessor::GetCreature(*me, putressGUID)) + { + putress->DespawnOrUnsummon(); + putressGUID = 0; + } + + if (Creature* blightWorm = ObjectAccessor::GetCreature(*me, blightWormGUID)) + { + blightWorm->DespawnOrUnsummon(); + blightWormGUID = 0; + } + + if (Creature* khanok = ObjectAccessor::GetCreature(*me, khanokGUID)) + { + khanok->DespawnOrUnsummon(); + khanokGUID = 0; + } + + if (Creature* thrall = ObjectAccessor::GetCreature(*me, thrallGUID)) + { + thrall->DespawnOrUnsummon(); + thrallGUID = 0; + } + + if (Creature* sylvanas = ObjectAccessor::GetCreature(*me, sylvanasGUID)) + { + sylvanas->DespawnOrUnsummon(); + sylvanasGUID = 0; + } + + for (uint8 i = 0; i < GENERATOR_MAXCOUNT; ++i) + { + if (Creature* temp = ObjectAccessor::GetCreature(*me, generatorGUID[i])) + { + generatorGUID[i] = 0; + temp->DespawnOrUnsummon(); + } + } + + for (uint8 i = 0; i < ALLIANCE_FORCE_MAXCOUNT; ++i) + { + if (Creature* temp = ObjectAccessor::GetCreature(*me, allianceForcesGUID[i])) + { + allianceForcesGUID[i] = 0; + temp->DespawnOrUnsummon(); + } + } + + for (uint8 i = 0; i < HORDE_FORCE_MAXCOUNT; ++i) + { + if (Creature* temp = ObjectAccessor::GetCreature(*me, hordeForcesGUID[i])) + { + hordeForcesGUID[i] = 0; + temp->DespawnOrUnsummon(); + } + } + } + } + + void JustSummoned(Creature* summoned) override + { + switch (summoned->GetEntry()) + { + case NPC_GENERATOR: + summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + summoned->ApplySpellImmune(0, IMMUNITY_ID, SPELL_WRYNN_BUFF, true); + summoned->ApplySpellImmune(0, IMMUNITY_ID, SPELL_THRALL_BUFF, true); + summoned->ApplySpellImmune(0, IMMUNITY_ID, SPELL_SYLVANAS_BUFF, true); + break; + default: + break; + } + } + + void SummonedCreatureDies(Creature* summon, Unit* /*killer*/) override + { + switch (summon->GetEntry()) + { + case NPC_BLIGHTWORM: + UpdateWorldState(me->GetMap(), WORLD_STATE_SEWERS_FIGHT_A, 0); + UpdateWorldState(me->GetMap(), WORLD_STATE_SEWERS_DONE_A, 1); + bStepping = true; + break; + case NPC_PUTRESS: + UpdateWorldState(me->GetMap(), WORLD_STATE_APOTHECARIUM_FIGHT_A, 0); + UpdateWorldState(me->GetMap(), WORLD_STATE_APOTHECARIUM_DONE_A, 1); + bStepping = true; + break; + default: + break; + } + } + + void UpdateWorldState(Map* map, uint32 id, uint32 state) + { + Map::PlayerList const& players = map->GetPlayers(); + + if (!players.isEmpty()) + { + for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + { + if (Player* player = itr->GetSource()) + player->SendUpdateWorldState(id, state); + } + } + } + + void SetHoldState(bool bOnHold) + { + SetEscortPaused(bOnHold); + } + + void JumpToNextStep(uint32 uiTimer) + { + phaseTimer = uiTimer; + ++step; + } + + void SpawnWave(uint32 waveId) + { + switch (waveId) + { + case 0: + me->SummonCreature(NPC_GUARDIAN, AllianceSpawn[0].x, AllianceSpawn[0].y, AllianceSpawn[0].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 1: + for (uint8 i = 0; i < WAVE_MAXCOUNT; ++i) + { + switch (urand(0, 12)) + { + case 0: + me->SummonCreature(NPC_DREADLORD, AllianceSpawn[1].x + rand32() % 5, AllianceSpawn[1].y + rand32() % 5, AllianceSpawn[1].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 1: + case 2: + case 3: + me->SummonCreature(NPC_DOCTOR, AllianceSpawn[1].x + rand32() % 5, AllianceSpawn[1].y + rand32() % 5, AllianceSpawn[1].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 4: + case 5: + case 6: + me->SummonCreature(NPC_FELBEAST, AllianceSpawn[1].x + rand32() % 5, AllianceSpawn[1].y + rand32() % 5, AllianceSpawn[1].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 7: + case 8: + case 9: + me->SummonCreature(NPC_BETRAYER, AllianceSpawn[1].x + rand32() % 5, AllianceSpawn[1].y + rand32() % 5, AllianceSpawn[1].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 10: + case 11: + case 12: + me->SummonCreature(NPC_COLLABORATOR, AllianceSpawn[1].x + rand32() % 5, AllianceSpawn[1].y + rand32() % 5, AllianceSpawn[1].z, TEMPSUMMON_DEAD_DESPAWN); + break; + } + } + break; + case 2: + for (uint8 i = 0; i < WAVE_MAXCOUNT; ++i) + { + switch (urand(0, 3)) + { + case 0: + me->SummonCreature(NPC_COLLABORATOR, AllianceSpawn[2].x - rand32() % 5, AllianceSpawn[2].y - rand32() % 5, AllianceSpawn[2].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 1: + me->SummonCreature(NPC_DOCTOR, AllianceSpawn[2].x - rand32() % 5, AllianceSpawn[2].y - rand32() % 5, AllianceSpawn[2].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 2: + me->SummonCreature(NPC_FELBEAST, AllianceSpawn[2].x - rand32() % 5, AllianceSpawn[2].y - rand32() % 5, AllianceSpawn[2].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 3: + me->SummonCreature(NPC_BETRAYER, AllianceSpawn[2].x - rand32() % 5, AllianceSpawn[2].y - rand32() % 5, AllianceSpawn[2].z, TEMPSUMMON_DEAD_DESPAWN); + break; + } + } + break; + case 3: + for (uint8 i = 0; i < WAVE_MAXCOUNT; ++i) + { + switch (urand(0, 4)) + { + case 0: + me->SummonCreature(NPC_GUARDIAN, AllianceSpawn[3].x - rand32() % 5, AllianceSpawn[3].y - rand32() % 5, AllianceSpawn[3].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 1: + case 2: + me->SummonCreature(NPC_CHEMIST, AllianceSpawn[3].x - rand32() % 5, AllianceSpawn[3].y - rand32() % 5, AllianceSpawn[3].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 3: + case 4: + me->SummonCreature(NPC_DOCTOR, AllianceSpawn[3].x - rand32() % 5, AllianceSpawn[3].y - rand32() % 5, AllianceSpawn[3].z, TEMPSUMMON_DEAD_DESPAWN); + break; + } + } + break; + case 4: + for (uint8 i = 0; i < WAVE_MAXCOUNT; ++i) + { + switch (urand(0, 5)) + { + case 0: + if (Unit* temp = me->SummonCreature(NPC_DOCTOR, AllianceSpawn[4].x - rand32() % 5, AllianceSpawn[4].y - rand32() % 5, AllianceSpawn[4].z, TEMPSUMMON_DEAD_DESPAWN)) + temp->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), false); + break; + case 1: + if (Unit* temp = me->SummonCreature(NPC_CHEMIST, AllianceSpawn[4].x - rand32() % 5, AllianceSpawn[4].y - rand32() % 5, AllianceSpawn[4].z, TEMPSUMMON_DEAD_DESPAWN)) + temp->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), false); + break; + case 2: + if (Unit* temp = me->SummonCreature(NPC_BETRAYER, AllianceSpawn[4].x - rand32() % 5, AllianceSpawn[4].y - rand32() % 5, AllianceSpawn[4].z, TEMPSUMMON_DEAD_DESPAWN)) + temp->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), false); + break; + case 3: + if (Unit* temp = me->SummonCreature(NPC_DOCTOR, AllianceSpawn[5].x - rand32() % 5, AllianceSpawn[5].y - rand32() % 5, AllianceSpawn[5].z, TEMPSUMMON_DEAD_DESPAWN)) + temp->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), false); + break; + case 4: + if (Unit* temp = me->SummonCreature(NPC_CHEMIST, AllianceSpawn[5].x - rand32() % 5, AllianceSpawn[5].y - rand32() % 5, AllianceSpawn[5].z, TEMPSUMMON_DEAD_DESPAWN)) + temp->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), false); + break; + case 5: + if (Unit* temp = me->SummonCreature(NPC_BETRAYER, AllianceSpawn[5].x - rand32() % 5, AllianceSpawn[5].y - rand32() % 5, AllianceSpawn[5].z, TEMPSUMMON_DEAD_DESPAWN)) + temp->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), false); + break; + } + } + break; + case 5: + for (uint8 i = 0; i < WAVE_MAXCOUNT; ++i) + if (Unit* temp = me->SummonCreature(NPC_GUARDIAN, AllianceSpawn[6].x - rand32() % 5, AllianceSpawn[6].y - rand32() % 5, AllianceSpawn[6].z, TEMPSUMMON_DEAD_DESPAWN)) + temp->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), false); + break; + case 6: + if (Unit* temp = me->SummonCreature(NPC_BLIGHTWORM, AllianceSpawn[7].x, AllianceSpawn[7].y, AllianceSpawn[7].z, TEMPSUMMON_MANUAL_DESPAWN)) + { + blightWormGUID = temp->GetGUID(); + temp->AddThreat(me, 100.0f); + me->AddThreat(temp, 100.0f); + if (Creature* jaina = ObjectAccessor::GetCreature(*me, jainaGUID)) + { + temp->AddThreat(jaina, 100.0f); + jaina->AddThreat(temp, 100.0f); + } + } + if (Unit* temp = me->SummonCreature(NPC_KHANOK, HordeSpawn[0].x, HordeSpawn[0].y, HordeSpawn[0].z, TEMPSUMMON_MANUAL_DESPAWN)) + { + khanokGUID = temp->GetGUID(); + if (Creature* khanok = ObjectAccessor::GetCreature(*me, khanokGUID)) + khanok->setDeathState(JUST_DIED); + } + if (Unit* temp = me->SummonCreature(NPC_PUTRESS, AllianceSpawn[12].x, AllianceSpawn[12].y, AllianceSpawn[12].z, TEMPSUMMON_MANUAL_DESPAWN)) + { + putressGUID = temp->GetGUID(); + temp->CastSpell(temp, SPELL_PUTRESS_CASTING_STATE); + } + for (uint8 i = 0; i < GENERATOR_MAXCOUNT; ++i) + { + switch (i) + { + case 0: + if (Unit* temp = me->SummonCreature(NPC_GENERATOR, 1433.142212f, 402.493835f, -80.515945f, TEMPSUMMON_MANUAL_DESPAWN)) + { + generatorGUID[i] = temp->GetGUID(); + if (Creature* putress = ObjectAccessor::GetCreature(*me, putressGUID)) + temp->CastSpell(putress, SPELL_BLIGHT_EMPOWERMENT); + } + break; + case 1: + if (Unit* temp = me->SummonCreature(NPC_GENERATOR, 1428.677979f, 399.753418f, -79.141609f, TEMPSUMMON_MANUAL_DESPAWN)) + { + generatorGUID[i] = temp->GetGUID(); + if (Creature* putress = ObjectAccessor::GetCreature(*me, putressGUID)) + temp->CastSpell(putress, SPELL_BLIGHT_EMPOWERMENT, false, 0, 0, generatorGUID[0]); + } + break; + case 2: + if (Unit* temp = me->SummonCreature(NPC_GENERATOR, 1425.163330f, 402.268951f, -79.299744f, TEMPSUMMON_MANUAL_DESPAWN)) + { + generatorGUID[i] = temp->GetGUID(); + if (Creature* putress = ObjectAccessor::GetCreature(*me, putressGUID)) + temp->CastSpell(putress, SPELL_BLIGHT_EMPOWERMENT, false, 0, 0, generatorGUID[0]); + } + break; + case 3: + if (Unit* temp = me->SummonCreature(NPC_GENERATOR, 1427.323242f, 406.853088f, -78.195641f, TEMPSUMMON_MANUAL_DESPAWN)) + { + generatorGUID[i] = temp->GetGUID(); + if (Creature* putress = ObjectAccessor::GetCreature(*me, putressGUID)) + temp->CastSpell(putress, SPELL_BLIGHT_EMPOWERMENT, false, 0, 0, generatorGUID[0]); + } + break; + case 4: + if (Unit* temp = me->SummonCreature(NPC_GENERATOR, 1432.465210f, 407.460022f, -81.689384f, TEMPSUMMON_MANUAL_DESPAWN)) + { + generatorGUID[i] = temp->GetGUID(); + if (Creature* putress = ObjectAccessor::GetCreature(*me, putressGUID)) + temp->CastSpell(putress, SPELL_BLIGHT_EMPOWERMENT, false, 0, 0, generatorGUID[0]); + } + break; + } + } + break; + case 7: + if (Unit* temp = me->SummonCreature(NPC_SW_SOLDIER, AllianceSpawn[8].x, AllianceSpawn[8].y, AllianceSpawn[8].z, 0, TEMPSUMMON_TIMED_DESPAWN, 90000)) + temp->GetMotionMaster()->MovePath(NPC_SW_SOLDIER * 10, false); + if (Unit* temp = me->SummonCreature(NPC_SW_SOLDIER, AllianceSpawn[8].x, AllianceSpawn[8].y, AllianceSpawn[8].z, 0, TEMPSUMMON_TIMED_DESPAWN, 90000)) + temp->GetMotionMaster()->MovePath((NPC_SW_SOLDIER * 10) + 1, false); + if (Unit* temp = me->SummonCreature(NPC_SW_SOLDIER, AllianceSpawn[8].x, AllianceSpawn[8].y, AllianceSpawn[8].z, 0, TEMPSUMMON_TIMED_DESPAWN, 90000)) + temp->GetMotionMaster()->MovePath((NPC_SW_SOLDIER * 10) + 2, false); + if (Unit* temp = me->SummonCreature(NPC_SW_SOLDIER, AllianceSpawn[8].x, AllianceSpawn[8].y, AllianceSpawn[8].z, 0, TEMPSUMMON_TIMED_DESPAWN, 90000)) + temp->GetMotionMaster()->MovePath((NPC_SW_SOLDIER * 10) + 3, false); + break; + case 8: + break; + case 9: + for (uint8 i = 0; i < WAVE_MAXCOUNT; ++i) + me->SummonCreature(NPC_GUARDIAN, AllianceSpawn[10].x + rand32() % 13, AllianceSpawn[10].y + rand32() % 13, AllianceSpawn[10].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 10: + if (Unit* temp = me->SummonCreature(NPC_DREADLORD, AllianceSpawn[11].x, AllianceSpawn[11].y, AllianceSpawn[11].z, TEMPSUMMON_DEAD_DESPAWN)) + { + temp->GetMotionMaster()->MovePath(NPC_DREADLORD * 10, false); + temp->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true); + temp->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK_DEST, true); + } + break; + case 11: + for (uint8 i = 0; i < WAVE_MAXCOUNT; ++i) + { + switch (urand(0, 3)) + { + case 0: + if (Unit* temp = me->SummonCreature(NPC_EXPERIMENT, AllianceSpawn[13].x + rand32() % 5, AllianceSpawn[13].y + rand32() % 5, AllianceSpawn[13].z, TEMPSUMMON_DEAD_DESPAWN)) + temp->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()); + break; + case 1: + if (Unit* temp = me->SummonCreature(NPC_EXPERIMENT, AllianceSpawn[14].x + rand32() % 5, AllianceSpawn[14].y + rand32() % 5, AllianceSpawn[14].z, TEMPSUMMON_DEAD_DESPAWN)) + temp->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()); + break; + case 2: + if (Unit* temp = me->SummonCreature(NPC_EXPERIMENT, AllianceSpawn[15].x + rand32() % 5, AllianceSpawn[15].y + rand32() % 5, AllianceSpawn[15].z, TEMPSUMMON_DEAD_DESPAWN)) + temp->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()); + break; + case 3: + if (Unit* temp = me->SummonCreature(NPC_EXPERIMENT, AllianceSpawn[16].x + rand32() % 5, AllianceSpawn[16].y + rand32() % 5, AllianceSpawn[16].z, TEMPSUMMON_DEAD_DESPAWN)) + temp->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()); + break; + } + } + break; + case 12: + if (Creature* temp = me->SummonCreature(NPC_THRALL, AllianceSpawn[17].x, AllianceSpawn[17].y, AllianceSpawn[17].z, TEMPSUMMON_MANUAL_DESPAWN)) + { + thrallGUID = temp->GetGUID(); + temp->SetReactState(REACT_PASSIVE); + temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC); + temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + temp->CastSpell(temp, SPELL_THRALL_BUFF); + temp->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY2H); + } + if (Creature* temp = me->SummonCreature(NPC_SYLVANAS, AllianceSpawn[18].x, AllianceSpawn[18].y, AllianceSpawn[18].z, TEMPSUMMON_MANUAL_DESPAWN)) + { + sylvanasGUID = temp->GetGUID(); + temp->SetReactState(REACT_PASSIVE); + temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC); + temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + temp->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY2H); + } + for (uint8 i = 0; i < HORDE_FORCE_MAXCOUNT; ++i) + { + if (Creature* temp = me->SummonCreature(NPC_HORDE_SOLDIER, AllianceSpawn[i + 19].x, AllianceSpawn[i + 19].y, AllianceSpawn[i + 19].z, TEMPSUMMON_MANUAL_DESPAWN)) + { + hordeForcesGUID[i] = temp->GetGUID(); + temp->SetReactState(REACT_PASSIVE); + temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC); + temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + temp->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY2H); + } + } + break; + case 13: + for (uint8 i = 0; i < ALLIANCE_FORCE_MAXCOUNT; ++i) + { + if (Unit* temp = me->SummonCreature(NPC_SW_SOLDIER, AllianceSpawn[i + 25].x, AllianceSpawn[i + 25].y, AllianceSpawn[i + 25].z, AllianceSpawn[i + 25].o, TEMPSUMMON_MANUAL_DESPAWN)) + { + allianceForcesGUID[i] = temp->GetGUID(); + temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC); + temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + temp->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY2H); + } + } + break; + } + } + + void WaypointReached(uint32 waypointId) override + { + switch (waypointId) + { + case 0: + SetHoldState(true); + bStepping = true; + break; + case 2: + SetHoldState(true); + bStepping = true; + break; + case 38: + if (Creature* jaina = ObjectAccessor::GetCreature(*me, jainaGUID)) + { + jaina->GetMotionMaster()->Clear(); + jaina->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC); + jaina->SetReactState(REACT_AGGRESSIVE); + } + SetHoldState(true); + bStepping = true; + break; + case 45: + SetHoldState(true); + bStepping = true; + if (Creature* jaina = ObjectAccessor::GetCreature(*me, jainaGUID)) + { + jaina->GetMotionMaster()->Clear(); + jaina->GetMotionMaster()->MovePoint(0, AllianceWP[6].x, AllianceWP[6].y, AllianceWP[6].z); + } + break; + case 46: + SetHoldState(true); + bStepping = true; + break; + case 48: + if (Creature* putress = ObjectAccessor::GetCreature(*me, putressGUID)) + putress->AI()->Talk(PUTRESS_SAY_2); + if (Player* player = GetPlayerForEscort()) + player->PlayDirectSound(SOUND_PUTRESS, player); + break; + case 50: + SetHoldState(true); + bStepping = true; + break; + case 63: + SetHoldState(true); + bStepping = true; + break; + case 65: + SetHoldState(true); + bStepping = true; + break; + case 66: + SetHoldState(true); + bStepping = true; + break; + case 87: + SetHoldState(true); + bStepping = true; + break; + case 88: + SetHoldState(true); + bStepping = true; + break; + } + } + + void UpdateAI(uint32 diff) override + { + npc_escortAI::UpdateAI(diff); + + if (bStepping) + { + if (phaseTimer <= diff) + { + switch (step) + { + //Preparation + case 0: + me->setActive(true); + UpdateWorldState(me->GetMap(), WORLD_STATE_MANHUNT_COUNTDOWN_A, 1); + Talk(WRYNN_SAY_PREP_1); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 1: + Talk(WRYNN_SAY_PREP_2); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 2: + Talk(WRYNN_SAY_PREP_3); + JumpToNextStep(20 * IN_MILLISECONDS); + break; + case 3: + Talk(WRYNN_SAY_PREP_4); + JumpToNextStep(20 * IN_MILLISECONDS); + break; + case 4: + UpdateWorldState(me->GetMap(), WORLD_STATE_MANHUNT_COUNTDOWN_A, 0); + UpdateWorldState(me->GetMap(), WORLD_STATE_MANHUNT_STARTS_A, 1); + Talk(WRYNN_SAY_PREP_5); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 5: + if (Player* player = GetPlayerForEscort()) + player->CastSpell(player, SPELL_WRYNN_BUFF); + JumpToNextStep(3 * IN_MILLISECONDS); + break; + case 6: + Talk(WRYNN_SAY_PREP_6); + JumpToNextStep(1 * IN_MILLISECONDS); + break; + case 7: + SetEscortPaused(false); + JumpToNextStep(1.5 * IN_MILLISECONDS); + break; + case 8: + if (Creature* jaina = ObjectAccessor::GetCreature(*me, jainaGUID)) + { + jaina->GetMotionMaster()->MovePath(NPC_JAINA * 10, false); + jaina->setActive(true); + } + bStepping = false; + JumpToNextStep(0); + break; + //Sewers + case 9: + Talk(WRYNN_SAY_SEWERS_1); + SpawnWave(0); + SpawnWave(1); + SpawnWave(2); + SpawnWave(3); + JumpToNextStep(9500); + break; + case 10: + if (Creature* jaina = ObjectAccessor::GetCreature(*me, jainaGUID)) + jaina->AI()->Talk(JAINA_SAY_SEWERS_1); + JumpToNextStep(2 * IN_MILLISECONDS); + break; + case 11: + if (Creature* jaina = ObjectAccessor::GetCreature(*me, jainaGUID)) + jaina->AI()->DoCast(SPELL_JAINA_BUFF); + JumpToNextStep(1 * IN_MILLISECONDS); + break; + case 12: + SetEscortPaused(false); + UpdateWorldState(me->GetMap(), WORLD_STATE_MANHUNT_STARTS_A, 0); + UpdateWorldState(me->GetMap(), WORLD_STATE_SEWERS_FIGHT_A, 1); + JumpToNextStep(1 * IN_MILLISECONDS); + break; + case 13: + if (Creature* jaina = ObjectAccessor::GetCreature(*me, jainaGUID)) + { + jaina->GetMotionMaster()->MoveFollow(me, 5, PET_FOLLOW_ANGLE); + jaina->SetReactState(REACT_AGGRESSIVE); + jaina->setFaction(FACTION_ESCORT_N_NEUTRAL_ACTIVE); + } + bStepping = false; + JumpToNextStep(0); + break; + case 14: + Talk(WRYNN_SAY_SEWERS_2); + JumpToNextStep(3.5 * IN_MILLISECONDS); + break; + case 15: + SpawnWave(4); + JumpToNextStep(15 * IN_MILLISECONDS); + break; + case 16: + SpawnWave(5); + JumpToNextStep(15 * IN_MILLISECONDS); + break; + case 17: + SpawnWave(4); + JumpToNextStep(15 * IN_MILLISECONDS); + break; + case 18: + SpawnWave(4); + JumpToNextStep(15 * IN_MILLISECONDS); + break; + case 19: + SpawnWave(5); + JumpToNextStep(15 * IN_MILLISECONDS); + break; + case 20: + SpawnWave(6); + bStepping = false; + JumpToNextStep(0); + break; + case 21: + Talk(WRYNN_SAY_SEWERS_3); + SpawnWave(7); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 22: + Talk(WRYNN_SAY_SEWERS_4); + SetRun(false); + if (Creature* jaina = ObjectAccessor::GetCreature(*me, jainaGUID)) + { + jaina->GetMotionMaster()->Clear(); + jaina->GetMotionMaster()->MoveFollow(me, 1, 0); + } + JumpToNextStep(5 * IN_MILLISECONDS); + break; + case 23: + bStepping = false; + SetEscortPaused(false); + JumpToNextStep(0); + break; + //Apothecarium + case 24: + if (Creature* jaina = ObjectAccessor::GetCreature(*me, jainaGUID)) + jaina->AI()->Talk(JAINA_SAY_APO_1); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 25: + SetEscortPaused(false); + bStepping = false; + JumpToNextStep(0); + break; + case 26: + me->SetStandState(UNIT_STAND_STATE_KNEEL); + me->SetTarget(khanokGUID); + JumpToNextStep(1 * IN_MILLISECONDS); + break; + case 27: + Talk(WRYNN_SAY_APO_1); + JumpToNextStep(12 * IN_MILLISECONDS); + break; + case 28: + Talk(WRYNN_SAY_APO_2); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 29: + Talk(WRYNN_SAY_APO_3); + JumpToNextStep(1.5 * IN_MILLISECONDS); + break; + case 30: + UpdateWorldState(me->GetMap(), WORLD_STATE_APOTHECARIUM_FIGHT_A, 1); + if (Creature* putress = ObjectAccessor::GetCreature(*me, putressGUID)) + putress->AI()->Talk(PUTRESS_SAY_1); + if (Player* player = GetPlayerForEscort()) + player->PlayDirectSound(SOUND_PUTRESS, player); + SpawnWave(9); + JumpToNextStep(3 * IN_MILLISECONDS); + break; + case 31: + SetRun(true); + if (Creature* jaina = ObjectAccessor::GetCreature(*me, jainaGUID)) + jaina->GetMotionMaster()->MoveFollow(me, 1, 0); + SetEscortPaused(false); + bStepping = false; + JumpToNextStep(0); + break; + case 32: + Talk(WRYNN_SAY_APO_4); + SpawnWave(10); + JumpToNextStep(0.35 * IN_MILLISECONDS); + break; + case 33: + SpawnWave(10); + JumpToNextStep(0.35 * IN_MILLISECONDS); + break; + case 34: + SpawnWave(10); + JumpToNextStep(0.35 * IN_MILLISECONDS); + break; + case 35: + SpawnWave(10); + JumpToNextStep(0.35 * IN_MILLISECONDS); + break; + case 36: + SpawnWave(10); + JumpToNextStep(0.35 * IN_MILLISECONDS); + break; + case 37: + SpawnWave(10); + JumpToNextStep(0.35 * IN_MILLISECONDS); + break; + case 38: + SpawnWave(10); + JumpToNextStep(0.35 * IN_MILLISECONDS); + break; + case 39: + SpawnWave(10); + JumpToNextStep(0.35 * IN_MILLISECONDS); + break; + case 40: + SpawnWave(10); + JumpToNextStep(0.35 * IN_MILLISECONDS); + break; + case 41: + SpawnWave(10); + JumpToNextStep(0.35 * IN_MILLISECONDS); + break; + case 42: + SpawnWave(10); + JumpToNextStep(0.35 * IN_MILLISECONDS); + break; + case 43: + SetEscortPaused(false); + bStepping = false; + JumpToNextStep(0); + break; + case 44: + Talk(WRYNN_SAY_APO_5); + if (Creature* jaina = ObjectAccessor::GetCreature(*me, jainaGUID)) + { + jaina->GetMotionMaster()->Clear(); + jaina->GetMotionMaster()->MovePoint(0, AllianceWP[7].x, AllianceWP[7].y, AllianceWP[7].z, false); + } + JumpToNextStep(5 * IN_MILLISECONDS); + break; + case 45: + SetEscortPaused(false); + bStepping = false; + JumpToNextStep(0); + break; + case 46: + Talk(WRYNN_SAY_APO_6); + JumpToNextStep(4 * IN_MILLISECONDS); + break; + case 47: + if (Creature* putress = ObjectAccessor::GetCreature(*me, putressGUID)) + putress->AI()->Talk(PUTRESS_SAY_3); + SpawnWave(11); + JumpToNextStep(7.5 * IN_MILLISECONDS); + break; + case 48: + if (Creature* putress = ObjectAccessor::GetCreature(*me, putressGUID)) + putress->AI()->Talk(PUTRESS_SAY_4); + JumpToNextStep(7.5 * IN_MILLISECONDS); + break; + case 49: + if (Creature* putress = ObjectAccessor::GetCreature(*me, putressGUID)) + putress->AI()->Talk(PUTRESS_SAY_5); + SpawnWave(11); + JumpToNextStep(7.5 * IN_MILLISECONDS); + break; + case 50: + if (Creature* putress = ObjectAccessor::GetCreature(*me, putressGUID)) + putress->AI()->Talk(PUTRESS_SAY_6); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 51: + if (Creature* putress = ObjectAccessor::GetCreature(*me, putressGUID)) + putress->AI()->Talk(PUTRESS_SAY_7); + SpawnWave(11); + JumpToNextStep(7.5 * IN_MILLISECONDS); + break; + case 52: + if (Creature* putress = ObjectAccessor::GetCreature(*me, putressGUID)) + { + putress->AI()->Talk(PUTRESS_SAY_8); + putress->AI()->DoCast(SPELL_BLIGHT_OVERLOAD); + } + JumpToNextStep(0.5 * IN_MILLISECONDS); + break; + case 53: + if (Creature* putress = ObjectAccessor::GetCreature(*me, putressGUID)) + { + putress->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC); + putress->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + putress->AddThreat(me, 100.0f); + me->AddThreat(putress, 100.0f); + putress->RemoveAura(SPELL_PUTRESS_CASTING_STATE); + } + bStepping = false; + JumpToNextStep(0); + break; + case 54: + Talk(WRYNN_SAY_APO_7); + SetRun(false); + JumpToNextStep(4 * IN_MILLISECONDS); + break; + case 55: + if (ObjectAccessor::GetCreature(*me, putressGUID)) + me->SetTarget(putressGUID); + Talk(WRYNN_SAY_APO_8); + JumpToNextStep(4 * IN_MILLISECONDS); + break; + case 56: + Talk(WRYNN_SAY_APO_9); + me->RemoveStandFlags(UNIT_STAND_STATE_KNEEL); + me->SetStandFlags(UNIT_STAND_STATE_STAND); + SetEscortPaused(false); + bStepping = false; + JumpToNextStep(0); + break; + case 57: + JumpToNextStep(4 * IN_MILLISECONDS); + break; + case 58: + Talk(WRYNN_SAY_APO_10); + JumpToNextStep(7.5 * IN_MILLISECONDS); + break; + case 59: + Talk(WRYNN_SAY_APO_11); + JumpToNextStep(7.5 * IN_MILLISECONDS); + break; + case 60: + Talk(WRYNN_SAY_APO_12); + SpawnWave(12); // thrall sylvanas horde soldiers + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 61: + if (Creature* thrall = ObjectAccessor::GetCreature(*me, thrallGUID)) + thrall->AI()->Talk(THRALL_SAY_THRONE_A_1); + if (Player* player = GetPlayerForEscort()) + player->PlayDirectSound(SOUND_THRALL_1, player); + JumpToNextStep(3 * IN_MILLISECONDS); + break; + case 62: + if (Creature* thrall = ObjectAccessor::GetCreature(*me, thrallGUID)) + thrall->AI()->Talk(THRALL_SAY_THRONE_A_2); + if (Player* player = GetPlayerForEscort()) + player->PlayDirectSound(SOUND_THRALL_2, player); + JumpToNextStep(5 * IN_MILLISECONDS); + break; + case 63: + Talk(WRYNN_SAY_THRONE_1); + JumpToNextStep(3 * IN_MILLISECONDS); + break; + case 64: + Talk(WRYNN_SAY_THRONE_2); + JumpToNextStep(1.5 * IN_MILLISECONDS); + break; + case 65: + SetRun(true); + SetEscortPaused(false); + JumpToNextStep(0.25 * IN_MILLISECONDS); + break; + case 66: + if (Creature* jaina = ObjectAccessor::GetCreature(*me, jainaGUID)) + jaina->AI()->Talk(JAINA_SAY_THRONE_1); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC); + bStepping = false; + JumpToNextStep(0); + break; + case 67: + Talk(WRYNN_SAY_THRONE_3); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 68: + Talk(WRYNN_SAY_THRONE_4); + if (Creature* jaina = ObjectAccessor::GetCreature(*me, jainaGUID)) + { + jaina->GetMotionMaster()->MovePoint(0, AllianceWP[8].x, AllianceWP[8].y, AllianceWP[8].z); + jaina->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC); + jaina->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + } + SetEscortPaused(false); + bStepping = false; + JumpToNextStep(0); + break; + case 69: + Talk(WRYNN_SAY_THRONE_5); + SpawnWave(13); //alliance soldiers + JumpToNextStep(15 * IN_MILLISECONDS); + break; + case 70: + Talk(WRYNN_SAY_THRONE_6); + JumpToNextStep(15 * IN_MILLISECONDS); + break; + case 71: + Talk(WRYNN_SAY_THRONE_7); + JumpToNextStep(16.5 * IN_MILLISECONDS); + break; + case 72: + Talk(WRYNN_SAY_THRONE_8); + JumpToNextStep(6 * IN_MILLISECONDS); + break; + case 73: + Talk(WRYNN_SAY_THRONE_9); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_IMMUNE_TO_PC); + if (Creature* thrall = ObjectAccessor::GetCreature(*me, thrallGUID)) + { + thrall->SetReactState(REACT_AGGRESSIVE); + thrall->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC); + thrall->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + thrall->AddThreat(me, 100.0f); + me->AddThreat(thrall, 100.0f); + thrall->AI()->AttackStart(me); + } + if (Creature* sylvanas = ObjectAccessor::GetCreature(*me, sylvanasGUID)) + { + sylvanas->SetReactState(REACT_AGGRESSIVE); + sylvanas->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC); + sylvanas->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + sylvanas->AddThreat(me, 100.0f); + sylvanas->AI()->AttackStart(me); + me->AddThreat(sylvanas, 100.0f); + } + for (uint8 i = 0; i < HORDE_FORCE_MAXCOUNT; ++i) + { + if (Creature* temp = ObjectAccessor::GetCreature(*me, hordeForcesGUID[i])) + { + temp->SetReactState(REACT_AGGRESSIVE); + temp->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC); + temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + } + } + for (uint8 i = 0; i < ALLIANCE_FORCE_MAXCOUNT; ++i) + { + if (Creature* temp = ObjectAccessor::GetCreature(*me, allianceForcesGUID[i])) + { + if (Creature* temp2 = ObjectAccessor::GetCreature(*me, hordeForcesGUID[i])) + { + temp->SetReactState(REACT_AGGRESSIVE); + temp2->SetReactState(REACT_AGGRESSIVE); + temp->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_IMMUNE_TO_PC); + temp2->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_IMMUNE_TO_PC); + temp->AddThreat(temp2, 100.0f); + temp->AI()->AttackStart(temp2); + temp2->AddThreat(temp, 100.0f); + } + } + } + JumpToNextStep(6 * IN_MILLISECONDS); + break; + case 74: + if (Creature* jaina = ObjectAccessor::GetCreature(*me, jainaGUID)) + { + jaina->GetMotionMaster()->MovePoint(0, AllianceWP[9].x, AllianceWP[9].y, AllianceWP[9].z); + jaina->AI()->Talk(JAINA_SAY_THRONE_2); + } + JumpToNextStep(8 * IN_MILLISECONDS); + break; + case 75: + if (Creature* jaina = ObjectAccessor::GetCreature(*me, jainaGUID)) + { + jaina->AI()->DoCastAOE(SPELL_DEEPFREEZE); + jaina->AI()->Talk(JAINA_SAY_THRONE_3); + } + JumpToNextStep(5 * IN_MILLISECONDS); + break; + case 76: + std::list HelperList; + me->GetCreatureListWithEntryInGrid(HelperList, NPC_SW_SOLDIER, 100.0f); + me->GetCreatureListWithEntryInGrid(HelperList, NPC_HORDE_SOLDIER, 100.0f); + me->GetCreatureListWithEntryInGrid(HelperList, NPC_JAINA, 100.0f); + me->GetCreatureListWithEntryInGrid(HelperList, NPC_SYLVANAS, 100.0f); + me->GetCreatureListWithEntryInGrid(HelperList, NPC_THRALL, 100.0f); + if (!HelperList.empty()) + for (std::list::iterator itr = HelperList.begin(); itr != HelperList.end(); itr++) + (*itr)->DespawnOrUnsummon(); + if (Map *map = me->GetMap()) + { + Map::PlayerList const &PlayerList = map->GetPlayers(); + for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) + { + if (Player *player = i->GetSource()) + { + if (me->IsInRange(player, 0.0f, 50.0f)) + { + if (player->GetTeamId() == TEAM_ALLIANCE) + { + player->RemoveAura(SPELL_WRYNN_BUFF); + player->RemoveAura(SPELL_JAINA_BUFF); + player->CompleteQuest(QUEST_BATTLE_A); + player->NearTeleportTo(-8445.213867f, 337.384277f, 121.746056f, 5.401534f, false); + } + } + } + } + } + UpdateWorldState(me->GetMap(), WORLD_STATE_MANHUNT_STARTS_A, 0); + UpdateWorldState(me->GetMap(), WORLD_STATE_SEWERS_DONE_A, 0); + UpdateWorldState(me->GetMap(), WORLD_STATE_APOTHECARIUM_DONE_A, 0); + me->DespawnOrUnsummon(); + break; + } + } + else phaseTimer -= diff; + } + + if (!UpdateVictim()) + return; + + _events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_WHIRLWIND: + DoCast(me, SPELL_WHIRLWIND); + _events.ScheduleEvent(EVENT_WHIRLWIND, 20 * IN_MILLISECONDS); + break; + case EVENT_HEROIC_LEAP: + DoCastVictim(SPELL_HEROIC_LEAP); + _events.ScheduleEvent(EVENT_HEROIC_LEAP, urand(15, 30) * IN_MILLISECONDS); + break; + case EVENT_AGGRO_JAINA: + if (me->GetVictim()) + if (Creature* jaina = ObjectAccessor::GetCreature(*me, jainaGUID)) + jaina->AI()->AttackStart(me->GetVictim()); DoCast(me, SPELL_THUNDER); + _events.ScheduleEvent(EVENT_AGGRO_JAINA, 2 * IN_MILLISECONDS); + break; + case EVENT_WRYNN_BUFF: + if (Player* player = GetPlayerForEscort()) + player->CastSpell(player, SPELL_WRYNN_BUFF); + _events.ScheduleEvent(EVENT_WRYNN_BUFF, 10 * IN_MILLISECONDS); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_varian_wrynnAI(creature); + } +}; + +/*###### +## npc_jaina_proudmoore +######*/ + +class npc_jaina_proudmoore_bfu : public CreatureScript +{ +public: + npc_jaina_proudmoore_bfu() : CreatureScript("npc_jaina_proudmoore_bfu") { } + + struct npc_jaina_proudmoore_bfuAI : public ScriptedAI + { + npc_jaina_proudmoore_bfuAI(Creature* creature) : ScriptedAI(creature) + { + Reset(); + } + + void Reset() override + { + me->SetCorpseDelay(1); + me->SetRespawnTime(1); + _events.ScheduleEvent(EVENT_FIREBALL, 1 * IN_MILLISECONDS); + _events.ScheduleEvent(EVENT_BLIZZARD, 8 * IN_MILLISECONDS); + _events.ScheduleEvent(EVENT_ELEMENTAL, 30 * IN_MILLISECONDS); + me->ApplySpellImmune(0, IMMUNITY_ID, SPELL_THRALL_BUFF, true); + me->ApplySpellImmune(0, IMMUNITY_ID, SPELL_SYLVANAS_BUFF, true); + } + + void UpdateAI(uint32 diff) override + { + if (!me->GetVictim()) + return; + + _events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_FIREBALL: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + DoCast(target, SPELL_FIREBALL); + _events.ScheduleEvent(EVENT_FIREBALL, 3 * IN_MILLISECONDS); + break; + case EVENT_BLIZZARD: + DoCast(SPELL_BLIZZARD); + _events.ScheduleEvent(EVENT_BLIZZARD, 15 * IN_MILLISECONDS); + break; + case EVENT_ELEMENTAL: + DoCast(SPELL_ELEMENTALS); + _events.ScheduleEvent(EVENT_ELEMENTAL, 90 * IN_MILLISECONDS); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + + private: + EventMap _events; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_jaina_proudmoore_bfuAI(creature); + } +}; + +/*###### +## ENEMY +#######*/ + +/*###### +## boss_blight_worm +######*/ + +class boss_blight_worm : public CreatureScript +{ +public: + boss_blight_worm() : CreatureScript("boss_blight_worm") { } + + struct boss_blight_wormAI : public ScriptedAI + { + boss_blight_wormAI(Creature* creature) : ScriptedAI(creature) + { + SetCombatMovement(false); + } + + void Reset() override + { + _events.ScheduleEvent(EVENT_INFEST, 2 * IN_MILLISECONDS); + _events.ScheduleEvent(EVENT_BLIGHT_BREATH, 7.5 * IN_MILLISECONDS); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + _events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_INFEST: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0, true)) + DoCast(target, SPELL_INGEST); + _events.ScheduleEvent(EVENT_INFEST, 20 * IN_MILLISECONDS); + break; + case EVENT_BLIGHT_BREATH: + DoCast(SPELL_BLIGHT_BREATH); + _events.ScheduleEvent(EVENT_BLIGHT_BREATH, 15 * IN_MILLISECONDS); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + + private: + EventMap _events; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new boss_blight_wormAI(creature); + } +}; + +/*###### +## Spells +######*/ + +// - 61123 - Ingest +class spell_blight_worm_ingest : public SpellScriptLoader +{ +public: + spell_blight_worm_ingest() : SpellScriptLoader("spell_blight_worm_ingest") { } + + class spell_blight_worm_ingest_SpellScript : public SpellScript + { + PrepareSpellScript(spell_blight_worm_ingest_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_INGEST)) + return false; + return true; + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + if (Unit* target = GetHitUnit()) + if (Unit* caster = GetCaster()) + target->CastSpell(caster, SPELL_INGEST_TRIGGER, true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_blight_worm_ingest_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_blight_worm_ingest_SpellScript(); + } +}; + +class spell_undercity_buffs : public SpellScriptLoader +{ +public: + spell_undercity_buffs() : SpellScriptLoader("spell_undercity_buffs") { } + + class spell_undercity_buffs_AuraScript : public AuraScript + { + PrepareAuraScript(spell_undercity_buffs_AuraScript); + + // Add Update for Areacheck + void CalcPeriodic(AuraEffect const* /*effect*/, bool& isPeriodic, int32& amplitude) + { + isPeriodic = true; + amplitude = 5 * IN_MILLISECONDS; + } + + void Update(AuraEffect* /*effect*/) + { + if (Player* owner = GetUnitOwner()->ToPlayer()) + { + if (owner->GetZoneId() != ZONE_TIRISFAL && owner->GetZoneId() != ZONE_UNDERCITY) + owner->RemoveAura(GetSpellInfo()->Id); + } + } + + void Register() + { + DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_undercity_buffs_AuraScript::CalcPeriodic, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE); + OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_undercity_buffs_AuraScript::Update, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_undercity_buffs_AuraScript(); + } +}; + +/*###### +## HORDE +#######*/ + +/*###### +## npc_thrall_bfu +######*/ + +class npc_thrall_bfu : public CreatureScript +{ +public: + npc_thrall_bfu() : CreatureScript("npc_thrall_bfu") { } + + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override + { + player->PlayerTalkClass->ClearMenus(); + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: + { + player->CLOSE_GOSSIP_MENU(); + if (auto thrall_ai = CAST_AI(npc_thrall_bfu::npc_thrall_bfuAI, creature->AI())) + { + if (Creature* sylvannas = GetClosestCreatureWithEntry(creature, NPC_SYLVANAS, 50.0f)) + { + thrall_ai->sylvanasfollowGUID = sylvannas->GetGUID(); + thrall_ai->Start(true, true, player->GetGUID()); + thrall_ai->SetDespawnAtEnd(false); + thrall_ai->SetDespawnAtFar(false); + } + else + thrall_ai->sylvanasfollowGUID = 0; + } + break; + } + } + return true; + } + + bool OnGossipHello(Player* player, Creature* creature) override + { + if (creature->IsQuestGiver()) + player->PrepareQuestMenu(creature->GetGUID()); + + if (player->GetQuestStatus(QUEST_BATTLE_H) == QUEST_STATUS_INCOMPLETE) + player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_THRALL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + + player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); + + return true; + } + + bool OnQuestReward(Player* player, Creature* /*creature*/, Quest const* quest, uint32 /*item*/) override + { + if (quest->GetQuestId() == QUEST_BATTLE_H) + { + player->RemoveAura(SPELL_THRALL_BUFF); + player->RemoveAura(SPELL_SYLVANAS_BUFF); + player->CastSpell(player, SPELL_TELEPORT_OG, true); + } + + return true; + } + + struct npc_thrall_bfuAI : public npc_escortAI + { + npc_thrall_bfuAI(Creature* creature) : npc_escortAI(creature) + { + memset(allianceForcesGUID, 0, sizeof(allianceForcesGUID)); + } + + bool bStepping; + bool EnableAttack; + + uint32 step; + uint32 phaseTimer; + + uint64 sylvanasfollowGUID; + uint64 allianceForcesGUID[ALLIANCE_FORCE_MAXCOUNT]; + uint64 ValimathrasGUID; + uint64 ValimathrasPortalGUID; + uint64 WrynnGUID; + uint64 JainaGUID; + uint64 SaurfangGUID; + + EventMap _events; + + void Reset() override + { + if (!HasEscortState(STATE_ESCORT_ESCORTING)) + { + me->Mount(MODEL_WHITE_WULF); + me->SetCorpseDelay(1); + me->SetRespawnTime(1); + me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + me->ApplySpellImmune(0, IMMUNITY_ID, SPELL_SYLVANAS_BUFF, true); + + bStepping = false; + EnableAttack = false; + step = 0; + phaseTimer = 0; + sylvanasfollowGUID = 0; + _events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 3 * IN_MILLISECONDS); + _events.ScheduleEvent(EVENT_LAVA_BURST, 5 * IN_MILLISECONDS); + _events.ScheduleEvent(EVENT_THUNDER, 8 * IN_MILLISECONDS); + _events.ScheduleEvent(EVENT_AGGRO_SYLVANAS, 2 * IN_MILLISECONDS); + _events.ScheduleEvent(EVENT_THRALL_BUFF, 2 * IN_MILLISECONDS); + + if (Creature* valimathras = ObjectAccessor::GetCreature(*me, ValimathrasGUID)) + { + valimathras->DespawnOrUnsummon(); + ValimathrasGUID = 0; + } + + if (Creature* valimathrasportal = ObjectAccessor::GetCreature(*me, ValimathrasPortalGUID)) + { + valimathrasportal->DespawnOrUnsummon(); + ValimathrasPortalGUID = 0; + } + + if (Creature* wrynn = ObjectAccessor::GetCreature(*me, WrynnGUID)) + { + wrynn->DespawnOrUnsummon(); + WrynnGUID = 0; + } + + if (Creature* jaina = ObjectAccessor::GetCreature(*me, JainaGUID)) + { + jaina->DespawnOrUnsummon(); + JainaGUID = 0; + } + + if (Creature* saurfang = ObjectAccessor::GetCreature(*me, SaurfangGUID)) + { + saurfang->DespawnOrUnsummon(); + SaurfangGUID = 0; + } + } + } + + void JustSummoned(Creature* summoned) override + { + switch (summoned->GetEntry()) + { + case NPC_BLIGHT_ABBERATION: + summoned->AI()->AttackStart(me); + break; + case NPC_WARSONG_BATTLEGUARD: + summoned->ApplySpellImmune(0, IMMUNITY_ID, SPELL_SYLVANAS_BUFF, true); + summoned->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY2H); + break; + case NPC_VARIMATHRAS_PORTAL: + summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + summoned->ApplySpellImmune(0, IMMUNITY_ID, SPELL_THRALL_BUFF, true); + summoned->ApplySpellImmune(0, IMMUNITY_ID, SPELL_SYLVANAS_BUFF, true); + break; + case NPC_CAVE_DUMMY: + summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + summoned->ApplySpellImmune(0, IMMUNITY_ID, SPELL_THRALL_BUFF, true); + summoned->ApplySpellImmune(0, IMMUNITY_ID, SPELL_SYLVANAS_BUFF, true); + summoned->AddAura(SPELL_CYCLONE_FALL, summoned); + break; + case NPC_TREACHEROUS_GUARDIAN_H: + case NPC_DOCTOR_H: + case NPC_CHEMIST_H: + summoned->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true); + summoned->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK_DEST, true); + summoned->ApplySpellImmune(0, IMMUNITY_ID, SPELL_THRALL_BUFF, true); + summoned->ApplySpellImmune(0, IMMUNITY_ID, SPELL_SYLVANAS_BUFF, true); + if (!EnableAttack) + summoned->setFaction(FACTION_FRIENDLY_TO_ALL); + summoned->AddThreat(me, 100.0f); + me->AddThreat(summoned, 100.0f); + summoned->AI()->AttackStart(me); + break; + case NPC_LEGION_INVADER: + case NPC_LEGION_DREADWHISPER: + case NPC_FELGUARD_MORADEUR: + case NPC_DREADLORD: + case NPC_BETRAYER_H: + case NPC_FELBEAST_H: + summoned->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true); + summoned->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK_DEST, true); + summoned->AddThreat(me, 100.0f); + me->AddThreat(summoned, 100.0f); + summoned->AI()->AttackStart(me); + break; + default: + break; + } + } + + void SummonedCreatureDies(Creature* summon, Unit* /*killer*/) override + { + switch (summon->GetEntry()) + { + case NPC_BLIGHT_ABBERATION: + UpdateWorldState(me->GetMap(), WORLD_STATE_COURTYARD_FIGHT_H, 0); + UpdateWorldState(me->GetMap(), WORLD_STATE_COURTYARD_DONE_H, 1); + bStepping = true; + break; + case NPC_KHANOK: + { + UpdateWorldState(me->GetMap(), WORLD_STATE_INNER_SANKTUM_FIGHT_H, 0); + UpdateWorldState(me->GetMap(), WORLD_STATE_INNER_SANKTUM_DONE_H, 1); + FollowThrall(); + SetEscortPaused(false); + std::list SanktumList; + me->GetCreatureListWithEntryInGrid(SanktumList, NPC_FELGUARD_MORADEUR, 1000.0f); + me->GetCreatureListWithEntryInGrid(SanktumList, NPC_DREADLORD, 1000.0f); + me->GetCreatureListWithEntryInGrid(SanktumList, NPC_TREACHEROUS_GUARDIAN_H, 1000.0f); + me->GetCreatureListWithEntryInGrid(SanktumList, NPC_DOCTOR_H, 1000.0f); + me->GetCreatureListWithEntryInGrid(SanktumList, NPC_CHEMIST_H, 1000.0f); + me->GetCreatureListWithEntryInGrid(SanktumList, NPC_BETRAYER_H, 1000.0f); + me->GetCreatureListWithEntryInGrid(SanktumList, NPC_FELBEAST_H, 1000.0f); + me->GetCreatureListWithEntryInGrid(SanktumList, NPC_DOOMGUARD_PILLARGER, 1000.0f); + if (!SanktumList.empty()) + for (std::list::iterator itr = SanktumList.begin(); itr != SanktumList.end(); itr++) + (*itr)->DespawnOrUnsummon(); + break; + } + case NPC_VARIMATHRAS: + { + UpdateWorldState(me->GetMap(), WORLD_STATE_ROYAL_QUARTER_FIGHT_H, 0); + UpdateWorldState(me->GetMap(), WORLD_STATE_ROYAL_QUARTER_DONE_H, 1); + std::list ThroneList; + me->GetCreatureListWithEntryInGrid(ThroneList, NPC_LEGION_OVERLORD, 1000.0f); + me->GetCreatureListWithEntryInGrid(ThroneList, NPC_LEGION_INVADER, 1000.0f); + me->GetCreatureListWithEntryInGrid(ThroneList, NPC_LEGION_DREADWHISPER, 1000.0f); + me->GetCreatureListWithEntryInGrid(ThroneList, NPC_VARIMATHRAS_PORTAL, 1000.0f); + if (!ThroneList.empty()) + for (std::list::iterator itr = ThroneList.begin(); itr != ThroneList.end(); itr++) + (*itr)->DespawnOrUnsummon(); + SetEscortPaused(false); + SetRun(false); + break; + } + default: + break; + } + } + + void UpdateWorldState(Map* map, uint32 id, uint32 state) + { + Map::PlayerList const& players = map->GetPlayers(); + + if (!players.isEmpty()) + { + for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + { + if (Player* player = itr->GetSource()) + player->SendUpdateWorldState(id, state); + } + } + } + + void SetHoldState(bool bOnHold) + { + SetEscortPaused(bOnHold); + } + + void JumpToNextStep(uint32 uiTimer) + { + phaseTimer = uiTimer; + ++step; + } + + void FollowThrall() + { + if (Creature* sylvanas = ObjectAccessor::GetCreature(*me, sylvanasfollowGUID)) + { + sylvanas->GetMotionMaster()->Clear(); + sylvanas->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_IMMUNE_TO_PC); + sylvanas->SetReactState(REACT_AGGRESSIVE); + sylvanas->setFaction(FACTION_ESCORT_N_NEUTRAL_ACTIVE); + sylvanas->GetMotionMaster()->MoveFollow(me, 1, 0); + } + } + + void ActivateValimathrasPortal() + { + if (Creature* portal = me->FindNearestCreature(NPC_VARIMATHRAS_PORTAL, 500.0f)) + { + portal->SummonCreature(NPC_LEGION_OVERLORD, ThrallSpawn[81].x + rand32() % 5, ThrallSpawn[81].y + rand32() % 5, ThrallSpawn[81].z, TEMPSUMMON_DEAD_DESPAWN); + portal->DespawnOrUnsummon(); + } + } + + void SpawnWave(uint32 waveId) + { + switch (waveId) + { + case 0: // Vortex + if (Creature* whirlwind1 = me->SummonCreature(NPC_VORTEX, ThrallSpawn[0].x, ThrallSpawn[0].y, ThrallSpawn[0].z, ThrallSpawn[0].o, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 30 * IN_MILLISECONDS)) + whirlwind1->GetMotionMaster()->MovePath(NPC_WHIRLWIND * 10, false); + if (Creature* whirlwind2 = me->SummonCreature(NPC_VORTEX, ThrallSpawn[0].x, ThrallSpawn[0].y, ThrallSpawn[0].z, ThrallSpawn[0].o, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 30 * IN_MILLISECONDS)) + whirlwind2->GetMotionMaster()->MovePath(NPC_WHIRLWIND * 100, false); + break; + case 1: + // BATTLING_COURTYARD Initial Spawn + for (uint8 i = 0; i < 3; ++i) + me->SummonCreature(NPC_DOCTOR_H, ThrallSpawn[i + 1].x, ThrallSpawn[i + 1].y, ThrallSpawn[i + 1].z, ThrallSpawn[i + 1].o, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 300 * IN_MILLISECONDS); + for (uint8 i = 0; i < 9; ++i) + me->SummonCreature(NPC_CHEMIST_H, ThrallSpawn[i + 4].x, ThrallSpawn[i + 4].y, ThrallSpawn[i + 4].z, ThrallSpawn[i + 4].o, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 300 * IN_MILLISECONDS); + for (uint8 i = 0; i < 6; ++i) + me->SummonCreature(NPC_TREACHEROUS_GUARDIAN_H, ThrallSpawn[i + 13].x, ThrallSpawn[i + 13].y, ThrallSpawn[i + 14].z, ThrallSpawn[i + 14].o, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 300 * IN_MILLISECONDS); + for (uint8 i = 0; i < 4; ++i) + me->SummonCreature(NPC_BLIGHT_SLINGER, ThrallSpawn[i + 19].x, ThrallSpawn[i + 19].y, ThrallSpawn[i + 19].z, ThrallSpawn[i + 19].o, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 900 * IN_MILLISECONDS); + break; + case 2: + // Valimathras + if (Unit* temp = me->SummonCreature(NPC_VARIMATHRAS, ThrallSpawn[23].x, ThrallSpawn[23].y, ThrallSpawn[23].z, ThrallSpawn[23].o, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 900 * IN_MILLISECONDS)) + { + ValimathrasGUID = temp->GetGUID(); + temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_IMMUNE_TO_PC); + } + break; + case 3: + if (Unit* temp = me->SummonCreature(NPC_VARIMATHRAS_PORTAL, ThrallSpawn[24].x, ThrallSpawn[24].y, ThrallSpawn[24].z, ThrallSpawn[24].o, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 900 * IN_MILLISECONDS)) + ValimathrasPortalGUID = temp->GetGUID(); + break; + case 4: + // COURTYARD_FIGHT Spawns + for (uint8 i = 0; i < WAVE_COURTYARD_FIGHT; ++i) + { + switch (urand(0, 2)) + { + case 0: + me->SummonCreature(NPC_TREACHEROUS_GUARDIAN_H, ThrallSpawn[25].x + rand32() % 5, ThrallSpawn[25].y + rand32() % 5, ThrallSpawn[25].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 1: + me->SummonCreature(NPC_DOCTOR_H, ThrallSpawn[26].x + rand32() % 5, ThrallSpawn[26].y + rand32() % 5, ThrallSpawn[26].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 2: + me->SummonCreature(NPC_CHEMIST_H, ThrallSpawn[27].x + rand32() % 5, ThrallSpawn[27].y + rand32() % 5, ThrallSpawn[27].z, TEMPSUMMON_DEAD_DESPAWN); + break; + } + } + break; + case 5: + // Bossspawn 1 + if (Creature* temp = me->SummonCreature(NPC_BLIGHT_ABBERATION, ThrallSpawn[28].x, ThrallSpawn[28].y, ThrallSpawn[28].z, ThrallSpawn[28].o, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 900 * IN_MILLISECONDS)) + { + temp->GetMotionMaster()->MoveJump(ThrallSpawn[62].x, ThrallSpawn[62].y, ThrallSpawn[62].z, 10.0f, 20.0f, 0); + temp->AddThreat(me, 100.0f); + me->AddThreat(temp, 100.0f); + temp->AI()->AttackStart(me); + } + break; + case 6: + // COURTYARD_DONE Spawn + if (Unit* temp = me->SummonCreature(NPC_WARSONG_BATTLEGUARD, ThrallSpawn[29].x, ThrallSpawn[29].y, ThrallSpawn[29].z, ThrallSpawn[29].o, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 300 * IN_MILLISECONDS)) + temp->GetMotionMaster()->MovePoint(0, ThrallSpawn[30].x, ThrallSpawn[30].y, ThrallSpawn[30].z); + if (Unit* temp = me->SummonCreature(NPC_WARSONG_BATTLEGUARD, ThrallSpawn[31].x, ThrallSpawn[31].y, ThrallSpawn[31].z, ThrallSpawn[31].o, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 300 * IN_MILLISECONDS)) + temp->GetMotionMaster()->MovePoint(0, ThrallSpawn[32].x, ThrallSpawn[32].y, ThrallSpawn[32].z); + if (Unit* temp = me->SummonCreature(NPC_WARSONG_BATTLEGUARD, ThrallSpawn[33].x, ThrallSpawn[33].y, ThrallSpawn[33].z, ThrallSpawn[33].o, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 300 * IN_MILLISECONDS)) + temp->GetMotionMaster()->MovePoint(0, ThrallSpawn[34].x, ThrallSpawn[34].y, ThrallSpawn[34].z); + if (Unit* temp = me->SummonCreature(NPC_WARSONG_BATTLEGUARD, ThrallSpawn[35].x, ThrallSpawn[35].y, ThrallSpawn[35].z, ThrallSpawn[35].o, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 300 * IN_MILLISECONDS)) + temp->GetMotionMaster()->MovePoint(0, ThrallSpawn[36].x, ThrallSpawn[36].y, ThrallSpawn[36].z); + for (uint8 i = 0; i < 2; ++i) + me->SummonCreature(NPC_WARSONG_BATTLEGUARD, ThrallSpawn[i + 44].x, ThrallSpawn[i + 44].y, ThrallSpawn[i + 44].z, ThrallSpawn[i + 44].o, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 300 * IN_MILLISECONDS); + break; + case 7: + for (uint8 i = 0; i < 9; ++i) + me->SummonCreature(NPC_CAVE_DUMMY, ThrallSpawn[i + 46].x, ThrallSpawn[i + 46].y, ThrallSpawn[i + 46].z, ThrallSpawn[i + 46].o, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 600 * IN_MILLISECONDS); + break; + case 8: + for (uint8 i = 0; i < 2; ++i) + me->SummonCreature(NPC_WARSONG_BATTLEGUARD, ThrallSpawn[i + 57].x, ThrallSpawn[i + 57].y, ThrallSpawn[i + 57].z, ThrallSpawn[i + 57].o, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 300 * IN_MILLISECONDS); + break; + case 9: + // Top of Undercity - Attacktrashpack + for (uint8 i = 0; i < 3; ++i) + { + switch (urand(0, 2)) + { + case 0: + me->SummonCreature(NPC_TREACHEROUS_GUARDIAN_H, ThrallSpawn[59].x + rand32() % 2, ThrallSpawn[59].y + rand32() % 2, ThrallSpawn[59].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 1: + me->SummonCreature(NPC_DOCTOR_H, ThrallSpawn[59].x + rand32() % 2, ThrallSpawn[59].y + rand32() % 2, ThrallSpawn[59].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 2: + me->SummonCreature(NPC_CHEMIST_H, ThrallSpawn[59].x + rand32() % 2, ThrallSpawn[59].y + rand32() % 2, ThrallSpawn[59].z, TEMPSUMMON_DEAD_DESPAWN); + break; + } + } + break; + case 10: + // Top of Undercity - Attacktrashpack + for (uint8 i = 0; i < 3; ++i) + { + switch (urand(0, 1)) + { + case 0: + me->SummonCreature(NPC_TREACHEROUS_GUARDIAN_H, ThrallSpawn[60].x + rand32() % 5, ThrallSpawn[60].y + rand32() % 5, ThrallSpawn[60].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 1: + me->SummonCreature(NPC_FELGUARD_MORADEUR, ThrallSpawn[60].x + rand32() % 5, ThrallSpawn[60].y + rand32() % 5, ThrallSpawn[60].z, TEMPSUMMON_DEAD_DESPAWN); + break; + } + } + break; + case 11: + // Bottom of Undercity - Attacktrashpack + for (uint8 i = 0; i < 3; ++i) + { + switch (urand(0, 1)) + { + case 0: + me->SummonCreature(NPC_FELGUARD_MORADEUR, ThrallSpawn[61].x + rand32() % 5, ThrallSpawn[61].y + rand32() % 5, ThrallSpawn[61].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 1: + me->SummonCreature(NPC_DREADLORD, ThrallSpawn[61].x + rand32() % 5, ThrallSpawn[61].y + rand32() % 5, ThrallSpawn[61].z, TEMPSUMMON_DEAD_DESPAWN); + break; + } + } + break; + case 12: + // Valimathras 2 + if (Unit* temp = me->SummonCreature(NPC_VARIMATHRAS, ThrallSpawn[63].x, ThrallSpawn[63].y, ThrallSpawn[63].z, ThrallSpawn[63].o, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 300 * IN_MILLISECONDS)) + { + ValimathrasGUID = temp->GetGUID(); + temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_IMMUNE_TO_PC); + } + break; + case 13: + if (Unit* temp = me->SummonCreature(NPC_VARIMATHRAS_PORTAL, ThrallSpawn[64].x, ThrallSpawn[64].y, ThrallSpawn[64].z, ThrallSpawn[64].o, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 900 * IN_MILLISECONDS)) + ValimathrasPortalGUID = temp->GetGUID(); + break; + // NPC_KHANOK - Inner Sunktum Spawn Left + case 14: + for (uint8 i = 0; i < 4; ++i) + { + switch (urand(0, 6)) + { + case 0: + me->SummonCreature(NPC_FELGUARD_MORADEUR, ThrallSpawn[65].x + rand32() % 5, ThrallSpawn[65].y + rand32() % 5, ThrallSpawn[65].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 1: + me->SummonCreature(NPC_DREADLORD, ThrallSpawn[65].x + rand32() % 5, ThrallSpawn[65].y + rand32() % 5, ThrallSpawn[65].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 2: + me->SummonCreature(NPC_TREACHEROUS_GUARDIAN_H, ThrallSpawn[65].x + rand32() % 5, ThrallSpawn[65].y + rand32() % 5, ThrallSpawn[65].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 3: + me->SummonCreature(NPC_DOCTOR_H, ThrallSpawn[65].x + rand32() % 5, ThrallSpawn[65].y + rand32() % 5, ThrallSpawn[65].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 4: + me->SummonCreature(NPC_CHEMIST_H, ThrallSpawn[65].x + rand32() % 5, ThrallSpawn[65].y + rand32() % 5, ThrallSpawn[65].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 5: + me->SummonCreature(NPC_BETRAYER_H, ThrallSpawn[65].x + rand32() % 5, ThrallSpawn[65].y + rand32() % 5, ThrallSpawn[65].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 6: + me->SummonCreature(NPC_FELBEAST_H, ThrallSpawn[65].x + rand32() % 5, ThrallSpawn[65].y + rand32() % 5, ThrallSpawn[65].z, TEMPSUMMON_DEAD_DESPAWN); + break; + } + } + break; + // NPC_KHANOK - Inner Sunktum Spawn Right + case 15: + for (uint8 i = 0; i < 4; ++i) + { + switch (urand(0, 6)) + { + case 0: + me->SummonCreature(NPC_FELGUARD_MORADEUR, ThrallSpawn[66].x + rand32() % 5, ThrallSpawn[66].y + rand32() % 5, ThrallSpawn[66].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 1: + me->SummonCreature(NPC_DREADLORD, ThrallSpawn[66].x + rand32() % 5, ThrallSpawn[66].y + rand32() % 5, ThrallSpawn[66].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 2: + me->SummonCreature(NPC_TREACHEROUS_GUARDIAN_H, ThrallSpawn[66].x + rand32() % 5, ThrallSpawn[66].y + rand32() % 5, ThrallSpawn[66].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 3: + me->SummonCreature(NPC_DOCTOR_H, ThrallSpawn[66].x + rand32() % 5, ThrallSpawn[66].y + rand32() % 5, ThrallSpawn[66].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 4: + me->SummonCreature(NPC_CHEMIST_H, ThrallSpawn[66].x + rand32() % 5, ThrallSpawn[66].y + rand32() % 5, ThrallSpawn[66].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 5: + me->SummonCreature(NPC_BETRAYER_H, ThrallSpawn[66].x + rand32() % 5, ThrallSpawn[66].y + rand32() % 5, ThrallSpawn[66].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 6: + me->SummonCreature(NPC_FELBEAST_H, ThrallSpawn[66].x + rand32() % 5, ThrallSpawn[66].y + rand32() % 5, ThrallSpawn[66].z, TEMPSUMMON_DEAD_DESPAWN); + break; + } + } + break; + // NPC_KHANOK - Inner Sunktum Spawn Top + case 16: + me->SummonCreature(NPC_DOOMGUARD_PILLARGER, ThrallSpawn[67].x + rand32() % 15, ThrallSpawn[67].y + rand32() % 15, ThrallSpawn[67].z + rand32() % 5, TEMPSUMMON_DEAD_DESPAWN); + break; + // NPC_KHANOK - Inner Sunktum Spawn Middle + case 17: + me->SummonCreature(NPC_KHANOK, ThrallSpawn[68].x, ThrallSpawn[68].y, ThrallSpawn[68].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 18: + if (Creature* temp = me->SummonCreature(NPC_WARSONG_BATTLEGUARD, ThrallSpawn[69].x, ThrallSpawn[69].y, ThrallSpawn[69].z, ThrallSpawn[69].o, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 240 * IN_MILLISECONDS)) + { + temp->AI()->Talk(SAY_FOR_THE_HORDE); + temp->GetMotionMaster()->MovePath(NPC_WARSONG_BATTLEGUARD * 100, false); + } + break; + // Valimathras Room Preparation + case 19: + for (uint8 i = 0; i < 3; ++i) + me->SummonGameObject(GO_BLOCKED_PASSAGE, ThrallSpawn[i + 70].x, ThrallSpawn[i + 70].y, ThrallSpawn[70].z, ThrallSpawn[i + 70].o, 0.0f, 0.0f, 0.0f, 0.0f, 120 * IN_MILLISECONDS); + // Valimathras BossSpawn + if (Creature* temp = me->SummonCreature(NPC_VARIMATHRAS, ThrallSpawn[73].x, ThrallSpawn[73].y, ThrallSpawn[73].z, ThrallSpawn[73].o, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 1200 * IN_MILLISECONDS)) + { + ValimathrasGUID = temp->GetGUID(); + temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_IMMUNE_TO_PC); + temp->CastSpell(me, SPELL_AURA_OF_VARIMATHRAS); + temp->CastSpell(me, SPELL_OPENING_LEGION_PORTALS); + temp->AI()->Talk(SAY_CLOSE_DOOR); + } + for (uint8 i = 0; i < 6; ++i) + { + if (Unit* temp = me->SummonCreature(NPC_VARIMATHRAS_PORTAL, ThrallSpawn[i + 74].x, ThrallSpawn[i + 74].y, ThrallSpawn[i + 74].z, TEMPSUMMON_MANUAL_DESPAWN)) + temp->CastSpell(me, SPELL_VALIMATHRAS_PORTAL); + } + break; + case 20: + for (uint8 i = 0; i < 3; ++i) + { + switch (urand(0, 1)) + { + case 0: + me->SummonCreature(NPC_LEGION_INVADER, ThrallSpawn[80].x + rand32() % 5, ThrallSpawn[80].y + rand32() % 5, ThrallSpawn[80].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 1: + me->SummonCreature(NPC_LEGION_DREADWHISPER, ThrallSpawn[81].x + rand32() % 5, ThrallSpawn[81].y + rand32() % 5, ThrallSpawn[81].z, TEMPSUMMON_DEAD_DESPAWN); + break; + } + } + break; + case 21: + for (uint8 i = 0; i < 3; ++i) + { + switch (urand(0, 1)) + { + case 0: + me->SummonCreature(NPC_LEGION_INVADER, ThrallSpawn[81].x + rand32() % 5, ThrallSpawn[81].y + rand32() % 5, ThrallSpawn[81].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 1: + me->SummonCreature(NPC_LEGION_DREADWHISPER, ThrallSpawn[80].x + rand32() % 5, ThrallSpawn[80].y + rand32() % 5, ThrallSpawn[80].z, TEMPSUMMON_DEAD_DESPAWN); + break; + } + } + break; + } + } + + void WaypointReached(uint32 waypointId) override + { + switch (waypointId) + { + case 1: + SetHoldState(true); + bStepping = true; + break; + case 2: + SetHoldState(true); + bStepping = true; + break; + case 11: + SetHoldState(true); + bStepping = true; + break; + case 13: + SetHoldState(true); + bStepping = true; + break; + case 14: + SetHoldState(true); + bStepping = true; + break; + case 34: + SetHoldState(true); + bStepping = true; + break; + case 36: + Talk(THRALL_SAY_SANCTUM_1); + UpdateWorldState(me->GetMap(), WORLD_STATE_INNER_SANKTUM_FIGHT_H, 1); + break; + case 46: + SetHoldState(true); + bStepping = true; + break; + case 57: + SetHoldState(true); + bStepping = true; + break; + case 61: + SetHoldState(true); + bStepping = true; + break; + case 65: + SetHoldState(true); + bStepping = true; + break; + case 66: + SetHoldState(true); + bStepping = true; + break; + case 75: + SetHoldState(true); + bStepping = true; + break; + case 81: + SetHoldState(true); + bStepping = true; + break; + case 104: + SetHoldState(true); + bStepping = true; + break; + case 109: + SetHoldState(true); + bStepping = true; + break; + case 113: + SetHoldState(true); + bStepping = true; + break; + case 117: + SetHoldState(true); + bStepping = true; + break; + case 118: + Talk(THRALL_SAY_THRONE_8); + break; + case 120: + SetHoldState(true); + bStepping = true; + break; + } + } + + bool CanAIAttack(Unit const* victim) const override + { + return victim->GetEntry() != NPC_BLIGHT_SLINGER; + } + + void UpdateAI(uint32 diff) override + { + npc_escortAI::UpdateAI(diff); + + if (bStepping) + { + if (phaseTimer <= diff) + { + switch (step) + { + //Preparation + case 0: + me->setActive(true); + JumpToNextStep(3 * IN_MILLISECONDS); + break; + case 1: + UpdateWorldState(me->GetMap(), WORLD_STATE_BATTLE_COUNTDOWN_H, 1); + Talk(THRALL_SAY_PREP_1); + JumpToNextStep(6 * IN_MILLISECONDS); + break; + case 2: + Talk(THRALL_SAY_PREP_2); + JumpToNextStep(14 * IN_MILLISECONDS); + break; + case 3: + if (Creature* guard = me->FindNearestCreature(NPC_HORDE_GUARD, 100.0f)) + guard->AI()->Talk(SAY_BURN_UC); + JumpToNextStep(19 * IN_MILLISECONDS); + break; + case 4: + if (Creature* guard = me->FindNearestCreature(NPC_HORDE_GUARD, 100.0f)) + guard->AI()->Talk(SAY_PUTRESS_ANGER); + JumpToNextStep(25 * IN_MILLISECONDS); + break; + case 5: + Talk(THRALL_SAY_PREP_3); + JumpToNextStep(14 * IN_MILLISECONDS); + break; + case 6: + Talk(THRALL_SAY_PREP_4); + JumpToNextStep(14 * IN_MILLISECONDS); + break; + case 7: + Talk(THRALL_SAY_PREP_5); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 8: + Talk(THRALL_SAY_PREP_6); + JumpToNextStep(15 * IN_MILLISECONDS); + break; + case 9: + Talk(THRALL_SAY_PREP_7); + JumpToNextStep(6 * IN_MILLISECONDS); + break; + case 10: + if (Player* player = GetPlayerForEscort()) + player->CastSpell(player, SPELL_THRALL_BUFF); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + // Start Event + case 11: + UpdateWorldState(me->GetMap(), WORLD_STATE_BATTLE_COUNTDOWN_H, 0); + UpdateWorldState(me->GetMap(), WORLD_STATE_BATTLE_START_H, 1); + Talk(THRALL_SAY_PREP_8); + SetEscortPaused(false); + bStepping = false; + JumpToNextStep(0); + SetRun(true); + if (Creature* sylvanas = ObjectAccessor::GetCreature(*me, sylvanasfollowGUID)) + { + sylvanas->GetMotionMaster()->MovePath(NPC_SYLVANAS * 100, false); + sylvanas->setActive(true); + } + break; + case 12: + me->Dismount(); + JumpToNextStep(1 * IN_MILLISECONDS); + break; + case 13: + if (Creature* sylvanas = ObjectAccessor::GetCreature(*me, sylvanasfollowGUID)) + sylvanas->Dismount(); + JumpToNextStep(3 * IN_MILLISECONDS); + break; + case 14: + Talk(THRALL_SAY_COURTYARD_1); + JumpToNextStep(4 * IN_MILLISECONDS); + break; + case 15: + me->CastSpell(me, SPELL_CALL_OF_AIR); + SpawnWave(0); + JumpToNextStep(5 * IN_MILLISECONDS); + break; + case 16: + { + std::list PlagueList; + me->GetCreatureListWithEntryInGrid(PlagueList, NPC_PLAGUE_TRIGGER, 50.0f); + if (!PlagueList.empty()) + for (std::list::iterator itr = PlagueList.begin(); itr != PlagueList.end(); itr++) + (*itr)->DespawnOrUnsummon(); + SetEscortPaused(false); + SetRun(false); + if (Creature* sylvanas = ObjectAccessor::GetCreature(*me, sylvanasfollowGUID)) + sylvanas->GetMotionMaster()->MovePath(NPC_SYLVANAS * 1000, false); + JumpToNextStep(3 * IN_MILLISECONDS); + break; + } + case 17: + bStepping = false; + JumpToNextStep(0); + break; + case 18: + SpawnWave(1); + Talk(THRALL_SAY_COURTYARD_2); + JumpToNextStep(6 * IN_MILLISECONDS); + break; + case 19: + { + SpawnWave(2); + JumpToNextStep(3 * IN_MILLISECONDS); + break; + } + case 20: + if (Creature* valimathras = ObjectAccessor::GetCreature(*me, ValimathrasGUID)) + valimathras->AI()->Talk(SAY_VALIMATHRAS_INTRO_0); + JumpToNextStep(5 * IN_MILLISECONDS); + break; + case 21: + if (Creature* valimathras = ObjectAccessor::GetCreature(*me, ValimathrasGUID)) + valimathras->AI()->Talk(SAY_VALIMATHRAS_INTRO_1); + JumpToNextStep(9 * IN_MILLISECONDS); + break; + case 22: + if (Creature* valimathras = ObjectAccessor::GetCreature(*me, ValimathrasGUID)) + valimathras->AI()->Talk(SAY_VALIMATHRAS_INTRO_2); + JumpToNextStep(7 * IN_MILLISECONDS); + break; + case 23: + SpawnWave(3); + JumpToNextStep(1 * IN_MILLISECONDS); + break; + case 24: + if (Creature* valimathrasportal = ObjectAccessor::GetCreature(*me, ValimathrasPortalGUID)) + valimathrasportal->CastSpell(valimathrasportal, SPELL_VALIMATHRAS_PORTAL); + JumpToNextStep(12 * IN_MILLISECONDS); + break; + case 25: + if (Creature* valimathras = ObjectAccessor::GetCreature(*me, ValimathrasGUID)) + { + valimathras->GetMotionMaster()->MovePoint(0, 1804.559f, 235.504f, 62.753f); + valimathras->DespawnOrUnsummon(3 * IN_MILLISECONDS); + } + if (Creature* valimathrasportal = ObjectAccessor::GetCreature(*me, ValimathrasPortalGUID)) + valimathrasportal->DespawnOrUnsummon(6 * IN_MILLISECONDS); + JumpToNextStep(1 * IN_MILLISECONDS); + break; + case 26: + { + Talk(THRALL_SAY_COURTYARD_3); + me->CastSpell(me, SPELL_TIDAL_WAVE_SUMMON); + std::list HelperList; + me->GetCreatureListWithEntryInGrid(HelperList, NPC_SLINGER_TRIGGER, 1000.0f); + if (!HelperList.empty()) + for (std::list::iterator itr = HelperList.begin(); itr != HelperList.end(); itr++) + (*itr)->DespawnOrUnsummon(); + JumpToNextStep(5 * IN_MILLISECONDS); + break; + } + // Start COURTYARD_FIGHT + case 27: + FollowThrall(); + SetEscortPaused(false); + bStepping = false; + SetRun(true); + Talk(THRALL_SAY_COURTYARD_4); + UpdateWorldState(me->GetMap(), WORLD_STATE_BATTLE_START_H, 0); + UpdateWorldState(me->GetMap(), WORLD_STATE_COURTYARD_FIGHT_H, 1); + JumpToNextStep(0); + break; + case 28: + { + EnableAttack = true; + DoCast(me, SPELL_HEROIC_VANGUARD, true); + std::list HostileEndList; + me->GetCreatureListWithEntryInGrid(HostileEndList, NPC_TREACHEROUS_GUARDIAN_H, 1000.0f); + me->GetCreatureListWithEntryInGrid(HostileEndList, NPC_DOCTOR_H, 1000.0f); + me->GetCreatureListWithEntryInGrid(HostileEndList, NPC_CHEMIST_H, 1000.0f); + if (!HostileEndList.empty()) + for (std::list::iterator itr = HostileEndList.begin(); itr != HostileEndList.end(); itr++) + (*itr)->setFaction(FACTION_HOSTILE); + SpawnWave(4); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + } + case 29: + SpawnWave(4); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 30: + SpawnWave(4); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 31: + SpawnWave(4); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 32: + SpawnWave(4); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 33: + SpawnWave(4); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 34: + SpawnWave(4); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 35: + SpawnWave(4); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 36: + SpawnWave(4); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 37: + SpawnWave(4); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 38: + SpawnWave(4); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 39: + SpawnWave(4); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 40: + SpawnWave(4); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 41: + SpawnWave(4); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 42: + SpawnWave(4); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 43: + SpawnWave(4); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 44: + SpawnWave(4); + JumpToNextStep(2 * IN_MILLISECONDS); + break; + case 45: + SpawnWave(5); + bStepping = false; + JumpToNextStep(0 * IN_MILLISECONDS); + break; + // End COURTYARD_FIGHT + case 46: + { + FollowThrall(); + std::list HostileList; + me->GetCreatureListWithEntryInGrid(HostileList, NPC_TREACHEROUS_GUARDIAN_H, 1000.0f); + me->GetCreatureListWithEntryInGrid(HostileList, NPC_DOCTOR_H, 1000.0f); + me->GetCreatureListWithEntryInGrid(HostileList, NPC_CHEMIST_H, 1000.0f); + me->GetCreatureListWithEntryInGrid(HostileList, NPC_BLIGHT_SLINGER, 1000.0f); + if (!HostileList.empty()) + for (std::list::iterator itr = HostileList.begin(); itr != HostileList.end(); itr++) + (*itr)->DespawnOrUnsummon(); + for (uint8 i = 0; i < 7; ++i) + me->SummonGameObject(GO_HORDE_BANNER, ThrallSpawn[i + 37].x, ThrallSpawn[i + 37].y, ThrallSpawn[i + 37].z, ThrallSpawn[i + 37].o, 0.0f, 0.0f, 0.0f, 0.0f, 120 * IN_MILLISECONDS); + SpawnWave(6); + SetEscortPaused(false); + bStepping = false; + SetRun(false); + JumpToNextStep(0 * IN_MILLISECONDS); + break; + } + case 47: + Talk(THRALL_SAY_COURTYARD_5); + JumpToNextStep(5 * IN_MILLISECONDS); + break; + case 48: + SetEscortPaused(false); + bStepping = false; + JumpToNextStep(0 * IN_MILLISECONDS); + break; + // Elevator Event + case 49: + Talk(THRALL_SAY_ELEVATOR_1); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 50: + if (Creature* sylvanas = ObjectAccessor::GetCreature(*me, sylvanasfollowGUID)) + sylvanas->AI()->Talk(SYLVANAS_SAY_ELEVATOR_1); + JumpToNextStep(3 * IN_MILLISECONDS); + break; + case 51: + Talk(THRALL_SAY_ELEVATOR_2); + DoCast(me, SPELL_CALL_OF_AIR); + SpawnWave(7); + JumpToNextStep(16 * IN_MILLISECONDS); + break; + case 52: + Talk(THRALL_SAY_ELEVATOR_3); + JumpToNextStep(4 * IN_MILLISECONDS); + break; + case 53: + SpawnWave(8); + me->GetMotionMaster()->MoveJump(ThrallSpawn[55].x, ThrallSpawn[55].y, ThrallSpawn[55].z, 40.0f, 40.0f, 0); + if (Creature* sylvanas = ObjectAccessor::GetCreature(*me, sylvanasfollowGUID)) + sylvanas->GetMotionMaster()->MoveJump(ThrallSpawn[56].x, ThrallSpawn[56].y, ThrallSpawn[56].z, 40.0f, 40.0f, 0); + JumpToNextStep(4 * IN_MILLISECONDS); + break; + case 54: + FollowThrall(); + SetEscortPaused(false); + bStepping = false; + SetRun(false); + JumpToNextStep(0 * IN_MILLISECONDS); + break; + // Top of Undercity Discussion + case 55: + if (Creature* sylvanas = ObjectAccessor::GetCreature(*me, sylvanasfollowGUID)) + sylvanas->AI()->Talk(SYLVANAS_SAY_SANCTUM_1); + JumpToNextStep(5 * IN_MILLISECONDS); + break; + case 56: + if (Creature* sylvanas = ObjectAccessor::GetCreature(*me, sylvanasfollowGUID)) + sylvanas->AI()->Talk(SYLVANAS_SAY_SANCTUM_2); + JumpToNextStep(8 * IN_MILLISECONDS); + break; + case 57: + Talk(THRALL_SAY_SANCTUM_2); + JumpToNextStep(5 * IN_MILLISECONDS); + break; + case 58: + if (Creature* sylvanas = ObjectAccessor::GetCreature(*me, sylvanasfollowGUID)) + sylvanas->AI()->Talk(SYLVANAS_SAY_SANCTUM_3); + JumpToNextStep(5 * IN_MILLISECONDS); + break; + // Top of Undercity - Fight + case 59: + SpawnWave(9); + JumpToNextStep(5 * IN_MILLISECONDS); + break; + case 60: + SpawnWave(9); + JumpToNextStep(5 * IN_MILLISECONDS); + break; + case 61: + SpawnWave(9); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 62: + FollowThrall(); + SetEscortPaused(false); + bStepping = false; + SetRun(false); + JumpToNextStep(0 * IN_MILLISECONDS); + break; + case 63: + JumpToNextStep(3 * IN_MILLISECONDS); + break; + case 64: + SpawnWave(10); + JumpToNextStep(5 * IN_MILLISECONDS); + break; + case 65: + SpawnWave(10); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 66: + FollowThrall(); + SetEscortPaused(false); + bStepping = false; + SetRun(false); + JumpToNextStep(0 * IN_MILLISECONDS); + break; + case 67: + SpawnWave(11); + JumpToNextStep(6 * IN_MILLISECONDS); + break; + case 68: + SpawnWave(11); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 69: + FollowThrall(); + SetEscortPaused(false); + bStepping = false; + SetRun(false); + JumpToNextStep(0 * IN_MILLISECONDS); + break; + // KHANOK - Valimathtas Intro + case 70: + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 71: + if (Creature* sylvanas = ObjectAccessor::GetCreature(*me, sylvanasfollowGUID)) + sylvanas->AI()->Talk(SYLVANAS_SAY_SANCTUM_4); + SpawnWave(12); + JumpToNextStep(5 * IN_MILLISECONDS); + break; + case 72: + if (Creature* valimathras = ObjectAccessor::GetCreature(*me, ValimathrasGUID)) + valimathras->AI()->Talk(SAY_VALIMATHRAS_INNER_SANKTUM_0); + JumpToNextStep(5 * IN_MILLISECONDS); + break; + case 73: + if (Creature* valimathras = ObjectAccessor::GetCreature(*me, ValimathrasGUID)) + valimathras->AI()->Talk(SAY_VALIMATHRAS_INNER_SANKTUM_1); + SpawnWave(13); + JumpToNextStep(2 * IN_MILLISECONDS); + break; + case 74: + if (Creature* valimathrasportal = ObjectAccessor::GetCreature(*me, ValimathrasPortalGUID)) + valimathrasportal->CastSpell(valimathrasportal, SPELL_VALIMATHRAS_PORTAL); + JumpToNextStep(4 * IN_MILLISECONDS); + break; + case 75: + if (Creature* valimathras = ObjectAccessor::GetCreature(*me, ValimathrasGUID)) + { + valimathras->GetMotionMaster()->MovePoint(0, 1596.642f, 429.811f, -46.3429f); + valimathras->DespawnOrUnsummon(3 * IN_MILLISECONDS); + } + if (Creature* valimathrasportal = ObjectAccessor::GetCreature(*me, ValimathrasPortalGUID)) + valimathrasportal->DespawnOrUnsummon(3 * IN_MILLISECONDS); + JumpToNextStep(2 * IN_MILLISECONDS); + break; + // KHANOK - Trashspawn + case 76: + SpawnWave(14); + JumpToNextStep(8 * IN_MILLISECONDS); + break; + case 77: + SpawnWave(15); + JumpToNextStep(8 * IN_MILLISECONDS); + break; + case 78: + SpawnWave(16); + JumpToNextStep(8 * IN_MILLISECONDS); + break; + case 79: + SpawnWave(14); + JumpToNextStep(8 * IN_MILLISECONDS); + break; + case 80: + SpawnWave(15); + JumpToNextStep(8 * IN_MILLISECONDS); + break; + case 81: + SpawnWave(16); + JumpToNextStep(8 * IN_MILLISECONDS); + break; + case 82: + SpawnWave(14); + JumpToNextStep(8 * IN_MILLISECONDS); + break; + case 83: + SpawnWave(15); + JumpToNextStep(8 * IN_MILLISECONDS); + break; + case 84: + SpawnWave(16); + JumpToNextStep(8 * IN_MILLISECONDS); + break; + case 85: + SpawnWave(14); + JumpToNextStep(8 * IN_MILLISECONDS); + break; + case 86: + SpawnWave(15); + JumpToNextStep(8 * IN_MILLISECONDS); + break; + case 87: + SpawnWave(16); + JumpToNextStep(8 * IN_MILLISECONDS); + break; + case 88: + SpawnWave(14); + JumpToNextStep(8 * IN_MILLISECONDS); + break; + case 89: + SpawnWave(15); + JumpToNextStep(8 * IN_MILLISECONDS); + break; + case 90: + SpawnWave(16); + JumpToNextStep(8 * IN_MILLISECONDS); + break; + case 91: + SpawnWave(14); + JumpToNextStep(8 * IN_MILLISECONDS); + break; + case 92: + SpawnWave(15); + JumpToNextStep(8 * IN_MILLISECONDS); + break; + case 93: + SpawnWave(16); + JumpToNextStep(8 * IN_MILLISECONDS); + break; + case 94: + // Spawn Boss 2 KHANOK + SpawnWave(17); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 95: + SpawnWave(14); + JumpToNextStep(5 * IN_MILLISECONDS); + break; + case 96: + SpawnWave(15); + JumpToNextStep(5 * IN_MILLISECONDS); + break; + case 97: + SpawnWave(16); + JumpToNextStep(0 * IN_MILLISECONDS); + bStepping = false; + break; + case 98: + // KHANOK - Won + Talk(THRALL_SAY_SANCTUM_3); + JumpToNextStep(7 * IN_MILLISECONDS); + break; + case 99: + SpawnWave(18); + JumpToNextStep(0.35 * IN_MILLISECONDS); + break; + case 100: + SpawnWave(18); + JumpToNextStep(0.35 * IN_MILLISECONDS); + break; + case 101: + SpawnWave(18); + JumpToNextStep(0.35 * IN_MILLISECONDS); + break; + case 102: + SpawnWave(18); + JumpToNextStep(0.35 * IN_MILLISECONDS); + break; + case 103: + SpawnWave(18); + JumpToNextStep(0.35 * IN_MILLISECONDS); + break; + case 104: + SpawnWave(18); + JumpToNextStep(0.35 * IN_MILLISECONDS); + break; + case 105: + SpawnWave(18); + JumpToNextStep(0.35 * IN_MILLISECONDS); + break; + case 106: + SpawnWave(18); + JumpToNextStep(0.35 * IN_MILLISECONDS); + break; + case 107: + SpawnWave(18); + JumpToNextStep(3 * IN_MILLISECONDS); + break; + case 108: + Talk(THRALL_SAY_SANCTUM_4); + FollowThrall(); + SetEscortPaused(false); + bStepping = false; + SetRun(false); + JumpToNextStep(0 * IN_MILLISECONDS); + break; + case 109: + if (Creature* sylvanas = ObjectAccessor::GetCreature(*me, sylvanasfollowGUID)) + sylvanas->AI()->Talk(SYLVANAS_SAY_SANCTUM_5); + JumpToNextStep(8 * IN_MILLISECONDS); + break; + case 110: + SpawnWave(19); + JumpToNextStep(5 * IN_MILLISECONDS); + break; + case 111: + FollowThrall(); + SetEscortPaused(false); + bStepping = false; + SetRun(true); + JumpToNextStep(0 * IN_MILLISECONDS); + break; + case 112: + JumpToNextStep(3 * IN_MILLISECONDS); + break; + case 113: + Talk(THRALL_SAY_SANCTUM_5); + JumpToNextStep(12 * IN_MILLISECONDS); + break; + case 114: + Talk(THRALL_SAY_SANCTUM_6); + DoCast(me, SPELL_CALL_OF_EARTH); + JumpToNextStep(6 * IN_MILLISECONDS); + break; + case 115: + { + std::list SaronitList; + GetGameObjectListWithEntryInGrid(SaronitList, me, GO_BLOCKED_PASSAGE, 80.0f); + for (std::list::const_iterator itr = SaronitList.begin(); itr != SaronitList.end(); ++itr) + if (GameObject* saronit = (*itr)) + saronit->UseDoorOrButton(); + JumpToNextStep(5 * IN_MILLISECONDS); + break; + } + case 116: + Talk(THRALL_SAY_SANCTUM_7); + UpdateWorldState(me->GetMap(), WORLD_STATE_ROYAL_QUARTER_FIGHT_H, 1); + FollowThrall(); + SetEscortPaused(false); + bStepping = false; + JumpToNextStep(0 * IN_MILLISECONDS); + break; + // Valimathras Intro + case 117: + Talk(THRALL_SAY_THRONE_1); + JumpToNextStep(5 * IN_MILLISECONDS); + break; + case 118: + if (Creature* valimathras = ObjectAccessor::GetCreature(*me, ValimathrasGUID)) + { + valimathras->AI()->Talk(SAY_THRONE_1); + valimathras->CastSpell(me, SPELL_OPENING_LEGION_PORTALS); + } + JumpToNextStep(3 * IN_MILLISECONDS); + break; + case 119: + SpawnWave(20); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 120: + SpawnWave(21); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 121: + ActivateValimathrasPortal(); + if (Creature* valimathras = ObjectAccessor::GetCreature(*me, ValimathrasGUID)) + valimathras->AI()->Talk(SAY_THRONE_2); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 122: + SpawnWave(20); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 123: + SpawnWave(21); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 124: + ActivateValimathrasPortal(); + if (Creature* valimathras = ObjectAccessor::GetCreature(*me, ValimathrasGUID)) + valimathras->AI()->Talk(SAY_THRONE_3); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 125: + SpawnWave(20); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 126: + SpawnWave(21); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 127: + ActivateValimathrasPortal(); + if (Creature* valimathras = ObjectAccessor::GetCreature(*me, ValimathrasGUID)) + valimathras->AI()->Talk(SAY_THRONE_4); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 128: + SpawnWave(20); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 129: + SpawnWave(21); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 130: + ActivateValimathrasPortal(); + if (Creature* valimathras = ObjectAccessor::GetCreature(*me, ValimathrasGUID)) + valimathras->AI()->Talk(SAY_THRONE_5); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 131: + SpawnWave(20); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 132: + SpawnWave(21); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 133: + ActivateValimathrasPortal(); + if (Creature* valimathras = ObjectAccessor::GetCreature(*me, ValimathrasGUID)) + valimathras->AI()->Talk(SAY_THRONE_6); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 134: + SpawnWave(20); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 135: + SpawnWave(21); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 136: + ActivateValimathrasPortal(); + JumpToNextStep(5 * IN_MILLISECONDS); + break; + // Valimathras Fight + case 137: + if (Creature* valimathras = ObjectAccessor::GetCreature(*me, ValimathrasGUID)) + { + valimathras->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_IMMUNE_TO_PC); + valimathras->RemoveAura(SPELL_AURA_OF_VARIMATHRAS); + valimathras->RemoveAura(SPELL_OPENING_LEGION_PORTALS); + valimathras->AI()->Talk(SAY_VALIMATHRAS_ATTACK); + valimathras->AddThreat(me, 100.0f); + me->AddThreat(valimathras, 100.0f); + valimathras->AI()->AttackStart(me); + } + bStepping = false; + JumpToNextStep(0 * IN_MILLISECONDS); + break; + // Valimathras Won + case 138: + Talk(THRALL_SAY_THRONE_2); + JumpToNextStep(5 * IN_MILLISECONDS); + break; + case 139: + Talk(THRALL_SAY_THRONE_3); + JumpToNextStep(2 * IN_MILLISECONDS); + break; + case 140: + SetEscortPaused(false); + bStepping = false; + JumpToNextStep(0 * IN_MILLISECONDS); + break; + case 141: + JumpToNextStep(8 * IN_MILLISECONDS); + break; + case 142: + if (Creature* sylvanas = ObjectAccessor::GetCreature(*me, sylvanasfollowGUID)) + me->SetFacingToObject(sylvanas); + Talk(THRALL_SAY_THRONE_4); + JumpToNextStep(3 * IN_MILLISECONDS); + break; + case 143: + if (Creature* sylvanas = ObjectAccessor::GetCreature(*me, sylvanasfollowGUID)) + sylvanas->CastSpell(sylvanas, SPELL_LEAP_TO_PLATFORM); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + case 144: + if (Creature* sylvanas = ObjectAccessor::GetCreature(*me, sylvanasfollowGUID)) + { + sylvanas->AI()->Talk(SYLVANAS_SAY_THRONE_1); + me->SetFacingToObject(sylvanas); + me->HandleEmoteCommand(EMOTE_ONESHOT_SALUTE); + } + JumpToNextStep(3 * IN_MILLISECONDS); + break; + case 145: + Talk(THRALL_SAY_THRONE_5); + FollowThrall(); + SetEscortPaused(false); + bStepping = false; + JumpToNextStep(0 * IN_MILLISECONDS); + break; + case 146: + Talk(THRALL_SAY_THRONE_6); + JumpToNextStep(3 * IN_MILLISECONDS); + break; + case 147: + for (uint8 i = 0; i < ALLIANCE_FORCE_MAXCOUNT; ++i) + { + if (Creature* temp = me->SummonCreature(NPC_SW_SOLDIER, AllianceSpawn[i + 25].x, AllianceSpawn[i + 25].y, AllianceSpawn[i + 25].z, AllianceSpawn[i + 25].o, TEMPSUMMON_MANUAL_DESPAWN)) + { + allianceForcesGUID[i] = temp->GetGUID(); + temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC); + temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + temp->ApplySpellImmune(0, IMMUNITY_ID, SPELL_SYLVANAS_BUFF, true); + temp->SetReactState(REACT_PASSIVE); + temp->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY2H); + } + } + if (Creature* wrynn = me->SummonCreature(NPC_WRYNN, 1308.862f, 381.809f, -66.044243f, TEMPSUMMON_MANUAL_DESPAWN)) + { + WrynnGUID = wrynn->GetGUID(); + wrynn->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC); + wrynn->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + wrynn->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY2H); + wrynn->SetReactState(REACT_PASSIVE); + wrynn->GetMotionMaster()->MovePoint(0, 1302.543f, 359.472f, -67.295f, true); + } + if (Creature* jaina = me->SummonCreature(NPC_JAINA, 1308.862f, 381.809f, -66.044243f, TEMPSUMMON_MANUAL_DESPAWN)) + { + JainaGUID = jaina->GetGUID(); + jaina->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC); + jaina->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + jaina->SetReactState(REACT_PASSIVE); + } + JumpToNextStep(6 * IN_MILLISECONDS); + break; + // Wrynn Intro + case 148: + if (Creature* wrynn = ObjectAccessor::GetCreature(*me, WrynnGUID)) + wrynn->AI()->Talk(WRYNN_SAY_THRONE_5); + JumpToNextStep(15 * IN_MILLISECONDS); + break; + case 149: + if (Creature* wrynn = ObjectAccessor::GetCreature(*me, WrynnGUID)) + wrynn->AI()->Talk(WRYNN_SAY_THRONE_6); + JumpToNextStep(15 * IN_MILLISECONDS); + break; + case 150: + if (Creature* wrynn = ObjectAccessor::GetCreature(*me, WrynnGUID)) + wrynn->AI()->Talk(WRYNN_SAY_THRONE_7); + JumpToNextStep(16.5 * IN_MILLISECONDS); + break; + case 151: + if (Creature* wrynn = ObjectAccessor::GetCreature(*me, WrynnGUID)) + wrynn->AI()->Talk(WRYNN_SAY_THRONE_8); + JumpToNextStep(6 * IN_MILLISECONDS); + break; + // Wrynn Fight + case 152: + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_IMMUNE_TO_PC); + if (Creature* wrynn = ObjectAccessor::GetCreature(*me, WrynnGUID)) + { + wrynn->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC); + wrynn->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + wrynn->SetReactState(REACT_AGGRESSIVE); + wrynn->AddThreat(me, 100.0f); + me->AddThreat(wrynn, 100.0f); + wrynn->AI()->AttackStart(me); + } + + for (uint8 i = 0; i < ALLIANCE_FORCE_MAXCOUNT; ++i) + { + if (Creature* temp = ObjectAccessor::GetCreature(*me, allianceForcesGUID[i])) + { + temp->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_IMMUNE_TO_PC); + temp->SetReactState(REACT_AGGRESSIVE); + temp->AddThreat(me, 100.0f); + temp->AI()->AttackStart(me); + } + } + JumpToNextStep(6 * IN_MILLISECONDS); + break; + case 153: + if (Creature* jaina = ObjectAccessor::GetCreature(*me, JainaGUID)) + { + jaina->GetMotionMaster()->MovePoint(0, AllianceWP[9].x, AllianceWP[9].y, AllianceWP[9].z); + jaina->AI()->Talk(JAINA_SAY_THRONE_2); + } + JumpToNextStep(8 * IN_MILLISECONDS); + break; + case 154: + if (Creature* jaina = ObjectAccessor::GetCreature(*me, JainaGUID)) + { + jaina->AI()->DoCastAOE(SPELL_DEEPFREEZE); + jaina->AI()->Talk(JAINA_SAY_THRONE_3); + } + JumpToNextStep(5 * IN_MILLISECONDS); + break; + case 155: + { + std::list HelperList; + me->GetCreatureListWithEntryInGrid(HelperList, NPC_SW_SOLDIER, 100.0f); + me->GetCreatureListWithEntryInGrid(HelperList, NPC_JAINA, 100.0f); + me->GetCreatureListWithEntryInGrid(HelperList, NPC_WRYNN, 100.0f); + if (!HelperList.empty()) + for (std::list::iterator itr = HelperList.begin(); itr != HelperList.end(); itr++) + (*itr)->DespawnOrUnsummon(); + JumpToNextStep(8 * IN_MILLISECONDS); + break; + } + case 156: + Talk(THRALL_SAY_THRONE_7); + SetEscortPaused(false); + bStepping = false; + JumpToNextStep(0 * IN_MILLISECONDS); + break; + case 157: + Talk(THRALL_SAY_THRONE_9); + me->SetStandState(UNIT_STAND_STATE_SIT); + JumpToNextStep(3 * IN_MILLISECONDS); + break; + // Ending + case 158: + if (Creature* saurfang = me->SummonCreature(NPC_OVERLORD_SAURFANG, 1297.574f, 347.154f, -65.027f, TEMPSUMMON_MANUAL_DESPAWN)) + { + SaurfangGUID = saurfang->GetGUID(); + saurfang->SetWalk(true); + saurfang->GetMotionMaster()->MovePoint(0, 1300.862f, 353.670f, -66.187f, true); + } + JumpToNextStep(7 * IN_MILLISECONDS); + break; + case 159: + if (Creature* saurfang = ObjectAccessor::GetCreature(*me, SaurfangGUID)) + { + saurfang->AI()->Talk(SAY_SAURFANG_ARRIVAL_1); + saurfang->SetStandState(UNIT_STAND_STATE_SIT); + } + JumpToNextStep(6 * IN_MILLISECONDS); + break; + case 160: + if (Creature* saurfang = ObjectAccessor::GetCreature(*me, SaurfangGUID)) + saurfang->AI()->Talk(SAY_SAURFANG_ARRIVAL_2); + JumpToNextStep(6 * IN_MILLISECONDS); + break; + case 161: + if (Creature* saurfang = ObjectAccessor::GetCreature(*me, SaurfangGUID)) + saurfang->AI()->Talk(SAY_SAURFANG_ARRIVAL_3); + if (Map *map = me->GetMap()) + { + Map::PlayerList const &PlayerList = map->GetPlayers(); + for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) + { + if (Player *player = i->GetSource()) + { + if (me->IsInRange(player, 0.0f, 50.0f)) + { + if (player->GetTeamId() == TEAM_HORDE) + { + player->RemoveAura(SPELL_SYLVANAS_BUFF); + player->RemoveAura(SPELL_THRALL_BUFF); + player->CompleteQuest(QUEST_BATTLE_H); + player->CastSpell(player, SPELL_PHASING_HORDE); + } + } + } + } + } + JumpToNextStep(5 * IN_MILLISECONDS); + break; + case 162: + Talk(THRALL_SAY_THRONE_10); + JumpToNextStep(5 * IN_MILLISECONDS); + break; + case 163: + me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER); + Talk(THRALL_SAY_THRONE_11); + UpdateWorldState(me->GetMap(), WORLD_STATE_ROYAL_QUARTER_FIGHT_H, 0); + UpdateWorldState(me->GetMap(), WORLD_STATE_INNER_SANKTUM_FIGHT_H, 0); + UpdateWorldState(me->GetMap(), WORLD_STATE_COURTYARD_FIGHT_H, 0); + std::list HelperList; + me->GetCreatureListWithEntryInGrid(HelperList, NPC_SYLVANAS, 100.0f); + me->GetCreatureListWithEntryInGrid(HelperList, NPC_OVERLORD_SAURFANG, 100.0f); + if (!HelperList.empty()) + for (std::list::iterator itr = HelperList.begin(); itr != HelperList.end(); itr++) + (*itr)->DespawnOrUnsummon(120 * IN_MILLISECONDS); + me->DespawnOrUnsummon(120 * IN_MILLISECONDS); + bStepping = false; + JumpToNextStep(0 * IN_MILLISECONDS); + break; + } + } + else phaseTimer -= diff; + } + + if (!UpdateVictim()) + return; + + _events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_CHAIN_LIGHTNING: + DoCastVictim(SPELL_CHAIN_LIGHTNING); + _events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, urand(5, 8) * IN_MILLISECONDS); + break; + case EVENT_LAVA_BURST: + DoCastVictim(SPELL_LAVA_BURST); + _events.ScheduleEvent(EVENT_LAVA_BURST, urand(3, 5) * IN_MILLISECONDS); + break; + case EVENT_THUNDER: + DoCast(me, SPELL_THUNDER); + _events.ScheduleEvent(EVENT_THUNDER, 15 * IN_MILLISECONDS); + break; + case EVENT_AGGRO_SYLVANAS: + if (me->GetVictim()) + if (Creature* sylvanas = ObjectAccessor::GetCreature(*me, sylvanasfollowGUID)) + sylvanas->AI()->AttackStart(me->GetVictim()); + _events.ScheduleEvent(EVENT_AGGRO_SYLVANAS, 2 * IN_MILLISECONDS); + break; + case EVENT_THRALL_BUFF: + if (Player* player = GetPlayerForEscort()) + player->CastSpell(player, SPELL_THRALL_BUFF); + _events.ScheduleEvent(EVENT_THRALL_BUFF, 10 * IN_MILLISECONDS); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_thrall_bfuAI(creature); + } +}; + +/*###### +## npc_lady_sylvanas_windrunner_bfu +######*/ + +class npc_lady_sylvanas_windrunner_bfu : public CreatureScript +{ +public: + npc_lady_sylvanas_windrunner_bfu() : CreatureScript("npc_lady_sylvanas_windrunner_bfu") { } + + struct npc_lady_sylvanas_windrunner_bfuAI : public ScriptedAI + { + npc_lady_sylvanas_windrunner_bfuAI(Creature* creature) : ScriptedAI(creature) + { + Reset(); + } + + void InitializeAI() override + { + me->Mount(MODEL_SKELETON_MOUNT); + } + + void Reset() override + { + me->SetCorpseDelay(1); + me->SetRespawnTime(1); + _events.ScheduleEvent(EVENT_SUMMON_SKELETON, 20 * IN_MILLISECONDS); + _events.ScheduleEvent(EVENT_BLACK_ARROW, 15 * IN_MILLISECONDS); + _events.ScheduleEvent(EVENT_SHOOT, 5 * IN_MILLISECONDS); + _events.ScheduleEvent(EVENT_MULTI_SHOT, 6 * IN_MILLISECONDS); + _events.ScheduleEvent(EVENT_SHRIEK_OF_HIGHBORN, 3 * IN_MILLISECONDS); + _events.ScheduleEvent(EVENT_SYLVANAS_BUFF, 1 * IN_MILLISECONDS); + me->ApplySpellImmune(0, IMMUNITY_ID, SPELL_WRYNN_BUFF, true); + me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_INCREASE_SPEED, true); + } + + bool CanAIAttack(Unit const* victim) const override + { + return victim->GetEntry() != NPC_BLIGHT_SLINGER; + } + + void UpdateAI(uint32 diff) override + { + if (!me->GetVictim()) + return; + + _events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_SUMMON_SKELETON: + DoCast(me, SPELL_SUMMON_SKELETON); + _events.ScheduleEvent(EVENT_SUMMON_SKELETON, urand(20, 30) * IN_MILLISECONDS); + break; + case EVENT_BLACK_ARROW: + if (Unit* victim = me->GetVictim()) + DoCast(victim, SPELL_BLACK_ARROW); + _events.ScheduleEvent(EVENT_BLACK_ARROW, urand(6, 9) * IN_MILLISECONDS); + break; + case EVENT_SHOOT: + if (Unit* victim = me->GetVictim()) + DoCast(victim, SPELL_SHOT); + _events.ScheduleEvent(EVENT_SHOOT, urand(5, 10) * IN_MILLISECONDS); + break; + case EVENT_MULTI_SHOT: + if (Unit* victim = me->GetVictim()) + DoCast(victim, SPELL_MULTI_SHOT); + _events.ScheduleEvent(EVENT_MULTI_SHOT, urand(10, 13) * IN_MILLISECONDS); + break; + case EVENT_SHRIEK_OF_HIGHBORN: + DoCastVictim(SPELL_SHRIEK_OF_HIGHBORN); + _events.ScheduleEvent(EVENT_SHRIEK_OF_HIGHBORN, 3 * IN_MILLISECONDS); + break; + case EVENT_SYLVANAS_BUFF: + DoCast(me, SPELL_SYLVANAS_BUFF, true); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + + private: + EventMap _events; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_lady_sylvanas_windrunner_bfuAI(creature); + } +}; + /*###### ## AddSC ######*/ @@ -347,4 +4024,12 @@ void AddSC_undercity() new npc_lady_sylvanas_windrunner(); new npc_highborne_lamenter(); new npc_parqual_fintallas(); + + new npc_varian_wrynn(); + new npc_thrall_bfu(); + new npc_jaina_proudmoore_bfu(); + new npc_lady_sylvanas_windrunner_bfu(); + new boss_blight_worm(); + new spell_blight_worm_ingest(); + new spell_undercity_buffs(); }