From b6ad5bf8adb0138da9b678c930034cf470c5f8dd Mon Sep 17 00:00:00 2001 From: Malcrom Date: Sun, 31 Oct 2021 12:41:21 -0300 Subject: [PATCH] fix(Scripts/Northrend): Last Rites [Quest 12019] (#8691) --- .../rev_1634939032065262806.sql | 102 +++ .../scripts/Northrend/zone_borean_tundra.cpp | 660 ++++++++++++++++++ 2 files changed, 762 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1634939032065262806.sql diff --git a/data/sql/updates/pending_db_world/rev_1634939032065262806.sql b/data/sql/updates/pending_db_world/rev_1634939032065262806.sql new file mode 100644 index 000000000..f9024715c --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1634939032065262806.sql @@ -0,0 +1,102 @@ +INSERT INTO `version_db_world` (`sql_rev`) VALUES ('1634939032065262806'); + +-- *** Quest "Last rites" *** + +-- Remove Quest SAI +UPDATE `creature_template` SET `AIName`='' WHERE `entry` IN (26170,26203,25301,25250,25251); +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (26170,26203,25301,25250,25251) AND `source_type`=0; +DELETE FROM `waypoints` WHERE `entry` IN (26170); + +-- Add Gossip Option +DELETE FROM `gossip_menu_option` WHERE `MenuID`=9417; +INSERT INTO `gossip_menu_option` (`MenuID`,`OptionID`,`OptionIcon`,`OptionText`,`OptionBroadcastTextID`,`OptionType`,`OptionNpcFlag`,`ActionMenuID`,`ActionPoiID`,`BoxCoded`,`BoxMoney`,`BoxText`,`BoxBroadcastTextID`,`VerifiedBuild`) VALUES +(9417,0,0,"Let's do this, Thassarian. It's now or never.",25840,1,1,0,0,0,0,NULL,0,0); + +-- Add Gossip Text +DELETE FROM `gossip_menu` WHERE `MenuID`=9417 AND `TextID`=12664; +INSERT INTO `gossip_menu` (`MenuID`,`TextID`) VALUES +(9417,12664); + +-- Condition for source Gossip menu condition type Area id +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=9417 AND `SourceEntry` IN (12663,12664) AND `SourceId`=0; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(14, 9417, 12663, 0, 0, 23, 0, 4126, 0, 0, 0, 0, 0, '', 'Show gossip menu 9417 text id 12663 if target area is The Wailing Ziggurat.'), +(14, 9417, 12664, 0, 0, 23, 0, 4128, 0, 0, 0, 0, 0, '', 'Show gossip menu 9417 text id 12664 if target area is Naxxanar.'); + +-- Condition for source Gossip menu option condition type Quest taken +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=9417 AND `SourceEntry`=0 AND `SourceId`=0; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(15, 9417, 0, 0, 0, 9, 0, 12019, 0, 0, 0, 0, 0, '', 'Show gossip menu 9417 option id 0 if quest Last Rites has been taken.'), +(15, 9417, 0, 0, 0, 23, 0, 4128, 0, 0, 0, 0, 0, '', 'Show gossip menu 9417 option id 0 if target area is Naxxanar.'); + +-- Pathing for Thassarian entry 26170 Quest script for "Last Rites" +SET @PATH := 1013030; +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,3700.08,3574.54,473.322,0,0,0,100,0), +(@PATH,2,3705.94,3573.63,476.841,0,0,0,100,0), +(@PATH,3,3714.32,3572.3,477.442,0,0,0,100,0); + +-- Pathing for Arthas entry 26203 Quest script for "Last Rites" +SET @PATH := 1013031; +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,3733.2195,3538.1602,477.44214,0,0,0,100,0), +(@PATH,2,3736.5,3556.1494,477.44086,0,0,0,100,0), +(@PATH,3,3737.5398,3565.2202,477.44086,0,0,0,100,0); + +-- Pathing for Talbot entry 25301 Quest script for "Last Rites" +SET @PATH := 1013032; +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,3746.96,3607.5063,473.32144,0,0,0,100,0), +(@PATH,2,3742.525,3586.4636,477.44086,0,0,0,100,0), +(@PATH,3,3738.237,3570.3462,477.44086,0,0,0,100,0); + +-- Pathing for Arlos entry 25250 Quest script for "Last Rites" +SET @PATH := 1013033; +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,3742.4668,3598.8833,477.44287,0,0,0,100,0), +(@PATH,2,3739.2288,3587.0754,477.44086,0,0,0,100,0), +(@PATH,3,3735.5718,3572.422,477.44086,0,0,0,100,0); + +-- Pathing for Leryssa entry 25251 Quest script for "Last Rites" +SET @PATH := 1013034; +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,3750.0989,3603.0605,474.0086,0,0,0,100,0), +(@PATH,2,3747.6187,3591.2925,477.44186,0,0,0,100,0), +(@PATH,3,3741.9653,3571.4446,477.44086,0,0,0,100,0); + +-- Add scriptnames +UPDATE `creature_template` SET `ScriptName`='npc_leryssa' WHERE `entry`=25251; +UPDATE `creature_template` SET `ScriptName`='npc_counselor_talbot' WHERE `entry`=25301; +UPDATE `creature` SET `ScriptName`='npc_thassarian' WHERE `guid`=101136; +UPDATE `creature` SET `ScriptName`='npc_thassarian2' WHERE `guid`=101303; + +-- Image of the Lich King flags were wrong +UPDATE `creature_template` SET `unit_flags`=768 WHERE `entry`=26203; + +-- Prince Valanar fix class and expansion and add missing loot +UPDATE `creature_template` SET `exp`=2, `unit_class`=8, `lootid`=28189,`mingold`=3000, `maxgold`=6500 WHERE `entry`=28189; + +-- Prince Valanar loot "Just an educated guess after watching several videos" +DELETE FROM `creature_loot_template` WHERE `entry`=28189; +INSERT INTO `creature_loot_template` (`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES +(28189, 33373, 0, 10, 0, 1, 1, 1, 1, 'Fur-lined-belt'), +(28189, 33374, 0, 10, 0, 1, 1, 1, 1, 'Fur-lined-boots'), +(28189, 33375, 0, 10, 0, 1, 1, 1, 1, 'Fur-lined-bracers'), +(28189, 33376, 0, 10, 0, 1, 1, 1, 1, 'Fur-lined-gloves'), +(28189, 33377, 0, 10, 0, 1, 1, 1, 1, 'Fur-lined-pants'), +(28189, 33470, 0, 50, 0, 1, 2, 1, 3, 'Frostweave Cloth'); + +-- creature Thassarian kill should not give XP +UPDATE `creature_template` SET `flags_extra`=64 WHERE `entry`=26170; +-- High Deathpriest Isidorus should constantly play beg emote +UPDATE `creature_addon` SET `emote`=20 WHERE `guid`=101355; + +-- Condition for source Spell implicit target condition type Object entry guid +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=46685; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 1, 46685, 0, 0, 31, 0, 3, 26173, 0, 0, 0, 0, '', 'Spell Borean Tundra - Quest - Thassarian Flay (effect 0) will hit the potential target of the spell if target is unit Tanathal.'); diff --git a/src/server/scripts/Northrend/zone_borean_tundra.cpp b/src/server/scripts/Northrend/zone_borean_tundra.cpp index 4d08903bb..32f32b871 100644 --- a/src/server/scripts/Northrend/zone_borean_tundra.cpp +++ b/src/server/scripts/Northrend/zone_borean_tundra.cpp @@ -1428,10 +1428,670 @@ public: } }; +/*###### +## Quest 12019: Last Rites +######*/ + +// NPC 26170: Thassarian +enum Thassarian +{ + EVENT_THASSARIAN_SCRIPT_1 = 1, + EVENT_THASSARIAN_SCRIPT_2 = 2, + EVENT_THASSARIAN_SCRIPT_3 = 3, + EVENT_THASSARIAN_SCRIPT_4 = 4, + EVENT_THASSARIAN_SCRIPT_5 = 5, + EVENT_THASSARIAN_SCRIPT_6 = 6, + EVENT_THASSARIAN_SCRIPT_7 = 7, + EVENT_THASSARIAN_SCRIPT_8 = 8, + EVENT_THASSARIAN_SCRIPT_9 = 9, + EVENT_THASSARIAN_SCRIPT_10 = 10, + EVENT_THASSARIAN_SCRIPT_11 = 11, + EVENT_THASSARIAN_SCRIPT_12 = 12, + EVENT_THASSARIAN_SCRIPT_13 = 13, + EVENT_THASSARIAN_SCRIPT_14 = 14, + EVENT_THASSARIAN_SCRIPT_15 = 15, + EVENT_THASSARIAN_SCRIPT_16 = 16, + EVENT_THASSARIAN_SCRIPT_17 = 17, + EVENT_THASSARIAN_SCRIPT_18 = 18, + EVENT_THASSARIAN_SCRIPT_19 = 19, + EVENT_THASSARIAN_SCRIPT_20 = 20, + EVENT_THASSARIAN_SCRIPT_21 = 21, + EVENT_THASSARIAN_SCRIPT_22 = 22, + EVENT_THASSARIAN_SCRIPT_23 = 23, + EVENT_THASSARIAN_SCRIPT_24 = 24, + EVENT_THASSARIAN_SCRIPT_25 = 25, + EVENT_THASSARIAN_SCRIPT_26 = 26, + EVENT_THASSARIAN_SCRIPT_27 = 27, + EVENT_THASSARIAN_SCRIPT_28 = 28, + EVENT_THASSARIAN_SCRIPT_29 = 29, + EVENT_THASSARIAN_CAST = 30, + FACTION_UNDEAD_SCOURGE = 974, + FACTION_VALIANCE_EXPEDITION_7 = 1974, + FACTION_UNDEAD_SCOURGE_9 = 1988, + NPC_IMAGE_LICH_KING = 26203, + NPC_COUNSELOR_TALBOT = 25301, + NPC_PRINCE_VALANAR = 28189, + NPC_GENERAL_ARLOS = 25250, + NPC_LERYSSA = 25251, + NPC_TANATHAL = 26173, + SPELL_THASSARIAN_FLAY = 46685, + SPELL_TRANSFORM_VALANAR = 46753, + SPELL_BLOOD_PRESENCE = 50995, + SAY_THASSARIAN_1 = 0, + SAY_THASSARIAN_2 = 1, + SAY_THASSARIAN_3 = 2, + SAY_THASSARIAN_4 = 3, + SAY_THASSARIAN_5 = 4, + SAY_THASSARIAN_6 = 5, + SAY_THASSARIAN_7 = 6, + SAY_TALBOT_1 = 0, + SAY_TALBOT_2 = 1, + SAY_TALBOT_3 = 2, + SAY_TALBOT_4 = 3, + SAY_LICH_1 = 0, + SAY_LICH_2 = 1, + SAY_LICH_3 = 2, + SAY_ARLOS_1 = 0, + SAY_ARLOS_2 = 1, + SAY_LERYSSA_1 = 0, + SAY_LERYSSA_2 = 1, + SAY_LERYSSA_3 = 2, + SAY_LERYSSA_4 = 3, + PATH_THASSARIAN = 1013030, + PATH_ARTHAS = 1013031, + PATH_TALBOT = 1013032, + PATH_ARLOS = 1013033, + PATH_LERYSSA = 1013034 +}; + +class npc_thassarian : public CreatureScript +{ +public: + npc_thassarian() : CreatureScript("npc_thassarian") {} + + struct npc_thassarianAI : public ScriptedAI + { + npc_thassarianAI(Creature* creature) : ScriptedAI(creature){} + + void Reset() override + { + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_IMMUNE_TO_PC); + _events.ScheduleEvent(EVENT_THASSARIAN_CAST, 1000); + } + + void UpdateAI(uint32 diff) override + { + _events.Update(diff); + + if (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_THASSARIAN_CAST: + { + if (Unit* tanathal = me->FindNearestCreature(NPC_TANATHAL, 10.0f)) + { + me->CastSpell(tanathal, SPELL_THASSARIAN_FLAY); + } + } + } + } + } + private: + EventMap _events; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_thassarianAI(creature); + } +}; + +class npc_thassarian2 : public CreatureScript +{ +public: + npc_thassarian2() : CreatureScript("npc_thassarian2") {} + + struct npc_thassarian2AI : public ScriptedAI + { + npc_thassarian2AI(Creature* creature) : ScriptedAI(creature) + { + Initialize(); + } + + void Initialize() + { + _arthasGUID.Clear(); + _talbotGUID.Clear(); + _leryssaGUID.Clear(); + _arlosGUID.Clear(); + } + + void Reset() override + { + me->setFaction(FACTION_VALIANCE_EXPEDITION_7); + me->SetStandState(UNIT_STAND_STATE_STAND); + me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER); + me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + Initialize(); + } + + void SetData(uint32 /*type*/, uint32 data) override + { + switch (data) + { + case NPC_LERYSSA: + { + if (Creature* arlos = ObjectAccessor::GetCreature(*me, _arlosGUID)) + { + arlos->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_STUN); + } + if (Creature* leryssa = ObjectAccessor::GetCreature(*me, _leryssaGUID)) + { + leryssa->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_STUN); + leryssa->SetOrientation(4.537856f); + } + _events.ScheduleEvent(EVENT_THASSARIAN_SCRIPT_8, 1000); + break; + } + case NPC_COUNSELOR_TALBOT: + { + _events.ScheduleEvent(EVENT_THASSARIAN_SCRIPT_18, 0); + } + break; + default: + break; + } + } + + void MovementInform(uint32 type, uint32 param) override + { + if (type == WAYPOINT_MOTION_TYPE && param == 2) + { + me->SetWalk(false); + me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY1H); + _events.ScheduleEvent(EVENT_THASSARIAN_SCRIPT_1, 2000); + } + } + + void UpdateAI(uint32 diff) override + { + _events.Update(diff); + + if (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_THASSARIAN_SCRIPT_1: + // Summon Arthas and Talbot + if (Creature* arthas = me->SummonCreature(NPC_IMAGE_LICH_KING, 3729.4614f, 3520.386f, 473.4048f, 1.361f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 120000)) + { + _arthasGUID = arthas->GetGUID(); + arthas->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + arthas->SetReactState(REACT_PASSIVE); + arthas->SetWalk(true); + } + if (Creature* talbot = me->SummonCreature(NPC_COUNSELOR_TALBOT, 3748.7627f, 3614.0374f, 473.4048f, 4.5553f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 120000)) + { + _talbotGUID = talbot->GetGUID(); + talbot->SetWalk(true); + } + _events.ScheduleEvent(EVENT_THASSARIAN_SCRIPT_2, 1000); + break; + case EVENT_THASSARIAN_SCRIPT_2: + // Arthas load path + if (Creature* arthas = ObjectAccessor::GetCreature(*me, _arthasGUID)) + { + arthas->GetMotionMaster()->MovePath(PATH_ARTHAS, false); + } + _events.ScheduleEvent(EVENT_THASSARIAN_SCRIPT_3, 1000); + break; + case EVENT_THASSARIAN_SCRIPT_3: + // Talbot load path + if (Creature* talbot = ObjectAccessor::GetCreature(*me, _talbotGUID)) + { + talbot->GetMotionMaster()->MovePath(PATH_TALBOT, false); + } + _events.ScheduleEvent(EVENT_THASSARIAN_SCRIPT_4, 20000); + break; + case EVENT_THASSARIAN_SCRIPT_4: + // Talbot transform and knell + if (Creature* talbot = ObjectAccessor::GetCreature(*me, _talbotGUID)) + { + talbot->CastSpell(talbot, SPELL_TRANSFORM_VALANAR); + talbot->UpdateEntry(NPC_PRINCE_VALANAR); + talbot->SetFullHealth(); + talbot->setFaction(FACTION_UNDEAD_SCOURGE); + talbot->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + talbot->SetReactState(REACT_PASSIVE); + talbot->SetStandState(UNIT_STAND_STATE_KNEEL); + } + _events.ScheduleEvent(EVENT_THASSARIAN_SCRIPT_5, 7000); + break; + case EVENT_THASSARIAN_SCRIPT_5: + // Talbot say text 1 + if (Creature* talbot = ObjectAccessor::GetCreature(*me, _talbotGUID)) + { + talbot->AI()->Talk(SAY_TALBOT_1); + } + _events.ScheduleEvent(EVENT_THASSARIAN_SCRIPT_6, 9000); + break; + case EVENT_THASSARIAN_SCRIPT_6: + // Summon General Arlos and Leryssa + if (Creature* arlos = me->SummonCreature(NPC_GENERAL_ARLOS, 3746.2825f, 3616.3699f, 473.4048f, 4.5029f, TEMPSUMMON_CORPSE_TIMED_DESPAWN)) + { + _arlosGUID = arlos->GetGUID(); + arlos->SetWalk(true); + arlos->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_IMMUNE_TO_PC); + arlos->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER); + arlos->GetMotionMaster()->MovePath(PATH_ARLOS, false); + } + if (Creature* leryssa = me->SummonCreature(NPC_LERYSSA, 3751.0986f, 3614.9219f, 473.4048f, 4.5029f, TEMPSUMMON_CORPSE_TIMED_DESPAWN)) + { + _leryssaGUID = leryssa->GetGUID(); + leryssa->SetWalk(true); + leryssa->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_IMMUNE_TO_PC); + leryssa->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); + leryssa->GetMotionMaster()->MovePath(PATH_LERYSSA, false); + } + _events.ScheduleEvent(EVENT_THASSARIAN_SCRIPT_7, 7000); + break; + case EVENT_THASSARIAN_SCRIPT_7: + // Talbot say text 2 + if (Creature* talbot = ObjectAccessor::GetCreature(*me, _talbotGUID)) + { + talbot->AI()->Talk(SAY_TALBOT_2); + } + break; + case EVENT_THASSARIAN_SCRIPT_8: + // Thassarian say text 1 and move to location + Talk(SAY_THASSARIAN_1); + me->SetWalk(false); + me->GetMotionMaster()->MovePoint(0, 3722.527f, 3567.2583f, 477.44086f); + _events.ScheduleEvent(EVENT_THASSARIAN_SCRIPT_9, 7000); + break; + case EVENT_THASSARIAN_SCRIPT_9: + // Thassarian say text 2 + Talk(SAY_THASSARIAN_2); + me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation()); + _events.ScheduleEvent(EVENT_THASSARIAN_SCRIPT_10, 6000); + break; + case EVENT_THASSARIAN_SCRIPT_10: + // Arthas turn to Thassarian and Talbot stand + if (Creature* arthas = ObjectAccessor::GetCreature(*me, _arthasGUID)) + { + arthas->SetFacingToObject(me); + } + if (Creature* talbot = ObjectAccessor::GetCreature(*me, _talbotGUID)) + { + talbot->SetStandState(UNIT_STAND_STATE_STAND); + } + _events.ScheduleEvent(EVENT_THASSARIAN_SCRIPT_11, 4000); + break; + case EVENT_THASSARIAN_SCRIPT_11: + // Arthas say text 2 + if (Creature* arthas = ObjectAccessor::GetCreature(*me, _arthasGUID)) + { + arthas->AI()->Talk(SAY_LICH_2); + } + _events.ScheduleEvent(EVENT_THASSARIAN_SCRIPT_12, 18000); + break; + case EVENT_THASSARIAN_SCRIPT_12: + // Thassarian say text 3 + Talk(SAY_THASSARIAN_3); + _events.ScheduleEvent(EVENT_THASSARIAN_SCRIPT_13, 10000); + break; + case EVENT_THASSARIAN_SCRIPT_13: + // Talbot say text 3 + if (Creature* talbot = ObjectAccessor::GetCreature(*me, _talbotGUID)) + { + talbot->AI()->Talk(SAY_TALBOT_3); + } + _events.ScheduleEvent(EVENT_THASSARIAN_SCRIPT_14, 5000); + break; + case EVENT_THASSARIAN_SCRIPT_14: + // Arthas turn to Talbot say text 3 + if (Creature* arthas = ObjectAccessor::GetCreature(*me, _arthasGUID)) + { + if (Creature* talbot = ObjectAccessor::GetCreature(*me, _talbotGUID)) + { + arthas->SetFacingToObject(talbot); + } + arthas->AI()->Talk(SAY_LICH_3); + } + _events.ScheduleEvent(EVENT_THASSARIAN_SCRIPT_15, 5000); + break; + case EVENT_THASSARIAN_SCRIPT_15: + // Arthas turn to me and emote + if (Creature* arthas = ObjectAccessor::GetCreature(*me, _arthasGUID)) + { + arthas->SetFacingToObject(me); + arthas->HandleEmoteCommand(EMOTE_ONESHOT_POINT); + } + _events.ScheduleEvent(EVENT_THASSARIAN_SCRIPT_16, 5000); + break; + case EVENT_THASSARIAN_SCRIPT_16: + // Arthas despawn + if (Creature* arthas = ObjectAccessor::GetCreature(*me, _arthasGUID)) + { + arthas->RemoveFromWorld(); + } + _events.ScheduleEvent(EVENT_THASSARIAN_SCRIPT_17, 3000); + break; + case EVENT_THASSARIAN_SCRIPT_17: + // Talbot say text 4 and attack + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + if (Creature* talbot = ObjectAccessor::GetCreature(*me, _talbotGUID)) + { + talbot->AI()->Talk(SAY_TALBOT_4); + talbot->setFaction(FACTION_UNDEAD_SCOURGE_9); + talbot->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + talbot->SetReactState(REACT_AGGRESSIVE); + talbot->Attack(me, false); + } + break; + case EVENT_THASSARIAN_SCRIPT_18: + // Arlos say text 1 + me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY1H); + if (Creature* arlos = ObjectAccessor::GetCreature(*me, _arlosGUID)) + { + arlos->AI()->Talk(SAY_ARLOS_1); + arlos->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_NONE); + arlos->SetStandState(UNIT_STAND_STATE_KNEEL); + } + if (Creature* leryssa = ObjectAccessor::GetCreature(*me, _leryssaGUID)) + { + leryssa->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_NONE); + } + _events.ScheduleEvent(EVENT_THASSARIAN_SCRIPT_19, 3000); + break; + case EVENT_THASSARIAN_SCRIPT_19: + // Leryssa set facing to me + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER); + if (Creature* leryssa = me->FindNearestCreature(NPC_LERYSSA, 50.0f, true)) + { + _leryssaGUID = leryssa->GetGUID(); + leryssa->SetFacingToObject(me); + me->SetFacingToObject(leryssa); + } + _events.ScheduleEvent(EVENT_THASSARIAN_SCRIPT_20, 3000); + break; + case EVENT_THASSARIAN_SCRIPT_20: + // Arlos say text 2 and die. Leryssa say text 1 + if (Creature* arlos = me->FindNearestCreature(NPC_GENERAL_ARLOS, 50.0f, true)) + { + _arlosGUID = arlos->GetGUID(); + arlos->AI()->Talk(SAY_ARLOS_2); + arlos->SetStandState(UNIT_STAND_STATE_DEAD); + } + if (Creature* leryssa = ObjectAccessor::GetCreature(*me, _leryssaGUID)) + { + leryssa->AI()->Talk(SAY_LERYSSA_1); + } + _events.ScheduleEvent(EVENT_THASSARIAN_SCRIPT_21, 5000); + break; + case EVENT_THASSARIAN_SCRIPT_21: + // Thassarian say text 4 + me->SetStandState(UNIT_STAND_STATE_KNEEL); + Talk(SAY_THASSARIAN_4); + _events.ScheduleEvent(EVENT_THASSARIAN_SCRIPT_22, 3000); + break; + case EVENT_THASSARIAN_SCRIPT_22: + // Leryssa run to Thassarian + if (Creature* leryssa = ObjectAccessor::GetCreature(*me, _leryssaGUID)) + { + leryssa->SetWalk(false); + leryssa->MonsterMoveWithSpeed(3726.751f, 3568.1633f, 477.44086f, leryssa->GetSpeed(MOVE_RUN)); + } + _events.ScheduleEvent(EVENT_THASSARIAN_SCRIPT_23, 2000); + break; + case EVENT_THASSARIAN_SCRIPT_23: + // Leryssa say text 2 + if (Creature* leryssa = ObjectAccessor::GetCreature(*me, _leryssaGUID)) + { + leryssa->AI()->Talk(SAY_LERYSSA_2); + leryssa->SetStandState(UNIT_STAND_STATE_SIT); + } + _events.ScheduleEvent(EVENT_THASSARIAN_SCRIPT_24, 5000); + break; + case EVENT_THASSARIAN_SCRIPT_24: + // Thassarian say text 5 + Talk(SAY_THASSARIAN_5); + _events.ScheduleEvent(EVENT_THASSARIAN_SCRIPT_25, 10000); + break; + case EVENT_THASSARIAN_SCRIPT_25: + // Leryssa say text 3 + if (Creature* leryssa = ObjectAccessor::GetCreature(*me, _leryssaGUID)) + { + leryssa->AI()->Talk(SAY_LERYSSA_3); + } + _events.ScheduleEvent(EVENT_THASSARIAN_SCRIPT_26, 12000); + break; + case EVENT_THASSARIAN_SCRIPT_26: + // Thassarian say text 6 + Talk(SAY_THASSARIAN_6); + _events.ScheduleEvent(EVENT_THASSARIAN_SCRIPT_27, 11000); + break; + case EVENT_THASSARIAN_SCRIPT_27: + // Leryssa say text 4 + if (Creature* leryssa = ObjectAccessor::GetCreature(*me, _leryssaGUID)) + { + leryssa->AI()->Talk(SAY_LERYSSA_4); + } + _events.ScheduleEvent(EVENT_THASSARIAN_SCRIPT_28, 12000); + break; + case EVENT_THASSARIAN_SCRIPT_28: + // Thassarian say text 7 + Talk(SAY_THASSARIAN_7); + _events.ScheduleEvent(EVENT_THASSARIAN_SCRIPT_29, 35000); + break; + case EVENT_THASSARIAN_SCRIPT_29: + Cleanup(); + me->DespawnOrUnsummon(30000ms, 120s); + break; + default: + break; + } + } + + if (!UpdateVictim()) + { + return; + } + + DoMeleeAttackIfReady(); + } + + void JustDied(Unit* /*killer*/) override + { + Cleanup(); + me->DespawnOrUnsummon(1000ms, 120s); + } + + void Cleanup() + { + if (Creature* talbot = ObjectAccessor::GetCreature(*me, _talbotGUID)) + { + talbot->RemoveFromWorld(); + } + + if (Creature* leryssa = ObjectAccessor::GetCreature(*me, _leryssaGUID)) + { + leryssa->RemoveFromWorld(); + } + + if (Creature* arlos = ObjectAccessor::GetCreature(*me, _arlosGUID)) + { + arlos->RemoveFromWorld(); + } + + if (Creature* arthas = ObjectAccessor::GetCreature(*me, _arthasGUID)) + { + arthas->RemoveFromWorld(); + } + } + + void sGossipHello(Player* /*player*/) override + { + if (!me->HasAura(SPELL_BLOOD_PRESENCE)) + { + DoCastSelf(SPELL_BLOOD_PRESENCE); + } + } + + void sGossipSelect(Player* player, uint32 /*sender*/, uint32 action) override + { + if (action == 0) + { + _playerGUID = player->GetGUID(); + CloseGossipMenuFor(player); + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + me->GetMotionMaster()->MovePath(PATH_THASSARIAN, false); + } + } + + private: + EventMap _events; + ObjectGuid _playerGUID; + ObjectGuid _arthasGUID; + ObjectGuid _talbotGUID; + ObjectGuid _leryssaGUID; + ObjectGuid _arlosGUID; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_thassarian2AI(creature); + } +}; + +// NPC 25251: Leryssa +class npc_leryssa : public CreatureScript +{ +public: + npc_leryssa() : CreatureScript("npc_leryssa") {} + + struct npc_leryssaAI : public ScriptedAI + { + npc_leryssaAI(Creature* creature) : ScriptedAI(creature) {} + + void MovementInform(uint32 type, uint32 param) override + { + if (type == WAYPOINT_MOTION_TYPE && param == 2) + { + if (me->IsSummon()) + { + if (Unit* summoner = me->ToTempSummon()->GetSummonerUnit()) + { + summoner->ToCreature()->AI()->SetData(1, NPC_LERYSSA); + } + } + } + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_leryssaAI(creature); + } +}; + +// NPC 25301: Counselor Talbot +enum CounselorTalbot +{ + AREA_LAST_RITES = 4128, + SPELL_DEFLECTION = 51009, + SPELL_SOUL_BLAST = 50992, + SPELL_VAMPIRIC_BOLT = 51016, + EVENT_DEFLECTION = 1, + EVENT_SOUL_BLAST = 2, + EVENT_VAMPIRIC_BOLT = 3 +}; + +class npc_counselor_talbot : public CreatureScript +{ +public: + npc_counselor_talbot() : CreatureScript("npc_counselor_talbot") {} + + struct npc_counselor_talbotAI : public ScriptedAI + { + npc_counselor_talbotAI(Creature* creature) : ScriptedAI(creature) {} + + void Reset() override {} + + void EnterCombat(Unit* /*who*/) override + { + _events.ScheduleEvent(EVENT_DEFLECTION, 10000, 20000); + _events.ScheduleEvent(EVENT_SOUL_BLAST, 4000, 6000); + _events.ScheduleEvent(EVENT_VAMPIRIC_BOLT, 0); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + { + return; + } + + if (me->GetAreaId() == AREA_LAST_RITES) + { + _events.Update(diff); + + if (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_DEFLECTION: + DoCastSelf(SPELL_DEFLECTION); + _events.ScheduleEvent(EVENT_DEFLECTION, 10000, 20000); + break; + case EVENT_SOUL_BLAST: + DoCastVictim(SPELL_SOUL_BLAST); + _events.ScheduleEvent(EVENT_SOUL_BLAST, 4000, 6000); + break; + case EVENT_VAMPIRIC_BOLT: + DoCastVictim(SPELL_VAMPIRIC_BOLT); + _events.ScheduleEvent(EVENT_VAMPIRIC_BOLT, 3000, 4000); + break; + default: + break; + } + } + } + DoMeleeAttackIfReady(); + } + + void JustDied(Unit* /*killer*/) override + { + if (me->IsSummon()) + { + if (Unit* summoner = me->ToTempSummon()->GetSummonerUnit()) + { + summoner->ToCreature()->AI()->SetData(1, NPC_COUNSELOR_TALBOT); + } + } + } + + private: + EventMap _events; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_counselor_talbotAI(creature); + } +}; + void AddSC_borean_tundra() { // Ours new spell_q11919_q11940_drake_hunt(); + new npc_thassarian(); + new npc_thassarian2(); + new npc_leryssa(); + new npc_counselor_talbot(); // Theirs new npc_sinkhole_kill_credit();