aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoroffl <11556157+offl@users.noreply.github.com>2025-08-16 15:31:45 +0300
committerGitHub <noreply@github.com>2025-08-16 14:31:45 +0200
commit126fa17de9ca9ee3871a4c584b7f51a981c4211b (patch)
treea25bbf005721fd6793cc6ea13e81bb0d4bf1042d /src
parent7de212a6407095d25d7437541ada469118cad102 (diff)
Scripts/AQ20: Refactor Kurinnaxx and implement Sand Trap (#31203)
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp243
-rw-r--r--src/server/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h2
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