TrinityCore
Loading...
Searching...
No Matches
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
65
76
86
95
103
109
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 const& /*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 const& /*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 const& /*context*/)
375 {
378 })
379 .Schedule(Seconds(10), [this](TaskContext const& /*context*/)
380 {
383 else
385 });
386 break;
387 case POINT_LEFT:
389 .Schedule(Milliseconds(1), [this](TaskContext const& /*context*/)
390 {
393 })
394 .Schedule(Seconds(2), [this](TaskContext const& /*context*/)
395 {
399 skadi->AI()->DoAction(ACTION_DRAKE_BREATH);
400 })
401 .Schedule(Seconds(10), [this](TaskContext const& /*context*/)
402 {
404 });
405 break;
406 case POINT_RIGHT:
408 .Schedule(Milliseconds(1), [this](TaskContext const& /*context*/)
409 {
412 })
413 .Schedule(Seconds(2), [this](TaskContext const& /*context*/)
414 {
418 skadi->AI()->DoAction(ACTION_DRAKE_BREATH);
419 })
420 .Schedule(Seconds(10), [this](TaskContext const& /*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 const& /*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
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
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
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
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
696};
697
698// 50255, 59331 - Poisoned Spear
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
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:
784
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
First const & RAND(First const &first, Second const &second, Rest const &... rest)
uint8_t uint8
Definition Define.h:156
int8_t int8
Definition Define.h:152
int32_t int32
Definition Define.h:150
uint32_t uint32
Definition Define.h:154
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition Duration.h:24
std::chrono::seconds Seconds
Seconds shorthand typedef.
Definition Duration.h:28
@ IN_PROGRESS
@ NOT_STARTED
@ MOTION_PRIORITY_HIGHEST
@ SPLINE_CHAIN_MOTION_TYPE
@ POINT_MOTION_TYPE
@ TEMPSUMMON_CORPSE_TIMED_DESPAWN
@ TYPEID_PLAYER
Definition ObjectGuid.h:44
Spells
Definition PlayerAI.cpp:32
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1383
SpellEffIndex
@ EFFECT_1
@ EFFECT_0
@ 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)
#define SpellObjectAreaTargetSelectFn(F, I, N)
#define AuraEffectPeriodicFn(F, I, N)
#define SpellHitFn(F)
#define AuraCheckAreaTargetFn(F)
#define AuraEffectRemoveFn(F, I, N, M)
EvadeReason
@ MOVE_RUN
@ REACT_PASSIVE
@ REACT_AGGRESSIVE
@ UNIT_STATE_ROOT
Definition Unit.h:271
@ UNIT_STATE_CASTING
Definition Unit.h:276
CombatPhase
@ FIRST_WAVE_MAX_WARRIORS
@ ACHIEV_LODI_DODI_WE_LOVES_THE_SKADI
@ FIRST_WAVE_SIZE
@ DATA_LOVE_TO_SKADI
Position const SecondaryWavesInitialPoint
@ ACTION_HARPOON_HIT
@ ACTION_GAUNTLET_END
@ ACTION_START_ENCOUNTER
@ ACTION_DRAKE_BREATH
Position const SecondaryWavesFinalPoint
float const BreathPointRight
@ POINT_0
@ POINT_1
@ POINT_RIGHT
@ POINT_2
@ POINT_BREACH
@ POINT_LEFT
@ SPELL_SUMMON_HARPOON
@ SPELL_SHRINK
@ SPELL_HAMSTRING
@ SPELL_STRIKE
@ SPELL_FREEZING_CLOUD_LEFT_PERIODIC
@ SPELL_SUMMON_YMIRJAR_WARRIOR_E
@ SPELL_SUMMON_YMIRJAR_WARRIOR_W
@ SPELL_SKADI_TELEPORT
@ SPELL_SUMMON_YMIRJAR_HARPOONER_W
@ SPELL_SUMMON_YMIRJAR_HARPOONER_E
@ SPELL_SUMMON_YMIRJAR_WITCH_DOCTOR_E
@ SPELL_FREEZING_CLOUD_RIGHT_AREA
@ SPELL_POISONED_SPEAR_PERIODIC
@ SPELL_POISONED_SPEAR
@ SPELL_SHADOW_BOLT
@ SPELL_LAUNCH_HARPOON
@ SPELL_FREEZING_CLOUD_RIGHT_PERIODIC
@ SPELL_THROW
@ SPELL_SUMMON_GAUNLET_MOBS_PERIODIC
@ SPELL_FREEZING_CLOUD_LEFT_AREA
@ SPELL_NET
@ SPELL_SUMMON_YMIRJAR_WITCH_DOCTOR_W
@ SPELL_RIDE_GRAUF
@ SPELL_UTGARDE_PINNACLE_GUANTLET_RESET_CHECK
@ SPELL_UTGARDE_PINNACLE_GAUNTLET_EFFECT
@ SPELL_WHIRLWIND
@ SPELL_FREEZING_CLOUD
@ SPELL_CRUSH
Position const FirstWaveLocations[FIRST_WAVE_SIZE]
float const BreachPoint
void AddSC_boss_skadi()
@ SAY_DEATH
@ SAY_DRAKE_DEATH
@ SAY_AGGRO
@ EMOTE_BREATH
@ SAY_KILL
@ SAY_DRAKE_BREATH
@ EMOTE_ON_RANGE
SplineChainIds
@ SPLINE_CHAIN_BREACH_RIGHT
@ SPLINE_CHAIN_BREACH_LEFT
@ SPLINE_CHAIN_RIGHT
@ SPLINE_CHAIN_INITIAL
@ SPLINE_CHAIN_LEFT
Position const SpawnLoc
CombatPhase
@ PHASE_FLYING
@ PHASE_GROUND
Position const GraufLoc
float const BreathPointLeft
void PreventDefaultAction()
HookList< EffectPeriodicHandler > OnEffectPeriodic
WorldObject * GetOwner() const
Unit * GetCaster() const
HookList< CheckAreaTargetHandler > DoCheckAreaTarget
Unit * GetTarget() const
HookList< EffectApplyHandler > OnEffectRemove
uint32 GetId() const
TypeID GetTypeId() const
Definition BaseEntity.h:166
InstanceScript *const instance
void _DespawnAtEvade(Seconds delayToRespawn=30s, Creature *who=nullptr)
TaskScheduler scheduler
SummonList summons
virtual void JustEngagedWith(Unit *)
Definition CreatureAI.h:101
void DoZoneInCombat()
Definition CreatureAI.h:169
virtual void EnterEvadeMode(EvadeReason why=EvadeReason::Other)
bool UpdateVictim()
Creature *const me
Definition CreatureAI.h:63
void SetImmuneToPC(bool apply) override
Definition Creature.h:184
void SetReactState(ReactStates st)
Definition Creature.h:174
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
void SetRegenerateHealth(bool value)
Definition Creature.h:373
CreatureAI * AI() const
Definition Creature.h:228
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, Scripting::v2::ActionResultSetter< MovementStopReason > &&scriptResult={})
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={}, Optional< MovementFadeObject > fadeObject={}, Scripting::v2::ActionResultSetter< MovementStopReason > &&scriptResult={})
uint32 GetEntry() const
Definition Object.h:89
Creature * ToCreature()
Definition Object.h:121
bool IsGameMaster() const
Definition Player.h:1309
uint32 const Id
Definition SpellInfo.h:328
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
Creature * GetHitCreature() const
HookList< HitHandler > OnHit
Unit * GetHitUnit() const
HookList< EffectHandler > OnEffectHitTarget
void SetHitDamage(int32 damage)
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
void DespawnEntry(uint32 entry)
void Summon(Creature const *summon)
TaskContext & Repeat(TaskScheduler::duration_t duration)
TaskScheduler & Schedule(duration_t time, task_handler_t task)
TaskScheduler & SetValidator(P &&predicate)
Sets a validator which is asked if tasks are allowed to be executed.
TaskScheduler & Update()
Update the scheduler to the current time.
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:160
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:635
void SetControlled(bool apply, UnitState state)
Definition Unit.cpp:11545
MotionMaster * GetMotionMaster()
Definition Unit.h:1723
bool SetDisableGravity(bool disable, bool updateAnimTier=true)
Definition Unit.cpp:13361
void SetUninteractible(bool apply)
Definition Unit.cpp:8564
void SetEmoteState(Emote emote)
Definition Unit.h:865
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition Unit.cpp:4700
bool SetCanFly(bool enable)
Definition Unit.cpp:13459
void SetSpeedRate(UnitMoveType mtype, float rate)
Definition Unit.cpp:8942
void SetFacingTo(float const ori, bool force=true)
Definition Unit.cpp:13289
bool HasUnitState(const uint32 f) const
Definition Unit.h:743
Vehicle * GetVehicleKit() const
Definition Unit.h:1782
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3974
Vehicle * RemovePassenger(WorldObject *passenger) override
Removes the passenger from the vehicle.
Definition Vehicle.cpp:513
InstanceScript * GetInstanceScript() const
Definition Object.cpp:396
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2217
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:1398
void setActive(bool isActiveObject)
Definition Object.cpp:276
void SetFarVisible(bool on)
Definition Object.cpp:327
Creature * FindNearestCreature(uint32 entry, float range, bool alive=true) const
Definition Object.cpp:1517
virtual void DoAction(uint32 actionId, WorldObject *source=nullptr, WorldObject *target=nullptr)
Definition ZoneScript.h:104
bool OnCheck(Player *, Unit *target) override
bool OnTrigger(Player *player, AreaTriggerEntry const *) override
void FilterTargets(std::list< WorldObject * > &targets)
void HandleScript(SpellEffIndex)
bool Validate(SpellInfo const *) override
void FilterTargets(std::list< WorldObject * > &targets)
void HandleScript(SpellEffIndex)
bool Validate(SpellInfo const *) override
bool CanBeAppliedOn(Unit *target)
void FilterTargets(std::list< WorldObject * > &targets)
bool Validate(SpellInfo const *) override
void HandleScript(SpellEffIndex)
void CountTargets(std::list< WorldObject * > &targets)
void HandleDummy(SpellEffIndex)
void Register() override
void Register() override
void OnRemoveVehicle(AuraEffect const *, AuraEffectHandleModes)
std::deque< uint32 > SummonSpellsList
void OnPeriodic(AuraEffect const *)
constexpr float GetPositionY() const
Definition Position.h:88
bool firstWaveSummoned
void UpdateAI(uint32 diff) override
void EnterEvadeMode(EvadeReason) override
uint32 GetData(uint32 id) const override
void Initialize()
void JustDied(Unit *) override
void KilledUnit(Unit *who) override
uint8 _harpoonHit
uint8 _loveSkadi
boss_skadi(Creature *creature)
void JustSummoned(Creature *summon) override
void SpawnFirstWave()
CombatPhase _phase
void Reset() override
void DoAction(int32 action) override
void SpellHit(WorldObject *, SpellInfo const *spellInfo) override
void PassengerBoarded(Unit *who, int8, bool apply) override
== Fields =======================================
void JustDied(Unit *) override
void Reset() override
void MovementInform(uint32 type, uint32 pointId) override
InstanceScript * _instance
npc_grauf(Creature *creature)
TaskScheduler _scheduler
void UpdateAI(uint32 diff) override
npc_skadi_trashAI(Creature *creature)
void IsSummonedBy(WorldObject *) override
TaskScheduler _scheduler
void MovementInform(uint32 type, uint32 pointId) override
void JustEngagedWith(Unit *who) override
virtual void ScheduleTasks()=0
void UpdateAI(uint32 diff) override
InstanceScript * _instance
void ScheduleTasks() override
void JustDied(Unit *) override
npc_ymirjar_harpooner(Creature *creature)
npc_ymirjar_warrior(Creature *creature)
void ScheduleTasks() override
npc_ymirjar_witch_doctor(Creature *creature)
void ScheduleTasks() override
#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