diff options
author | offl <11556157+offl@users.noreply.github.com> | 2025-08-16 15:31:45 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-08-16 14:31:45 +0200 |
commit | 126fa17de9ca9ee3871a4c584b7f51a981c4211b (patch) | |
tree | a25bbf005721fd6793cc6ea13e81bb0d4bf1042d /src | |
parent | 7de212a6407095d25d7437541ada469118cad102 (diff) |
Scripts/AQ20: Refactor Kurinnaxx and implement Sand Trap (#31203)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp | 243 | ||||
-rw-r--r-- | src/server/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h | 2 |
2 files changed, 146 insertions, 99 deletions
diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp index 0d6d854d46e..11577fadaa4 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp @@ -15,133 +15,178 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ +/* + * Timers requires to be revisited + */ + #include "ScriptMgr.h" -#include "CreatureTextMgr.h" +#include "Containers.h" #include "InstanceScript.h" #include "ObjectAccessor.h" #include "ruins_of_ahnqiraj.h" #include "ScriptedCreature.h" +#include "SpellInfo.h" +#include "SpellScript.h" -enum Spells +enum KurinnaxxTexts { - SPELL_MORTALWOUND = 25646, - SPELL_SANDTRAP = 25648, - SPELL_ENRAGE = 26527, - SPELL_SUMMON_PLAYER = 26446, - SPELL_TRASH = 3391, // Should perhaps be triggered by an aura? Couldn't find any though - SPELL_WIDE_SLASH = 25814 + SAY_KURINAXX_DEATH = 5, + EMOTE_FRENZY = 0 }; -enum Events +enum KurinnaxxSpells { - EVENT_MORTAL_WOUND = 1, - EVENT_SANDTRAP = 2, - EVENT_TRASH = 3, - EVENT_WIDE_SLASH = 4 + SPELL_MORTAL_WOUND = 25646, + SPELL_SAND_TRAP_TRIGGER = 26524, + SPELL_THRASH = 3391, + SPELL_WIDE_SLASH = 25814, + SPELL_FRENZY = 26527, + SPELL_SUMMON_PLAYER = 26446, + + SPELL_SAND_TRAP_EFFECT = 25648 }; -enum Texts +enum KurinnaxxEvents { - SAY_KURINAXX_DEATH = 5, // Yelled by Ossirian the Unscarred + EVENT_MORTAL_WOUND = 1, + EVENT_SAND_TRAP, + EVENT_THRASH, + EVENT_WIDE_SLASH, + EVENT_FRENZY, + EVENT_SUMMON_PLAYER }; -class boss_kurinnaxx : public CreatureScript +// 15348 - Kurinnaxx +struct boss_kurinnaxx : public BossAI { - public: - boss_kurinnaxx() : CreatureScript("boss_kurinnaxx") { } - - struct boss_kurinnaxxAI : public BossAI + boss_kurinnaxx(Creature* creature) : BossAI(creature, DATA_KURINNAXX), _frenzied(false) { } + + void Reset() override + { + _Reset(); + _frenzied = false; + } + + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + + events.ScheduleEvent(EVENT_MORTAL_WOUND, 2s, 8s); + events.ScheduleEvent(EVENT_SAND_TRAP, 5s, 10s); + events.ScheduleEvent(EVENT_THRASH, 0s, 15s); + events.ScheduleEvent(EVENT_WIDE_SLASH, 10s, 15s); + events.ScheduleEvent(EVENT_SUMMON_PLAYER, 5s); + } + + void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override + { + if (!_frenzied && me->HealthBelowPctDamaged(30, damage)) { - boss_kurinnaxxAI(Creature* creature) : BossAI(creature, DATA_KURINNAXX) - { - Initialize(); - } + _frenzied = true; + events.ScheduleEvent(EVENT_FRENZY, 0s); + } + } - void Initialize() - { - _enraged = false; - } + void OnSpellCast(SpellInfo const* spell) override + { + if (spell->Id == SPELL_FRENZY) + Talk(EMOTE_FRENZY); + } - void Reset() override - { - _Reset(); - Initialize(); - events.ScheduleEvent(EVENT_MORTAL_WOUND, 8s); - events.ScheduleEvent(EVENT_SANDTRAP, 5s, 15s); - events.ScheduleEvent(EVENT_TRASH, 1s); - events.ScheduleEvent(EVENT_WIDE_SLASH, 11s); - } + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + if (Creature* ossirian = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_OSSIRIAN))) + ossirian->AI()->Talk(SAY_KURINAXX_DEATH); + } - void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override - { - if (!_enraged && HealthBelowPct(30)) - { - DoCast(me, SPELL_ENRAGE); - _enraged = true; - } - } + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - void JustDied(Unit* /*killer*/) override - { - _JustDied(); - if (Creature* Ossirian = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_OSSIRIAN))) - sCreatureTextMgr->SendChat(Ossirian, SAY_KURINAXX_DEATH, nullptr, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_ZONE); - } + events.Update(diff); - void UpdateAI(uint32 diff) override + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_MORTAL_WOUND: - DoCastVictim(SPELL_MORTALWOUND); - events.ScheduleEvent(EVENT_MORTAL_WOUND, 8s); - break; - case EVENT_SANDTRAP: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true)) - target->CastSpell(target, SPELL_SANDTRAP, true); - else if (Unit* victim = me->GetVictim()) - victim->CastSpell(victim, SPELL_SANDTRAP, true); - events.ScheduleEvent(EVENT_SANDTRAP, 5s, 15s); - break; - case EVENT_WIDE_SLASH: - DoCast(me, SPELL_WIDE_SLASH); - events.ScheduleEvent(EVENT_WIDE_SLASH, 11s); - break; - case EVENT_TRASH: - DoCast(me, SPELL_TRASH); - events.ScheduleEvent(EVENT_WIDE_SLASH, 15s); - break; - default: - break; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } - - DoMeleeAttackIfReady(); + case EVENT_MORTAL_WOUND: + DoCastVictim(SPELL_MORTAL_WOUND); + events.Repeat(4s, 12s); + break; + case EVENT_SAND_TRAP: + DoCastSelf(SPELL_SAND_TRAP_TRIGGER); + events.Repeat(5s, 15s); + break; + case EVENT_THRASH: + DoCastSelf(SPELL_THRASH); + events.Repeat(10s, 20s); + break; + case EVENT_WIDE_SLASH: + DoCastSelf(SPELL_WIDE_SLASH); + events.Repeat(10s, 15s); + break; + case EVENT_FRENZY: + DoCastSelf(SPELL_FRENZY); + break; + case EVENT_SUMMON_PLAYER: + if (me->GetDistance(me->GetVictim()) > 10.0f) + DoCastVictim(SPELL_SUMMON_PLAYER); + events.Repeat(5s); + break; + default: + break; } - private: - bool _enraged; - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetAQ20AI<boss_kurinnaxxAI>(creature); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } + + DoMeleeAttackIfReady(); + } + +private: + bool _frenzied; +}; + +// 26524 - Sand Trap +class spell_kurinnaxx_sand_trap : public SpellScript +{ + PrepareSpellScript(spell_kurinnaxx_sand_trap); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_SAND_TRAP_EFFECT }); + } + + void FilterTargets(std::list<WorldObject*>& targets) + { + if (targets.empty()) + return; + + WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets); + targets.clear(); + targets.push_back(target); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->CastSpell(GetHitUnit(), SPELL_SAND_TRAP_EFFECT, true); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_kurinnaxx_sand_trap::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_kurinnaxx_sand_trap::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } }; void AddSC_boss_kurinnaxx() { - new boss_kurinnaxx(); + RegisterAQ20CreatureAI(boss_kurinnaxx); + RegisterSpellScript(spell_kurinnaxx_sand_trap); } diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h index 0d68d290032..3b8591b3808 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h @@ -66,4 +66,6 @@ inline AI* GetAQ20AI(T* obj) return GetInstanceAI<AI>(obj, AQ20ScriptName); } +#define RegisterAQ20CreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetAQ20AI) + #endif |