diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Northrend/Ulduar/ulduar/boss_xt002.cpp | 163 |
1 files changed, 146 insertions, 17 deletions
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/boss_xt002.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/boss_xt002.cpp index ada8261e9ad..b41a825d276 100644 --- a/src/server/scripts/Northrend/Ulduar/ulduar/boss_xt002.cpp +++ b/src/server/scripts/Northrend/Ulduar/ulduar/boss_xt002.cpp @@ -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(); } |