TrinityCore
Loading...
Searching...
No Matches
zone_elwynn_forest.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "AreaTrigger.h"
19#include "AreaTriggerAI.h"
20#include "Containers.h"
21#include "Conversation.h"
22#include "ConversationAI.h"
23#include "CreatureAIImpl.h"
24#include "CreatureGroups.h"
25#include "MotionMaster.h"
26#include "ObjectAccessor.h"
27#include "PhasingHandler.h"
28#include "Player.h"
29#include "ScriptMgr.h"
30#include "ScriptedCreature.h"
31#include "ScriptedGossip.h"
32#include "SpellScript.h"
33#include "TemporarySummon.h"
34#include "WorldSession.h"
35
37{
40 WOODS_PATH = 644016,
41 HOUSE_PATH = 644024,
42 LISA_PATH = 645600
43};
44
53
63
65{
66 NPC_DANA = 804,
68 NPC_JOHN = 806,
69 NPC_LISA = 807,
70 NPC_AARON = 810,
71 NPC_JOSE = 811
72};
73
83
88
89struct npc_cameron : public ScriptedAI
90{
91 npc_cameron(Creature* creature) : ScriptedAI(creature)
92 {
93 _started = false;
94 }
95
107
109 {
110 std::vector<Position> MovePosPositions =
111 {
112 { -9373.521f, -67.71767f, 69.201965f, 1.117011f },
113 { -9374.94f, -62.51654f, 69.201965f, 5.201081f },
114 { -9371.013f, -71.20811f, 69.201965f, 1.937315f },
115 { -9368.419f, -66.47543f, 69.201965f, 3.141593f },
116 { -9372.376f, -65.49946f, 69.201965f, 4.206244f },
117 { -9377.477f, -67.8297f, 69.201965f, 0.296706f }
118 };
119
120 Trinity::Containers::RandomShuffle(MovePosPositions);
121
122 // first we break formation because children will need to move on their own now
123 for (ObjectGuid guid : _childrenGUIDs)
124 if (Creature* child = ObjectAccessor::GetCreature(*me, guid))
125 if (CreatureGroup* creatureGroup = child->GetFormation())
126 FormationMgr::RemoveCreatureFromGroup(creatureGroup, child);
127
128 // Move each child to an random position
129 for (uint32 i = 0; i < _childrenGUIDs.size(); ++i)
130 {
132 {
133 children->SetWalk(true);
134 children->GetMotionMaster()->MovePoint(0, MovePosPositions[i], true, MovePosPositions[i].GetOrientation());
135 }
136 }
137 me->SetWalk(true);
138 me->GetMotionMaster()->MovePoint(0, MovePosPositions.back(), true, MovePosPositions.back().GetOrientation());
139 }
140
141 void WaypointReached(uint32 waypointId, uint32 pathId) override
142 {
143 switch (pathId)
144 {
145 case STORMWIND_PATH:
146 {
147 if (waypointId == STORMWIND_WAYPOINT)
148 {
149 me->GetMotionMaster()->MoveRandom(10.f);
151 }
152
153 break;
154 }
155 case GOLDSHIRE_PATH:
156 {
157 if (waypointId == GOLDSHIRE_WAYPOINT)
158 {
159 me->GetMotionMaster()->MoveRandom(10.f);
161 }
162 break;
163 }
164 case WOODS_PATH:
165 {
166 if (waypointId == WOODS_WAYPOINT)
167 {
168 me->GetMotionMaster()->MoveRandom(10.f);
171 }
172
173 break;
174 }
175 case HOUSE_PATH:
176 {
177 if (waypointId == HOUSE_WAYPOINT)
178 {
179 // Move childeren at last point
181
182 // After 30 seconds a random sound should play
184 }
185 break;
186 }
187 }
188 }
189
190 void OnGameEvent(bool start, uint16 eventId) override
191 {
192 if (start && eventId == GAME_EVENT_CHILDREN_OF_GOLDSHIRE)
193 {
194 // Start event at 7 am
195 // Begin pathing
197 _started = true;
198 }
199 else if (!start && eventId == GAME_EVENT_CHILDREN_OF_GOLDSHIRE)
200 {
201 // Reset event at 8 am
202 _started = false;
203 _events.Reset();
204 }
205 }
206
207 void UpdateAI(uint32 diff) override
208 {
209 if (!_started)
210 return;
211
212 _events.Update(diff);
213
214 while (uint32 eventId = _events.ExecuteEvent())
215 {
216 switch (eventId)
217 {
220 break;
223 break;
226 break;
228 for (ObjectGuid guid : _childrenGUIDs)
229 {
230 if (Creature* child = ObjectAccessor::GetCreature(*me, guid))
231 {
232 if (child->GetEntry() == NPC_LISA)
233 {
234 child->GetMotionMaster()->MovePath(LISA_PATH, false);
235 break;
236 }
237 }
238 }
239 break;
242 break;
244 {
245 _childrenGUIDs.clear();
246
247 // Get all childeren's guid's.
248 if (Creature* dana = me->FindNearestCreature(NPC_DANA, 25.0f))
249 _childrenGUIDs.push_back(dana->GetGUID());
250
251 if (Creature* john = me->FindNearestCreature(NPC_JOHN, 25.0f))
252 _childrenGUIDs.push_back(john->GetGUID());
253
254 if (Creature* lisa = me->FindNearestCreature(NPC_LISA, 25.0f))
255 _childrenGUIDs.push_back(lisa->GetGUID());
256
257 if (Creature* aaron = me->FindNearestCreature(NPC_AARON, 25.0f))
258 _childrenGUIDs.push_back(aaron->GetGUID());
259
260 if (Creature* jose = me->FindNearestCreature(NPC_JOSE, 25.0f))
261 _childrenGUIDs.push_back(jose->GetGUID());
262
263 // If Formation was disbanded, remake.
264 if (!me->GetFormation()->IsFormed())
265 for (ObjectGuid guid : _childrenGUIDs)
266 if (Creature* child = ObjectAccessor::GetCreature(*me, guid))
267 child->SearchFormation();
268
269 // Start movement
271
272 break;
273 }
274 default:
275 break;
276 }
277 }
278 }
279
280private:
284};
285
315
324
332
339
357
365
366Position const VanessaClonePosition = { -9462.44f, -11.7101f, 50.161f, 2.99500f };
367Position const VanessaStaticPosition = { -9468.16f, -3.6128f, 49.876f, 4.47226f };
368
369// 198896 - Master Mathias Shaw
371{
373
374 void OnQuestAccept(Player* player, Quest const* quest) override
375 {
377 {
379 Conversation::CreateConversation(CONVO_THE_NEW_CLASSINGTON_ESTATE, player, *player, player->GetGUID(), nullptr, false);
380 }
381 }
382
383 bool OnGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
384 {
385 // Quest 72408 - A Window to the Past
387 {
388 CloseGossipMenuFor(player);
389
390 player->CastSpell(nullptr, SPELL_PLAY_ONYXIA_SCENE, true);
391 }
392
393 // Quest 72405 - An Unlikely Informant
394 else if (menuId == GOSSIP_MENU_SIGNAL_INFORMANT && gossipListId == GOSSIP_OPTION_SIGNAL_INFORMANT)
395 {
396 CloseGossipMenuFor(player);
397
398 Conversation::CreateConversation(CONVO_AN_UNLIKELY_INFORMANT, player, *player, player->GetGUID(), nullptr, false);
399 }
400 return true;
401 }
402};
403
404// 198883 - Vanessa VanCleef
406{
408
409 void OnQuestAccept(Player* player, Quest const* quest) override
410 {
412 Conversation::CreateConversation(CONVO_ROTTEN_OLD_MEMORIES, player, *player, player->GetGUID(), nullptr);
413 }
414
415 void MovementInform(uint32 type, uint32 pointId) override
416 {
417 if (type != POINT_MOTION_TYPE)
418 return;
419
420 if (pointId == POINT_VANESSA_FINISH)
422 }
423
424 void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
425 {
428 }
429
430 void UpdateAI(uint32 diff) override
431 {
432 _events.Update(diff);
433
434 while (uint32 eventId = _events.ExecuteEvent())
435 {
436 switch (eventId)
437 {
439 me->SetVirtualItem(1, 0);
441 me->SetFacingTo(4.47226f);
443 break;
448 break;
449 default:
450 break;
451 }
452 }
453 }
454private:
456};
457
471
472// 20342 - Conversation
474{
475public:
477
478 void OnCreate(Unit* creator) override
479 {
480 Creature* mathiasObject = GetClosestCreatureWithOptions(creator, 15.0f, { .CreatureId = NPC_MATHIAS_SHAW, .IgnorePhases = true });
481 Creature* vanessaObject = GetClosestCreatureWithOptions(creator, 15.0f, { .CreatureId = NPC_VANESSA_VANCLEEF, .IgnorePhases = true });
482 if (!mathiasObject || !vanessaObject)
483 return;
484
485 TempSummon* mathiasClone = mathiasObject->SummonPersonalClone(mathiasObject->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, creator->ToPlayer());
486 TempSummon* vanessaClone = vanessaObject->SummonPersonalClone(VanessaClonePosition, TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, creator->ToPlayer());
487 if (!mathiasClone || !vanessaClone)
488 return;
489
492 vanessaClone->SetVirtualItem(1, vanessaClone->GetVirtualItemId(0)); // add 2nd dagger to hands
493
497 }
498
499 void OnStart() override
500 {
502
503 if (Milliseconds const* teleportLineStartTime = conversation->GetLineStartTime(privateOwnerLocale, CONVO_LINE_VANESSA_TELEPORT))
504 _events.ScheduleEvent(EVENT_VANESSA_TELEPORT, *teleportLineStartTime);
505
506 if (Milliseconds const* movementStartTime = conversation->GetLineStartTime(privateOwnerLocale, CONVO_LINE_VANESSA_MOVEMENT))
507 _events.ScheduleEvent(EVENT_VANESSA_MOVE, *movementStartTime);
508
509 if (Milliseconds const* questCreditStartTime = conversation->GetLineStartTime(privateOwnerLocale, CONVO_LINE_MATHIAS_QUEST_CREDIT))
510 _events.ScheduleEvent(EVENT_MATHIAS_QUEST_CREDIT, *questCreditStartTime);
511
513 }
514
515 void OnUpdate(uint32 diff) override
516 {
517 _events.Update(diff);
518
519 switch (_events.ExecuteEvent())
520 {
522 {
524 if (!privateObjectOwner)
525 break;
526
528 if (!vanessaClone)
529 break;
530
531 vanessaClone->CastSpell(privateObjectOwner, SPELL_VANESSA_TELEPORT_BEHIND, true);
532 vanessaClone->CastSpell(privateObjectOwner, SPELL_VANESSA_CHEAP_SHOT, true);
534 vanessaClone->SetEmoteState(EMOTE_STATE_READY1H);
535 break;
536 }
538 {
540 if (!vanessaClone)
541 break;
542
543 vanessaClone->SetWalk(true);
544 vanessaClone->SetEmoteState(EMOTE_STATE_NONE);
546 break;
547 }
549 {
551 if (!privateObjectOwner)
552 break;
553
555 if (!vanessaClone)
556 break;
557
559 if (!mathiasClone)
560 break;
561
562 privateObjectOwner->ToPlayer()->KilledMonsterCredit(NPC_MATHIAS_SHAW);
563 vanessaClone->DespawnOrUnsummon();
565 break;
566 }
568 {
570 if (!mathiasClone)
571 break;
572
573 mathiasClone->DespawnOrUnsummon();
574 break;
575 }
576 default:
577 break;
578 }
579 }
580
581private:
583};
584
585// 20387 - Conversation
587{
588public:
590
591 void OnCreate(Unit* creator) override
592 {
593 Creature* mathiasObject = GetClosestCreatureWithOptions(creator, 15.0f, { .CreatureId = NPC_MATHIAS_SHAW, .IgnorePhases = true });
594 Creature* vanessaObject = GetClosestCreatureWithOptions(creator, 15.0f, { .CreatureId = NPC_VANESSA_VANCLEEF, .IgnorePhases = true });
595 if (!mathiasObject || !vanessaObject)
596 return;
597
598 TempSummon* mathiasClone = mathiasObject->SummonPersonalClone(mathiasObject->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, creator->ToPlayer());
599 TempSummon* vanessaClone = vanessaObject->SummonPersonalClone(VanessaStaticPosition, TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, creator->ToPlayer());
600 if (!mathiasClone || !vanessaClone)
601 return;
602
605 vanessaClone->SetVirtualItem(1, vanessaClone->GetVirtualItemId(0)); // add 2nd dagger to hands
606
610 }
611
625
626 void OnUpdate(uint32 diff) override
627 {
628 _events.Update(diff);
629
630 switch (_events.ExecuteEvent())
631 {
633 {
635 if (!vanessaClone)
636 break;
637
639 if (!mathiasClone)
640 break;
641
642 mathiasClone->SetFacingTo(mathiasClone->GetHomePosition().GetOrientation());
643 // @ToDo: use emote data of broadcast text
644 vanessaClone->SetEmoteState(EMOTE_STATE_NONE);
646 break;
647 }
649 {
651 if (!vanessaClone)
652 break;
653
655 if (!mathiasClone)
656 break;
657
659 mathiasClone->SetFacingToObject(vanessaClone);
660 break;
661 }
663 {
665 if (!vanessaClone)
666 break;
667
669 if (!mathiasClone)
670 break;
671
672 vanessaClone->SetFacingToObject(mathiasClone);
673 break;
674 }
676 {
678 if (!mathiasClone)
679 break;
680
681 mathiasClone->DespawnOrUnsummon();
682 break;
683 }
684 default:
685 break;
686 }
687 }
688
689private:
691};
692
693// 228928 - Stealth
712
LocaleConstant
Definition Common.h:51
First const & RAND(First const &first, Second const &second, Rest const &... rest)
uint16_t uint16
Definition Define.h:155
uint32_t uint32
Definition Define.h:154
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition Duration.h:24
@ POINT_MOTION_TYPE
@ TEMPSUMMON_MANUAL_DESPAWN
std::vector< ObjectGuid > GuidVector
Definition ObjectGuid.h:434
@ QUEST_STATUS_INCOMPLETE
Definition QuestDef.h:150
#define RegisterCreatureAI(ai_name)
Definition ScriptMgr.h:1392
#define RegisterAreaTriggerAI(ai_name)
Definition ScriptMgr.h:1428
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1383
#define RegisterConversationAI(ai_name)
Definition ScriptMgr.h:1437
Creature * GetClosestCreatureWithOptions(WorldObject *source, float maxSearchRange, FindCreatureOptions const &options)
void CloseGossipMenuFor(Player *player)
@ EFFECT_1
@ EMOTE_STATE_READY1H
@ EMOTE_STATE_WALEAN02
@ EMOTE_ONESHOT_LAUGH
@ EMOTE_STATE_NONE
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
@ SPELL_AURA_ANIM_REPLACEMENT_SET
#define AuraEffectRemoveFn(F, I, N, M)
NPCFlags
Non Player Character flags.
@ UNIT_NPC_FLAG_GOSSIP
@ UNIT_NPC_FLAG_QUESTGIVER
HookList< EffectApplyHandler > AfterEffectRemove
HookList< EffectApplyHandler > AfterEffectApply
Unit * GetTarget() const
ObjectGuid const & GetGUID() const
Definition BaseEntity.h:163
Conversation *const conversation
Milliseconds GetLineEndTime(LocaleConstant locale, int32 lineId) const
void AddActor(int32 actorId, uint32 actorIdx, ObjectGuid const &actorGuid)
LocaleConstant GetPrivateObjectOwnerLocale() const
static Conversation * CreateConversation(uint32 conversationEntry, Unit *creator, Position const &pos, ObjectGuid privateObjectOwner, SpellInfo const *spellInfo=nullptr, bool autoStart=true)
Milliseconds const * GetLineStartTime(LocaleConstant locale, int32 lineId) const
Milliseconds GetLastLineEndTime(LocaleConstant locale) const
Creature * GetActorCreature(uint32 actorIdx) const
Creature *const me
Definition CreatureAI.h:63
bool IsFormed() const
void GetHomePosition(float &x, float &y, float &z, float &ori) const
Definition Creature.h:388
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
CreatureGroup * GetFormation()
Definition Creature.h:406
uint32 ExecuteEvent()
Definition EventMap.cpp:77
void Update(uint32 time)
Definition EventMap.h:61
void ScheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
Definition EventMap.cpp:40
void Reset()
Definition EventMap.cpp:25
static void RemoveCreatureFromGroup(CreatureGroup *group, Creature *member)
void MoveRandom(float wanderDistance=0.0f, Optional< Milliseconds > duration={}, Optional< float > speed={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::ForceWalk, MovementSlot slot=MOTION_SLOT_DEFAULT, Scripting::v2::ActionResultSetter< MovementStopReason > &&scriptResult={})
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={}, Optional< float > speed={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default, Optional< float > closeEnoughDistance={}, Optional< MovementFadeObject > fadeObject={}, Scripting::v2::ActionResultSetter< MovementStopReason > &&scriptResult={})
void MovePath(uint32 pathId, bool repeatable, Optional< Milliseconds > duration={}, Optional< float > speed={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default, Optional< std::pair< Milliseconds, Milliseconds > > waitTimeRangeAtPathEnd={}, Optional< float > wanderDistanceAtPathEnds={}, Optional< bool > followPathBackwardsFromEndToStart={}, Optional< bool > exactSplinePath={}, bool generatePath=true, Optional< MovementFadeObject > fadeObject={}, Scripting::v2::ActionResultSetter< MovementStopReason > &&scriptResult={})
Player * ToPlayer()
Definition Object.h:126
static bool OnConditionChange(WorldObject *object, bool updateVisibility=true)
void KilledMonsterCredit(uint32 entry, ObjectGuid guid=ObjectGuid::Empty)
Definition Player.cpp:16679
QuestStatus GetQuestStatus(uint32 quest_id) const
Definition Player.cpp:15962
uint32 GetQuestId() const
Definition QuestDef.h:637
Definition Unit.h:635
void SetVirtualItem(uint32 slot, uint32 itemId, uint16 appearanceModId=0, uint16 itemVisual=0)
Definition Unit.cpp:14374
MotionMaster * GetMotionMaster()
Definition Unit.h:1723
void SetFacingToObject(WorldObject const *object, bool force=true)
Definition Unit.cpp:13307
void RemoveNpcFlag(NPCFlags flags)
Definition Unit.h:998
void SetEmoteState(Emote emote)
Definition Unit.h:865
uint32 GetVirtualItemId(uint32 slot) const
Definition Unit.cpp:14358
void SetNpcFlag(NPCFlags flags)
Definition Unit.h:997
bool SetWalk(bool enable)
Definition Unit.cpp:13343
void SetFacingTo(float const ori, bool force=true)
Definition Unit.cpp:13289
void HandleEmoteCommand(Emote emoteId, Player *target=nullptr, Trinity::IteratorPair< int32 const * > spellVisualKitIds={}, int32 sequenceVariation=0)
Definition Unit.cpp:1657
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3974
virtual void SetDisplayId(uint32 displayId, bool setNative=false)
Definition Unit.cpp:10779
TempSummon * SummonPersonalClone(Position const &pos, TempSummonType despawnType=TEMPSUMMON_MANUAL_DESPAWN, Milliseconds despawnTime=0s, uint32 vehId=0, uint32 spellId=0, Player *privateObjectOwner=nullptr)
Definition Object.cpp:1421
ObjectGuid GetPrivateObjectOwner() const
Definition Object.h:569
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2217
void PlayDistanceSound(uint32 soundId, Player const *target=nullptr) const
Definition Object.cpp:2922
Creature * FindNearestCreature(uint32 entry, float range, bool alive=true) const
Definition Object.cpp:1517
void OnCreate(Unit *creator) override
conversation_an_unlikely_informant(Conversation *conversation)
conversation_the_new_classington_estate(Conversation *conversation)
void OnApply(AuraEffect const *, AuraEffectHandleModes)
void OnRemove(AuraEffect const *, AuraEffectHandleModes)
TC_GAME_API Unit * GetUnit(WorldObject const &, ObjectGuid const &guid)
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
void RandomShuffle(Iterator begin, Iterator end)
Reorder the elements of the iterator range randomly.
Definition Containers.h:171
constexpr void GetPosition(float &x, float &y) const
Definition Position.h:92
at_human_heritage_lions_pride_inn_basement_enter(AreaTrigger *areatrigger)
static uint32 SoundPicker()
void UpdateAI(uint32 diff) override
void WaypointReached(uint32 waypointId, uint32 pathId) override
npc_cameron(Creature *creature)
void OnGameEvent(bool start, uint16 eventId) override
GuidVector _childrenGUIDs
bool OnGossipSelect(Player *player, uint32 menuId, uint32 gossipListId) override
void OnQuestAccept(Player *player, Quest const *quest) override
void MovementInform(uint32 type, uint32 pointId) override
void OnQuestAccept(Player *player, Quest const *quest) override
Position const VanessaClonePosition
@ STORMWIND_PATH
@ GOLDSHIRE_PATH
TheNewClassingtonEstateData
@ CONVO_ACTOR_IDX_MATHIAS_CLASSINGTON_ESTATE
@ QUEST_THE_NEW_CLASSINGTON_ESTATE
@ CONVO_LINE_VANESSA_START_WALK
@ CONVO_ACTOR_IDX_VANESSA_CLASSINGTON_ESTATE
@ SPELL_VANESSA_STEALTH_DESPAWN
@ SPELL_VANESSA_COSMETIC_VANISH
@ PATH_VANESSA_GOLDSHIRE_BASEMENT
@ CONVO_LINE_HANDLE_CLONE_FACING
@ CONVO_THE_NEW_CLASSINGTON_ESTATE
@ HUMAN_FEMALE_EMOTE_CRY
@ CTHUN_DEATH_IS_CLOSE
@ BANSHEE_DEATH
@ CTHUN_YOU_WILL_DIE
@ BANSHEEPREAGGRO
AnUnlikelyInformantEvents
@ EVENT_VANESSA_MOVE
@ EVENT_MATHIAS_QUEST_CREDIT
@ EVENT_MATHIAS_CLONE_DESPAWN
@ EVENT_VANESSA_TELEPORT
@ EVENT_VANESSA_CLONE_LEAN
@ NPC_CAMERON
ClassingtonEstateEvents
@ EVENT_VANESSA_STEALTH_DESPAWN
@ EVENT_VANESSA_START_WALK
@ EVENT_MATHIAS_SET_FACING
@ EVENT_VANESSA_SET_FACING
RottenOldMemoriesData
@ CONVO_ROTTEN_OLD_MEMORIES
@ QUEST_ROTTEN_OLD_MEMORIES
@ STORMWIND_WAYPOINT
@ LISA_WAYPOINT
@ HOUSE_WAYPOINT
@ WOODS_WAYPOINT
@ GOLDSHIRE_WAYPOINT
@ GAME_EVENT_CHILDREN_OF_GOLDSHIRE
WindowToThePastData
@ GOSSIP_OPTION_WINDOW_TO_THE_PAST
@ SPELL_PLAY_ONYXIA_SCENE
@ GOSSIP_MENU_WINDOW_TO_THE_PAST
Position const VanessaStaticPosition
@ EVENT_WP_START_WOODS
@ EVENT_WP_START_GOLDSHIRE
@ EVENT_BEGIN_EVENT
@ EVENT_PLAY_SOUNDS
@ EVENT_WP_START_LISA
@ EVENT_WP_START_HOUSE
void AddSC_elwynn_forest()
AnUnlikelyInformantData
@ CONVO_ACTOR_IDX_VANESSA
@ SPELL_VANESSA_CHEAP_SHOT
@ NPC_VANESSA_VANCLEEF
@ GOSSIP_OPTION_SIGNAL_INFORMANT
@ CONVO_AN_UNLIKELY_INFORMANT_HELLO
@ CONVO_LINE_VANESSA_MOVEMENT
@ CONVO_LINE_VANESSA_TELEPORT
@ SPELL_VANESSA_TELEPORT_BEHIND
@ CONVO_AN_UNLIKELY_INFORMANT
@ QUEST_AN_UNLIKELY_INFORMANT
@ GOSSIP_MENU_SIGNAL_INFORMANT
@ POINT_VANESSA_FINISH
@ NPC_MATHIAS_SHAW
@ CONVO_ACTOR_IDX_MATHIAS
@ CONVO_LINE_MATHIAS_QUEST_CREDIT
@ SPELL_VANESSA_STEALTH
@ DISPLAY_VANESSA_INVISIBLE
@ DISPLAY_VANESSA_VISIBLE