From 22354daa9215eee4f433b388d6306786a73bb499 Mon Sep 17 00:00:00 2001 From: Skjalf <47818697+Nyeriah@users.noreply.github.com> Date: Sat, 8 Nov 2025 18:45:24 -0300 Subject: [PATCH] fix(Scripts/DTK): Update King Dred script --- .../Northrend/DraktharonKeep/boss_dred.cpp | 132 +++++++----------- 1 file changed, 54 insertions(+), 78 deletions(-) diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_dred.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_dred.cpp index 9f27a52844..d172f68c42 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/boss_dred.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/boss_dred.cpp @@ -37,15 +37,7 @@ enum Misc NPC_DRAKKARI_SCYTHECLAW = 26628, NPC_DRAKKARI_GUTRIPPER = 26641, - SAY_CLAW_EMOTE = 0, - - EVENT_SPELL_BELLOWING_ROAR = 1, - EVENT_SPELL_GRIEVOUS_BITE = 2, - EVENT_SPELL_MANGLING_SLASH = 3, - EVENT_SPELL_FEARSOME_ROAR = 4, - EVENT_SPELL_PIERCING_SLASH = 5, - EVENT_SPELL_RAPTOR_CALL = 6, - EVENT_MENACING_CLAW = 7 + SAY_CLAW_EMOTE = 0 }; class boss_dred : public CreatureScript @@ -60,14 +52,52 @@ public: struct boss_dredAI : public BossAI { - boss_dredAI(Creature* creature) : BossAI(creature, DATA_DRED) - { - } + boss_dredAI(Creature* creature) : BossAI(creature, DATA_DRED) { } void Reset() override { BossAI::Reset(); _raptorCount = 0; + + ScheduleHealthCheckEvent({ 67, 34 }, [&] { + DoCastAOE(SPELL_BELLOWING_ROAR); + }); + } + + void ScheduleTasks() override + { + ScheduleTimedEvent(20s, [&] { + DoCastVictim(SPELL_GRIEVOUS_BITE); + }, 20s); + + ScheduleTimedEvent(18s + 500ms, [&] { + DoCastVictim(SPELL_MANGLING_SLASH); + }, 20s); + + ScheduleTimedEvent(10s, 20s, [&] { + DoCastAOE(SPELL_FEARSOME_ROAR); + }, 17s); + + ScheduleTimedEvent(17s, [&] { + DoCastVictim(SPELL_PIERCING_SLASH); + }, 20s); + + if (IsHeroic()) + { + ScheduleTimedEvent(16s, [&] { + DoCastSelf(SPELL_RAPTOR_CALL); + }, 30s); + + ScheduleTimedEvent(21s, [&] { + Talk(SAY_CLAW_EMOTE); + me->setAttackTimer(BASE_ATTACK, 2000); + me->AttackerStateUpdate(me->GetVictim()); + if (me->GetVictim()) + me->AttackerStateUpdate(me->GetVictim()); + if (me->GetVictim()) + me->AttackerStateUpdate(me->GetVictim()); + }, 20s); + } } uint32 GetData(uint32 data) const override @@ -87,67 +117,6 @@ public: { BossAI::JustEngagedWith(who); _raptorCount = 0; - - events.ScheduleEvent(EVENT_SPELL_BELLOWING_ROAR, 33s); - events.ScheduleEvent(EVENT_SPELL_GRIEVOUS_BITE, 20s); - events.ScheduleEvent(EVENT_SPELL_MANGLING_SLASH, 18s + 500ms); - events.ScheduleEvent(EVENT_SPELL_FEARSOME_ROAR, 10s, 20s); - events.ScheduleEvent(EVENT_SPELL_PIERCING_SLASH, 17s); - if (IsHeroic()) - { - events.ScheduleEvent(EVENT_MENACING_CLAW, 21s); - events.ScheduleEvent(EVENT_SPELL_RAPTOR_CALL, 20s, 25s); - } - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SPELL_BELLOWING_ROAR: - me->CastSpell(me, SPELL_BELLOWING_ROAR, false); - events.ScheduleEvent(EVENT_SPELL_BELLOWING_ROAR, 40s); - break; - case EVENT_SPELL_GRIEVOUS_BITE: - me->CastSpell(me->GetVictim(), SPELL_GRIEVOUS_BITE, false); - events.ScheduleEvent(EVENT_SPELL_GRIEVOUS_BITE, 20s); - break; - case EVENT_SPELL_MANGLING_SLASH: - me->CastSpell(me->GetVictim(), SPELL_MANGLING_SLASH, false); - events.ScheduleEvent(EVENT_SPELL_MANGLING_SLASH, 20s); - break; - case EVENT_SPELL_FEARSOME_ROAR: - me->CastSpell(me, SPELL_FEARSOME_ROAR, false); - events.ScheduleEvent(EVENT_SPELL_FEARSOME_ROAR, 17s); - break; - case EVENT_SPELL_PIERCING_SLASH: - me->CastSpell(me->GetVictim(), SPELL_PIERCING_SLASH, false); - events.ScheduleEvent(EVENT_SPELL_PIERCING_SLASH, 20s); - break; - case EVENT_SPELL_RAPTOR_CALL: - me->CastSpell(me, SPELL_RAPTOR_CALL, false); - events.ScheduleEvent(EVENT_SPELL_RAPTOR_CALL, 20s); - break; - case EVENT_MENACING_CLAW: - Talk(SAY_CLAW_EMOTE); - me->setAttackTimer(BASE_ATTACK, 2000); - me->AttackerStateUpdate(me->GetVictim()); - if (me->GetVictim()) - me->AttackerStateUpdate(me->GetVictim()); - if (me->GetVictim()) - me->AttackerStateUpdate(me->GetVictim()); - events.ScheduleEvent(EVENT_MENACING_CLAW, 20s); - break; - } - - DoMeleeAttackIfReady(); } private: @@ -181,7 +150,16 @@ class spell_dred_raptor_call : public SpellScript void HandleDummy(SpellEffIndex /*effIndex*/) { - GetCaster()->SummonCreature(RAND(NPC_DRAKKARI_GUTRIPPER, NPC_DRAKKARI_SCYTHECLAW), -522.02f, -718.89f, 30.26f, 2.41f); + std::list raptors; + GetCaster()->GetCreatureListWithEntryInGrid(raptors, { NPC_DRAKKARI_SCYTHECLAW, NPC_DRAKKARI_GUTRIPPER }, 100.0f); + + if (!raptors.empty()) + { + Creature* raptor = Acore::Containers::SelectRandomContainerElement(raptors); + + if (GetCaster()->GetVictim()) + raptor->AI()->AttackStart(GetCaster()->GetVictim()); + } } void Register() override @@ -193,16 +171,14 @@ class spell_dred_raptor_call : public SpellScript class achievement_better_off_dred : public AchievementCriteriaScript { public: - achievement_better_off_dred() : AchievementCriteriaScript("achievement_better_off_dred") - { - } + achievement_better_off_dred() : AchievementCriteriaScript("achievement_better_off_dred") { } bool OnCheck(Player* /*player*/, Unit* target, uint32 /*criteria_id*/) override { if (!target) return false; - return target->GetAI()->GetData(target->GetEntry()); + return target->GetAI()->GetData(target->GetEntry()) >= 6; } };