Scripts/Undercity: Update Lady Sylvanas' script and also implement few missing things to Journey to Undercity's quest end event

Closes https://github.com/TrinityCore/TrinityCore/pull/14094
Thanks to @Killyana @Rushor @jaredjones and all others who helped with this

(cherry picked from commit a76722ccef)
This commit is contained in:
Nyeriah
2015-03-17 20:22:55 -03:00
parent 4ff269b610
commit 8b7dabab21
2 changed files with 170 additions and 107 deletions

View File

@@ -0,0 +1,35 @@
DELETE FROM `creature_text` WHERE `entry` = 16287 AND `groupid`= 0;
DELETE FROM `creature_text` WHERE `entry` = 10181 AND `groupid` = 2;
INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
(16287, 0, 0, 'That could have gone better. $n, come here, please. I have something I need you to take care of for me.', 15, 0, 100, 0, 0, 0, 12157, 0, 'Ambassador Sunsorrow SAY_SUNSORROW_WHISPER'),
(10181, 2, 0, '%s looks down at the discarded necklace. In her sadness, the lady incants a glamour, which beckons forth Highborne spirits. The chamber resonates with their ancient song about the Sin''dorei...', 16, 0, 100, 0, 0, 0, 19197, 0, 'Lady Sylvanas Windrunner EMOTE_LAMENT');
DELETE FROM `gossip_menu_option` WHERE `menu_id` = 7178 AND `id`= 0;
INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`, `option_text`, `OptionBroadcastTextID`, `option_id`, `npc_option_npcflag`, `action_menu_id`, `action_poi_id`, `box_coded`, `box_money`, `box_text`, `BoxBroadcastTextId`) VALUES
(7178, 0, 0, 'What is it that you have for me, ambassador?', 19205, 1, 1, 7178, 0, 0, 0, '', 0);
UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 16287;
DELETE FROM `smart_scripts` WHERE `entryorguid` = 16287 AND `source_type` = 0 AND `id` IN (0, 1, 2);
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
(16287,0,0,1,62,0,100,0,7178,0,0,0,11,37084,1,0,0,0,0,7,0,0,0,0,0,0,0,'Ambassador Sunsorrow - On Gossip Option 0 Selected - Create Item \'Lament of the Highborne\''),
(16287,0,1,0,61,0,100,0,0,0,0,0,98,7178,10378,0,0,0,0,7,0,0,0,0,0,0,0,'Ambassador Sunsorrow - On Gossip Option 0 Selected - SEND_GOSSIP_MENU TEXT'),
(16287,0,2,0,64,0,100,0,0,0,0,0,98,7178,8458,0,0,0,0,7,0,0,0,0,0,0,0,'Ambassador Sunsorrow - On Gossip Hello - SEND_GOSSIP_MENU TEXT');
DELETE FROM `npc_text` WHERE `id` IN (10378, 8458);
INSERT INTO `npc_text` (`id`, `text0_0`, `text0_1`, `prob0`, `em0_1`, `BroadcastTextID0`) VALUES
(8458, "Greetings, $r. I am Ambassador Sunsorrow of the sin'dorei, or blood elves as we are commonly known. I have high hopes that this new bond between us and the Horde will be mutually beneficial.", "Greetings, $r. I am Ambassador Sunsorrow of the sin'dorei, or blood elves as we are commonly known. I have high hopes that this new bond between us and the Horde will be mutually beneficial.", 1, 2, 12161),
(10378, "Just a small songbook that I thought you might like to have. It contains the lyrics to a song known as the Lament of the Highborne; the one that Lady Sylvanas glamoured from the air.", "", 1, 1, 19206);
DELETE FROM `gossip_menu` WHERE `entry`=7178 AND `text_id` IN (10378, 8458, 8740);
INSERT INTO `gossip_menu` (`entry`, `text_id`) VALUES
(7178,10378),
(7178,8740),
(7178,8458);
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 15 AND `SourceGroup` = 7178 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, 7178, 0, 0, 0, 8, 0, 9180, 0, 0, 0, 0, 0, '', 'Ambassador Sunsorrow show gossip only if quest Journey to Undercity is rewarded'),
(15, 7178, 0, 0, 0, 16, 0, 512, 0, 0, 0, 0, 0, '', 'Ambassador Sunsorrow show gossip only if player is Blood Elf'),
(15, 7178, 0, 0, 0, 2, 0, 30632, 1, 0, 1, 0, 0, '', 'Ambassador Sunsorrow show gossip only if player doesn\'t have item Lament of Highborn');
UPDATE `creature_text` SET `type` = 12 WHERE `entry` = 10181 AND `groupid` = 1;

View File

@@ -40,25 +40,44 @@ EndContentData */
enum Sylvanas
{
QUEST_JOURNEY_TO_UNDERCITY = 9180,
EMOTE_LAMENT_END = 0,
SAY_LAMENT_END = 1,
QUEST_JOURNEY_TO_UNDERCITY = 9180,
SOUND_CREDIT = 10896,
ENTRY_HIGHBORNE_LAMENTER = 21628,
ENTRY_HIGHBORNE_BUNNY = 21641,
EMOTE_LAMENT_END = 0,
SAY_LAMENT_END = 1,
EMOTE_LAMENT = 2,
SPELL_HIGHBORNE_AURA = 37090,
SPELL_SYLVANAS_CAST = 36568,
SPELL_RIBBON_OF_SOULS = 34432, // the real one to use might be 37099
// Ambassador Sunsorrow
SAY_SUNSORROW_WHISPER = 0,
SOUND_CREDIT = 10896,
NPC_HIGHBORNE_LAMENTER = 21628,
NPC_HIGHBORNE_BUNNY = 21641,
NPC_AMBASSADOR_SUNSORROW = 16287,
SPELL_HIGHBORNE_AURA = 37090,
SPELL_SYLVANAS_CAST = 36568,
//SPELL_RIBBON_OF_SOULS = 34432, the real one to use might be 37099
SPELL_RIBBON_OF_SOULS = 37099,
// Combat spells
SPELL_BLACK_ARROW = 59712,
SPELL_FADE = 20672,
SPELL_FADE_BLINK = 29211,
SPELL_MULTI_SHOT = 59713,
SPELL_SHOT = 59710,
SPELL_SUMMON_SKELETON = 59711
SPELL_BLACK_ARROW = 59712,
SPELL_FADE = 20672,
SPELL_FADE_BLINK = 29211,
SPELL_MULTI_SHOT = 59713,
SPELL_SHOT = 59710,
SPELL_SUMMON_SKELETON = 59711,
// Events
EVENT_FADE = 1,
EVENT_SUMMON_SKELETON = 2,
EVENT_BLACK_ARROW = 3,
EVENT_SHOOT = 4,
EVENT_MULTI_SHOT = 5,
EVENT_LAMENT_OF_THE_HIGHBORN = 6,
EVENT_SUNSORROW_WHISPER = 7,
GUID_EVENT_INVOKER = 1,
};
float HighborneLoc[4][3]=
@@ -77,26 +96,14 @@ 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*/) override
bool OnQuestReward(Player* player, Creature* creature, const Quest *_Quest, uint32 /*slot*/) override
{
if (_Quest->GetQuestId() == QUEST_JOURNEY_TO_UNDERCITY)
{
ENSURE_AI(npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI, creature->AI())->LamentEvent = true;
ENSURE_AI(npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI, creature->AI())->DoPlaySoundToSet(creature, SOUND_CREDIT);
creature->CastSpell(creature, SPELL_SYLVANAS_CAST, false);
for (uint8 i = 0; i < 4; ++i)
creature->SummonCreature(ENTRY_HIGHBORNE_LAMENTER, HighborneLoc[i][0], HighborneLoc[i][1], HIGHBORNE_LOC_Y, HighborneLoc[i][2], TEMPSUMMON_TIMED_DESPAWN, 160000);
}
creature->AI()->SetGUID(player->GetGUID(), GUID_EVENT_INVOKER);
return true;
}
CreatureAI* GetAI(Creature* creature) const override
{
return new npc_lady_sylvanas_windrunnerAI(creature);
}
struct npc_lady_sylvanas_windrunnerAI : public ScriptedAI
{
npc_lady_sylvanas_windrunnerAI(Creature* creature) : ScriptedAI(creature)
@@ -106,41 +113,51 @@ public:
void Initialize()
{
LamentEventTimer = 5000;
LamentEvent = false;
targetGUID.Clear();
FadeTimer = 30000;
SummonSkeletonTimer = 20000;
BlackArrowTimer = 15000;
ShotTimer = 8000;
MultiShotTimer = 10000;
playerGUID.Clear();
}
uint32 LamentEventTimer;
bool LamentEvent;
ObjectGuid targetGUID;
uint32 FadeTimer;
uint32 SummonSkeletonTimer;
uint32 BlackArrowTimer;
uint32 ShotTimer;
uint32 MultiShotTimer;
void Reset() override
{
Initialize();
_events.Reset();
}
void EnterCombat(Unit* /*who*/) override { }
void EnterCombat(Unit* /*who*/) override
{
_events.ScheduleEvent(EVENT_FADE, 30000);
_events.ScheduleEvent(EVENT_SUMMON_SKELETON, 20000);
_events.ScheduleEvent(EVENT_BLACK_ARROW, 15000);
_events.ScheduleEvent(EVENT_SHOOT, 8000);
_events.ScheduleEvent(EVENT_MULTI_SHOT, 10000);
}
void SetGUID(ObjectGuid guid, int32 type) override
{
if (type == GUID_EVENT_INVOKER)
{
Talk(EMOTE_LAMENT);
DoPlaySoundToSet(me, SOUND_CREDIT);
DoCast(me, SPELL_SYLVANAS_CAST, false);
playerGUID = guid;
LamentEvent = true;
for (uint8 i = 0; i < 4; ++i)
me->SummonCreature(NPC_HIGHBORNE_LAMENTER, HighborneLoc[i][0], HighborneLoc[i][1], HIGHBORNE_LOC_Y, HighborneLoc[i][2], TEMPSUMMON_TIMED_DESPAWN, 160000);
_events.ScheduleEvent(EVENT_LAMENT_OF_THE_HIGHBORN, 2000);
_events.ScheduleEvent(EVENT_SUNSORROW_WHISPER, 10000);
}
}
void JustSummoned(Creature* summoned) override
{
if (summoned->GetEntry() == ENTRY_HIGHBORNE_BUNNY)
if (summoned->GetEntry() == NPC_HIGHBORNE_BUNNY)
{
if (Creature* target = ObjectAccessor::GetCreature(*summoned, targetGUID))
{
target->MonsterMoveWithSpeed(target->GetPositionX(), target->GetPositionY(), me->GetPositionZ()+15.0f, 0);
target->GetMotionMaster()->MoveJump(target->GetPositionX(), target->GetPositionY(), me->GetPositionZ() + 15.0f, 0);
target->SetPosition(target->GetPositionX(), target->GetPositionY(), me->GetPositionZ()+15.0f, 0.0f);
summoned->CastSpell(target, SPELL_RIBBON_OF_SOULS, false);
}
@@ -152,75 +169,86 @@ public:
void UpdateAI(uint32 diff) override
{
if (LamentEvent)
{
if (LamentEventTimer <= diff)
{
DoSummon(ENTRY_HIGHBORNE_BUNNY, me, 10.0f, 3000, TEMPSUMMON_TIMED_DESPAWN);
LamentEventTimer = 2000;
if (!me->HasAura(SPELL_SYLVANAS_CAST))
{
Talk(SAY_LAMENT_END);
Talk(EMOTE_LAMENT_END);
LamentEvent = false;
}
} else LamentEventTimer -= diff;
}
if (!UpdateVictim())
if (!UpdateVictim() && !LamentEvent)
return;
// Combat spells
_events.Update(diff);
if (FadeTimer <= diff)
{
DoCast(me, SPELL_FADE);
// add a blink to simulate a stealthed movement and reappearing elsewhere
DoCast(me, SPELL_FADE_BLINK);
FadeTimer = 30000 + rand32() % 5000;
// if the victim is out of melee range she cast multi shot
if (Unit* victim = me->GetVictim())
if (me->GetDistance(victim) > 10.0f)
DoCast(victim, SPELL_MULTI_SHOT);
} else FadeTimer -= diff;
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
if (SummonSkeletonTimer <= diff)
while (uint32 eventId = _events.ExecuteEvent())
{
DoCast(me, SPELL_SUMMON_SKELETON);
SummonSkeletonTimer = 20000 + rand32() % 10000;
} else SummonSkeletonTimer -= diff;
if (BlackArrowTimer <= diff)
{
if (Unit* victim = me->GetVictim())
switch (eventId)
{
DoCast(victim, SPELL_BLACK_ARROW);
BlackArrowTimer = 15000 + rand32() % 5000;
case EVENT_FADE:
DoCast(me, SPELL_FADE);
// add a blink to simulate a stealthed movement and reappearing elsewhere
DoCast(me, SPELL_FADE_BLINK);
// if the victim is out of melee range she cast multi shot
if (Unit* victim = me->GetVictim())
if (me->GetDistance(victim) > 10.0f)
DoCast(victim, SPELL_MULTI_SHOT);
_events.ScheduleEvent(EVENT_FADE, urand(30000, 35000));
break;
case EVENT_SUMMON_SKELETON:
DoCast(me, SPELL_SUMMON_SKELETON);
_events.ScheduleEvent(EVENT_SUMMON_SKELETON, urand(20000, 30000));
break;
case EVENT_BLACK_ARROW:
if (Unit* victim = me->GetVictim())
DoCast(victim, SPELL_BLACK_ARROW);
_events.ScheduleEvent(EVENT_BLACK_ARROW, urand(15000, 20000));
break;
case EVENT_SHOOT:
if (Unit* victim = me->GetVictim())
DoCast(victim, SPELL_SHOT);
_events.ScheduleEvent(EVENT_SHOOT, urand(8000, 10000));
break;
case EVENT_MULTI_SHOT:
if (Unit* victim = me->GetVictim())
DoCast(victim, SPELL_MULTI_SHOT);
_events.ScheduleEvent(EVENT_MULTI_SHOT, urand(10000, 13000));
break;
case EVENT_LAMENT_OF_THE_HIGHBORN:
if (!me->HasAura(SPELL_SYLVANAS_CAST))
{
Talk(SAY_LAMENT_END);
Talk(EMOTE_LAMENT_END);
LamentEvent = false;
me->HandleEmoteCommand(EMOTE_ONESHOT_KNEEL);
Reset();
}
else
{
DoSummon(NPC_HIGHBORNE_BUNNY, me, 10.0f, 3000, TEMPSUMMON_TIMED_DESPAWN);
_events.ScheduleEvent(EVENT_LAMENT_OF_THE_HIGHBORN, 2000);
}
break;
case EVENT_SUNSORROW_WHISPER:
if (Creature* ambassador = me->FindNearestCreature(NPC_AMBASSADOR_SUNSORROW, 20.0f))
if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID))
ambassador->AI()->Talk(SAY_SUNSORROW_WHISPER, player);
break;
default:
break;
}
} else BlackArrowTimer -= diff;
if (ShotTimer <= diff)
{
if (Unit* victim = me->GetVictim())
{
DoCast(victim, SPELL_SHOT);
ShotTimer = 8000 + rand32() % 2000;
}
} else ShotTimer -= diff;
if (MultiShotTimer <= diff)
{
if (Unit* victim = me->GetVictim())
{
DoCast(victim, SPELL_MULTI_SHOT);
MultiShotTimer = 10000 + rand32() % 3000;
}
} else MultiShotTimer -= diff;
}
DoMeleeAttackIfReady();
}
private:
EventMap _events;
bool LamentEvent;
ObjectGuid targetGUID;
ObjectGuid playerGUID;
};
CreatureAI* GetAI(Creature* creature) const override
{
return new npc_lady_sylvanas_windrunnerAI(creature);
}
};
/*######