diff options
author | Blipi <gpascualg93@gmail.com> | 2013-01-11 00:24:05 +0100 |
---|---|---|
committer | Blipi <gpascualg93@gmail.com> | 2013-01-11 00:26:26 +0100 |
commit | ed21a589bb76cce1d82677ddfdcf2e418c4384b8 (patch) | |
tree | 8409061defdfa17b5f9305ba1e5c3d2ba4248081 | |
parent | 9da1ff45b726acf4bd8bd0684067a6c40bbf456b (diff) |
Quest 4901 "Guardians of the Altar"
-rw-r--r-- | sql/updates/world/xxxx_xx_xx_xx_world_guardians_of_the_altar.sql | 120 | ||||
-rw-r--r-- | src/server/scripts/Kalimdor/zone_winterspring.cpp | 554 |
2 files changed, 673 insertions, 1 deletions
diff --git a/sql/updates/world/xxxx_xx_xx_xx_world_guardians_of_the_altar.sql b/sql/updates/world/xxxx_xx_xx_xx_world_guardians_of_the_altar.sql new file mode 100644 index 00000000000..e1cfb8a2ac0 --- /dev/null +++ b/sql/updates/world/xxxx_xx_xx_xx_world_guardians_of_the_altar.sql @@ -0,0 +1,120 @@ +-- Quest 4901 "Guardians of the Altar" + +SET @NPC_RANSHALLA := 10300; +SET @NPC_PRIESTESS_ELUNE := 12116; +SET @NPC_GUARDIAN_ELUNE := 12140; +SET @NPC_VOICE_ELUNE := 12152; + +SET @GO_ELUNE_ALTAR := 177404; +SET @GO_ELUNE_GEM := 177414; +SET @GO_ELUNE_LIGHT := 177415; +SET @GO_ELUNE_FIRE := 177417; +SET @GO_GUID := 9650; -- Need 7 guids + +-- script_texts for the quest +DELETE FROM `creature_text` WHERE `entry` IN (@NPC_RANSHALLA, @NPC_PRIESTESS_ELUNE, @NPC_VOICE_ELUNE); +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES +(@NPC_RANSHALLA,0,0, 'Remember, I need your help to properly channel. I will ask you to aid me several times in our path, so please be ready.',12,0,100,0,0,0, 'Ranshalla SAY_QUEST_START'), +(@NPC_RANSHALLA,1,0, 'This blue light... It''s strange. What do you think it means?',12,0,100,25,0,0, 'Ranshalla SAY_ENTER_OWL_THICKET'), +(@NPC_RANSHALLA,2,0, 'We''ve found it!',12,0,100,0,0,0, 'Ranshalla SAY_REACH_TORCH_1'), +(@NPC_RANSHALLA,2,1, 'Please, light this while I am channeling',12,0,100,0,0,0, 'Ranshalla SAY_REACH_TORCH_2'), +(@NPC_RANSHALLA,2,2, 'This is the place. Let''s light it.',12,0,100,0,0,0, 'Ranshalla SAY_REACH_TORCH_3'), +(@NPC_RANSHALLA,3,0, 'Let''s find the next one.',12,0,100,0,0,0, 'Ranshalla SAY_AFTER_TORCH_1'), +(@NPC_RANSHALLA,3,1, 'We must continue on now.',12,0,100,0,0,0, 'Ranshalla SAY_AFTER_TORCH_2'), +(@NPC_RANSHALLA,4,0, 'It is time for the final step; we must activate the altar.',12,0,100,0,0,0, 'Ranshalla SAY_REACH_ALTAR_1'), +(@NPC_RANSHALLA,5,0, 'I will read the words carved into the stone, and you must find a way to light it.',12,0,100,0,0,0, 'Ranshalla SAY_REACH_ALTAR_2'), +(@NPC_RANSHALLA,6,0, 'The altar is glowing! We have done it!',12,0,100,0,0,0, 'Ranshalla SAY_RANSHALLA_ALTAR_1'), +(@NPC_RANSHALLA,7,0, 'What is happening? Look!',12,0,100,0,0,0, 'Ranshalla SAY_RANSHALLA_ALTAR_2'), +(@NPC_PRIESTESS_ELUNE,8,0, 'It has been many years...',12,0,100,0,0,0, 'Priestess of Elune SAY_PRIESTESS_ALTAR_3'), +(@NPC_PRIESTESS_ELUNE,9,0, 'Who has disturbed the altar of the goddess?',12,0,100,0,0,0, 'Priestess of Elune SAY_PRIESTESS_ALTAR_4'), +(@NPC_RANSHALLA,10,0, 'Please, priestesses, forgive us for our intrusion. We do not wish any harm here.',12,0,100,0,0,0, 'Ranshalla SAY_RANSHALLA_ALTAR_5'), +(@NPC_RANSHALLA,11,0, 'We only wish to know why the wildkin guard this area...',12,0,100,0,0,0, 'Ranshalla SAY_RANSHALLA_ALTAR_6'), +(@NPC_PRIESTESS_ELUNE,12,0, 'Enu thora''serador. This is a sacred place.',12,0,100,0,0,0, 'Priestess of Elune SAY_PRIESTESS_ALTAR_7'), +(@NPC_PRIESTESS_ELUNE,13,0, 'We will show you...',12,0,100,0,0,0, 'Priestess of Elune SAY_PRIESTESS_ALTAR_8'), +(@NPC_PRIESTESS_ELUNE,14,0, 'Look above you; thara dormil dorah...',12,0,100,0,0,0, 'Priestess of Elune SAY_PRIESTESS_ALTAR_9'), +(@NPC_PRIESTESS_ELUNE,15,0, 'This gem once allowed direct communication with Elune, herself.',12,0,100,0,0,0, 'Priestess of Elune SAY_PRIESTESS_ALTAR_10'), +(@NPC_PRIESTESS_ELUNE,16,0, 'Through the gem, Elune channeled her infinite wisdom...',12,0,100,0,0,0, 'Priestess of Elune SAY_PRIESTESS_ALTAR_11'), +(@NPC_PRIESTESS_ELUNE,17,0, 'Realizing that the gem needed to be protected, we turned to the goddess herself.',12,0,100,0,0,0, 'Priestess of Elune SAY_PRIESTESS_ALTAR_12'), +(@NPC_PRIESTESS_ELUNE,18,0, 'Soon after, we began to have visions of a creature... A creature with the feathers of an owl, but the will and might of a bear...',12,0,100,0,0,0, 'Priestess of Elune SAY_PRIESTESS_ALTAR_13'), +(@NPC_PRIESTESS_ELUNE,19,0, 'It was on that day that the wildkin were given to us. Fierce guardians, the goddess assigned the wildkin to protect all of her sacred places.',12,0,100,0,0,0, 'Priestess of Elune SAY_PRIESTESS_ALTAR_14'), +(@NPC_VOICE_ELUNE,20,0, 'Anu''dorini Talah, Ru shallora enudoril.',12,0,100,0,0,0, 'Voice of Elune SAY_VOICE_ALTAR_15'), +(@NPC_PRIESTESS_ELUNE,21,0, 'But now, many years later, the wildkin have grown more feral, and without the guidance of the goddess, they are confused...',12,0,100,0,0,0, 'Priestess of Elune SAY_PRIESTESS_ALTAR_16'), +(@NPC_PRIESTESS_ELUNE,22,0, 'Without a purpose, they wander... But many find their way back to the sacred areas that they once were sworn to protect.',12,0,100,0,0,0, 'Priestess of Elune SAY_PRIESTESS_ALTAR_17'), +(@NPC_PRIESTESS_ELUNE,23,0, 'Wildkin are inherently magical; this power was bestowed upon them by the goddess.',12,0,100,0,0,0, 'Priestess of Elune SAY_PRIESTESS_ALTAR_18'), +(@NPC_PRIESTESS_ELUNE,24,0, 'Know that wherever you might find them in the world, they are protecting something of importance, as they were entrusted to do so long ago.',12,0,100,0,0,0, 'Priestess of Elune SAY_PRIESTESS_ALTAR_19'), +(@NPC_PRIESTESS_ELUNE,25,0, 'Please, remember what we have shown you...',12,0,100,0,0,0, 'Priestess of Elune SAY_PRIESTESS_ALTAR_20'), +(@NPC_PRIESTESS_ELUNE,26,0, 'Farewell.',12,0,100,0,0,0, 'Priestess of Elune SAY_PRIESTESS_ALTAR_21'), +(@NPC_RANSHALLA,27,0, 'Thank you for you help, $N. I wish you well in your adventures.',12,0,100,0,0,0, 'Ranshalla SAY_RANSHALLA_END_1'), +(@NPC_RANSHALLA,28,0, 'I want to stay here and reflect on what we have seen. Please see Erelas and tell him what we have learned.',12,0,100,0,0,0, 'Ranshalla SAY_RANSHALLA_END_2'), +(@NPC_RANSHALLA,29,0, '%s begins chanting a strange spell...',16,0,100,0,0,0, 'Ranshalla EMOTE_CHANT_SPELL'); + +-- Waypoints for Ranshalla +DELETE FROM `script_waypoint` WHERE `entry`=@NPC_RANSHALLA; +INSERT INTO `script_waypoint` (`entry`,`pointid`,`location_x`,`location_y`,`location_z`,`waittime`,`point_comment`) VALUES +(@NPC_RANSHALLA, 1, 5720.45, -4798.45, 778.23, 0, ''), +(@NPC_RANSHALLA, 2, 5730.22, -4818.34, 777.11, 0, ''), +(@NPC_RANSHALLA, 3, 5728.12, -4835.76, 778.15, 1000, 'SAY_ENTER_OWL_THICKET'), +(@NPC_RANSHALLA, 4, 5718.85, -4865.62, 787.56, 0, ''), +(@NPC_RANSHALLA, 5, 5697.13, -4909.12, 801.53, 0, ''), +(@NPC_RANSHALLA, 6, 5684.20, -4913.75, 801.60, 0, ''), +(@NPC_RANSHALLA, 7, 5674.67, -4915.78, 802.13, 0, ''), +(@NPC_RANSHALLA, 8, 5665.61, -4919.22, 804.85, 0, ''), +(@NPC_RANSHALLA, 9, 5638.22, -4897.58, 804.97, 0, ''), +(@NPC_RANSHALLA, 10, 5632.67, -4892.05, 805.44, 0, 'Cavern 1 - EMOTE_CHANT_SPELL'), +(@NPC_RANSHALLA, 11, 5664.58, -4921.84, 804.91, 0, ''), +(@NPC_RANSHALLA, 12, 5684.21, -4943.81, 802.80, 0, ''), +(@NPC_RANSHALLA, 13, 5724.92, -4983.69, 808.25, 0, ''), +(@NPC_RANSHALLA, 14, 5753.39, -4990.73, 809.84, 0, ''), +(@NPC_RANSHALLA, 15, 5765.62, -4994.89, 809.42, 0, 'Cavern 2 - EMOTE_CHANT_SPELL'), +(@NPC_RANSHALLA, 16, 5724.94, -4983.58, 808.29, 0, ''), +(@NPC_RANSHALLA, 17, 5699.61, -4989.82, 808.03, 0, ''), +(@NPC_RANSHALLA, 18, 5686.80, -5012.17, 807.27, 0, ''), +(@NPC_RANSHALLA, 19, 5691.43, -5037.43, 807.73, 0, ''), +(@NPC_RANSHALLA, 20, 5694.24, -5054.64, 808.85, 0, 'Cavern 3 - EMOTE_CHANT_SPELL'), +(@NPC_RANSHALLA, 21, 5686.88, -5012.18, 807.23, 0, ''), +(@NPC_RANSHALLA, 22, 5664.94, -5001.12, 807.78, 0, ''), +(@NPC_RANSHALLA, 23, 5647.12, -5002.84, 807.54, 0, ''), +(@NPC_RANSHALLA, 24, 5629.23, -5014.88, 807.94, 0, ''), +(@NPC_RANSHALLA, 25, 5611.26, -5025.62, 808.36, 0, 'Cavern 4 - EMOTE_CHANT_SPELL'), +(@NPC_RANSHALLA, 26, 5647.13, -5002.85, 807.57, 0, ''), +(@NPC_RANSHALLA, 27, 5641.12, -4973.22, 809.39, 0, ''), +(@NPC_RANSHALLA, 28, 5622.97, -4953.58, 811.12, 0, ''), +(@NPC_RANSHALLA, 29, 5601.52, -4939.49, 820.77, 0, ''), +(@NPC_RANSHALLA, 30, 5571.87, -4936.22, 831.35, 0, ''), +(@NPC_RANSHALLA, 31, 5543.23, -4933.67, 838.33, 0, ''), +(@NPC_RANSHALLA, 32, 5520.86, -4942.05, 843.02, 0, ''), +(@NPC_RANSHALLA, 33, 5509.15, -4946.31, 849.36, 0, ''), +(@NPC_RANSHALLA, 34, 5498.45, -4950.08, 849.98, 0, ''), +(@NPC_RANSHALLA, 35, 5485.78, -4963.40, 850.43, 0, ''), +(@NPC_RANSHALLA, 36, 5467.92, -4980.67, 851.89, 0, 'Cavern 5 - EMOTE_CHANT_SPELL'), +(@NPC_RANSHALLA, 37, 5498.68, -4950.45, 849.96, 0, ''), +(@NPC_RANSHALLA, 38, 5518.68, -4921.94, 844.65, 0, ''), +(@NPC_RANSHALLA, 39, 5517.66, -4920.82, 845.12, 0, 'SAY_REACH_ALTAR_1'), +(@NPC_RANSHALLA, 40, 5518.38, -4913.47, 845.57, 0, ''), +(@NPC_RANSHALLA, 41, 5511.31, -4913.82, 847.17, 5000, 'light the spotlights'), +(@NPC_RANSHALLA, 42, 5511.31, -4913.82, 847.17, 0, 'start altar cinematic - SAY_RANSHALLA_ALTAR_2'), +(@NPC_RANSHALLA, 43, 5510.47, -4922.38, 846.07, 0, ''), +(@NPC_RANSHALLA, 44, 5517.66, -4920.82, 845.12, 0, 'escort paused'), +(@NPC_RANSHALLA, 45, 5517.6, -4920.8, 845.12, 0, 'dummy to stop despawn'); + +-- creature +UPDATE `creature_template` SET `ScriptName`='npc_ranshalla' WHERE `entry`=@NPC_RANSHALLA; +UPDATE `creature_template` SET `unit_flags`=256 WHERE `entry`=@NPC_GUARDIAN_ELUNE; -- make guardian immune to PCs +-- gameobject +UPDATE `gameobject_template` SET `ScriptName`='go_elune_fire' WHERE `entry` IN (@GO_ELUNE_FIRE, @GO_ELUNE_ALTAR); +UPDATE `gameobject_template` SET `flags`=16 WHERE `entry`=@GO_ELUNE_ALTAR; -- stop people from touching altar early +-- Light and Gem Spawns +DELETE FROM `gameobject` WHERE `id` IN (@GO_ELUNE_GEM, @GO_ELUNE_LIGHT); +INSERT INTO `gameobject` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`rotation0`,`rotation1`,`rotation2`,`rotation3`,`spawntimesecs`,`animprogress`,`state`) VALUES +(@GO_GUID+0,@GO_ELUNE_LIGHT,1,1,1,5515.71,-4905.82,846.322,4.62478,0,0,0.737392,-0.675466,-600,255,1), +(@GO_GUID+1,@GO_ELUNE_LIGHT,1,1,1,5505.09,-4909.36,848.961,5.63402,0,0,0.318914,-0.947784,-600,255,1), +(@GO_GUID+2,@GO_ELUNE_LIGHT,1,1,1,5501.69,-4920.04,848.791,0.155868,0,0,0.0778553,0.996965,-600,255,1), +(@GO_GUID+3,@GO_ELUNE_LIGHT,1,1,1,5510.28,-4929.31,845.214,1.62064,0,0,0.724507,0.689267,-600,255,1), +(@GO_GUID+4,@GO_ELUNE_LIGHT,1,1,1,5520.35,-4925.22,843.644,2.13507,0,0,0.876015,0.482283,-600,255,1), +(@GO_GUID+5,@GO_ELUNE_LIGHT,1,1,1,5526.7,-4916.41,843.452,3.01865,0,0,0.998111,0.0614331,-600,255,1), +(@GO_GUID+6,@GO_ELUNE_GEM,1,1,1,5514.49,-4917.57,850.538,2.3911,0,0,0.930417,0.366502,-900,100,1); + +-- EFFECT1 for 18953 +DELETE FROM `spell_dbc` WHERE `Id`=18954; +INSERT INTO `spell_dbc` (`Id`, `School`, `Category`, `CastUI`, `Dispel`, `Mechanic`, `Attributes`, `AttributesEx`, `AttributesEx2`, `AttributesEx3`, `AttributesEx4`, `Stances`, `StancesNot`, `Targets`, `TargetCreatureType`, `RequiresSpellFocus`, `CasterAuraState`, `TargetAuraState`, `CastingTimeIndex`, `RecoveryTime`, `CategoryRecoveryTime`, `InterruptFlags`, `AuraInterruptFlags`, `ChannelInterruptFlags`, `ProcFlags`, `ProcChance`, `ProcCharges`, `MaxLevel`, `BaseLevel`, `SpellLevel`, `DurationIndex`, `PowerType`, `PowerCost`, `PowerCostPerLevel`, `PowerCostPerSecond`, `PowerCostPerSecondPerLevel`, `RangeIndex`, `Speed`, `ModelNextSpell`, `StackAmount`, `Totem1`, `Totem2`, `Reagent1`, `Reagent2`, `Reagent3`, `Reagent4`, `Reagent5`, `Reagent6`, `Reagent7`, `Reagent8`, `ReagentCount1`, `ReagentCount2`, `ReagentCount3`, `ReagentCount4`, `ReagentCount5`, `ReagentCount6`, `ReagentCount7`, `ReagentCount8`, `EquippedItemClass`, `EquippedItemSubClassMask`, `EquippedItemInventoryTypeMask`, `Effect1`, `Effect2`, `Effect3`, `EffectDieSides1`, `EffectDieSides2`, `EffectDieSides3`, `EffectBaseDice1`, `EffectBaseDice2`, `EffectBaseDice3`, `EffectDicePerLevel1`, `EffectDicePerLevel2`, `EffectDicePerLevel3`, `EffectRealPointsPerLevel1`, `EffectRealPointsPerLevel2`, `EffectRealPointsPerLevel3`, `EffectBasePoints1`, `EffectBasePoints2`, `EffectBasePoints3`, `EffectMechanic1`, `EffectMechanic2`, `EffectMechanic3`, `EffectImplicitTargetA1`, `EffectImplicitTargetA2`, `EffectImplicitTargetA3`, `EffectImplicitTargetB1`, `EffectImplicitTargetB2`, `EffectImplicitTargetB3`, `EffectRadiusIndex1`, `EffectRadiusIndex2`, `EffectRadiusIndex3`, `EffectApplyAuraName1`, `EffectApplyAuraName2`, `EffectApplyAuraName3`, `EffectAmplitude1`, `EffectAmplitude2`, `EffectAmplitude3`, `EffectMultipleValue1`, `EffectMultipleValue2`, `EffectMultipleValue3`, `EffectChainTarget1`, `EffectChainTarget2`, `EffectChainTarget3`, `EffectItemType1`, `EffectItemType2`, `EffectItemType3`, `EffectMiscValue1`, `EffectMiscValue2`, `EffectMiscValue3`, `EffectTriggerSpell1`, `EffectTriggerSpell2`, `EffectTriggerSpell3`, `EffectPointsPerComboPoint1`, `EffectPointsPerComboPoint2`, `EffectPointsPerComboPoint3`, `SpellVisual`, `SpellVisual2`, `SpellIconID`, `ActiveIconID`, `SpellPriority`, `SpellName`, `Rank`, `Description`, `ToolTip`, `ManaCostPercentage`, `StartRecoveryCategory`, `StartRecoveryTime`, `MaxTargetLevel`, `SpellFamilyName`, `SpellFamilyFlags1`, `SpellFamilyFlags2`, `MaxAffectedTargets`, `DmgClass`, `PreventionType`, `StanceBarOrder`, `DmgMultiplier1`, `DmgMultiplier2`, `DmgMultiplier3`, `MinFactionId`, `MinReputation`, `RequiredAuraVision`) VALUES +(18954, 0, 0, 0, 0, 0, 256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 'Ranshalla Despawn', '', '', '', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0); diff --git a/src/server/scripts/Kalimdor/zone_winterspring.cpp b/src/server/scripts/Kalimdor/zone_winterspring.cpp index 06f01033a25..637eda841f5 100644 --- a/src/server/scripts/Kalimdor/zone_winterspring.cpp +++ b/src/server/scripts/Kalimdor/zone_winterspring.cpp @@ -19,17 +19,20 @@ /* ScriptData SDName: Winterspring SD%Complete: Almost Completely Emptied -SDComment: Vendor Rivern Frostwind. +SDComment: Vendor Rivern Frostwind. Quest Support 4901 SDCategory: Winterspring EndScriptData */ /* ContentData npc_rivern_frostwind +npc_ranshalla +go_elune_fire EndContentData */ #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "ScriptedGossip.h" +#include "ScriptedEscortAI.h" #include "Player.h" #include "WorldSession.h" @@ -63,10 +66,559 @@ public: return true; } +}; + +enum Says +{ + // Escort texts + SAY_QUEST_START = 0, + SAY_ENTER_OWL_THICKET = 1, + SAY_REACH_TORCH = 2, + SAY_AFTER_TORCH = 3, + SAY_REACH_ALTAR_1 = 4, + SAY_REACH_ALTAR_2 = 5, + + // After lighting the altar cinematic + SAY_RANSHALLA_ALTAR_1 = 6, + SAY_RANSHALLA_ALTAR_2 = 7, + SAY_PRIESTESS_ALTAR_3 = 8, + SAY_PRIESTESS_ALTAR_4 = 9, + SAY_RANSHALLA_ALTAR_5 = 10, + SAY_RANSHALLA_ALTAR_6 = 11, + SAY_PRIESTESS_ALTAR_7 = 12, + SAY_PRIESTESS_ALTAR_8 = 13, + SAY_PRIESTESS_ALTAR_9 = 14, + SAY_PRIESTESS_ALTAR_10 = 15, + SAY_PRIESTESS_ALTAR_11 = 16, + SAY_PRIESTESS_ALTAR_12 = 17, + SAY_PRIESTESS_ALTAR_13 = 18, + SAY_PRIESTESS_ALTAR_14 = 19, + SAY_VOICE_ALTAR_15 = 20, + SAY_PRIESTESS_ALTAR_16 = 21, + SAY_PRIESTESS_ALTAR_17 = 22, + SAY_PRIESTESS_ALTAR_18 = 23, + SAY_PRIESTESS_ALTAR_19 = 24, + SAY_PRIESTESS_ALTAR_20 = 25, + SAY_PRIESTESS_ALTAR_21 = 26, + SAY_RANSHALLA_END_1 = 27, + SAY_RANSHALLA_END_2 = 28, + + EMOTE_CHANT_SPELL = 29, +}; + +enum Spells +{ + SPELL_LIGHT_TORCH = 18953, // channeled spell by Ranshalla while waiting for the torches / altar +}; + +enum NPCs +{ + NPC_RANSHALLA = 10300, + NPC_PRIESTESS_ELUNE = 12116, + NPC_VOICE_ELUNE = 12152, + NPC_GUARDIAN_ELUNE = 12140, +}; + +enum GOs +{ + GO_ELUNE_ALTAR = 177404, + GO_ELUNE_FIRE = 177417, + GO_ELUNE_GEM = 177414, // is respawned in script + GO_ELUNE_LIGHT = 177415, // are respawned in script +}; + +enum Quests +{ + QUEST_GUARDIANS_ALTAR = 4901, +}; + +enum Dummies +{ + NPC_PRIESTESS_DATA_1 = -1, // dummy member for the first priestess (right) + NPC_PRIESTESS_DATA_2 = -2, // dummy member for the second priestess (left) + DATA_MOVE_PRIESTESS = -3, // dummy member to check the priestess movement + DATA_EVENT_END = -4, // dummy member to indicate the event end + + EVENT_RESUME = 1, // trigger rest of event +}; + +// DialogueHelper (imported from SD) + +struct DialogueEntry +{ + int32 TextEntry; ///< To be said text entry + uint32 SayerEntry; ///< Entry of the mob who should say + uint32 SayTimer; ///< Time delay until next text of array is said (0 stops) +}; + +class DialogueHelper +{ +public: + // The array MUST be terminated by {0,0,0} + DialogueHelper(DialogueEntry const* dialogueArray) : + _dialogueArray(dialogueArray), + _currentEntry(NULL), + _actionTimer(0), + _isFirstSide(true) + {} + // The array MUST be terminated by {0,0,0,0,0} + + /// Function to initialize the dialogue helper for instances. If not used with instances, GetSpeakerByEntry MUST be overwritten to obtain the speakers + /// Set if take first entries or second entries + + void StartNextDialogueText(int32 textEntry) + { + // Find textEntry + bool found = false; + + for (DialogueEntry const* entry = _dialogueArray; entry->TextEntry; ++entry) + { + if (entry->TextEntry == textEntry) + { + _currentEntry = entry; + found = true; + break; + } + } + + if (!found) + { + return; + } + + DoNextDialogueStep(); + } + + void DialogueUpdate(uint32 diff) + { + if (_actionTimer) + { + if (_actionTimer <= diff) + DoNextDialogueStep(); + else + _actionTimer -= diff; + } + } + +protected: + /// Will be called when a dialogue step was done + virtual void JustDidDialogueStep(int32 entry) {} + /// Will be called to get a speaker, MUST be implemented if not used in instances + virtual Creature* GetSpeakerByEntry(uint32 entry) { return NULL; } + +private: + void DoNextDialogueStep() + { + // Last Dialogue Entry done? + if (_currentEntry && !_currentEntry->TextEntry) + { + _actionTimer = 0; + return; + } + + // Get Text, SpeakerEntry and Timer + int32 textEntry = _currentEntry->TextEntry; + uint32 sayerEntry = _currentEntry->SayerEntry; + _actionTimer = _currentEntry->SayTimer; + + // Simulate Case + if (sayerEntry && textEntry >= 0) + { + // Use Speaker if directly provided + if(Creature* speaker = GetSpeakerByEntry(sayerEntry)) + speaker->AI()->Talk(textEntry); + } + + JustDidDialogueStep(_currentEntry->TextEntry); + + // Increment position + ++_currentEntry; + } + + DialogueEntry const* _dialogueArray; + DialogueEntry const* _currentEntry; + + uint32 _actionTimer; + bool _isFirstSide; +}; + +const DialogueEntry introDialogue[] = +{ + {SAY_REACH_ALTAR_1, NPC_RANSHALLA, 2000}, + {SAY_REACH_ALTAR_2, NPC_RANSHALLA, 3000}, + {NPC_RANSHALLA, 0, 0}, // start the altar channeling + {SAY_PRIESTESS_ALTAR_3, NPC_PRIESTESS_DATA_2, 1000}, + {SAY_PRIESTESS_ALTAR_4, NPC_PRIESTESS_DATA_1, 4000}, + {SAY_RANSHALLA_ALTAR_5, NPC_RANSHALLA, 4000}, + {SAY_RANSHALLA_ALTAR_6, NPC_RANSHALLA, 4000}, // start the escort here + {SAY_PRIESTESS_ALTAR_7, NPC_PRIESTESS_DATA_2, 4000}, + {SAY_PRIESTESS_ALTAR_8, NPC_PRIESTESS_DATA_2, 5000}, // show the gem + {GO_ELUNE_GEM, 0, 5000}, + {SAY_PRIESTESS_ALTAR_9, NPC_PRIESTESS_DATA_1, 4000}, // move priestess 1 near me + {NPC_PRIESTESS_DATA_1, 0, 3000}, + {SAY_PRIESTESS_ALTAR_10, NPC_PRIESTESS_DATA_1, 5000}, + {SAY_PRIESTESS_ALTAR_11, NPC_PRIESTESS_DATA_1, 4000}, + {SAY_PRIESTESS_ALTAR_12, NPC_PRIESTESS_DATA_1, 5000}, + {SAY_PRIESTESS_ALTAR_13, NPC_PRIESTESS_DATA_1, 8000}, // summon voice and guard of elune + {NPC_VOICE_ELUNE, 0, 12000}, + {SAY_VOICE_ALTAR_15, NPC_VOICE_ELUNE, 5000}, // move priestess 2 near me + {NPC_PRIESTESS_DATA_2, 0, 3000}, + {SAY_PRIESTESS_ALTAR_16, NPC_PRIESTESS_DATA_2, 4000}, + {SAY_PRIESTESS_ALTAR_17, NPC_PRIESTESS_DATA_2, 6000}, + {SAY_PRIESTESS_ALTAR_18, NPC_PRIESTESS_DATA_1, 5000}, + {SAY_PRIESTESS_ALTAR_19, NPC_PRIESTESS_DATA_1, 3000}, // move the owlbeast + {NPC_GUARDIAN_ELUNE, 0, 2000}, + {SAY_PRIESTESS_ALTAR_20, NPC_PRIESTESS_DATA_1, 4000}, // move the first priestess up + {SAY_PRIESTESS_ALTAR_21, NPC_PRIESTESS_DATA_2, 10000}, // move second priestess up + {DATA_MOVE_PRIESTESS, 0, 6000}, // despawn the gem + {DATA_EVENT_END, 0, 2000}, // turn towards the player + {SAY_RANSHALLA_END_2, NPC_RANSHALLA, 0}, + {0, 0, 0}, +}; + +static Position wingThicketLocations[] = +{ + {5515.98f, -4903.43f, 846.30f, 4.58f}, // 0 right priestess summon loc + {5501.94f, -4920.20f, 848.69f, 6.15f}, // 1 left priestess summon loc + {5497.35f, -4906.49f, 850.83f, 2.76f}, // 2 guard of elune summon loc + {5518.38f, -4913.47f, 845.57f}, // 3 right priestess move loc + {5510.36f, -4921.17f, 846.33f}, // 4 left priestess move loc + {5511.31f, -4913.82f, 847.17f}, // 5 guard of elune move loc + {5518.51f, -4917.56f, 845.23f}, // 6 right priestess second move loc + {5514.40f, -4921.16f, 845.49f} // 7 left priestess second move loc +}; + +/*##### +# npc_ranshalla +#####*/ + +class npc_ranshalla : public CreatureScript +{ +public: + npc_ranshalla() : CreatureScript("npc_ranshalla") { } + bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) + { + if (quest->GetQuestId() == QUEST_GUARDIANS_ALTAR) + { + creature->AI()->Talk(SAY_QUEST_START); + creature->setFaction(FACTION_ESCORT_A_NEUTRAL_PASSIVE); + + if (npc_ranshallaAI* escortAI = dynamic_cast<npc_ranshallaAI*>(creature->AI())) + escortAI->Start(false, false, player->GetGUID(), quest); + + return true; + } + + return false; + } + CreatureAI* GetAI(Creature* creature) const + { + return new npc_ranshallaAI(creature); + } + + struct npc_ranshallaAI : public npc_escortAI, private DialogueHelper + { + npc_ranshallaAI(Creature* creature) : npc_escortAI(creature), + DialogueHelper(introDialogue) + { + Reset(); + } + + uint32 _delayTimer; + + uint64 _firstPriestessGUID; + uint64 _secondPriestessGUID; + uint64 _guardEluneGUID; + uint64 _voiceEluneGUID; + uint64 _altarGUID; + + void Reset() + { + _delayTimer = 0; + } + + // Called when the player activates the torch / altar + void DoContinueEscort(bool isAltarWaypoint = false) + { + me->InterruptNonMeleeSpells(false); + + if (isAltarWaypoint) + Talk(SAY_RANSHALLA_ALTAR_1); + else + Talk(SAY_AFTER_TORCH); + + _delayTimer = 2000; + } + + // Called when Ranshalla starts to channel on a torch / altar + void DoChannelTorchSpell(bool isAltarWaypoint = false) + { + // Check if we are using the fire or the altar and remove the no_interact flag + if (isAltarWaypoint) + { + if (GameObject* go = GetClosestGameObjectWithEntry(me, GO_ELUNE_ALTAR, 10.0f)) + { + go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + me->SetFacingToObject(go); + _altarGUID = go->GetGUID(); + } + } + else if (GameObject* go = GetClosestGameObjectWithEntry(me, GO_ELUNE_FIRE, 10.0f)) + go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + // Yell and set escort to pause + Talk(SAY_REACH_TORCH); + Talk(EMOTE_CHANT_SPELL); + SetEscortPaused(true); + DoCast(me, SPELL_LIGHT_TORCH); + } + + void DoSummonPriestess() + { + // Summon 2 Elune priestess and make each of them move to a different spot + if (Creature* priestess = me->SummonCreature(NPC_PRIESTESS_ELUNE, wingThicketLocations[0].m_positionX, wingThicketLocations[0].m_positionY, wingThicketLocations[0].m_positionZ, wingThicketLocations[0].m_orientation, TEMPSUMMON_CORPSE_DESPAWN, 0)) + { + priestess->GetMotionMaster()->MovePoint(0, wingThicketLocations[3].m_positionX, wingThicketLocations[3].m_positionY, wingThicketLocations[3].m_positionZ); + _firstPriestessGUID = priestess->GetGUID(); + } + if (Creature* priestess = me->SummonCreature(NPC_PRIESTESS_ELUNE, wingThicketLocations[1].m_positionX, wingThicketLocations[1].m_positionY, wingThicketLocations[1].m_positionZ, wingThicketLocations[1].m_orientation, TEMPSUMMON_CORPSE_DESPAWN, 0)) + { + // Left priestess should have a distinct move point because she is the one who starts the dialogue at point reach + priestess->GetMotionMaster()->MovePoint(1, wingThicketLocations[4].m_positionX, wingThicketLocations[4].m_positionY, wingThicketLocations[4].m_positionZ); + _secondPriestessGUID = priestess->GetGUID(); + } + } + + void SummonedMovementInform(Creature* summoned, uint32 type, uint32 pointId) + { + if (type != POINT_MOTION_TYPE || summoned->GetEntry() != NPC_PRIESTESS_ELUNE || pointId != 1) + return; + + // Start the dialogue when the priestess reach the altar (they should both reach the point in the same time) + StartNextDialogueText(SAY_PRIESTESS_ALTAR_3); + } + + void WaypointReached(uint32 pointId) + { + switch(pointId) + { + case 3: + Talk(SAY_ENTER_OWL_THICKET); + break; + case 10: // Cavern 1 + case 15: // Cavern 2 + case 20: // Cavern 3 + case 25: // Cavern 4 + case 36: // Cavern 5 + DoChannelTorchSpell(); + break; + case 39: + StartNextDialogueText(SAY_REACH_ALTAR_1); + SetEscortPaused(true); + break; + case 41: + { + // Search for all nearest lights and respawn them + std::list<GameObject*> eluneLights; + GetGameObjectListWithEntryInGrid(eluneLights, me, GO_ELUNE_LIGHT, 20.0f); + for (std::list<GameObject*>::const_iterator itr = eluneLights.begin(); itr != eluneLights.end(); ++itr) + { + if ((*itr)->isSpawned()) + continue; + + (*itr)->SetRespawnTime(115); + (*itr)->Refresh(); + } + + if (GameObject* altar = me->GetMap()->GetGameObject(_altarGUID)) + me->SetFacingToObject(altar); + break; + } + case 42: + // Summon the 2 priestess + SetEscortPaused(true); + DoSummonPriestess(); + Talk(SAY_RANSHALLA_ALTAR_2); + events.ScheduleEvent(EVENT_RESUME,2000); + break; + case 44: + // Stop the escort and turn towards the altar + SetEscortPaused(true); + if (GameObject* altar = me->GetMap()->GetGameObject(_altarGUID)) + me->SetFacingToObject(altar); + break; + } + } + + void JustDidDialogueStep(int32 entry) + { + switch (entry) + { + case NPC_RANSHALLA: + // Start the altar channeling + DoChannelTorchSpell(true); + break; + case SAY_RANSHALLA_ALTAR_6: + SetEscortPaused(false); + break; + case SAY_PRIESTESS_ALTAR_8: + // make the gem respawn + if (GameObject* gem = GetClosestGameObjectWithEntry(me, GO_ELUNE_GEM, 10.0f)) + { + if (gem->isSpawned()) + break; + + gem->SetRespawnTime(90); + gem->Refresh(); + } + break; + case SAY_PRIESTESS_ALTAR_9: + // move near the escort npc + if (Creature* priestess = me->GetMap()->GetCreature(_firstPriestessGUID)) + priestess->GetMotionMaster()->MovePoint(0, wingThicketLocations[6].m_positionX, wingThicketLocations[6].m_positionY, wingThicketLocations[6].m_positionZ); + break; + case SAY_PRIESTESS_ALTAR_13: + // summon the Guardian of Elune + if (Creature* guard = me->SummonCreature(NPC_GUARDIAN_ELUNE, wingThicketLocations[2].m_positionX, wingThicketLocations[2].m_positionY, wingThicketLocations[2].m_positionZ, wingThicketLocations[2].m_orientation, TEMPSUMMON_CORPSE_DESPAWN, 0)) + { + guard->GetMotionMaster()->MovePoint(0, wingThicketLocations[5].m_positionX, wingThicketLocations[5].m_positionY, wingThicketLocations[5].m_positionZ); + _guardEluneGUID = guard->GetGUID(); + } + // summon the Voice of Elune + if (GameObject* altar = me->GetMap()->GetGameObject(_altarGUID)) + { + if (Creature* voice = me->SummonCreature(NPC_VOICE_ELUNE, altar->GetPositionX(), altar->GetPositionY(), altar->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 30000)) + _voiceEluneGUID = voice->GetGUID(); + } + break; + case SAY_VOICE_ALTAR_15: + // move near the escort npc and continue dialogue + if (Creature* priestess = me->GetMap()->GetCreature(_secondPriestessGUID)) + { + priestess->AI()->Talk(SAY_PRIESTESS_ALTAR_14); + priestess->GetMotionMaster()->MovePoint(0, wingThicketLocations[7].m_positionX, wingThicketLocations[7].m_positionY, wingThicketLocations[7].m_positionZ); + } + break; + case SAY_PRIESTESS_ALTAR_19: + // make the voice of elune leave + if (Creature* guard = me->GetMap()->GetCreature(_guardEluneGUID)) + { + guard->GetMotionMaster()->MovePoint(0, wingThicketLocations[2].m_positionX, wingThicketLocations[2].m_positionY, wingThicketLocations[2].m_positionZ); + guard->DespawnOrUnsummon(4000); + } + break; + case SAY_PRIESTESS_ALTAR_20: + // make the first priestess leave + if (Creature* priestess = me->GetMap()->GetCreature(_firstPriestessGUID)) + { + priestess->GetMotionMaster()->MovePoint(0, wingThicketLocations[0].m_positionX, wingThicketLocations[0].m_positionY, wingThicketLocations[0].m_positionZ); + priestess->DespawnOrUnsummon(4000); + } + break; + case SAY_PRIESTESS_ALTAR_21: + // make the second priestess leave + if (Creature* priestess = me->GetMap()->GetCreature(_secondPriestessGUID)) + { + priestess->GetMotionMaster()->MovePoint(0, wingThicketLocations[1].m_positionX, wingThicketLocations[1].m_positionY, wingThicketLocations[1].m_positionZ); + priestess->DespawnOrUnsummon(4000); + } + break; + case DATA_EVENT_END: + // Turn towards the player + if (Player* player = GetPlayerForEscort()) + { + me->SetFacingToObject(player); + Talk(SAY_RANSHALLA_END_1, player->GetGUID()); + } + break; + case SAY_RANSHALLA_END_2: + // Turn towards the altar and kneel - quest complete + if (GameObject* altar = me->GetMap()->GetGameObject(_altarGUID)) + { + me->SetFacingToObject(altar); + altar->ResetDoorOrButton(); + } + me->SetStandState(UNIT_STAND_STATE_KNEEL); + if (Player* player = GetPlayerForEscort()) + { + player->GroupEventHappens(QUEST_GUARDIANS_ALTAR, me); + Talk(SAY_RANSHALLA_END_2, player->GetGUID()); + } + me->DespawnOrUnsummon(4000); + break; + } + } + + Creature* GetSpeakerByEntry(uint32 entry) + { + switch (entry) + { + case NPC_RANSHALLA: return me; + case NPC_VOICE_ELUNE: return me->GetMap()->GetCreature(_voiceEluneGUID); + case NPC_PRIESTESS_DATA_1: return me->GetMap()->GetCreature(_firstPriestessGUID); + case NPC_PRIESTESS_DATA_2: return me->GetMap()->GetCreature(_secondPriestessGUID); + + default: + return NULL; + } + + } + + void UpdateEscortAI(const uint32 diff) + { + DialogueUpdate(diff); + + if (_delayTimer) + { + if (_delayTimer <= diff) + { + SetEscortPaused(false); + _delayTimer = 0; + } + else + _delayTimer -= diff; + } + events.Update(diff); + if (events.ExecuteEvent() == EVENT_RESUME) + StartNextDialogueText(SAY_PRIESTESS_ALTAR_3); + + npc_escortAI::UpdateEscortAI(diff); + } + private: + EventMap events; + }; +}; + +/*##### +# go_elune_fire +#####*/ + +class go_elune_fire : public GameObjectScript +{ +public: + go_elune_fire() : GameObjectScript("go_elune_fire") { } + bool OnGossipHello(Player* player, GameObject* go) + { + // Check if we are using the torches or the altar + bool isAltar = false; + + if (go->GetEntry() == GO_ELUNE_ALTAR) + isAltar = true; + + if (Creature* ranshalla = GetClosestCreatureWithEntry(go, NPC_RANSHALLA, 10.0f)) + { + if (npc_ranshalla::npc_ranshallaAI* escortAI = dynamic_cast<npc_ranshalla::npc_ranshallaAI*>(ranshalla->AI())) + escortAI->DoContinueEscort(isAltar); + } + go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + + return false; + } }; void AddSC_winterspring() { new npc_rivern_frostwind(); + new npc_ranshalla(); + new go_elune_fire(); } |