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
451
452// 51105 - Random Ingredient Medium
453// 51107 - Random Ingredient Hard
454// 51134 - Random Ingredient Easy
456{
458
486
488 {
489 if (Player* player = GetHitPlayer())
490 {
491 uint8 ingredient = 0;
492
493 switch (GetSpellInfo()->Id)
494 {
496 ingredient = urand(0, 10);
497 break;
499 ingredient = urand(11, 15);
500 break;
502 ingredient = urand(16, 20);
503 break;
504 }
505
506 if (Creature* finklestein = GetClosestCreatureWithEntry(player, NPC_FINKLESTEIN, 25.0f))
507 {
508 finklestein->CastSpell(player, FetchIngredients[ingredient][0], true);
509 finklestein->AI()->Talk(FetchIngredients[ingredient][3], player);
510 }
511 }
512 }
513
518};
519
520/*#####
521# spell_pot_check
522#####*/
523
524// 51046 - Pot Check
526{
528
556
558 {
559 if (Player* player = GetHitPlayer())
560 {
561 for (uint8 i = 0; i < 21; ++i)
562 {
563 if (player->HasAura(FetchIngredients[i][0]))
564 {
565 player->CastSpell(player, SPELL_THROW_INGREDIENT);
566 player->RemoveAura(FetchIngredients[i][0]);
567 if (player->HasAura(FetchIngredients[i][1]))
568 {
569 player->RemoveAura(FetchIngredients[i][1]);
570 player->DestroyItemCount(FetchIngredients[i][2], 1, true);
571 if (i < 15)
572 {
573 if (Creature* finklestein = GetClosestCreatureWithEntry(player, NPC_FINKLESTEIN, 25.0f))
574 finklestein->AI()->SetData(1, 1);
575 return;
576 }
577 else
578 {
580 {
581 player->RemoveAura(SPELL_ALCHEMIST_APPRENTICE_INVISBUFF);
582 player->CastSpell(player, SPELL_KILL_CREDIT);
583 }
584 }
585 }
586 else
587 {
588 RemoveItems(player);
589 player->RemoveAura(SPELL_ALCHEMIST_APPRENTICE_INVISBUFF);
590 if (Creature* finklestein = GetClosestCreatureWithEntry(player, NPC_FINKLESTEIN, 25.0f))
591 finklestein->AI()->Talk(SAY_RUINED, player);
592 return;
593 }
594 }
595 }
596 }
597 }
598
599 void RemoveItems(Player* player)
600 {
601 for (uint8 i = 0; i < 21; ++i)
602 if (player->HasItemCount(FetchIngredients[i][2], 1, true))
603 player->DestroyItemCount(FetchIngredients[i][2], 1, true);
604 }
605
610};
611
612/*#####
613# spell_fetch_ingredient_aura
614#####*/
615
617{
619
620 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
621 {
622 Unit* target = GetTarget();
623 if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE)
625 if (Creature* finklestein = GetClosestCreatureWithEntry(target, NPC_FINKLESTEIN, 100.0f))
626 {
628 finklestein->AI()->Talk(SAY_RUINED, target);
629 }
630 }
631
636};
637
639{
640 STORM_COULD = 29939,
643 GYMERS_GRAB = 55516,
644 RIDE_VEHICLE = 43671
646
648{
649 npc_storm_cloud(Creature* creature) : ScriptedAI(creature) { }
650
651 void Reset() override
652 {
653 me->CastSpell(me, STORM_VISUAL, true);
654 }
655
656 void JustAppeared() override
657 {
658 Reset();
659 }
660
661 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
662 {
663 Unit* unitCaster = caster->ToUnit();
664 if (!unitCaster)
665 return;
666
667 if (spellInfo->Id != GYMERS_GRAB)
668 return;
669
670 if (Vehicle* veh = unitCaster->GetVehicleKit())
671 {
672 if (veh->GetAvailableSeatCount() != 0)
673 {
674 me->CastSpell(caster, RIDE_VEHICLE, true);
675 me->CastSpell(caster, HEALING_WINDS, true);
676 }
677 }
678 }
679};
680
689
690// 51966 - Scourge Disguise
713
714// 51971 - Scourge Disguise Instability
742
743// 52010 - Scourge Disguise Expiring
766
767// 52335 - Drop Scourge Disguise
768// 54089 - Drop Disguise
770{
772
774 {
775 if (Unit* target = GetHitUnit())
776 if (target->HasAura(SPELL_SCOURGE_DISGUISE))
777 target->CastSpell(target, SPELL_SCOURGE_DISGUISE_EXPIRING, true);
778 }
779
784};
785
786/*######
787## Quest 12606: Cocooned!
788######*/
789
795
796// 51596 - Cocooned: Player Not On Quest
816
817// 51598 - Cocooned: Player On Quest
837
838/*######
839## Quest 12676: Sabotage
840######*/
841
849
850// 52324 - Scourgewagon Explosion
883
884/*######
885## Quest 12861: Trolls Is Gone Crazy!
886######*/
887
888// 54990 - Chains of the Scourge
908
909/*######
910## Quest 12721: Rampage
911######*/
912
920
921// 52933 - Rampage: Summon Zul'Aman Gods Master
951
952/*######
953## Quest 12627: Breaking Through Jin'Alai
954######*/
955
963
964// 51862 - Breaking Through Jin'Alai: Summon Zul'Aman Gods Master
994
995/*######
996## Quest 12630: Kickin' Nass and Takin' Manes
997######*/
998
1003
1004// 51864 - Player Summon Nass
1005// 51889 - Quest Accept Summon Nass
1025
1026/*######
1027## Quest 12730: Convocation at Zol'Heb
1028######*/
1029
1035
1036// 53010 - Convocation at Zol'Heb: Removef Akali's Stun
1056
1057// 53350 - Quenching Mist
1077
1078// 52989 - Akali's Stun
1098
1099/*######
1100## Quest 12661: Infiltrating Voltarus / 12669: So Far, So Bad / 12676: Sabotage / 12677: Hazardous Materials / 12713: Betrayal
1101######*/
1102
1103// 55368 - Summon Stefan
1105{
1107
1109 {
1110 // Adjust effect summon position (sniff)
1111 Position const offset = { 0.0f, 0.0f, 30.0f, 0.0f };
1112 dest.RelocateOffset(offset);
1113 }
1114
1119};
1120
1121/*######
1122## Quest 12527: Gluttonous Lurkers
1123######*/
1124
1129
1130// 50894 - Zul'Drak Rat
1132{
1134
1135 bool Validate(SpellInfo const* /*spell*/) override
1136 {
1138 }
1139
1141 {
1142 if (GetHitAura() && GetHitAura()->GetStackAmount() >= GetSpellInfo()->StackAmount)
1143 {
1145 if (Creature* basilisk = GetHitUnit()->ToCreature())
1146 basilisk->DespawnOrUnsummon();
1147 }
1148 }
1149
1154};
1155
1156/*######
1157## Quest 12919: The Storm King's Vengeance
1158######*/
1159
1166
1167// 55516 - Gymer's Grab
1192
1193// 55421 - Gymer's Throw
1195{
1197
1198 bool Validate(SpellInfo const* /*spell*/) override
1199 {
1201 }
1202
1203 void HandleScript(SpellEffIndex /*effIndex*/)
1204 {
1205 Unit* caster = GetCaster();
1206 if (caster->IsVehicle())
1207 if (Unit* passenger = caster->GetVehicleKit()->GetPassenger(1))
1208 {
1209 passenger->ExitVehicle();
1210 caster->CastSpell(passenger, SPELL_VARGUL_EXPLOSION, true);
1211 }
1212 }
1213
1218};
1219
1220/*######
1221## Quest 12557: Lab Work
1222######*/
1223
1236
1237// 51060 - Have Withered Batwing
1238// 51068 - Have Muddy Mire Maggot
1239// 51088 - Have Amberseed
1240// 51094 - Have Chilled Serpent Mucus
1282
1283/*######
1284## Quest 12710: Disclosure
1285######*/
1286
1287// 52839 - Summon Escort Aura
1322
1324{
1354}
@ IN_MILLISECONDS
Definition Common.h:35
uint8_t uint8
Definition Define.h:135
int32_t int32
Definition Define.h:129
uint32_t uint32
Definition Define.h:133
@ POINT_MOTION_TYPE
@ QUEST_STATUS_INCOMPLETE
Definition QuestDef.h:107
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:1139
#define RegisterGameObjectAI(ai_name)
Definition ScriptMgr.h:1157
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1128
Creature * GetClosestCreatureWithEntry(WorldObject *source, uint32 entry, float maxSearchRange, bool alive=true)
void CloseGossipMenuFor(Player *player)
SpellEffIndex
@ EFFECT_1
@ EFFECT_0
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_SCRIPT_EFFECT
@ TARGET_DEST_CASTER_BACK
@ EMOTE_STATE_COWER
@ EMOTE_STATE_NONE
@ EMOTE_ONESHOT_NONE
@ EMOTE_STATE_USE_STANDING_NO_SHEATHE
@ AURA_REMOVE_BY_EXPIRE
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
@ SPELL_AURA_PERIODIC_HEAL
@ SPELL_AURA_DUMMY
@ SPELL_AURA_TRANSFORM
@ SPELL_AURA_PERIODIC_DUMMY
@ SPELL_AURA_MOD_STUN
@ TRIGGERED_FULL_MASK
Will return SPELL_FAILED_DONT_REPORT in CheckCast functions.
#define SpellEffectFn(F, I, N)
#define AuraEffectPeriodicFn(F, I, N)
#define AuraEffectUpdatePeriodicFn(F, I, N)
#define SpellDestinationTargetSelectFn(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
HookList< EffectApplyHandler > AfterEffectApply
Unit * GetCaster() const
HookList< EffectUpdatePeriodicHandler > OnEffectUpdatePeriodic
Unit * GetTarget() const
HookList< EffectApplyHandler > OnEffectRemove
HookList< EffectApplyHandler > OnEffectApply
uint32 GetId() const
bool UpdateVictim()
Creature *const me
Definition CreatureAI.h:82
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
void Update(uint32 time)
Definition EventMap.h:67
EventId ExecuteEvent()
Definition EventMap.cpp:73
void ScheduleEvent(EventId eventId, Milliseconds time, GroupIndex group=0u, PhaseIndex phase=0u)
Definition EventMap.cpp:36
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={})
void Clear()
Definition ObjectGuid.h:150
static Unit * ToUnit(Object *o)
Definition Object.h:192
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:78
bool HasItemCount(uint32 item, uint32 count=1, bool inBankAlso=false) const
Definition Player.cpp:9763
uint32 DestroyItemCount(uint32 item, uint32 count, bool update, bool unequip_check=false)
Definition Player.cpp:12209
int32 CalcValue(WorldObject const *caster=nullptr, int32 const *basePoints=nullptr) const
uint32 Id
Definition SpellInfo.h:289
SpellEffectInfo const & GetEffect(SpellEffIndex index) const
Definition SpellInfo.h:483
Creature * GetHitCreature() const
Player * GetHitPlayer() const
Unit * GetCaster() const
HookList< HitHandler > AfterHit
HookList< DestinationTargetSelectHandler > OnDestinationTargetSelect
HookList< EffectHandler > OnEffectHit
Unit * GetHitUnit() const
int32 GetEffectValue() const
HookList< EffectHandler > OnEffectHitTarget
Aura * GetHitAura(bool dynObjAura=false) const
SpellInfo const * GetSpellInfo() const
SpellCastResult DoCast(uint32 spellId)
Definition UnitAI.cpp:106
Definition Unit.h:769
bool IsVehicle() const
Definition Unit.h:887
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3638
MotionMaster * GetMotionMaster()
Definition Unit.h:1667
float GetCombatReach() const override
Definition Unit.h:839
void RemoveNpcFlag(NPCFlags flags)
Definition Unit.h:1098
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:4535
void SetFacingToObject(WorldObject const *object, bool force=true, uint32 movementId=EVENT_FACE)
Definition Unit.cpp:13259
void SetEmoteState(Emote emote)
Definition Unit.h:967
void SetNpcFlag(NPCFlags flags)
Definition Unit.h:1097
bool SetWalk(bool enable)
Definition Unit.cpp:13268
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3784
void SetFacingTo(float ori, bool force=true, uint32 movementId=EVENT_FACE)
Definition Unit.cpp:13250
Vehicle * GetVehicleKit() const
Definition Unit.h:1735
Unit * GetPassenger(int8 seatId) const
Gets a passenger on specified seat.
Definition Vehicle.cpp:296
void GetClosePoint(float &x, float &y, float &z, float size, float distance2d=0, float relAngle=0) const
Definition Object.cpp:3244
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2832
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
void OnRemove(AuraEffect const *, AuraEffectHandleModes)
PrepareAuraScript(spell_fetch_ingredient_aura)
bool Validate(SpellInfo const *) override
PrepareSpellScript(spell_pot_check)
void HandleScriptEffect(SpellEffIndex)
void Register() override
void RemoveItems(Player *player)
void PeriodicTick(AuraEffect const *)
PrepareAuraScript(spell_random_ingredient_aura)
bool Validate(SpellInfo const *) override
void HandleScriptEffect(SpellEffIndex)
PrepareSpellScript(spell_random_ingredient)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void AfterApply(AuraEffect const *, AuraEffectHandleModes)
PrepareAuraScript(spell_zuldrak_akalis_stun)
PrepareSpellScript(spell_zuldrak_breaking_through_summon_zulaman_gods_master)
PrepareSpellScript(spell_zuldrak_chains_of_the_scourge)
bool Validate(SpellInfo const *spellInfo) override
PrepareSpellScript(spell_zuldrak_cocooned_not_on_quest)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
PrepareSpellScript(spell_zuldrak_cocooned_on_quest)
PrepareSpellScript(spell_zuldrak_drop_disguise)
PrepareSpellScript(spell_zuldrak_gymers_grab)
void HandleScript(SpellEffIndex)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
PrepareSpellScript(spell_zuldrak_gymers_throw)
void HandleScript(SpellEffIndex)
PrepareAuraScript(spell_zuldrak_have_ingredient)
void AfterApply(AuraEffect const *, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void HandleEffectPeriodic(AuraEffect const *)
PrepareAuraScript(spell_zuldrak_quenching_mist)
PrepareSpellScript(spell_zuldrak_rampage_summon_zulaman_gods_master)
bool Validate(SpellInfo const *) override
PrepareSpellScript(spell_zuldrak_remove_akalis_stun)
bool Validate(SpellInfo const *) override
void OnApply(AuraEffect const *, AuraEffectHandleModes)
PrepareAuraScript(spell_zuldrak_scourge_disguise_expiring)
void AfterRemove(AuraEffect const *, AuraEffectHandleModes)
void CalcPeriodic(AuraEffect const *, bool &isPeriodic, int32 &amplitude)
PrepareAuraScript(spell_zuldrak_scourge_disguise_instability)
void HandleUpdatePeriodic(AuraEffect *aurEff)
void RemoveEffect(AuraEffect const *, AuraEffectHandleModes)
PrepareAuraScript(spell_zuldrak_scourge_disguise)
void ApplyEffect(AuraEffect const *, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
PrepareSpellScript(spell_zuldrak_scourgewagon_explosion)
void AfterApply(AuraEffect const *, AuraEffectHandleModes)
PrepareAuraScript(spell_zuldrak_summon_escort_aura)
bool Validate(SpellInfo const *) override
void HandleScript(SpellEffIndex)
bool Validate(SpellInfo const *) override
PrepareSpellScript(spell_zuldrak_summon_nass)
void SetDest(SpellDestination &dest)
PrepareSpellScript(spell_zuldrak_summon_stefan)
PrepareSpellScript(spell_zuldrak_zuldrak_rat)
void HandleScriptEffect(SpellEffIndex)
bool Validate(SpellInfo const *) override
TC_GAME_API Player * GetPlayer(Map const *, ObjectGuid const &guid)
CastSpellExtraArgs & AddSpellBP0(int32 val)
float GetPositionZ() const
Definition Position.h:81
float GetOrientation() const
Definition Position.h:82
float GetPositionX() const
Definition Position.h:79
float GetPositionY() const
Definition Position.h:80
void RelocateOffset(Position const &offset)
Definition Spell.cpp:110
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
ConvocationAtZolHeb
@ SPELL_FLICKERING_FLAMES
@ SPELL_AKALIS_STUN
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()
GluttonousLurkers
@ SPELL_SUMMON_GORGED_LURKING_BASILISK
Rampage
@ SPELL_RAMPAGE_SUMMON_AKILZON
@ SPELL_RAMPAGE_SUMMON_JANALAI
@ SPELL_RAMPAGE_SUMMON_HALAZZI
@ SPELL_RAMPAGE_SUMMON_NALORAKK
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
BreakingThroughJinAlai
@ SPELL_BREAKING_THROUGH_SUMMON_AKILZON
@ SPELL_BREAKING_THROUGH_SUMMON_JANALAI
@ SPELL_BREAKING_THROUGH_SUMMON_NALORAKK
@ SPELL_BREAKING_THROUGH_SUMMON_HALAZZI
@ SPELL_LAB_WORK_HAVE_CHILLED_SERPENT_MUCUS
@ SPELL_LAB_WORK_HAVE_MUDDY_MIRE_MAGGOT
@ SPELL_LAB_WORK_HAVE_AMBERSEED
@ SPELL_LAB_WORK_HAVE_WITHERED_BATWING
@ SPELL_WITHERED_BATWING_KILL_CREDIT
@ SPELL_MUDDY_MIRE_MAGGOT_KILL_CREDIT
@ SPELL_AMBERSEED_KILL_CREDIT
@ SPELL_CHILLED_SERPENT_MUCUS_KILL_CREDIT
KickinNassAndTakinManes
@ SPELL_SUMMON_NASS
uint32 const FetchIngredients[21][4]
TheStormKingsVengeance
@ SPELL_RIDE_GYMER
@ SPELL_VARGUL_EXPLOSION
@ SPELL_GRABBED