diff options
-rw-r--r-- | src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp | 68 |
1 files changed, 48 insertions, 20 deletions
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp index 334e3d73775..229893a5c6b 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp @@ -653,6 +653,14 @@ class npc_high_overlord_saurfang_icc : public CreatureScript return false; } + void GuardBroadcast(std::function<void(Creature*)>&& action) const + { + std::vector<Creature*> guardList; + GetCreatureListWithEntryInGrid(guardList, me, NPC_SE_KOR_KRON_REAVER, 100.0f); + for (Creature* guard : guardList) + action(guard); + } + void DoAction(int32 action) override { switch (action) @@ -663,10 +671,11 @@ class npc_high_overlord_saurfang_icc : public CreatureScript if (_events.IsInPhase(PHASE_INTRO_A) || _events.IsInPhase(PHASE_INTRO_H)) return; - GetCreatureListWithEntryInGrid(_guardList, me, NPC_SE_KOR_KRON_REAVER, 20.0f); - _guardList.sort(Trinity::ObjectDistanceOrderPred(me)); + std::list<Creature*> guardList; + GetCreatureListWithEntryInGrid(guardList, me, NPC_SE_KOR_KRON_REAVER, 20.0f); + guardList.sort(Trinity::ObjectDistanceOrderPred(me)); uint32 x = 1; - for (std::list<Creature*>::iterator itr = _guardList.begin(); itr != _guardList.end(); ++x, ++itr) + for (auto itr = guardList.begin(); itr != guardList.end(); ++x, ++itr) (*itr)->AI()->SetData(0, x); me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); @@ -688,15 +697,19 @@ class npc_high_overlord_saurfang_icc : public CreatureScript _events.ScheduleEvent(EVENT_OUTRO_HORDE_5, 30000); // move me->SetDisableGravity(false); me->GetMotionMaster()->MoveFall(); - for (std::list<Creature*>::iterator itr = _guardList.begin(); itr != _guardList.end(); ++itr) - (*itr)->AI()->DoAction(ACTION_DESPAWN); + GuardBroadcast([](Creature* guard) + { + guard->AI()->DoAction(ACTION_DESPAWN); + }); break; } case ACTION_INTERRUPT_INTRO: { _events.Reset(); - for (std::list<Creature*>::iterator itr = _guardList.begin(); itr != _guardList.end(); ++itr) - (*itr)->AI()->DoAction(ACTION_DESPAWN); + GuardBroadcast([](Creature* guard) + { + guard->AI()->DoAction(ACTION_DESPAWN); + }); break; } default: @@ -780,8 +793,10 @@ class npc_high_overlord_saurfang_icc : public CreatureScript break; case EVENT_INTRO_HORDE_8: Talk(SAY_INTRO_HORDE_8); - for (std::list<Creature*>::iterator itr = _guardList.begin(); itr != _guardList.end(); ++itr) - (*itr)->AI()->DoAction(ACTION_CHARGE); + GuardBroadcast([](Creature* guard) + { + guard->AI()->DoAction(ACTION_CHARGE); + }); me->GetMotionMaster()->MoveCharge(chargePos[0].GetPositionX(), chargePos[0].GetPositionY(), chargePos[0].GetPositionZ(), 8.5f, POINT_CHARGE); break; case EVENT_OUTRO_HORDE_2: // say @@ -814,7 +829,6 @@ class npc_high_overlord_saurfang_icc : public CreatureScript private: EventMap _events; InstanceScript* _instance; - std::list<Creature*> _guardList; }; CreatureAI* GetAI(Creature* creature) const override @@ -850,6 +864,14 @@ class npc_muradin_bronzebeard_icc : public CreatureScript return false; } + void GuardBroadcast(std::function<void(Creature*)>&& action) const + { + std::vector<Creature*> guardList; + GetCreatureListWithEntryInGrid(guardList, me, NPC_SE_SKYBREAKER_MARINE, 100.0f); + for (Creature* guard : guardList) + action(guard); + } + void DoAction(int32 action) override { switch (action) @@ -861,10 +883,11 @@ class npc_muradin_bronzebeard_icc : public CreatureScript return; _events.SetPhase(PHASE_INTRO_A); - GetCreatureListWithEntryInGrid(_guardList, me, NPC_SE_SKYBREAKER_MARINE, 20.0f); - _guardList.sort(Trinity::ObjectDistanceOrderPred(me)); + std::list<Creature*> guardList; + GetCreatureListWithEntryInGrid(guardList, me, NPC_SE_SKYBREAKER_MARINE, 20.0f); + guardList.sort(Trinity::ObjectDistanceOrderPred(me)); uint32 x = 1; - for (std::list<Creature*>::iterator itr = _guardList.begin(); itr != _guardList.end(); ++x, ++itr) + for (auto itr = guardList.begin(); itr != guardList.end(); ++x, ++itr) (*itr)->AI()->SetData(0, x); me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); @@ -881,8 +904,10 @@ class npc_muradin_bronzebeard_icc : public CreatureScript Talk(SAY_OUTRO_ALLIANCE_1); me->SetDisableGravity(false); me->GetMotionMaster()->MoveFall(); - for (std::list<Creature*>::iterator itr = _guardList.begin(); itr != _guardList.end(); ++itr) - (*itr)->AI()->DoAction(ACTION_DESPAWN); + GuardBroadcast([](Creature* guard) + { + guard->AI()->DoAction(ACTION_DESPAWN); + }); // temp until outro fully done - to put deathbringer on respawn timer (until next reset) if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_DEATHBRINGER_SAURFANG))) @@ -891,8 +916,10 @@ class npc_muradin_bronzebeard_icc : public CreatureScript } case ACTION_INTERRUPT_INTRO: _events.Reset(); - for (std::list<Creature*>::iterator itr = _guardList.begin(); itr != _guardList.end(); ++itr) - (*itr)->AI()->DoAction(ACTION_DESPAWN); + GuardBroadcast([](Creature* guard) + { + guard->AI()->DoAction(ACTION_DESPAWN); + }); break; } } @@ -939,8 +966,10 @@ class npc_muradin_bronzebeard_icc : public CreatureScript break; case EVENT_INTRO_ALLIANCE_5: Talk(SAY_INTRO_ALLIANCE_5); - for (std::list<Creature*>::iterator itr = _guardList.begin(); itr != _guardList.end(); ++itr) - (*itr)->AI()->DoAction(ACTION_CHARGE); + GuardBroadcast([](Creature* guard) + { + guard->AI()->DoAction(ACTION_CHARGE); + }); me->GetMotionMaster()->MoveCharge(chargePos[0].GetPositionX(), chargePos[0].GetPositionY(), chargePos[0].GetPositionZ(), 8.5f, POINT_CHARGE); break; } @@ -950,7 +979,6 @@ class npc_muradin_bronzebeard_icc : public CreatureScript private: EventMap _events; InstanceScript* _instance; - std::list<Creature*> _guardList; }; CreatureAI* GetAI(Creature* creature) const override |