TrinityCore
Loading...
Searching...
No Matches
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 {
50 if (Type != POINT_MOTION_TYPE)
51 return;
53 }
54};
55
56/*######
57## npc_crusade_recruit
58######*/
59
66
72
74{
76 {
77 Initialize();
78 }
79
81 {
83 }
84
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
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
449
450// 51105 - Random Ingredient Medium
451// 51107 - Random Ingredient Hard
452// 51134 - Random Ingredient Easy
454{
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
514};
515
516/*#####
517# spell_pot_check
518#####*/
519
520// 51046 - Pot Check
522{
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
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
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
681
682// 51966 - Scourge Disguise
703
704// 51971 - Scourge Disguise Instability
730
731// 52010 - Scourge Disguise Expiring
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
768};
769
770/*######
771## Quest 12606: Cocooned!
772######*/
773
779
780// 51596 - Cocooned: Player Not On Quest
798
799// 51598 - Cocooned: Player On Quest
817
818/*######
819## Quest 12676: Sabotage
820######*/
821
829
830// 52324 - Scourgewagon Explosion
861
862/*######
863## Quest 12861: Trolls Is Gone Crazy!
864######*/
865
866// 54990 - Chains of the Scourge
884
@ IN_MILLISECONDS
Definition Common.h:38
uint8_t uint8
Definition Define.h:156
int32_t int32
Definition Define.h:150
uint32_t uint32
Definition Define.h:154
@ POINT_MOTION_TYPE
@ QUEST_STATUS_INCOMPLETE
Definition QuestDef.h:150
int32 irand(int32 min, int32 max)
Definition Random.cpp:35
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:42
bool roll_chance(T chance)
Definition Random.h:55
#define RegisterCreatureAI(ai_name)
Definition ScriptMgr.h:1392
#define RegisterGameObjectAI(ai_name)
Definition ScriptMgr.h:1410
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1383
Creature * GetClosestCreatureWithEntry(WorldObject *source, uint32 entry, float maxSearchRange, bool alive=true)
void CloseGossipMenuFor(Player *player)
SpellEffIndex
@ EFFECT_1
@ EFFECT_0
@ 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)
#define AuraEffectPeriodicFn(F, I, N)
#define AuraEffectUpdatePeriodicFn(F, I, N)
#define AuraEffectCalcPeriodicFn(F, I, N)
#define AuraEffectApplyFn(F, I, N, M)
#define SpellHitFn(F)
#define AuraEffectRemoveFn(F, I, N, M)
@ UNIT_NPC_FLAG_GOSSIP
void CalculatePeriodic(Unit *caster, bool resetPeriodicTimer=true, bool load=false)
HookList< EffectCalcPeriodicHandler > DoEffectCalcPeriodic
AuraApplication const * GetTargetApplication() const
HookList< EffectApplyHandler > AfterEffectRemove
HookList< EffectPeriodicHandler > OnEffectPeriodic
SpellInfo const * GetSpellInfo() const
Unit * GetCaster() const
HookList< EffectUpdatePeriodicHandler > OnEffectUpdatePeriodic
Unit * GetTarget() const
HookList< EffectApplyHandler > OnEffectRemove
HookList< EffectApplyHandler > OnEffectApply
ObjectGuid const & GetGUID() const
Definition BaseEntity.h:163
bool UpdateVictim()
Creature *const me
Definition CreatureAI.h:63
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
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 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 Clear()
Definition ObjectGuid.h:329
Unit * ToUnit()
Definition Object.h:116
bool HasItemCount(uint32 item, uint32 count=1, bool inBankAlso=false) const
Definition Player.cpp:9904
uint32 DestroyItemCount(uint32 item, uint32 count, bool update, bool unequip_check=false)
Definition Player.cpp:12222
int32 CalcValueAsInt(WorldObject const *caster=nullptr, SpellEffectValue const *basePoints=nullptr, Unit const *target=nullptr, float *variance=nullptr, uint32 castItemId=0, int32 itemLevel=-1) const
uint32 const Id
Definition SpellInfo.h:328
SpellEffectInfo const & GetEffect(SpellEffIndex index) const
Definition SpellInfo.h:588
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
Player * GetHitPlayer() const
Unit * GetCaster() const
HookList< HitHandler > AfterHit
int32 GetEffectValueAsInt() const
HookList< EffectHandler > OnEffectHit
Unit * GetHitUnit() const
HookList< EffectHandler > OnEffectHitTarget
SpellInfo const * GetSpellInfo() const
SpellCastResult DoCast(uint32 spellId)
Definition UnitAI.cpp:89
Definition Unit.h:635
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3828
MotionMaster * GetMotionMaster()
Definition Unit.h:1723
void SetFacingToObject(WorldObject const *object, bool force=true)
Definition Unit.cpp:13307
float GetCombatReach() const override
Definition Unit.h:705
void RemoveNpcFlag(NPCFlags flags)
Definition Unit.h:998
void SetEmoteState(Emote emote)
Definition Unit.h:865
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
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition Unit.cpp:4804
Vehicle * GetVehicleKit() const
Definition Unit.h:1782
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3974
void GetClosePoint(float &x, float &y, float &z, float size, float distance2d=0, float relAngle=0) const
Definition Object.cpp:2749
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2217
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)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *spellInfo) override
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
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:87
constexpr float GetPositionY() const
Definition Position.h:88
constexpr float GetOrientation() const
Definition Position.h:90
constexpr float GetPositionZ() const
Definition Position.h:89
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]