Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
zone_grizzly_hills.cpp
Go to the documentation of this file.
1/*
2* This file is part of Project SkyFire https://www.projectskyfire.org.
3* See LICENSE.md file for Copyright information
4*/
5
6#include "ScriptMgr.h"
7#include "ScriptedCreature.h"
8#include "ScriptedEscortAI.h"
9#include "Player.h"
10#include "SpellInfo.h"
11#include "CreatureTextMgr.h"
12
13/*######
14## Quest 12027: Mr. Floppy's Perilous Adventure
15######*/
16
18{
19 // Creature
20 NPC_MRFLOPPY = 26589,
22 NPC_RAVENOUS_WORG = 26590, // RWORG
23 NPC_EMILY = 26588,
24 // Quest
26 // Spell
27 SPELL_MRFLOPPY = 47184, // vehicle aura
28 // Text
29 SAY_WORGHAGGRO1 = 0, // Um... I think one of those wolves is back...
30 SAY_WORGHAGGRO2 = 1, // He's going for Mr. Floppy!
31 SAY_WORGRAGGRO3 = 2, // Oh, no! Look, it's another wolf, and it's a biiiiiig one!
32 SAY_WORGRAGGRO4 = 3, // He's gonna eat Mr. Floppy! You gotta help Mr. Floppy! You just gotta!
33 SAY_RANDOMAGGRO = 4, // There's a big meanie attacking Mr. Floppy! Help!
34 SAY_VICTORY1 = 5, // Let's get out of here before more wolves find us!
35 SAY_VICTORY2 = 6, // Don't go toward the light, Mr. Floppy!
36 SAY_VICTORY3 = 7, // Mr. Floppy, you're ok! Thank you so much for saving Mr. Floppy!
37 SAY_VICTORY4 = 8, // I think I see the camp! We're almost home, Mr. Floppy! Let's go!
38 TEXT_EMOTE_WP1 = 9, // Mr. Floppy revives
39 TEXT_EMOTE_AGGRO = 10, // The Ravenous Worg chomps down on Mr. Floppy
40 SAY_QUEST_ACCEPT = 11, // Are you ready, Mr. Floppy? Stay close to me and watch out for those wolves!
41 SAY_QUEST_COMPLETE = 12 // Thank you for helping me get back to the camp. Go tell Walter that I'm safe now!
42};
43
44// emily
46{
47public:
48 npc_emily() : CreatureScript("npc_emily") { }
49
50 struct npc_emilyAI : public npc_escortAI
51 {
52 npc_emilyAI(Creature* creature) : npc_escortAI(creature) { }
53
55 {
56 if (Creature* Mrfloppy = GetClosestCreatureWithEntry(me, NPC_MRFLOPPY, 50.0f))
57 summoned->AI()->AttackStart(Mrfloppy);
58 else
59 summoned->AI()->AttackStart(me->GetVictim());
60 }
61
63 {
64 Player* player = GetPlayerForEscort();
65 if (!player)
66 return;
67
68 switch (waypointId)
69 {
70 case 9:
71 if (Creature* Mrfloppy = GetClosestCreatureWithEntry(me, NPC_MRFLOPPY, 100.0f))
72 _mrfloppyGUID = Mrfloppy->GetGUID();
73 break;
74 case 10:
76 {
78 me->SummonCreature(NPC_HUNGRY_WORG, me->GetPositionX()+5, me->GetPositionY()+2, me->GetPositionZ()+1, 3.229f, TempSummonType::TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000);
79 }
80 break;
81 case 11:
82 if (Creature* Mrfloppy = Unit::GetCreature(*me, _mrfloppyGUID))
83 Mrfloppy->GetMotionMaster()->MoveFollow(me, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE);
84 break;
85 case 17:
86 if (Creature* Mrfloppy = Unit::GetCreature(*me, _mrfloppyGUID))
87 Mrfloppy->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ());
89 if (Creature* RWORG = me->SummonCreature(NPC_RAVENOUS_WORG, me->GetPositionX()+10, me->GetPositionY()+8, me->GetPositionZ()+2, 3.229f, TempSummonType::TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000))
90 {
91 RWORG->setFaction(35);
92 _RavenousworgGUID = RWORG->GetGUID();
93 }
94 break;
95 case 18:
96 if (Creature* Mrfloppy = Unit::GetCreature(*me, _mrfloppyGUID))
97 {
99 RWORG->GetMotionMaster()->MovePoint(0, Mrfloppy->GetPositionX(), Mrfloppy->GetPositionY(), Mrfloppy->GetPositionZ());
100 DoCast(Mrfloppy, SPELL_MRFLOPPY);
101 }
102 break;
103 case 19:
104 if (Creature* Mrfloppy = Unit::GetCreature(*me, _mrfloppyGUID))
105 {
106 if (Mrfloppy->HasAura(SPELL_MRFLOPPY, 0))
107 {
109 Mrfloppy->EnterVehicle(RWORG);
110 }
111 }
112 break;
113 case 20:
115 RWORG->HandleEmoteCommand(34);
116 break;
117 case 21:
118 if (Creature* Mrfloppy = Unit::GetCreature(*me, _mrfloppyGUID))
119 {
121 {
122 RWORG->Kill(Mrfloppy);
123 Mrfloppy->ExitVehicle();
124 RWORG->setFaction(14);
125 RWORG->GetMotionMaster()->MovePoint(0, RWORG->GetPositionX()+10, RWORG->GetPositionY()+80, RWORG->GetPositionZ());
127 }
128 }
129 break;
130 case 22:
131 if (Creature* Mrfloppy = Unit::GetCreature(*me, _mrfloppyGUID))
132 {
133 if (Mrfloppy->isDead())
134 {
136 RWORG->DisappearAndDie();
137 me->GetMotionMaster()->MovePoint(0, Mrfloppy->GetPositionX(), Mrfloppy->GetPositionY(), Mrfloppy->GetPositionZ());
138 Mrfloppy->setDeathState(DeathState::ALIVE);
139 Mrfloppy->GetMotionMaster()->MoveFollow(me, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE);
141 }
142 }
143 break;
144 case 24:
145 if (player)
146 {
148 Talk(SAY_QUEST_COMPLETE, player);
149 }
150 me->SetWalk(false);
151 break;
152 case 25:
154 break;
155 case 27:
156 me->DisappearAndDie();
157 if (Creature* Mrfloppy = Unit::GetCreature(*me, _mrfloppyGUID))
158 Mrfloppy->DisappearAndDie();
159 break;
160 }
161 }
162
163 void EnterCombat(Unit* /*Who*/) OVERRIDE
164 {
166 }
167
169 {
170 _mrfloppyGUID = 0;
172 }
173
174 private:
177 };
178
179 bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) OVERRIDE
180 {
181 if (quest->GetQuestId() == QUEST_PERILOUS_ADVENTURE)
182 {
183 creature->AI()->Talk(SAY_QUEST_ACCEPT);
184 if (Creature* Mrfloppy = GetClosestCreatureWithEntry(creature, NPC_MRFLOPPY, 180.0f))
185 Mrfloppy->GetMotionMaster()->MoveFollow(creature, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE);
186
187 if (npc_escortAI* pEscortAI = CAST_AI(npc_emily::npc_emilyAI, (creature->AI())))
188 pEscortAI->Start(true, false, player->GetGUID());
189 }
190 return true;
191 }
192
194 {
195 return new npc_emilyAI(creature);
196 }
197};
198
199// mrfloppy
201{
202public:
203 npc_mrfloppy() : CreatureScript("npc_mrfloppy") { }
204
206 {
207 npc_mrfloppyAI(Creature* creature) : ScriptedAI(creature) { }
208
209 void Reset() OVERRIDE { }
210
212 {
213 if (Creature* Emily = GetClosestCreatureWithEntry(me, NPC_EMILY, 50.0f))
214 {
215 switch (Who->GetEntry())
216 {
217 case NPC_HUNGRY_WORG:
218 Emily->AI()->Talk(SAY_WORGHAGGRO2);
219 break;
221 Emily->AI()->Talk(SAY_WORGRAGGRO4);
222 break;
223 default:
224 Emily->AI()->Talk(SAY_RANDOMAGGRO);
225 }
226 }
227 }
228
230
231 void MoveInLineOfSight(Unit* /*who*/) OVERRIDE { }
232
233
234 void UpdateAI(uint32 /*diff*/) OVERRIDE
235 {
236 if (!UpdateVictim())
237 return;
238 }
239 };
240
242 {
243 return new npc_mrfloppyAI(creature);
244 }
245};
246
247/*######
248## Quest 12227: Doing Your Duty
249######*/
250
252{
253 // Sound
255 SOUND_MALE = 12670,
256 // Spell
260};
261
263{
264public:
265 npc_outhouse_bunny() : CreatureScript("npc_outhouse_bunny") { }
266
268 {
269 npc_outhouse_bunnyAI(Creature* creature) : ScriptedAI(creature) { }
270
272 {
273 _counter = 0;
274 _gender = 0;
275 }
276
278 {
279 if (Type == 1)
280 _gender = Data;
281 }
282
283 void SpellHit(Unit* Caster, const SpellInfo* Spell) OVERRIDE
284 {
285 if (Spell->Id == SPELL_OUTHOUSE_GROANS)
286 {
287 ++_counter;
288 if (_counter < 5)
289 DoCast(Caster, SPELL_CAMERA_SHAKE, true);
290 else
291 _counter = 0;
292 DoCast(me, SPELL_DUST_FIELD, true);
293 switch (_gender)
294 {
295 case GENDER_FEMALE:
297 break;
298
299 case GENDER_MALE:
301 break;
302 }
303 }
304 }
305 private:
308 };
309
311 {
312 return new npc_outhouse_bunnyAI(creature);
313 }
314};
315
316// Tallhorn Stage
317
319{
320 //Gameobject
322};
323
325{
326public:
327 npc_tallhorn_stag() : CreatureScript("npc_tallhorn_stag") { }
328
330 {
331 npc_tallhorn_stagAI(Creature* creature) : ScriptedAI(creature) { }
332
334 {
335 _phase = 1;
336 }
337
338 void UpdateAI(uint32 /*diff*/) OVERRIDE
339 {
340 if (_phase == 1)
341 {
342 if (me->FindNearestGameObject(OBJECT_HAUNCH, 2.0f))
343 {
344 me->SetStandState(UNIT_STAND_STATE_DEAD);
347 }
348 _phase = 0;
349 }
351 }
352 private:
354 };
355
357 {
358 return new npc_tallhorn_stagAI(creature);
359 }
360};
361
362// Amberpine Woodsman
363
365{
366 // Creature
368};
369
375
377{
378public:
379 npc_amberpine_woodsman() : CreatureScript("npc_amberpine_woodsman") { }
380
382 {
384
386 {
387 if (me->FindNearestCreature(NPC_TALLHORN_STAG, 0.2f))
388 {
390 }
391 else
392 _events.ScheduleEvent(EVENT_WOODSMAN_1, 0);
393 }
394
396 {
397 _events.Update(diff);
398
399 while (uint32 eventId = _events.ExecuteEvent())
400 {
401 switch (eventId)
402 {
403 case EVENT_WOODSMAN_1:
405 _events.ScheduleEvent(EVENT_WOODSMAN_2, 3000);
406 break;
407 case EVENT_WOODSMAN_2:
409 _events.ScheduleEvent(EVENT_WOODSMAN_1, 4000);
410 break;
411 default:
412 break;
413 }
414 }
415 UpdateVictim();
416 }
417 private:
419 };
420
422 {
423 return new npc_amberpine_woodsmanAI(creature);
424 }
425};
426
427/*######
428## Quest 12288: Overwhelmed!
429######*/
430
432{
433 // Quest
435 // Spell
438 // Text
440};
441
443{
444public:
445 npc_wounded_skirmisher() : CreatureScript("npc_wounded_skirmisher") { }
446
448 {
450
452 {
453 _despawnTimer = 5000;
454 _playerGUID = 0;
455 }
456
458 {
459 if (id == 1)
460 me->DespawnOrUnsummon(_despawnTimer);
461 }
462
463 void SpellHit(Unit* caster, const SpellInfo* spell) OVERRIDE
464 {
465 if (spell->Id == SPELL_RENEW_SKIRMISHER && caster->GetTypeId() == TypeID::TYPEID_PLAYER
466 && caster->ToPlayer()->GetQuestStatus(QUEST_OVERWHELMED) == QUEST_STATUS_INCOMPLETE)
467 {
468 DoCast(caster, SPELL_KILL_CREDIT);
470 if (me->IsStandState())
471 me->GetMotionMaster()->MovePoint(1, me->GetPositionX()+7, me->GetPositionY()+7, me->GetPositionZ());
472 else
473 {
474 me->SetStandState(UNIT_STAND_STATE_STAND);
475 me->DespawnOrUnsummon(_despawnTimer);
476 }
477 }
478 }
479
480 void UpdateAI(uint32 /*diff*/) OVERRIDE
481 {
482 if (!UpdateVictim())
483 return;
484
486 }
487 private:
490 };
491
493 {
494 return new npc_wounded_skirmisherAI(creature);
495 }
496};
497
498/*Venture co. Straggler - when you cast Smoke Bomb, he will yell and run away*/
500{
501 // Quest
504 // Spell
506 SPELL_CHOP = 43410,
508 // Text
510};
511
520
522{
523public:
524 npc_venture_co_straggler() : CreatureScript("npc_venture_co_straggler") { }
525
527 {
529
531 {
532 _playerGUID = 0;
533
535 me->SetReactState(REACT_AGGRESSIVE);
536 }
537
539 {
540 _events.Update(diff);
541
542 while (uint32 eventId = _events.ExecuteEvent())
543 {
544 switch (eventId)
545 {
549 me->GetMotionMaster()->MovePoint(0, me->GetPositionX()-7, me->GetPositionY()+7, me->GetPositionZ());
550 _events.ScheduleEvent(EVENT_STRAGGLER_2, 2500);
551 break;
553 Talk(SAY_SEO);
554 me->GetMotionMaster()->MovePoint(0, me->GetPositionX()-7, me->GetPositionY()-5, me->GetPositionZ());
555 _events.ScheduleEvent(EVENT_STRAGGLER_3, 2500);
556 break;
558 me->GetMotionMaster()->MovePoint(0, me->GetPositionX()-5, me->GetPositionY()-5, me->GetPositionZ());
559 _events.ScheduleEvent(EVENT_STRAGGLER_4, 2500);
560 break;
562 me->DisappearAndDie();
563 break;
564 case EVENT_CHOP:
565 if (UpdateVictim())
567 _events.ScheduleEvent(EVENT_CHOP, 10000, 12000);
568 break;
569 default:
570 break;
571 }
572 }
573
574 if (!UpdateVictim())
575 return;
576
578 }
579
580 void SpellHit(Unit* caster, SpellInfo const* spell) OVERRIDE
581 {
582 if (spell->Id == SPELL_SMOKE_BOMB && caster->GetTypeId() == TypeID::TYPEID_PLAYER)
583 {
585 me->SetReactState(REACT_PASSIVE);
586 me->CombatStop(false);
587 _playerGUID = caster->GetGUID();
588 _events.ScheduleEvent(EVENT_STRAGGLER_1, 3500);
589 }
590 }
591
592 private:
595 };
596
598 {
599 return new npc_venture_co_stragglerAI(creature);
600 }
601};
602
603/*######
604## Quest: A Blade Fit For A Champion
605######*/
606
608{
609 // Creature
613 // Items
615 // Spells
617 SPELL_FROG_LOVE = 62537, // for 1 minute !
618 SPELL_WARTS = 62581,
622 // Text
625};
626
635
637{
638public:
639 npc_lake_frog() : CreatureScript("npc_lake_frog") { }
640
642 {
643 npc_lake_frogAI(Creature* creature) : ScriptedAI(creature) { }
644
646 {
647 _following = false;
648 _runningScript = false;
649 if (me->GetEntry() == NPC_LAKE_FROG_QUEST)
651 }
652
654 {
655 if (_following)
656 if (!me->HasAura(SPELL_FROG_LOVE))
657 me->DespawnOrUnsummon(1000);
658
659 _events.Update(diff);
660
661 while (uint32 eventId = _events.ExecuteEvent())
662 {
663 switch (eventId)
664 {
665 case EVENT_LAKEFROG_1:
668 _events.ScheduleEvent(EVENT_LAKEFROG_2, 2000);
669 break;
670 case EVENT_LAKEFROG_2:
672 _events.ScheduleEvent(EVENT_LAKEFROG_3, 3000);
673 break;
674 case EVENT_LAKEFROG_3:
676 _events.ScheduleEvent(EVENT_LAKEFROG_4, 25000);
677 break;
678 case EVENT_LAKEFROG_4:
680 _events.ScheduleEvent(EVENT_LAKEFROG_5, 2000);
681 break;
682 case EVENT_LAKEFROG_5:
684 me->DespawnOrUnsummon(4000);
685 break;
686 default:
687 break;
688 }
689 }
690 }
691
692 void ReceiveEmote(Player* player, uint32 emote) OVERRIDE
693 {
695 return;
696
697 if (emote == TEXT_EMOTE_KISS && me->IsWithinDistInMap(player, 30.0f) && player->HasItemCount(ITEM_WARTS_B_GONE_LIP_BALM, 1, false))
698 {
699 if (!player->HasAura(SPELL_WARTSBGONE_LIP_BALM))
700 player->AddAura(SPELL_WARTS, player);
701 else
702 {
703 DoCast(player, SPELL_FROG_KISS); // Removes SPELL_WARTSBGONE_LIP_BALM
704
705 if (me->GetEntry() == NPC_LAKE_FROG)
706 {
707 me->AddAura(SPELL_FROG_LOVE, me);
708 me->GetMotionMaster()->MoveFollow(player, 0.3f, frand(M_PI/2, M_PI + (M_PI/2)));
709 _following = true;
710 }
711 else if (me->GetEntry() == NPC_LAKE_FROG_QUEST)
712 {
713 me->GetMotionMaster()->MoveIdle();
714 me->SetFacingToObject(player);
715 _runningScript = true;
716 _events.ScheduleEvent(EVENT_LAKEFROG_1, 2000);
717 }
718 }
719 }
720 }
721
722 void sGossipSelect(Player* player, uint32 /*sender*/, uint32 /*action*/) OVERRIDE
723 {
725 }
726
727 private:
731 };
732
734 {
735 return new npc_lake_frogAI(creature);
736 }
737};
738
740{
741 new npc_emily();
742 new npc_mrfloppy();
743 new npc_outhouse_bunny();
744 new npc_tallhorn_stag();
748 new npc_lake_frog();
749}
#define M_PI
Definition Common.h:192
std::uint8_t uint8
Definition Define.h:79
std::uint32_t uint32
Definition Define.h:77
#define OVERRIDE
Definition Define.h:60
std::uint64_t uint64
Definition Define.h:76
@ TYPEID_PLAYER
Definition Object.h:55
@ TEMPSUMMON_TIMED_OR_DEAD_DESPAWN
Definition Object.h:68
#define PET_FOLLOW_ANGLE
Definition PetDefines.h:58
#define PET_FOLLOW_DIST
Definition PetDefines.h:57
@ QUEST_STATUS_INCOMPLETE
Definition QuestDef.h:89
Creature * GetClosestCreatureWithEntry(WorldObject *source, uint32 entry, float maxSearchRange, bool alive)
#define CAST_AI(a, b)
@ EMOTE_ONESHOT_ATTACK1H
@ EMOTE_STATE_LOOT
@ EMOTE_STATE_USE_STANDING
@ GENDER_MALE
@ GENDER_FEMALE
@ UNIT_DYNFLAG_DEAD
@ TEXT_EMOTE_KISS
@ UNIT_NPC_FLAG_GOSSIP
Definition Unit.h:687
@ ALIVE
Definition Unit.h:503
@ UNIT_STAND_STATE_DEAD
Definition Unit.h:169
@ UNIT_STAND_STATE_STAND
Definition Unit.h:162
@ REACT_PASSIVE
Definition Unit.h:1156
@ REACT_AGGRESSIVE
Definition Unit.h:1158
@ UNIT_FLAG_NON_ATTACKABLE
Definition Unit.h:626
@ UNIT_FLAG_IMMUNE_TO_PC
Definition Unit.h:633
@ UNIT_FIELD_NPC_FLAGS
@ UNIT_FIELD_FLAGS
@ UNIT_FIELD_NPC_EMOTESTATE
@ OBJECT_FIELD_DYNAMIC_FLAGS
float frand(float min, float max)
Definition Util.cpp:39
@ SPELL_KILL_CREDIT
@ SAY_RANDOM
void Talk(uint8 id, WorldObject const *whisperTarget=NULL)
bool UpdateVictim()
CreatureScript(const char *name)
static Player * GetPlayer(WorldObject const &, uint64 guid)
void GroupEventHappens(uint32 questId, WorldObject const *pEventObject)
Definition Spell.h:289
void DoMeleeAttackIfReady()
Definition UnitAI.cpp:28
void DoCast(uint32 spellId)
Definition UnitAI.cpp:110
void DoCastVictim(uint32 spellId, bool triggered=false)
Definition UnitAI.cpp:168
Definition Unit.h:1367
static Creature * GetCreature(WorldObject &object, uint64 guid)
Definition Unit.cpp:4905
CreatureAI * GetAI(Creature *creature) const OVERRIDE
bool OnQuestAccept(Player *player, Creature *creature, Quest const *quest) OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
Data
Definition molten_core.h:55
Creature * me
ScriptedAI(Creature *creature)
void DoPlaySoundToSet(WorldObject *source, uint32 soundId)
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void JustSummoned(Creature *summoned) OVERRIDE
void WaypointReached(uint32 waypointId) OVERRIDE
void EnterCombat(Unit *) OVERRIDE
npc_emilyAI(Creature *creature)
Player * GetPlayerForEscort()
npc_escortAI(Creature *creature)
void sGossipSelect(Player *player, uint32, uint32) OVERRIDE
void ReceiveEmote(Player *player, uint32 emote) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void UpdateAI(uint32) OVERRIDE
== Triggered Actions Requested ==================
void EnterCombat(Unit *Who) OVERRIDE
void MoveInLineOfSight(Unit *) OVERRIDE
void SpellHit(Unit *Caster, const SpellInfo *Spell) OVERRIDE
void SetData(uint32 Type, uint32 Data) OVERRIDE
void UpdateAI(uint32) OVERRIDE
== Triggered Actions Requested ==================
void SpellHit(Unit *caster, SpellInfo const *spell) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void SpellHit(Unit *caster, const SpellInfo *spell) OVERRIDE
void UpdateAI(uint32) OVERRIDE
== Triggered Actions Requested ==================
@ NPC_TALLHORN_STAG
void AddSC_grizzly_hills()
@ SPELL_VENTURE_STRAGGLER_CREDIT
@ SPELL_SMOKE_BOMB
@ QUEST_SMOKE_EM_OUT_H
@ QUEST_SMOKE_EM_OUT_A
@ NPC_LAKE_FROG
@ SPELL_FROG_KISS
@ ITEM_WARTS_B_GONE_LIP_BALM
@ SPELL_SUMMON_ASHWOOD_BRAND
@ SPELL_WARTSBGONE_LIP_BALM
@ NPC_LAKE_FROG_QUEST
@ SPELL_FROG_LOVE
@ NPC_MAIDEN_OF_ASHWOOD_LAKE
@ SPELL_MAIDEN_OF_ASHWOOD_LAKE_TRANSFORM
@ SPELL_KILL_CREDIT
@ QUEST_OVERWHELMED
@ SPELL_RENEW_SKIRMISHER
@ SAY_QUEST_COMPLETE
@ NPC_RAVENOUS_WORG
@ TEXT_EMOTE_AGGRO
@ SAY_VICTORY1
@ SAY_VICTORY3
@ SAY_RANDOMAGGRO
@ SAY_VICTORY2
@ SAY_WORGRAGGRO3
@ SAY_WORGRAGGRO4
@ QUEST_PERILOUS_ADVENTURE
@ SAY_QUEST_ACCEPT
@ NPC_MRFLOPPY
@ SAY_WORGHAGGRO1
@ SPELL_MRFLOPPY
@ SAY_WORGHAGGRO2
@ SAY_VICTORY4
@ NPC_HUNGRY_WORG
@ TEXT_EMOTE_WP1
AmberpineWoodsmanEvents
@ EVENT_WOODSMAN_2
@ EVENT_WOODSMAN_1
@ EVENT_STRAGGLER_3
@ EVENT_STRAGGLER_1
@ EVENT_STRAGGLER_2
@ EVENT_STRAGGLER_4
@ EVENT_LAKEFROG_4
@ EVENT_LAKEFROG_3
@ EVENT_LAKEFROG_5
@ EVENT_LAKEFROG_2
@ EVENT_LAKEFROG_1
@ OBJECT_HAUNCH
@ SPELL_DUST_FIELD
@ SPELL_CAMERA_SHAKE
@ SPELL_OUTHOUSE_GROANS