diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Northrend/Ulduar/ulduar/boss_xt002.cpp | 220 |
1 files changed, 136 insertions, 84 deletions
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/boss_xt002.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/boss_xt002.cpp index 5f45c16d27a..e913888f078 100644 --- a/src/server/scripts/Northrend/Ulduar/ulduar/boss_xt002.cpp +++ b/src/server/scripts/Northrend/Ulduar/ulduar/boss_xt002.cpp @@ -167,9 +167,9 @@ enum Yells SAY_SUMMON = -1603308, }; -enum +enum AchievementCredits { - ACHIEV_TIMED_START_EVENT = 21027, + ACHIEV_MUST_DECONSTRUCT_FASTER = 21027, }; #define HEART_VEHICLE_SEAT 0 @@ -215,7 +215,7 @@ class boss_xt002 : public CreatureScript if (!instance) return; - instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); + instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_MUST_DECONSTRUCT_FASTER); } void EnterCombat(Unit* /*who*/) @@ -229,8 +229,10 @@ class boss_xt002 : public CreatureScript //Tantrum is casted a bit slower the first time. events.ScheduleEvent(EVENT_TYMPANIC_TANTRUM, urand(TIMER_TYMPANIC_TANTRUM_MIN, TIMER_TYMPANIC_TANTRUM_MAX) * 2); - if (instance) - instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); + if (!instance) + return; + + instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_MUST_DECONSTRUCT_FASTER); } void DoAction(const int32 action) @@ -287,7 +289,7 @@ class boss_xt002 : public CreatureScript void UpdateAI(const uint32 diff) { - if (_phase == 1 && !UpdateVictim()) + if (!UpdateVictim()) return; events.Update(diff); @@ -301,61 +303,48 @@ class boss_xt002 : public CreatureScript if (me->HasUnitState(UNIT_STAT_CASTING)) return; - // Handles spell casting. These spells only occur during phase 1 and hard mode - if (_phase == 1) + while (uint32 eventId = events.ExecuteEvent()) { - while (uint32 eventId = events.ExecuteEvent()) + switch (eventId) { - switch (eventId) - { - case EVENT_SEARING_LIGHT: - if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(pTarget, RAID_MODE(SPELL_SEARING_LIGHT_10, SPELL_SEARING_LIGHT_25)); - - events.RepeatEvent(TIMER_SEARING_LIGHT); - break; - case EVENT_GRAVITY_BOMB: - if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(pTarget, RAID_MODE(SPELL_GRAVITY_BOMB_10, SPELL_GRAVITY_BOMB_25)); - - events.RepeatEvent(TIMER_GRAVITY_BOMB); - break; - case EVENT_TYMPANIC_TANTRUM: - DoScriptText(SAY_TYMPANIC_TANTRUM, me); - DoCast(SPELL_TYMPANIC_TANTRUM); - events.RepeatEvent(urand(TIMER_TYMPANIC_TANTRUM_MIN, TIMER_TYMPANIC_TANTRUM_MAX)); - break; - case EVENT_ENRAGE: - DoScriptText(SAY_BERSERK, me); - DoCast(me, SPELL_ENRAGE); - break; - } + case EVENT_SEARING_LIGHT: + if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0)) + DoCast(pTarget, RAID_MODE(SPELL_SEARING_LIGHT_10, SPELL_SEARING_LIGHT_25)); + + events.RepeatEvent(TIMER_SEARING_LIGHT); + break; + case EVENT_GRAVITY_BOMB: + if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0)) + DoCast(pTarget, RAID_MODE(SPELL_GRAVITY_BOMB_10, SPELL_GRAVITY_BOMB_25)); + + events.RepeatEvent(TIMER_GRAVITY_BOMB); + break; + case EVENT_TYMPANIC_TANTRUM: + DoScriptText(SAY_TYMPANIC_TANTRUM, me); + DoCast(SPELL_TYMPANIC_TANTRUM); + events.RepeatEvent(urand(TIMER_TYMPANIC_TANTRUM_MIN, TIMER_TYMPANIC_TANTRUM_MAX)); + break; + case EVENT_DISPOSE_HEART: + SetPhaseOne(); + break; + case EVENT_ENRAGE: + DoScriptText(SAY_BERSERK, me); + DoCast(me, SPELL_ENRAGE); + break; } + } + if (_phase == 1) DoMeleeAttackIfReady(); - } - else if (_phase == 2) - { - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - case EVENT_DISPOSE_HEART: - SetPhaseOne(); - break; - } - } } void ExposeHeart() { //Make untargetable - //me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_STUNNED); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_6 | UNIT_FLAG_PET_IN_COMBAT | UNIT_FLAG_UNK_15 | UNIT_FLAG_IN_COMBAT | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_STUNNED); - - //DoCast(SPELL_SUBMERGE); -- Need proper kneel dummy + DoCast(SPELL_SUBMERGE); // WIll make creature untargetable + me->AttackStop(); me->SetReactState(REACT_PASSIVE); - me->AddUnitState(UNIT_STAT_STUNNED); - + Unit* heart = me->GetVehicleKit() ? me->GetVehicleKit()->GetPassenger(HEART_VEHICLE_SEAT) : NULL; if (heart) { @@ -364,12 +353,15 @@ class boss_xt002 : public CreatureScript heart->CastSpell(heart, SPELL_HEART_HEAL_TO_FULL, true); heart->CastSpell(heart, SPELL_EXPOSED_HEART, false); // Channeled - //heart->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE); - heart->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PET_IN_COMBAT | UNIT_FLAG_UNK_15 | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_UNK_29); + //heart->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PET_IN_COMBAT | UNIT_FLAG_UNK_15 | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_UNK_29); heart->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); } + events.CancelEvent(EVENT_SEARING_LIGHT); + events.CancelEvent(EVENT_GRAVITY_BOMB); + events.CancelEvent(EVENT_TYMPANIC_TANTRUM); + // Start "end of phase 2 timer" events.ScheduleEvent(EVENT_DISPOSE_HEART, TIMER_HEART_PHASE); @@ -383,12 +375,9 @@ class boss_xt002 : public CreatureScript void SetPhaseOne() { DoScriptText(SAY_HEART_CLOSED, me); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_DISABLE_MOVE); - //DoCast(SPELL_STAND); + DoCast(SPELL_STAND); me->SetReactState(REACT_AGGRESSIVE); - //me->SetStandState(UNIT_STAND_STATE_STAND); - me->ClearUnitState(UNIT_STAT_STUNNED); _phase = 1; @@ -597,45 +586,45 @@ public: *///---------------------------------------------------- class mob_boombot : public CreatureScript { -public: - mob_boombot() : CreatureScript("mob_boombot") { } - - CreatureAI* GetAI(Creature* pCreature) const - { - return new mob_boombotAI(pCreature); - } + public: + mob_boombot() : CreatureScript("mob_boombot") { } - struct mob_boombotAI : public ScriptedAI - { - mob_boombotAI(Creature* pCreature) : ScriptedAI(pCreature) + CreatureAI* GetAI(Creature* pCreature) const { - _instance = pCreature->GetInstanceScript(); + return new mob_boombotAI(pCreature); } - void Reset() + struct mob_boombotAI : public ScriptedAI { - _boomed = false; + mob_boombotAI(Creature* pCreature) : ScriptedAI(pCreature) + { + _instance = pCreature->GetInstanceScript(); + } - DoCast(SPELL_AURA_BOOMBOT); // For achievement + void Reset() + { + _boomed = false; - if (Creature* pXT002 = me->GetCreature(*me, _instance->GetData64(BOSS_XT002))) - me->GetMotionMaster()->MoveFollow(pXT002, 0.0f, 0.0f); - } + DoCast(SPELL_AURA_BOOMBOT); // For achievement - void DamageTaken(Unit* /*who*/, uint32& damage) - { - if (damage >= me->GetHealth() && !_boomed) + if (Creature* pXT002 = me->GetCreature(*me, _instance->GetData64(BOSS_XT002))) + me->GetMotionMaster()->MoveFollow(pXT002, 0.0f, 0.0f); + } + + void DamageTaken(Unit* /*who*/, uint32& damage) { - _boomed = true; // Prevent recursive calls - DoCast(SPELL_BOOM); //TODO: Figure out why visual doesn't always work like it should - damage = 0; + if (damage >= me->GetHealth() && !_boomed) + { + _boomed = true; // Prevent recursive calls + DoCast(SPELL_BOOM); //TODO: Figure out why visual doesn't always work like it should + damage = 0; + } } - } - private: - InstanceScript* _instance; - bool _boomed; - }; + private: + InstanceScript* _instance; + bool _boomed; + }; }; @@ -867,6 +856,67 @@ class spell_xt002_tympanic_tantrum : public SpellScriptLoader } }; +class spell_xt002_submerged : public SpellScriptLoader +{ + public: + spell_xt002_submerged() : SpellScriptLoader("spell_xt002_submerged") { } + + class spell_xt002_submerged_SpellScript : public SpellScript + { + PrepareSpellScript(spell_xt002_submerged_SpellScript); + + void HandleScript(SpellEffIndex /*eff*/) + { + Unit* caster = GetCaster(); + if (!caster) + return; + + caster->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_0 | UNIT_FLAG_NOT_SELECTABLE); + caster->SetByteValue(UNIT_FIELD_BYTES_1, 0, UNIT_STAND_STATE_SUBMERGED); + } + + void Register() + { + OnEffect += SpellEffectFn(spell_xt002_submerged_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_xt002_submerged_SpellScript(); + } +}; + +class spell_xt002_stand : public SpellScriptLoader +{ + public: + spell_xt002_stand() : SpellScriptLoader("spell_xt002_stand") { } + + class spell_xt002_stand_SpellScript : public SpellScript + { + PrepareSpellScript(spell_xt002_stand_SpellScript); + + void HandleScript(SpellEffIndex /*eff*/) + { + Unit* caster = GetCaster(); + if (!caster) + return; + + caster->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_0 | UNIT_FLAG_NOT_SELECTABLE); + caster->SetByteValue(UNIT_FIELD_BYTES_1, 0, UNIT_STAND_STATE_STAND); + } + + void Register() + { + OnEffect += SpellEffectFn(spell_xt002_stand_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_xt002_stand_SpellScript(); + } +}; void AddSC_boss_xt002() { @@ -882,4 +932,6 @@ void AddSC_boss_xt002() new spell_xt002_gravity_bomb_spawn_void_zone(); new spell_xt002_heart_overload_periodic(); new spell_xt002_tympanic_tantrum(); + new spell_xt002_submerged(); + new spell_xt002_stand(); } |