diff options
Diffstat (limited to 'src/server')
9 files changed, 297 insertions, 389 deletions
diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h index e5c5ef9e42..75f74ccc35 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h @@ -29,7 +29,11 @@ enum ANData DATA_KRIKTHIR = 0, DATA_HADRONOX = 1, DATA_ANUBARAK = 2, - MAX_ENCOUNTERS = 3 + MAX_ENCOUNTERS = 3, + + DATA_GASHRA = 4, + DATA_NARJIL = 5, + DATA_SILTHIK = 6 }; enum ANIds diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp index dfddd2b715..0170859795 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp @@ -80,10 +80,10 @@ enum CreatureIds NPC_ANUBAR_VENOMANCER = 29217, }; -enum Phases : uint8 +enum Groups : uint8 { - PHASE_EMERGED = 1, - PHASE_SUBMERGED + GROUP_EMERGED = 1, + GROUP_SUBMERGED }; enum SubPhase : uint8 @@ -117,7 +117,7 @@ struct boss_anub_arak : public BossAI _submergePhase = SUBMERGE_NONE; ScheduleHealthCheckEvent({ 75, 50, 25 }, [&]{ - events.Reset(); + events.CancelEventGroup(GROUP_EMERGED); Talk(SAY_SUBMERGE); DoCastSelf(SPELL_CLEAR_ALL_DEBUFFS, true); DoCastSelf(SPELL_SUBMERGE, false); @@ -133,75 +133,74 @@ struct boss_anub_arak : public BossAI DoCastSelf(SPELL_IMPALE_PERIODIC, true); ++_submergePhase; - events.Reset(); ScheduleSubmerged(); } } void ScheduleEmerged() { - events.SetPhase(PHASE_EMERGED); - events.ScheduleEvent(EVENT_CARRION_BEETLES, 6500ms, 0, PHASE_EMERGED); - events.ScheduleEvent(EVENT_LEECHING_SWARM, 20s, 0, PHASE_EMERGED); - events.ScheduleEvent(EVENT_POUND, 15s, 0, PHASE_EMERGED); + events.CancelEventGroup(GROUP_SUBMERGED); + events.ScheduleEvent(EVENT_CARRION_BEETLES, 6500ms, GROUP_EMERGED); + events.ScheduleEvent(EVENT_LEECHING_SWARM, 20s, GROUP_EMERGED); + events.ScheduleEvent(EVENT_POUND, 15s, GROUP_EMERGED); }; void ScheduleSubmerged() { - events.SetPhase(PHASE_SUBMERGED); - events.ScheduleEvent(EVENT_EMERGE, 60s, 0, PHASE_SUBMERGED); + events.CancelEventGroup(GROUP_EMERGED); + events.ScheduleEvent(EVENT_EMERGE, 60s, GROUP_SUBMERGED); switch (_submergePhase) { case SUBMERGE_75: - events.ScheduleEvent(EVENT_SUMMON_GUARDIAN, 4s, 0, PHASE_SUBMERGED); + events.ScheduleEvent(EVENT_SUMMON_GUARDIAN, 4s, GROUP_SUBMERGED); if (IsHeroic()) - events.ScheduleEvent(EVENT_SUMMON_GUARDIAN, 7s, 0, PHASE_SUBMERGED); + events.ScheduleEvent(EVENT_SUMMON_GUARDIAN, 7s, GROUP_SUBMERGED); _remainingLargeSummonsBeforeEmerge = IsHeroic() ? 2 : 1; - events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 4s, 0, PHASE_SUBMERGED); - events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 24s, 0, PHASE_SUBMERGED); - events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 44s, 0, PHASE_SUBMERGED); + events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 4s, GROUP_SUBMERGED); + events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 24s, GROUP_SUBMERGED); + events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 44s, GROUP_SUBMERGED); break; case SUBMERGE_50: - events.ScheduleEvent(EVENT_SUMMON_GUARDIAN, 4s, 0, PHASE_SUBMERGED); + events.ScheduleEvent(EVENT_SUMMON_GUARDIAN, 4s, GROUP_SUBMERGED); if (IsHeroic()) - events.ScheduleEvent(EVENT_SUMMON_GUARDIAN, 7s, 0, PHASE_SUBMERGED); + events.ScheduleEvent(EVENT_SUMMON_GUARDIAN, 7s, GROUP_SUBMERGED); - events.ScheduleEvent(EVENT_SUMMON_VENOMANCER, 24s, 0, PHASE_SUBMERGED); + events.ScheduleEvent(EVENT_SUMMON_VENOMANCER, 24s, GROUP_SUBMERGED); if (IsHeroic()) - events.ScheduleEvent(EVENT_SUMMON_VENOMANCER, 29s, 0, PHASE_SUBMERGED); + events.ScheduleEvent(EVENT_SUMMON_VENOMANCER, 29s, GROUP_SUBMERGED); _remainingLargeSummonsBeforeEmerge = IsHeroic() ? 4 : 2; - events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 4s, 0, PHASE_SUBMERGED); - events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 24s, 0, PHASE_SUBMERGED); - events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 44s, 0, PHASE_SUBMERGED); + events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 4s, GROUP_SUBMERGED); + events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 24s, GROUP_SUBMERGED); + events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 44s, GROUP_SUBMERGED); break; case SUBMERGE_25: - events.ScheduleEvent(EVENT_SUMMON_GUARDIAN, 4s, 0, PHASE_SUBMERGED); + events.ScheduleEvent(EVENT_SUMMON_GUARDIAN, 4s, GROUP_SUBMERGED); if (IsHeroic()) - events.ScheduleEvent(EVENT_SUMMON_GUARDIAN, 7s, 0, PHASE_SUBMERGED); + events.ScheduleEvent(EVENT_SUMMON_GUARDIAN, 7s, GROUP_SUBMERGED); - events.ScheduleEvent(EVENT_SUMMON_VENOMANCER, 24s, 0, PHASE_SUBMERGED); + events.ScheduleEvent(EVENT_SUMMON_VENOMANCER, 24s, GROUP_SUBMERGED); if (IsHeroic()) - events.ScheduleEvent(EVENT_SUMMON_VENOMANCER, 29s, 0, PHASE_SUBMERGED); + events.ScheduleEvent(EVENT_SUMMON_VENOMANCER, 29s, GROUP_SUBMERGED); _remainingLargeSummonsBeforeEmerge = IsHeroic() ? 4 : 2; - events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 4s, 0, PHASE_SUBMERGED); - events.ScheduleEvent(EVENT_SUMMON_DARTER, 4s, 0, PHASE_SUBMERGED); + events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 4s, GROUP_SUBMERGED); + events.ScheduleEvent(EVENT_SUMMON_DARTER, 4s, GROUP_SUBMERGED); - events.ScheduleEvent(EVENT_SUMMON_DARTER, 12s, 0, PHASE_SUBMERGED); + events.ScheduleEvent(EVENT_SUMMON_DARTER, 12s, GROUP_SUBMERGED); - events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 24s, 0, PHASE_SUBMERGED); - events.ScheduleEvent(EVENT_SUMMON_DARTER, 26s, 0, PHASE_SUBMERGED); + events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 24s, GROUP_SUBMERGED); + events.ScheduleEvent(EVENT_SUMMON_DARTER, 26s, GROUP_SUBMERGED); - events.ScheduleEvent(EVENT_SUMMON_DARTER, 32s, 0, PHASE_SUBMERGED); + events.ScheduleEvent(EVENT_SUMMON_DARTER, 32s, GROUP_SUBMERGED); - events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 44s, 0, PHASE_SUBMERGED); - events.ScheduleEvent(EVENT_SUMMON_DARTER, 45s, 0, PHASE_SUBMERGED); + events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 44s, GROUP_SUBMERGED); + events.ScheduleEvent(EVENT_SUMMON_DARTER, 45s, GROUP_SUBMERGED); break; default: break; @@ -213,9 +212,8 @@ struct boss_anub_arak : public BossAI Talk(SAY_AGGRO); instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); - events.SetPhase(PHASE_EMERGED); - events.ScheduleEvent(EVENT_CLOSE_DOORS, 5s, 0, PHASE_EMERGED); ScheduleEmerged(); + events.ScheduleEvent(EVENT_CLOSE_DOORS, 5s); // set up world triggers std::list<TempSummon*> summoned; @@ -285,9 +283,8 @@ struct boss_anub_arak : public BossAI --_remainingLargeSummonsBeforeEmerge; if (_remainingLargeSummonsBeforeEmerge == 0) { - events.Reset(); - events.SetPhase(PHASE_SUBMERGED); - events.ScheduleEvent(EVENT_EMERGE, 5s, 0, PHASE_SUBMERGED); + me->RemoveAurasDueToSpell(SPELL_IMPALE_PERIODIC); + events.RescheduleEvent(EVENT_EMERGE, 5s, GROUP_SUBMERGED); } break; } @@ -319,12 +316,12 @@ struct boss_anub_arak : public BossAI break; case EVENT_CARRION_BEETLES: DoCastSelf(SPELL_CARRION_BEETLES); - events.ScheduleEvent(EVENT_CARRION_BEETLES, 25s, 0, PHASE_EMERGED); + events.ScheduleEvent(EVENT_CARRION_BEETLES, 25s, GROUP_EMERGED); break; case EVENT_LEECHING_SWARM: Talk(SAY_LOCUST); DoCastSelf(SPELL_LEECHING_SWARM); - events.ScheduleEvent(EVENT_LEECHING_SWARM, 20s, 0, PHASE_EMERGED); + events.ScheduleEvent(EVENT_LEECHING_SWARM, 20s, GROUP_EMERGED); break; case EVENT_POUND: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 10.0f)) @@ -332,10 +329,10 @@ struct boss_anub_arak : public BossAI DoCastSelf(SPELL_SELF_ROOT, true); me->DisableRotate(true); me->SendMovementFlagUpdate(); - events.ScheduleEvent(EVENT_ENABLE_ROTATE, 3300ms, 0, PHASE_EMERGED); + events.ScheduleEvent(EVENT_ENABLE_ROTATE, 3300ms, GROUP_EMERGED); DoCast(target, SPELL_POUND); } - events.ScheduleEvent(EVENT_POUND, 18s, 0, PHASE_EMERGED); + events.ScheduleEvent(EVENT_POUND, 18s, GROUP_EMERGED); break; case EVENT_ENABLE_ROTATE: me->RemoveAurasDueToSpell(SPELL_SELF_ROOT); @@ -376,10 +373,10 @@ struct boss_anub_arak : public BossAI void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask) override { + BossAI::DamageTaken(attacker, damage, damagetype, damageSchoolMask); + if (me->HasAura(SPELL_SUBMERGE) && damage >= me->GetHealth()) damage = me->GetHealth() - 1; - - BossAI::DamageTaken(attacker, damage, damagetype, damageSchoolMask); } private: diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp index 1664742ea2..3f4ec54805 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp @@ -16,6 +16,7 @@ */ #include "AchievementCriteriaScript.h" +#include "CreatureGroups.h" #include "CreatureScript.h" #include "ScriptedCreature.h" #include "azjol_nerub.h" @@ -75,16 +76,6 @@ public: { BossAI::Reset(); - me->SummonCreature(NPC_WATCHER_NARJIL, 511.8f, 666.493f, 776.278f, 0.977f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); - me->SummonCreature(NPC_SHADOWCASTER, 511.63f, 672.44f, 775.71f, 0.90f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); - me->SummonCreature(NPC_WARRIOR, 506.75f, 670.7f, 776.24f, 0.92f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); - me->SummonCreature(NPC_WATCHER_GASHRA, 526.66f, 663.605f, 775.805f, 1.23f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); - me->SummonCreature(NPC_SKIRMISHER, 522.91f, 660.18f, 776.19f, 1.28f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); - me->SummonCreature(NPC_WARRIOR, 528.14f, 659.72f, 776.14f, 1.37f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); - me->SummonCreature(NPC_WATCHER_SILTHIK, 543.826f, 665.123f, 776.245f, 1.55f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); - me->SummonCreature(NPC_SKIRMISHER, 547.5f, 669.96f, 776.1f, 2.3f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); - me->SummonCreature(NPC_SHADOWCASTER, 548.64f, 664.27f, 776.74f, 1.77f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); - ScheduleHealthCheckEvent(25, [&] { DoCastSelf(SPELL_FRENZY, true); @@ -100,6 +91,16 @@ public: _canTalk = true; _minionInCombat = false; + + Creature* narjil = instance->GetCreature(DATA_NARJIL); + Creature* gashra = instance->GetCreature(DATA_GASHRA); + Creature* silthik = instance->GetCreature(DATA_SILTHIK); + + for (Creature* watcher : { narjil, gashra, silthik }) + { + if (watcher && watcher->GetFormation()) + watcher->GetFormation()->RespawnFormation(true); + } } void MoveInLineOfSight(Unit* who) override @@ -120,24 +121,39 @@ public: { _minionInCombat = true; - for (Seconds const& timer : { 10s, 40s, 70s }) + Talk(SAY_SEND_GROUP, 10s); + + for (Seconds const& timer : { 60s, 120s }) { me->m_Events.AddEventAtOffset([this] { - me->CastCustomSpell(SPELL_SUBBOSS_AGGRO_TRIGGER, SPELLVALUE_MAX_TARGETS, 1, me, true); Talk(SAY_SEND_GROUP); + + me->m_Events.AddEventAtOffset([this] { + me->CastCustomSpell(SPELL_SUBBOSS_AGGRO_TRIGGER, SPELLVALUE_MAX_TARGETS, 1, me, true); + }, 5s); }, timer); } me->m_Events.AddEventAtOffset([this] { me->SetInCombatWithZone(); - }, 100s); + }, IsHeroic() ? 200s : 180s); } } uint32 GetData(uint32 data) const override { if (data == me->GetEntry()) - return summons.HasEntry(NPC_WATCHER_NARJIL) && summons.HasEntry(NPC_WATCHER_GASHRA) && summons.HasEntry(NPC_WATCHER_SILTHIK); + { + Creature* narjil = instance->GetCreature(DATA_NARJIL); + Creature* gashra = instance->GetCreature(DATA_GASHRA); + Creature* silthik = instance->GetCreature(DATA_SILTHIK); + + if (!narjil || !gashra || !silthik) + return false; + + return narjil->IsAlive() && gashra->IsAlive() && silthik->IsAlive(); + } + return 0; } @@ -187,12 +203,6 @@ public: } } - void JustSummoned(Creature* summon) override - { - summon->SetNoCallAssistance(true); - summons.Summon(summon); - } - void SummonedCreatureDies(Creature* summon, Unit*) override { summons.Despawn(summon); diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp index 3f055ed5dc..e660b2c850 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp @@ -37,6 +37,9 @@ ObjectData const creatureData[] = { NPC_KRIKTHIR_THE_GATEWATCHER, DATA_KRIKTHIR }, { NPC_HADRONOX, DATA_HADRONOX }, { NPC_ANUBARAK, DATA_ANUBARAK }, + { NPC_WATCHER_GASHRA, DATA_GASHRA }, + { NPC_WATCHER_NARJIL, DATA_NARJIL }, + { NPC_WATCHER_SILTHIK, DATA_SILTHIK }, { 0, 0 } }; diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp index 277e951045..36f8b555c4 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp @@ -47,7 +47,7 @@ enum Spells SPELL_COPY_OF_SUMMON_MINIONS = 59933, SPELL_BLIZZARD = 49034, SPELL_FROSTBOLT = 49037, - SPELL_TOUCH_OF_MISERY = 50090 + SPELL_WRATH_OF_MISERY = 50089 }; enum Misc @@ -56,14 +56,7 @@ enum Misc NPC_CRYSTAL_HANDLER = 26627, NPC_SUMMON_CRYSTAL_HANDLER_TARGET = 27583, - EVENT_SUMMON_FETID_TROLL = 1, - EVENT_SUMMON_SHADOWCASTER = 2, - EVENT_SUMMON_HULKING_CORPSE = 3, - EVENT_SUMMON_CRYSTAL_HANDLER = 4, - EVENT_CAST_OFFENSIVE_SPELL = 5, - EVENT_KILL_TALK = 6, - EVENT_CHECK_PHASE = 7, - EVENT_SPELL_SUMMON_MINIONS = 8, + EVENT_KILL_TALK = 1, ROOM_RIGHT = 0, ROOM_LEFT = 1, @@ -80,9 +73,7 @@ std::unordered_map<uint32, std::tuple <uint32, Position>> const npcSummon = // 26631 struct boss_novos : public BossAI { - boss_novos(Creature* creature) : BossAI(creature, DATA_NOVOS) - { - } + boss_novos(Creature* creature) : BossAI(creature, DATA_NOVOS) { } void Reset() override { @@ -120,16 +111,73 @@ struct boss_novos : public BossAI { Talk(SAY_AGGRO); BossAI::JustEngagedWith(who); + scheduler.ClearValidator(); + + ScheduleTimedEvent(3s, [&] { + if (Creature* trigger = summons.GetCreatureWithEntry(NPC_CRYSTAL_CHANNEL_TARGET)) + trigger->CastSpell(trigger, SPELL_SUMMON_FETID_TROLL_CORPSE, true, nullptr, nullptr, me->GetGUID()); + }, 3s); + + ScheduleTimedEvent(9s, [&] { + if (Creature* trigger = summons.GetCreatureWithEntry(NPC_CRYSTAL_CHANNEL_TARGET)) + trigger->CastSpell(trigger, SPELL_SUMMON_RISEN_SHADOWCASTER, true, nullptr, nullptr, me->GetGUID()); + }, 10s); + + ScheduleTimedEvent(30s, [&] { + if (Creature* trigger = summons.GetCreatureWithEntry(NPC_CRYSTAL_CHANNEL_TARGET)) + trigger->CastSpell(trigger, SPELL_SUMMON_HULKING_CORPSE, true, nullptr, nullptr, me->GetGUID()); + }, 30s); + + scheduler.Schedule(70s, [this](TaskContext context) { + if (me->HasAura(SPELL_BEAM_CHANNEL)) + { + context.Repeat(2s); + return; + } + + scheduler.CancelAll(); + + me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE); + me->InterruptNonMeleeSpells(false); + + scheduler.SetValidator([this] { + return !me->HasUnitState(UNIT_STATE_CASTING); + }); + + ScheduleTimedEvent(5s, 10s, [&] { + DoCastRandomTarget(SPELL_BLIZZARD); + }, 12s, 25s); + + ScheduleTimedEvent(5s, 10s, [&] { + DoCastRandomTarget(SPELL_WRATH_OF_MISERY); + }, 8s, 16s); + + if (IsHeroic()) + { + ScheduleTimedEvent(10s, [&] { + DoCastAOE(SPELL_SUMMON_MINIONS); + }, 37s, 55s); + } + }); + + for (Seconds timer : { 16s, 32s, 48s, 64s }) + { + me->m_Events.AddEventAtOffset([&] { + Talk(SAY_SUMMONING_ADDS); + Talk(EMOTE_SUMMONING_ADDS); + if (Creature* target = ObjectAccessor::GetCreature(*me, _stage ? _summonTargetLeftGUID : _summonTargetRightGUID)) + target->CastSpell(target, SPELL_SUMMON_CRYSTAL_HANDLER, true, nullptr, nullptr, me->GetGUID()); + _stage = _stage ? 0 : 1; + }, timer); + } - events.ScheduleEvent(EVENT_SUMMON_FETID_TROLL, 3s); - events.ScheduleEvent(EVENT_SUMMON_SHADOWCASTER, 9s); - events.ScheduleEvent(EVENT_SUMMON_HULKING_CORPSE, 30s); - events.ScheduleEvent(EVENT_SUMMON_CRYSTAL_HANDLER, 20s); - events.ScheduleEvent(EVENT_CHECK_PHASE, 80s); + me->SetGuidValue(UNIT_FIELD_TARGET, ObjectGuid::Empty); + me->RemoveAllAuras(); + me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); - me->CastSpell(me, SPELL_ARCANE_BLAST, true); - me->CastSpell(me, SPELL_ARCANE_FIELD, true); - me->CastSpell(me, SPELL_DESPAWN_CRYSTAL_HANDLER, true); + DoCastSelf(SPELL_ARCANE_BLAST, true); + DoCastSelf(SPELL_ARCANE_FIELD, true); + DoCastSelf(SPELL_DESPAWN_CRYSTAL_HANDLER, true); for (auto& itr : npcSummon) { @@ -147,11 +195,6 @@ struct boss_novos : public BossAI break; } } - - me->SetGuidValue(UNIT_FIELD_TARGET, ObjectGuid::Empty); - me->RemoveAllAuras(); - me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); - me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE); } void JustDied(Unit* killer) override @@ -182,6 +225,9 @@ struct boss_novos : public BossAI if (summon->GetEntry() == NPC_FETID_TROLL_CORPSE) summon->GetMotionMaster()->MovePoint(1, -373.56f, -770.86f, 28.59f); + + if (summon->EntryEquals(NPC_CRYSTAL_HANDLER)) + summon->SetInCombatWithZone(); } // Phase 2 else if (summon->GetEntry() != NPC_CRYSTAL_CHANNEL_TARGET) @@ -211,65 +257,11 @@ struct boss_novos : public BossAI if (!UpdateVictim()) return; + scheduler.Update(diff); events.Update(diff); - switch (events.ExecuteEvent()) - { - case EVENT_SUMMON_FETID_TROLL: - if (Creature* trigger = summons.GetCreatureWithEntry(NPC_CRYSTAL_CHANNEL_TARGET)) - trigger->CastSpell(trigger, SPELL_SUMMON_FETID_TROLL_CORPSE, true, nullptr, nullptr, me->GetGUID()); - events.ScheduleEvent(EVENT_SUMMON_FETID_TROLL, 3s); - break; - case EVENT_SUMMON_HULKING_CORPSE: - if (Creature* trigger = summons.GetCreatureWithEntry(NPC_CRYSTAL_CHANNEL_TARGET)) - trigger->CastSpell(trigger, SPELL_SUMMON_HULKING_CORPSE, true, nullptr, nullptr, me->GetGUID()); - events.ScheduleEvent(EVENT_SUMMON_HULKING_CORPSE, 30s); - break; - case EVENT_SUMMON_SHADOWCASTER: - if (Creature* trigger = summons.GetCreatureWithEntry(NPC_CRYSTAL_CHANNEL_TARGET)) - trigger->CastSpell(trigger, SPELL_SUMMON_RISEN_SHADOWCASTER, true, nullptr, nullptr, me->GetGUID()); - events.ScheduleEvent(EVENT_SUMMON_SHADOWCASTER, 10s); - break; - case EVENT_SUMMON_CRYSTAL_HANDLER: - if (_crystalCounter++ < 4) - { - Talk(SAY_SUMMONING_ADDS); - Talk(EMOTE_SUMMONING_ADDS); - if (Creature* target = ObjectAccessor::GetCreature(*me, _stage ? _summonTargetLeftGUID : _summonTargetRightGUID)) - target->CastSpell(target, SPELL_SUMMON_CRYSTAL_HANDLER, true, nullptr, nullptr, me->GetGUID()); - _stage = _stage ? 0 : 1; - events.ScheduleEvent(EVENT_SUMMON_CRYSTAL_HANDLER, 20s); - } - break; - case EVENT_CHECK_PHASE: - if (me->HasAura(SPELL_BEAM_CHANNEL)) - { - events.ScheduleEvent(EVENT_CHECK_PHASE, 2s); - break; - } - events.Reset(); - events.ScheduleEvent(EVENT_CAST_OFFENSIVE_SPELL, 3s); - events.ScheduleEvent(EVENT_SPELL_SUMMON_MINIONS, 10s); - me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); - me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); - me->InterruptNonMeleeSpells(false); - break; - case EVENT_CAST_OFFENSIVE_SPELL: - if (!me->HasUnitState(UNIT_STATE_CASTING)) - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true)) - me->CastSpell(target, RAND(SPELL_BLIZZARD, SPELL_FROSTBOLT, SPELL_TOUCH_OF_MISERY), false); - - events.ScheduleEvent(EVENT_CAST_OFFENSIVE_SPELL, 500ms); - break; - case EVENT_SPELL_SUMMON_MINIONS: - if (me->HasUnitState(UNIT_STATE_CASTING)) - { - me->CastSpell(me, SPELL_SUMMON_MINIONS, false); - events.ScheduleEvent(EVENT_SPELL_SUMMON_MINIONS, 15s); - break; - } - events.ScheduleEvent(EVENT_SPELL_SUMMON_MINIONS, 500ms); - break; - } + + if (!me->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE)) + DoSpellAttackIfReady(SPELL_FROSTBOLT); } bool CheckEvadeIfOutOfCombatArea() const override diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp index fd998bd7dd..d4b72fcb36 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp @@ -28,6 +28,7 @@ enum Spells SPELL_LIGHTNING_SHIELD = 50831, SPELL_STATIC_CHARGE = 50834, SPELL_LIGHTNING_RING = 50840, + SPELL_LIGHTNING_RING_5S = 51849, // IRON SLUDGE SPELL_TOXIC_VOLLEY = 50838, @@ -41,7 +42,6 @@ enum Spells enum Npc { - NPC_IRON_SLUDGE = 28165, // if 2 ooze then spawn 1 iron_sludge NPC_DWARFES_FRIENDLY = 27980, //after fix the machine by Brann NPC_OOZE = 27981, //spawn after killing dwarf NPC_FORGED_IRON_DWARF = 27982, @@ -57,15 +57,6 @@ enum Yells enum Events { - // SJONNIR - EVENT_SHIELD = 1, - EVENT_CHAIN_LIGHTNING = 2, - EVENT_STATIC_CHARGE = 3, - EVENT_LIGHTNING_RING = 4, - EVENT_CHECK_HEALTH = 5, - EVENT_SUMMON = 6, - EVENT_SUMMON_SPEACH = 7, - // TRASH EVENT_MALFORMED_OOZE_CHECK = 10, EVENT_TOXIC_VOLLEY = 11, @@ -73,8 +64,11 @@ enum Events EVENT_FORGED_LIGHTNING_TETHER = 13, }; -enum Misc +enum SjonnirMisc { + GROUP_SUMMONS = 1, + GROUP_LIGHTNING_RING = 2, + POS_GEN_RIGHT = 0, POS_GEN_LEFT = 1, POS_ROOM_CENTER = 2, @@ -83,13 +77,6 @@ enum Misc ACTION_SLUG_KILLED = 1, }; -enum SummonPhases -{ - PHASE_SUMMON_UNFRIENDLY_DWARFES = 0, - PHASE_SUMMON_OOZE = 1, - PHASE_SUMMON_FRIENDLY_DWARFES = 2, -}; - static Position RoomPosition[] = { {1293.0f, 610.0f, 199.3f, 0.0f}, @@ -107,75 +94,135 @@ public: return GetHallsOfStoneAI<boss_sjonnirAI>(pCreature); } - struct boss_sjonnirAI : public ScriptedAI + struct boss_sjonnirAI : public BossAI { - boss_sjonnirAI(Creature* c) : ScriptedAI(c), summons(me) - { - pInstance = c->GetInstanceScript(); - } + boss_sjonnirAI(Creature* c) : BossAI(c, BOSS_SJONNIR) { } - InstanceScript* pInstance; - EventMap events; - SummonList summons; - - uint8 SummonPhase; uint8 SlugeCount; void Reset() override { - events.Reset(); - summons.DespawnAll(); - + _Reset(); + scheduler.ClearValidator(); SlugeCount = 0; - SummonPhase = PHASE_SUMMON_UNFRIENDLY_DWARFES; + instance->SetData(DATA_SJONNIR_ACHIEVEMENT, false); - if (pInstance) + if (instance->GetData(BOSS_TRIBUNAL_OF_AGES) == DONE) { - pInstance->SetData(BOSS_SJONNIR, NOT_STARTED); - pInstance->SetData(DATA_SJONNIR_ACHIEVEMENT, false); + if (GameObject* console = me->GetMap()->GetGameObject(instance->GetGuidData(GO_SJONNIR_CONSOLE))) + console->SetGoState(GO_STATE_READY); - me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE); - if (pInstance->GetData(BOSS_TRIBUNAL_OF_AGES) == DONE) + if (Creature* brann = ObjectAccessor::GetCreature(*me, instance->GetGuidData(NPC_BRANN))) { - me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); + brann->setDeathState(DeathState::JustDied); + brann->Respawn(); + brann->AI()->DoAction(ACTION_SJONNIR_WIPE_START); + } + } + + ScheduleHealthCheckEvent(75, [&] { + scheduler.CancelGroup(GROUP_SUMMONS); + scheduler.Schedule(1s, GROUP_SUMMONS, [&](TaskContext context) { + uint8 Pos = urand(POS_GEN_RIGHT, POS_GEN_LEFT); + me->SummonCreature(NPC_FORGED_IRON_TROGG, RoomPosition[Pos].GetPositionX(), RoomPosition[Pos].GetPositionY(), RoomPosition[Pos].GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000); + ActivatePipe(Pos); + context.Repeat(5s, 7s); + }); + }); + + ScheduleHealthCheckEvent(50, [&] { + if (Creature* brann = ObjectAccessor::GetCreature(*me, instance->GetGuidData(NPC_BRANN))) + brann->AI()->Talk(SAY_BRANN_SPAWN_OOZE); + + scheduler.CancelGroup(GROUP_SUMMONS); + scheduler.Schedule(3s, GROUP_SUMMONS, [&](TaskContext context) { + uint8 pos = urand(POS_GEN_RIGHT, POS_GEN_LEFT); + if (Creature* ooze = me->SummonCreature(NPC_OOZE, RoomPosition[pos], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000)) + { + ActivatePipe(pos); + ooze->GetMotionMaster()->MovePoint(0, RoomPosition[POS_ROOM_CENTER].GetPositionX(), RoomPosition[POS_ROOM_CENTER].GetPositionY(), RoomPosition[POS_ROOM_CENTER].GetPositionZ()); + ooze->SetReactState(REACT_PASSIVE); + ooze->SetWalk(true); + } + + context.Repeat(); + }); + }); - if (GameObject* console = me->GetMap()->GetGameObject( pInstance->GetGuidData(GO_SJONNIR_CONSOLE))) - console->SetGoState(GO_STATE_READY); + ScheduleHealthCheckEvent(25, [&] { + if (Creature* brann = ObjectAccessor::GetCreature(*me, instance->GetGuidData(NPC_BRANN))) + brann->AI()->Talk(SAY_BRANN_SPAWN_EARTHEN); - if (Creature* brann = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_BRANN))) + scheduler.CancelGroup(GROUP_SUMMONS); + scheduler.Schedule(1s, GROUP_SUMMONS, [&](TaskContext context) { + for (int i = 0; i < 3; i++) { - brann->setDeathState(DeathState::JustDied); - brann->Respawn(); - brann->AI()->DoAction(ACTION_SJONNIR_WIPE_START); + uint8 pos = urand(POS_GEN_RIGHT, POS_GEN_LEFT); + if (Creature* dwarf = me->SummonCreature(NPC_DWARFES_FRIENDLY, RoomPosition[pos], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000)) + { + if (Player* plr = SelectTargetFromPlayerList(100.0f)) + dwarf->SetFaction(plr->GetFaction()); + + ActivatePipe(pos); + dwarf->AI()->AttackStart(me); + } } - } - } + + context.Repeat(10s, 20s); + }); + }); + + ScheduleHealthCheckEvent(20, [&] { + scheduler.CancelGroup(GROUP_LIGHTNING_RING); + DoCastSelf(SPELL_FRENZY, true); + + ScheduleTimedEvent(1s, [&] { + DoCastSelf(SPELL_LIGHTNING_RING_5S); + }, 11s); + }); + } + + void ScheduleTasks() override + { + ScheduleTimedEvent(14s, 19s, [&] { + DoCastSelf(SPELL_LIGHTNING_SHIELD); + }, 14s, 19s); + + ScheduleTimedEvent(6s, 12s, [&] { + DoCastVictim(SPELL_CHAIN_LIGHTNING); + }, 6s, 12s); + + ScheduleTimedEvent(24s, [&] { + DoCastRandomTarget(SPELL_STATIC_CHARGE, 0, 50.0f); + }, 20s); + + scheduler.Schedule(30s, GROUP_LIGHTNING_RING, [&](TaskContext context) { + DoCastAOE(SPELL_LIGHTNING_RING); + context.Repeat(40s); + }); + + if (Creature* brann = ObjectAccessor::GetCreature(*me, instance->GetGuidData(NPC_BRANN))) + brann->AI()->Talk(SAY_BRANN_SPAWN_TROGG, 20s); + + scheduler.Schedule(5s, GROUP_SUMMONS, [&](TaskContext context) { + uint8 pos = urand(POS_GEN_RIGHT, POS_GEN_LEFT); + me->SummonCreature(NPC_FORGED_IRON_DWARF, RoomPosition[pos], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000); + ActivatePipe(pos); + context.Repeat(30s); + }); } void JustEngagedWith(Unit* /*who*/) override { + _JustEngagedWith(); Talk(SAY_AGGRO); - events.ScheduleEvent(EVENT_CHECK_HEALTH, 1s); - events.ScheduleEvent(EVENT_SHIELD, 14s, 19s); - events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 6s, 12s); - events.ScheduleEvent(EVENT_STATIC_CHARGE, 24s); - events.ScheduleEvent(EVENT_LIGHTNING_RING, 25s, 31s); - events.ScheduleEvent(EVENT_SUMMON, 20s); - events.ScheduleEvent(EVENT_SUMMON, 21s + 500ms); - events.ScheduleEvent(EVENT_SUMMON_SPEACH, 20s); + if (GameObject* doors = me->GetMap()->GetGameObject(instance->GetGuidData(GO_SJONNIR_DOOR))) + doors->SetGoState(GO_STATE_READY); - if (pInstance) - { - pInstance->SetData(BOSS_SJONNIR, IN_PROGRESS); - - if (GameObject* doors = me->GetMap()->GetGameObject(pInstance->GetGuidData(GO_SJONNIR_DOOR))) - doors->SetGoState(GO_STATE_READY); - - if (pInstance->GetData(BOSS_TRIBUNAL_OF_AGES) == DONE) - if (Creature* brann = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_BRANN))) - brann->AI()->DoAction(ACTION_START_SJONNIR_FIGHT); - } + if (instance->GetData(BOSS_TRIBUNAL_OF_AGES) == DONE) + if (Creature* brann = ObjectAccessor::GetCreature(*me, instance->GetGuidData(NPC_BRANN))) + brann->AI()->DoAction(ACTION_START_SJONNIR_FIGHT); } void DoAction(int32 param) override @@ -183,144 +230,20 @@ public: if (param == ACTION_SLUG_KILLED) { SlugeCount++; - if (SlugeCount >= 5 && pInstance) - pInstance->SetData(DATA_SJONNIR_ACHIEVEMENT, true); - } - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_CHECK_HEALTH: - { - if (SummonPhase == PHASE_SUMMON_UNFRIENDLY_DWARFES && HealthBelowPct(50)) - { - SummonPhase = PHASE_SUMMON_OOZE; - events.CancelEvent(EVENT_SUMMON); - events.ScheduleEvent(EVENT_SUMMON, 0ms); - events.ScheduleEvent(EVENT_SUMMON, 1500ms); - - if (pInstance) - if (Creature* brann = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_BRANN))) - { - brann->AI()->Talk(SAY_BRANN_SPAWN_OOZE); - } - } - - if (HealthBelowPct(20)) - { - if (Creature* brann = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_BRANN))) - { - brann->AI()->Talk(SAY_BRANN_SPAWN_EARTHEN); - } - SummonPhase = PHASE_SUMMON_FRIENDLY_DWARFES; - me->CastSpell(me, SPELL_FRENZY, false); - - events.CancelEvent(EVENT_SUMMON); - events.ScheduleEvent(EVENT_SUMMON, 0ms); - break; - } - - events.Repeat(1s); - break; - } - case EVENT_SHIELD: - { - me->CastSpell(me, SPELL_LIGHTNING_SHIELD, false); - events.Repeat(14s, 19s); - break; - } - case EVENT_CHAIN_LIGHTNING: - { - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 50.0f, true, 0)) - me->CastSpell(target, SPELL_CHAIN_LIGHTNING, false); - - events.Repeat(6s, 12s); - break; - } - case EVENT_STATIC_CHARGE: - { - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 50.0f, true, 0)) - me->CastSpell(target, SPELL_STATIC_CHARGE, false); - - events.Repeat(20s); - break; - } - case EVENT_LIGHTNING_RING: - { - me->CastSpell(me, SPELL_LIGHTNING_RING, false); - events.Repeat(25s, 31s); - events.DelayEvents(10s); // Channel duration - break; - } - case EVENT_SUMMON_SPEACH: - { - if (Creature* brann = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_BRANN))) - { - brann->AI()->Talk(SAY_BRANN_SPAWN_TROGG); - } - - break; - } - case EVENT_SUMMON: - { - switch (SummonPhase) - { - case PHASE_SUMMON_UNFRIENDLY_DWARFES: - { - SummonDwarfes(false); - events.Repeat(20s); - break; - } - case PHASE_SUMMON_OOZE: - { - for (uint8 i = POS_GEN_RIGHT; i <= POS_GEN_LEFT; i++) - { - if (Creature* ooze = me->SummonCreature(NPC_OOZE, RoomPosition[i].GetPositionX(), RoomPosition[i].GetPositionY(), RoomPosition[i].GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000)) - { - ActivatePipe(i); - ooze->GetMotionMaster()->MovePoint(0, RoomPosition[POS_ROOM_CENTER].GetPositionX(), RoomPosition[POS_ROOM_CENTER].GetPositionY(), RoomPosition[POS_ROOM_CENTER].GetPositionZ()); - summons.Summon(ooze); - } - } - events.Repeat(10s); - break; - } - case PHASE_SUMMON_FRIENDLY_DWARFES: - { - SummonDwarfes(true); - break; - } - } - break; - } + if (SlugeCount >= 5) + instance->SetData(DATA_SJONNIR_ACHIEVEMENT, true); } - - DoMeleeAttackIfReady(); } void JustDied(Unit* /*killer*/) override { Talk(SAY_DEATH); + _JustDied(); + if (GameObject* sd = me->GetMap()->GetGameObject(instance->GetGuidData(GO_SJONNIR_DOOR))) + sd->SetGoState(GO_STATE_ACTIVE); - summons.DespawnAll(); - if (pInstance) - { - pInstance->SetData(BOSS_SJONNIR, DONE); - if (GameObject* sd = me->GetMap()->GetGameObject(pInstance->GetGuidData(GO_SJONNIR_DOOR))) - sd->SetGoState(GO_STATE_ACTIVE); - - if (Creature* brann = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_BRANN))) - brann->AI()->DoAction(ACTION_SJONNIR_DEAD); - } + if (Creature* brann = ObjectAccessor::GetCreature(*me, instance->GetGuidData(NPC_BRANN))) + brann->AI()->DoAction(ACTION_SJONNIR_DEAD); } void KilledUnit(Unit* /*victim*/) override @@ -333,42 +256,8 @@ public: void ActivatePipe(uint8 side) { - if (pInstance) - if (GameObject* pipe = me->GetMap()->GetGameObject(pInstance->GetGuidData(side == POS_GEN_RIGHT ? GO_RIGHT_PIPE : GO_LEFT_PIPE))) - pipe->SendCustomAnim(0); - } - - void SummonDwarfes(bool friendly) - { - if (friendly) - { - for (int i = 0; i < 3; i++) - { - uint8 Pos = urand(POS_GEN_RIGHT, POS_GEN_LEFT); - if (Creature* dwarf = me->SummonCreature(NPC_DWARFES_FRIENDLY, RoomPosition[Pos].GetPositionX(), RoomPosition[Pos].GetPositionY(), RoomPosition[Pos].GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000)) - { - if (Player* plr = SelectTargetFromPlayerList(100.0f)) - dwarf->SetFaction(plr->GetFaction()); - - ActivatePipe(Pos); - dwarf->AI()->AttackStart(me); - summons.Summon(dwarf); - } - } - } - else - { - for (int i = 0; i < 2; i++) - { - uint8 Pos = urand(POS_GEN_RIGHT, POS_GEN_LEFT); - if (Creature* dwarf = me->SummonCreature(urand(0, 1) ? NPC_FORGED_IRON_TROGG : NPC_FORGED_IRON_DWARF, RoomPosition[Pos].GetPositionX(), RoomPosition[Pos].GetPositionY(), RoomPosition[Pos].GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000)) - { - ActivatePipe(Pos); - dwarf->SetInCombatWithZone(); - summons.Summon(dwarf); - } - } - } + if (GameObject* pipe = me->GetMap()->GetGameObject(instance->GetGuidData(side == POS_GEN_RIGHT ? GO_RIGHT_PIPE : GO_LEFT_PIPE))) + pipe->SendCustomAnim(0); } }; }; @@ -423,8 +312,8 @@ public: } void JustDied(Unit* /*killer*/) override { - if (InstanceScript* pInstance = me->GetInstanceScript()) - if (Creature* sjonnir = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_SJONNIR))) + if (InstanceScript* instance = me->GetInstanceScript()) + if (Creature* sjonnir = instance->GetCreature(BOSS_SJONNIR)) sjonnir->AI()->DoAction(ACTION_SLUG_KILLED); } void UpdateAI(uint32 diff) override diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/brann_bronzebeard.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/brann_bronzebeard.cpp index 31b4a18b37..a783794652 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/brann_bronzebeard.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/brann_bronzebeard.cpp @@ -886,8 +886,6 @@ void brann_bronzebeard::brann_bronzebeardAI::WaypointReached(uint32 id) { pInstance->SetData(BRANN_BRONZEBEARD, 4); me->ReplaceAllNpcFlags(UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); - if (Creature* cr = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_SJONNIR))) - cr->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); me->SetOrientation(3.132660f); DoCast(me, 58506, false); me->SendMovementFlagUpdate(); diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h index 9039c0eba9..d45d3009bc 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h @@ -78,6 +78,7 @@ enum npcs NPC_ABEDNEUM = 30899, NPC_SJONNIR = 27978, NPC_BRANN = 28070, + NPC_IRON_SLUDGE = 28165, ACTION_START_ESCORT_EVENT = 0, ACTION_START_TRIBUNAL = 1, diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp index 521c1ba610..c6c8b65ddd 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp @@ -20,6 +20,18 @@ #include "ScriptedCreature.h" #include "halls_of_stone.h" +ObjectData const summonData[] = +{ + { NPC_IRON_SLUDGE, BOSS_SJONNIR }, + { 0, 0 } +}; + +ObjectData const creatureData[] = +{ + { NPC_SJONNIR, BOSS_SJONNIR }, + { 0, 0 } +}; + class instance_halls_of_stone : public InstanceMapScript { public: @@ -57,6 +69,9 @@ public: void Initialize() override { SetHeaders(DataHeader); + SetBossNumber(MAX_ENCOUNTER); + LoadObjectData(creatureData, nullptr); + LoadSummonData(summonData); memset(&Encounter, 0, sizeof(Encounter)); brannAchievement = false; @@ -121,13 +136,12 @@ public: { switch (creature->GetEntry()) { - case NPC_SJONNIR: - SjonnirGUID = creature->GetGUID(); - break; case NPC_BRANN: BrannGUID = creature->GetGUID(); break; } + + InstanceScript::OnCreatureCreate(creature); } ObjectGuid GetGuidData(uint32 id) const override |
