TrinityCore
zone_nagrand.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/* ScriptData
19SDName: Nagrand
20SD%Complete: 90
21SDComment: Quest support: 9868, 9874, 10085. TextId's unknown for altruis_the_sufferer and greatmother_geyah (npc_text)
22SDCategory: Nagrand
23EndScriptData */
24
25/* ContentData
26npc_maghar_captive
27EndContentData */
28
29#include "ScriptMgr.h"
30#include "ConditionMgr.h"
31#include "GameObjectAI.h"
32#include "MotionMaster.h"
33#include "Player.h"
34#include "ScriptedEscortAI.h"
35#include "SpellInfo.h"
36#include "SpellScript.h"
37#include "TemporarySummon.h"
38
39/*######
40## npc_maghar_captive
41#####*/
42
44{
52
57
59
64
66};
67
68static float m_afAmbushA[]= {-1568.805786f, 8533.873047f, 1.958f};
69static float m_afAmbushB[]= {-1491.554321f, 8506.483398f, 1.248f};
70
72{
73public:
74 npc_maghar_captive() : CreatureScript("npc_maghar_captive") { }
75
77 {
78 npc_maghar_captiveAI(Creature* creature) : EscortAI(creature)
79 {
80 Initialize();
81 }
82
84 {
86 HealTimer = 0;
87 FrostShockTimer = 6000;
88 }
89
93
94 void Reset() override
95 {
96 Initialize();
97 }
98
99 void JustEngagedWith(Unit* /*who*/) override
100 {
102 }
103
104 void JustDied(Unit* /*killer*/) override
105 {
107 return;
108
109 if (Player* player = GetPlayerForEscort())
110 {
111 if (player->GetQuestStatus(QUEST_TOTEM_KARDASH_H) != QUEST_STATUS_COMPLETE)
112 player->FailQuest(QUEST_TOTEM_KARDASH_H);
113 }
114 }
115
116 void WaypointReached(uint32 waypointId, uint32 /*pathId*/) override
117 {
118 switch (waypointId)
119 {
120 case 7:
122
124 temp->AI()->Talk(SAY_MAG_MORE_REPLY);
125
129 break;
130 case 16:
132
133 if (Player* player = GetPlayerForEscort())
134 player->GroupEventHappens(QUEST_TOTEM_KARDASH_H, me);
135 break;
136 }
137 }
138
139 void JustSummoned(Creature* summoned) override
140 {
141 if (summoned->GetEntry() == NPC_MURK_BRUTE)
142 summoned->AI()->Talk(SAY_MAG_NO_ESCAPE);
143
144 if (summoned->IsTotem())
145 return;
146
147 summoned->SetWalk(false);
149 summoned->AI()->AttackStart(me);
150
151 }
152
153 void SpellHitTarget(WorldObject* /*target*/, SpellInfo const* spellInfo) override
154 {
155 if (spellInfo->Id == SPELL_CHAIN_LIGHTNING)
156 {
157 if (rand32() % 10)
158 return;
159
161 }
162 }
163
164 void UpdateAI(uint32 diff) override
165 {
166 EscortAI::UpdateAI(diff);
167
168 if (!UpdateVictim())
169 return;
170
172 return;
173
174 if (ChainLightningTimer <= diff)
175 {
177 ChainLightningTimer = urand(7000, 14000);
178 }
179 else
180 ChainLightningTimer -= diff;
181
182 if (HealthBelowPct(30))
183 {
184 if (HealTimer <= diff)
185 {
187 HealTimer = 5000;
188 }
189 else
190 HealTimer -= diff;
191 }
192
193 if (FrostShockTimer <= diff)
194 {
196 FrostShockTimer = urand(7500, 15000);
197 }
198 else
199 FrostShockTimer -= diff;
200 }
201
202 void OnQuestAccept(Player* player, Quest const* quest) override
203 {
204 if (quest->GetQuestId() == QUEST_TOTEM_KARDASH_H)
205 {
209 Start(true, player->GetGUID(), quest);
211
215 }
216 }
217 };
218
219 CreatureAI* GetAI(Creature* creature) const override
220 {
221 return new npc_maghar_captiveAI(creature);
222 }
223
224};
225
226/*#####
227## npc_kurenai_captive
228#####*/
229
231{
239
244
246
251
253};
254
255static float kurenaiAmbushA[]= {-1568.805786f, 8533.873047f, 1.958f};
256static float kurenaiAmbushB[]= {-1491.554321f, 8506.483398f, 1.248f};
257
259{
260public:
261 npc_kurenai_captive() : CreatureScript("npc_kurenai_captive") { }
262
264 {
266 {
267 Initialize();
268 }
269
271 {
272 ChainLightningTimer = 1000;
273 HealTimer = 0;
274 FrostShockTimer = 6000;
275 }
276
280
281 void Reset() override
282 {
283 Initialize();
284 }
285
286 void JustEngagedWith(Unit* /*who*/) override
287 {
289 }
290
291 void JustDied(Unit* /*killer*/) override
292 {
294 return;
295
296 if (Player* player = GetPlayerForEscort())
297 {
298 if (player->GetQuestStatus(QUEST_TOTEM_KARDASH_A) != QUEST_STATUS_COMPLETE)
299 player->FailQuest(QUEST_TOTEM_KARDASH_A);
300 }
301 }
302
303 void WaypointReached(uint32 waypointId, uint32 /*pathId*/) override
304 {
305 switch (waypointId)
306 {
307 case 3:
308 {
310
313
317 break;
318 }
319 case 7:
320 {
322
323 if (Player* player = GetPlayerForEscort())
324 player->GroupEventHappens(QUEST_TOTEM_KARDASH_A, me);
325 break;
326 }
327 }
328 }
329
330 void JustSummoned(Creature* summoned) override
331 {
332 if (summoned->GetEntry() == NPC_KUR_MURK_BRUTE)
334
335 // This function is for when we summoned enemies to fight - so that does NOT mean we should make our totem count in this!
336 if (summoned->IsTotem())
337 return;
338
339 summoned->SetWalk(false);
341 summoned->AI()->AttackStart(me);
342 }
343
344 void SpellHitTarget(WorldObject* /*target*/, SpellInfo const* spellInfo) override
345 {
346 if (spellInfo->Id == SPELL_KUR_CHAIN_LIGHTNING)
347 {
348 if (rand32() % 30)
349 return;
350
352 }
353
354 if (spellInfo->Id == SPELL_KUR_FROST_SHOCK)
355 {
356 if (rand32() % 30)
357 return;
358
360 }
361 }
362
363 void UpdateAI(uint32 diff) override
364 {
365 EscortAI::UpdateAI(diff);
366
367 if (!UpdateVictim())
368 return;
369
371 return;
372
373 if (ChainLightningTimer <= diff)
374 {
376 ChainLightningTimer = urand(7000, 14000);
377 } else ChainLightningTimer -= diff;
378
379 if (HealthBelowPct(30))
380 {
381 if (HealTimer <= diff)
382 {
384 HealTimer = 5000;
385 } else HealTimer -= diff;
386 }
387
388 if (FrostShockTimer <= diff)
389 {
391 FrostShockTimer = urand(7500, 15000);
392 } else FrostShockTimer -= diff;
393 }
394
395 void OnQuestAccept(Player* player, Quest const* quest) override
396 {
397 if (quest->GetQuestId() == QUEST_TOTEM_KARDASH_A)
398 {
402 Start(true, player->GetGUID(), quest);
404
408 }
409 }
410 };
411
412 CreatureAI* GetAI(Creature* creature) const override
413 {
414 return new npc_kurenai_captiveAI(creature);
415 }
416};
417
419{
422
429
431};
432
434{
435public:
436 npc_nagrand_banner() : CreatureScript("npc_nagrand_banner") { }
437
439 {
440 npc_nagrand_bannerAI(Creature* creature) : ScriptedAI(creature), bannered(false)
441 {
443 {
445 });
446 }
447
448 void Reset() override
449 {
451 }
452
453 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
454 {
455 if (spellInfo->Id == SPELL_PLANT_WARMAUL_OGRE_BANNER || spellInfo->Id == SPELL_PLANT_KIL_SORROW_BANNER)
456 bannered = true;
457 }
458
459 void UpdateAI(uint32 diff) override
460 {
461 if (!UpdateVictim())
462 return;
463
464 scheduler.Update(diff);
465 }
466
468 {
469 return bannered;
470 }
471
472 void WaypointReached(uint32 waypointId, uint32 pathId) override
473 {
474 if (pathId != PATH_NAGRAND_BANNER)
475 return;
476
477 if (waypointId == 11)
479 else if (waypointId == 4 || waypointId == 8)
481 else if (waypointId == 10)
483 else if (waypointId == 3 || waypointId == 7)
485 }
486
487 protected:
489
490 private:
492 };
493
495 {
497 {
500 SPELL_COUNTERSPELL = 31999
501 };
502
504 {
505 }
506
507 void JustEngagedWith(Unit* /*who*/) override
508 {
509 has_fled = false;
510 interrupt_cooldown = 20000;
512 .Schedule(Seconds(0), [this](TaskContext ArcaneMissiles)
513 {
515 ArcaneMissiles.Repeat(Milliseconds(2400), Milliseconds(3800));
516 })
517 .Schedule(Seconds(3), Seconds(6), [this](TaskContext ChainsOfIce)
518 {
520 DoCast(target, SPELL_CHAINS_OF_ICE, true);
521 ChainsOfIce.Repeat(Seconds(20),Seconds(25));
522 });
523 }
524
525 void UpdateAI(uint32 diff) override
526 {
527 if (!UpdateVictim() || !me->GetVictim())
528 return;
529
530 interrupt_cooldown += diff;
532 return;
533
535 {
538 }
539
540 scheduler.Update(diff);
541 }
542
543 void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
544 {
545 if (!has_fled && me->GetHealth() > damage && me->HealthBelowPctDamaged(15, damage))
546 {
548 has_fled = true;
549 }
550 }
551
552 private:
555 };
556
558 {
560 {
561 SPELL_MIND_SEAR = 32000
562 };
563
565 {
566 }
567
568 void JustEngagedWith(Unit* /*who*/) override
569 {
571 .Schedule(Milliseconds(4500), [this](TaskContext MindSear)
572 {
574 MindSear.Repeat(Milliseconds(7000), Milliseconds(11000));
575 });
576 }
577 };
578
580 {
582 {
583 SPELL_BLOODTHIRST = 31996
584 };
585
587 {
588 }
589
590 void JustEngagedWith(Unit* /*who*/) override
591 {
592 used_bloodthirst = false;
593 }
594
595 void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
596 {
597 if (!used_bloodthirst && me->GetHealth() > damage && me->HealthBelowPctDamaged(50, damage))
598 {
600 used_bloodthirst = true;
601 }
602 }
603
604 private:
606 };
607
609 {
611 {
613 };
614
616 {
617 }
618
619 void JustEngagedWith(Unit* /*who*/) override
620 {
621 used_transform = false;
622 }
623
624 void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
625 {
626 if (!used_transform && me->GetHealth() > damage && me->HealthBelowPctDamaged(65, damage))
627 {
629 used_transform = true;
630 }
631 }
632
633 private:
635 };
636
638 {
640 {
643 SPELL_HEALING_WAVE = 11986
644 };
645
647 {
648 }
649
650 void JustEngagedWith(Unit* /*who*/) override
651 {
652 used_healing = false;
654 .Schedule(Seconds(2), [this](TaskContext /*SearingTotem*/)
655 {
657 })
658 .Schedule(Seconds(6), [this](TaskContext FrostShock)
659 {
661 FrostShock.Repeat(Seconds(12));
662 });
663 }
664
665 void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
666 {
667 if (!used_healing && me->GetHealth() > damage && me->HealthBelowPctDamaged(50, damage))
668 {
670 used_healing = true;
671 }
672 }
673
674 private:
676 };
677
678 CreatureAI* GetAI(Creature* creature) const override
679 {
680 switch (creature->GetEntry())
681 {
683 return new npc_kil_sorrow_spellbinderAI(creature);
685 return new npc_kil_sorrow_cultistAI(creature);
687 return new npc_kil_sorrow_deathswornAI(creature);
689 return new npc_giselda_the_croneAI(creature);
691 return new npc_warmaul_shamanAI(creature);
692 default:
693 return new npc_nagrand_bannerAI(creature);
694 }
695 }
696};
697
699{
700public:
701 condition_nagrand_banner() : ConditionScript("conditition_nagrand_banner") {}
702
703 bool OnConditionCheck(Condition const* condition, ConditionSourceInfo& sourceInfo) override
704 {
705 WorldObject const* target = sourceInfo.mConditionTargets[condition->ConditionTarget];
706 if (Creature const* creature = target->ToCreature())
707 {
709 return !ai->IsBannered();
710 }
711 return false;
712 }
713};
714
716{
722
723// 31959 - Fire Bomb Target Summon Trigger
725{
726 bool Validate(SpellInfo const* /*spellInfo*/) override
727 {
729 }
730
731 void HandleScript(SpellEffIndex /*effIndex*/)
732 {
733 if (TempSummon* casterSummon = GetCaster()->ToTempSummon())
734 if (Unit* summoner = casterSummon->GetSummonerUnit())
735 casterSummon->CastSpell(summoner, SPELL_FIRE_BOMB_TARGET_SUMMON_EFFECT);
736 }
737
738 void Register() override
739 {
741 }
742};
743
744// 31960 - Fire Bomb Target Summon Effect
746{
747 bool Validate(SpellInfo const* /*spellInfo*/) override
748 {
750 }
751
752 void HandleScript(SpellEffIndex /*effIndex*/)
753 {
755 }
756
757 void Register() override
758 {
760 }
761};
762
763// 31961 - Fire Bomb
765{
766 bool Validate(SpellInfo const* /*spellInfo*/) override
767 {
769 }
770
771 void HandleScript(SpellEffIndex /*effIndex*/)
772 {
773 Unit* target = GetHitUnit();
775 target->CastSpell(target, SPELL_FIRE_BOMB_FLAMES);
776 }
777
778 void Register() override
779 {
781 }
782};
783
785{
786 new npc_maghar_captive();
788 new npc_nagrand_banner();
793}
uint32_t uint32
Definition: Define.h:142
std::chrono::seconds Seconds
Seconds shorthand typedef.
Definition: Duration.h:32
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition: Duration.h:29
@ TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT
Definition: ObjectDefines.h:66
@ QUEST_STATUS_COMPLETE
Definition: QuestDef.h:143
uint32 urand(uint32 min, uint32 max)
Definition: Random.cpp:42
uint32 rand32()
Definition: Random.cpp:70
#define RegisterSpellScript(spell_script)
Definition: ScriptMgr.h:1369
@ STATE_ESCORT_ESCORTING
SpellEffIndex
Definition: SharedDefines.h:29
@ EFFECT_0
Definition: SharedDefines.h:30
@ EFFECT_2
Definition: SharedDefines.h:32
@ EMOTE_ONESHOT_POINT
@ EMOTE_ONESHOT_APPLAUD
@ EMOTE_ONESHOT_TALK
@ EMOTE_STATE_USE_STANDING
@ SPELL_EFFECT_SCRIPT_EFFECT
@ FACTION_ESCORTEE_A_NEUTRAL_ACTIVE
@ FACTION_ESCORTEE_H_NEUTRAL_ACTIVE
#define SpellEffectFn(F, I, N)
Definition: SpellScript.h:842
#define CAST_AI(a, b)
Definition: UnitAI.h:28
@ UNIT_STAND_STATE_STAND
Definition: UnitDefines.h:42
DamageEffectType
Definition: UnitDefines.h:131
@ UNIT_STATE_CASTING
Definition: Unit.h:270
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
Definition: CreatureAI.cpp:56
bool UpdateVictim()
Definition: CreatureAI.cpp:245
void AttackStart(Unit *victim) override
== Triggered Actions Requested ==================
Definition: CreatureAI.cpp:328
Creature *const me
Definition: CreatureAI.h:61
void DoFleeToGetAssistance()
Definition: Creature.cpp:1002
CreatureAI * AI() const
Definition: Creature.h:214
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={}, Optional< float > speed={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default, Optional< float > closeEnoughDistance={})
static Creature * ToCreature(Object *o)
Definition: Object.h:219
uint32 GetEntry() const
Definition: Object.h:161
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
uint32 GetQuestId() const
Definition: QuestDef.h:587
uint32 const Id
Definition: SpellInfo.h:325
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
Definition: SpellScript.h:162
Unit * GetCaster() const
HookList< EffectHandler > OnEffectHit
Definition: SpellScript.h:839
Unit * GetHitUnit() const
HookList< EffectHandler > OnEffectHitTarget
Definition: SpellScript.h:840
TaskContext & Repeat(std::chrono::duration< Rep, Period > duration)
TaskScheduler & CancelAll()
TaskScheduler & Schedule(std::chrono::duration< Rep, Period > time, task_handler_t task)
TaskScheduler & Update(success_t const &callback=nullptr)
TaskScheduler & SetValidator(P &&predicate)
Sets a validator which is asked if tasks are allowed to be executed.
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.h:159
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.cpp:180
Unit * SelectTarget(SelectTargetMethod targetType, uint32 offset=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
Definition: UnitAI.cpp:79
SpellCastResult DoCast(uint32 spellId)
Definition: UnitAI.cpp:89
Definition: Unit.h:627
void SetStandState(UnitStandStateType state, uint32 animKitID=0)
Definition: Unit.cpp:10100
void SetFaction(uint32 faction) override
Definition: Unit.h:859
MotionMaster * GetMotionMaster()
Definition: Unit.h:1652
Unit * EnsureVictim() const
Definition: Unit.h:717
uint64 GetHealth() const
Definition: Unit.h:776
bool SetWalk(bool enable)
Definition: Unit.cpp:12707
Unit * GetVictim() const
Definition: Unit.h:715
bool HasUnitState(const uint32 f) const
Definition: Unit.h:732
void HandleEmoteCommand(Emote emoteId, Player *target=nullptr, Trinity::IteratorPair< int32 const * > spellVisualKitIds={}, int32 sequenceVariation=0)
Definition: Unit.cpp:1598
bool HealthBelowPctDamaged(int32 pct, uint32 damage) const
Definition: Unit.h:781
bool IsTotem() const
Definition: Unit.h:742
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition: Object.cpp:2896
TempSummon * SummonCreature(uint32 entry, Position const &pos, TempSummonType despawnType=TEMPSUMMON_MANUAL_DESPAWN, Milliseconds despawnTime=0s, uint32 vehId=0, uint32 spellId=0, ObjectGuid privateObjectOwner=ObjectGuid::Empty)
Definition: Object.cpp:2025
bool OnConditionCheck(Condition const *condition, ConditionSourceInfo &sourceInfo) override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
WorldObject const * mConditionTargets[MAX_CONDITION_TARGETS]
Definition: ConditionMgr.h:220
uint8 ConditionTarget
Definition: ConditionMgr.h:260
void Start(bool isActiveAttacker=true, ObjectGuid playerGUID=ObjectGuid::Empty, Quest const *quest=nullptr, bool instantRespawn=false, bool canLoopPath=false)
bool HasEscortState(uint32 escortState)
void LoadPath(uint32 pathId)
Player * GetPlayerForEscort()
void UpdateAI(uint32 diff) override
constexpr float GetPositionX() const
Definition: Position.h:76
constexpr float GetPositionY() const
Definition: Position.h:77
constexpr float GetPositionZ() const
Definition: Position.h:78
bool HealthBelowPct(uint32 pct) const
void JustSummoned(Creature *summoned) override
void OnQuestAccept(Player *player, Quest const *quest) override
void SpellHitTarget(WorldObject *, SpellInfo const *spellInfo) override
void WaypointReached(uint32 waypointId, uint32) override
void UpdateAI(uint32 diff) override
void SpellHitTarget(WorldObject *, SpellInfo const *spellInfo) override
void OnQuestAccept(Player *player, Quest const *quest) override
void WaypointReached(uint32 waypointId, uint32) override
void JustSummoned(Creature *summoned) override
void DamageTaken(Unit *, uint32 &damage, DamageEffectType, SpellInfo const *) override
void DamageTaken(Unit *, uint32 &damage, DamageEffectType, SpellInfo const *) override
void DamageTaken(Unit *, uint32 &damage, DamageEffectType, SpellInfo const *) override
void UpdateAI(uint32 diff) override
void WaypointReached(uint32 waypointId, uint32 pathId) override
void SpellHit(WorldObject *, SpellInfo const *spellInfo) override
void DamageTaken(Unit *, uint32 &damage, DamageEffectType, SpellInfo const *) override
KurenaiCaptive
@ QUEST_TOTEM_KARDASH_A
@ NPC_KUR_MURK_BRUTE
@ SAY_KUR_NO_ESCAPE
@ PATH_ESCORT_KURENAI_CAPTIVE
@ SPELL_KUR_HEALING_WAVE
@ SAY_KUR_MORE_TWO
@ SAY_KUR_LIGHTNING
@ SPELL_KUR_FROST_SHOCK
@ SPELL_KUR_EARTHBIND_TOTEM
@ SPELL_KUR_CHAIN_LIGHTNING
@ SAY_KUR_MORE
@ NPC_KUR_MURK_PUTRIFIER
@ SAY_KUR_COMPLETE
@ SAY_KUR_START
@ SAY_KUR_SHOCK
@ NPC_KUR_MURK_SCAVENGER
@ NPC_KUR_MURK_RAIDER
void AddSC_nagrand()
PlantBannerQuests
@ NPC_GISELDA_THE_CRONE
@ SPELL_PLANT_WARMAUL_OGRE_BANNER
@ SPELL_PLANT_KIL_SORROW_BANNER
@ NPC_WARMAUL_SHAMAN
@ NPC_KIL_SORROW_DEATHSWORN
@ NPC_KIL_SORROW_SPELLBINDER
@ NPC_KIL_SORROW_CULTIST
@ NPC_WARMAUL_REAVER
@ PATH_NAGRAND_BANNER
static float kurenaiAmbushA[]
FireBomb
@ SPELL_FIRE_BOMB_DAMAGE_MISSILE
@ SPELL_FIRE_BOMB_TARGET_SUMMON_EFFECT
@ SPELL_FIRE_BOMB_FLAMES
@ SPELL_FIRE_BOMB_SUMMON_CATAPULT_BLAZE
MagharCaptive
@ QUEST_TOTEM_KARDASH_H
@ SPELL_EARTHBIND_TOTEM
@ NPC_MURK_SCAVENGER
@ NPC_MURK_RAIDER
@ SAY_MAG_START
@ PATH_ESCORT_MAGHAR_CAPTIVE
@ SAY_MAG_SHOCK
@ SAY_MAG_MORE_REPLY
@ SAY_MAG_LIGHTNING
@ SAY_MAG_MORE
@ SPELL_FROST_SHOCK
@ SAY_MAG_COMPLETE
@ SPELL_HEALING_WAVE
@ NPC_MURK_PUTRIFIER
@ SPELL_CHAIN_LIGHTNING
@ NPC_MURK_BRUTE
@ SAY_MAG_NO_ESCAPE
static float m_afAmbushB[]
static float m_afAmbushA[]
static float kurenaiAmbushB[]