Merge 22354daa9215eee4f433b388d6306786a73bb499 into d4cd580ddcf382acbca3bd104f09ca4c39ad811a

This commit is contained in:
Andrew 2025-11-09 06:05:21 -03:00 committed by GitHub
commit 737257d30e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -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<Creature*> 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;
}
};