TrinityCore
boss_skadi.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 "GridNotifiers.h"
20#include "InstanceScript.h"
21#include "MotionMaster.h"
22#include "MoveSplineInit.h"
23#include "Player.h"
24#include "ScriptedCreature.h"
25#include "SpellAuras.h"
26#include "SpellInfo.h"
27#include "SpellScript.h"
28#include "TemporarySummon.h"
29#include "utgarde_pinnacle.h"
30#include "Vehicle.h"
31
33{
34 // Skadi Spells
35 SPELL_CRUSH = 50234,
56 // Trash
58 SPELL_STRIKE = 48640,
60 SPELL_SHRINK = 49089,
61 SPELL_NET = 49092,
62 SPELL_THROW = 49091,
64};
65
67{
75};
76
78{
84 POINT_RIGHT = 2
85};
86
88{
94};
95
97{
102};
103
105{
109
111{
112
117};
118
119float const BreachPoint = 2.670354f;
120float const BreathPointRight = 3.124139f;
121float const BreathPointLeft = 3.228859f;
122Position const SecondaryWavesInitialPoint = { 478.7434f, -505.5758f, 104.7237f };
123Position const SecondaryWavesFinalPoint = { 318.177f, -503.8898f, 104.5326f };
124Position const SpawnLoc = { 477.5808f, -484.5591f, 104.8221f, 4.677482f };
125Position const GraufLoc = { 341.7411f, -516.9545f, 104.6695f, 3.124139f };
127{
128 { 458.5323f, -516.2537f, 104.617f },
129 { 429.4242f, -517.5624f, 104.8936f },
130 { 394.4955f, -514.6144f, 104.7235f },
131 { 362.2862f, -515.8771f, 104.7539f },
132 { 333.5374f, -514.7942f, 104.4779f },
133 { 457.6105f, -508.8362f, 104.4013f },
134 { 427.4026f, -510.7716f, 104.8802f },
135 { 392.5114f, -507.9429f, 104.7433f },
136 { 362.9511f, -508.4115f, 104.7218f },
137 { 333.536f, -506.0805f, 104.4258f },
138 { 478.31f, -511.049f, 104.7242f, 3.263766f },
139 { 482.25f, -514.1273f, 104.7234f, 3.263766f },
140 { 481.3883f, -507.1089f, 104.7241f, 3.263766f },
141};
142
143struct boss_skadi : public BossAI
144{
146 {
147 Initialize();
148 }
149
151 {
152 firstWaveSummoned = false;
153 _harpoonHit = 0;
154 _loveSkadi = 0;
157 {
159 });
160 }
161
162 void Reset() override
163 {
164 _Reset();
165 Initialize();
169 }
170
171 void EnterEvadeMode(EvadeReason /*why*/) override
172 {
175 }
176
177 void JustSummoned(Creature* summon) override
178 {
179 switch (summon->GetEntry())
180 {
186 break;
187 default:
188 break;
189 }
190 summons.Summon(summon);
191 }
192
194 {
195 for (uint8 i = 0; i < FIRST_WAVE_MAX_WARRIORS; i++)
197 summon->GetMotionMaster()->MovePoint(POINT_0, FirstWaveLocations[i]);
198
200 crea->GetMotionMaster()->MovePoint(POINT_0, FirstWaveLocations[10]);
202 crea->GetMotionMaster()->MovePoint(POINT_0, FirstWaveLocations[11]);
204 crea->GetMotionMaster()->MovePoint(POINT_0, FirstWaveLocations[12]);
205
206 firstWaveSummoned = true;
207 }
208
209 void JustDied(Unit* /*killer*/) override
210 {
211 _JustDied();
213 }
214
215 void KilledUnit(Unit* who) override
216 {
217 if (who->GetTypeId() == TYPEID_PLAYER)
218 Talk(SAY_KILL);
219 }
220
221 void DoAction(int32 action) override
222 {
223 switch (action)
224 {
227 me->SetUninteractible(true);
228 me->setActive(true);
233
235 .Schedule(Seconds(6), [this](TaskContext resetCheck)
236 {
237 if (Creature* resetTrigger = me->FindNearestCreature(NPC_TRIGGER_RESET, 200.0f))
238 resetTrigger->CastSpell(resetTrigger, SPELL_UTGARDE_PINNACLE_GUANTLET_RESET_CHECK, true);
239 resetCheck.Repeat();
240 })
241 .Schedule(Seconds(2), [this](TaskContext /*context*/)
242 {
244 DoCast(grauf, SPELL_RIDE_GRAUF);
245 });
246
247 if (Creature* summonTrigger = me->SummonCreature(NPC_WORLD_TRIGGER, SpawnLoc))
248 summonTrigger->CastSpell(summonTrigger, SPELL_SUMMON_GAUNLET_MOBS_PERIODIC, true);
249
250 if (Creature* combatTrigger = me->SummonCreature(NPC_COMBAT_TRIGGER, SpawnLoc))
251 combatTrigger->AI()->DoZoneInCombat();
252 break;
254 if (_loveSkadi == 1)
255 _loveSkadi++;
257 break;
262 me->SetUninteractible(false);
263 me->SetImmuneToPC(false);
266
268 .Schedule(Seconds(8), [this](TaskContext crush)
269 {
271 crush.Repeat();
272 })
273 .Schedule(Seconds(11), [this](TaskContext poisonedSpear)
274 {
277 poisonedSpear.Repeat();
278 })
279 .Schedule(Seconds(23), [this](TaskContext whirlwind)
280 {
282 whirlwind.Repeat();
283 });
284 break;
286 _harpoonHit++;
287 if (_harpoonHit == 1)
288 _loveSkadi = 1;
289 break;
290 }
291 }
292
293 uint32 GetData(uint32 id) const override
294 {
295 if (id == DATA_LOVE_TO_SKADI)
296 return _loveSkadi;
297
298 return 0;
299 }
300
301 void UpdateAI(uint32 diff) override
302 {
303 scheduler.Update(diff);
304
305 if (_phase == PHASE_GROUND)
306 {
307 if (!UpdateVictim())
308 return;
309 }
310 }
311
312private:
317};
318
319struct npc_grauf : public ScriptedAI
320{
321 npc_grauf(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
322
323 void Reset() override
324 {
326 me->SetRegenerateHealth(false);
327 me->SetSpeedRate(MOVE_RUN, 2.5f);
328 }
329
330 void JustDied(Unit* /*killer*/) override
331 {
333 skadi->ExitVehicle();
334
336 }
337
338 void PassengerBoarded(Unit* who, int8 /*seatId*/, bool apply) override
339 {
340 if (!apply)
341 {
343 skadi->AI()->DoAction(ACTION_GAUNTLET_END);
344 return;
345 }
346
347 std::function<void(Movement::MoveSplineInit&)> initializer = [](Movement::MoveSplineInit& init)
348 {
349 init.DisableTransportPathTransformations();
350 init.MoveTo(0.3320355f, 0.05355075f, 5.196949f, false);
351 };
353
354 me->setActive(true);
355 me->SetFarVisible(true);
356 me->SetCanFly(true);
357 me->SetDisableGravity(true);
358
359 _scheduler.Schedule(Seconds(2), [this](TaskContext /*context*/)
360 {
362 });
363 }
364
365 void MovementInform(uint32 type, uint32 pointId) override
366 {
367 if (type != SPLINE_CHAIN_MOTION_TYPE)
368 return;
369
370 switch (pointId)
371 {
372 case POINT_BREACH:
374 .Schedule(Milliseconds(1), [this](TaskContext /*context*/)
375 {
378 })
379 .Schedule(Seconds(10), [this](TaskContext /*context*/)
380 {
383 else
385 });
386 break;
387 case POINT_LEFT:
389 .Schedule(Milliseconds(1), [this](TaskContext /*context*/)
390 {
393 })
394 .Schedule(Seconds(2), [this](TaskContext /*context*/)
395 {
399 skadi->AI()->DoAction(ACTION_DRAKE_BREATH);
400 })
401 .Schedule(Seconds(10), [this](TaskContext /*context*/)
402 {
404 });
405 break;
406 case POINT_RIGHT:
408 .Schedule(Milliseconds(1), [this](TaskContext /*context*/)
409 {
412 })
413 .Schedule(Seconds(2), [this](TaskContext /*context*/)
414 {
418 skadi->AI()->DoAction(ACTION_DRAKE_BREATH);
419 })
420 .Schedule(Seconds(10), [this](TaskContext /*context*/)
421 {
423 });
424 break;
425 default:
426 break;
427 }
428 }
429
430 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
431 {
432 if (spellInfo->Id == SPELL_LAUNCH_HARPOON)
434 skadi->AI()->DoAction(ACTION_HARPOON_HIT);
435 }
436
437 void UpdateAI(uint32 diff) override
438 {
439 _scheduler.Update(diff);
440 }
441
442private:
445};
446
448{
449 npc_skadi_trashAI(Creature* creature) : ScriptedAI(creature)
450 {
452
454 {
456 });
457 }
458
459 void JustEngagedWith(Unit* who) override
460 {
463 }
464
465 void IsSummonedBy(WorldObject* /*summoner*/) override
466 {
468 skadi->AI()->JustSummoned(me);
469 }
470
471 void MovementInform(uint32 type, uint32 pointId) override
472 {
473 if (type != POINT_MOTION_TYPE)
474 return;
475
476 switch (pointId)
477 {
478 case POINT_0:
480 break;
481 case POINT_1:
482 _scheduler.Schedule(Seconds(1), [this](TaskContext /*context*/)
483 {
485 });
486 break;
487 case POINT_2:
489 break;
490 default:
491 break;
492 }
493 }
494
495 void UpdateAI(uint32 diff) override
496 {
497 UpdateVictim();
498
499 _scheduler.Update(diff);
500 }
501
502 virtual void ScheduleTasks() = 0;
503
504protected:
507};
508
510{
512
513 void ScheduleTasks() override
514 {
516 .Schedule(Seconds(2), [this](TaskContext context)
517 {
519 context.Repeat(Seconds(11), Seconds(18));
520 })
521 .Schedule(Seconds(9), [this](TaskContext context)
522 {
524 context.Repeat(Seconds(10), Seconds(13));
525 });
526 }
527};
528
530{
532
533 void ScheduleTasks() override
534 {
536 .Schedule(Seconds(2), [this](TaskContext shadowBolt)
537 {
539 shadowBolt.Repeat();
540 })
541 .Schedule(Seconds(20), Seconds(34), [this](TaskContext shrink)
542 {
544 shrink.Repeat();
545 });
546 }
547};
548
550{
552
553 void ScheduleTasks() override
554 {
556 .Schedule(Seconds(13), [this](TaskContext net)
557 {
558 if (Unit* target = SelectTarget(SelectTargetMethod::MaxDistance, 0, 30, true))
559 DoCast(target, SPELL_NET);
560 net.Repeat();
561 })
562 .Schedule(Seconds(2), [this](TaskContext castThrow)
563 {
565 castThrow.Repeat();
566 });
567 }
568
569 void JustDied(Unit* /*killer*/) override
570 {
572 }
573};
574
575// 47594 - Freezing Cloud
577{
578 bool Validate(SpellInfo const* /*spell*/) override
579 {
581 }
582
583 void FilterTargets(std::list<WorldObject*>& targets)
584 {
585 targets.remove_if([](WorldObject* obj) { return obj->GetPositionY() > -511.0f; });
586 }
587
588 void HandleScript(SpellEffIndex /*effIndex*/)
589 {
591 }
592
593 void Register() override
594 {
597 }
598};
599
600// 47574 - Freezing Cloud
602{
603 bool Validate(SpellInfo const* /*spell*/) override
604 {
606 }
607
608 void FilterTargets(std::list<WorldObject*>& targets)
609 {
610 targets.remove_if([](WorldObject* obj) { return obj->GetPositionY() < -511.0f; });
611 }
612
613 void HandleScript(SpellEffIndex /*effIndex*/)
614 {
616 }
617
618 void Register() override
619 {
622 }
623};
624
625// 47579, 60020 - Freezing Cloud
627{
628 bool CanBeAppliedOn(Unit* target)
629 {
630 if (Aura* aur = target->GetAura(GetId()))
631 if (aur->GetOwner() != GetOwner())
632 return false;
633
634 return true;
635 }
636
637 void Register() override
638 {
640 }
641};
642
643// 49308 - Utgarde Pinnacle Guantlet Reset Check
645{
646 void CountTargets(std::list<WorldObject*>& targets)
647 {
649 _targetCount = targets.size();
650 }
651
652 void HandleDummy(SpellEffIndex /*effIndex*/)
653 {
654 if (_targetCount)
655 return;
656
657 Creature* target = GetHitCreature();
658 if (!target)
659 return;
660
661 if (InstanceScript* instance = target->GetInstanceScript())
662 if (instance->GetBossState(DATA_SKADI_THE_RUTHLESS) == IN_PROGRESS)
664 }
665
666 void Register() override
667 {
670 }
671
672private:
674};
675
676// 48642 - Launch Harpoon
678{
679 void FilterTargets(std::list<WorldObject*>& targets)
680 {
681 if (targets.size() >= 2)
682 targets.remove_if([](WorldObject* obj) { return obj->GetEntry() != NPC_GRAUF; });
683 }
684
686 {
687 if (Unit* target = GetHitUnit())
688 SetHitDamage(target->CountPctFromMaxHealth(35));
689 }
690
691 void Register() override
692 {
695 }
696};
697
698// 50255, 59331 - Poisoned Spear
700{
701 bool Validate(SpellInfo const* /*spell*/) override
702 {
704 }
705
706 void HandleScript(SpellEffIndex /*effIndex*/)
707 {
709 }
710
711 void Register() override
712 {
714 }
715};
716
717// 61791 - Ride Vehicle
719{
720 void OnRemoveVehicle(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
721 {
723 Unit* caster = GetCaster();
724 if (!caster)
725 return;
726
728 caster->SetControlled(false, UNIT_STATE_ROOT);
729 }
730
731 void Register() override
732 {
734 }
735};
736
737// 59275 - Summon Gauntlet Mobs Periodic
739{
741 {
742 for (uint8 i = 0; i < 2; ++i)
743 {
744 uint32 spellId = SummonSpellsList.front();
745 GetTarget()->CastSpell(nullptr, spellId, true);
746 SummonSpellsList.push_back(spellId);
747 SummonSpellsList.pop_front();
748 }
749 }
751 {
752 for (uint8 j = 0; j < 2; ++j)
753 {
754 SummonSpellsList.push_back(SummonSpellsList.front());
755 SummonSpellsList.pop_front();
756 }
757 }
758
759 void OnPeriodic(AuraEffect const* /*aurEff*/)
760 {
761 if (RAND(0, 1))
762 {
765 }
766 else
767 {
770 }
771 }
772private:
773 std::deque<uint32> SummonSpellsList =
774 {
783 };
784
785 void Register() override
786 {
788 }
789};
790
792{
793 public:
794 achievement_girl_love_to_skadi() : AchievementCriteriaScript("achievement_girl_love_to_skadi") { }
795
796 bool OnCheck(Player* /*player*/, Unit* target) override
797 {
798 if (!target)
799 return false;
800
801 if (Creature* skadi = target->ToCreature())
802 if (skadi->AI()->GetData(DATA_LOVE_TO_SKADI) == 1)
803 return true;
804
805 return false;
806 }
807};
808
810{
811 public:
812 at_skadi_gaunlet() : AreaTriggerScript("at_skadi_gaunlet") { }
813
814 bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
815 {
816 InstanceScript* instance = player->GetInstanceScript();
817 if (!instance || player->IsGameMaster())
818 return true;
819
821 if (Creature* skadi = instance->GetCreature(DATA_SKADI_THE_RUTHLESS))
822 {
823 skadi->AI()->DoAction(ACTION_START_ENCOUNTER);
824 return true;
825 }
826
827 return true;
828 }
829};
830
832{
847 new at_skadi_gaunlet();
848}
Texts
Actions
@ NPC_WORLD_TRIGGER
First const & RAND(First const &first, Second const &second, Rest const &... rest)
uint8_t uint8
Definition: Define.h:144
int8_t int8
Definition: Define.h:140
int32_t int32
Definition: Define.h:138
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
@ IN_PROGRESS
@ NOT_STARTED
@ MOTION_PRIORITY_HIGHEST
@ SPLINE_CHAIN_MOTION_TYPE
@ POINT_MOTION_TYPE
@ TEMPSUMMON_CORPSE_TIMED_DESPAWN
Definition: ObjectDefines.h:68
@ TYPEID_PLAYER
Definition: ObjectGuid.h:41
Spells
Definition: PlayerAI.cpp:32
#define RegisterSpellScript(spell_script)
Definition: ScriptMgr.h:1369
SpellEffIndex
Definition: SharedDefines.h:29
@ EFFECT_1
Definition: SharedDefines.h:31
@ EFFECT_0
Definition: SharedDefines.h:30
@ TARGET_UNIT_CONE_ENTRY
@ TARGET_UNIT_SRC_AREA_ENTRY
@ EMOTE_STATE_READY1H
@ EMOTE_STATE_READY2HL
@ EVENT_VEHICLE_BOARD
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_SCHOOL_DAMAGE
@ SPELL_EFFECT_APPLY_AURA
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
@ SPELL_AURA_CONTROL_VEHICLE
@ SPELL_AURA_PERIODIC_DUMMY
#define SpellEffectFn(F, I, N)
Definition: SpellScript.h:842
#define SpellObjectAreaTargetSelectFn(F, I, N)
Definition: SpellScript.h:864
#define AuraEffectPeriodicFn(F, I, N)
Definition: SpellScript.h:2046
#define SpellHitFn(F)
Definition: SpellScript.h:854
#define AuraCheckAreaTargetFn(F)
Definition: SpellScript.h:2008
#define AuraEffectRemoveFn(F, I, N, M)
Definition: SpellScript.h:2040
EvadeReason
Definition: UnitAICommon.h:30
@ MOVE_RUN
Definition: UnitDefines.h:118
@ REACT_PASSIVE
Definition: UnitDefines.h:506
@ REACT_AGGRESSIVE
Definition: UnitDefines.h:508
@ UNIT_STATE_ROOT
Definition: Unit.h:265
@ UNIT_STATE_CASTING
Definition: Unit.h:270
MiscData
CombatPhase
@ FIRST_WAVE_MAX_WARRIORS
Definition: boss_skadi.cpp:114
@ ACHIEV_LODI_DODI_WE_LOVES_THE_SKADI
Definition: boss_skadi.cpp:116
@ FIRST_WAVE_SIZE
Definition: boss_skadi.cpp:115
@ DATA_LOVE_TO_SKADI
Definition: boss_skadi.cpp:113
Position const SecondaryWavesInitialPoint
Definition: boss_skadi.cpp:122
@ ACTION_HARPOON_HIT
Definition: boss_skadi.cpp:101
@ ACTION_GAUNTLET_END
Definition: boss_skadi.cpp:100
@ ACTION_START_ENCOUNTER
Definition: boss_skadi.cpp:98
@ ACTION_DRAKE_BREATH
Definition: boss_skadi.cpp:99
Position const SecondaryWavesFinalPoint
Definition: boss_skadi.cpp:123
float const BreathPointRight
Definition: boss_skadi.cpp:120
@ POINT_0
Definition: boss_skadi.cpp:79
@ POINT_1
Definition: boss_skadi.cpp:80
@ POINT_RIGHT
Definition: boss_skadi.cpp:84
@ POINT_2
Definition: boss_skadi.cpp:81
@ POINT_BREACH
Definition: boss_skadi.cpp:82
@ POINT_LEFT
Definition: boss_skadi.cpp:83
@ SPELL_SUMMON_HARPOON
Definition: boss_skadi.cpp:63
@ SPELL_SHRINK
Definition: boss_skadi.cpp:60
@ SPELL_HAMSTRING
Definition: boss_skadi.cpp:57
@ SPELL_STRIKE
Definition: boss_skadi.cpp:58
@ SPELL_FREEZING_CLOUD_LEFT_PERIODIC
Definition: boss_skadi.cpp:45
@ SPELL_SUMMON_YMIRJAR_WARRIOR_E
Definition: boss_skadi.cpp:49
@ SPELL_SUMMON_YMIRJAR_WARRIOR_W
Definition: boss_skadi.cpp:48
@ SPELL_SKADI_TELEPORT
Definition: boss_skadi.cpp:39
@ SPELL_SUMMON_YMIRJAR_HARPOONER_W
Definition: boss_skadi.cpp:50
@ SPELL_SUMMON_YMIRJAR_HARPOONER_E
Definition: boss_skadi.cpp:51
@ SPELL_SUMMON_YMIRJAR_WITCH_DOCTOR_E
Definition: boss_skadi.cpp:53
@ SPELL_FREEZING_CLOUD_RIGHT_AREA
Definition: boss_skadi.cpp:46
@ SPELL_POISONED_SPEAR_PERIODIC
Definition: boss_skadi.cpp:37
@ SPELL_POISONED_SPEAR
Definition: boss_skadi.cpp:36
@ SPELL_SHADOW_BOLT
Definition: boss_skadi.cpp:59
@ SPELL_LAUNCH_HARPOON
Definition: boss_skadi.cpp:40
@ SPELL_FREEZING_CLOUD_RIGHT_PERIODIC
Definition: boss_skadi.cpp:44
@ SPELL_THROW
Definition: boss_skadi.cpp:62
@ SPELL_SUMMON_GAUNLET_MOBS_PERIODIC
Definition: boss_skadi.cpp:41
@ SPELL_FREEZING_CLOUD_LEFT_AREA
Definition: boss_skadi.cpp:47
@ SPELL_NET
Definition: boss_skadi.cpp:61
@ SPELL_SUMMON_YMIRJAR_WITCH_DOCTOR_W
Definition: boss_skadi.cpp:52
@ SPELL_RIDE_GRAUF
Definition: boss_skadi.cpp:42
@ SPELL_UTGARDE_PINNACLE_GUANTLET_RESET_CHECK
Definition: boss_skadi.cpp:55
@ SPELL_UTGARDE_PINNACLE_GAUNTLET_EFFECT
Definition: boss_skadi.cpp:54
@ SPELL_WHIRLWIND
Definition: boss_skadi.cpp:38
@ SPELL_FREEZING_CLOUD
Definition: boss_skadi.cpp:43
@ SPELL_CRUSH
Definition: boss_skadi.cpp:35
Position const FirstWaveLocations[FIRST_WAVE_SIZE]
Definition: boss_skadi.cpp:126
float const BreachPoint
Definition: boss_skadi.cpp:119
void AddSC_boss_skadi()
Definition: boss_skadi.cpp:831
@ SAY_DEATH
Definition: boss_skadi.cpp:70
@ SAY_DRAKE_DEATH
Definition: boss_skadi.cpp:71
@ SAY_AGGRO
Definition: boss_skadi.cpp:68
@ EMOTE_BREATH
Definition: boss_skadi.cpp:73
@ SAY_KILL
Definition: boss_skadi.cpp:69
@ SAY_DRAKE_BREATH
Definition: boss_skadi.cpp:72
@ EMOTE_ON_RANGE
Definition: boss_skadi.cpp:74
SplineChainIds
Definition: boss_skadi.cpp:88
@ SPLINE_CHAIN_BREACH_RIGHT
Definition: boss_skadi.cpp:90
@ SPLINE_CHAIN_BREACH_LEFT
Definition: boss_skadi.cpp:91
@ SPLINE_CHAIN_RIGHT
Definition: boss_skadi.cpp:92
@ SPLINE_CHAIN_INITIAL
Definition: boss_skadi.cpp:89
@ SPLINE_CHAIN_LEFT
Definition: boss_skadi.cpp:93
Position const SpawnLoc
Definition: boss_skadi.cpp:124
@ PHASE_FLYING
Definition: boss_skadi.cpp:106
@ PHASE_GROUND
Definition: boss_skadi.cpp:107
Position const GraufLoc
Definition: boss_skadi.cpp:125
float const BreathPointLeft
Definition: boss_skadi.cpp:121
void PreventDefaultAction()
HookList< EffectPeriodicHandler > OnEffectPeriodic
Definition: SpellScript.h:2045
WorldObject * GetOwner() const
Unit * GetCaster() const
HookList< CheckAreaTargetHandler > DoCheckAreaTarget
Definition: SpellScript.h:2007
Unit * GetTarget() const
HookList< EffectApplyHandler > OnEffectRemove
Definition: SpellScript.h:2035
uint32 GetId() const
InstanceScript *const instance
void _DespawnAtEvade(Seconds delayToRespawn=30s, Creature *who=nullptr)
TaskScheduler scheduler
SummonList summons
void _JustDied()
virtual void JustEngagedWith(Unit *)
Definition: CreatureAI.h:99
void DoZoneInCombat()
Definition: CreatureAI.h:161
virtual void EnterEvadeMode(EvadeReason why=EvadeReason::Other)
Definition: CreatureAI.cpp:219
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
Definition: CreatureAI.cpp:56
bool UpdateVictim()
Definition: CreatureAI.cpp:245
Creature *const me
Definition: CreatureAI.h:61
void SetImmuneToPC(bool apply) override
Definition: Creature.h:170
void SetReactState(ReactStates st)
Definition: Creature.h:160
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
Definition: Creature.cpp:2415
void SetRegenerateHealth(bool value)
Definition: Creature.h:358
CreatureAI * AI() const
Definition: Creature.h:214
virtual bool SetBossState(uint32 id, EncounterState state)
Creature * GetCreature(uint32 type)
EncounterState GetBossState(uint32 id) const
void TriggerGameEvent(uint32 gameEventId, WorldObject *source=nullptr, WorldObject *target=nullptr) override
void LaunchMoveSpline(std::function< void(Movement::MoveSplineInit &init)> &&initializer, uint32 id=0, MovementGeneratorPriority priority=MOTION_PRIORITY_NORMAL, MovementGeneratorType type=EFFECT_MOTION_TYPE)
void MoveAlongSplineChain(uint32 pointId, uint16 dbChainId, bool walk)
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
TypeID GetTypeId() const
Definition: Object.h:173
uint32 GetEntry() const
Definition: Object.h:161
bool IsGameMaster() const
Definition: Player.h:1178
uint32 const Id
Definition: SpellInfo.h:325
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
Definition: SpellScript.h:162
Creature * GetHitCreature() const
HookList< HitHandler > OnHit
Definition: SpellScript.h:850
Unit * GetHitUnit() const
HookList< EffectHandler > OnEffectHitTarget
Definition: SpellScript.h:840
void SetHitDamage(int32 damage)
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
Definition: SpellScript.h:863
void DespawnEntry(uint32 entry)
void Summon(Creature const *summon)
TaskContext & Repeat(std::chrono::duration< Rep, Period > duration)
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 SetControlled(bool apply, UnitState state)
Definition: Unit.cpp:10911
MotionMaster * GetMotionMaster()
Definition: Unit.h:1652
bool SetDisableGravity(bool disable, bool updateAnimTier=true)
Definition: Unit.cpp:12725
void SetUninteractible(bool apply)
Definition: Unit.cpp:8147
void SetEmoteState(Emote emote)
Definition: Unit.h:852
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition: Unit.cpp:4560
bool SetCanFly(bool enable)
Definition: Unit.cpp:12820
void SetSpeedRate(UnitMoveType mtype, float rate)
Definition: Unit.cpp:8525
void SetFacingTo(float const ori, bool force=true)
Definition: Unit.cpp:12653
bool HasUnitState(const uint32 f) const
Definition: Unit.h:732
Vehicle * GetVehicleKit() const
Definition: Unit.h:1711
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:3831
Vehicle * RemovePassenger(WorldObject *passenger) override
Removes the passenger from the vehicle.
Definition: Vehicle.cpp:492
InstanceScript * GetInstanceScript() const
Definition: Object.cpp:1042
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
void setActive(bool isActiveObject)
Definition: Object.cpp:922
void SetFarVisible(bool on)
Definition: Object.cpp:973
Creature * FindNearestCreature(uint32 entry, float range, bool alive=true) const
Definition: Object.cpp:2148
virtual void DoAction(uint32 actionId, WorldObject *source=nullptr, WorldObject *target=nullptr)
Definition: ZoneScript.h:96
bool OnCheck(Player *, Unit *target) override
Definition: boss_skadi.cpp:796
bool OnTrigger(Player *player, AreaTriggerEntry const *) override
Definition: boss_skadi.cpp:814
void FilterTargets(std::list< WorldObject * > &targets)
Definition: boss_skadi.cpp:608
void HandleScript(SpellEffIndex)
Definition: boss_skadi.cpp:613
bool Validate(SpellInfo const *) override
Definition: boss_skadi.cpp:603
void FilterTargets(std::list< WorldObject * > &targets)
Definition: boss_skadi.cpp:583
void HandleScript(SpellEffIndex)
Definition: boss_skadi.cpp:588
bool Validate(SpellInfo const *) override
Definition: boss_skadi.cpp:578
bool CanBeAppliedOn(Unit *target)
Definition: boss_skadi.cpp:628
void Register() override
Definition: boss_skadi.cpp:691
void FilterTargets(std::list< WorldObject * > &targets)
Definition: boss_skadi.cpp:679
void Register() override
Definition: boss_skadi.cpp:711
bool Validate(SpellInfo const *) override
Definition: boss_skadi.cpp:701
void HandleScript(SpellEffIndex)
Definition: boss_skadi.cpp:706
void CountTargets(std::list< WorldObject * > &targets)
Definition: boss_skadi.cpp:646
void HandleDummy(SpellEffIndex)
Definition: boss_skadi.cpp:652
void Register() override
Definition: boss_skadi.cpp:666
void Register() override
Definition: boss_skadi.cpp:731
void OnRemoveVehicle(AuraEffect const *, AuraEffectHandleModes)
Definition: boss_skadi.cpp:720
std::deque< uint32 > SummonSpellsList
Definition: boss_skadi.cpp:773
void OnPeriodic(AuraEffect const *)
Definition: boss_skadi.cpp:759
void apply(T *val)
Definition: ByteConverter.h:41
constexpr float GetPositionY() const
Definition: Position.h:77
bool firstWaveSummoned
Definition: boss_skadi.cpp:316
void UpdateAI(uint32 diff) override
Definition: boss_skadi.cpp:301
void EnterEvadeMode(EvadeReason) override
Definition: boss_skadi.cpp:171
uint32 GetData(uint32 id) const override
Definition: boss_skadi.cpp:293
void Initialize()
Definition: boss_skadi.cpp:150
void JustDied(Unit *) override
Definition: boss_skadi.cpp:209
void KilledUnit(Unit *who) override
Definition: boss_skadi.cpp:215
uint8 _harpoonHit
Definition: boss_skadi.cpp:314
uint8 _loveSkadi
Definition: boss_skadi.cpp:315
boss_skadi(Creature *creature)
Definition: boss_skadi.cpp:145
void JustSummoned(Creature *summon) override
Definition: boss_skadi.cpp:177
void SpawnFirstWave()
Definition: boss_skadi.cpp:193
CombatPhase _phase
Definition: boss_skadi.cpp:313
void Reset() override
Definition: boss_skadi.cpp:162
void DoAction(int32 action) override
Definition: boss_skadi.cpp:221
void SpellHit(WorldObject *, SpellInfo const *spellInfo) override
Definition: boss_skadi.cpp:430
void PassengerBoarded(Unit *who, int8, bool apply) override
== Fields =======================================
Definition: boss_skadi.cpp:338
void JustDied(Unit *) override
Definition: boss_skadi.cpp:330
void Reset() override
Definition: boss_skadi.cpp:323
void MovementInform(uint32 type, uint32 pointId) override
Definition: boss_skadi.cpp:365
InstanceScript * _instance
Definition: boss_skadi.cpp:444
npc_grauf(Creature *creature)
Definition: boss_skadi.cpp:321
TaskScheduler _scheduler
Definition: boss_skadi.cpp:443
void UpdateAI(uint32 diff) override
Definition: boss_skadi.cpp:437
npc_skadi_trashAI(Creature *creature)
Definition: boss_skadi.cpp:449
void IsSummonedBy(WorldObject *) override
Definition: boss_skadi.cpp:465
TaskScheduler _scheduler
Definition: boss_skadi.cpp:506
void MovementInform(uint32 type, uint32 pointId) override
Definition: boss_skadi.cpp:471
void JustEngagedWith(Unit *who) override
Definition: boss_skadi.cpp:459
virtual void ScheduleTasks()=0
void UpdateAI(uint32 diff) override
Definition: boss_skadi.cpp:495
InstanceScript * _instance
Definition: boss_skadi.cpp:505
void ScheduleTasks() override
Definition: boss_skadi.cpp:553
void JustDied(Unit *) override
Definition: boss_skadi.cpp:569
npc_ymirjar_harpooner(Creature *creature)
Definition: boss_skadi.cpp:551
npc_ymirjar_warrior(Creature *creature)
Definition: boss_skadi.cpp:511
void ScheduleTasks() override
Definition: boss_skadi.cpp:513
npc_ymirjar_witch_doctor(Creature *creature)
Definition: boss_skadi.cpp:531
void ScheduleTasks() override
Definition: boss_skadi.cpp:533
#define RegisterUtgardePinnacleCreatureAI(ai_name)
@ DATA_SKADI_THE_RUTHLESS
@ DATA_GRAUF
@ NPC_TRIGGER_RESET
@ NPC_COMBAT_TRIGGER
@ NPC_YMIRJAR_WITCH_DOCTOR
@ NPC_YMIRJAR_WARRIOR
@ NPC_GRAUF
@ NPC_YMIRJAR_HARPOONER