From ae18fc0223bc341b49f2232d4b541df12d911e95 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Sat, 3 Oct 2026 21:54:32 -0300 Subject: [PATCH] refactor(Scripts/TrialOfTheCrusader): Modernize Lord Jaraxxus script (#27943) --- .../rev_1791069358522295300.sql | 7 + .../TrialOfTheCrusader/boss_lord_jaraxxus.cpp | 649 ++++++++---------- .../instance_trial_of_the_crusader.cpp | 4 +- .../trial_of_the_crusader.h | 4 + 4 files changed, 292 insertions(+), 372 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1791069358522295300.sql diff --git a/data/sql/updates/pending_db_world/rev_1791069358522295300.sql b/data/sql/updates/pending_db_world/rev_1791069358522295300.sql new file mode 100644 index 0000000000..49cf53c97f --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1791069358522295300.sql @@ -0,0 +1,7 @@ +-- +DELETE FROM `spell_script_names` WHERE `spell_id` IN (66334, 67905, 67906, 67907) AND `ScriptName` IN ('spell_toc25_mistress_kiss_aura', 'spell_mistress_kiss_aura'); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(66334, 'spell_mistress_kiss_aura'), +(67905, 'spell_mistress_kiss_aura'), +(67906, 'spell_mistress_kiss_aura'), +(67907, 'spell_mistress_kiss_aura'); diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp index 251f69f02a..74b9780418 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp @@ -18,33 +18,28 @@ #include "CreatureScript.h" #include "ScriptedCreature.h" #include "SpellAuras.h" +#include "SpellMgr.h" #include "SpellScript.h" #include "SpellScriptLoader.h" #include "trial_of_the_crusader.h" enum JaraxxusTexts { - SAY_INTRO = 0, - SAY_AGGRO = 1, - EMOTE_LEGION_FLAME = 2, - EMOTE_NETHER_PORTAL = 3, - SAY_MISTRESS_OF_PAIN = 4, - EMOTE_INCINERATE = 5, - SAY_INCINERATE = 6, - EMOTE_INFERNAL_ERUPTION = 7, - SAY_INFERNAL_ERUPTION = 8, - SAY_KILL_PLAYER = 9, - SAY_DEATH = 10, - SAY_BERSERK = 11, + SAY_AGGRO = 1, + EMOTE_LEGION_FLAME = 2, + EMOTE_NETHER_PORTAL = 3, + SAY_MISTRESS_OF_PAIN = 4, + EMOTE_INCINERATE = 5, + SAY_INCINERATE = 6, + EMOTE_INFERNAL_ERUPTION = 7, + SAY_INFERNAL_ERUPTION = 8, + SAY_DEATH = 10, }; enum JaraxxusNPCs { - NPC_LEGION_FLAME = 34784, NPC_INFERNAL_VOLCANO = 34813, - NPC_FEL_INFERNAL = 34815, NPC_NETHER_PORTAL = 34825, - NPC_MISTRESS_OF_PAIN = 34826, }; enum JaraxxusSpells @@ -53,23 +48,18 @@ enum JaraxxusSpells SPELL_INCINERATE_FLESH = 66237, SPELL_FEL_FIREBALL = 66532, SPELL_FEL_LIGHTNING = 66528, - SPELL_TOUCH_OF_JARAXXUS = 66209, SPELL_LEGION_FLAME = 66197, - SPELL_LEGION_FLAME_NPC_AURA = 66201, SPELL_SUMMON_VOLCANO = 66258, SPELL_SUMMON_NETHER_PORTAL = 66269, + SPELL_SPELLSTEAL = 30449, - SPELL_FEL_STEAK = 66494, - SPELL_FEL_STEAK_MORPH = 66493, + SPELL_FEL_STREAK = 66494, + SPELL_FEL_STREAK_MORPH = 66493, SPELL_SHIVAN_SLASH = 66378, SPELL_SPINNING_PAIN_SPIKE = 66283, SPELL_MISTRESS_KISS = 66336, - SPELL_MISTRESS_KISS_PERIODIC_DUMMY = 66334, // also 67905, 67906, 67907 SPELL_MISTRESS_KISS_INTERRUPT = 66359, - - SPELL_CHAINS = 67924, - SPELL_BERSERK = 64238, }; enum JaraxxusEvents @@ -79,394 +69,314 @@ enum JaraxxusEvents EVENT_SPELL_INCINERATE_FLESH, EVENT_SPELL_NETHER_POWER, EVENT_SPELL_LEGION_FLAME, - EVENT_SPELL_TOUCH_OF_JARAXXUS, EVENT_SUMMON_VOLCANO, EVENT_SUMMON_NETHER_PORTAL, - EVENT_SPELL_FEL_STEAK, + EVENT_SPELL_FEL_STREAK, EVENT_SPELL_SHIVAN_SLASH, EVENT_SPELL_SPINNING_PAIN_SPIKE, EVENT_SPELL_MISTRESS_KISS, }; -class boss_jaraxxus : public CreatureScript +struct boss_jaraxxus : public ScriptedAI { -public: - boss_jaraxxus() : CreatureScript("boss_jaraxxus") { } - - CreatureAI* GetAI(Creature* pCreature) const override + boss_jaraxxus(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()), summons(creature) { - return GetTrialOfTheCrusaderAI(pCreature); + me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetReactState(REACT_PASSIVE); } - struct boss_jaraxxusAI : public ScriptedAI + void Reset() override { - boss_jaraxxusAI(Creature* pCreature) : ScriptedAI(pCreature), summons(pCreature) + events.Reset(); + instance->SetData(TYPE_JARAXXUS, NOT_STARTED); + + std::list creatures; + me->GetCreatureListWithEntryInGrid(creatures, NPC_INFERNAL_VOLCANO, 500.0f); + me->GetCreatureListWithEntryInGrid(creatures, NPC_NETHER_PORTAL, 500.0f); + for (Creature* creature : creatures) + creature->DespawnOrUnsummon(); + } + + void JustEngagedWith(Unit* /*who*/) override + { + me->setActive(true); + events.Reset(); + events.RescheduleEvent(EVENT_SPELL_FEL_FIREBALL, 5s); + events.RescheduleEvent(EVENT_SPELL_FEL_LIGHTNING, 10s, 15s); + events.RescheduleEvent(EVENT_SPELL_INCINERATE_FLESH, 24s, 26s); + events.RescheduleEvent(EVENT_SPELL_NETHER_POWER, 25s, 45s); + events.RescheduleEvent(EVENT_SPELL_LEGION_FLAME, 30s); + // Portal and volcano alternate, each scheduling the other + events.RescheduleEvent(EVENT_SUMMON_NETHER_PORTAL, 20s); + + me->RemoveAura(SPELL_JARAXXUS_CHAINS); + Talk(SAY_AGGRO); + DoZoneInCombat(); + instance->SetData(TYPE_JARAXXUS, IN_PROGRESS); + } + + void SpellHit(Unit* caster, SpellInfo const* spellInfo) override + { + uint32 const netherPowerId = sSpellMgr->GetSpellIdForDifficulty(SPELL_NETHER_POWER, me); + + if (spellInfo->Id == netherPowerId) { - pInstance = pCreature->GetInstanceScript(); - me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); - me->SetReactState(REACT_PASSIVE); + if (Aura* aura = me->GetAura(netherPowerId)) + aura->SetStackAmount(spellInfo->StackAmount); + } + else if (spellInfo->Id == SPELL_SPELLSTEAL && caster) + { + if (Aura* aura = me->GetAura(netherPowerId)) + { + if (aura->GetStackAmount() > 1) + aura->ModStackAmount(-1); + else + aura->Remove(); + + caster->CastSpell(caster, SPELL_NETHER_POWER, true); + } + } + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_SPELL_FEL_FIREBALL: + DoCastVictim(SPELL_FEL_FIREBALL); + events.Repeat(10s, 15s); + break; + case EVENT_SPELL_FEL_LIGHTNING: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, true)) + DoCast(target, SPELL_FEL_LIGHTNING); + events.Repeat(10s, 15s); + break; + case EVENT_SPELL_INCINERATE_FLESH: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, true)) + { + Talk(EMOTE_INCINERATE, target); + Talk(SAY_INCINERATE); + DoCast(target, SPELL_INCINERATE_FLESH); + } + events.Repeat(20s, 25s); + break; + case EVENT_SPELL_NETHER_POWER: + DoCastSelf(SPELL_NETHER_POWER); + events.DelayEvents(5s); + events.Repeat(25s, 45s); + break; + case EVENT_SPELL_LEGION_FLAME: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, true)) + { + Talk(EMOTE_LEGION_FLAME, target); + DoCast(target, SPELL_LEGION_FLAME); + } + events.Repeat(30s); + break; + case EVENT_SUMMON_NETHER_PORTAL: + Talk(EMOTE_NETHER_PORTAL); + Talk(SAY_MISTRESS_OF_PAIN); + DoCastAOE(SPELL_SUMMON_NETHER_PORTAL); + events.RescheduleEvent(EVENT_SUMMON_VOLCANO, 1min); + break; + case EVENT_SUMMON_VOLCANO: + Talk(EMOTE_INFERNAL_ERUPTION); + Talk(SAY_INFERNAL_ERUPTION); + DoCastAOE(SPELL_SUMMON_VOLCANO); + events.RescheduleEvent(EVENT_SUMMON_NETHER_PORTAL, 1min); + break; + default: + break; } - InstanceScript* pInstance; - EventMap events; - SummonList summons; + DoMeleeAttackIfReady(); + } - void Reset() override + void JustDied(Unit* /*killer*/) override + { + summons.DespawnAll(); + Talk(SAY_DEATH); + instance->SetData(TYPE_JARAXXUS, DONE); + } + + void JustReachedHome() override + { + me->setActive(false); + } + + void JustSummoned(Creature* summon) override + { + summons.Summon(summon); + } + + void EnterEvadeMode(EvadeReason /*why*/) override + { + events.Reset(); + summons.DespawnAll(); + me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); + instance->SetData(TYPE_FAILED, 1); + } + + void MoveInLineOfSight(Unit* /*who*/) override { } + +private: + InstanceScript* const instance; + SummonList summons; +}; + +struct npc_fel_infernal : public ScriptedAI +{ + npc_fel_infernal(Creature* creature) : ScriptedAI(creature) { } + + void Reset() override + { + if (Unit* target = me->SelectNearestTarget(200.0f)) { - events.Reset(); - if (pInstance) - pInstance->SetData(TYPE_JARAXXUS, NOT_STARTED); - - std::list creatures; - me->GetCreatureListWithEntryInGrid(creatures, NPC_INFERNAL_VOLCANO, 500.f); - me->GetCreatureListWithEntryInGrid(creatures, NPC_NETHER_PORTAL, 500.f); - for (Creature* creature : creatures) - creature->DespawnOrUnsummon(); - } - - void JustEngagedWith(Unit* /*who*/) override - { - me->setActive(true); - events.Reset(); - events.RescheduleEvent(EVENT_SPELL_FEL_FIREBALL, 5s); - events.RescheduleEvent(EVENT_SPELL_FEL_LIGHTNING, 10s, 15s); - events.RescheduleEvent(EVENT_SPELL_INCINERATE_FLESH, 24s, 26s); - events.RescheduleEvent(EVENT_SPELL_NETHER_POWER, 25s, 45s); - events.RescheduleEvent(EVENT_SPELL_LEGION_FLAME, 30s); - //if (GetDifficulty() == RAID_DIFFICULTY_25MAN_HEROIC ) - // events.RescheduleEvent(EVENT_SPELL_TOUCH_OF_JARAXXUS, 10s, 15s); - events.RescheduleEvent(EVENT_SUMMON_NETHER_PORTAL, 20s); // it schedules EVENT_SUMMON_VOLCANO - - me->RemoveAura(SPELL_CHAINS); - Talk(SAY_AGGRO); + AttackStart(target); DoZoneInCombat(); - if (pInstance) - pInstance->SetData(TYPE_JARAXXUS, IN_PROGRESS); } + events.Reset(); + events.RescheduleEvent(EVENT_SPELL_FEL_STREAK, 7s, 20s); + } - void SpellHit(Unit* caster, SpellInfo const* spell) override + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) { - switch (spell->Id) - { - case 66228: - case 67106: - case 67107: - case 67108: - if (Aura* a = me->GetAura(spell->Id)) - a->SetStackAmount(spell->StackAmount); - break; - case 30449: - { - if (!caster) - return; - uint32 id = 0; - switch (me->GetMap()->GetDifficulty()) - { - case 0: - id = 66228; - break; - case 1: - id = 67106; - break; - case 2: - id = 67107; - break; - case 3: - id = 67108; - break; - } - if (Aura* a = me->GetAura(id)) - { - if (a->GetStackAmount() > 1 ) - a->ModStackAmount(-1); - else - a->Remove(); - caster->CastSpell(caster, SPELL_NETHER_POWER, true); - } - } - break; - default: - break; - } - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case 0: - break; - case EVENT_SPELL_FEL_FIREBALL: - if (me->GetVictim()) - me->CastSpell(me->GetVictim(), SPELL_FEL_FIREBALL, false); - events.Repeat(10s, 15s); - break; - case EVENT_SPELL_FEL_LIGHTNING: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, true)) - me->CastSpell(target, SPELL_FEL_LIGHTNING, false); - events.Repeat(10s, 15s); - break; - case EVENT_SPELL_INCINERATE_FLESH: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, true)) - { - Talk(EMOTE_INCINERATE, target); - Talk(SAY_INCINERATE); - me->CastSpell(target, SPELL_INCINERATE_FLESH, false); - } - events.Repeat(20s, 25s); - break; - case EVENT_SPELL_NETHER_POWER: - me->CastSpell(me, SPELL_NETHER_POWER, false); - events.DelayEvents(5s); - events.Repeat(25s, 45s); - break; - case EVENT_SPELL_LEGION_FLAME: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, true)) - { - Talk(EMOTE_LEGION_FLAME, target); - me->CastSpell(target, SPELL_LEGION_FLAME, false); - } + case EVENT_SPELL_FEL_STREAK: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 44.0f, true)) + { + DoResetThreatList(); + me->AddThreat(target, 50000.0f); + DoCast(target, SPELL_FEL_STREAK_MORPH, true); + DoCast(target, SPELL_FEL_STREAK, true); events.Repeat(30s); - break; - case EVENT_SPELL_TOUCH_OF_JARAXXUS: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true)) - me->CastSpell(target, SPELL_TOUCH_OF_JARAXXUS, false); - events.Repeat(10s, 15s); - break; - case EVENT_SUMMON_NETHER_PORTAL: - Talk(EMOTE_NETHER_PORTAL); - Talk(SAY_MISTRESS_OF_PAIN); - me->CastSpell((Unit*)nullptr, SPELL_SUMMON_NETHER_PORTAL, false); - - events.RescheduleEvent(EVENT_SUMMON_VOLCANO, 1min); - break; - case EVENT_SUMMON_VOLCANO: - Talk(EMOTE_INFERNAL_ERUPTION); - Talk(SAY_INFERNAL_ERUPTION); - me->CastSpell((Unit*)nullptr, SPELL_SUMMON_VOLCANO, false); - - events.RescheduleEvent(EVENT_SUMMON_NETHER_PORTAL, 1min); - break; - } - - DoMeleeAttackIfReady(); + } + else + events.Repeat(5s); + break; + default: + break; } - void JustDied(Unit* /*pKiller*/) override - { - summons.DespawnAll(); - Talk(SAY_DEATH); - if (pInstance) - pInstance->SetData(TYPE_JARAXXUS, DONE); - } - - void JustReachedHome() override - { - me->setActive(false); - } - - void JustSummoned(Creature* summon) override - { - summons.Summon(summon); - } - - void EnterEvadeMode(EvadeReason /*why*/) override - { - events.Reset(); - summons.DespawnAll(); - me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); - if (pInstance) - pInstance->SetData(TYPE_FAILED, 1); - } - - void MoveInLineOfSight(Unit* /*who*/) override {} - }; -}; - -class npc_fel_infernal : public CreatureScript -{ -public: - npc_fel_infernal() : CreatureScript("npc_fel_infernal") { } - - CreatureAI* GetAI(Creature* pCreature) const override - { - return GetTrialOfTheCrusaderAI(pCreature); + DoMeleeAttackIfReady(); } - struct npc_fel_infernalAI : public ScriptedAI + void JustDied(Unit* /*killer*/) override { - npc_fel_infernalAI(Creature* pCreature) : ScriptedAI(pCreature) {} - - EventMap events; - - void Reset() override - { - if (Unit* target = me->SelectNearestTarget(200.0f)) - { - AttackStart(target); - DoZoneInCombat(); - } - events.Reset(); - events.RescheduleEvent(EVENT_SPELL_FEL_STEAK, 7s, 20s); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case 0: - break; - case EVENT_SPELL_FEL_STEAK: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 44.0f, true)) - { - DoResetThreatList(); - me->AddThreat(target, 50000.0f); - me->CastSpell(target, SPELL_FEL_STEAK_MORPH, true); - me->CastSpell(target, SPELL_FEL_STEAK, true); - events.Repeat(30s); - } - else - events.Repeat(5s); - break; - } - - DoMeleeAttackIfReady(); - } - - void JustDied(Unit* /*killer*/) override - { - me->DespawnOrUnsummon(10s); - } - - void EnterEvadeMode(EvadeReason /*why*/) override - { - me->DespawnOrUnsummon(); - } - }; -}; - -class npc_mistress_of_pain : public CreatureScript -{ -public: - npc_mistress_of_pain() : CreatureScript("npc_mistress_of_pain") { } - - CreatureAI* GetAI(Creature* pCreature) const override - { - return GetTrialOfTheCrusaderAI(pCreature); + me->DespawnOrUnsummon(10s); } - struct npc_mistress_of_painAI : public ScriptedAI + void EnterEvadeMode(EvadeReason /*why*/) override { - npc_mistress_of_painAI(Creature* pCreature) : ScriptedAI(pCreature) {} - - EventMap events; - - void Reset() override - { - if (Unit* target = me->SelectNearestTarget(200.0f)) - { - AttackStart(target); - DoZoneInCombat(); - } - events.Reset(); - events.RescheduleEvent(EVENT_SPELL_SHIVAN_SLASH, 10s, 20s); - events.RescheduleEvent(EVENT_SPELL_SPINNING_PAIN_SPIKE, 22s, 30s); - if (IsHeroic()) - events.RescheduleEvent(EVENT_SPELL_MISTRESS_KISS, 10s, 15s); - } - - void SpellHit(Unit* /*caster*/, SpellInfo const* /*spell*/) override - { - //if (caster && spell && spell->Id == 66287 /*control vehicle*/) - // caster->ClearUnitState(UNIT_STATE_ONVEHICLE); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case 0: - break; - case EVENT_SPELL_SHIVAN_SLASH: - if (me->GetVictim()) - me->CastSpell(me->GetVictim(), SPELL_SHIVAN_SLASH, false); - events.Repeat(15s, 25s); - break; - case EVENT_SPELL_SPINNING_PAIN_SPIKE: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 140.0f, true)) - me->CastSpell(target, SPELL_SPINNING_PAIN_SPIKE, false); - events.Repeat(25s, 30s); - break; - case EVENT_SPELL_MISTRESS_KISS: - me->CastSpell((Unit*)nullptr, SPELL_MISTRESS_KISS, false); - events.Repeat(25s, 35s); - break; - } - - DoMeleeAttackIfReady(); - } - - void JustDied(Unit* /*killer*/) override - { - me->DespawnOrUnsummon(10s); - } - - void EnterEvadeMode(EvadeReason /*why*/) override - { - me->DespawnOrUnsummon(); - } - }; + me->DespawnOrUnsummon(); + } }; -class spell_toc25_mistress_kiss_aura : public AuraScript +struct npc_mistress_of_pain : public ScriptedAI { - PrepareAuraScript(spell_toc25_mistress_kiss_aura); + npc_mistress_of_pain(Creature* creature) : ScriptedAI(creature) { } + + void Reset() override + { + if (Unit* target = me->SelectNearestTarget(200.0f)) + { + AttackStart(target); + DoZoneInCombat(); + } + events.Reset(); + events.RescheduleEvent(EVENT_SPELL_SHIVAN_SLASH, 10s, 20s); + events.RescheduleEvent(EVENT_SPELL_SPINNING_PAIN_SPIKE, 22s, 30s); + if (IsHeroic()) + events.RescheduleEvent(EVENT_SPELL_MISTRESS_KISS, 10s, 15s); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_SPELL_SHIVAN_SLASH: + DoCastVictim(SPELL_SHIVAN_SLASH); + events.Repeat(15s, 25s); + break; + case EVENT_SPELL_SPINNING_PAIN_SPIKE: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 140.0f, true)) + DoCast(target, SPELL_SPINNING_PAIN_SPIKE); + events.Repeat(25s, 30s); + break; + case EVENT_SPELL_MISTRESS_KISS: + DoCastAOE(SPELL_MISTRESS_KISS); + events.Repeat(25s, 35s); + break; + default: + break; + } + + DoMeleeAttackIfReady(); + } + + void JustDied(Unit* /*killer*/) override + { + me->DespawnOrUnsummon(10s); + } + + void EnterEvadeMode(EvadeReason /*why*/) override + { + me->DespawnOrUnsummon(); + } +}; + +class spell_mistress_kiss_aura : public AuraScript +{ + PrepareAuraScript(spell_mistress_kiss_aura); bool Validate(SpellInfo const* /*spellInfo*/) override { - return ValidateSpellInfo({ 66359 }); + return ValidateSpellInfo({ SPELL_MISTRESS_KISS_INTERRUPT }); } - void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) { + Unit* target = GetTarget(); + if (!target->HasUnitState(UNIT_STATE_CASTING)) + return; + if (Unit* caster = GetCaster()) - if (Unit* target = GetTarget()) - if (target->HasUnitState(UNIT_STATE_CASTING)) - { - caster->CastSpell(target, 66359, true); - SetDuration(0); - } + { + caster->CastSpell(target, SPELL_MISTRESS_KISS_INTERRUPT, true); + SetDuration(0); + } } void Register() override { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_toc25_mistress_kiss_aura::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_mistress_kiss_aura::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); } }; @@ -476,7 +386,6 @@ class spell_mistress_kiss_area : public SpellScript void FilterTargets(std::list& targets) { - // get a list of players with mana targets.remove_if(Acore::ObjectTypeIdCheck(TYPEID_PLAYER, false)); targets.remove_if(Acore::PowerCheck(POWER_MANA, false)); if (targets.empty()) @@ -501,9 +410,9 @@ class spell_mistress_kiss_area : public SpellScript void AddSC_boss_jaraxxus() { - new boss_jaraxxus(); - new npc_fel_infernal(); - new npc_mistress_of_pain(); - RegisterSpellScript(spell_toc25_mistress_kiss_aura); + RegisterTrialOfTheCrusaderCreatureAI(boss_jaraxxus); + RegisterTrialOfTheCrusaderCreatureAI(npc_fel_infernal); + RegisterTrialOfTheCrusaderCreatureAI(npc_mistress_of_pain); + RegisterSpellScript(spell_mistress_kiss_aura); RegisterSpellScript(spell_mistress_kiss_area); } diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp index c91c08a554..f868c59d40 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp @@ -1476,7 +1476,7 @@ public: c->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP); if (Creature* jaraxxus = c->SummonCreature(NPC_JARAXXUS, Locs[LOC_CENTER].GetPositionX(), Locs[LOC_CENTER].GetPositionY(), Locs[LOC_CENTER].GetPositionZ(), Locs[LOC_CENTER].GetOrientation(), TEMPSUMMON_CORPSE_TIMED_DESPAWN, 630000000)) { - jaraxxus->CastSpell(jaraxxus, 67924, true); + jaraxxus->CastSpell(jaraxxus, SPELL_JARAXXUS_CHAINS, true); jaraxxus->SetReactState(REACT_AGGRESSIVE); jaraxxus->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); jaraxxus->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); @@ -1638,7 +1638,7 @@ public: { std::list L; uint8 count = 0; - c->GetCreaturesWithEntryInRange(L, 200.0f, 34826); // find all mistress of pain + c->GetCreaturesWithEntryInRange(L, 200.0f, NPC_MISTRESS_OF_PAIN); for( std::list::const_iterator itr = L.begin(); itr != L.end(); ++itr ) if ((*itr)->IsAlive()) ++count; diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h index f2598bc84a..7866014a45 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h @@ -147,6 +147,7 @@ enum NPCs NPC_ACIDMAW = 35144, NPC_ICEHOWL = 34797, NPC_JARAXXUS = 34780, + NPC_MISTRESS_OF_PAIN = 34826, NPC_PURPLE_GROUND = 35651, NPC_WORLD_TRIGGER = 18721, @@ -353,6 +354,7 @@ enum EventSpells SPELL_RESILIENCE_WILL_FIX_IT_CREDIT = 68620, SPELL_TRAITOR_KING = 68186, SPELL_PORTAL_TO_DALARAN = 53142, + SPELL_JARAXXUS_CHAINS = 67924, }; enum eAchievementCriteria @@ -403,4 +405,6 @@ inline AI* GetTrialOfTheCrusaderAI(T* obj) return GetInstanceAI(obj, TrialOfTheCrusaderScriptName); } +#define RegisterTrialOfTheCrusaderCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetTrialOfTheCrusaderAI) + #endif