fix(Scripts/RuinsOfAhnQiraj): Improve Ayamiss (#12143)

This commit is contained in:
Eddy Vega
2022-07-26 07:02:22 -06:00
committed by GitHub
parent 016375ee8a
commit 278845f731
2 changed files with 51 additions and 42 deletions

View File

@@ -0,0 +1,7 @@
--
UPDATE `creature_template` SET `mingold`=0, `maxgold`=0 WHERE `entry`=15546;
UPDATE `creature_template` SET `flags_extra`=`flags_extra`|256 WHERE `entry`=15369;
INSERT INTO `creature_addon` (`guid`, `auras`) VALUES
(144641, '8876'); -- Triggers SPELL_THRASH = 3391

View File

@@ -25,7 +25,6 @@ enum Spells
SPELL_STINGER_SPRAY = 25749, SPELL_STINGER_SPRAY = 25749,
SPELL_POISON_STINGER = 25748, SPELL_POISON_STINGER = 25748,
SPELL_PARALYZE = 25725, SPELL_PARALYZE = 25725,
SPELL_TRASH = 3391,
SPELL_FRENZY = 8269, SPELL_FRENZY = 8269,
SPELL_LASH = 25852, SPELL_LASH = 25852,
SPELL_FEED = 25721 SPELL_FEED = 25721
@@ -38,8 +37,7 @@ enum Events
EVENT_SUMMON_SWARMER = 3, EVENT_SUMMON_SWARMER = 3,
EVENT_SWARMER_ATTACK = 4, EVENT_SWARMER_ATTACK = 4,
EVENT_PARALYZE = 5, EVENT_PARALYZE = 5,
EVENT_LASH = 6, EVENT_LASH = 6
EVENT_TRASH = 7
}; };
enum Emotes enum Emotes
@@ -77,9 +75,7 @@ public:
struct boss_ayamissAI : public BossAI struct boss_ayamissAI : public BossAI
{ {
boss_ayamissAI(Creature* creature) : BossAI(creature, DATA_AYAMISS) boss_ayamissAI(Creature* creature) : BossAI(creature, DATA_AYAMISS) {}
{
}
void Reset() override void Reset() override
{ {
@@ -101,7 +97,9 @@ public:
break; break;
case NPC_HORNET: case NPC_HORNET:
if (Unit* target = SelectTarget(SelectTargetMethod::Random)) if (Unit* target = SelectTarget(SelectTargetMethod::Random))
{
who->AI()->AttackStart(target); who->AI()->AttackStart(target);
}
break; break;
} }
} }
@@ -116,7 +114,7 @@ public:
me->AddUnitState(UNIT_STATE_ROOT); me->AddUnitState(UNIT_STATE_ROOT);
break; break;
case POINT_GROUND: case POINT_GROUND:
me->ClearUnitState(UNIT_STATE_ROOT); me->GetMotionMaster()->MoveChase(me->GetVictim());
break; break;
} }
} }
@@ -131,55 +129,51 @@ public:
void EnterCombat(Unit* attacker) override void EnterCombat(Unit* attacker) override
{ {
BossAI::EnterCombat(attacker); BossAI::EnterCombat(attacker);
events.ScheduleEvent(EVENT_STINGER_SPRAY, urand(20000, 30000)); events.ScheduleEvent(EVENT_STINGER_SPRAY, urand(20000, 30000));
events.ScheduleEvent(EVENT_POISON_STINGER, 5000); events.ScheduleEvent(EVENT_POISON_STINGER, 5000);
events.ScheduleEvent(EVENT_SUMMON_SWARMER, 5000); events.ScheduleEvent(EVENT_SUMMON_SWARMER, 5000);
events.ScheduleEvent(EVENT_SWARMER_ATTACK, 60000); events.ScheduleEvent(EVENT_SWARMER_ATTACK, 60000);
events.ScheduleEvent(EVENT_PARALYZE, 15000); events.ScheduleEvent(EVENT_PARALYZE, 15000);
me->SetCanFly(true); me->SetCanFly(true);
me->SetDisableGravity(true); me->SetDisableGravity(true);
me->GetMotionMaster()->MovePoint(POINT_AIR, AyamissAirPos); me->GetMotionMaster()->MovePoint(POINT_AIR, AyamissAirPos);
} }
void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask) override
{
if (_phase == PHASE_AIR && me->GetHealthPct() < 70.0f)
{
_phase = PHASE_GROUND;
SetCombatMovement(true);
me->ClearUnitState(UNIT_STATE_ROOT);
me->SetCanFly(false);
me->SetDisableGravity(false);
Position VictimPos = me->GetVictim()->GetPosition();
me->GetMotionMaster()->MovePoint(POINT_GROUND, VictimPos);
events.ScheduleEvent(EVENT_LASH, urand(5000, 8000));
events.CancelEvent(EVENT_POISON_STINGER);
DoResetThreat();
}
if (!_enraged && me->GetHealthPct() < 20.0f)
{
DoCastSelf(SPELL_FRENZY);
Talk(EMOTE_FRENZY);
_enraged = true;
}
}
void UpdateAI(uint32 diff) override void UpdateAI(uint32 diff) override
{ {
if (!UpdateVictim()) if (!UpdateVictim())
return; return;
events.Update(diff); events.Update(diff);
if (_phase == PHASE_AIR && me->GetHealthPct() < 70.0f)
{
_phase = PHASE_GROUND;
SetCombatMovement(true);
me->SetCanFly(false);
Position VictimPos = me->GetVictim()->GetPosition();
me->GetMotionMaster()->MovePoint(POINT_GROUND, VictimPos);
DoResetThreat();
events.ScheduleEvent(EVENT_LASH, urand(5000, 8000));
events.ScheduleEvent(EVENT_TRASH, urand(3000, 6000));
events.CancelEvent(EVENT_POISON_STINGER);
}
else
{
DoMeleeAttackIfReady();
}
if (!_enraged && me->GetHealthPct() < 20.0f)
{
DoCast(me, SPELL_FRENZY);
Talk(EMOTE_FRENZY);
_enraged = true;
}
while (uint32 eventId = events.ExecuteEvent()) while (uint32 eventId = events.ExecuteEvent())
{ {
switch (eventId) switch (eventId)
{ {
case EVENT_STINGER_SPRAY: case EVENT_STINGER_SPRAY:
DoCast(me, SPELL_STINGER_SPRAY); DoCastSelf(SPELL_STINGER_SPRAY);
events.ScheduleEvent(EVENT_STINGER_SPRAY, urand(15000, 20000)); events.ScheduleEvent(EVENT_STINGER_SPRAY, urand(15000, 20000));
break; break;
case EVENT_POISON_STINGER: case EVENT_POISON_STINGER:
@@ -198,30 +192,32 @@ public:
break; break;
case EVENT_SWARMER_ATTACK: case EVENT_SWARMER_ATTACK:
for (ObjectGuid const& guid : _swarmers) for (ObjectGuid const& guid : _swarmers)
{
if (Creature* swarmer = me->GetMap()->GetCreature(guid)) if (Creature* swarmer = me->GetMap()->GetCreature(guid))
{
if (Unit* target = SelectTarget(SelectTargetMethod::Random)) if (Unit* target = SelectTarget(SelectTargetMethod::Random))
{
swarmer->AI()->AttackStart(target); swarmer->AI()->AttackStart(target);
}
}
}
_swarmers.clear(); _swarmers.clear();
events.ScheduleEvent(EVENT_SWARMER_ATTACK, 60000); events.ScheduleEvent(EVENT_SWARMER_ATTACK, 60000);
break; break;
case EVENT_SUMMON_SWARMER: case EVENT_SUMMON_SWARMER:
{ {
Position Pos = me->GetRandomPoint(SwarmerPos, 80.0f); Position Pos = me->GetRandomPoint(SwarmerPos, 80.0f);
me->SummonCreature(NPC_SWARMER, Pos); me->SummonCreature(NPC_SWARMER, Pos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000);
events.ScheduleEvent(EVENT_SUMMON_SWARMER, 5000); events.ScheduleEvent(EVENT_SUMMON_SWARMER, 5000);
break; break;
} }
case EVENT_TRASH:
DoCastVictim(SPELL_TRASH);
events.ScheduleEvent(EVENT_TRASH, urand(5000, 7000));
break;
case EVENT_LASH: case EVENT_LASH:
DoCastVictim(SPELL_LASH); DoCastVictim(SPELL_LASH);
events.ScheduleEvent(EVENT_LASH, urand(8000, 15000)); events.ScheduleEvent(EVENT_LASH, urand(8000, 15000));
break; break;
} }
} }
DoMeleeAttackIfReady();
} }
private: private:
GuidList _swarmers; GuidList _swarmers;
@@ -250,9 +246,15 @@ public:
void MovementInform(uint32 type, uint32 id) override void MovementInform(uint32 type, uint32 id) override
{ {
if (type == POINT_MOTION_TYPE) if (type == POINT_MOTION_TYPE)
{
if (id == POINT_PARALYZE) if (id == POINT_PARALYZE)
{
if (Player* target = ObjectAccessor::GetPlayer(*me, _instance->GetGuidData(DATA_PARALYZED))) if (Player* target = ObjectAccessor::GetPlayer(*me, _instance->GetGuidData(DATA_PARALYZED)))
DoCast(target, SPELL_FEED); // Omnomnom {
DoCast(target, SPELL_FEED);
}
}
}
} }
void MoveInLineOfSight(Unit* who) override void MoveInLineOfSight(Unit* who) override