diff options
author | Gustavo <sirikfoll@hotmail.com> | 2017-02-12 06:43:55 -0200 |
---|---|---|
committer | Keader <keader.android@gmail.com> | 2017-02-12 05:43:55 -0300 |
commit | 4536846d7d30508a046f394d1f561a2c3fdcf5f0 (patch) | |
tree | b03e7f3ef6276df519b21db05f0b7b5f6c6ea5f7 | |
parent | 865a3a47eaa518cb9c7827e863d679697e38b03e (diff) |
Core/Scripts Update boss Skadi the Ruthless (#19114)
-rw-r--r-- | sql/updates/world/3.3.5/2017_02_12_00_world.sql | 54 | ||||
-rw-r--r-- | src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp | 300 |
2 files changed, 200 insertions, 154 deletions
diff --git a/sql/updates/world/3.3.5/2017_02_12_00_world.sql b/sql/updates/world/3.3.5/2017_02_12_00_world.sql new file mode 100644 index 00000000000..7a86fc91e34 --- /dev/null +++ b/sql/updates/world/3.3.5/2017_02_12_00_world.sql @@ -0,0 +1,54 @@ +SET @PATH := 2689300; + +DELETE FROM `waypoint_data` WHERE `id` IN(@PATH, @PATH+1, @PATH+2); +DELETE FROM `script_spline_chain_meta` WHERE `entry`=26893; +INSERT INTO `script_spline_chain_meta` (`entry`,`chainId`,`splineId`,`expectedDuration`,`msUntilNext`) VALUES +(26893, 1, 0, 15064, 0), +(26893, 2, 0, 3397, 0), +(26893, 3, 0, 4472, 0), +(26893, 4, 0, 23930, 0), +(26893, 5, 0, 24026, 0); + +DELETE FROM `script_spline_chain_waypoints` WHERE `entry`=26893; +INSERT INTO `script_spline_chain_waypoints` (`entry`,`chainId`,`splineId`,`wpId`,`x`,`y`,`z`) VALUES +(26893, 1, 0, 0, 341.74110, -516.95450, 104.66950), -- INITIAL +(26893, 1, 0, 1, 310.21650, -510.53020, 120.54870), +(26893, 1, 0, 2, 300.86850, -520.32490, 133.36640), +(26893, 1, 0, 3, 298.34470, -529.48180, 137.28310), +(26893, 1, 0, 4, 309.09590, -540.31950, 134.97740), +(26893, 1, 0, 5, 323.64150, -547.97150, 130.31060), +(26893, 1, 0, 6, 357.07800, -549.15970, 116.31050), +(26893, 1, 0, 7, 401.25730, -550.27680, 114.92160), +(26893, 1, 0, 8, 464.50620, -555.94420, 114.44940), +(26893, 1, 0, 9, 496.19200, -556.96280, 114.86610), +(26893, 1, 0, 10, 523.20110, -548.99160, 114.86610), +(26893, 2, 0, 0, 520.48270, -541.56330, 119.84160), -- BREACH RIGHT +(26893, 2, 0, 1, 496.43400, -517.57800, 120.00000), +(26893, 3, 0, 0, 520.48270, -541.56330, 119.84160), -- BREACH LEFT +(26893, 3, 0, 1, 500.24300, -501.69300, 120.00000), +(26893, 4, 0, 0, 496.43400, -517.57800, 120.00000), -- RIGHT +(26893, 4, 0, 1, 453.12420, -517.17000, 120.02730), +(26893, 4, 0, 2, 388.33120, -514.37680, 121.11930), +(26893, 4, 0, 3, 340.27520, -512.09260, 122.31380), +(26893, 4, 0, 4, 313.07560, -509.13800, 125.17500), +(26893, 4, 0, 5, 296.69640, -522.67050, 133.70260), +(26893, 4, 0, 6, 301.29570, -549.45830, 137.42490), +(26893, 4, 0, 7, 335.07460, -552.12110, 119.84160), +(26893, 4, 0, 8, 397.62370, -553.92030, 119.84160), +(26893, 4, 0, 9, 459.63210, -558.00780, 119.84160), +(26893, 4, 0, 10, 505.54580, -568.78150, 119.84160), +(26893, 4, 0, 11, 518.09900, -560.84990, 119.84160), +(26893, 4, 0, 12, 520.48270, -541.56330, 119.84160), +(26893, 5, 0, 0, 500.24300, -501.69300, 120.00000), -- LEFT +(26893, 5, 0, 1, 451.98240, -509.25080, 120.02730), +(26893, 5, 0, 2, 399.26070, -510.07190, 121.11930), +(26893, 5, 0, 3, 350.60990, -508.39010, 122.31380), +(26893, 5, 0, 4, 325.82170, -506.77690, 125.17500), +(26893, 5, 0, 5, 301.29410, -516.67060, 133.70260), +(26893, 5, 0, 6, 301.29570, -549.45830, 137.42490), +(26893, 5, 0, 7, 335.07460, -552.12110, 119.84160), +(26893, 5, 0, 8, 397.62370, -553.92030, 119.84160), +(26893, 5, 0, 9, 459.63210, -558.00780, 119.84160), +(26893, 5, 0, 10, 505.54580, -568.78150, 119.84160), +(26893, 5, 0, 11, 518.09900, -560.84990, 119.84160), +(26893, 5, 0, 12, 520.48270, -541.56330, 119.84160); 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; } |