TrinityCore
zone_zuldrak.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 "ScriptMgr.h"
19#include "GameObject.h"
20#include "GameObjectAI.h"
21#include "MotionMaster.h"
22#include "ObjectAccessor.h"
23#include "Player.h"
24#include "ScriptedCreature.h"
25#include "ScriptedGossip.h"
26#include "SpellAuraEffects.h"
27#include "SpellAuras.h"
28#include "SpellInfo.h"
29#include "SpellScript.h"
30#include "TemporarySummon.h"
31#include "Vehicle.h"
32
33/*####
34## npc_released_offspring_harkoa
35####*/
36
38{
40
41 void Reset() override
42 {
43 float x, y, z;
44 me->GetClosePoint(x, y, z, me->GetCombatReach() / 3, 25.0f);
45 me->GetMotionMaster()->MovePoint(0, x, y, z);
46 }
47
48 void MovementInform(uint32 Type, uint32 /*uiId*/) override
49 {
51 return;
53 }
54};
55
56/*######
57## npc_crusade_recruit
58######*/
59
61{
64 SAY_RECRUIT = 0
65};
66
68{
71};
72
74{
76 {
77 Initialize();
78 }
79
81 {
83 }
84
85 void Reset() override
86 {
89 Initialize();
90 }
91
92 void UpdateAI(uint32 diff) override
93 {
94 _events.Update(diff);
95
96 while (uint32 eventId = _events.ExecuteEvent())
97 {
98 switch (eventId)
99 {
100 case EVENT_RECRUIT_1:
105 break;
106 case EVENT_RECRUIT_2:
107 me->SetWalk(true);
108 me->GetMotionMaster()->MovePoint(0, me->GetPositionX() + (std::cos(_heading) * 10), me->GetPositionY() + (std::sin(_heading) * 10), me->GetPositionZ());
110 break;
111 default:
112 break;
113 }
114 }
115
116 if (!UpdateVictim())
117 return;
118 }
119
120 bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override
121 {
123 CloseGossipMenuFor(player);
124 me->CastSpell(player, SPELL_QUEST_CREDIT, true);
125 me->SetFacingToObject(player);
126 return false;
127 }
128
129private:
131 float _heading; // Store creature heading
132};
133
134/*######
135## Quest: Troll Patrol: The Alchemist's Apprentice
136######*/
137
139{
140 // Creature
142 // Item
164 // Quest
166 // Spells
178 // Spell Fetch Easy
190 // Spell Have Easy
202 // Spell Fetch Medium
208 // Spell Have Medium
214 // Spell Fetch Hard
220 // Spell Have Hard
226 // Text
232 // Text Easy
244 // Text Medium
250 // Text Hard
257
259{
265 EVENT_HARD_6 = 6
267
269{
271 {
273 }
274
275 void Reset() override
276 {
280 }
281
282 void SetData(uint32 type, uint32 data) override
283 {
284 if (type == 1 && data == 1)
285 switch (_getingredienttry)
286 {
287 case 2:
288 case 3:
290 break;
291 case 4:
293 break;
294 case 5:
296 break;
297 case 6:
299 break;
300 default:
301 break;
302 }
303 }
304
305 void UpdateAI(uint32 diff) override
306 {
307 _events.Update(diff);
308
309 while (uint32 eventId = _events.ExecuteEvent())
310 {
311 switch (eventId)
312 {
314 me->SetFacingTo(6.230825f);
317 break;
318 case EVENT_TURN_BACK:
319 me->SetFacingTo(4.886922f);
322 break;
323 case EVENT_EASY_123:
325 {
326 Talk(SAY_EASY_123, player);
329 }
330 break;
331 case EVENT_MEDIUM_4:
333 {
334 Talk(SAY_MEDIUM_4, player);
337 }
338 break;
339 case EVENT_MEDIUM_5:
341 {
342 Talk(SAY_MEDIUM_5, player);
345 }
346 break;
347 case EVENT_HARD_6:
349 {
350 Talk(SAY_HARD_6, player);
353 }
354 break;
355 default:
356 break;
357 }
358 }
359 }
360
361 bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override
362 {
363 CloseGossipMenuFor(player);
365 _playerGUID = player->GetGUID();
368 return false;
369 }
370
371private:
375};
376
378{
380
381 bool OnGossipHello(Player* player) override
382 {
383 player->CastSpell(player, SPELL_POT_CHECK);
384 return true;
385 }
386};
387
389{
411};
412
413// 51015 - Random Ingredient Easy Aura
414// 51154 - Random Ingredient Medium Aura
415// 51157 - Random Ingredient Hard Aura
417{
418 bool Validate(SpellInfo const* /*spellInfo*/) override
419 {
420 return ValidateSpellInfo(
421 {
425 });
426 }
427
428 void PeriodicTick(AuraEffect const* /*aurEff*/)
429 {
430 switch (GetSpellInfo()->Id)
431 {
434 break;
437 break;
440 break;
441 }
442 }
443
444 void Register() override
445 {
447 }
448};
449
450// 51105 - Random Ingredient Medium
451// 51107 - Random Ingredient Hard
452// 51134 - Random Ingredient Easy
454{
455 bool Validate(SpellInfo const* /*spellInfo*/) override
456 {
457 return ValidateSpellInfo(
458 {
480 });
481 }
482
484 {
485 if (Player* player = GetHitPlayer())
486 {
487 uint8 ingredient = 0;
488
489 switch (GetSpellInfo()->Id)
490 {
492 ingredient = urand(0, 10);
493 break;
495 ingredient = urand(11, 15);
496 break;
498 ingredient = urand(16, 20);
499 break;
500 }
501
502 if (Creature* finklestein = GetClosestCreatureWithEntry(player, NPC_FINKLESTEIN, 25.0f))
503 {
504 finklestein->CastSpell(player, FetchIngredients[ingredient][0], true);
505 finklestein->AI()->Talk(FetchIngredients[ingredient][3], player);
506 }
507 }
508 }
509
510 void Register() override
511 {
513 }
514};
515
516/*#####
517# spell_pot_check
518#####*/
519
520// 51046 - Pot Check
522{
523 bool Validate(SpellInfo const* /*spellInfo*/) override
524 {
525 return ValidateSpellInfo(
526 {
548 });
549 }
550
552 {
553 if (Player* player = GetHitPlayer())
554 {
555 for (uint8 i = 0; i < 21; ++i)
556 {
557 if (player->HasAura(FetchIngredients[i][0]))
558 {
559 player->CastSpell(player, SPELL_THROW_INGREDIENT);
560 player->RemoveAura(FetchIngredients[i][0]);
561 if (player->HasAura(FetchIngredients[i][1]))
562 {
563 player->RemoveAura(FetchIngredients[i][1]);
564 player->DestroyItemCount(FetchIngredients[i][2], 1, true);
565 if (i < 15)
566 {
567 if (Creature* finklestein = GetClosestCreatureWithEntry(player, NPC_FINKLESTEIN, 25.0f))
568 finklestein->AI()->SetData(1, 1);
569 return;
570 }
571 else
572 {
574 {
575 player->RemoveAura(SPELL_ALCHEMIST_APPRENTICE_INVISBUFF);
576 player->CastSpell(player, SPELL_KILL_CREDIT);
577 }
578 }
579 }
580 else
581 {
582 RemoveItems(player);
583 player->RemoveAura(SPELL_ALCHEMIST_APPRENTICE_INVISBUFF);
584 if (Creature* finklestein = GetClosestCreatureWithEntry(player, NPC_FINKLESTEIN, 25.0f))
585 finklestein->AI()->Talk(SAY_RUINED, player);
586 return;
587 }
588 }
589 }
590 }
591 }
592
593 void RemoveItems(Player* player)
594 {
595 for (uint8 i = 0; i < 21; ++i)
596 if (player->HasItemCount(FetchIngredients[i][2], 1, true))
597 player->DestroyItemCount(FetchIngredients[i][2], 1, true);
598 }
599
600 void Register() override
601 {
603 }
604};
605
606/*#####
607# spell_fetch_ingredient_aura
608#####*/
609
611{
612 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
613 {
614 Unit* target = GetTarget();
615 if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE)
617 if (Creature* finklestein = GetClosestCreatureWithEntry(target, NPC_FINKLESTEIN, 100.0f))
618 {
620 finklestein->AI()->Talk(SAY_RUINED, target);
621 }
622 }
623
624 void Register() override
625 {
627 }
628};
629
631{
632 STORM_COULD = 29939,
635 GYMERS_GRAB = 55516,
636 RIDE_VEHICLE = 43671
638
640{
641 npc_storm_cloud(Creature* creature) : ScriptedAI(creature) { }
642
643 void Reset() override
644 {
645 me->CastSpell(me, STORM_VISUAL, true);
646 }
647
648 void JustAppeared() override
649 {
650 Reset();
651 }
652
653 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
654 {
655 Unit* unitCaster = caster->ToUnit();
656 if (!unitCaster)
657 return;
658
659 if (spellInfo->Id != GYMERS_GRAB)
660 return;
661
662 if (Vehicle* veh = unitCaster->GetVehicleKit())
663 {
664 if (veh->GetAvailableSeatCount() != 0)
665 {
666 me->CastSpell(caster, RIDE_VEHICLE, true);
667 me->CastSpell(caster, HEALING_WINDS, true);
668 }
669 }
670 }
671};
672
674{
681
682// 51966 - Scourge Disguise
684{
685 void ApplyEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
686 {
687 Unit* target = GetTarget();
688 target->CastSpell(target, SPELL_SCOURGE_DISGUISE_INSTABILITY, true);
689 }
690
691 void RemoveEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
692 {
693 Unit* target = GetTarget();
695 }
696
697 void Register() override
698 {
701 }
702};
703
704// 51971 - Scourge Disguise Instability
706{
707 void CalcPeriodic(AuraEffect const* /*aurEff*/, bool& isPeriodic, int32& amplitude)
708 {
709 isPeriodic = true;
710 amplitude = irand(30, 240) * IN_MILLISECONDS;
711 }
712
713 void HandleDummyTick(AuraEffect const* /*aurEff*/)
714 {
716 }
717
719 {
720 aurEff->CalculatePeriodic(GetCaster());
721 }
722
723 void Register() override
724 {
728 }
729};
730
731// 52010 - Scourge Disguise Expiring
733{
734 void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
735 {
736 if (Player* player = GetTarget()->ToPlayer())
737 if (player->HasAura(SPELL_SCOURGE_DISGUISE))
738 player->Unit::Whisper(TEXT_DISGUISE_WARNING, player, true);
739 }
740
741 void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
742 {
744 }
745
746 void Register() override
747 {
750 }
751};
752
753// 52335 - Drop Scourge Disguise
754// 54089 - Drop Disguise
756{
758 {
759 if (Unit* target = GetHitUnit())
760 if (target->HasAura(SPELL_SCOURGE_DISGUISE))
761 target->CastSpell(target, SPELL_SCOURGE_DISGUISE_EXPIRING, true);
762 }
763
764 void Register() override
765 {
767 }
768};
769
770/*######
771## Quest 12606: Cocooned!
772######*/
773
775{
779
780// 51596 - Cocooned: Player Not On Quest
782{
783 bool Validate(SpellInfo const* /*spellInfo*/) override
784 {
786 }
787
788 void HandleDummy(SpellEffIndex /*effIndex*/)
789 {
791 }
792
793 void Register() override
794 {
796 }
797};
798
799// 51598 - Cocooned: Player On Quest
801{
802 bool Validate(SpellInfo const* /*spellInfo*/) override
803 {
805 }
806
807 void HandleDummy(SpellEffIndex /*effIndex*/)
808 {
810 }
811
812 void Register() override
813 {
815 }
816};
817
818/*######
819## Quest 12676: Sabotage
820######*/
821
823{
829
830// 52324 - Scourgewagon Explosion
832{
833 bool Validate(SpellInfo const* /*spellInfo*/) override
834 {
835 return ValidateSpellInfo(
836 {
841 });
842 }
843
844 void HandleScript(SpellEffIndex /*effIndex*/)
845 {
846 Unit* caster = GetCaster();
854 }
855
856 void Register() override
857 {
859 }
860};
861
862/*######
863## Quest 12861: Trolls Is Gone Crazy!
864######*/
865
866// 54990 - Chains of the Scourge
868{
869 bool Validate(SpellInfo const* spellInfo) override
870 {
871 return ValidateSpellInfo({ uint32(spellInfo->GetEffect(EFFECT_1).CalcValue()) });
872 }
873
874 void HandleScript(SpellEffIndex /*effIndex*/)
875 {
877 }
878
879 void Register() override
880 {
882 }
883};
884
886{
904}
@ IN_MILLISECONDS
Definition: Common.h:35
uint8_t uint8
Definition: Define.h:144
int32_t int32
Definition: Define.h:138
uint32_t uint32
Definition: Define.h:142
@ POINT_MOTION_TYPE
@ QUEST_STATUS_INCOMPLETE
Definition: QuestDef.h:145
int32 irand(int32 min, int32 max)
Definition: Random.cpp:35
uint32 urand(uint32 min, uint32 max)
Definition: Random.cpp:42
bool roll_chance_i(int chance)
Definition: Random.h:59
#define RegisterCreatureAI(ai_name)
Definition: ScriptMgr.h:1380
#define RegisterGameObjectAI(ai_name)
Definition: ScriptMgr.h:1398
#define RegisterSpellScript(spell_script)
Definition: ScriptMgr.h:1369
Creature * GetClosestCreatureWithEntry(WorldObject *source, uint32 entry, float maxSearchRange, bool alive=true)
void CloseGossipMenuFor(Player *player)
SpellEffIndex
Definition: SharedDefines.h:29
@ EFFECT_1
Definition: SharedDefines.h:31
@ EFFECT_0
Definition: SharedDefines.h:30
@ EMOTE_STATE_COWER
@ EMOTE_STATE_NONE
@ EMOTE_ONESHOT_NONE
@ EMOTE_STATE_USE_STANDING_NO_SHEATHE
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_SCRIPT_EFFECT
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
@ AURA_REMOVE_BY_EXPIRE
@ SPELL_AURA_DUMMY
@ SPELL_AURA_TRANSFORM
@ SPELL_AURA_PERIODIC_DUMMY
#define SpellEffectFn(F, I, N)
Definition: SpellScript.h:842
#define AuraEffectPeriodicFn(F, I, N)
Definition: SpellScript.h:2046
#define AuraEffectUpdatePeriodicFn(F, I, N)
Definition: SpellScript.h:2052
#define AuraEffectCalcPeriodicFn(F, I, N)
Definition: SpellScript.h:2064
#define AuraEffectApplyFn(F, I, N, M)
Definition: SpellScript.h:2029
#define SpellHitFn(F)
Definition: SpellScript.h:854
#define AuraEffectRemoveFn(F, I, N, M)
Definition: SpellScript.h:2040
@ UNIT_NPC_FLAG_GOSSIP
Definition: UnitDefines.h:297
void CalculatePeriodic(Unit *caster, bool resetPeriodicTimer=true, bool load=false)
HookList< EffectCalcPeriodicHandler > DoEffectCalcPeriodic
Definition: SpellScript.h:2063
AuraApplication const * GetTargetApplication() const
HookList< EffectApplyHandler > AfterEffectRemove
Definition: SpellScript.h:2039
HookList< EffectPeriodicHandler > OnEffectPeriodic
Definition: SpellScript.h:2045
SpellInfo const * GetSpellInfo() const
Unit * GetCaster() const
HookList< EffectUpdatePeriodicHandler > OnEffectUpdatePeriodic
Definition: SpellScript.h:2051
Unit * GetTarget() const
HookList< EffectApplyHandler > OnEffectRemove
Definition: SpellScript.h:2035
HookList< EffectApplyHandler > OnEffectApply
Definition: SpellScript.h:2024
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
Definition: CreatureAI.cpp:56
bool UpdateVictim()
Definition: CreatureAI.cpp:245
Creature *const me
Definition: CreatureAI.h:61
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
Definition: Creature.cpp:2415
uint32 ExecuteEvent()
Definition: EventMap.cpp:73
void Update(uint32 time)
Definition: EventMap.h:56
void ScheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
Definition: EventMap.cpp:36
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={}, Optional< float > speed={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default, Optional< float > closeEnoughDistance={})
void Clear()
Definition: ObjectGuid.h:286
static Unit * ToUnit(Object *o)
Definition: Object.h:225
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
bool HasItemCount(uint32 item, uint32 count=1, bool inBankAlso=false) const
Definition: Player.cpp:9888
uint32 DestroyItemCount(uint32 item, uint32 count, bool update, bool unequip_check=false)
Definition: Player.cpp:12281
int32 CalcValue(WorldObject const *caster=nullptr, int32 const *basePoints=nullptr, Unit const *target=nullptr, float *variance=nullptr, uint32 castItemId=0, int32 itemLevel=-1) const
Definition: SpellInfo.cpp:495
uint32 const Id
Definition: SpellInfo.h:325
SpellEffectInfo const & GetEffect(SpellEffIndex index) const
Definition: SpellInfo.h:577
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
Definition: SpellScript.h:162
Player * GetHitPlayer() const
Unit * GetCaster() const
HookList< HitHandler > AfterHit
Definition: SpellScript.h:852
HookList< EffectHandler > OnEffectHit
Definition: SpellScript.h:839
Unit * GetHitUnit() const
int32 GetEffectValue() const
HookList< EffectHandler > OnEffectHitTarget
Definition: SpellScript.h:840
SpellInfo const * GetSpellInfo() const
SpellCastResult DoCast(uint32 spellId)
Definition: UnitAI.cpp:89
Definition: Unit.h:627
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:3685
MotionMaster * GetMotionMaster()
Definition: Unit.h:1652
void SetFacingToObject(WorldObject const *object, bool force=true)
Definition: Unit.cpp:12671
float GetCombatReach() const override
Definition: Unit.h:694
void RemoveNpcFlag(NPCFlags flags)
Definition: Unit.h:983
void SetEmoteState(Emote emote)
Definition: Unit.h:852
void SetNpcFlag(NPCFlags flags)
Definition: Unit.h:982
bool SetWalk(bool enable)
Definition: Unit.cpp:12707
void SetFacingTo(float const ori, bool force=true)
Definition: Unit.cpp:12653
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition: Unit.cpp:4664
Vehicle * GetVehicleKit() const
Definition: Unit.h:1711
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:3831
void GetClosePoint(float &x, float &y, float &z, float size, float distance2d=0, float relAngle=0) const
Definition: Object.cpp:3403
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition: Object.cpp:2896
void OnRemove(AuraEffect const *, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
void HandleScriptEffect(SpellEffIndex)
void Register() override
void RemoveItems(Player *player)
void PeriodicTick(AuraEffect const *)
bool Validate(SpellInfo const *) override
void HandleScriptEffect(SpellEffIndex)
void Register() override
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *spellInfo) override
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void HandleDummy(SpellEffIndex)
void OnApply(AuraEffect const *, AuraEffectHandleModes)
void AfterRemove(AuraEffect const *, AuraEffectHandleModes)
void CalcPeriodic(AuraEffect const *, bool &isPeriodic, int32 &amplitude)
void HandleUpdatePeriodic(AuraEffect *aurEff)
void RemoveEffect(AuraEffect const *, AuraEffectHandleModes)
void ApplyEffect(AuraEffect const *, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
TC_GAME_API Player * GetPlayer(Map const *, ObjectGuid const &guid)
constexpr float GetPositionX() const
Definition: Position.h:76
constexpr float GetPositionY() const
Definition: Position.h:77
constexpr float GetOrientation() const
Definition: Position.h:79
constexpr float GetPositionZ() const
Definition: Position.h:78
go_finklesteins_cauldron(GameObject *go)
bool OnGossipHello(Player *player) override
void UpdateAI(uint32 diff) override
void SetData(uint32 type, uint32 data) override
npc_alchemist_finklestein(Creature *creature)
bool OnGossipSelect(Player *player, uint32, uint32) override
void UpdateAI(uint32 diff) override
npc_crusade_recruit(Creature *creature)
void Reset() override
bool OnGossipSelect(Player *player, uint32, uint32) override
npc_released_offspring_harkoa(Creature *creature)
void MovementInform(uint32 Type, uint32) override
void SpellHit(WorldObject *caster, SpellInfo const *spellInfo) override
void Reset() override
npc_storm_cloud(Creature *creature)
void JustAppeared() override
Finklestein
@ SPELL_HAVE_WITHERED_BATWING
@ SPELL_POT_CHECK
@ SPELL_FETCH_FROZEN_SPIDER_ICHOR
@ SAY_EASY_123
@ SPELL_FETCH_ICECROWN_BOTTLED_WATER
@ SPELL_RANDOM_INGREDIENT_HARD
@ SAY_PULVERIZED_GARGOYLE_TEETH
@ SPELL_FETCH_WASPS_WINGS
@ SPELL_HAVE_HAIRY_HERRING_HEAD
@ SPELL_HAVE_RAPTOR_CLAW
@ SPELL_HAVE_SPIKY_SPIDER_EGG
@ SAY_SEASONED_SLIDER_CIDER
@ SPELL_NEXT_INGREDIENT
@ ITEM_ICECROWN_BOTTLED_WATER
@ SPELL_HAVE_PRISMATIC_MOJO
@ SPELL_FETCH_AMBERSEED
@ ITEM_SHRUNKEN_DRAGONS_CLAW
@ ITEM_WITHERED_BATWING
@ SAY_RAPTOR_CLAW
@ ITEM_PUTRID_PIRATE_PERSPIRATION
@ SPELL_HAVE_MUDDY_MIRE_MAGGOT
@ SAY_MUDDY_MIRE_MAGGOT
@ ITEM_CRUSHED_BASILISK_CRYSTALS
@ SPELL_FETCH_MUDDY_MIRE_MAGGOT
@ SAY_HARD_6
@ ITEM_PULVERIZED_GARGOYLE_TEETH
@ SAY_SPIKY_SPIDER_EGG
@ SPELL_KILL_CREDIT
@ SPELL_HAVE_PUTRID_PIRATE_PERSPIRATION
@ SPELL_HAVE_SPECKLED_GUANO
@ SAY_PICKLED_EAGLE_EGG
@ ITEM_AMBERSEED
@ NPC_FINKLESTEIN
@ SPELL_FETCH_WITHERED_BATWING
@ SAY_CRYSTALLIZED_HOGSNOT
@ SPELL_HAVE_AMBERSEED
@ SPELL_RANDOM_INGREDIENT_HARD_AURA
@ ITEM_CRYSTALLIZED_HOGSNOT
@ SPELL_FETCH_RAPTOR_CLAW
@ SAY_AMBERSEED
@ SPELL_HAVE_CRUSHED_BASILISK_CRYSTALS
@ SAY_WITHERED_BATWING
@ SPELL_FETCH_CRYSTALLIZED_HOGSNOT
@ SAY_SHRUNKEN_DRAGONS_CLAW
@ SPELL_FETCH_PULVERIZED_GARGOYLE_TEETH
@ SPELL_FETCH_SPECKLED_GUANO
@ SPELL_HAVE_CRYSTALLIZED_HOGSNOT
@ SPELL_FETCH_TROLLBANE
@ SPELL_HAVE_TROLLBANE
@ SPELL_RANDOM_INGREDIENT_EASY
@ SPELL_RANDOM_INGREDIENT_MEDIUM
@ ITEM_SPECKLED_GUANO
@ SPELL_FETCH_KNOTROOT
@ SAY_CHILLED_SERPENT_MUCUS
@ SAY_PUTRID_PIRATE_PERSPIRATION
@ SAY_TROLLBANE
@ SPELL_FETCH_SEASONED_SLIDER_CIDER
@ SAY_WASPS_WINGS
@ SAY_CRUSHED_BASILISK_CRYSTALS
@ SPELL_HAVE_FROZEN_SPIDER_ICHOR
@ SAY_MEDIUM_5
@ SPELL_RANDOM_INGREDIENT_EASY_AURA
@ SPELL_HAVE_PULVERIZED_GARGOYLE_TEETH
@ ITEM_SPIKY_SPIDER_EGG
@ ITEM_CHILLED_SERPENT_MUCUS
@ ITEM_PICKLED_EAGLE_EGG
@ ITEM_FROZEN_SPIDER_ICHOR
@ SPELL_FETCH_CRUSHED_BASILISK_CRYSTALS
@ SPELL_FETCH_HAIRY_HERRING_HEAD
@ SPELL_ALCHEMIST_APPRENTICE_INVISBUFF
@ SAY_MEDIUM_4
@ ITEM_WASPS_WINGS
@ ITEM_MUDDY_MIRE_MAGGOT
@ SAY_KNOTROOT
@ SPELL_FETCH_SPIKY_SPIDER_EGG
@ SPELL_HAVE_SHRUNKEN_DRAGONS_CLAW
@ SAY_PRISMATIC_MOJO
@ ITEM_RAPTOR_CLAW
@ SPELL_HAVE_ICECROWN_BOTTLED_WATER
@ ITEM_SEASONED_SLIDER_CIDER
@ SPELL_FETCH_PICKLED_EAGLE_EGG
@ SPELL_HAVE_PICKLED_EAGLE_EGG
@ SPELL_FETCH_SHRUNKEN_DRAGONS_CLAW
@ SPELL_HAVE_WASPS_WINGS
@ SPELL_HAVE_CHILLED_SERPENT_MUCUS
@ SAY_ICECROWN_BOTTLED_WATER
@ QUEST_THE_ALCHEMIST_APPRENTICE_DAILY
@ SPELL_HAVE_KNOTROOT
@ SPELL_FETCH_CHILLED_SERPENT_MUCUS
@ SAY_RUINED
@ SPELL_FETCH_PRISMATIC_MOJO
@ SAY_SPECKLED_GUANO
@ ITEM_HAIRY_HERRING_HEAD
@ SPELL_RANDOM_INGREDIENT_MEDIUM_AURA
@ SAY_FROZEN_SPIDER_ICHOR
@ SPELL_HAVE_SEASONED_SLIDER_CIDER
@ SPELL_FETCH_PUTRID_PIRATE_PERSPIRATION
@ SPELL_THROW_INGREDIENT
@ ITEM_TROLLBANE
@ ITEM_PRISMATIC_MOJO
@ SAY_HAIRY_HERRING_HEAD
@ ITEM_KNOTROOT
CrusadeRecruit
@ SAY_RECRUIT
@ SPELL_QUEST_CREDIT
@ QUEST_TROLL_PATROL_INTESTINAL_FORTITUDE
ScourgeDisguise
@ SPELL_SCOURGE_DISGUISE_INSTABILITY
@ SPELL_SCOURGE_DISGUISE_EXPIRING
@ SPELL_SCOURGE_DISGUISE
@ SPELL_DROP_DISGUISE
@ TEXT_DISGUISE_WARNING
FinklesteinEvents
@ EVENT_HARD_6
@ EVENT_EASY_123
@ EVENT_MEDIUM_5
@ EVENT_MEDIUM_4
@ EVENT_TURN_BACK
@ EVENT_TURN_TO_POT
void AddSC_zuldrak()
StormCloud
@ STORM_VISUAL
@ GYMERS_GRAB
@ RIDE_VEHICLE
@ STORM_COULD
@ HEALING_WINDS
Sabotage
@ SPELL_EXPLODE_SCOURGEWAGON_GRILL
@ SPELL_EXPLODE_SCOURGEWAGON_FRAME
@ SPELL_EXPLODE_SCOURGEWAGON_ROLLER
@ SPELL_EXPLODE_SCOURGEWAGON_WHEEL
CrusadeRecruitEvents
@ EVENT_RECRUIT_1
@ EVENT_RECRUIT_2
Cocooned
@ SPELL_SUMMON_SCOURGED_CAPTIVE
@ SPELL_SUMMON_CAPTIVE_FOOTMAN
uint32 const FetchIngredients[21][4]