aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/scripts/world_scripts_full.sql6
-rw-r--r--sql/updates/world/2011_06_10_02_world_misc.sql31
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/boss_xt002.cpp163
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();
}