fix(Scripts/BlackTemple): Gurtogg Bloodboil shouldnt cast bloodboil o… (#19886)

fix(Scripts/BlackTemple): Gurtogg Bloodboil shouldnt cast bloodboil on phase 2 and shouldnt chase immune targets
This commit is contained in:
Andrew
2024-09-07 07:05:43 -03:00
committed by GitHub
parent dc4c874206
commit 7eee1345d0
@@ -65,127 +65,110 @@ enum Misc
GROUP_DELAY = 1 GROUP_DELAY = 1
}; };
class boss_gurtogg_bloodboil : public CreatureScript struct boss_gurtogg_bloodboil : public BossAI
{ {
public: boss_gurtogg_bloodboil(Creature* creature) : BossAI(creature, DATA_GURTOGG_BLOODBOIL), _recentlySpoken(false) { }
boss_gurtogg_bloodboil() : CreatureScript("boss_gurtogg_bloodboil") { }
CreatureAI* GetAI(Creature* creature) const override void Reset() override
{ {
return GetBlackTempleAI<boss_gurtogg_bloodboilAI>(creature); BossAI::Reset();
_recentlySpoken = false;
} }
struct boss_gurtogg_bloodboilAI : public BossAI void JustEngagedWith(Unit* who) override
{ {
boss_gurtogg_bloodboilAI(Creature* creature) : BossAI(creature, DATA_GURTOGG_BLOODBOIL), _recentlySpoken(false) { } BossAI::JustEngagedWith(who);
Talk(SAY_AGGRO);
void Reset() override DoCastSelf(SPELL_ACIDIC_WOUND, true);
{
BossAI::Reset();
_recentlySpoken = false;
}
void JustEngagedWith(Unit* who) override ScheduleTimedEvent(10s, [&] {
{ if (!me->HasAura(SPELL_FEL_RAGE_SELF))
BossAI::JustEngagedWith(who);
Talk(SAY_AGGRO);
DoCastSelf(SPELL_ACIDIC_WOUND, true);
ScheduleTimedEvent(10s, [&] {
me->CastCustomSpell(SPELL_BLOODBOIL, SPELLVALUE_MAX_TARGETS, 5, me, false); me->CastCustomSpell(SPELL_BLOODBOIL, SPELLVALUE_MAX_TARGETS, 5, me, false);
}, 10s); }, 10s);
ScheduleTimedEvent(38s, [&] { ScheduleTimedEvent(38s, [&] {
DoCastVictim(me->HasAura(SPELL_FEL_RAGE_SELF) ? SPELL_FEL_ACID_BREATH2 : SPELL_FEL_ACID_BREATH1); DoCastVictim(me->HasAura(SPELL_FEL_RAGE_SELF) ? SPELL_FEL_ACID_BREATH2 : SPELL_FEL_ACID_BREATH1);
}, 30s); }, 30s);
ScheduleTimedEvent(14s, [&] { ScheduleTimedEvent(14s, [&] {
DoCastVictim(me->HasAura(SPELL_FEL_RAGE_SELF) ? SPELL_EJECT2 : SPELL_EJECT1); DoCastVictim(me->HasAura(SPELL_FEL_RAGE_SELF) ? SPELL_EJECT2 : SPELL_EJECT1);
}, 20s); }, 20s);
ScheduleTimedEvent(5s, [&] { ScheduleTimedEvent(5s, [&] {
DoCastVictim(me->HasAura(SPELL_FEL_RAGE_SELF) ? SPELL_ARCING_SMASH2 : SPELL_ARCING_SMASH1); DoCastVictim(me->HasAura(SPELL_FEL_RAGE_SELF) ? SPELL_ARCING_SMASH2 : SPELL_ARCING_SMASH1);
}, 15s); }, 15s);
ScheduleTimedEvent(1min, [&] { ScheduleTimedEvent(1min, [&] {
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 40.0f, true)) if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 40.0f, true))
{
me->RemoveAurasByType(SPELL_AURA_MOD_TAUNT);
DoCastSelf(SPELL_FEL_RAGE_SELF, true);
DoCast(target, SPELL_FEL_RAGE_TARGET, true);
DoCast(target, SPELL_FEL_RAGE_2, true);
DoCast(target, SPELL_FEL_RAGE_3, true);
DoCast(target, SPELL_FEL_RAGE_SIZE, true);
target->CastSpell(me, SPELL_TAUNT_GURTOGG, true);
DoCast(target, SPELL_FEL_GEYSER_SUMMON, true);
DoCastSelf(SPELL_FEL_GEYSER_STUN, true);
DoCastSelf(SPELL_INSIGNIFICANCE, true);
me->m_Events.AddEventAtOffset([&] {
DoCastVictim(SPELL_CHARGE);
}, 2s);
scheduler.DelayGroup(GROUP_DELAY, 30s);
}
}, 90s);
ScheduleUniqueTimedEvent(10min, [&] {
Talk(SAY_ENRAGE);
DoCastSelf(SPELL_BERSERK, true);
}, EVENT_SPELL_BERSERK);
scheduler.Schedule(28s, [this](TaskContext context) {
context.SetGroup(GROUP_DELAY);
DoCastVictim(SPELL_BEWILDERING_STRIKE);
context.Repeat(30s);
});
}
void KilledUnit(Unit* /*victim*/) override
{
if (!_recentlySpoken)
{ {
Talk(SAY_SLAY); me->RemoveAurasByType(SPELL_AURA_MOD_TAUNT);
DoCastSelf(SPELL_FEL_RAGE_SELF, true);
DoCast(target, SPELL_FEL_RAGE_TARGET, true);
DoCast(target, SPELL_FEL_RAGE_2, true);
DoCast(target, SPELL_FEL_RAGE_3, true);
DoCast(target, SPELL_FEL_RAGE_SIZE, true);
target->CastSpell(me, SPELL_TAUNT_GURTOGG, true);
DoCast(target, SPELL_FEL_GEYSER_SUMMON, true);
DoCastSelf(SPELL_FEL_GEYSER_STUN, true);
DoCastSelf(SPELL_INSIGNIFICANCE, true);
me->m_Events.AddEventAtOffset([&] { me->m_Events.AddEventAtOffset([&] {
_recentlySpoken = false; DoCastVictim(SPELL_CHARGE);
}, 6s); }, 2s);
scheduler.DelayGroup(GROUP_DELAY, 30s);
} }
} }, 90s);
void JustSummoned(Creature* summon) override ScheduleUniqueTimedEvent(10min, [&] {
Talk(SAY_ENRAGE);
DoCastSelf(SPELL_BERSERK, true);
}, EVENT_SPELL_BERSERK);
scheduler.Schedule(28s, [this](TaskContext context) {
context.SetGroup(GROUP_DELAY);
DoCastVictim(SPELL_BEWILDERING_STRIKE);
context.Repeat(30s);
});
}
bool CanAIAttack(Unit const* who) const override
{
return !who->IsImmunedToDamage(SPELL_SCHOOL_MASK_ALL);
}
void KilledUnit(Unit* /*victim*/) override
{
if (!_recentlySpoken)
{ {
summons.Summon(summon); Talk(SAY_SLAY);
summon->CastSpell(summon, SPELL_FEL_GEYSER_DAMAGE, false); me->m_Events.AddEventAtOffset([&] {
_recentlySpoken = false;
}, 6s);
} }
}
void JustDied(Unit* killer) override void JustSummoned(Creature* summon) override
{ {
BossAI::JustDied(killer); summons.Summon(summon);
Talk(SAY_DEATH); summon->CastSpell(summon, SPELL_FEL_GEYSER_DAMAGE, false);
} }
void UpdateAI(uint32 diff) override void JustDied(Unit* killer) override
{ {
if (!UpdateVictim()) BossAI::JustDied(killer);
return; Talk(SAY_DEATH);
}
scheduler.Update(diff); bool CheckEvadeIfOutOfCombatArea() const override
if (me->HasUnitState(UNIT_STATE_CASTING)) {
return; return me->GetHomePosition().GetExactDist2d(me) > 105.0f;
}
DoMeleeAttackIfReady(); private:
} bool _recentlySpoken;
bool CheckEvadeIfOutOfCombatArea() const override
{
return me->GetHomePosition().GetExactDist2d(me) > 105.0f;
}
private:
bool _recentlySpoken;
};
}; };
class spell_gurtogg_bloodboil : public SpellScript class spell_gurtogg_bloodboil : public SpellScript
@@ -231,7 +214,7 @@ class spell_gurtogg_eject : public SpellScript
void AddSC_boss_gurtogg_bloodboil() void AddSC_boss_gurtogg_bloodboil()
{ {
new boss_gurtogg_bloodboil(); RegisterBlackTempleCreatureAI(boss_gurtogg_bloodboil);
RegisterSpellScript(spell_gurtogg_bloodboil); RegisterSpellScript(spell_gurtogg_bloodboil);
RegisterSpellScript(spell_gurtogg_eject); RegisterSpellScript(spell_gurtogg_eject);
} }