TrinityCore
Loading...
Searching...
No Matches
zone_bloodmyst_isle.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 "Group.h"
23#include "MotionMaster.h"
24#include "ObjectAccessor.h"
25#include "Player.h"
26#include "ScriptedEscortAI.h"
27#include "SpellScript.h"
28
29/*######
30## Quest 9759: Ending Their World
31######*/
32
34{
36
58
61
65
70
71 NPC_SIRONAS = 17678,
73 NPC_LEGOSO = 17982,
74
78
81
83
87
92
104
142
144
146
149
151{
152 {
153 { -1954.946f, -10654.714f, 110.448f },
154 { -1956.331f, -10654.494f, 110.869f },
155 { -1955.906f, -10656.221f, 110.791f },
156 { -1957.294f, -10656.000f, 111.219f },
157 { -1954.462f, -10656.451f, 110.404f }
158 },
159 {
160 { -1915.137f, -10583.651f, 178.365f },
161 { -1914.006f, -10582.964f, 178.471f },
162 { -1912.717f, -10582.398f, 178.658f },
163 { -1915.056f, -10582.251f, 178.162f },
164 { -1913.883f, -10581.778f, 178.346f }
165 }
166};
167
168/*######
169## npc_sironas
170######*/
171
173{
174public:
175 npc_sironas() : CreatureScript("npc_sironas") { }
176
177 struct npc_sironasAI : public ScriptedAI
178 {
179 npc_sironasAI(Creature* creature) : ScriptedAI(creature) { }
180
181 void Reset() override
182 {
183 _events.Reset();
185 }
186
193
194 void JustDied(Unit* killer) override
195 {
196 me->SetObjectScale(1.0f);
197 _events.Reset();
198
199 if (!killer)
200 return;
201
203 {
204 Group* group = me->GetLootRecipientGroup();
205
206 if (killer->GetGUID() == legoso->GetGUID() ||
207 (group && group->IsMember(killer->GetGUID())) ||
208 killer->GetGUID().GetCounter() == legoso->AI()->GetData(DATA_EVENT_STARTER_GUID))
209 legoso->AI()->DoAction(ACTION_LEGOSO_SIRONAS_KILLED);
210 }
211 }
212
213 void UpdateAI(uint32 diff) override
214 {
215 if (!UpdateVictim())
216 return;
217
218 _events.Update(diff);
219
220 while (uint32 eventId = _events.ExecuteEvent())
221 {
222 switch (eventId)
223 {
224 case EVENT_UPPERCUT:
227 break;
228 case EVENT_IMMOLATE:
231 break;
235 break;
236 default:
237 break;
238 }
239 }
240
242 }
243
244 void DoAction(int32 param) override
245 {
246 switch (param)
247 {
249 {
251 std::list<Creature*> BeamList;
252 _beamGuidList.clear();
254 for (std::list<Creature*>::iterator itr = BeamList.begin(); itr != BeamList.end(); ++itr)
255 {
256 _beamGuidList.push_back((*itr)->GetGUID());
257 (*itr)->CastSpell(*itr, SPELL_BLOODMYST_TESLA);
258 }
259 break;
260 }
262 {
264 std::list<Creature*> creatureList;
266 if (!creatureList.empty())
267 {
268 for (std::list<Creature*>::iterator itr = creatureList.begin(); itr != creatureList.end(); ++itr)
269 (*itr)->InterruptNonMeleeSpells(true, SPELL_BLOODMYST_TESLA);
270 }
271 break;
272 }
273 default:
274 break;
275 }
276 }
277
278 private:
281 };
282
283 CreatureAI* GetAI(Creature* creature) const override
284 {
285 return new npc_sironasAI(creature);
286 }
287};
288
289/*######
290## npc_demolitionist_legoso
291######*/
292
293static constexpr uint32 PATH_ESCORT_LEGOSO = 143858;
294
296{
297public:
298 npc_demolitionist_legoso() : CreatureScript("npc_demolitionist_legoso") { }
299
301 {
303 {
304 Initialize();
305 }
306
307 void OnQuestAccept(Player* player, Quest const* quest) override
308 {
309 if (quest->GetQuestId() == QUEST_ENDING_THEIR_WORLD)
310 {
313 Start(true, player->GetGUID(), quest);
314 }
315 }
316
317 uint32 GetData(uint32 id) const override
318 {
319 switch (id)
320 {
323 default:
324 return 0;
325 }
326 }
327
328 void SetData(uint32 data, uint32 value) override
329 {
330 switch (data)
331 {
333 _eventStarterGuidLow = value;
334 break;
335 default:
336 break;
337 }
338 }
339
341 {
343 _moveTimer = 0;
345 }
346
358
359 void UpdateAI(uint32 diff) override
360 {
361 _events.Update(diff);
362
363 if (UpdateVictim())
364 {
365 while (uint32 eventId = _events.ExecuteEvent())
366 {
367 switch (eventId)
368 {
373 break;
378 break;
383 break;
385 {
386 Unit* target = nullptr;
387 if (me->GetHealthPct() < 85)
388 target = me;
389 else if (Player* player = GetPlayerForEscort())
390 if (player->GetHealthPct() < 85)
391 target = player;
392 if (target)
393 {
396 }
397 else
399 break;
400 }
401 default:
402 break;
403 }
404 }
405
407 }
408
410 return;
411
412 EscortAI::UpdateAI(diff);
413
414 if (_phase)
415 {
416 if (_moveTimer <= diff)
417 {
418 switch (_phase)
419 {
420 case PHASE_WP_26: //debug skip path to point 26, buggy path calculation
421 me->GetMotionMaster()->MovePoint(WP_DEBUG_2, -2021.77f, -10648.8f, 129.903f, false);
424 break;
425 case PHASE_CONTINUE: // continue escort
426 SetEscortPaused(false);
429 break;
430 case PHASE_WP_22: //debug skip path to point 22, buggy path calculation
431 me->GetMotionMaster()->MovePoint(WP_EXPLOSIVES_FIRST_PLANT, -1958.026f, -10660.465f, 111.547f, false);
435 break;
436 case PHASE_PLANT_FIRST_KNEEL: // plant first explosives stage 1 kneel
440 break;
441 case PHASE_PLANT_FIRST_STAND: // plant first explosives stage 1 stand
445 break;
446 case PHASE_PLANT_FIRST_WORK: // plant first explosives stage 2 work
447 if (Player* player = GetPlayerForEscort())
448 Talk(SAY_LEGOSO_4, player);
451 break;
452 case PHASE_PLANT_FIRST_FINISH: // plant first explosives finish
453 _explosivesGuids.clear();
454 for (uint8 i = 0; i != MAX_EXPLOSIVES; ++i)
455 {
457 _explosivesGuids.push_back(explosive->GetGUID());
458 }
459 me->HandleEmoteCommand(EMOTE_ONESHOT_NONE); // reset anim state
460 // force runoff movement so he will not screw up next waypoint
461 me->GetMotionMaster()->MovePoint(WP_EXPLOSIVES_FIRST_RUNOFF, -1955.6f, -10669.8f, 110.65f, false);
465 break;
466 case PHASE_PLANT_FIRST_TIMER_1: // first explosives detonate timer 1
470 break;
471 case PHASE_PLANT_FIRST_TIMER_2: // first explosives detonate timer 2
475 break;
476 case PHASE_PLANT_FIRST_TIMER_3: // first explosives detonate timer 3
480 break;
481 case PHASE_PLANT_FIRST_DETONATE: // first explosives detonate finish
482 for (GuidList::iterator itr = _explosivesGuids.begin(); itr != _explosivesGuids.end(); ++itr)
483 {
484 if (GameObject* explosive = ObjectAccessor::GetGameObject(*me, *itr))
485 me->RemoveGameObject(explosive, true);
486 }
487 _explosivesGuids.clear();
491 break;
492 case PHASE_PLANT_FIRST_SPEECH: // after detonation 1 speech
496 break;
497 case PHASE_PLANT_FIRST_ROTATE: // after detonation 1 rotate to next point
498 me->SetFacingTo(2.272f);
501 break;
502 case PHASE_PLANT_FIRST_POINT: // after detonation 1 send point anim and go on to next point
506 break;
507 case PHASE_FEEL_SIRONAS_1: // legoso exclamation before sironas 1.1
511 break;
512 case PHASE_FEEL_SIRONAS_2: // legoso exclamation before sironas 1.2
513 if (Player* player = GetPlayerForEscort())
514 Talk(SAY_LEGOSO_11, player);
517 break;
518 case PHASE_MEET_SIRONAS_ROAR: // legoso exclamation before sironas 2.1
522 break;
523 case PHASE_MEET_SIRONAS_TURN: // legoso exclamation before sironas 2.2
524 if (Player* player = GetPlayerForEscort())
525 me->SetFacingToObject(player);
528 break;
529 case PHASE_MEET_SIRONAS_SPEECH: // legoso exclamation before sironas 2.3
533 break;
534 case PHASE_PLANT_SECOND_KNEEL: // plant second explosives stage 1 kneel
538 break;
539 case PHASE_PLANT_SECOND_SPEECH: // plant second explosives stage 2 kneel
543 break;
544 case PHASE_PLANT_SECOND_STAND: // plant second explosives finish
548 break;
549 case PHASE_PLANT_SECOND_FINISH: // plant second explosives finish - create explosives
550 _explosivesGuids.clear();
551 for (uint8 i = 0; i != MAX_EXPLOSIVES; ++i)
552 {
554 _explosivesGuids.push_back(explosive->GetGUID());
555 }
556 if (Player* player = GetPlayerForEscort())
557 Talk(SAY_LEGOSO_15, player);
560 break;
561 case PHASE_PLANT_SECOND_WAIT: // plant second explosives finish - proceed to next point
564 break;
565 case PHASE_PLANT_SECOND_TIMER_1: // second explosives detonate timer 1
569 break;
570 case PHASE_PLANT_SECOND_TIMER_2: // second explosives detonate timer 2
574 break;
575 case PHASE_PLANT_SECOND_TIMER_3: // second explosives detonate timer 3
579 break;
580 case PHASE_PLANT_SECOND_DETONATE: // second explosives detonate finish
581 for (GuidList::iterator itr = _explosivesGuids.begin(); itr != _explosivesGuids.end(); ++itr)
582 {
583 if (GameObject* explosive = ObjectAccessor::GetGameObject(*me, *itr))
584 me->RemoveGameObject(explosive, true);
585 }
586 _explosivesGuids.clear();
588 {
589 sironas->SetImmuneToAll(false);
590 me->SetFacingToObject(sironas);
591 }
594 break;
595 case PHASE_FIGHT_SIRONAS_STOP: // sironas channel stop
597 sironas->AI()->DoAction(ACTION_SIRONAS_CHANNEL_STOP);
600 break;
601 case PHASE_FIGHT_SIRONAS_SPEECH_1: // sironas exclamation before aggro
603 sironas->AI()->Talk(SAY_SIRONAS_1);
606 break;
607 case PHASE_FIGHT_SIRONAS_SPEECH_2: // legoso exclamation before aggro
609 sironas->SetObjectScale(3.0f);
613 break;
614 case PHASE_FIGHT_SIRONAS_START: // legoso exclamation at aggro
616 {
617 Unit* target = GetPlayerForEscort();
618 if (!target)
619 target = me;
620
621 AddThreat(sironas, 0.001f, target);
622 sironas->Attack(target, true);
623 sironas->GetMotionMaster()->MoveChase(target);
624 }
627 break;
628 case PHASE_SIRONAS_SLAIN_SPEECH_1: // legoso exclamation after battle - stage 1.1
632 break;
633 case PHASE_SIRONAS_SLAIN_EMOTE_1: // legoso exclamation after battle - stage 1.2
637 break;
638 case PHASE_SIRONAS_SLAIN_EMOTE_2: // legoso exclamation after battle - stage 1.3
639 if (Player* player = GetPlayerForEscort())
640 player->GroupEventHappens(QUEST_ENDING_THEIR_WORLD, me);
644 break;
645 case PHASE_SIRONAS_SLAIN_SPEECH_2: // legoso exclamation after battle - stage 2
649 break;
650 default:
651 break;
652 }
653 }
654 else if (!me->IsInCombat())
655 _moveTimer -= diff;
656 }
657 }
658
659 void WaypointReached(uint32 waypointId, uint32 /*pathId*/) override
660 {
661 Player* player = GetPlayerForEscort();
662 if (!player)
663 return;
664
665 switch (waypointId)
666 {
667 case WP_START:
668 SetEscortPaused(true);
669 me->SetFacingToObject(player);
670 Talk(SAY_LEGOSO_1, player);
673 break;
675 SetEscortPaused(true);
679 break;
681 me->SetFacingTo(1.46f);
682 break;
684 SetEscortPaused(true);
685 me->SetFacingTo(1.05f);
688 break;
689 case WP_DEBUG_1:
690 SetEscortPaused(true);
693 break;
694 case WP_SIRONAS_HILL:
695 {
696 SetEscortPaused(true);
697
698 //Find Sironas and make it respawn if needed
699 Creature* sironas = nullptr;
703
704 if (sironas)
705 {
706 if (!sironas->IsAlive())
707 sironas->Respawn(true);
708
710 me->SetFacingToObject(sironas);
711 }
714 break;
715 }
717 SetEscortPaused(true);
720 break;
722 SetEscortPaused(true);
725 break;
727 SetEscortPaused(true);
728 me->SetFacingTo(5.7f);
731 break;
732 default:
733 break;
734 }
735 }
736
737 void DoAction(int32 param) override
738 {
739 switch (param)
740 {
744 break;
745 default:
746 break;
747 }
748 }
749
750 private:
756 };
757
758 CreatureAI* GetAI(Creature* creature) const override
759 {
760 return new npc_demolitionist_legosoAI(creature);
761 }
762};
763
764/*######
765## Quest 9670: They're Alive! Maybe...
766######*/
767
782
788
789// 30950 - Free Webbed Creature
809
810// 31009 - Free Webbed Creature
812{
814
815 bool Validate(SpellInfo const* /*spellInfo*/) override
816 {
818 }
819
820 // This one is a bit different from the one used in Terokkar. There is additional spell 31011 which apply periodic aura to trigger
821 // summon spell 31010 after 1.5 sec. However in retail Expedition Researcher is summoned instantly, we'll use 31010 directly
822 void HandleDummy(SpellEffIndex /*effIndex*/)
823 {
824 Unit* caster = GetCaster();
825 Unit* target = GetHitUnit();
826
827 if (roll_chance_i(66))
829 else
830 target->CastSpell(caster, SPELL_FREE_WEBBED_11, true);
831 }
832
837};
838
@ IN_MILLISECONDS
Definition Common.h:35
uint8_t uint8
Definition Define.h:135
int8_t int8
Definition Define.h:131
int32_t int32
Definition Define.h:129
uint32_t uint32
Definition Define.h:133
#define SIZE_OF_GRIDS
Definition GridDefines.h:38
std::list< ObjectGuid > GuidList
Definition ObjectGuid.h:261
bool roll_chance_i(int chance)
Definition Random.h:59
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1128
void GetCreatureListWithEntryInGrid(Container &container, WorldObject *source, uint32 entry, float maxSearchRange)
@ STATE_ESCORT_NONE
SpellEffIndex
@ EFFECT_0
@ SPELL_EFFECT_DUMMY
@ EMOTE_ONESHOT_POINT
@ EMOTE_ONESHOT_EXCLAMATION
@ EMOTE_ONESHOT_CHEER
@ EMOTE_ONESHOT_NONE
#define SpellEffectFn(F, I, N)
@ UNIT_STAND_STATE_KNEEL
Definition UnitDefines.h:42
@ UNIT_STAND_STATE_STAND
Definition UnitDefines.h:34
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
Definition Util.h:554
bool UpdateVictim()
Creature *const me
Definition CreatureAI.h:82
void Respawn(bool force=false)
void SetDisplayId(uint32 modelId) override
void SetObjectScale(float scale) override
CreatureTemplate const * GetCreatureTemplate() const
Definition Creature.h:186
Group * GetLootRecipientGroup() const
void SetCanDualWield(bool value) override
CreatureAI * AI() const
Definition Creature.h:154
void Update(uint32 time)
Definition EventMap.h:67
void DelayEvents(Milliseconds delay)
Definition EventMap.cpp:95
EventId ExecuteEvent()
Definition EventMap.cpp:73
void ScheduleEvent(EventId eventId, Milliseconds time, GroupIndex group=0u, PhaseIndex phase=0u)
Definition EventMap.cpp:36
void Reset()
Definition EventMap.cpp:21
Definition Group.h:165
bool IsMember(ObjectGuid guid) const
Definition Group.cpp:2505
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={})
LowType GetCounter() const
Definition ObjectGuid.h:156
uint32 LowType
Definition ObjectGuid.h:142
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:78
uint32 GetQuestId() const
Definition QuestDef.h:229
Unit * GetCaster() const
HookList< EffectHandler > OnEffectHit
Unit * GetHitUnit() const
HookList< EffectHandler > OnEffectHitTarget
virtual void DoAction(int32)
Definition UnitAI.h:154
void DoMeleeAttackIfReady()
Definition UnitAI.cpp:54
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.cpp:166
SpellCastResult DoCast(uint32 spellId)
Definition UnitAI.cpp:106
Definition Unit.h:769
void RemoveGameObject(GameObject *gameObj, bool del)
Definition Unit.cpp:5111
float GetHealthPct() const
Definition Unit.h:921
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true)
Definition Unit.cpp:3093
MotionMaster * GetMotionMaster()
Definition Unit.h:1667
bool IsAlive() const
Definition Unit.h:1234
void SetFacingToObject(WorldObject const *object, bool force=true, uint32 movementId=EVENT_FACE)
Definition Unit.cpp:13259
void HandleEmoteCommand(Emote emoteId)
Definition Unit.cpp:1568
void SetFacingTo(float ori, bool force=true, uint32 movementId=EVENT_FACE)
Definition Unit.cpp:13250
void SetStandState(UnitStandStateType state)
Definition Unit.cpp:10363
bool IsInCombat() const
Definition Unit.h:1144
void GetCreatureListWithEntryInGrid(Container &creatureContainer, uint32 entry, float maxSearchRange=250.0f) const
Definition Object.cpp:3153
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2832
GameObject * SummonGameObject(uint32 entry, Position const &pos, QuaternionData const &rot, Seconds respawnTime, GOSummonType summonType=GO_SUMMON_TIMED_OR_CORPSE_DESPAWN)
Definition Object.cpp:2015
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
PrepareSpellScript(spell_free_webbed_on_quest)
bool Validate(SpellInfo const *) override
void HandleDummy(SpellEffIndex)
bool Validate(SpellInfo const *) override
PrepareSpellScript(spell_free_webbed)
TC_GAME_API GameObject * GetGameObject(WorldObject const &u, ObjectGuid const &guid)
auto SelectRandomContainerElement(C const &container) -> typename std::add_const< decltype(*std::begin(container))>::type &
Definition Containers.h:108
static void VisitAllObjects(WorldObject const *obj, T &visitor, float radius, bool dont_load=true)
Definition CellImpl.h:192
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 SetEscortPaused(bool on)
void UpdateAI(uint32 diff) override
void AddThreat(Unit *victim, float amount, Unit *who=nullptr)
void OnQuestAccept(Player *player, Quest const *quest) override
void SetData(uint32 data, uint32 value) override
void WaypointReached(uint32 waypointId, uint32) override
void UpdateAI(uint32 diff) override
void JustEngagedWith(Unit *) override
void JustDied(Unit *killer) override
void DoAction(int32 param) override
uint32 const CocoonSummonSpells[10]
Position const ExplosivesPos[2][MAX_EXPLOSIVES]
EndingTheirWorldMisc
@ PHASE_PLANT_FIRST_STAND
@ PHASE_PLANT_FIRST_WORK
@ SPELL_SIRONAS_CHANNELING
@ SAY_LEGOSO_12
@ PHASE_MEET_SIRONAS_TURN
@ EVENT_IMMOLATE
@ WP_SIRONAS_HILL
@ PHASE_PLANT_SECOND_SPEECH
@ WP_EXPLOSIVES_SECOND_DETONATE
@ WP_EXPLOSIVES_FIRST_DETONATE
@ PHASE_SIRONAS_SLAIN_EMOTE_1
@ SPELL_BLOODMYST_TESLA
@ PHASE_PLANT_SECOND_FINISH
@ ACTION_LEGOSO_SIRONAS_KILLED
@ SAY_LEGOSO_11
@ SAY_LEGOSO_20
@ PHASE_MEET_SIRONAS_ROAR
@ WP_EXPLOSIVES_FIRST_RUNOFF
@ SAY_LEGOSO_13
@ PHASE_PLANT_SECOND_TIMER_3
@ GO_DRAENEI_EXPLOSIVES_1
@ EVENT_FROST_SHOCK
@ EVENT_STRENGTH_OF_EARTH_TOTEM
@ SPELL_CURSE_OF_BLOOD
@ DATA_EVENT_STARTER_GUID
@ PHASE_PLANT_FIRST_FINISH
@ PHASE_PLANT_FIRST_SPEECH
@ SAY_LEGOSO_18
@ PHASE_FEEL_SIRONAS_1
@ SPELL_STRENGTH_OF_EARTH_TOTEM
@ EVENT_SEARING_TOTEM
@ SPELL_FROST_SHOCK
@ PHASE_SIRONAS_SLAIN_SPEECH_1
@ PHASE_PLANT_SECOND_STAND
@ SAY_LEGOSO_19
@ PHASE_PLANT_SECOND_KNEEL
@ PHASE_PLANT_FIRST_ROTATE
@ WP_EXPLOSIVES_SECOND_BATTLEROAR
@ QUEST_ENDING_THEIR_WORLD
@ ACTION_SIRONAS_CHANNEL_STOP
@ ACTION_SIRONAS_CHANNEL_START
@ PHASE_SIRONAS_SLAIN_EMOTE_2
@ EVENT_HEALING_SURGE
@ PHASE_PLANT_FIRST_KNEEL
@ PHASE_PLANT_SECOND_TIMER_2
@ PHASE_FIGHT_SIRONAS_SPEECH_2
@ PHASE_FIGHT_SIRONAS_SPEECH_1
@ SAY_LEGOSO_16
@ GO_FIRE_EXPLOSION
@ EVENT_CURSE_OF_BLOOD
@ PHASE_PLANT_FIRST_TIMER_3
@ SPELL_IMMOLATE
@ PHASE_PLANT_FIRST_DETONATE
@ EVENT_UPPERCUT
@ GO_DRAENEI_EXPLOSIVES_2
@ SAY_LEGOSO_15
@ SAY_LEGOSO_21
@ PHASE_PLANT_FIRST_TIMER_1
@ WP_EXPLOSIVES_SECOND_PLANT
@ PHASE_FIGHT_SIRONAS_START
@ PHASE_PLANT_FIRST_TIMER_2
@ PHASE_PLANT_SECOND_DETONATE
@ PHASE_PLANT_FIRST_POINT
@ SPELL_SEARING_TOTEM
@ WP_EXPLOSIVES_FIRST_PLANT
@ PHASE_PLANT_SECOND_WAIT
@ PHASE_FEEL_SIRONAS_2
@ NPC_BLOODMYST_TESLA_COIL
@ PHASE_PLANT_SECOND_TIMER_1
@ SPELL_UPPERCUT
@ WP_EXPLOSIVES_FIRST_POINT
@ SAY_LEGOSO_10
@ PHASE_FIGHT_SIRONAS_STOP
@ SPELL_HEALING_SURGE
@ PHASE_SIRONAS_SLAIN_SPEECH_2
@ SAY_SIRONAS_1
@ PHASE_MEET_SIRONAS_SPEECH
@ SAY_LEGOSO_17
@ SAY_LEGOSO_14
void AddSC_bloodmyst_isle()
static constexpr uint32 PATH_ESCORT_LEGOSO
@ SPELL_FREE_WEBBED_4
@ SPELL_FREE_WEBBED_7
@ SPELL_FREE_WEBBED_10
@ SPELL_FREE_WEBBED_6
@ SPELL_FREE_WEBBED_8
@ SPELL_FREE_WEBBED_1
@ SPELL_FREE_WEBBED_9
@ SPELL_FREE_WEBBED_3
@ SPELL_FREE_WEBBED_5
@ SPELL_FREE_WEBBED_11
@ SPELL_FREE_WEBBED_2