diff options
author | offl <11556157+offl@users.noreply.github.com> | 2025-08-10 13:11:43 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-08-10 12:11:43 +0200 |
commit | 7d33481fa96f505e10e6461584614a8520b4221e (patch) | |
tree | f079946716a45cd189d8c2511728d6f8c89feaa7 /src | |
parent | 3a964bc3f900c7c2cb22be15ae7f06df532269dc (diff) |
Scripts/AQ40: Rewrite Huhuran (#31199)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp | 229 |
1 files changed, 125 insertions, 104 deletions
diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp index 101f5279a9b..f0be4aceec7 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp @@ -15,147 +15,168 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* ScriptData -SDName: Boss_Huhuran -SD%Complete: 100 -SDComment: -SDCategory: Temple of Ahn'Qiraj -EndScriptData */ +/* + * Timers requires to be revisited + */ #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "SpellAuraEffects.h" +#include "SpellScript.h" #include "temple_of_ahnqiraj.h" -enum Huhuran +enum HuhuranTexts { - EMOTE_FRENZY_KILL = 0, - EMOTE_BERSERK = 1, + EMOTE_ENRAGE = 0, + EMOTE_BERSERK = 1 +}; - SPELL_FRENZY = 26051, +enum HuhuranSpells +{ + SPELL_ACID_SPIT = 26050, + SPELL_NOXIOUS_POISON = 26053, + SPELL_WYVERN_STING = 26180, + SPELL_ENRAGE = 26051, SPELL_BERSERK = 26068, - SPELL_POISONBOLT = 26052, - SPELL_NOXIOUSPOISON = 26053, - SPELL_WYVERNSTING = 26180, - SPELL_ACIDSPIT = 26050 + + SPELL_WYVERN_STING_DAMAGE = 26233 }; -class boss_huhuran : public CreatureScript +enum HuhuranEvents { -public: - boss_huhuran() : CreatureScript("boss_huhuran") { } + EVENT_ACID_SPIT = 1, + EVENT_NOXIOUS_POISON, + EVENT_WYVERN_STING, + EVENT_ENRAGE, + EVENT_BERSERK +}; + +// 15509 - Princess Huhuran +struct boss_huhuran : public BossAI +{ + boss_huhuran(Creature* creature) : BossAI(creature, DATA_HUHURAN), _berserkTriggered(false) { } + + void Reset() override + { + _Reset(); + _berserkTriggered = false; + } - CreatureAI* GetAI(Creature* creature) const override + void JustEngagedWith(Unit* who) override { - return GetAQ40AI<boss_huhuranAI>(creature); + BossAI::JustEngagedWith(who); + + events.ScheduleEvent(EVENT_ACID_SPIT, 0s, 15s); + events.ScheduleEvent(EVENT_NOXIOUS_POISON, 10s, 20s); + events.ScheduleEvent(EVENT_WYVERN_STING, 35s, 45s); + events.ScheduleEvent(EVENT_ENRAGE, 10s, 25s); } - struct boss_huhuranAI : public BossAI + void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override { - boss_huhuranAI(Creature* creature) : BossAI(creature, DATA_HUHURAN) + if (!_berserkTriggered && me->HealthBelowPctDamaged(30, damage)) { - Initialize(); + _berserkTriggered = true; + events.CancelEvent(EVENT_ENRAGE); + events.ScheduleEvent(EVENT_BERSERK, 0s); } + } - void Initialize() + void OnSpellCast(SpellInfo const* spell) override + { + switch (spell->Id) { - Frenzy_Timer = urand(25000, 35000); - Wyvern_Timer = urand(18000, 28000); - Spit_Timer = 8000; - PoisonBolt_Timer = 4000; - NoxiousPoison_Timer = urand(10000, 20000); - FrenzyBack_Timer = 15000; - - Frenzy = false; - Berserk = false; + case SPELL_ENRAGE: + Talk(EMOTE_ENRAGE); + break; + case SPELL_BERSERK: + Talk(EMOTE_BERSERK); + break; + default: + break; } + } - uint32 Frenzy_Timer; - uint32 Wyvern_Timer; - uint32 Spit_Timer; - uint32 PoisonBolt_Timer; - uint32 NoxiousPoison_Timer; - uint32 FrenzyBack_Timer; + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - bool Frenzy; - bool Berserk; + events.Update(diff); - void Reset() override - { - Initialize(); - _Reset(); - } + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - void UpdateAI(uint32 diff) override + while (uint32 eventId = events.ExecuteEvent()) { - //Return since we have no target - if (!UpdateVictim()) - return; - - //Frenzy_Timer - if (!Frenzy && Frenzy_Timer <= diff) - { - DoCast(me, SPELL_FRENZY); - Talk(EMOTE_FRENZY_KILL); - Frenzy = true; - PoisonBolt_Timer = 3000; - Frenzy_Timer = urand(25000, 35000); - } else Frenzy_Timer -= diff; - - // Wyvern Timer - if (Wyvern_Timer <= diff) + switch (eventId) { - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - DoCast(target, SPELL_WYVERNSTING); - Wyvern_Timer = urand(15000, 32000); - } else Wyvern_Timer -= diff; + case EVENT_ACID_SPIT: + DoCastVictim(SPELL_ACID_SPIT); + events.Repeat(10s, 15s); + break; + case EVENT_NOXIOUS_POISON: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) + DoCast(target, SPELL_NOXIOUS_POISON); + events.Repeat(10s, 25s); + break; + case EVENT_WYVERN_STING: + DoCastSelf(SPELL_WYVERN_STING); + events.Repeat(25s, 35s); + break; + case EVENT_ENRAGE: + DoCastSelf(SPELL_ENRAGE); + events.Repeat(10s, 20s); + break; + case EVENT_BERSERK: + DoCastSelf(SPELL_BERSERK); + break; + default: + break; + } - //Spit Timer - if (Spit_Timer <= diff) - { - DoCastVictim(SPELL_ACIDSPIT); - Spit_Timer = urand(5000, 10000); - } else Spit_Timer -= diff; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + } - //NoxiousPoison_Timer - if (NoxiousPoison_Timer <= diff) - { - DoCastVictim(SPELL_NOXIOUSPOISON); - NoxiousPoison_Timer = urand(12000, 24000); - } else NoxiousPoison_Timer -= diff; + DoMeleeAttackIfReady(); + } - //PoisonBolt only if frenzy or berserk - if (Frenzy || Berserk) - { - if (PoisonBolt_Timer <= diff) - { - DoCastVictim(SPELL_POISONBOLT); - PoisonBolt_Timer = 3000; - } else PoisonBolt_Timer -= diff; - } +private: + bool _berserkTriggered; +}; - //FrenzyBack_Timer - if (Frenzy && FrenzyBack_Timer <= diff) - { - me->InterruptNonMeleeSpells(false); - Frenzy = false; - FrenzyBack_Timer = 15000; - } else FrenzyBack_Timer -= diff; +// 26180 - Wyvern Sting +class spell_huhuran_wyvern_sting : public AuraScript +{ + PrepareAuraScript(spell_huhuran_wyvern_sting); - if (!Berserk && HealthBelowPct(31)) - { - me->InterruptNonMeleeSpells(false); - Talk(EMOTE_BERSERK); - DoCast(me, SPELL_BERSERK); - Berserk = true; - } + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_WYVERN_STING_DAMAGE }); + } - DoMeleeAttackIfReady(); + void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + AuraRemoveMode removeMode = GetTargetApplication()->GetRemoveMode(); + + if (Unit* caster = GetCaster()) + { + int32 damage = removeMode == AURA_REMOVE_BY_ENEMY_SPELL ? 3000 : 500; + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.AddSpellBP0(damage); + caster->CastSpell(GetTarget(), SPELL_WYVERN_STING_DAMAGE, args); } - }; + } + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_huhuran_wyvern_sting::AfterRemove, EFFECT_0, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL); + } }; void AddSC_boss_huhuran() { - new boss_huhuran(); + RegisterAQ40CreatureAI(boss_huhuran); + RegisterSpellScript(spell_huhuran_wyvern_sting); } |