Scripts/Ulduar/XT-002:

- Implement achievement Nerf Engineering
- Implement achievement Nerf Gravity Bombs
- Implement achievement Heartbreaker
- Boombot's shouldn't melee
- Call BossAI::Reset in XT002::Reset, fixes some timer issues
This commit is contained in:
Machiavelli
2011-06-10 18:24:16 +02:00
parent bf73940249
commit 680798a11d
3 changed files with 181 additions and 19 deletions

View File

@@ -2210,8 +2210,10 @@ INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
( 62274, 'spell_shield_of_runes'),
( 63018, 'spell_xt002_searing_light_spawn_life_spark'),
( 65121, 'spell_xt002_searing_light_spawn_life_spark'),
( 64234, 'spell_xt002_gravity_bomb_spawn_void_zone'),
( 63024, 'spell_xt002_gravity_bomb_spawn_void_zone'),
( 64234, 'spell_xt002_gravity_bomb_aura'),
( 63024, 'spell_xt002_gravity_bomb_aura'),
( 64233, 'spell_xt002_gravity_bomb_damage'),
( 63025, 'spell_xt002_gravity_bomb_damage'),
( 62791, 'spell_xt002_heart_overload_periodic'),
( 62775, 'spell_xt002_tympanic_tantrum'),
( 37751, 'spell_xt002_submerged'),

View File

@@ -0,0 +1,31 @@
-- Delete disabled achievements
DELETE FROM `disables` WHERE `sourceType`=4 AND `entry` IN(10074,10075,10220,10221,10077,10079);
DELETE FROM `achievement_criteria_data` WHERE `criteria_id` IN(10074,10075,10220,10221,10077,10079);
INSERT INTO `achievement_criteria_data` (`criteria_id`,`type`,`value1`,`ScriptName`) VALUES
-- Nerf Engineering 10m
(10074,11,0,'achievement_nerf_engineering'),
(10074,12,0,''),
-- Nerf Engineering 25m
(10075,11,0,'achievement_nerf_engineering'),
(10075,12,1,''),
-- Heartbreaker 10m
(10221,11,0,'achievement_heartbreaker'),
(10221,12,0,''),
-- Heartbreaker 25m
(10220,11,0,'achievement_heartbreaker'),
(10220,12,1,''),
-- Nerf Gravity Bombs 10m
(10077,11,0,'achievement_nerf_gravity_bombs'),
(10077,12,0,''),
-- Nerf Gravity Bombs 25m
(10079,11,0,'achievement_nerf_gravity_bombs'),
(10079,12,1,'');
DELETE FROM `spell_script_names` WHERE `spell_id` IN(64233,63025);
INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
(64233,'spell_xt002_gravity_bomb_damage'),
(63025,'spell_xt002_gravity_bomb_damage');
-- Better naming for changed script with new functionality
UPDATE `spell_script_names` SET `ScriptName`='spell_xt002_gravity_bomb_aura' WHERE `spell_id` IN(64234,63024)

View File

@@ -179,7 +179,7 @@ class boss_xt002 : public CreatureScript
CreatureAI* GetAI(Creature* pCreature) const
{
return GetUlduarAI<boss_xt002_AI>(pCreature);
return GetUlduarAI<boss_xt002_AI>(pCreature);
}
struct boss_xt002_AI : public BossAI
@@ -188,18 +188,28 @@ class boss_xt002 : public CreatureScript
{
}
// Achievement related
bool HealthRecovered; // Did a scrapbot recover XT-002's health during the encounter?
bool HardMode; // Are we in hard mode? Or: was the heart killed during phase 2?
bool GravityBombCasualty; // Did someone die because of Gravity Bomb damage?
uint8 _phase;
uint8 _heartExposed;
uint32 transferHealth;
bool enterHardMode;
bool hardMode;
void Reset()
{
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NOT_SELECTABLE);
_Reset();
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
HealthRecovered = false;
GravityBombCasualty = false;
HardMode = false;
hardMode = false;
enterHardMode = false;
_phase = 1;
@@ -233,9 +243,9 @@ class boss_xt002 : public CreatureScript
switch (action)
{
case ACTION_ENTER_HARD_MODE:
if (!hardMode)
if (!HardMode)
{
hardMode = true;
HardMode = true;
// Enter hard mode
enterHardMode = true;
@@ -276,7 +286,7 @@ class boss_xt002 : public CreatureScript
void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/)
{
if (!hardMode && _phase == 1 && !HealthAbovePct(100 - 25 * (_heartExposed+1)))
if (!HardMode && _phase == 1 && !HealthAbovePct(100 - 25 * (_heartExposed+1)))
ExposeHeart();
}
@@ -331,6 +341,12 @@ class boss_xt002 : public CreatureScript
DoMeleeAttackIfReady();
}
void PassengerBoarded(Unit* who, int8 /*seatId*/, bool apply)
{
if (apply && who->GetEntry() == NPC_XS013_SCRAPBOT)
HealthRecovered = true;
}
void ExposeHeart()
{
//Make untargetable
@@ -385,7 +401,7 @@ class boss_xt002 : public CreatureScript
heart->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
heart->RemoveAurasDueToSpell(SPELL_EXPOSED_HEART);
if (!hardMode)
if (!HardMode)
{
if (!transferHealth)
transferHealth = (heart->GetMaxHealth() - heart->GetHealth());
@@ -396,6 +412,7 @@ class boss_xt002 : public CreatureScript
};
};
typedef boss_xt002::boss_xt002_AI XT002AI;
/*-------------------------------------------------------
*
@@ -653,11 +670,19 @@ class mob_boombot : public CreatureScript
// Casting done from player and caster source has the same targetinfo flags,
// so that can't be the issue
// See InstantKillEvent class
// Schedule 1ms delayed
// Schedule 1s delayed
me->m_Events.AddEvent(new BoomEvent(me), me->m_Events.CalculateTime(1*IN_MILLISECONDS));
}
}
void UpdateAI(uint32 const diff)
{
if (!UpdateVictim())
return;
// No melee attack
}
private:
InstanceScript* _instance;
bool _boomed;
@@ -683,7 +708,7 @@ public:
struct mob_life_sparkAI : public ScriptedAI
{
mob_life_sparkAI(Creature* pCreature) : ScriptedAI(pCreature)
{
{
m_pInstance = pCreature->GetInstanceScript();
}
@@ -751,14 +776,14 @@ class spell_xt002_searing_light_spawn_life_spark : public SpellScriptLoader
}
};
class spell_xt002_gravity_bomb_spawn_void_zone : public SpellScriptLoader
class spell_xt002_gravity_bomb_aura : public SpellScriptLoader
{
public:
spell_xt002_gravity_bomb_spawn_void_zone() : SpellScriptLoader("spell_xt002_gravity_bomb_spawn_void_zone") { }
spell_xt002_gravity_bomb_aura() : SpellScriptLoader("spell_xt002_gravity_bomb_aura") { }
class spell_xt002_gravity_bomb_spawn_void_zone_AuraScript : public AuraScript
class spell_xt002_gravity_bomb_aura_AuraScript : public AuraScript
{
PrepareAuraScript(spell_xt002_gravity_bomb_spawn_void_zone_AuraScript);
PrepareAuraScript(spell_xt002_gravity_bomb_aura_AuraScript);
bool Validate(SpellEntry const* /*spell*/)
{
@@ -775,15 +800,63 @@ class spell_xt002_gravity_bomb_spawn_void_zone : public SpellScriptLoader
plr->CastSpell(plr, SPELL_SUMMON_VOID_ZONE, true);
}
void OnPeriodic(AuraEffect const* aurEff)
{
Unit* xt002 = GetCaster();
if (!xt002)
return;
Unit* owner = GetOwner()->ToUnit();
if (!owner)
return;
if (aurEff->GetAmount() >= owner->GetHealth())
if (XT002AI* xt002AI = CAST_AI(XT002AI, xt002->GetAI()))
xt002AI->GravityBombCasualty = true;
}
void Register()
{
AfterEffectRemove += AuraEffectRemoveFn(spell_xt002_gravity_bomb_spawn_void_zone_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
OnEffectPeriodic += AuraEffectPeriodicFn(spell_xt002_gravity_bomb_aura_AuraScript::OnPeriodic, EFFECT_2, SPELL_AURA_PERIODIC_DAMAGE);
AfterEffectRemove += AuraEffectRemoveFn(spell_xt002_gravity_bomb_aura_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
}
};
AuraScript* GetAuraScript() const
{
return new spell_xt002_gravity_bomb_spawn_void_zone_AuraScript();
return new spell_xt002_gravity_bomb_aura_AuraScript();
}
};
class spell_xt002_gravity_bomb_damage : public SpellScriptLoader
{
public:
spell_xt002_gravity_bomb_damage() : SpellScriptLoader("spell_xt002_gravity_bomb_damage") { }
class spell_xt002_gravity_bomb_damage_SpellScript : public SpellScript
{
PrepareSpellScript(spell_xt002_gravity_bomb_damage_SpellScript);
void HandleScript(SpellEffIndex /*eff*/)
{
Unit* caster = GetCaster();
if (!caster)
return;
if (GetHitDamage() >= GetHitUnit()->GetHealth())
if (XT002AI* xt002AI = CAST_AI(XT002AI, GetCaster()->GetAI()))
xt002AI->GravityBombCasualty = true;
}
void Register()
{
OnEffect += SpellEffectFn(spell_xt002_gravity_bomb_damage_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
}
};
SpellScript* GetSpellScript() const
{
return new spell_xt002_gravity_bomb_damage_SpellScript();
}
};
@@ -955,6 +1028,57 @@ class spell_xt002_stand : public SpellScriptLoader
}
};
class achievement_nerf_engineering : public AchievementCriteriaScript
{
public:
achievement_nerf_engineering() : AchievementCriteriaScript("achievement_nerf_engineering") { }
bool OnCheck(Player* /*source*/, Unit* target)
{
if (!target)
return false;
if (XT002AI* xt002AI = CAST_AI(XT002AI, target->GetAI()))
return !xt002AI->HealthRecovered;
return false;
}
};
class achievement_heartbreaker : public AchievementCriteriaScript
{
public:
achievement_heartbreaker() : AchievementCriteriaScript("achievement_heartbreaker") { }
bool OnCheck(Player* /*source*/, Unit* target)
{
if (!target)
return false;
if (XT002AI* xt002AI = CAST_AI(XT002AI, target->GetAI()))
return xt002AI->HardMode;
return false;
}
};
class achievement_nerf_gravity_bombs : public AchievementCriteriaScript
{
public:
achievement_nerf_gravity_bombs() : AchievementCriteriaScript("achievement_nerf_gravity_bombs") { }
bool OnCheck(Player* source, Unit* target)
{
if (!target)
return false;
if (XT002AI* xt002AI = CAST_AI(XT002AI, target->GetAI()))
return !xt002AI->GravityBombCasualty;
return false;
}
};
void AddSC_boss_xt002()
{
new mob_xt002_heart();
@@ -966,9 +1090,14 @@ void AddSC_boss_xt002()
new boss_xt002();
new spell_xt002_searing_light_spawn_life_spark();
new spell_xt002_gravity_bomb_spawn_void_zone();
new spell_xt002_gravity_bomb_aura();
new spell_xt002_gravity_bomb_damage();
new spell_xt002_heart_overload_periodic();
new spell_xt002_tympanic_tantrum();
new spell_xt002_submerged();
new spell_xt002_stand();
new achievement_nerf_engineering();
new achievement_heartbreaker();
new achievement_nerf_gravity_bombs();
}