void SummonedCreatureDies(Creature* summon, Unit*) { summons.Despawn(summon); summons.RemoveNotExisting(); if (summons.empty()) me->RemoveAurasDueToSpell(SPELL_BANISH_SELF); }
bool CheckPhaseMinions() { summons.RemoveNotExisting(); if (summons.empty()) { ResetPlayersPhaseMask(); return true; } uint16 phase = 1; for (std::list<uint64>::iterator itr = summons.begin(); itr != summons.end(); ++itr) { if (Creature *summon = ObjectAccessor::GetCreature(*me, *itr)) phase |= summon->GetPhaseMask(); } Map::PlayerList const &players = me->GetMap()->GetPlayers(); for (Map::PlayerList::const_iterator i = players.begin(); i != players.end(); ++i) { if (Player* pPlayer = i->GetSource()) if ((pPlayer->GetPhaseMask() & phase) == 0) pPlayer->RemoveAurasDueToSpell(GetSpellForPhaseMask(pPlayer->GetPhaseMask())); } return false; }
void SummonLavaWaves() { summons.RemoveNotExisting(); Talk(WHISPER_LAVA_CHURN); events.ScheduleEvent(EVENT_SARTHARION_START_LAVA, 2000); events.ScheduleEvent(EVENT_SARTHARION_FINISH_LAVA, 9000); // Send wave from left if (urand(0,1)) { for (uint8 i = 0; i < 3; ++i) me->SummonCreature(NPC_FLAME_TSUNAMI, 3208.44f, 580.0f-(i*50.0f), 55.8f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 12000); } // from right else { for (uint8 i = 0; i < 2; ++i) me->SummonCreature(NPC_FLAME_TSUNAMI, 3283.44f, 555.0f-(i*50.0f), 55.8f, 3.14f, TEMPSUMMON_TIMED_DESPAWN, 12000); } }
void UpdateAI(uint32 diff) { // Call speach if (timer) { timer += diff; if (timer >= 4000) { Talk(SAY_TENEBRON_RESPOND); me->SetCanFly(true); me->SetSpeed(MOVE_FLIGHT, 3.0f); me->GetMotionMaster()->MovePath(me->GetEntry()*10, false); timer = 0; } } if (!UpdateVictim()) return; events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; switch (events.GetEvent()) { case EVENT_MINIBOSS_SHADOW_BREATH: if (!urand(0,10)) Talk(SAY_TENEBRON_BREATH); me->CastSpell(me->GetVictim(), SPELL_SHADOW_BREATH, false); events.RepeatEvent(17500); break; case EVENT_MINIBOSS_SHADOW_FISSURE: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) me->CastSpell(target, SPELL_SHADOW_FISSURE, false); events.RepeatEvent(22500); break; case EVENT_MINIBOSS_OPEN_PORTAL: Talk(WHISPER_OPEN_PORTAL); Talk(SAY_TENEBRON_SPECIAL); if (!isSartharion) { if (GameObject* Portal = me->GetVictim()->SummonGameObject(GO_TWILIGHT_PORTAL, portalPos[BOSS_TENEBRON_EVENT].GetPositionX(), portalPos[BOSS_TENEBRON_EVENT].GetPositionY(), portalPos[BOSS_TENEBRON_EVENT].GetPositionZ(), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0)) portalGUID = Portal->GetGUID(); } else if (pInstance) pInstance->SetData(DATA_ADD_PORTAL, 0); events.ScheduleEvent(EVENT_MINIBOSS_SPAWN_HELPERS, 2000); events.RepeatEvent(60000); break; case EVENT_MINIBOSS_SPAWN_HELPERS: { Talk(WHISPER_HATCH_EGGS); Creature* cr = NULL; for (uint8 i = 0; i < 6; ++i) { if (cr = me->SummonCreature(NPC_TWILIGHT_EGG, EggsPos[isSartharion ? i+6 : i].GetPositionX(), EggsPos[isSartharion ? i+6 : i].GetPositionY(), EggsPos[isSartharion ? i+6 : i].GetPositionZ(), EggsPos[isSartharion ? i+6 : i].GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000)) { summons.Summon(cr); cr->SetPhaseMask(16, true); } if (cr = me->SummonCreature(NPC_TWILIGHT_WHELP, EggsPos[isSartharion ? i+6 : i].GetPositionX(), EggsPos[isSartharion ? i+6 : i].GetPositionY(), EggsPos[isSartharion ? i+6 : i].GetPositionZ(), EggsPos[isSartharion ? i+6 : i].GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000)) { summons.Summon(cr); cr->SetPhaseMask(16, true); } } events.ScheduleEvent(EVENT_MINIBOSS_HATCH_EGGS, 25000); events.PopEvent(); break; } case EVENT_MINIBOSS_HATCH_EGGS: { Creature* cr = NULL; summons.RemoveNotExisting(); summons.DespawnEntry(NPC_TWILIGHT_WHELP); for (SummonList::iterator i = summons.begin(); i != summons.end(); ++i) { if (cr = ObjectAccessor::GetCreature(*me, *i)) { if (!cr->IsAlive()) continue; if (cr->GetEntry() == NPC_TWILIGHT_EGG) if (cr = me->SummonCreature(NPC_TWILIGHT_WHELP, cr->GetPositionX(), cr->GetPositionY(), cr->GetPositionZ(), cr->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000)) summons2.Summon(cr); } } if (!isSartharion) { // Remove phase shift if (InstanceScript* instance = me->GetInstanceScript()) instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_TWILIGHT_SHIFT); RemoveTwilightPortal(); } else if (pInstance) pInstance->SetData(DATA_CLEAR_PORTAL, 0); EntryCheckPredicate pred(NPC_TWILIGHT_EGG); summons.DoAction(ACTION_SWITCH_PHASE, pred); events.PopEvent(); break; } } DoMeleeAttackIfReady(); }