fix(Scripts/ZulAman): Halazzi Phases (#20650)

This commit is contained in:
Jelle Meeus
2024-11-20 13:08:21 +01:00
committed by GitHub
parent 8cde31018d
commit 047a21d31a
3 changed files with 142 additions and 58 deletions

View File

@@ -27,56 +27,61 @@ enum Spells
SPELL_FRENZY = 43139,
SPELL_FLAMESHOCK = 43303,
SPELL_EARTHSHOCK = 43305,
SPELL_TRANSFORM_SPLIT = 43142,
SPELL_TRANSFORM_SPLIT2 = 43573,
SPELL_TRANSFORM_MERGE = 43271,
SPELL_SUMMON_LYNX = 43143,
SPELL_SUMMON_TOTEM = 43302,
SPELL_BERSERK = 45078,
SPELL_LYNX_FRENZY = 43290, // Used by Spirit Lynx
SPELL_SHRED_ARMOR = 43243 // Used by Spirit Lynx
SPELL_SHRED_ARMOR = 43243, // Used by Spirit Lynx
SPELL_TRANSFORM_DUMMY = 43615, // Used by Spirit Lynx
SPELL_TRANSFIGURE = 44054,
SPELL_TRANSFORM_TO_LYNX_75 = 43145,
SPELL_TRANSFORM_TO_LYNX_50 = 43271,
SPELL_TRANSFORM_TO_LYNX_25 = 43272
};
enum UniqueEvents
{
EVENT_BERSERK = 0
EVENT_BERSERK = 0
};
enum Hal_CreatureIds
{
NPC_TOTEM = 24224
NPC_HALAZZI_TROLL = 24144, // dummy creature - used to update model, stats
NPC_TOTEM = 24224
};
enum PhaseHalazzi
{
PHASE_NONE = 0,
PHASE_LYNX = 1,
PHASE_SPLIT = 2,
PHASE_HUMAN = 3,
PHASE_MERGE = 4,
PHASE_ENRAGE = 5
PHASE_NONE = 0,
PHASE_LYNX = 1,
PHASE_SPLIT = 2,
PHASE_HUMAN = 3,
PHASE_MERGE = 4,
PHASE_ENRAGE = 5
};
enum Yells
{
SAY_AGGRO = 0,
SAY_KILL = 1,
SAY_SABER = 2,
SAY_SPLIT = 3,
SAY_MERGE = 4,
SAY_DEATH = 5
SAY_AGGRO = 0,
SAY_KILL = 1,
SAY_SABER = 2,
SAY_SPLIT = 3,
SAY_MERGE = 4,
SAY_DEATH = 5
};
enum Groups
{
GROUP_LYNX = 0,
GROUP_HUMAN = 1,
GROUP_MERGE = 2
GROUP_LYNX = 0,
GROUP_HUMAN = 1,
GROUP_MERGE = 3,
GROUP_SPLIT = 4
};
enum Actions
{
ACTION_MERGE = 0
ACTION_MERGE = 0
};
struct boss_halazzi : public BossAI
@@ -91,15 +96,12 @@ struct boss_halazzi : public BossAI
void Reset() override
{
me->UpdateEntry(NPC_HALAZZI);
BossAI::Reset();
_transformCount = 0;
_healthCheckPercentage = 0;
_phase = PHASE_NONE;
_lynxFormHealth = me->GetMaxHealth();
_healthPortion = _lynxFormHealth/4;
_humanFormHealth = (me->GetMaxHealth())/0.66666666;
EnterPhase(PHASE_LYNX);
DoCastSelf(SPELL_DUAL_WIELD, true);
SetInvincibility(true);
}
void JustSummoned(Creature* summon) override
@@ -120,30 +122,27 @@ struct boss_halazzi : public BossAI
EnterPhase(PHASE_LYNX);
}
void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damagetype*/, SpellSchoolMask /*damageSchoolMask*/) override
void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask) override
{
if (damage >= me->GetHealth() && _phase != PHASE_ENRAGE)
damage = 0;
else
BossAI::DamageTaken(attacker, damage, damagetype, damageSchoolMask);
if (_phase == PHASE_LYNX || _phase == PHASE_ENRAGE)
{
if (_phase == PHASE_LYNX || _phase == PHASE_ENRAGE)
{
_healthCheckPercentage = 25 * (3 - _transformCount);
if (!HealthAbovePct(_healthCheckPercentage))
EnterPhase(PHASE_SPLIT);
}
else if (_phase == PHASE_HUMAN)
{
if (!HealthAbovePct(20))
EnterPhase(PHASE_MERGE);
}
uint32 _healthCheckPercentage = 25 * (3 - _transformCount);
if (!HealthAbovePct(_healthCheckPercentage))
EnterPhase(PHASE_SPLIT);
}
else if (_phase == PHASE_HUMAN)
{
if (!HealthAbovePct(20))
EnterPhase(PHASE_MERGE);
}
}
void SpellHit(Unit*, SpellInfo const* spell) override
{
if (spell->Id == SPELL_TRANSFORM_SPLIT2)
EnterPhase(PHASE_HUMAN);
if (spell->Id == SPELL_TRANSFORM_DUMMY)
me->UpdateEntry(NPC_HALAZZI_TROLL);
}
void AttackStart(Unit* who) override
@@ -156,17 +155,42 @@ struct boss_halazzi : public BossAI
{
switch (nextPhase)
{
case PHASE_LYNX:
case PHASE_ENRAGE:
SetInvincibility(false);
scheduler.Schedule(12s, GROUP_LYNX, [this](TaskContext context)
{
DoCastSelf(SPELL_SUMMON_TOTEM);
context.Repeat(20s);
});
[[fallthrough]];
case PHASE_LYNX:
{
if (_phase == PHASE_MERGE)
{
DoCastSelf(SPELL_TRANSFORM_MERGE, true);
me->RemoveAurasDueToSpell(SPELL_TRANSFORM_SPLIT2);
DoCastSelf(SPELL_TRANSFIGURE, true);
me->ResumeChasingVictim();
}
summons.DespawnAll();
me->SetMaxHealth(_lynxFormHealth);
me->SetHealth(_lynxFormHealth - _healthPortion * _transformCount);
if (_transformCount)
{
me->UpdateEntry(NPC_HALAZZI);
switch (_transformCount)
{
case 1:
DoCastSelf(SPELL_TRANSFORM_TO_LYNX_75, true);
break;
case 2:
DoCastSelf(SPELL_TRANSFORM_TO_LYNX_50, true);
break;
case 3:
DoCastSelf(SPELL_TRANSFORM_TO_LYNX_25, true);
break;
default:
break;
}
}
scheduler.CancelGroup(GROUP_MERGE);
scheduler.Schedule(16s, GROUP_LYNX, [this](TaskContext context)
{
@@ -179,15 +203,18 @@ struct boss_halazzi : public BossAI
context.Repeat(30s);
});
break;
}
case PHASE_SPLIT:
Talk(SAY_SPLIT);
DoCastSelf(SPELL_TRANSFORM_SPLIT, true);
break;
DoCastSelf(SPELL_TRANSFIGURE, true);
scheduler.Schedule(3s, GROUP_SPLIT, [this](TaskContext /*context*/)
{
DoCastSelf(SPELL_SUMMON_LYNX, true);
});
nextPhase = PHASE_HUMAN;
[[fallthrough]];
case PHASE_HUMAN:
scheduler.CancelGroup(GROUP_MERGE);
DoCastSelf(SPELL_SUMMON_LYNX, true);
me->SetMaxHealth(_humanFormHealth);
me->SetHealth(_humanFormHealth);
scheduler.CancelGroup(GROUP_LYNX);
scheduler.Schedule(10s, GROUP_HUMAN, [this](TaskContext context)
{
@@ -255,11 +282,7 @@ struct boss_halazzi : public BossAI
Talk(SAY_DEATH);
}
private:
uint32 _lynxFormHealth;
uint32 _humanFormHealth;
uint32 _healthPortion;
uint8 _transformCount;
uint32 _healthCheckPercentage;
PhaseHalazzi _phase;
};