Scripts/Ulduar/XT-002:

- Fix phase transition submerge/stand visuals
- Further cleanup and minor fixing
This commit is contained in:
Machiavelli
2011-06-09 17:52:34 +02:00
parent cdb296d6d7
commit c0bc829376
3 changed files with 144 additions and 85 deletions
@@ -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));
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_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;
}
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") { }
public:
mob_boombot() : CreatureScript("mob_boombot") { }
CreatureAI* GetAI(Creature* pCreature) const
{
return new mob_boombotAI(pCreature);
}
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;
DoCast(SPELL_AURA_BOOMBOT); // For achievement
if (Creature* pXT002 = me->GetCreature(*me, _instance->GetData64(BOSS_XT002)))
me->GetMotionMaster()->MoveFollow(pXT002, 0.0f, 0.0f);
}
void DamageTaken(Unit* /*who*/, uint32& damage)
{
if (damage >= me->GetHealth() && !_boomed)
mob_boombotAI(Creature* pCreature) : ScriptedAI(pCreature)
{
_boomed = true; // Prevent recursive calls
DoCast(SPELL_BOOM); //TODO: Figure out why visual doesn't always work like it should
damage = 0;
_instance = pCreature->GetInstanceScript();
}
}
private:
InstanceScript* _instance;
bool _boomed;
};
void Reset()
{
_boomed = false;
DoCast(SPELL_AURA_BOOMBOT); // For achievement
if (Creature* pXT002 = me->GetCreature(*me, _instance->GetData64(BOSS_XT002)))
me->GetMotionMaster()->MoveFollow(pXT002, 0.0f, 0.0f);
}
void DamageTaken(Unit* /*who*/, uint32& damage)
{
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;
};
};
@@ -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();
}