From 917c34cf5205735654e6bb4bc4d851da7f36da1a Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Fri, 26 Jul 2024 21:48:33 -0300 Subject: [PATCH] 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 --- .../rev_1721266085348043300.sql | 12 + .../game/Spells/SpellInfoCorrections.cpp | 6 + .../Outland/BlackTemple/boss_supremus.cpp | 210 ++++++++++-------- 3 files changed, 140 insertions(+), 88 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1721266085348043300.sql diff --git a/data/sql/updates/pending_db_world/rev_1721266085348043300.sql b/data/sql/updates/pending_db_world/rev_1721266085348043300.sql new file mode 100644 index 000000000..f2ab42879 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1721266085348043300.sql @@ -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); diff --git a/src/server/game/Spells/SpellInfoCorrections.cpp b/src/server/game/Spells/SpellInfoCorrections.cpp index e89a66b49..a7cd588b7 100644 --- a/src/server/game/Spells/SpellInfoCorrections.cpp +++ b/src/server/game/Spells/SpellInfoCorrections.cpp @@ -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]; diff --git a/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp b/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp index d5259faec..7ccd7986e 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp @@ -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); }