fix(Scripts/BlackTemple): Move Supremus to TaskScheduler and tweak a bit (#19418)

* Update boss_supremus.cpp

* Update boss_supremus.cpp

* Update boss_supremus.cpp

* ble

* egh

* ye

* ermps

* ok done

* Update SpellInfoCorrections.cpp

* Update SpellInfoCorrections.cpp
This commit is contained in:
Gultask
2024-07-26 21:48:33 -03:00
committed by GitHub
parent 6609b6ac08
commit 917c34cf52
3 changed files with 140 additions and 88 deletions

View File

@@ -24,76 +24,139 @@ enum Supremus
EMOTE_NEW_TARGET = 0,
EMOTE_PUNCH_GROUND = 1,
EMOTE_GROUND_CRACK = 2,
EMOTE_BERSERK = 3,
SPELL_SNARE_SELF = 41922,
SPELL_MOLTEN_PUNCH = 40126,
SPELL_MOLTEN_FLAME = 40980,
SPELL_HATEFUL_STRIKE = 41926,
SPELL_VOLCANIC_ERUPTION = 40276,
SPELL_VOLCANIC_ERUPTION_TRIGGER = 40117,
SPELL_BERSERK = 45078,
SPELL_VOLCANIC_GEYSER = 42055,
SPELL_BERSERK = 26662,
SPELL_CHARGE = 41581,
NPC_SUPREMUS_PUNCH_STALKER = 23095,
SPELL_SERVERSIDE_RANDOM_TARGET = 41951, // Found in 55261. Used for Fixate target
EVENT_SPELL_BERSERK = 1,
EVENT_SPELL_HATEFUL_STRIKE = 2,
EVENT_SPELL_MOLTEN_FLAMES = 3,
EVENT_SWITCH_PHASE = 4,
EVENT_SPELL_VOLCANIC_ERUPTION = 5,
EVENT_SWITCH_TARGET = 6,
EVENT_CHECK_DIST = 7,
NPC_SUPREMUS_VOLCANO = 23085,
EVENT_GROUP_ABILITIES = 1
GROUP_ABILITIES = 1,
GROUP_MOLTEN_PUNCH = 2,
GROUP_PHASE_CHANGE = 3
};
struct boss_supremus : public BossAI
{
boss_supremus(Creature* creature) : BossAI(creature, DATA_SUPREMUS) { }
boss_supremus(Creature* creature) : BossAI(creature, DATA_SUPREMUS)
{
scheduler.SetValidator([this]
{
return !me->HasUnitState(UNIT_STATE_CASTING);
});
}
void Reset() override
{
BossAI::Reset();
me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, false);
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, false);
}
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
SchedulePhase(false);
events.ScheduleEvent(EVENT_SPELL_BERSERK, 900000);
events.ScheduleEvent(EVENT_SPELL_MOLTEN_FLAMES, 4000);
SchedulePhase(true);
ScheduleTimedEvent(15min, [&]
{
DoCastSelf(SPELL_BERSERK, true);
Talk(EMOTE_BERSERK);
scheduler.CancelGroup(GROUP_ABILITIES); // Supremus stops all other abilities after berserking
scheduler.CancelGroup(GROUP_MOLTEN_PUNCH);
scheduler.CancelGroup(GROUP_PHASE_CHANGE);
}, 5min);
scheduler.Schedule(20s, [this](TaskContext context)
{
context.SetGroup(GROUP_MOLTEN_PUNCH);
DoCastSelf(SPELL_MOLTEN_PUNCH);
context.Repeat(15s, 20s);
});
}
void SchedulePhase(bool run)
void SchedulePhase(bool isSnared)
{
events.CancelEventGroup(EVENT_GROUP_ABILITIES);
events.ScheduleEvent(EVENT_SWITCH_PHASE, 60000);
scheduler.CancelGroup(GROUP_ABILITIES);
scheduler.Schedule(1min, [this](TaskContext context)
{
context.SetGroup(GROUP_PHASE_CHANGE);
SchedulePhase(me->HasAura(SPELL_SNARE_SELF));
});
DoResetThreatList();
if (!run)
// Hateful Strike Phase
if (isSnared)
{
events.ScheduleEvent(EVENT_SPELL_HATEFUL_STRIKE, 5000, EVENT_GROUP_ABILITIES);
scheduler.Schedule(8s, 15s, [this](TaskContext context)
{
context.SetGroup(GROUP_ABILITIES);
if (Unit* target = FindHatefulStrikeTarget())
DoCast(target, SPELL_HATEFUL_STRIKE);
context.Repeat(1500ms, 15s);
});
if (me->HasAura(SPELL_SNARE_SELF))
Talk(EMOTE_PUNCH_GROUND);
me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, false);
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, false);
me->RemoveAurasDueToSpell(SPELL_SNARE_SELF);
}
// Gaze Phase
else
{
events.ScheduleEvent(EVENT_SPELL_VOLCANIC_ERUPTION, 5000, EVENT_GROUP_ABILITIES);
events.ScheduleEvent(EVENT_SWITCH_TARGET, 0, EVENT_GROUP_ABILITIES);
events.ScheduleEvent(EVENT_CHECK_DIST, 0, EVENT_GROUP_ABILITIES);
DoCastSelf(SPELL_SNARE_SELF, true);
scheduler.Schedule(5s, [this](TaskContext context)
{
context.SetGroup(GROUP_ABILITIES);
if (DoCastRandomTarget(SPELL_VOLCANIC_ERUPTION, 0, 100.f, true) == SPELL_CAST_OK)
Talk(EMOTE_GROUND_CRACK);
context.Repeat(10s, 18s);
}).Schedule(0s, [this](TaskContext context)
{
context.SetGroup(GROUP_ABILITIES);
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true))
{
DoResetThreatList();
me->AddThreat(target, 5000000.0f);
Talk(EMOTE_NEW_TARGET);
DoCastVictim(SPELL_CHARGE);
}
context.Repeat(10s);
});
me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true);
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, true);
me->CastSpell(me, SPELL_SNARE_SELF, true);
}
}
void JustSummoned(Creature* summon) override
{
summons.Summon(summon);
if (summon->GetEntry() == NPC_SUPREMUS_PUNCH_STALKER)
{
summon->ToTempSummon()->InitStats(20000);
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true))
summon->GetMotionMaster()->MoveFollow(target, 0.0f, 0.0f, MOTION_SLOT_CONTROLLED);
}
else
if (summon->GetEntry() == NPC_SUPREMUS_VOLCANO)
summon->CastSpell(summon, SPELL_VOLCANIC_ERUPTION_TRIGGER, true);
else
summon->ToTempSummon()->InitStats(30000);
}
void SummonedCreatureDespawn(Creature* summon) override
@@ -116,71 +179,42 @@ struct boss_supremus : public BossAI
return target;
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{
case EVENT_SPELL_BERSERK:
me->CastSpell(me, SPELL_BERSERK, true);
break;
case EVENT_SPELL_HATEFUL_STRIKE:
if (Unit* target = FindHatefulStrikeTarget())
me->CastSpell(target, SPELL_HATEFUL_STRIKE, false);
events.ScheduleEvent(EVENT_SPELL_HATEFUL_STRIKE, urand(1500, 3000), EVENT_GROUP_ABILITIES);
break;
case EVENT_SPELL_MOLTEN_FLAMES:
me->CastSpell(me, SPELL_MOLTEN_PUNCH, false);
events.ScheduleEvent(EVENT_SPELL_MOLTEN_FLAMES, 20000, EVENT_GROUP_ABILITIES);
break;
case EVENT_SWITCH_PHASE:
SchedulePhase(!me->HasAura(SPELL_SNARE_SELF));
break;
case EVENT_SWITCH_TARGET:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true))
{
DoResetThreatList();
me->AddThreat(target, 5000000.0f);
Talk(EMOTE_NEW_TARGET);
}
events.ScheduleEvent(EVENT_SWITCH_TARGET, 10000, EVENT_GROUP_ABILITIES);
break;
case EVENT_CHECK_DIST:
if (me->GetDistance(me->GetVictim()) > 40.0f)
{
Talk(EMOTE_PUNCH_GROUND);
me->CastSpell(me->GetVictim(), SPELL_CHARGE, true);
events.ScheduleEvent(EVENT_CHECK_DIST, 5000, EVENT_GROUP_ABILITIES);
break;
}
events.ScheduleEvent(EVENT_CHECK_DIST, 1, EVENT_GROUP_ABILITIES);
break;
case EVENT_SPELL_VOLCANIC_ERUPTION:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true))
{
me->CastSpell(target, SPELL_VOLCANIC_ERUPTION, true);
Talk(EMOTE_GROUND_CRACK);
}
events.ScheduleEvent(EVENT_SPELL_VOLCANIC_ERUPTION, urand(10000, 18000), EVENT_GROUP_ABILITIES);
break;
}
DoMeleeAttackIfReady();
}
bool CheckEvadeIfOutOfCombatArea() const override
{
return me->GetPositionX() < 565 || me->GetPositionX() > 865 || me->GetPositionY() < 545 || me->GetPositionY() > 1000;
}
};
struct npc_supremus_punch_invisible_stalker : public ScriptedAI
{
npc_supremus_punch_invisible_stalker(Creature* creature) : ScriptedAI(creature) { }
void IsSummonedBy(WorldObject* /*summoner*/) override
{
me->SetInCombatWithZone();
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true))
me->AddThreat(target, 10000.f);
DoCastSelf(SPELL_MOLTEN_FLAME, true);
scheduler.Schedule(6s, 10s, [this](TaskContext /*context*/)
{
me->CombatStop();
me->SetReactState(REACT_PASSIVE);
});
}
void UpdateAI(uint32 diff) override
{
scheduler.Update(diff);
if (!UpdateVictim())
return;
}
};
void AddSC_boss_supremus()
{
RegisterBlackTempleCreatureAI(npc_supremus_punch_invisible_stalker);
RegisterBlackTempleCreatureAI(boss_supremus);
}