diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp | 735 |
1 files changed, 340 insertions, 395 deletions
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp index 6f10befa9dc..f1fcff4e388 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp @@ -135,346 +135,313 @@ Position const spectatorWP[2] = Position const ArthasPos = { 295.81f, -366.16f, 92.57f, 1.58f }; -class boss_svala : public CreatureScript +struct boss_svala : public BossAI { - public: - boss_svala() : CreatureScript("boss_svala") { } - - struct boss_svalaAI : public BossAI + boss_svala(Creature* creature) : BossAI(creature, DATA_SVALA_SORROWGRAVE) + { + Initialize(); + _introCompleted = false; + } + + void Initialize() + { + _arthasGUID.Clear(); + _sacrificed = false; + } + + void Reset() override + { + _Reset(); + + if (_introCompleted) + events.SetPhase(NORMAL); + else + events.SetPhase(IDLE); + + me->SetDisableGravity(false); + + Initialize(); + + instance->SetGuidData(DATA_SACRIFICED_PLAYER, ObjectGuid::Empty); + } + + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + Talk(SAY_AGGRO); + } + + void JustSummoned(Creature* summon) override + { + if (summon->GetEntry() == NPC_RITUAL_CHANNELER) + summon->CastSpell(summon, SPELL_SUMMONED_VIS, true); + summons.Summon(summon); + } + + void MoveInLineOfSight(Unit* who) override + { + if (!who) + return; + + if (events.IsInPhase(IDLE) && me->IsValidAttackTarget(who) && me->IsWithinDistInMap(who, 40)) { - boss_svalaAI(Creature* creature) : BossAI(creature, DATA_SVALA_SORROWGRAVE) - { - Initialize(); - _introCompleted = false; - } - - void Initialize() - { - _arthasGUID.Clear(); - _sacrificed = false; - } - - void Reset() override - { - _Reset(); - - if (_introCompleted) - events.SetPhase(NORMAL); - else - events.SetPhase(IDLE); - - me->SetDisableGravity(false); + events.SetPhase(INTRO); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - Initialize(); + if (GameObject* mirror = instance->GetGameObject(DATA_UTGARDE_MIRROR)) + mirror->SetGoState(GO_STATE_READY); - instance->SetGuidData(DATA_SACRIFICED_PLAYER, ObjectGuid::Empty); - } - - void JustEngagedWith(Unit* who) override + if (Creature* arthas = me->SummonCreature(NPC_ARTHAS, ArthasPos, TEMPSUMMON_MANUAL_DESPAWN)) { - BossAI::JustEngagedWith(who); - Talk(SAY_AGGRO); + arthas->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); + _arthasGUID = arthas->GetGUID(); } + events.ScheduleEvent(EVENT_INTRO_SVALA_TALK_0, 1s, 0, INTRO); + } + } + + void KilledUnit(Unit* who) override + { + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } + + void JustDied(Unit* /*killer*/) override + { + if (events.IsInPhase(SACRIFICING)) + SetEquipmentSlots(false, EQUIP_UNEQUIP, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); + me->HandleEmoteCommand(EMOTE_ONESHOT_FLYDEATH); + _JustDied(); + Talk(SAY_DEATH); + } + + void UpdateAI(uint32 diff) override + { + if (events.IsInPhase(IDLE)) + return; + + if (events.IsInPhase(NORMAL) && !UpdateVictim()) + return; + + events.Update(diff); + + if (events.IsInPhase(NORMAL) && !_sacrificed && HealthBelowPct(50)) + { + _sacrificed = true; + events.SetPhase(SACRIFICING); + events.ScheduleEvent(EVENT_RITUAL_PREPARATION, 0s, 0, SACRIFICING); + } - void JustSummoned(Creature* summon) override - { - if (summon->GetEntry() == NPC_RITUAL_CHANNELER) - summon->CastSpell(summon, SPELL_SUMMONED_VIS, true); - summons.Summon(summon); - } + if (events.IsInPhase(NORMAL)) + DoMeleeAttackIfReady(); - void MoveInLineOfSight(Unit* who) override + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) { - if (!who) - return; - - if (events.IsInPhase(IDLE) && me->IsValidAttackTarget(who) && me->IsWithinDistInMap(who, 40)) + case EVENT_INTRO_SVALA_TALK_0: + Talk(SAY_SVALA_INTRO_0); + events.ScheduleEvent(EVENT_INTRO_ARTHAS_TALK_0, 8100ms, 0, INTRO); + break; + case EVENT_INTRO_ARTHAS_TALK_0: + if (Creature* arthas = ObjectAccessor::GetCreature(*me, _arthasGUID)) + arthas->AI()->Talk(SAY_DIALOG_OF_ARTHAS_1); + events.ScheduleEvent(EVENT_INTRO_TRANSFORM_0, 10s, 0, INTRO); + break; + case EVENT_INTRO_TRANSFORM_0: { - events.SetPhase(INTRO); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - - if (GameObject* mirror = instance->GetGameObject(DATA_UTGARDE_MIRROR)) - mirror->SetGoState(GO_STATE_READY); - - if (Creature* arthas = me->SummonCreature(NPC_ARTHAS, ArthasPos, TEMPSUMMON_MANUAL_DESPAWN)) + if (Creature* arthas = ObjectAccessor::GetCreature(*me, _arthasGUID)) + arthas->CastSpell(me, SPELL_TRANSFORMING_CHANNEL, true); + + me->SetDisableGravity(true); + Movement::MoveSplineInit init(me); + init.MoveTo(296.614f, -346.2484f, 95.62769f); + init.SetFly(); + me->GetMotionMaster()->LaunchMoveSpline(std::move(init)); + + // spectators flee event + std::list<Creature*> spectators; + GetCreatureListWithEntryInGrid(spectators, me, NPC_SPECTATOR, 100.0f); + for (Creature* spectator : spectators) { - arthas->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); - _arthasGUID = arthas->GetGUID(); + if (spectator->IsAlive()) + { + spectator->SetStandState(UNIT_STAND_STATE_STAND); + spectator->SetWalk(false); + spectator->GetMotionMaster()->MovePoint(1, spectatorWP[0]); + } } - events.ScheduleEvent(EVENT_INTRO_SVALA_TALK_0, 1s, 0, INTRO); + events.ScheduleEvent(EVENT_INTRO_TRANSFORM_1, 4200ms, 0, INTRO); + break; } - } - - void KilledUnit(Unit* who) override - { - if (who->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_SLAY); - } - - void JustDied(Unit* /*killer*/) override - { - if (events.IsInPhase(SACRIFICING)) - SetEquipmentSlots(false, EQUIP_UNEQUIP, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); - me->HandleEmoteCommand(EMOTE_ONESHOT_FLYDEATH); - _JustDied(); - Talk(SAY_DEATH); - } - - void UpdateAI(uint32 diff) override - { - if (events.IsInPhase(IDLE)) - return; - - if (events.IsInPhase(NORMAL) && !UpdateVictim()) - return; - - events.Update(diff); - - if (events.IsInPhase(NORMAL) && !_sacrificed && HealthBelowPct(50)) + case EVENT_INTRO_TRANSFORM_1: + DoCastSelf(SPELL_SVALA_TRANSFORMING1); + events.ScheduleEvent(EVENT_INTRO_TRANSFORM_2, 6200ms, 0, INTRO); + break; + case EVENT_INTRO_TRANSFORM_2: + DoCastSelf(SPELL_SVALA_TRANSFORMING2); + if (Creature* arthas = ObjectAccessor::GetCreature(*me, _arthasGUID)) + { + arthas->InterruptNonMeleeSpells(true); + me->SetFacingToObject(arthas); + } + me->RemoveAllAuras(); + me->UpdateEntry(NPC_SVALA_SORROWGRAVE); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + events.ScheduleEvent(EVENT_INTRO_SVALA_TALK_1, 2s, 0, INTRO); + break; + case EVENT_INTRO_SVALA_TALK_1: + Talk(SAY_SVALA_INTRO_1); + events.ScheduleEvent(EVENT_INTRO_ARTHAS_TALK_1, 12s, 0, INTRO); + break; + case EVENT_INTRO_ARTHAS_TALK_1: + if (Creature* arthas = ObjectAccessor::GetCreature(*me, _arthasGUID)) + arthas->AI()->Talk(SAY_DIALOG_OF_ARTHAS_2); + events.ScheduleEvent(EVENT_INTRO_SVALA_TALK_2, 9s, 0, INTRO); + break; + case EVENT_INTRO_SVALA_TALK_2: + Talk(SAY_SVALA_INTRO_2); + me->SetFacingTo(1.832595f); + if (Creature* arthas = ObjectAccessor::GetCreature(*me, _arthasGUID)) + arthas->SetVisible(false); + events.ScheduleEvent(EVENT_INTRO_RELOCATE_SVALA, 13800ms, 0, INTRO); + break; + case EVENT_INTRO_RELOCATE_SVALA: { - _sacrificed = true; - events.SetPhase(SACRIFICING); - events.ScheduleEvent(EVENT_RITUAL_PREPARATION, 0s, 0, SACRIFICING); - } + me->SetDisableGravity(false); + me->SetHover(true); + me->GetMotionMaster()->MoveFall(); - if (events.IsInPhase(NORMAL)) - DoMeleeAttackIfReady(); - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) + events.ScheduleEvent(EVENT_INTRO_DESPAWN_ARTHAS, 3s, 0, INTRO); + break; + } + case EVENT_INTRO_DESPAWN_ARTHAS: + if (GameObject* mirror = instance->GetGameObject(DATA_UTGARDE_MIRROR)) + mirror->SetGoState(GO_STATE_ACTIVE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + if (Creature* arthas = ObjectAccessor::GetCreature(*me, _arthasGUID)) + arthas->DespawnOrUnsummon(); + _arthasGUID.Clear(); + events.SetPhase(NORMAL); + _introCompleted = true; + if (Unit* target = me->SelectNearestPlayer(100.0f)) + AttackStart(target); + events.ScheduleEvent(EVENT_SINISTER_STRIKE, 7s, 0, NORMAL); + events.ScheduleEvent(EVENT_CALL_FLAMES, 10s, 20s, 0, NORMAL); + break; + case EVENT_SINISTER_STRIKE: + DoCastVictim(SPELL_SINSTER_STRIKE); + events.ScheduleEvent(EVENT_SINISTER_STRIKE, 5s, 9s, 0, NORMAL); + break; + case EVENT_CALL_FLAMES: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) + DoCast(target, SPELL_CALL_FLAMES); + events.ScheduleEvent(EVENT_CALL_FLAMES, 10s, 20s, 0, NORMAL); + break; + case EVENT_RITUAL_PREPARATION: + if (Unit* sacrificeTarget = SelectTarget(SelectTargetMethod::Random, 0, 80.0f, true)) { - case EVENT_INTRO_SVALA_TALK_0: - Talk(SAY_SVALA_INTRO_0); - events.ScheduleEvent(EVENT_INTRO_ARTHAS_TALK_0, 8100ms, 0, INTRO); - break; - case EVENT_INTRO_ARTHAS_TALK_0: - if (Creature* arthas = ObjectAccessor::GetCreature(*me, _arthasGUID)) - arthas->AI()->Talk(SAY_DIALOG_OF_ARTHAS_1); - events.ScheduleEvent(EVENT_INTRO_TRANSFORM_0, 10s, 0, INTRO); - break; - case EVENT_INTRO_TRANSFORM_0: - { - if (Creature* arthas = ObjectAccessor::GetCreature(*me, _arthasGUID)) - arthas->CastSpell(me, SPELL_TRANSFORMING_CHANNEL, true); - - me->SetDisableGravity(true); - Movement::MoveSplineInit init(me); - init.MoveTo(296.614f, -346.2484f, 95.62769f); - init.SetFly(); - me->GetMotionMaster()->LaunchMoveSpline(std::move(init)); - - // spectators flee event - std::list<Creature*> spectators; - GetCreatureListWithEntryInGrid(spectators, me, NPC_SPECTATOR, 100.0f); - for (Creature* spectator : spectators) - { - if (spectator->IsAlive()) - { - spectator->SetStandState(UNIT_STAND_STATE_STAND); - spectator->SetWalk(false); - spectator->GetMotionMaster()->MovePoint(1, spectatorWP[0]); - } - } - events.ScheduleEvent(EVENT_INTRO_TRANSFORM_1, 4200ms, 0, INTRO); - break; - } - case EVENT_INTRO_TRANSFORM_1: - DoCastSelf(SPELL_SVALA_TRANSFORMING1); - events.ScheduleEvent(EVENT_INTRO_TRANSFORM_2, 6200ms, 0, INTRO); - break; - case EVENT_INTRO_TRANSFORM_2: - DoCastSelf(SPELL_SVALA_TRANSFORMING2); - if (Creature* arthas = ObjectAccessor::GetCreature(*me, _arthasGUID)) - { - arthas->InterruptNonMeleeSpells(true); - me->SetFacingToObject(arthas); - } - me->RemoveAllAuras(); - me->UpdateEntry(NPC_SVALA_SORROWGRAVE); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - events.ScheduleEvent(EVENT_INTRO_SVALA_TALK_1, 2s, 0, INTRO); - break; - case EVENT_INTRO_SVALA_TALK_1: - Talk(SAY_SVALA_INTRO_1); - events.ScheduleEvent(EVENT_INTRO_ARTHAS_TALK_1, 12s, 0, INTRO); - break; - case EVENT_INTRO_ARTHAS_TALK_1: - if (Creature* arthas = ObjectAccessor::GetCreature(*me, _arthasGUID)) - arthas->AI()->Talk(SAY_DIALOG_OF_ARTHAS_2); - events.ScheduleEvent(EVENT_INTRO_SVALA_TALK_2, 9s, 0, INTRO); - break; - case EVENT_INTRO_SVALA_TALK_2: - Talk(SAY_SVALA_INTRO_2); - me->SetFacingTo(1.832595f); - if (Creature* arthas = ObjectAccessor::GetCreature(*me, _arthasGUID)) - arthas->SetVisible(false); - events.ScheduleEvent(EVENT_INTRO_RELOCATE_SVALA, 13800ms, 0, INTRO); - break; - case EVENT_INTRO_RELOCATE_SVALA: - { - me->SetDisableGravity(false); - me->SetHover(true); - me->GetMotionMaster()->MoveFall(); - - events.ScheduleEvent(EVENT_INTRO_DESPAWN_ARTHAS, 3s, 0, INTRO); - break; - } - case EVENT_INTRO_DESPAWN_ARTHAS: - if (GameObject* mirror = instance->GetGameObject(DATA_UTGARDE_MIRROR)) - mirror->SetGoState(GO_STATE_ACTIVE); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - if (Creature* arthas = ObjectAccessor::GetCreature(*me, _arthasGUID)) - arthas->DespawnOrUnsummon(); - _arthasGUID.Clear(); - events.SetPhase(NORMAL); - _introCompleted = true; - if (Unit* target = me->SelectNearestPlayer(100.0f)) - AttackStart(target); - events.ScheduleEvent(EVENT_SINISTER_STRIKE, 7s, 0, NORMAL); - events.ScheduleEvent(EVENT_CALL_FLAMES, 10s, 20s, 0, NORMAL); - break; - case EVENT_SINISTER_STRIKE: - DoCastVictim(SPELL_SINSTER_STRIKE); - events.ScheduleEvent(EVENT_SINISTER_STRIKE, 5s, 9s, 0, NORMAL); - break; - case EVENT_CALL_FLAMES: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) - DoCast(target, SPELL_CALL_FLAMES); - events.ScheduleEvent(EVENT_CALL_FLAMES, 10s, 20s, 0, NORMAL); - break; - case EVENT_RITUAL_PREPARATION: - if (Unit* sacrificeTarget = SelectTarget(SelectTargetMethod::Random, 0, 80.0f, true)) - { - me->InterruptNonMeleeSpells(true); - me->SetReactState(REACT_PASSIVE); - me->AttackStop(); - me->StopMoving(); - me->SetDisableGravity(true); - instance->SetGuidData(DATA_SACRIFICED_PLAYER, sacrificeTarget->GetGUID()); - Talk(SAY_SACRIFICE_PLAYER); - DoCast(sacrificeTarget, SPELL_RITUAL_PREPARATION); - DoCastSelf(SPELL_RITUAL_DISARM); - DoCastSelf(SPELL_RITUAL_OF_THE_SWORD); - } - events.ScheduleEvent(EVENT_SPAWN_RITUAL_CHANNELERS, 1s, 0, SACRIFICING); - events.ScheduleEvent(EVENT_FINISH_RITUAL, 27s, 0); - break; - case EVENT_SPAWN_RITUAL_CHANNELERS: - DoCastSelf(SPELL_RITUAL_CHANNELER_1, true); - DoCastSelf(SPELL_RITUAL_CHANNELER_2, true); - DoCastSelf(SPELL_RITUAL_CHANNELER_3, true); - events.ScheduleEvent(EVENT_RITUAL_STRIKE, 2s, 0, SACRIFICING); - break; - case EVENT_RITUAL_STRIKE: - DoCastSelf(SPELL_RITUAL_STRIKE_TRIGGER, true); - break; - case EVENT_FINISH_RITUAL: - me->SetDisableGravity(false); - me->SetReactState(REACT_AGGRESSIVE); - events.SetPhase(NORMAL); - events.ScheduleEvent(EVENT_SINISTER_STRIKE, 7s, 0, NORMAL); - events.ScheduleEvent(EVENT_CALL_FLAMES, 10s, 20s, 0, NORMAL); - break; - default: - break; + me->InterruptNonMeleeSpells(true); + me->SetReactState(REACT_PASSIVE); + me->AttackStop(); + me->StopMoving(); + me->SetDisableGravity(true); + instance->SetGuidData(DATA_SACRIFICED_PLAYER, sacrificeTarget->GetGUID()); + Talk(SAY_SACRIFICE_PLAYER); + DoCast(sacrificeTarget, SPELL_RITUAL_PREPARATION); + DoCastSelf(SPELL_RITUAL_DISARM); + DoCastSelf(SPELL_RITUAL_OF_THE_SWORD); } - } + events.ScheduleEvent(EVENT_SPAWN_RITUAL_CHANNELERS, 1s, 0, SACRIFICING); + events.ScheduleEvent(EVENT_FINISH_RITUAL, 27s, 0); + break; + case EVENT_SPAWN_RITUAL_CHANNELERS: + DoCastSelf(SPELL_RITUAL_CHANNELER_1, true); + DoCastSelf(SPELL_RITUAL_CHANNELER_2, true); + DoCastSelf(SPELL_RITUAL_CHANNELER_3, true); + events.ScheduleEvent(EVENT_RITUAL_STRIKE, 2s, 0, SACRIFICING); + break; + case EVENT_RITUAL_STRIKE: + DoCastSelf(SPELL_RITUAL_STRIKE_TRIGGER, true); + break; + case EVENT_FINISH_RITUAL: + me->SetDisableGravity(false); + me->SetReactState(REACT_AGGRESSIVE); + events.SetPhase(NORMAL); + events.ScheduleEvent(EVENT_SINISTER_STRIKE, 7s, 0, NORMAL); + events.ScheduleEvent(EVENT_CALL_FLAMES, 10s, 20s, 0, NORMAL); + break; + default: + break; } - - private: - ObjectGuid _arthasGUID; - bool _sacrificed; - bool _introCompleted; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetUtgardePinnacleAI<boss_svalaAI>(creature); } + } + +private: + ObjectGuid _arthasGUID; + bool _sacrificed; + bool _introCompleted; }; -class npc_ritual_channeler : public CreatureScript +struct npc_ritual_channeler : public ScriptedAI { - public: - npc_ritual_channeler() : CreatureScript("npc_ritual_channeler") { } - - struct npc_ritual_channelerAI : public ScriptedAI - { - npc_ritual_channelerAI(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - instance = creature->GetInstanceScript(); - - SetCombatMovement(false); - } - - void Initialize() - { - paralyzeTimer = 1600; - } + npc_ritual_channeler(Creature* creature) : ScriptedAI(creature) + { + Initialize(); + instance = creature->GetInstanceScript(); - InstanceScript* instance; - uint32 paralyzeTimer; + SetCombatMovement(false); + } - void Reset() override - { - Initialize(); + void Initialize() + { + paralyzeTimer = 1600; + } - if (IsHeroic()) - DoCastSelf(SPELL_SHADOWS_IN_THE_DARK); - } + InstanceScript* instance; + uint32 paralyzeTimer; - void UpdateAI(uint32 diff) override - { - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + void Reset() override + { + Initialize(); - if (paralyzeTimer <= diff) - { - if (Unit* victim = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_SACRIFICED_PLAYER))) - DoCast(victim, SPELL_PARALYZE, false); + if (IsHeroic()) + DoCastSelf(SPELL_SHADOWS_IN_THE_DARK); + } - paralyzeTimer = 200; - } - else - paralyzeTimer -= diff; - } - }; + void UpdateAI(uint32 diff) override + { + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - CreatureAI* GetAI(Creature* creature) const override + if (paralyzeTimer <= diff) { - return GetUtgardePinnacleAI<npc_ritual_channelerAI>(creature); + if (Unit* victim = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_SACRIFICED_PLAYER))) + DoCast(victim, SPELL_PARALYZE, false); + + paralyzeTimer = 200; } + else + paralyzeTimer -= diff; + } }; -class npc_spectator : public CreatureScript +struct npc_spectator : public ScriptedAI { - public: - npc_spectator() : CreatureScript("npc_spectator") { } - - struct npc_spectatorAI : public ScriptedAI - { - npc_spectatorAI(Creature* creature) : ScriptedAI(creature) { } + npc_spectator(Creature* creature) : ScriptedAI(creature) { } - void Reset() override { } + void Reset() override { } - void MovementInform(uint32 motionType, uint32 pointId) override - { - if (motionType == POINT_MOTION_TYPE) - { - if (pointId == 1) - me->GetMotionMaster()->MovePoint(2, spectatorWP[1]); - else if (pointId == 2) - me->DespawnOrUnsummon(1s); - } - } - }; - - CreatureAI* GetAI(Creature* creature) const override + void MovementInform(uint32 motionType, uint32 pointId) override + { + if (motionType == POINT_MOTION_TYPE) { - return GetUtgardePinnacleAI<npc_spectatorAI>(creature); + if (pointId == 1) + me->GetMotionMaster()->MovePoint(2, spectatorWP[1]); + else if (pointId == 2) + me->DespawnOrUnsummon(1s); } + } }; class RitualTargetCheck @@ -492,104 +459,82 @@ class RitualTargetCheck } }; -class spell_paralyze_pinnacle : public SpellScriptLoader +class spell_paralyze_pinnacle : public SpellScript { - public: - spell_paralyze_pinnacle() : SpellScriptLoader("spell_paralyze_pinnacle") { } + PrepareSpellScript(spell_paralyze_pinnacle); - class spell_paralyze_pinnacle_SpellScript : public SpellScript - { - PrepareSpellScript(spell_paralyze_pinnacle_SpellScript); + void FilterTargets(std::list<WorldObject*>& unitList) + { + unitList.remove_if(RitualTargetCheck()); + } - void FilterTargets(std::list<WorldObject*>& unitList) - { - unitList.remove_if(RitualTargetCheck()); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_paralyze_pinnacle_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_paralyze_pinnacle_SpellScript(); - } + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_paralyze_pinnacle::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + } }; -class npc_scourge_hulk : public CreatureScript +struct npc_scourge_hulk : public ScriptedAI { - public: - npc_scourge_hulk() : CreatureScript("npc_scourge_hulk") { } - - struct npc_scourge_hulkAI : public ScriptedAI + npc_scourge_hulk(Creature* creature) : ScriptedAI(creature) + { + Initialize(); + } + + void Initialize() + { + mightyBlow = urand(4000, 9000); + volatileInfection = urand(10000, 14000); + killedByRitualStrike = false; + } + + uint32 mightyBlow; + uint32 volatileInfection; + + void Reset() override + { + Initialize(); + } + + uint32 GetData(uint32 type) const override + { + return type == DATA_INCREDIBLE_HULK ? killedByRitualStrike : 0; + } + + void DamageTaken(Unit* attacker, uint32 &damage) override + { + if (damage >= me->GetHealth() && attacker && attacker->GetEntry() == NPC_SVALA_SORROWGRAVE) + killedByRitualStrike = true; + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + if (mightyBlow <= diff) { - npc_scourge_hulkAI(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - } - - void Initialize() - { - mightyBlow = urand(4000, 9000); - volatileInfection = urand(10000, 14000); - killedByRitualStrike = false; - } - - uint32 mightyBlow; - uint32 volatileInfection; - - void Reset() override - { - Initialize(); - } - - uint32 GetData(uint32 type) const override - { - return type == DATA_INCREDIBLE_HULK ? killedByRitualStrike : 0; - } - - void DamageTaken(Unit* attacker, uint32 &damage) override - { - if (damage >= me->GetHealth() && attacker && attacker->GetEntry() == NPC_SVALA_SORROWGRAVE) - killedByRitualStrike = true; - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - if (mightyBlow <= diff) - { - if (Unit* victim = me->GetVictim()) - if (!victim->HasUnitState(UNIT_STATE_STUNNED)) // Prevent knocking back a ritual player - DoCast(victim, SPELL_MIGHTY_BLOW); - mightyBlow = urand(12000, 17000); - } - else - mightyBlow -= diff; - - if (volatileInfection <= diff) - { - DoCastVictim(SPELL_VOLATILE_INFECTION); - volatileInfection = urand(13000, 17000); - } - else - volatileInfection -= diff; - - DoMeleeAttackIfReady(); - } - - private: - bool killedByRitualStrike; - }; + if (Unit* victim = me->GetVictim()) + if (!victim->HasUnitState(UNIT_STATE_STUNNED)) // Prevent knocking back a ritual player + DoCast(victim, SPELL_MIGHTY_BLOW); + mightyBlow = urand(12000, 17000); + } + else + mightyBlow -= diff; - CreatureAI* GetAI(Creature* creature) const override + if (volatileInfection <= diff) { - return GetUtgardePinnacleAI<npc_scourge_hulkAI>(creature); + DoCastVictim(SPELL_VOLATILE_INFECTION); + volatileInfection = urand(13000, 17000); } + else + volatileInfection -= diff; + + DoMeleeAttackIfReady(); + } + +private: + bool killedByRitualStrike; }; class achievement_incredible_hulk : public AchievementCriteriaScript @@ -605,10 +550,10 @@ class achievement_incredible_hulk : public AchievementCriteriaScript void AddSC_boss_svala() { - new boss_svala(); - new npc_ritual_channeler(); - new npc_spectator(); - new spell_paralyze_pinnacle(); - new npc_scourge_hulk(); + RegisterUtgardePinnacleCreatureAI(boss_svala); + RegisterUtgardePinnacleCreatureAI(npc_ritual_channeler); + RegisterUtgardePinnacleCreatureAI(npc_spectator); + RegisterSpellScript(spell_paralyze_pinnacle); + RegisterUtgardePinnacleCreatureAI(npc_scourge_hulk); new achievement_incredible_hulk(); } |