fix(Scripts/Northrend): Last Rites [Quest 12019] (#8691)

This commit is contained in:
Malcrom
2021-10-31 12:41:21 -03:00
committed by GitHub
parent 40d042e83d
commit b6ad5bf8ad
2 changed files with 762 additions and 0 deletions

View File

@@ -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.');

View File

@@ -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();