diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp | 300 |
1 files changed, 146 insertions, 154 deletions
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp index e3b49ca46b9..1e2da34120e 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp @@ -34,12 +34,10 @@ enum Spells SPELL_SKADI_TELEPORT = 61790, SPELL_LAUNCH_HARPOON = 48642, SPELL_SUMMON_GAUNLET_MOBS_PERIODIC = 59275, - SPELL_FREEZING_CLOUD = 47579, SPELL_RIDE_GRAUF = 61791, + SPELL_FREEZING_CLOUD = 47579, SPELL_FREEZING_CLOUD_RIGHT_PERIODIC = 47592, SPELL_FREEZING_CLOUD_LEFT_PERIODIC = 47590, - SPELL_FREEZING_CLOUD_RIGHT = 47593, - SPELL_FREEZING_CLOUD_LEFT = 47563, SPELL_FREEZING_CLOUD_RIGHT_AREA = 47594, SPELL_FREEZING_CLOUD_LEFT_AREA = 47574, SPELL_SUMMON_YMIRJAR_WARRIOR_W = 48631, @@ -60,64 +58,66 @@ enum Spells SPELL_SUMMON_HARPOON = 56789, }; -enum Yells +enum Texts { - SAY_AGGRO = 0, - SAY_KILL = 1, - SAY_DEATH = 3, - SAY_DRAKE_DEATH = 5, - SAY_DRAKE_BREATH = 6 + SAY_AGGRO = 0, + SAY_KILL = 1, + SAY_DEATH = 3, + SAY_DRAKE_DEATH = 5, + SAY_DRAKE_BREATH = 6, + EMOTE_BREATH = 0, + EMOTE_ON_RANGE = 1 }; -enum Emotes -{ - EMOTE_BREATH = 0, - EMOTE_ON_RANGE -}; - -enum Data +enum Points { - - DATA_LOVE_TO_SKADI = 0, - FIRST_WAVE_MAX_WARRIORS = 10, - FIRST_WAVE_SIZE = 13, - GRAUF_PATH_INITIAL = 2689300, - GRAUF_PATH_RIGHT = 2689301, - GRAUF_PATH_LEFT = 2689302, - ACHIEV_LODI_DODI_WE_LOVES_THE_SKADI = 17726, + POINT_0 = 0, + POINT_1 = 1, + POINT_2 = 2, + POINT_BREACH = 0, + POINT_LEFT = 1, + POINT_RIGHT = 2 }; -enum Points +enum SplineChainIds { - POINT_0 = 0, - POINT_1 = 1, - POINT_9 = 9, - POINT_11 = 11, - POINT_LEFT = 21, - POINT_RIGHT = 22 + SPLINE_CHAIN_INITIAL = 1, + SPLINE_CHAIN_BREACH_RIGHT = 2, + SPLINE_CHAIN_BREACH_LEFT = 3, + SPLINE_CHAIN_RIGHT = 4, + SPLINE_CHAIN_LEFT = 5 }; enum Actions { - ACTION_START_ENCOUNTER = 0, - ACTION_FLAME, + ACTION_START_ENCOUNTER = 0, + ACTION_DRAKE_BREATH, ACTION_GAUNTLET_END, ACTION_HARPOON_HIT, }; enum CombatPhase { - PHASE_FLYING = 0, + PHASE_FLYING = 0, PHASE_GROUND }; -Position const BreachPoint = { 0.0f, 0.0f, 0.0f, 2.670354f }; +enum MiscData +{ + + DATA_LOVE_TO_SKADI = 0, + FIRST_WAVE_MAX_WARRIORS = 10, + FIRST_WAVE_SIZE = 13, + ACHIEV_LODI_DODI_WE_LOVES_THE_SKADI = 17726, +}; + +float const BreachPoint = 2.670354f; +float const BreathPointRight = 3.124139f; +float const BreathPointLeft = 3.228859f; Position const SecondaryWavesInitialPoint = { 478.7434f, -505.5758f, 104.7237f }; Position const SecondaryWavesFinalPoint = { 318.177f, -503.8898f, 104.5326f }; Position const SpawnLoc = { 477.5808f, -484.5591f, 104.8221f, 4.677482f }; Position const GraufLoc = { 341.7411f, -516.9545f, 104.6695f, 3.124139f }; -Position const BreathPointRight = { 496.434f, -517.578f, 120.0f, 3.124139f }; -Position const BreathPointLeft = { 500.243f, -501.693f, 120.0f, 3.228859f }; Position const FirstWaveLocations[FIRST_WAVE_SIZE] = { { 458.5323f, -516.2537f, 104.617f }, @@ -150,8 +150,8 @@ public: void Initialize() { firstWaveSummoned = false; - harpoonHit = 0; - loveSkadi = 0; + _harpoonHit = 0; + _loveSkadi = 0; _phase = PHASE_GROUND; scheduler.SetValidator([this] { @@ -252,9 +252,9 @@ public: if (Creature* combatTrigger = me->SummonCreature(NPC_COMBAT_TRIGGER, SpawnLoc)) combatTrigger->AI()->DoZoneInCombat(); break; - case ACTION_FLAME: - if (loveSkadi == 1) - loveSkadi++; + case ACTION_DRAKE_BREATH: + if (_loveSkadi == 1) + _loveSkadi++; Talk(SAY_DRAKE_BREATH); break; case ACTION_GAUNTLET_END: @@ -285,9 +285,9 @@ public: }); break; case ACTION_HARPOON_HIT: - harpoonHit++; - if (harpoonHit == 1) - loveSkadi = 1; + _harpoonHit++; + if (_harpoonHit == 1) + _loveSkadi = 1; break; } } @@ -295,7 +295,7 @@ public: uint32 GetData(uint32 id) const override { if (id == DATA_LOVE_TO_SKADI) - return loveSkadi; + return _loveSkadi; return 0; } @@ -315,8 +315,8 @@ public: private: CombatPhase _phase; - uint8 harpoonHit; - uint8 loveSkadi; + uint8 _harpoonHit; + uint8 _loveSkadi; bool firstWaveSummoned; }; @@ -333,16 +333,13 @@ public: struct npc_graufAI : public ScriptedAI { - npc_graufAI(Creature* creature) : ScriptedAI(creature) - { - _isFirstFly = true; - _instance = me->GetInstanceScript(); - } + npc_graufAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { } void Reset() override { me->SetReactState(REACT_PASSIVE); me->setRegeneratingHealth(false); + me->SetSpeedRate(MOVE_RUN, 2.5f); } void JustDied(Unit* /*killer*/) override @@ -350,7 +347,7 @@ public: if (Creature* skadi = _instance->GetCreature(DATA_SKADI_THE_RUTHLESS)) skadi->AI()->DoAction(ACTION_GAUNTLET_END); - me->DespawnOrUnsummon(6000); + me->DespawnOrUnsummon(Seconds(6)); } void PassengerBoarded(Unit* who, int8 /*seatId*/, bool apply) override @@ -370,50 +367,45 @@ public: _scheduler.Schedule(Seconds(2), [this](TaskContext /*context*/) { - me->GetMotionMaster()->MovePath(GRAUF_PATH_INITIAL, false); + me->GetMotionMaster()->MoveAlongSplineChain(POINT_BREACH, SPLINE_CHAIN_INITIAL, false); }); } void MovementInform(uint32 type, uint32 pointId) override { - if (type != POINT_MOTION_TYPE && type != WAYPOINT_MOTION_TYPE) + if (type != SPLINE_CHAIN_MOTION_TYPE) return; switch (pointId) { - case POINT_9: - if (!_isFirstFly) - break; - _isFirstFly = false; - // no break - case POINT_11: + case POINT_BREACH: _scheduler .Schedule(Milliseconds(1), [this](TaskContext /*context*/) { - me->SetFacingTo(BreachPoint.GetOrientation()); + me->SetFacingTo(BreachPoint); Talk(EMOTE_ON_RANGE); }) .Schedule(Seconds(10), [this](TaskContext /*context*/) { - if (RAND(POINT_LEFT,POINT_RIGHT) == POINT_LEFT) - me->GetMotionMaster()->MovePoint(POINT_LEFT, BreathPointLeft); + if (RAND(POINT_LEFT, POINT_RIGHT) == POINT_LEFT) + me->GetMotionMaster()->MoveAlongSplineChain(POINT_LEFT, SPLINE_CHAIN_BREACH_LEFT, false); else - me->GetMotionMaster()->MovePoint(POINT_RIGHT, BreathPointRight); + me->GetMotionMaster()->MoveAlongSplineChain(POINT_RIGHT, SPLINE_CHAIN_BREACH_RIGHT, false); }); break; case POINT_LEFT: _scheduler .Schedule(Milliseconds(1), [this](TaskContext /*context*/) { - me->SetFacingTo(BreathPointLeft.GetOrientation()); + me->SetFacingTo(BreathPointLeft); Talk(EMOTE_BREATH); }) .Schedule(Seconds(2), [this](TaskContext /*context*/) { - me->GetMotionMaster()->MovePath(GRAUF_PATH_LEFT, false); + me->GetMotionMaster()->MoveAlongSplineChain(POINT_BREACH, SPLINE_CHAIN_LEFT, false); DoCast(SPELL_FREEZING_CLOUD_LEFT_PERIODIC); if (Creature* skadi = _instance->GetCreature(DATA_SKADI_THE_RUTHLESS)) - skadi->AI()->DoAction(ACTION_FLAME); + skadi->AI()->DoAction(ACTION_DRAKE_BREATH); }) .Schedule(Seconds(10), [this](TaskContext /*context*/) { @@ -424,23 +416,23 @@ public: _scheduler .Schedule(Milliseconds(1), [this](TaskContext /*context*/) { - me->SetFacingTo(BreathPointRight.GetOrientation()); + me->SetFacingTo(BreathPointRight); Talk(EMOTE_BREATH); }) .Schedule(Seconds(2), [this](TaskContext /*context*/) { - me->GetMotionMaster()->MovePath(GRAUF_PATH_RIGHT, false); + me->GetMotionMaster()->MoveAlongSplineChain(POINT_BREACH, SPLINE_CHAIN_RIGHT, false); DoCast(SPELL_FREEZING_CLOUD_RIGHT_PERIODIC); if (Creature* skadi = _instance->GetCreature(DATA_SKADI_THE_RUTHLESS)) - skadi->AI()->DoAction(ACTION_FLAME); + skadi->AI()->DoAction(ACTION_DRAKE_BREATH); }) .Schedule(Seconds(10), [this](TaskContext /*context*/) { me->RemoveAurasDueToSpell(SPELL_FREEZING_CLOUD_RIGHT_PERIODIC); }); break; - default: - break; + default: + break; } } @@ -459,7 +451,6 @@ public: private: TaskScheduler _scheduler; InstanceScript* _instance; - bool _isFirstFly; }; CreatureAI* GetAI(Creature* creature) const override @@ -505,11 +496,11 @@ struct npc_skadi_trashAI : public ScriptedAI case POINT_1: _scheduler.Schedule(Seconds(1), [this](TaskContext /*context*/) { - me->GetMotionMaster()->MovePoint(POINT_9, SecondaryWavesFinalPoint); + me->GetMotionMaster()->MovePoint(POINT_2, SecondaryWavesFinalPoint); }); break; - case POINT_9: - DoZoneInCombat(me, 200); + case POINT_2: + DoZoneInCombat(); break; default: break; @@ -634,80 +625,80 @@ public: class spell_freezing_cloud_area_right : public SpellScriptLoader { -public: - spell_freezing_cloud_area_right() : SpellScriptLoader("spell_freezing_cloud_area_right") { } - - class spell_freezing_cloud_area_right_SpellScript : public SpellScript - { - PrepareSpellScript(spell_freezing_cloud_area_right_SpellScript); + public: + spell_freezing_cloud_area_right() : SpellScriptLoader("spell_freezing_cloud_area_right") { } - bool Validate(SpellInfo const* /*spell*/) override + class spell_freezing_cloud_area_right_SpellScript : public SpellScript { - if (!sSpellMgr->GetSpellInfo(SPELL_FREEZING_CLOUD)) - return false; - return true; - } + PrepareSpellScript(spell_freezing_cloud_area_right_SpellScript); - void FilterTargets(std::list<WorldObject*>& targets) - { - targets.remove_if([](WorldObject* obj) { return obj->GetPositionY() > -511.0f; }); - } + bool Validate(SpellInfo const* /*spell*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_FREEZING_CLOUD)) + return false; + return true; + } - void HandleScript(SpellEffIndex /*effIndex*/) - { - GetHitUnit()->CastSpell(GetHitUnit(), SPELL_FREEZING_CLOUD, true); - } + void FilterTargets(std::list<WorldObject*>& targets) + { + targets.remove_if([](WorldObject* obj) { return obj->GetPositionY() > -511.0f; }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->CastSpell(GetHitUnit(), SPELL_FREEZING_CLOUD, true); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_freezing_cloud_area_right_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); + OnEffectHitTarget += SpellEffectFn(spell_freezing_cloud_area_right_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_APPLY_AURA); + } + }; - void Register() override + SpellScript* GetSpellScript() const override { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_freezing_cloud_area_right_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); - OnEffectHitTarget += SpellEffectFn(spell_freezing_cloud_area_right_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_APPLY_AURA); + return new spell_freezing_cloud_area_right_SpellScript(); } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_freezing_cloud_area_right_SpellScript(); - } }; class spell_freezing_cloud_area_left : public SpellScriptLoader { -public: - spell_freezing_cloud_area_left() : SpellScriptLoader("spell_freezing_cloud_area_left") { } - - class spell_freezing_cloud_area_left_SpellScript : public SpellScript - { - PrepareSpellScript(spell_freezing_cloud_area_left_SpellScript); + public: + spell_freezing_cloud_area_left() : SpellScriptLoader("spell_freezing_cloud_area_left") { } - bool Validate(SpellInfo const* /*spell*/) override + class spell_freezing_cloud_area_left_SpellScript : public SpellScript { - if (!sSpellMgr->GetSpellInfo(SPELL_FREEZING_CLOUD)) - return false; - return true; - } + PrepareSpellScript(spell_freezing_cloud_area_left_SpellScript); - void FilterTargets(std::list<WorldObject*>& targets) - { - targets.remove_if([](WorldObject* obj) { return obj->GetPositionY() < -511.0f; }); - } + bool Validate(SpellInfo const* /*spell*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_FREEZING_CLOUD)) + return false; + return true; + } - void HandleScript(SpellEffIndex /*effIndex*/) - { - GetHitUnit()->CastSpell(GetHitUnit(), SPELL_FREEZING_CLOUD, true); - } + void FilterTargets(std::list<WorldObject*>& targets) + { + targets.remove_if([](WorldObject* obj) { return obj->GetPositionY() < -511.0f; }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->CastSpell(GetHitUnit(), SPELL_FREEZING_CLOUD, true); + } - void Register() override + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_freezing_cloud_area_left_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); + OnEffectHitTarget += SpellEffectFn(spell_freezing_cloud_area_left_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_APPLY_AURA); + } + }; + + SpellScript* GetSpellScript() const override { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_freezing_cloud_area_left_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); - OnEffectHitTarget += SpellEffectFn(spell_freezing_cloud_area_left_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_APPLY_AURA); + return new spell_freezing_cloud_area_left_SpellScript(); } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_freezing_cloud_area_left_SpellScript(); - } }; class spell_freezing_cloud_damage : public SpellScriptLoader @@ -920,20 +911,20 @@ class spell_summon_gauntlet_mobs_periodic : public SpellScriptLoader class achievement_girl_love_to_skadi : public AchievementCriteriaScript { -public: - achievement_girl_love_to_skadi() : AchievementCriteriaScript("achievement_girl_love_to_skadi") { } + public: + achievement_girl_love_to_skadi() : AchievementCriteriaScript("achievement_girl_love_to_skadi") { } - bool OnCheck(Player* /*player*/, Unit* target) override - { - if (!target) - return false; + bool OnCheck(Player* /*player*/, Unit* target) override + { + if (!target) + return false; - if (Creature* skadi = target->ToCreature()) - if (skadi->AI()->GetData(DATA_LOVE_TO_SKADI) == 1) - return true; + if (Creature* skadi = target->ToCreature()) + if (skadi->AI()->GetData(DATA_LOVE_TO_SKADI) == 1) + return true; - return false; - } + return false; + } }; class at_skadi_gaunlet : public AreaTriggerScript @@ -943,15 +934,16 @@ class at_skadi_gaunlet : public AreaTriggerScript bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override { - if (InstanceScript* instance = player->GetInstanceScript()) - { - if (instance->GetBossState(DATA_SKADI_THE_RUTHLESS) == NOT_STARTED) - if (Creature* skadi = instance->GetCreature(DATA_SKADI_THE_RUTHLESS)) - { - skadi->AI()->DoAction(ACTION_START_ENCOUNTER); - return true; - } - } + InstanceScript* instance = player->GetInstanceScript(); + if (!instance || player->IsGameMaster()) + return true; + + if (instance->GetBossState(DATA_SKADI_THE_RUTHLESS) == NOT_STARTED) + if (Creature* skadi = instance->GetCreature(DATA_SKADI_THE_RUTHLESS)) + { + skadi->AI()->DoAction(ACTION_START_ENCOUNTER); + return true; + } return true; } |