fix(Core/TempleOfAhnQiraj): Bug trio (#13141)

This commit is contained in:
Angelo Venturini
2022-09-29 19:02:59 -03:00
committed by GitHub
parent ed68d1bffa
commit fc9bf2665d
2 changed files with 99 additions and 98 deletions

View File

@@ -50,6 +50,7 @@ enum Spells
enum Misc
{
ACTION_CONSUME = 0,
ACTION_EXPLODE = 1,
EMOTE_DEVOURED = 0,
@@ -78,20 +79,20 @@ public:
void EnterCombatWithTrio(Unit* who)
{
if (Creature* vem = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_VEM)))
if (Creature* vem = instance->GetCreature(DATA_VEM))
if (vem->GetGUID() != me->GetGUID())
vem->GetAI()->AttackStart(who);
if (Creature* kri = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_KRI)))
if (Creature* kri = instance->GetCreature(DATA_KRI))
if (kri->GetGUID() != me->GetGUID())
kri->GetAI()->AttackStart(who);
if (Creature* yauj = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_YAUJ)))
if (Creature* yauj = instance->GetCreature(DATA_YAUJ))
if (yauj->GetGUID() != me->GetGUID())
yauj->GetAI()->AttackStart(who);
}
void EvadeAllBosses(EvadeReason why)
{
if (Creature* vem = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_VEM)))
if (Creature* vem = instance->GetCreature(DATA_VEM))
{
if (vem->GetGUID() != me->GetGUID())
{
@@ -102,7 +103,7 @@ public:
}
}
if (Creature* kri = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_KRI)))
if (Creature* kri = instance->GetCreature(DATA_KRI))
{
if (kri->GetGUID() != me->GetGUID())
{
@@ -113,7 +114,7 @@ public:
}
}
if (Creature* yauj = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_YAUJ)))
if (Creature* yauj = instance->GetCreature(DATA_YAUJ))
{
if (yauj->GetGUID() != me->GetGUID())
{
@@ -127,14 +128,19 @@ public:
void DoAction(int32 action) override
{
if (action != ACTION_CONSUME || dying)
if (action == ACTION_CONSUME && !_dying)
{
return;
_isEating = true;
me->SetSpeed(MOVE_RUN, 45.f / 7.f); // From sniffs
me->SetReactState(REACT_PASSIVE);
_scheduler.DelayAll(6s);
}
isEating = true;
me->SetSpeed(MOVE_RUN, 45.f/7.f); // From sniffs
me->SetReactState(REACT_PASSIVE);
if (action == ACTION_EXPLODE && _dying)
{
DoCastSelf(SPELL_BLOODY_DEATH);
_dying = false;
}
}
void MovementInform(uint32 type, uint32 id) override
@@ -145,12 +151,18 @@ public:
me->GetMotionMaster()->MoveIdle();
me->SetSpeed(MOVE_RUN, 15.f/7.f); // From sniffs
DoCastSelf(SPELL_FULL_HEAL, true);
DoResetThreat();
isEating = false;
if (me->GetThreatMgr().GetThreatListSize())
DoResetThreat();
if (Creature* dying = instance->GetCreature(_creatureDying))
{
dying->AI()->DoAction(ACTION_EXPLODE);
me->SetTarget(dying->GetGUID());
}
_scheduler.Schedule(4s, [this](TaskContext /*context*/)
_scheduler.Schedule(2s, [this](TaskContext /*context*/)
{
me->SetReactState(REACT_AGGRESSIVE);
_isEating = false;
if (Unit* target = me->GetVictim())
{
me->GetMotionMaster()->Clear();
@@ -170,12 +182,11 @@ public:
{
BossAI::Reset();
_scheduler.CancelAll();
dying = false;
isEating = false;
_dying = false;
_isEating = false;
_creatureDying = 0;
instance->SetData(DATA_BUG_TRIO_DEATH, 0);
me->SetSpeed(MOVE_RUN, 15.f / 7.f); // From sniffs
me->SetStandState(UNIT_STAND_STATE_STAND);
me->SetControlled(false, UNIT_STATE_ROOT);
if (me->GetEntry() == NPC_VEM)
{
@@ -185,66 +196,71 @@ public:
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim() || isEating || !CheckInRoom())
if (!UpdateVictim() || !CheckInRoom())
return;
_scheduler.Update(diff, [this]
{
DoMeleeAttackIfReady();
if (!_dying && !_isEating)
DoMeleeAttackIfReady();
});
}
void DamageTaken(Unit* who, uint32& damage, DamageEffectType, SpellSchoolMask) override
{
if (me->HealthBelowPctDamaged(1, damage) && instance->GetData(DATA_BUG_TRIO_DEATH) < 2 && who->GetGUID() != me->GetGUID() && !dying)
if (_dying && who->GetGUID() != me->GetGUID())
damage = 0;
if (me->HealthBelowPctDamaged(0, damage) && instance->GetData(DATA_BUG_TRIO_DEATH) < 2 && !_dying)
{
damage = 0;
if (isEating)
if (_isEating)
return;
_scheduler.CancelAll();
me->SetStandState(UNIT_STAND_STATE_DEAD);
me->SetReactState(REACT_PASSIVE);
me->SetControlled(true, UNIT_STATE_ROOT);
dying = true;
DoFinalSpell();
_dying = true;
float x, y, z;
// Move the other bugs to this bug position
if (Creature* vem = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_VEM)))
if (Creature* vem = instance->GetCreature(DATA_VEM))
{
if (vem->GetGUID() != me->GetGUID())
{
vem->AI()->DoAction(ACTION_CONSUME);
vem->GetMotionMaster()->MovePoint(POINT_CONSUME, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ());
if (vem->IsAlive())
{
vem->AI()->DoAction(ACTION_CONSUME);
me->GetRandomContactPoint(vem, x, y, z);
vem->GetMotionMaster()->MovePoint(POINT_CONSUME, x, y, z);
}
}
else _creatureDying = DATA_VEM;
}
if (Creature* kri = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_KRI)))
if (Creature* kri = instance->GetCreature(DATA_KRI))
{
if (kri->GetGUID() != me->GetGUID())
{
kri->AI()->DoAction(ACTION_CONSUME);
kri->GetMotionMaster()->MovePoint(POINT_CONSUME, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ());
if (kri->IsAlive())
{
kri->AI()->DoAction(ACTION_CONSUME);
me->GetRandomContactPoint(kri, x, y, z);
kri->GetMotionMaster()->MovePoint(POINT_CONSUME, x, y, z);
}
}
else _creatureDying = DATA_KRI;
}
if (Creature* yauj = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_YAUJ)))
if (Creature* yauj = instance->GetCreature(DATA_YAUJ))
{
if (yauj->GetGUID() != me->GetGUID())
{
yauj->AI()->DoAction(ACTION_CONSUME);
yauj->GetMotionMaster()->MovePoint(POINT_CONSUME, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ());
if (yauj->IsAlive())
{
yauj->AI()->DoAction(ACTION_CONSUME);
me->GetRandomContactPoint(yauj, x, y, z);
yauj->GetMotionMaster()->MovePoint(POINT_CONSUME, x, y, z);
}
}
else _creatureDying = DATA_YAUJ;
}
_scheduler.Schedule(4s, [this](TaskContext /*context*/)
{
if (!me->IsInEvadeMode() && instance->GetData(DATA_BUG_TRIO_DEATH) < 2)
{
DoCastSelf(SPELL_BLOODY_DEATH, true);
Talk(EMOTE_DEVOURED);
me->DespawnOrUnsummon(1000);
}
});
}
}
@@ -274,10 +290,13 @@ public:
void JustDied(Unit* killer) override
{
if (killer->GetGUID() == me->GetGUID())
instance->SetData(DATA_BUG_TRIO_DEATH, 1);
if (instance->GetData(DATA_BUG_TRIO_DEATH) < 3)
{
instance->SetData(DATA_BUG_TRIO_DEATH, 1);
me->RemoveDynamicFlag(UNIT_DYNFLAG_LOOTABLE);
DoFinalSpell();
Talk(EMOTE_DEVOURED);
me->DespawnOrUnsummon(3000);
return;
}
@@ -285,10 +304,13 @@ public:
}
TaskScheduler _scheduler;
bool dying;
bool isEating;
bool _dying;
bool _isEating;
static uint32 _creatureDying;
};
uint32 boss_bug_trio::_creatureDying = 0;
struct boss_kri : public boss_bug_trio
{
boss_kri(Creature* creature) : boss_bug_trio(creature)
@@ -299,20 +321,20 @@ struct boss_kri : public boss_bug_trio
{
EnterCombatWithTrio(who);
_scheduler.Schedule(4s, 8s, [this](TaskContext context)
_scheduler.Schedule(7s, 18s, [this](TaskContext context)
{
DoCastVictim(SPELL_CLEAVE);
context.Repeat(5s, 12s);
context.Repeat();
})
.Schedule(6s, 30s, [this](TaskContext context)
.Schedule(8s, 17s, [this](TaskContext context)
{
DoCastVictim(SPELL_TOXIC_VOLLEY);
context.Repeat(10s, 25s);
context.Repeat();
})
.Schedule(6s, [this](TaskContext context)
.Schedule(7s, 16s, [this](TaskContext context)
{
DoCastVictim(SPELL_THRASH);
context.Repeat(2s, 6s);
context.Repeat();
});
}
};
@@ -343,25 +365,17 @@ struct boss_vem : public boss_bug_trio
{
DoCast(target, SPELL_CHARGE);
}
context.Repeat(8s, 16s);
context.Repeat();
})
.Schedule(10s, 20s, [this](TaskContext context)
.Schedule(10s, 24s, [this](TaskContext context)
{
DoCastVictim(SPELL_KNOCKBACK);
context.Repeat(10s, 20s);
context.Repeat();
})
.Schedule(5s, 8s, [this](TaskContext context)
.Schedule(10s, 23s, [this](TaskContext context)
{
DoCastVictim(SPELL_KNOCKDOWN);
context.Repeat(15s, 20s);
})
.Schedule(1s, [this](TaskContext context)
{
if (instance->GetData(DATA_BUG_TRIO_DEATH) == 2 && !me->HasAura(SPELL_VENGEANCE)) // Vem is the only one left.
{
DoCastSelf(SPELL_VENGEANCE, true);
}
context.Repeat(1s);
context.Repeat();
});
}
};
@@ -376,7 +390,7 @@ struct boss_yauj : public boss_bug_trio
{
EnterCombatWithTrio(who);
_scheduler.Schedule(20s, 30s, [this](TaskContext context)
_scheduler.Schedule(12100ms, [this](TaskContext context)
{
if (me->GetHealthPct() <= 93.f)
{
@@ -386,18 +400,20 @@ struct boss_yauj : public boss_bug_trio
{
DoCast(friendly, SPELL_HEAL);
}
context.Repeat(10s, 30s);
})
.Schedule(12s, 24s, [this](TaskContext context)
{
DoCastAOE(SPELL_FEAR);
DoResetThreat();
context.Repeat(20s);
context.Repeat();
})
.Schedule(12s, [this](TaskContext context)
{
DoCastVictim(SPELL_RAVAGE);
context.Repeat(10s, 15s);
DoCastAOE(SPELL_FEAR);
DoResetThreat();
context.Repeat(20600ms);
})
.Schedule(11s, 14500ms, [this](TaskContext context)
{
if (DoCastVictim(SPELL_RAVAGE) == SPELL_CAST_OK)
context.Repeat(10s, 15s);
else
context.Repeat(1200ms);
})
.Schedule(10s, 30s, [this](TaskContext context)
{

View File

@@ -24,6 +24,9 @@
ObjectData const creatureData[] =
{
{ NPC_VEM, DATA_VEM },
{ NPC_KRI, DATA_KRI },
{ NPC_YAUJ, DATA_YAUJ },
{ NPC_SARTURA, DATA_SARTURA },
{ NPC_CTHUN, DATA_CTHUN },
{ NPC_EYE_OF_CTHUN, DATA_EYE_OF_CTHUN },
@@ -62,9 +65,6 @@ public:
}
ObjectGuid SkeramGUID;
ObjectGuid VemGUID;
ObjectGuid KriGUID;
ObjectGuid YaujGUID;
ObjectGuid CThunGUID;
GuidVector CThunGraspGUIDs;
@@ -86,15 +86,6 @@ public:
case NPC_SKERAM:
SkeramGUID = creature->GetGUID();
break;
case NPC_VEM:
VemGUID = creature->GetGUID();
break;
case NPC_KRI:
KriGUID = creature->GetGUID();
break;
case NPC_YAUJ:
YaujGUID = creature->GetGUID();
break;
case NPC_OURO_SPAWNER:
if (GetBossState(DATA_OURO) != DONE)
creature->Respawn();
@@ -194,12 +185,6 @@ public:
{
case DATA_SKERAM:
return SkeramGUID;
case DATA_VEM:
return VemGUID;
case DATA_KRI:
return KriGUID;
case DATA_YAUJ:
return YaujGUID;
}
return ObjectGuid::Empty;
}