diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp | 615 | ||||
-rw-r--r-- | src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h | 2 |
2 files changed, 282 insertions, 335 deletions
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp index a35755244f5..d19f9d8cdee 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp @@ -100,388 +100,333 @@ enum Misc ACTION_START_PHASE_2 }; -class boss_ingvar_the_plunderer : public CreatureScript +struct boss_ingvar_the_plunderer : public BossAI { - public: - boss_ingvar_the_plunderer() : CreatureScript("boss_ingvar_the_plunderer") { } + boss_ingvar_the_plunderer(Creature* creature) : BossAI(creature, DATA_INGVAR) { } - struct boss_ingvar_the_plundererAI : public BossAI - { - boss_ingvar_the_plundererAI(Creature* creature) : BossAI(creature, DATA_INGVAR) { } - - void Reset() override - { - if (me->GetEntry() != NPC_INGVAR) - me->UpdateEntry(NPC_INGVAR); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); - me->SetImmuneToPC(false); - - _Reset(); - } - - void DamageTaken(Unit* /*doneBy*/, uint32& damage) override - { - if (damage >= me->GetHealth() && events.IsInPhase(PHASE_HUMAN)) - { - events.SetPhase(PHASE_EVENT); - events.ScheduleEvent(EVENT_SUMMON_BANSHEE, 3s, 0, PHASE_EVENT); - - me->RemoveAllAuras(); - me->StopMoving(); - DoCast(me, SPELL_INGVAR_FEIGN_DEATH, true); - - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); - me->SetImmuneToPC(true, true); - - Talk(SAY_DEATH); - } - - if (events.IsInPhase(PHASE_EVENT)) - damage = 0; - } + void Reset() override + { + if (me->GetEntry() != NPC_INGVAR) + me->UpdateEntry(NPC_INGVAR); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); + me->SetImmuneToPC(false); - void DoAction(int32 actionId) override - { - if (actionId == ACTION_START_PHASE_2) - StartZombiePhase(); - } - - void StartZombiePhase() - { - me->RemoveAura(SPELL_INGVAR_FEIGN_DEATH); - DoCast(me, SPELL_INGVAR_TRANSFORM, true); - me->UpdateEntry(NPC_INGVAR_UNDEAD); - events.ScheduleEvent(EVENT_JUST_TRANSFORMED, 500ms, 0, PHASE_EVENT); - } - - void JustEngagedWith(Unit* who) override - { - if (events.IsInPhase(PHASE_EVENT) || events.IsInPhase(PHASE_UNDEAD)) // ingvar gets multiple JustEngagedWith calls - return; - BossAI::JustEngagedWith(who); - - Talk(SAY_AGGRO); - events.SetPhase(PHASE_HUMAN); - events.ScheduleEvent(EVENT_CLEAVE, 6s, 12s, 0, PHASE_HUMAN); - events.ScheduleEvent(EVENT_STAGGERING_ROAR, 18s, 21s, 0, PHASE_HUMAN); - events.ScheduleEvent(EVENT_ENRAGE, 7s, 14s, 0, PHASE_HUMAN); - events.ScheduleEvent(EVENT_SMASH, 12s, 17s, 0, PHASE_HUMAN); - } + _Reset(); + } - void AttackStart(Unit* who) override - { - if (events.IsInPhase(PHASE_EVENT)) // prevent ingvar from beginning to attack/chase during transition - return; - BossAI::AttackStart(who); - } + void DamageTaken(Unit* /*doneBy*/, uint32& damage) override + { + if (damage >= me->GetHealth() && events.IsInPhase(PHASE_HUMAN)) + { + events.SetPhase(PHASE_EVENT); + events.ScheduleEvent(EVENT_SUMMON_BANSHEE, 3s, 0, PHASE_EVENT); - void JustDied(Unit* /*killer*/) override - { - _JustDied(); - Talk(SAY_DEATH); - } + me->RemoveAllAuras(); + me->StopMoving(); + DoCast(me, SPELL_INGVAR_FEIGN_DEATH, true); - void ScheduleSecondPhase() - { - events.SetPhase(PHASE_UNDEAD); - events.ScheduleEvent(EVENT_DARK_SMASH, 14s, 18s, 0, PHASE_UNDEAD); - events.ScheduleEvent(EVENT_DREADFUL_ROAR, 0ms, 0, PHASE_UNDEAD); - events.ScheduleEvent(EVENT_WOE_STRIKE, 10s, 14s, 0, PHASE_UNDEAD); - events.ScheduleEvent(EVENT_SHADOW_AXE, 30s, 0, PHASE_UNDEAD); - } + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); + me->SetImmuneToPC(true, true); - void KilledUnit(Unit* who) override - { - if (who->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_SLAY); - } + Talk(SAY_DEATH); + } - void UpdateAI(uint32 diff) override + if (events.IsInPhase(PHASE_EVENT)) + damage = 0; + } + + void DoAction(int32 actionId) override + { + if (actionId == ACTION_START_PHASE_2) + StartZombiePhase(); + } + + void StartZombiePhase() + { + me->RemoveAura(SPELL_INGVAR_FEIGN_DEATH); + DoCast(me, SPELL_INGVAR_TRANSFORM, true); + me->UpdateEntry(NPC_INGVAR_UNDEAD); + events.ScheduleEvent(EVENT_JUST_TRANSFORMED, 500ms, 0, PHASE_EVENT); + } + + void JustEngagedWith(Unit* who) override + { + if (events.IsInPhase(PHASE_EVENT) || events.IsInPhase(PHASE_UNDEAD)) // ingvar gets multiple JustEngagedWith calls + return; + BossAI::JustEngagedWith(who); + + Talk(SAY_AGGRO); + events.SetPhase(PHASE_HUMAN); + events.ScheduleEvent(EVENT_CLEAVE, 6s, 12s, 0, PHASE_HUMAN); + events.ScheduleEvent(EVENT_STAGGERING_ROAR, 18s, 21s, 0, PHASE_HUMAN); + events.ScheduleEvent(EVENT_ENRAGE, 7s, 14s, 0, PHASE_HUMAN); + events.ScheduleEvent(EVENT_SMASH, 12s, 17s, 0, PHASE_HUMAN); + } + + void AttackStart(Unit* who) override + { + if (events.IsInPhase(PHASE_EVENT)) // prevent ingvar from beginning to attack/chase during transition + return; + BossAI::AttackStart(who); + } + + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + Talk(SAY_DEATH); + } + + void ScheduleSecondPhase() + { + events.SetPhase(PHASE_UNDEAD); + events.ScheduleEvent(EVENT_DARK_SMASH, 14s, 18s, 0, PHASE_UNDEAD); + events.ScheduleEvent(EVENT_DREADFUL_ROAR, 0ms, 0, PHASE_UNDEAD); + events.ScheduleEvent(EVENT_WOE_STRIKE, 10s, 14s, 0, PHASE_UNDEAD); + events.ScheduleEvent(EVENT_SHADOW_AXE, 30s, 0, PHASE_UNDEAD); + } + + void KilledUnit(Unit* who) override + { + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } + + void UpdateAI(uint32 diff) override + { + if (!events.IsInPhase(PHASE_EVENT) && !UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) { - if (!events.IsInPhase(PHASE_EVENT) && !UpdateVictim()) + // PHASE ONE + case EVENT_CLEAVE: + DoCastVictim(SPELL_CLEAVE); + events.ScheduleEvent(EVENT_CLEAVE, 6s, 12s, 0, PHASE_HUMAN); + break; + case EVENT_STAGGERING_ROAR: + DoCast(me, SPELL_STAGGERING_ROAR); + events.ScheduleEvent(EVENT_STAGGERING_ROAR, 18s, 22s, 0, PHASE_HUMAN); + break; + case EVENT_ENRAGE: + DoCast(me, SPELL_ENRAGE); + events.ScheduleEvent(EVENT_ENRAGE, 7s, 14s, 0, PHASE_HUMAN); + break; + case EVENT_SMASH: + DoCastAOE(SPELL_SMASH); + events.ScheduleEvent(EVENT_SMASH, 12s, 16s, 0, PHASE_HUMAN); + break; + case EVENT_JUST_TRANSFORMED: + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); + me->SetImmuneToPC(false); + ScheduleSecondPhase(); + Talk(SAY_AGGRO); + DoZoneInCombat(); return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) + case EVENT_SUMMON_BANSHEE: + DoCast(me, SPELL_SUMMON_BANSHEE); return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - // PHASE ONE - case EVENT_CLEAVE: - DoCastVictim(SPELL_CLEAVE); - events.ScheduleEvent(EVENT_CLEAVE, 6s, 12s, 0, PHASE_HUMAN); - break; - case EVENT_STAGGERING_ROAR: - DoCast(me, SPELL_STAGGERING_ROAR); - events.ScheduleEvent(EVENT_STAGGERING_ROAR, 18s, 22s, 0, PHASE_HUMAN); - break; - case EVENT_ENRAGE: - DoCast(me, SPELL_ENRAGE); - events.ScheduleEvent(EVENT_ENRAGE, 7s, 14s, 0, PHASE_HUMAN); - break; - case EVENT_SMASH: - DoCastAOE(SPELL_SMASH); - events.ScheduleEvent(EVENT_SMASH, 12s, 16s, 0, PHASE_HUMAN); - break; - case EVENT_JUST_TRANSFORMED: - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); - me->SetImmuneToPC(false); - ScheduleSecondPhase(); - Talk(SAY_AGGRO); - DoZoneInCombat(); - return; - case EVENT_SUMMON_BANSHEE: - DoCast(me, SPELL_SUMMON_BANSHEE); - return; - // PHASE TWO - case EVENT_DARK_SMASH: - DoCastVictim(SPELL_DARK_SMASH); - events.ScheduleEvent(EVENT_DARK_SMASH, 12s, 16s, 0, PHASE_UNDEAD); - break; - case EVENT_DREADFUL_ROAR: - DoCast(me, SPELL_DREADFUL_ROAR); - events.ScheduleEvent(EVENT_DREADFUL_ROAR, 18s, 22s, 0, PHASE_UNDEAD); - break; - case EVENT_WOE_STRIKE: - DoCastVictim(SPELL_WOE_STRIKE); - events.ScheduleEvent(EVENT_WOE_STRIKE, 10s, 14s, 0, PHASE_UNDEAD); - break; - case EVENT_SHADOW_AXE: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.0f, true)) - DoCast(target, SPELL_SHADOW_AXE_SUMMON); - events.ScheduleEvent(EVENT_SHADOW_AXE, 30s, 0, PHASE_UNDEAD); - break; - default: - break; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } - - if (!events.IsInPhase(PHASE_EVENT)) - DoMeleeAttackIfReady(); + // PHASE TWO + case EVENT_DARK_SMASH: + DoCastVictim(SPELL_DARK_SMASH); + events.ScheduleEvent(EVENT_DARK_SMASH, 12s, 16s, 0, PHASE_UNDEAD); + break; + case EVENT_DREADFUL_ROAR: + DoCast(me, SPELL_DREADFUL_ROAR); + events.ScheduleEvent(EVENT_DREADFUL_ROAR, 18s, 22s, 0, PHASE_UNDEAD); + break; + case EVENT_WOE_STRIKE: + DoCastVictim(SPELL_WOE_STRIKE); + events.ScheduleEvent(EVENT_WOE_STRIKE, 10s, 14s, 0, PHASE_UNDEAD); + break; + case EVENT_SHADOW_AXE: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.0f, true)) + DoCast(target, SPELL_SHADOW_AXE_SUMMON); + events.ScheduleEvent(EVENT_SHADOW_AXE, 30s, 0, PHASE_UNDEAD); + break; + default: + break; } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetUtgardeKeepAI<boss_ingvar_the_plundererAI>(creature); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } + + if (!events.IsInPhase(PHASE_EVENT)) + DoMeleeAttackIfReady(); + } }; -class npc_annhylde_the_caller : public CreatureScript +struct npc_annhylde_the_caller : public ScriptedAI { - public: - npc_annhylde_the_caller() : CreatureScript("npc_annhylde_the_caller") { } - - struct npc_annhylde_the_callerAI : public ScriptedAI + npc_annhylde_the_caller(Creature* creature) : ScriptedAI(creature) + { + x = 0.f; + y = 0.f; + z = 0.f; + _instance = creature->GetInstanceScript(); + } + + void Reset() override + { + _events.Reset(); + + me->GetPosition(x, y, z); + me->GetMotionMaster()->MovePoint(1, x, y, z - 15.0f); + } + + void MovementInform(uint32 type, uint32 id) override + { + if (type != POINT_MOTION_TYPE) + return; + + switch (id) { - npc_annhylde_the_callerAI(Creature* creature) : ScriptedAI(creature) - { - x = 0.f; - y = 0.f; - z = 0.f; - _instance = creature->GetInstanceScript(); - } - - void Reset() override - { - _events.Reset(); - - me->GetPosition(x, y, z); - me->GetMotionMaster()->MovePoint(1, x, y, z - 15.0f); - } - - void MovementInform(uint32 type, uint32 id) override - { - if (type != POINT_MOTION_TYPE) - return; - - switch (id) + case 1: + Talk(YELL_RESURRECT); + if (Creature* ingvar = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_INGVAR))) { - case 1: - Talk(YELL_RESURRECT); - if (Creature* ingvar = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_INGVAR))) - { - ingvar->RemoveAura(SPELL_SUMMON_BANSHEE); - ingvar->CastSpell(ingvar, SPELL_SCOURG_RESURRECTION_DUMMY, true); - DoCast(ingvar, SPELL_SCOURG_RESURRECTION_BEAM); - } - _events.ScheduleEvent(EVENT_RESURRECT_1, 8s); - break; - case 2: - me->DespawnOrUnsummon(); - break; - default: - break; + ingvar->RemoveAura(SPELL_SUMMON_BANSHEE); + ingvar->CastSpell(ingvar, SPELL_SCOURG_RESURRECTION_DUMMY, true); + DoCast(ingvar, SPELL_SCOURG_RESURRECTION_BEAM); } - } + _events.ScheduleEvent(EVENT_RESURRECT_1, 8s); + break; + case 2: + me->DespawnOrUnsummon(); + break; + default: + break; + } + } - void AttackStart(Unit* /*who*/) override { } - void MoveInLineOfSight(Unit* /*who*/) override { } - void JustEngagedWith(Unit* /*who*/) override { } + void AttackStart(Unit* /*who*/) override { } + void MoveInLineOfSight(Unit* /*who*/) override { } + void JustEngagedWith(Unit* /*who*/) override { } - void UpdateAI(uint32 diff) override - { - _events.Update(diff); + void UpdateAI(uint32 diff) override + { + _events.Update(diff); - while (uint32 eventId = _events.ExecuteEvent()) - { - switch (eventId) + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_RESURRECT_1: + if (Creature* ingvar = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_INGVAR))) { - case EVENT_RESURRECT_1: - if (Creature* ingvar = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_INGVAR))) - { - ingvar->RemoveAura(SPELL_INGVAR_FEIGN_DEATH); - ingvar->CastSpell(ingvar, SPELL_SCOURG_RESURRECTION_HEAL, false); - } - _events.ScheduleEvent(EVENT_RESURRECT_2, 3s); - break; - case EVENT_RESURRECT_2: - if (Creature* ingvar = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_INGVAR))) - { - ingvar->RemoveAurasDueToSpell(SPELL_SCOURG_RESURRECTION_DUMMY); - ingvar->AI()->DoAction(ACTION_START_PHASE_2); - } - - me->GetMotionMaster()->MovePoint(2, x, y, z + 15.0f); - break; - default: - break; + ingvar->RemoveAura(SPELL_INGVAR_FEIGN_DEATH); + ingvar->CastSpell(ingvar, SPELL_SCOURG_RESURRECTION_HEAL, false); + } + _events.ScheduleEvent(EVENT_RESURRECT_2, 3s); + break; + case EVENT_RESURRECT_2: + if (Creature* ingvar = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_INGVAR))) + { + ingvar->RemoveAurasDueToSpell(SPELL_SCOURG_RESURRECTION_DUMMY); + ingvar->AI()->DoAction(ACTION_START_PHASE_2); } - } - } - - private: - InstanceScript* _instance; - EventMap _events; - float x, y, z; - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetUtgardeKeepAI<npc_annhylde_the_callerAI>(creature); + me->GetMotionMaster()->MovePoint(2, x, y, z + 15.0f); + break; + default: + break; + } } + } + +private: + InstanceScript* _instance; + EventMap _events; + float x, y, z; }; -class npc_ingvar_throw_dummy : public CreatureScript +struct npc_ingvar_throw_dummy : public ScriptedAI { - public: - npc_ingvar_throw_dummy() : CreatureScript("npc_ingvar_throw_dummy") { } + npc_ingvar_throw_dummy(Creature* creature) : ScriptedAI(creature) { } - struct npc_ingvar_throw_dummyAI : public ScriptedAI + void Reset() override + { + if (Creature* target = me->FindNearestCreature(NPC_THROW_TARGET, 200.0f)) { - npc_ingvar_throw_dummyAI(Creature* creature) : ScriptedAI(creature) { } - - void Reset() override - { - if (Creature* target = me->FindNearestCreature(NPC_THROW_TARGET, 200.0f)) - { - float x, y, z; - target->GetPosition(x, y, z); - me->GetMotionMaster()->MoveCharge(x, y, z); - target->DespawnOrUnsummon(); - } - else - me->DespawnOrUnsummon(); - } - - void MovementInform(uint32 type, uint32 id) override - { - if (type == EFFECT_MOTION_TYPE && id == EVENT_CHARGE) - { - me->CastSpell(me, SPELL_SHADOW_AXE_PERIODIC_DAMAGE, true); - me->DespawnOrUnsummon(10s); - } - } - }; + float x, y, z; + target->GetPosition(x, y, z); + me->GetMotionMaster()->MoveCharge(x, y, z); + target->DespawnOrUnsummon(); + } + else + me->DespawnOrUnsummon(); + } - CreatureAI* GetAI(Creature* creature) const override + void MovementInform(uint32 type, uint32 id) override + { + if (type == EFFECT_MOTION_TYPE && id == EVENT_CHARGE) { - return GetUtgardeKeepAI<npc_ingvar_throw_dummyAI>(creature); + me->CastSpell(me, SPELL_SHADOW_AXE_PERIODIC_DAMAGE, true); + me->DespawnOrUnsummon(10s); } + } }; // 42912 - Summon Banshee -class spell_ingvar_summon_banshee : public SpellScriptLoader +class spell_ingvar_summon_banshee : public SpellScript { - public: - spell_ingvar_summon_banshee() : SpellScriptLoader("spell_ingvar_summon_banshee") { } + PrepareSpellScript(spell_ingvar_summon_banshee); - class spell_ingvar_summon_banshee_SpellScript : public SpellScript - { - PrepareSpellScript(spell_ingvar_summon_banshee_SpellScript); - - void SetDest(SpellDestination& dest) - { - dest.RelocateOffset({ 0.0f, 0.0f, 30.0f, 0.0f }); - } - - void Register() override - { - OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_ingvar_summon_banshee_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER_BACK); - } - }; + void SetDest(SpellDestination& dest) + { + dest.RelocateOffset({ 0.0f, 0.0f, 30.0f, 0.0f }); + } - SpellScript* GetSpellScript() const override - { - return new spell_ingvar_summon_banshee_SpellScript(); - } + void Register() override + { + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_ingvar_summon_banshee::SetDest, EFFECT_0, TARGET_DEST_CASTER_BACK); + } }; // 42730, 59735 - Woe Strike -class spell_ingvar_woe_strike : public SpellScriptLoader +class spell_ingvar_woe_strike : public AuraScript { - public: - spell_ingvar_woe_strike() : SpellScriptLoader("spell_ingvar_woe_strike") { } - - class spell_ingvar_woe_strike_AuraScript : public AuraScript - { - PrepareAuraScript(spell_ingvar_woe_strike_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_WOE_STRIKE_EFFECT }); - } - - bool CheckProc(ProcEventInfo& eventInfo) - { - HealInfo* healInfo = eventInfo.GetHealInfo(); - if (!healInfo || !healInfo->GetHeal()) - return false; - - return true; - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - GetTarget()->CastSpell(eventInfo.GetActor(), SPELL_WOE_STRIKE_EFFECT, aurEff); - } - - void Register() override - { - DoCheckProc += AuraCheckProcFn(spell_ingvar_woe_strike_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_ingvar_woe_strike_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_PROC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_ingvar_woe_strike_AuraScript(); - } + PrepareAuraScript(spell_ingvar_woe_strike); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_WOE_STRIKE_EFFECT }); + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + HealInfo* healInfo = eventInfo.GetHealInfo(); + if (!healInfo || !healInfo->GetHeal()) + return false; + + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + GetTarget()->CastSpell(eventInfo.GetActor(), SPELL_WOE_STRIKE_EFFECT, aurEff); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_ingvar_woe_strike::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_ingvar_woe_strike::HandleProc, EFFECT_1, SPELL_AURA_PROC_TRIGGER_SPELL); + } }; void AddSC_boss_ingvar_the_plunderer() { - new boss_ingvar_the_plunderer(); - new npc_annhylde_the_caller(); - new npc_ingvar_throw_dummy(); - new spell_ingvar_summon_banshee(); - new spell_ingvar_woe_strike(); + RegisterUtgardeKeepCreatureAI(boss_ingvar_the_plunderer); + RegisterUtgardeKeepCreatureAI(npc_annhylde_the_caller); + RegisterUtgardeKeepCreatureAI(npc_ingvar_throw_dummy); + RegisterSpellScript(spell_ingvar_summon_banshee); + RegisterSpellScript(spell_ingvar_woe_strike); } diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h index d23c211b89e..386eb7c1bbf 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h @@ -93,4 +93,6 @@ inline AI* GetUtgardeKeepAI(T* obj) return GetInstanceAI<AI>(obj, UKScriptName); } +#define RegisterUtgardeKeepCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetUtgardeKeepAI) + #endif // UTGARDE_KEEP_H_ |