aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/scripts/world_scripts_full.sql2
-rw-r--r--sql/updates/world/2011_06_09_03_world_spell_script_names.sql5
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/boss_xt002.cpp220
3 files changed, 143 insertions, 84 deletions
diff --git a/sql/scripts/world_scripts_full.sql b/sql/scripts/world_scripts_full.sql
index ef916b5e4ef..bcb6f02dc02 100644
--- a/sql/scripts/world_scripts_full.sql
+++ b/sql/scripts/world_scripts_full.sql
@@ -2214,6 +2214,8 @@ INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
( 63024, 'spell_xt002_gravity_bomb_spawn_void_zone'),
( 62791, 'spell_xt002_heart_overload_periodic'),
( 62775, 'spell_xt002_tympanic_tantrum'),
+( 37751, 'spell_xt002_submerged'),
+( 37752, 'spell_xt002_stand'),
-- Eye Of Eternity
( 56105, 'spell_malygos_vortex_dummy'),
( 55873, 'spell_malygos_vortex_visual'),
diff --git a/sql/updates/world/2011_06_09_03_world_spell_script_names.sql b/sql/updates/world/2011_06_09_03_world_spell_script_names.sql
new file mode 100644
index 00000000000..1ce1d7a9fb2
--- /dev/null
+++ b/sql/updates/world/2011_06_09_03_world_spell_script_names.sql
@@ -0,0 +1,5 @@
+DELETE FROM `spell_scripts` WHERE `id` IN(37751,37752); -- Remove redundant data from spell_scripts
+DELETE FROM `spell_script_names` WHERE `spell_id` IN(37751,37752);
+INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
+(37751,'spell_xt002_submerged'),
+(37752,'spell_xt002_stand');
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();
}