Scripts/Ulduar: Fixed some various bugs with XT-002 Deconstructor.

He will now properly reset if he evades while being submerged.
He will not always die directly after heart phase.
Adds will now despawn on reset.
Heart will now change seat and set unit flags properly, but is still not attackable by melee (seems like a vehicle flag bug)
This commit is contained in:
kaelima
2012-06-05 20:44:30 +02:00
parent 295b1a00c8
commit 8c841d12b3
@@ -170,7 +170,11 @@ enum AchievementCredits
ACHIEV_MUST_DECONSTRUCT_FASTER = 21027,
};
#define HEART_VEHICLE_SEAT 0
enum VehicleSeats
{
HEART_VEHICLE_SEAT_NORMAL = 0,
HEART_VEHICLE_SEAT_EXPOSED = 1,
};
/*-------------------------------------------------------
*
@@ -198,6 +202,8 @@ class boss_xt002 : public CreatureScript
_Reset();
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetReactState(REACT_AGGRESSIVE);
DoCast(me, SPELL_STAND);
_healthRecovered = false;
_gravityBombCasualty = false;
@@ -356,15 +362,16 @@ class boss_xt002 : public CreatureScript
me->AttackStop();
me->SetReactState(REACT_PASSIVE);
Unit* heart = me->GetVehicleKit() ? me->GetVehicleKit()->GetPassenger(HEART_VEHICLE_SEAT) : NULL;
Unit* heart = me->GetVehicleKit() ? me->GetVehicleKit()->GetPassenger(HEART_VEHICLE_SEAT_NORMAL) : NULL;
if (heart)
{
heart->CastSpell(heart, SPELL_HEART_OVERLOAD, false);
heart->CastSpell(me, SPELL_HEART_LIGHTNING_TETHER, false);
heart->CastSpell(heart, SPELL_HEART_HEAL_TO_FULL, true);
heart->CastSpell(heart, SPELL_EXPOSED_HEART, false); // Channeled
heart->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
heart->ChangeSeat(HEART_VEHICLE_SEAT_EXPOSED, true);
heart->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
heart->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29);
}
events.CancelEvent(EVENT_SEARING_LIGHT);
@@ -392,11 +399,13 @@ class boss_xt002 : public CreatureScript
events.RescheduleEvent(EVENT_GRAVITY_BOMB, TIMER_GRAVITY_BOMB);
events.RescheduleEvent(EVENT_TYMPANIC_TANTRUM, urand(TIMER_TYMPANIC_TANTRUM_MIN, TIMER_TYMPANIC_TANTRUM_MAX));
Unit* heart = me->GetVehicleKit() ? me->GetVehicleKit()->GetPassenger(HEART_VEHICLE_SEAT) : NULL;
Unit* heart = me->GetVehicleKit() ? me->GetVehicleKit()->GetPassenger(HEART_VEHICLE_SEAT_EXPOSED) : NULL;
if (!heart)
return;
heart->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
heart->ChangeSeat(HEART_VEHICLE_SEAT_NORMAL, false);
heart->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
heart->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29);
heart->RemoveAurasDueToSpell(SPELL_EXPOSED_HEART);
if (!_hardMode)
@@ -425,43 +434,39 @@ class boss_xt002 : public CreatureScript
* XT-002 HEART
*
*///----------------------------------------------------
class mob_xt002_heart : public CreatureScript
{
public:
mob_xt002_heart() : CreatureScript("mob_xt002_heart") { }
CreatureAI* GetAI(Creature* creature) const
struct mob_xt002_heartAI : public Scripted_NoMovementAI
{
mob_xt002_heartAI(Creature* creature) : Scripted_NoMovementAI(creature),
_instance(creature->GetInstanceScript())
{
return new mob_xt002_heartAI(creature);
}
struct mob_xt002_heartAI : public ScriptedAI
{
mob_xt002_heartAI(Creature* creature) : ScriptedAI(creature)
{
_instance = creature->GetInstanceScript();
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_STUNNED | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
me->SetReactState(REACT_PASSIVE);
}
void UpdateAI(uint32 const /*diff*/) { }
void DamageTaken(Unit* /*pDone*/, uint32 &damage)
void JustDied(Unit* /*killer*/)
{
Creature* xt002 = me->GetCreature(*me, _instance->GetData64(BOSS_XT002));
Creature* xt002 = _instance ? me->GetCreature(*me, _instance->GetData64(BOSS_XT002)) : NULL;
if (!xt002 || !xt002->AI())
return;
if (damage >= me->GetHealth())
{
xt002->AI()->SetData(DATA_TRANSFERED_HEALTH, me->GetMaxHealth());
xt002->AI()->SetData(DATA_TRANSFERED_HEALTH, me->GetHealth());
xt002->AI()->DoAction(ACTION_ENTER_HARD_MODE);
damage = 0;
}
}
private:
InstanceScript* _instance;
uint32 _damageTaken;
};
CreatureAI* GetAI(Creature* creature) const
{
return new mob_xt002_heartAI(creature);
}
};
/*-------------------------------------------------------
@@ -915,7 +920,7 @@ class spell_xt002_heart_overload_periodic : public SpellScriptLoader
{
uint8 a = urand(0, 4);
uint32 spellId = spells[a];
toyPile->CastSpell(toyPile, spellId, true);
toyPile->CastSpell(toyPile, spellId, true, NULL, NULL, instance->GetData64(BOSS_XT002));
}
}
}