TrinityCore
Loading...
Searching...
No Matches
zone_hellfire_peninsula.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 "CellImpl.h"
20#include "Containers.h"
21#include "GridNotifiersImpl.h"
22#include "Log.h"
23#include "MotionMaster.h"
24#include "ObjectAccessor.h"
25#include "Player.h"
26#include "ScriptedEscortAI.h"
27#include "ScriptedGossip.h"
28#include "SpellScript.h"
29#include "TemporarySummon.h"
30#include "WorldSession.h"
31
42
60
62{
63 { -707.123f, 2751.686f, 101.592f, 4.577416f }, //Barada Waypoint-1 0
64 { -710.731f, 2749.075f, 101.592f, 1.513286f }, //Barada Cast position 1
65 { -710.332f, 2754.394f, 102.948f, 3.207566f }, //Jules 2
66 { -714.261f, 2747.754f, 103.391f, 0.0f }, //Jules Waypoint-1 3
67 { -713.113f, 2750.194f, 103.391f, 0.0f }, //Jules Waypoint-2 4
68 { -710.385f, 2750.896f, 103.391f, 0.0f }, //Jules Waypoint-3 5
69 { -708.309f, 2750.062f, 103.391f, 0.0f }, //Jules Waypoint-4 6
70 { -707.401f, 2747.696f, 103.391f, 0.0f }, //Jules Waypoint-5 7
71 { -708.591f, 2745.266f, 103.391f, 0.0f }, //Jules Waypoint-6 8
72 { -710.597f, 2744.035f, 103.391f, 0.0f }, //Jules Waypoint-7 9
73 { -713.089f, 2745.302f, 103.391f, 0.0f }, //Jules Waypoint-8 10
74};
75
91
93{
96
97 //Colonel Jules
99};
100
101/*######
102## npc_colonel_jules
103######*/
104
106{
107public:
108 npc_colonel_jules() : CreatureScript("npc_colonel_jules") { }
109
111 {
113 {
114 Initialize();
115 }
116
118 {
119 point = 3;
120 wpreached = false;
121 success = false;
122 }
123
124 void Reset() override
125 {
126 events.Reset();
127
129 Initialize();
130 }
131
133
134 void DoAction(int32 action) override
135 {
136 switch (action)
137 {
141
142 me->SetCanFly(true);
143 me->SetSpeedRate(MOVE_RUN, 0.2f);
144
145 me->SetFacingTo(3.207566f);
146 me->GetMotionMaster()->MoveJump(exorcismPos[2], 2.0f, 2.0f);
147
148 success = false;
149
151 break;
154
157
158 wpreached = true;
160 break;
162 wpreached = false;
163 me->SetSpeedRate(MOVE_RUN, 1.0f);
165
167 break;
168 }
169 }
170
171 void JustSummoned(Creature* summon) override
172 {
173 summons.Summon(summon);
174 summon->GetMotionMaster()->MoveRandom(10.0f);
175 }
176
177 void MovementInform(uint32 type, uint32 id) override
178 {
179 if (type != POINT_MOTION_TYPE)
180 return;
181
182 if (id < 10)
183 wpreached = true;
184
185 if (id == 8)
186 {
187 for (uint8 i = 0; i < 2; i++)
189 }
190
191 if (id == 10)
192 {
193 wpreached = true;
194 point = 3;
195 }
196 }
197
198 void UpdateAI(uint32 diff) override
199 {
200 if (wpreached)
201 {
203 point++;
204 wpreached = false;
205 }
206
207 events.Update(diff);
208
209 while (uint32 eventId = events.ExecuteEvent())
210 {
211 switch (eventId)
212 {
214 uint8 summonCount = urand(1, 3);
215
216 for (uint8 i = 0; i < summonCount; i++)
218
220 break;
221 }
222 }
223 }
224
225 bool OnGossipHello(Player* player) override
226 {
227 if (success)
229
230 SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
231 return true;
232 }
233
234 private:
237
239
241 };
242
243 CreatureAI* GetAI(Creature* creature) const override
244 {
245 return new npc_colonel_julesAI(creature);
246 }
247};
248
249/*######
250## npc_barada
251######*/
252
254{
255public:
256 npc_barada() : CreatureScript("npc_barada") { }
257
258 struct npc_baradaAI : public ScriptedAI
259 {
260 npc_baradaAI(Creature* creature) : ScriptedAI(creature)
261 {
262 Initialize();
263 }
264
266 {
267 step = 0;
268 }
269
270 void Reset() override
271 {
272 events.Reset();
273 Initialize();
274
278 }
279
280 bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
281 {
282 ClearGossipMenuFor(player);
283 switch (gossipListId)
284 {
285 case 1:
287 me->AI()->Talk(SAY_BARADA_1);
290 break;
291 default:
292 break;
293 }
294 return false;
295 }
296
297 void DoAction(int32 action) override
298 {
299 if (action == ACTION_START_EVENT)
300 {
301 if (Creature* jules = me->FindNearestCreature(NPC_COLONEL_JULES, 20.0f, true))
302 {
303 julesGUID = jules->GetGUID();
304 jules->AI()->Talk(SAY_JULES_1);
305 }
306
309
311 }
312 }
313
314 void MovementInform(uint32 type, uint32 id) override
315 {
316 if (type != POINT_MOTION_TYPE)
317 return;
318
319 if (id == 0)
321
322 if (id == 1)
324 }
325
326 void JustDied(Unit* /*killer*/) override
327 {
329 {
330 jules->AI()->DoAction(ACTION_JULES_MOVE_HOME);
331 jules->RemoveAllAuras();
332 }
333 }
334
335 void UpdateAI(uint32 diff) override
336 {
337 events.Update(diff);
338
339 while (uint32 eventId = events.ExecuteEvent())
340 {
341 switch (eventId)
342 {
344 switch (step)
345 {
346 case 0:
347 me->SetFacingTo(1.513286f);
348
351 step++;
352 break;
353 case 1:
356 step++;
357 break;
358 case 2:
361 step++;
362 break;
363 case 3:
365 jules->AI()->Talk(SAY_JULES_2);
366
368 step++;
369 break;
370 case 4:
373
375 jules->AI()->DoAction(ACTION_JULES_HOVER);
376
378 step++;
379 break;
380 case 5:
382 jules->AI()->Talk(SAY_JULES_3);
383
385 step++;
386 break;
387 case 6:
390 step++;
391 break;
392 case 7:
394 jules->AI()->Talk(SAY_JULES_3);
395
397 step++;
398 break;
399 case 8:
402 step++;
403 break;
404 case 9:
406 jules->AI()->Talk(SAY_JULES_4);
407
409 step++;
410 break;
411 case 10:
414 step++;
415 break;
416 case 11:
418 jules->AI()->DoAction(ACTION_JULES_FLIGHT);
419
421 step++;
422 break;
423 case 12:
425 jules->AI()->Talk(SAY_JULES_4);
426
428 step++;
429 break;
430 case 13:
433 step++;
434 break;
435 case 14:
437 jules->AI()->Talk(SAY_JULES_4);
438
440 step++;
441 break;
442 case 15:
445 step++;
446 break;
447 case 16:
449 jules->AI()->Talk(SAY_JULES_5);
450
452 step++;
453 break;
454 case 17:
457 step++;
458 break;
459 case 18:
461 jules->AI()->Talk(SAY_JULES_3);
462
464 step++;
465 break;
466 case 19:
469 step++;
470 break;
471 case 20:
473 {
474 jules->AI()->DoAction(ACTION_JULES_MOVE_HOME);
475 jules->RemoveAura(SPELL_JULES_VOMITS_AURA);
476 }
477
479 step++;
480 break;
481 case 21:
482 //End
484 {
485 ENSURE_AI(npc_colonel_jules::npc_colonel_julesAI, jules->AI())->success = true;
486 jules->RemoveAllAuras();
487 }
488
491
496 break;
497 }
498 break;
499 case EVENT_RESET:
501 ENSURE_AI(npc_colonel_jules::npc_colonel_julesAI, jules->AI())->success = false;
502 break;
503 }
504 }
505 }
506
507 private:
512 };
513
514 CreatureAI* GetAI(Creature* creature) const override
515 {
516 return new npc_baradaAI(creature);
517 }
518};
519
532
534{
535public:
536 npc_magister_aledis() : CreatureScript("npc_magister_aledis") { }
537
539 {
540 npc_magister_aledisAI(Creature* creature) : ScriptedAI(creature) { }
541
542 void StartFight(Player* player)
543 {
544 me->Dismount();
545 me->SetFacingToObject(player);
547 _playerGUID = player->GetGUID();
549 }
550
551 void Reset() override
552 {
556 me->SetImmuneToPC(true);
557 }
558
559 void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
560 {
561 if (damage > me->GetHealth() || me->HealthBelowPctDamaged(20, damage))
562 {
563 damage = 0;
564
565 _events.Reset();
568 me->CombatStop(true);
571 me->SetImmuneToPC(true);
573
575 }
576 }
577
578 void UpdateAI(uint32 diff) override
579 {
580 _events.Update(diff);
581
582 while (uint32 eventId = _events.ExecuteEvent())
583 {
584 switch (eventId)
585 {
586 case EVENT_TALK:
589 break;
590 case EVENT_ATTACK:
591 me->SetImmuneToPC(false);
596 break;
597 case EVENT_FIREBALL:
600 break;
601 case EVENT_FROSTNOVA:
604 break;
605 case EVENT_EVADE:
607 break;
608 }
609 }
610
611 if (!UpdateVictim())
612 return;
613
615 }
616
617 bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override
618 {
619 CloseGossipMenuFor(player);
620 me->StopMoving();
621 StartFight(player);
622 return true;
623 }
624
625 private:
628 };
629
630 CreatureAI* GetAI(Creature* creature) const override
631 {
632 return new npc_magister_aledisAI(creature);
633 }
634};
635
651
653{
655
656 void OnGameEvent(bool start, uint16 eventId) override
657 {
658 if (eventId == GAME_EVENT_HELLFIRE && start)
659 {
660 _events.Reset();
662 }
663 }
664
665 void UpdateAI(uint32 diff) override
666 {
667 _events.Update(diff);
668
669 while (uint32 eventId = _events.ExecuteEvent())
670 {
671 switch (eventId)
672 {
673 case EVENT_START:
674 {
677
678 std::list<Creature*> dummies;
680 {
683 Cell::VisitAllObjects(me, searcher, 500.0f);
684 }
685
686 for (Creature* dummy : dummies)
687 if (dummy->GetCreatureData()->movementType == 0)
688 dummy->AI()->SetData(EVENT_START, 0);
689 break;
690 }
691 }
692 }
693
694 if (!UpdateVictim())
695 return;
696
698 }
699
700private:
702};
703
705{
707
708 void SetData(uint32 type, uint32 /*data*/) override
709 {
710 if (type != EVENT_START)
711 return;
712
716 }
717
719 {
720 _targets.clear();
721
722 std::vector<Creature*> others;
725 Cell::VisitAllObjects(me, searcher, 500.0f);
726 for (Creature* other : others)
727 if (other->GetCreatureData()->movementType == 2)
728 _targets.push_back(other->GetGUID());
729 }
730
731 void UpdateAI(uint32 diff) override
732 {
733 _events.Update(diff);
734
735 while (uint32 eventId = _events.ExecuteEvent())
736 {
737 switch (eventId)
738 {
739 case EVENT_CAST:
740 {
742 {
745 me->CastSpell(target, SPELL_INFERNAL_RAIN, args);
746 }
747
748 _events.Repeat(1s, 2s);
749 break;
750 }
751 case EVENT_END:
752 _events.Reset();
753 break;
754 }
755 }
756 }
757
758 private:
760 std::vector<ObjectGuid> _targets;
761};
762
764{
765 npc_fear_controller(Creature* creature) : ScriptedAI(creature) { }
766
767 void SetData(uint32 type, uint32 /*data*/) override
768 {
769 if (type != EVENT_START)
770 return;
771
774 }
775
776 void UpdateAI(uint32 diff) override
777 {
778 _events.Update(diff);
779
780 while (uint32 eventId = _events.ExecuteEvent())
781 {
782 switch (eventId)
783 {
784 case EVENT_CAST:
786 _events.Repeat(10s);
787 break;
788 case EVENT_END:
789 _events.Reset();
790 break;
791 }
792 }
793 }
794
795 private:
797};
798
799/*######
800## Quest 10909: Fel Spirits
801######*/
802
808
809// 39190 - Send Vengeance
811{
813
814 bool Validate(SpellInfo const* /*spellInfo*/) override
815 {
817 }
818
819 void HandleScript(SpellEffIndex /*effIndex*/)
820 {
821 if (TempSummon* target = GetHitUnit()->ToTempSummon())
822 if (Unit* summoner = target->GetSummonerUnit())
823 target->CastSpell(summoner, SPELL_SEND_VENGEANCE_TO_PLAYER, true);
824 }
825
830};
831
832// 39202 - Send Vengeance to Player
852
858
859// 25650 - Translocate
860// 25652 - Translocate
885
886/*######
887## Quest 9361: Helboar, the Other White Meat
888######*/
889
895
896// 29200 - Purify Helboar Meat
916
917/*######
918## Quest 10813: The Eyes of Grillok
919######*/
920
925
926// 38554 - Absorb Eye of Grillok
928{
930
931 bool Validate(SpellInfo const* /*spellInfo*/) override
932 {
934 }
935
936 void PeriodicTick(AuraEffect const* aurEff)
937 {
939
940 if (Unit* caster = GetCaster())
941 GetTarget()->CastSpell(caster, SPELL_EYE_OF_GRILLOK, aurEff);
942
943 if (Creature* target = GetTarget()->ToCreature())
944 {
946 target->SetVisible(false);
947 target->DespawnOrUnsummon(5s);
948 }
949 }
950
955};
956
957/*######
958## Quest 10838: The Demoniac Scryer
959######*/
960
965
966// 38708 - Demonaic Visitation
986
uint8_t uint8
Definition Define.h:135
int32_t int32
Definition Define.h:129
uint16_t uint16
Definition Define.h:134
uint32_t uint32
Definition Define.h:133
@ POINT_MOTION_TYPE
@ TEMPSUMMON_MANUAL_DESPAWN
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 RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1128
#define RegisterSpellScriptWithArgs(spell_script, script_name,...)
Definition ScriptMgr.h:1127
void SendGossipMenuFor(Player *player, uint32 npcTextID, ObjectGuid const &guid)
void ClearGossipMenuFor(Player *player)
void CloseGossipMenuFor(Player *player)
SpellEffIndex
@ EFFECT_1
@ EFFECT_0
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_SCRIPT_EFFECT
@ EMOTE_ONESHOT_KNEEL
@ EMOTE_STAND_STATE_NONE
@ EMOTE_ONESHOT_SHOUT
@ FACTION_MONSTER_2
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
@ SPELL_AURA_DUMMY
@ SPELL_AURA_PERIODIC_TRIGGER_SPELL
@ SPELLVALUE_MAX_TARGETS
#define SpellEffectFn(F, I, N)
#define AuraEffectPeriodicFn(F, I, N)
#define AuraEffectRemoveFn(F, I, N, M)
#define ENSURE_AI(a, b)
Definition UnitAI.h:28
@ UNIT_NPC_FLAG_GOSSIP
@ UNIT_NPC_FLAG_QUESTGIVER
@ MOVE_RUN
@ UNIT_FLAG_PACIFIED
DamageEffectType
Definition Unit.h:352
void PreventDefaultAction()
HookList< EffectApplyHandler > AfterEffectRemove
HookList< EffectPeriodicHandler > OnEffectPeriodic
Unit * GetCaster() const
Unit * GetTarget() const
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
bool UpdateVictim()
Creature *const me
Definition CreatureAI.h:82
Creature * DoSummon(uint32 entry, Position const &pos, Milliseconds despawnTime=30s, TempSummonType summonType=TEMPSUMMON_CORPSE_TIMED_DESPAWN)
void EngagementOver()
virtual void EnterEvadeMode(EvadeReason why=EVADE_REASON_OTHER)
void SetImmuneToPC(bool apply) override
Definition Creature.h:129
CreatureAI * AI() const
Definition Creature.h:154
void Update(uint32 time)
Definition EventMap.h:67
void Repeat(Milliseconds time)
Definition EventMap.cpp:63
EventId ExecuteEvent()
Definition EventMap.cpp:73
void CancelEvent(EventId eventId)
Definition EventMap.cpp:151
void ScheduleEvent(EventId eventId, Milliseconds time, GroupIndex group=0u, PhaseIndex phase=0u)
Definition EventMap.cpp:36
void Reset()
Definition EventMap.cpp:21
void MoveJump(Position const &pos, float speedXY, float speedZ, uint32 id=EVENT_JUMP, bool hasOrientation=false)
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={})
void MoveTargetedHome()
void MoveRandom(float wanderDistance=0.0f)
static ObjectGuid const Empty
Definition ObjectGuid.h:140
void Clear()
Definition ObjectGuid.h:150
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:78
void SendCloseGossip()
void KilledMonsterCredit(uint32 entry, ObjectGuid guid=ObjectGuid::Empty)
Definition Player.cpp:16140
uint32 GetGossipTextId(uint32 menuId, WorldObject *source)
Definition Player.cpp:14233
PlayerMenu * PlayerTalkClass
Definition Player.h:1969
Unit * GetCaster() const
HookList< EffectHandler > OnEffectHit
Unit * GetHitUnit() const
HookList< EffectHandler > OnEffectHitTarget
void Summon(Creature const *summon)
virtual void DoAction(int32)
Definition UnitAI.h:154
void DoMeleeAttackIfReady()
Definition UnitAI.cpp:54
SpellCastResult DoCastAOE(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:243
SpellCastResult DoCast(uint32 spellId)
Definition UnitAI.cpp:106
Definition Unit.h:769
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3638
void RestoreFaction()
Definition Unit.cpp:11776
void SetFaction(uint32 faction) override
Definition Unit.h:974
void StopMoving(bool force=false)
Definition Unit.cpp:10312
MotionMaster * GetMotionMaster()
Definition Unit.h:1667
void Dismount()
Definition Unit.cpp:8234
Aura * AddAura(uint32 spellId, Unit *target)
Definition Unit.cpp:11964
void RemoveNpcFlag(NPCFlags flags)
Definition Unit.h:1098
void SetFacingToObject(WorldObject const *object, bool force=true, uint32 movementId=EVENT_FACE)
Definition Unit.cpp:13259
bool SetCanFly(bool enable, bool packetOnly=false)
Definition Unit.cpp:13374
uint32 GetHealth() const
Definition Unit.h:913
void SetNpcFlag(NPCFlags flags)
Definition Unit.h:1097
void EngageWithTarget(Unit *who)
Definition Unit.cpp:8292
void SetSpeedRate(UnitMoveType mtype, float rate)
Definition Unit.cpp:8678
void HandleEmoteCommand(Emote emoteId)
Definition Unit.cpp:1568
void SetFacingTo(float ori, bool force=true, uint32 movementId=EVENT_FACE)
Definition Unit.cpp:13250
void RemoveAllAuras()
Definition Unit.cpp:4157
bool HealthBelowPctDamaged(int32 pct, uint32 damage) const
Definition Unit.h:918
void CombatStop(bool includingCast=false, bool mutualPvP=true)
Definition Unit.cpp:5691
void SetUnitFlag(UnitFlags flags)
Definition Unit.h:954
void RemoveUnitFlag(UnitFlags flags)
Definition Unit.h:955
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2832
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:1992
Creature * FindNearestCreature(uint32 entry, float range, bool alive=true) const
Definition Object.cpp:2099
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
PrepareAuraScript(spell_hellfire_peninsula_absorb_eye_of_grillok)
void AfterRemove(AuraEffect const *, AuraEffectHandleModes)
PrepareAuraScript(spell_hellfire_peninsula_demonaic_visitation)
PrepareSpellScript(spell_hellfire_peninsula_purify_helboar_meat)
PrepareSpellScript(spell_hellfire_peninsula_send_vengeance_to_player)
PrepareSpellScript(spell_hellfire_peninsula_send_vengeance)
PrepareSpellScript(spell_hellfire_peninsula_translocation_falcon_watch)
spell_hellfire_peninsula_translocation_falcon_watch(Translocation triggeredSpellId)
TC_GAME_API Player * GetPlayer(Map const *, ObjectGuid const &guid)
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
auto SelectRandomContainerElement(C const &container) -> typename std::add_const< decltype(*std::begin(container))>::type &
Definition Containers.h:108
CastSpellExtraArgs & AddSpellMod(SpellValueMod mod, int32 val)
static void VisitAllObjects(WorldObject const *obj, T &visitor, float radius, bool dont_load=true)
Definition CellImpl.h:192
float GetPositionZ() const
Definition Position.h:81
float GetPositionX() const
Definition Position.h:79
float GetPositionY() const
Definition Position.h:80
bool OnGossipSelect(Player *player, uint32, uint32 gossipListId) override
void MovementInform(uint32 type, uint32 id) override
void DoAction(int32 action) override
void UpdateAI(uint32 diff) override
void MovementInform(uint32 type, uint32 id) override
void SetData(uint32 type, uint32) override
void UpdateAI(uint32 diff) override
npc_fear_controller(Creature *creature)
npc_infernal_rain_hellfire(Creature *creature)
std::vector< ObjectGuid > _targets
void SetData(uint32 type, uint32) override
void UpdateAI(uint32 diff) override
void DamageTaken(Unit *, uint32 &damage, DamageEffectType, SpellInfo const *) override
bool OnGossipSelect(Player *player, uint32, uint32) override
void OnGameEvent(bool start, uint16 eventId) override
void UpdateAI(uint32 diff) override
npc_watch_commander_leonus(Creature *creature)
@ SPELL_SUMMON_DEMONAIC_VISITATION
@ ACTION_JULES_MOVE_HOME
@ QUEST_THE_EXORCISM_OF_COLONEL_JULES
@ NPC_DARKNESS_RELEASED
@ BARADAS_GOSSIP_MESSAGE
@ SPELL_TRANSLOCATION_FALCON_WATCH_TOWER_DOWN
@ SPELL_TRANSLOCATION_FALCON_WATCH_TOWER_UP
@ SPELL_JULES_THREATENS_AURA
@ SPELL_JULES_GOES_PRONE
@ SPELL_JULES_VOMITS_AURA
@ SPELL_BARADAS_COMMAND
@ SPELL_JULES_GOES_UPRIGHT
@ SPELL_SEND_VENGEANCE_TO_PLAYER
@ SPELL_SUMMON_FEL_SPIRIT
Position const exorcismPos[11]
@ SPELL_SUMMON_TOXIC_HELBOAR_MEAT
@ SPELL_SUMMON_PURIFIED_HELBOAR_MEAT
void AddSC_hellfire_peninsula()