mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-29 16:43:47 +00:00
fix(Scripts/ZulAman): Halazzi Phases (#20650)
This commit is contained in:
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user