mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-22 18:15:31 +01:00
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:
@@ -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'),
|
||||
|
||||
31
sql/updates/world/2011_06_10_02_world_misc.sql
Normal file
31
sql/updates/world/2011_06_10_02_world_misc.sql
Normal 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)
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user