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

@@ -0,0 +1,12 @@
--
DELETE FROM `creature_text` WHERE (`CreatureID` = 22898);
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
(22898, 0, 0, 'Supremus acquires a new target!', 41, 0, 100, 0, 0, 0, 21959, 0, 'Supremus'),
(22898, 1, 0, 'Supremus punches the ground in anger!', 41, 0, 100, 53, 0, 0, 21019, 0, 'Supremus'),
(22898, 2, 0, 'The ground begins to crack open!', 41, 0, 100, 0, 0, 0, 21018, 0, 'Supremus'),
(22898, 3, 0, '%s goes into a berserker rage!', 16, 0, 100, 0, 0, 0, 4428, 0, 'Supremus');
UPDATE `creature_model_info` SET `CombatReach` = 40 WHERE `DisplayID` = 21145;
UPDATE `creature_template` SET `AIName` = '', `ScriptName` = 'npc_supremus_punch_invisible_stalker', `speed_run` = 1.28571 WHERE (`entry` = 23095);
DELETE FROM `creature_template_addon` WHERE (`entry` = 23095);

View File

@@ -4834,6 +4834,12 @@ void SpellMgr::LoadSpellInfoCorrections()
spellInfo->AuraInterruptFlags &= ~AURA_INTERRUPT_FLAG_NOT_ABOVEWATER;
});
// Molten Punch
ApplySpellFix({ 40126 }, [](SpellInfo* spellInfo)
{
spellInfo->Effects[EFFECT_0].TargetB = SpellImplicitTargetInfo(TARGET_DEST_CASTER);
});
for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i)
{
SpellInfo* spellInfo = mSpellInfoMap[i];

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);
}