diff options
author | Machiavelli <machiavelli.trinity@gmail.com> | 2011-06-10 18:24:16 +0200 |
---|---|---|
committer | Machiavelli <machiavelli.trinity@gmail.com> | 2011-06-10 18:24:16 +0200 |
commit | 680798a11d48e9da51bf4a7eb31503bb450a502f (patch) | |
tree | b37ec55bebc494328247e5ce7dd4c9ff13144af4 | |
parent | bf739402491d7f18f902543fab53d0299eb35cee (diff) |
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
-rw-r--r-- | sql/scripts/world_scripts_full.sql | 6 | ||||
-rw-r--r-- | sql/updates/world/2011_06_10_02_world_misc.sql | 31 | ||||
-rw-r--r-- | src/server/scripts/Northrend/Ulduar/ulduar/boss_xt002.cpp | 163 |
3 files changed, 181 insertions, 19 deletions
diff --git a/sql/scripts/world_scripts_full.sql b/sql/scripts/world_scripts_full.sql index bcb6f02dc02..84776a121b2 100644 --- a/sql/scripts/world_scripts_full.sql +++ b/sql/scripts/world_scripts_full.sql @@ -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'), diff --git a/sql/updates/world/2011_06_10_02_world_misc.sql b/sql/updates/world/2011_06_10_02_world_misc.sql new file mode 100644 index 00000000000..af07fab967a --- /dev/null +++ b/sql/updates/world/2011_06_10_02_world_misc.sql @@ -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)
\ No newline at end of file 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(); } |