void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_FELL_FIREBALL: if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0)) DoCast(target, SPELL_FELL_FIREBALL); events.RescheduleEvent(EVENT_FELL_FIREBALL, 1000); return; } } DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { //Return since we have no target if (!UpdateVictim()) return; events.Update(diff); if (me->HasUnitState(UNIT_STAT_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_SOUL_STRIKE: DoCast(me->getVictim(), SPELL_SOUL_STRIKE); events.RescheduleEvent(EVENT_SOUL_STRIKE, 8000); return; } } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) { if (!UpdateVictim()) return; events.Update(diff); if( me->HasUnitState(UNIT_STATE_CASTING) ) return; switch( events.GetEvent() ) { case 0: break; case EVENT_YELL_DEAD_1: Talk(YELL_DEAD_1); events.PopEvent(); break; case EVENT_START_RESURRECTION: me->CastSpell(me, SPELL_SUMMON_VALKYR, true); events.PopEvent(); events.RescheduleEvent(EVENT_VALKYR_BEAM, 7000); events.RescheduleEvent(EVENT_VALKYR_MOVE, 1); events.RescheduleEvent(EVENT_ANNHYLDE_YELL, 3000); break; case EVENT_VALKYR_MOVE: if( Creature* s = ObjectAccessor::GetCreature(*me, ValkyrGUID) ) s->GetMotionMaster()->MovePoint(1, s->GetPositionX(), s->GetPositionY(), s->GetPositionZ()-15.0f); events.PopEvent(); break; case EVENT_ANNHYLDE_YELL: if( Creature* s = ObjectAccessor::GetCreature(*me, ValkyrGUID) ) s->AI()->Talk(YELL_ANHYLDE_2); events.PopEvent(); break; case EVENT_VALKYR_BEAM: me->RemoveAura(SPELL_SUMMON_VALKYR); if( Creature* c = ObjectAccessor::GetCreature(*me, ValkyrGUID) ) c->CastSpell(me, SPELL_RESURRECTION_BEAM, false); events.PopEvent(); events.RescheduleEvent(EVENT_RESURRECTION_BALL, 4000); break; case EVENT_RESURRECTION_BALL: me->CastSpell(me, SPELL_RESURRECTION_BALL, true); events.PopEvent(); events.RescheduleEvent(EVENT_RESURRECTION_HEAL, 4000); break; case EVENT_RESURRECTION_HEAL: me->RemoveAura(SPELL_RESURRECTION_BALL); me->CastSpell(me, SPELL_RESURRECTION_HEAL, true); FeignDeath(false); events.PopEvent(); events.RescheduleEvent(EVENT_MORPH_TO_UNDEAD, 3000); break; case EVENT_MORPH_TO_UNDEAD: me->CastSpell(me, SPELL_INGVAR_TRANSFORM, true); events.PopEvent(); events.RescheduleEvent(EVENT_START_PHASE_2, 1000); break; case EVENT_START_PHASE_2: if( Creature* c = ObjectAccessor::GetCreature(*me, ValkyrGUID) ) { c->DespawnOrUnsummon(); summons.DespawnAll(); } events.PopEvent(); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); AttackStart(me->GetVictim()); me->GetMotionMaster()->MoveChase(me->GetVictim()); Talk(YELL_AGGRO_2); // schedule Phase 2 abilities events.RescheduleEvent(EVENT_SPELL_ROAR, 15000); events.RescheduleEvent(EVENT_SPELL_CLEAVE_OR_WOE_STRIKE, 2000); events.RescheduleEvent(EVENT_SPELL_SMASH, 5000); events.RescheduleEvent(EVENT_SPELL_ENRAGE_OR_SHADOW_AXE, 10000); break; // ABILITIES HERE: case EVENT_UNROOT: me->SetControlled(false, UNIT_STATE_ROOT); me->DisableRotate(false); events.PopEvent(); break; case EVENT_SPELL_ROAR: Talk(EMOTE_ROAR); me->_AddCreatureSpellCooldown(SPELL_STAGGERING_ROAR, 0); me->_AddCreatureSpellCooldown(SPELL_DREADFUL_ROAR, 0); if (me->GetDisplayId() == DISPLAYID_DEFAULT) me->CastSpell((Unit*)NULL, SPELL_STAGGERING_ROAR, false); else me->CastSpell((Unit*)NULL, SPELL_DREADFUL_ROAR, false); events.RepeatEvent(urand(15000,20000)); break; case EVENT_SPELL_CLEAVE_OR_WOE_STRIKE: if( me->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID) == 0 ) { events.RepeatEvent(3000); break; } if (me->GetDisplayId() == DISPLAYID_DEFAULT) me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false); else me->CastSpell(me->GetVictim(), SPELL_WOE_STRIKE, false); events.RepeatEvent(urand(0,4000)+3000); break; case EVENT_SPELL_SMASH: if( me->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID) == 0 ) { events.RepeatEvent(3000); break; } me->SetControlled(true, UNIT_STATE_ROOT); me->DisableRotate(true); me->SendMovementFlagUpdate(); if (me->GetDisplayId() == DISPLAYID_DEFAULT) me->CastSpell((Unit*)NULL, SPELL_SMASH, false); else me->CastSpell((Unit*)NULL, SPELL_DARK_SMASH, false); events.RepeatEvent(urand(9000,11000)); events.RescheduleEvent(EVENT_UNROOT, 3750); break; case EVENT_SPELL_ENRAGE_OR_SHADOW_AXE: if (me->GetDisplayId() == DISPLAYID_DEFAULT) { me->CastSpell(me, SPELL_ENRAGE, false); events.RepeatEvent(10000); } else { me->CastSpell((Unit*)NULL, SPELL_SHADOW_AXE, true); SetEquipmentSlots(false, EQUIP_UNEQUIP, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); events.RepeatEvent(35000); events.RescheduleEvent(EVENT_AXE_RETURN, 10000); } break; case EVENT_AXE_RETURN: if (Creature* c = ObjectAccessor::GetCreature(*me, ThrowGUID)) c->GetMotionMaster()->MoveCharge(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+0.5f); events.PopEvent(); events.RescheduleEvent(EVENT_AXE_PICKUP, 1500); break; case EVENT_AXE_PICKUP: if (Creature* c = ObjectAccessor::GetCreature(*me, ThrowGUID)) { c->DestroyForNearbyPlayers(); c->DespawnOrUnsummon(); summons.DespawnAll(); } ThrowGUID = 0; SetEquipmentSlots(true); events.PopEvent(); break; } if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)) DoMeleeAttackIfReady(); }
void SpellHit(Unit * Hitter, SpellInfo const* spell) override { m_events.RescheduleEvent(EVENT_COMBAT_TIMER, 1000); m_combatTime[Hitter->GetGUID()] = time(NULL); if (Player* player = Hitter->ToPlayer()) { switch (player->getClass()) { case CLASS_WARRIOR: { if (spell->Id == 100) player->KilledMonsterCredit(44175); break; } case CLASS_PALADIN: { if (player->HasAura(105361) && spell->Id == 20271) // wowhead: this is the correct spell/aura : Seal of Command { player->KilledMonsterCredit(44420); player->KilledMonsterCredit(44175); } if (player->HasAura(20154) && spell->Id == 20271) // wowhead: this is a wrong lv 42 spell/aura, but used now in core.. : Seal of Righteousness { player->KilledMonsterCredit(44420); player->KilledMonsterCredit(44175); } break; } case CLASS_HUNTER: { if (spell->Id == 56641) player->KilledMonsterCredit(44175); break; } case CLASS_ROGUE: { if (spell->Id == 2098) player->KilledMonsterCredit(44175); break; } case CLASS_PRIEST: { if (spell->Id == 589) player->KilledMonsterCredit(44175); break; } case CLASS_DEATH_KNIGHT: { break; } case CLASS_SHAMAN: { if (spell->Id == 73899) player->KilledMonsterCredit(44175); break; } case CLASS_MAGE: { if (!m_spell_is_on_work) { if (Hitter->getRace() == RACE_TROLL) { if (spell->Id == 122) player->KilledMonsterCredit(44175); if (spell->Id == 133) player->KilledMonsterCredit(44175); if (spell->Id == 2136) player->KilledMonsterCredit(44175); } if (spell->Id == 7268 && !m_spell_is_on_work) { m_spell_is_on_work = true; m_events.ScheduleEvent(EVENT_COOLDOWN, 7000); player->KilledMonsterCredit(44175); } } break; } case CLASS_WARLOCK: { if (spell->Id == 172) player->KilledMonsterCredit(44175); if (spell->Id == 348) player->KilledMonsterCredit(44175); if (spell->Id == 2098) player->KilledMonsterCredit(44175); break; } case CLASS_DRUID: { if (spell->Id == 8921) player->KilledMonsterCredit(44175); break; } } } }
void UpdateAI(uint32 diff) { if( !UpdateVictim() ) return; events.Update(diff); if( me->HasUnitState(UNIT_STATE_CASTING) ) return; if( !bPhase3 && HealthBelowPct(30) && !me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE) && !me->HasAura(SPELL_SUBMERGE) && !me->HasAura(SPELL_EMERGE) ) { bPhase3 = true; events.CancelEvent(EVENT_SUBMERGE); events.CancelEvent(EVENT_EMERGE); events.CancelEvent(EVENT_EMERGE_2); if( !IsHeroic() ) events.CancelEvent(EVENT_SUMMON_NERUBIAN); me->CastSpell((Unit*)NULL, SPELL_LEECHING_SWARM, false); Talk(EMOTE_LEECHING_SWARM); Talk(SAY_LEECHING_SWARM); return; } switch( events.GetEvent() ) { case 0: break; case EVENT_ENRAGE: { me->CastSpell(me, SPELL_BERSERK, true); events.PopEvent(); } break; case EVENT_RESPAWN_SPHERE: { uint8 StartAt = urand(0,5); uint8 i = StartAt; do { if( Creature* c = ObjectAccessor::GetCreature(*me, SphereGUID[i]) ) if( !c->HasAura(SPELL_FROST_SPHERE) ) { if( Creature* c = me->SummonCreature(NPC_FROST_SPHERE, AnubLocs[i+5]) ) SphereGUID[i] = c->GetGUID(); break; } i = (i+1)%6; } while( i != StartAt ); events.RepeatEvent(4000); } break; case EVENT_SPELL_FREEZING_SLASH: { if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_FREEZING_SLASH, false); events.RepeatEvent(urand(15000,20000)); } break; case EVENT_SPELL_PENETRATING_COLD: { me->CastCustomSpell(SPELL_PENETRATING_COLD, SPELLVALUE_MAX_TARGETS, RAID_MODE(2,5,2,5)); events.RepeatEvent(18000); } break; case EVENT_SUMMON_NERUBIAN: { me->CastCustomSpell(SPELL_SUMMON_BURROWER, SPELLVALUE_MAX_TARGETS, RAID_MODE(1,2,2,4)); events.RepeatEvent(45000); } break; case EVENT_SUBMERGE: { me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); bool berserk = me->HasAura(SPELL_BERSERK); me->RemoveAllAuras(); if (berserk) me->CastSpell(me, SPELL_BERSERK, true); Talk(EMOTE_SUBMERGE); Talk(EMOTE_BURROWER); me->CastSpell(me, SPELL_SUBMERGE, false); events.CancelEvent(EVENT_SUMMON_NERUBIAN); events.CancelEvent(EVENT_SPELL_FREEZING_SLASH); events.CancelEvent(EVENT_SPELL_PENETRATING_COLD); events.RescheduleEvent(EVENT_EMERGE, EMERGE_INTERVAL); events.RescheduleEvent(EVENT_SPELL_SUMMON_SPIKE, 2500); events.RescheduleEvent(EVENT_SUMMON_SCARAB, 3000); events.PopEvent(); } break; case EVENT_SUMMON_SCARAB: { uint8 i = urand(0,3); if( Creature* c = ObjectAccessor::GetCreature(*me, BurrowGUID[i]) ) me->CastSpell(c, SPELL_SUMMON_SCARAB, true); events.RepeatEvent(4000); } break; case EVENT_EMERGE: { me->CastSpell(me, SPELL_SPIKE_TELE, true); summons.DespawnEntry(NPC_SPIKE); events.CancelEvent(EVENT_SUMMON_SCARAB); events.RescheduleEvent(EVENT_EMERGE_2, 2000); events.PopEvent(); } break; case EVENT_EMERGE_2: { Talk(SAY_EMERGE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->setAttackTimer(BASE_ATTACK, 3000); me->RemoveAura(SPELL_SUBMERGE); me->CastSpell(me, SPELL_EMERGE, false); events.RescheduleEvent(EVENT_SUMMON_NERUBIAN, urand(5000,8000)); events.RescheduleEvent(EVENT_SPELL_FREEZING_SLASH, urand(7000,15000)); events.RescheduleEvent(EVENT_SPELL_PENETRATING_COLD, urand(15000,20000)); events.RescheduleEvent(EVENT_SUBMERGE, SUBMERGE_INTERVAL); events.PopEvent(); } break; case EVENT_SPELL_SUMMON_SPIKE: me->CastSpell(me, SPELL_SUMMON_SPIKE, true); events.PopEvent(); break; } DoMeleeAttackIfReady(); }
void Reset() override { _drizzleGuid = 0; _player_GUID = 0; _events.RescheduleEvent(EVENT_START_ANIM, 500); }
void UpdateAI(uint32 diff) { events.Update(diff); uint32 eventId = events.GetEvent(); if (eventId == EVENT_SPELL_INHIBIT_MAGIC) { Map::PlayerList const &PlayerList = me->GetMap()->GetPlayers(); for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) if (Player* player = i->GetSource()) { float dist = me->GetDistance(player); if (player->IsAlive() && dist < 45.0f) { Aura* aura = player->GetAura(SPELL_INHIBIT_MAGIC); if (!aura) aura = me->AddAura(SPELL_INHIBIT_MAGIC, player); else aura->RefreshDuration(); if (aura) aura->SetStackAmount(getStackCount(dist)); } else player->RemoveAurasDueToSpell(SPELL_INHIBIT_MAGIC); } events.RepeatEvent(3000); return; } if (!UpdateVictim()) return; switch (eventId) { case EVENT_SPELL_ATTRACT_MAGIC: me->CastSpell(me, SPELL_ATTRACT_MAGIC, false); events.RepeatEvent(30000); events.RescheduleEvent(EVENT_SPELL_CARNIVOROUS, 1500); break; case EVENT_SPELL_CARNIVOROUS: me->CastSpell(me, DUNGEON_MODE(SPELL_CARNIVOROUS_BITE_N, SPELL_CARNIVOROUS_BITE_H), false); events.RepeatEvent(10000); break; case EVENT_SPELL_FOCUS_FIRE: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 60.0f, true)) { if (Creature* cr = me->SummonCreature(ENTRY_FOCUS_FIRE, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 7000)) focusGUID = cr->GetGUID(); Talk(EMOTE_FOCUSED, target); } events.RepeatEvent(urand(15000, 20000)); events.ScheduleEvent(EVENT_SPELL_FOCUS_FIRE_2, 3000); events.ScheduleEvent(EVENT_SPELL_FOCUS_FIRE_2, 3500); events.ScheduleEvent(EVENT_SPELL_FOCUS_FIRE_2, 4000); events.ScheduleEvent(EVENT_SPELL_FOCUS_FIRE_3, 5000); me->SetControlled(true, UNIT_STATE_ROOT); break; case EVENT_SPELL_FOCUS_FIRE_2: if (Unit* flare = ObjectAccessor::GetCreature(*me, focusGUID)) me->CastSpell(flare, SPELL_FOCUS_CAST, true); events.PopEvent(); break; case EVENT_SPELL_FOCUS_FIRE_3: me->SetControlled(false, UNIT_STATE_ROOT); events.PopEvent(); break; } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) { events.Update(diff); switch(events.GetEvent()) { case 0: break; case 20: if (pInstance) { pInstance->SetData(DATA_INSTANCE_PROGRESS, INSTANCE_PROGRESS_FINISHED_KRICK_SCENE); if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_LEADER_FIRST_GUID))) { c->GetMotionMaster()->Clear(); c->UpdatePosition(SBSLeaderStartPos, true); c->StopMovingOnCurrentPos(); c->AI()->Reset(); } } events.PopEvent(); events.RescheduleEvent(1, 3000); break; case 1: Talk(SAY_OUTRO_KRICK_1); if (pInstance) { if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_LEADER_FIRST_GUID))) { float angle = me->GetAngle(c); me->SetFacingTo(angle); float x = me->GetPositionX()+cos(angle)*7.0f; float y = me->GetPositionY()+sin(angle)*7.0f; c->GetMotionMaster()->MovePoint(0, x, y, me->GetPositionZ()); } for (uint8 i=0; i<2; ++i) if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_GUARD_1_GUID+i))) c->DespawnOrUnsummon(); } events.PopEvent(); events.RescheduleEvent(2, 7000); break; case 2: if (pInstance) { if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_TYRANNUS_EVENT_GUID))) { c->setActive(true); c->UpdatePosition(SBSTyrannusStartPos, true); c->SetHomePosition(SBSTyrannusStartPos); } if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_LEADER_FIRST_GUID))) c->AI()->Talk(c->GetEntry() == NPC_JAINA_PART1 ? SAY_JAINA_KRICK_1 : SAY_SYLVANAS_KRICK_1); } events.PopEvent(); events.RescheduleEvent(3, 6500); break; case 3: Talk(SAY_OUTRO_KRICK_2); events.PopEvent(); events.RescheduleEvent(4, 17000); break; case 4: if (pInstance) { if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_TYRANNUS_EVENT_GUID))) c->GetMotionMaster()->MovePath(PATH_BEGIN_VALUE+10, false); if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_LEADER_FIRST_GUID))) c->AI()->Talk(c->GetEntry() == NPC_JAINA_PART1 ? SAY_JAINA_KRICK_2 : SAY_SYLVANAS_KRICK_2); } events.PopEvent(); events.RescheduleEvent(5, 6500); break; case 5: Talk(SAY_OUTRO_KRICK_3); events.PopEvent(); events.RescheduleEvent(6, 6500); break; case 6: if (pInstance) if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_TYRANNUS_EVENT_GUID))) { c->SetFacingToObject(me); c->AI()->Talk(SAY_TYRANNUS_KRICK_1); } events.PopEvent(); events.RescheduleEvent(7, 4000); break; case 7: me->CastSpell(me, 69413, true); me->SendMeleeAttackStop(me->GetVictim()); me->SetCanFly(true); me->SetDisableGravity(true); me->SendMovementFlagUpdate(); me->GetMotionMaster()->MoveTakeoff(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+9.0f, 0.5f * 7.0f); events.PopEvent(); events.RescheduleEvent(8, 2000); break; case 8: Talk(SAY_OUTRO_KRICK_4); events.PopEvent(); events.RescheduleEvent(9, 1500); break; case 9: if (pInstance) if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_TYRANNUS_EVENT_GUID))) c->CastSpell(c, 69753, false); me->SetReactState(REACT_PASSIVE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29 | UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); me->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); me->AddUnitState(UNIT_STATE_DIED); me->CastSpell(me, SPELL_KRICK_KILL_CREDIT, true); me->RemoveAllAuras(); me->GetMotionMaster()->MoveFall(0, true); events.PopEvent(); events.RescheduleEvent(10, 5000); break; case 10: if (pInstance) if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_TYRANNUS_EVENT_GUID))) c->AI()->Talk(SAY_TYRANNUS_KRICK_2); events.PopEvent(); events.RescheduleEvent(11, 9000); break; case 11: if (pInstance) { if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_TYRANNUS_EVENT_GUID))) c->GetMotionMaster()->MovePoint(1, 809.39f, 74.69f, 541.54f); if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_LEADER_FIRST_GUID))) { c->AI()->Talk(c->GetEntry() == NPC_JAINA_PART1 ? SAY_JAINA_KRICK_3 : SAY_SYLVANAS_KRICK_3); c->GetMotionMaster()->MovePath(PATH_BEGIN_VALUE+11, false); } } me->setActive(false); Unit::Kill(me, me); events.PopEvent(); break; } }
void UpdateAI(uint32 diff) { if (!UpdateVictim()) return; if( me->GetPositionX() < 490.0f || me->GetPositionX() > 690.0f || me->GetPositionY() < 130.0f || me->GetPositionY() > 410.0f ) { EnterEvadeMode(); return; } events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; switch (events.GetEvent()) { case 0: break; case EVENT_ACTIVATE_CONSTRUCT: me->CastCustomSpell(SPELL_ACTIVATE_CONSTRUCT, SPELLVALUE_MAX_TARGETS, 1, (Unit*)NULL, false); if (++counter >= 20) { me->MonsterYell(TEXT_BERSERK, LANG_UNIVERSAL, 0); me->PlayDirectSound(SOUND_BERSERK); me->CastSpell(me, SPELL_BERSERK, true); events.PopEvent(); break; } events.RepeatEvent(RAID_MODE(40000,30000)); break; case EVENT_SPELL_SCORCH: if( rand()%2 ) { me->MonsterYell(TEXT_SCORCH_1, LANG_UNIVERSAL, 0); me->PlayDirectSound(SOUND_SCORCH_1); } else { me->MonsterYell(TEXT_SCORCH_2, LANG_UNIVERSAL, 0); me->PlayDirectSound(SOUND_SCORCH_2); } me->SetControlled(true, UNIT_STATE_ROOT); me->DisableRotate(true); me->SendMovementFlagUpdate(); me->CastSpell(me->GetVictim(), S_SCORCH, false); events.RepeatEvent(20000); events.RescheduleEvent(EVENT_ENABLE_ROTATE, 3001); break; case EVENT_ENABLE_ROTATE: me->SetControlled(false, UNIT_STATE_ROOT); me->DisableRotate(false); events.PopEvent(); break; case EVENT_SPELL_FLAME_JETS: me->MonsterTextEmote(TEXT_FLAME_JETS, 0, true); me->CastSpell(me->GetVictim(), S_FLAME_JETS, false); events.RepeatEvent(25000); break; case EVENT_GRAB: { std::list<Creature*> icl; me->GetCreaturesWithEntryInRange(icl, 300.0f, NPC_IRON_CONSTRUCT); std::vector<uint64> playerGUIDs; Map::PlayerList const& pl = me->GetMap()->GetPlayers(); Player* temp = NULL; for( Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr ) { temp = itr->GetSource(); if( !temp->IsAlive() || temp->GetExactDist2d(me) > 90.0f ) continue; if( me->GetVictim() && temp->GetGUID() == me->GetVictim()->GetGUID() ) continue; bool found = false; for( std::list<Creature*>::iterator itr = icl.begin(); itr != icl.end(); ++itr ) if( (*itr)->GetVictim() && (*itr)->GetVictim()->GetGUID() == temp->GetGUID() ) { found = true; break; } if( !found ) playerGUIDs.push_back(temp->GetGUID()); } if( !playerGUIDs.empty() ) { int8 pos = urand(0, playerGUIDs.size()-1); if( Player* pTarget = ObjectAccessor::GetPlayer(*me,playerGUIDs.at(pos)) ) { me->MonsterYell(TEXT_SLAG_POT, LANG_UNIVERSAL, 0); me->PlayDirectSound(SOUND_SLAG_POT); me->CastSpell(pTarget, SPELL_GRAB, false); } } events.RepeatEvent(24000); // +6000 below events.DelayEvents(6000); } break; } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) { if (startPath) { me->StopMoving(); startPath = false; if (WaypointPath const* i_path = sWaypointMgr->GetPath(me->GetWaypointPath())) { Movement::PointsArray pathPoints; pathPoints.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ())); for (uint8 i = 0; i < i_path->size(); ++i) { WaypointData const* node = i_path->at(i); pathPoints.push_back(G3D::Vector3(node->x, node->y, node->z)); } me->GetMotionMaster()->MoveSplinePath(&pathPoints); } } if (!UpdateVictim()) return; events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; switch (events.GetEvent()) { case 0: break; case EVENT_ENRAGE: me->CastSpell(me, SPELL_BERSERK, true); events.RepeatEvent(600000); break; case EVENT_COMMANDER_SAY_AGGRO: if (Creature* commander = ObjectAccessor::GetCreature(*me, CommanderGUID)) commander->AI()->Talk(SAY_COMMANDER_AGGRO); events.PopEvent(); break; case EVENT_EE_SAY_MOVE_OUT: for (uint8 i=0; i<3; ++i) if (Creature* c = ObjectAccessor::GetCreature(*me, ExpeditionEngineerGUIDs[i])) { if (!i) c->MonsterYell(TEXT_EE_MOVE_OUT, LANG_UNIVERSAL, 0); c->AI()->SetData(1, 0); // start repairing } events.PopEvent(); break; case EVENT_SPELL_FIREBALL: if( Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 200.0f, true) ) me->CastSpell(pTarget, SPELL_FIREBALL, false); events.RepeatEvent(4000); break; case EVENT_SPELL_DEVOURING_FLAME: if( Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 200.0f, true) ) me->CastSpell(pTarget, SPELL_DEVOURINGFLAME, false); events.RepeatEvent(13000); break; case EVENT_SUMMON_MOLE_MACHINES: { memset(cords, '\0', sizeof(cords)); uint8 num = RAID_MODE( urand(2,3), urand(2,4) ); for( int i=0; i<num; ++i ) { // X: (550, 625) Y: (-185, -230) cords[i][0] = urand(550, 625); cords[i][1] = -230 + rand()%45; if( GameObject* drill = me->SummonGameObject(GO_DRILL, cords[i][0], cords[i][1], 391.1f, M_PI/4, 0.0f, 0.0f, 0.0f, 0.0f, 8) ) { //drill->SetGoAnimProgress(0); //drill->SetLootState(GO_READY); //drill->UseDoorOrButton(8); //drill->SetGoState(GO_STATE_READY); drill->SetGoState(GO_STATE_ACTIVE); drill->SetGoAnimProgress(0); } } events.RepeatEvent(45000); events.RescheduleEvent(EVENT_SUMMON_ADDS, 4000); } break; case EVENT_SUMMON_ADDS: for( int i=0; i<4; ++i ) { if( !cords[i][0] ) break; uint8 opt; uint8 r = urand(1,100); if( r <= 30 ) opt = 1; else if( r <= 65 ) opt = 2; else opt = 3; for( int j=0; j<4; ++j ) { float x = cords[i][0] + 4.0f*cos(j*M_PI/2); float y = cords[i][1] + 4.0f*sin(j*M_PI/2); uint32 npc_entry = 0; switch( opt ) { case 1: if( j == 1 ) npc_entry = NPC_DARK_RUNE_SENTINEL; break; case 2: switch( j ) { case 1: npc_entry = NPC_DARK_RUNE_WATCHER; break; case 2: npc_entry = NPC_DARK_RUNE_GUARDIAN; break; } break; default: // case 3: switch( j ) { case 1: npc_entry = NPC_DARK_RUNE_WATCHER; break; case 2: npc_entry = NPC_DARK_RUNE_GUARDIAN; break; case 3: npc_entry = NPC_DARK_RUNE_GUARDIAN; break; } break; } if( npc_entry ) if (Creature* c = me->SummonCreature(npc_entry, x, y, 391.1f, j*M_PI/2, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000)) DoZoneInCombat(c); } } events.PopEvent(); break; case EVENT_WARN_DEEP_BREATH: me->MonsterTextEmote(TEXT_DEEP_BREATH, 0, true); me->RemoveAura(62794); events.PopEvent(); events.ScheduleEvent(EVENT_PHASE2_FLAME_BREATH, 2500); break; case EVENT_PHASE2_FLAME_BREATH: me->CastSpell(me, S_FLAMEBREATH, true); events.PopEvent(); events.ScheduleEvent(EVENT_FLY_UP, 2000); break; case EVENT_FLY_UP: me->SetInCombatWithZone(); // just in case if (pInstance) for( int i=0; i<4; ++i ) if( uint64 guid = pInstance->GetData64(DATA_HARPOON_FIRE_STATE_1 + i) ) if( Creature* hfs = ObjectAccessor::GetCreature(*me, guid) ) { me->SummonCreature(34188, hfs->GetPositionX(), hfs->GetPositionY(), hfs->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 22000); hfs->AI()->SetData(1, 0); } me->RemoveAura(SPELL_LAUNCH_CHAIN); me->RemoveAura(SPELL_CHAIN_1); me->RemoveAura(SPELL_CHAIN_3); if (RAID_MODE(0,1)) { me->RemoveAura(SPELL_CHAIN_2); me->RemoveAura(SPELL_CHAIN_4); } me->CastSpell(me, SPELL_WINGBUFFET, true); if( (me->GetHealth()*100) / me->GetMaxHealth() < 50 ) // start phase 3 { me->SetControlled(false, UNIT_STATE_ROOT); me->DisableRotate(false); DoResetThreat(); Unit* target = SelectTarget(SELECT_TARGET_NEAREST, 0, 0.0, true); if (!target) target = me->SelectNearestPlayer(200.0f); if (target) { AttackStart(target); me->GetMotionMaster()->MoveChase(target); } bGroundPhase = true; events.PopEvent(); events.CancelEvent(EVENT_SPELL_FIREBALL); events.CancelEvent(EVENT_SPELL_DEVOURING_FLAME); events.CancelEvent(EVENT_SUMMON_MOLE_MACHINES); events.ScheduleEvent(EVENT_SPELL_FLAME_BREATH, 20000); events.ScheduleEvent(EVENT_SPELL_DEVOURING_FLAME_GROUND, 5000); events.ScheduleEvent(EVENT_SPELL_FUSE_ARMOR, 10000); events.ScheduleEvent(EVENT_SPELL_FLAME_BUFFET, 3000); break; } else { ++flyTimes; me->SetControlled(false, UNIT_STATE_ROOT); me->DisableRotate(false); me->SendMeleeAttackStop(me->GetVictim()); me->GetMotionMaster()->MoveIdle(); me->StopMoving(); me->SetCanFly(true); me->SetDisableGravity(true); me->SetHover(true); me->SendMovementFlagUpdate(); me->GetMotionMaster()->MoveTakeoff(1, CORDS_AIR, 25.0f); events.ScheduleEvent(EVENT_RESUME_FIXING, 22000); } events.PopEvent(); break; case EVENT_RESUME_FIXING: for (uint8 i=0; i<3; ++i) if (Creature* c = ObjectAccessor::GetCreature(*me, ExpeditionEngineerGUIDs[i])) { if (!i) c->MonsterYell(TEXT_EE_FIRES_OUT, LANG_UNIVERSAL, 0); c->AI()->SetData(1, 0); // start repairing } events.PopEvent(); break; case EVENT_SPELL_FLAME_BREATH: me->CastSpell(me->GetVictim(), S_FLAMEBREATH, false); events.RepeatEvent(20000); break; case EVENT_SPELL_DEVOURING_FLAME_GROUND: me->CastSpell(me->GetVictim(), SPELL_DEVOURINGFLAME, false); events.RepeatEvent(13000); break; case EVENT_SPELL_FUSE_ARMOR: if (Unit* victim = me->GetVictim()) if (me->IsWithinMeleeRange(victim)) { me->CastSpell(victim, SPELL_FUSEARMOR, false); if (Aura* aur = victim->GetAura(SPELL_FUSEARMOR)) if (aur->GetStackAmount() == 5) victim->CastSpell(victim, 64774, true); events.RepeatEvent(10000); break; } events.RepeatEvent(2000); break; case EVENT_SPELL_FLAME_BUFFET: me->CastSpell(me->GetVictim(), S_FLAMEBUFFET, false); events.RepeatEvent(7000); break; } if (bGroundPhase) DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) { if (!UpdateVictim() && !me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) return; events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; switch(events.GetEvent()) { case 0: break; case EVENT_EMERGE: me->SetVisible(true); me->CastSpell(me, SPELL_EMERGE_0, false); events.PopEvent(); events.RescheduleEvent(EVENT_ATTACK, 2000); break; case EVENT_SUMMON_TOTEMS: for (uint8 i=0; i<3; ++i) DoSummon(NPC_TOTEM, TotemPos[i], 10*60*1000, TEMPSUMMON_TIMED_DESPAWN); events.PopEvent(); break; case EVENT_INVOKER_SAY_1: if (Player* plr = ObjectAccessor::GetPlayer(*me, InvokerGUID)) { plr->MonsterSay("The Ice Stone has melted!", LANG_UNIVERSAL, 0); plr->CastSpell(plr, SPELL_MAKE_BONFIRE, true); } events.PopEvent(); events.RescheduleEvent(EVENT_INVOKER_SAY_2, 2000); break; case EVENT_INVOKER_SAY_2: if (Player* plr = ObjectAccessor::GetPlayer(*me, InvokerGUID)) plr->MonsterSay("Ahune, your strength grows no more!", LANG_UNIVERSAL, 0); events.PopEvent(); events.RescheduleEvent(EVENT_INVOKER_SAY_3, 2000); break; case EVENT_INVOKER_SAY_3: if (Player* plr = ObjectAccessor::GetPlayer(*me, InvokerGUID)) plr->MonsterSay("Your frozen reign will not come to pass!", LANG_UNIVERSAL, 0); events.PopEvent(); break; case EVENT_ATTACK: events.Reset(); if (Player* plr = ObjectAccessor::GetPlayer(*me, InvokerGUID)) AttackStart(plr); me->SetInCombatWithZone(); if (!me->IsInCombat()) { EnterEvadeMode(); return; } else me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); break; case EVENT_TOTEMS_ATTACK: for (uint8 i=0; i<3; ++i) if (Creature* bunny = me->FindNearestCreature(NPC_TOTEM_BUNNY_1+i, 150.0f, true)) bunny->CastSpell(me, SPELL_TOTEM_BEAM, false); events.PopEvent(); events.RescheduleEvent(EVENT_SUBMERGE, 10000); break; case EVENT_SUBMERGE: me->MonsterTextEmote(TEXT_RETREAT, 0, true); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->CastSpell(me, SPELL_SUBMERGE_0, true); me->CastSpell(me, SPELL_SELF_STUN, true); if (Creature* c = DoSummon(NPC_FROZEN_CORE, *me, 24000, TEMPSUMMON_TIMED_DESPAWN)) { c->SetHealth(me->GetHealth()); } events.Reset(); events.RescheduleEvent(EVENT_COMBAT_EMERGE, 25000); events.RescheduleEvent(EVENT_EMERGE_WARNING, 20000); break; case EVENT_EMERGE_WARNING: me->MonsterTextEmote(TEXT_RESURFACE, 0, true); events.PopEvent(); break; case EVENT_COMBAT_EMERGE: me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->RemoveAura(SPELL_SELF_STUN); me->CastSpell(me, SPELL_EMERGE_0, false); // me->CastSpell(me, SPELL_AHUNE_RESURFACES, true); // done in SummonedCreatureDespawn me->RemoveAura(SPELL_SUBMERGE_0); events.PopEvent(); StartPhase1(); break; case EVENT_SPELL_COLD_SLAP: if (Unit* target = SelectTarget(SELECT_TARGET_NEAREST, 0, 5.0f, true)) if (target->GetPositionZ() < me->GetPositionZ()+6.0f) { int32 dmg = urand(5500,6000); me->CastCustomSpell(target, SPELL_COLD_SLAP, &dmg, NULL, NULL, false); float x, y, z; target->GetNearPoint(target, x, y, z, target->GetObjectSize(), 30.0f, target->GetAngle(me->GetPositionX(), me->GetPositionY()) + M_PI); target->GetMotionMaster()->MoveJump(x, y, z+20.0f, 10.0f, 20.0f); } events.RepeatEvent(1500); break; case EVENT_SPELL_SUMMON_HAILSTONE: { float dist = (float)urand(3,10); float angle = rand_norm()*2*M_PI; me->CastSpell(MinionSummonPos.GetPositionX()+cos(angle)*dist, MinionSummonPos.GetPositionY()+sin(angle)*dist, MinionSummonPos.GetPositionZ(), SPELL_SUMMON_HAILSTONE, false); events.RepeatEvent(30000); } break; case EVENT_SPELL_SUMMON_COLDWAVE: for (uint8 i=0; i<2; ++i) { float dist = (float)urand(3,10); float angle = rand_norm()*2*M_PI; me->CastSpell(MinionSummonPos.GetPositionX()+cos(angle)*dist, MinionSummonPos.GetPositionY()+sin(angle)*dist, MinionSummonPos.GetPositionZ(), SPELL_SUMMON_COLDWAVE, false); } { float dist = (float)urand(3,10); float angle = rand_norm()*2*M_PI; me->CastSpell(MinionSummonPos.GetPositionX()+cos(angle)*dist, MinionSummonPos.GetPositionY()+sin(angle)*dist, MinionSummonPos.GetPositionZ(), SPELL_SUMMON_FROSTWIND, false); } events.RepeatEvent(6000); break; default: events.PopEvent(); break; } DoMeleeAttackIfReady(); }
void DamageTaken(Unit* /*attacker*/, uint32& damage) { damage = 0; events.RescheduleEvent(EVENT_DUMMY_RESET, 10000); }
void UpdateAI(uint32 diff) { events.Update(diff); if (!UpdateVictim()) { while(uint32 eventId = events.ExecuteEvent()) { switch(eventId) { if (instance) { case EVENT_ATTACK_START: me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED); events.ScheduleEvent(EVENT_DISSIPATION, 4*IN_MILLISECONDS); me->setActive(true); me->setFaction(14); me->SetInCombatWithZone(); events.CancelEvent(EVENT_ATTACK_START); break; default: break; } } } } if (!me->HasAura(SPELL_INTENSITY) && intensityStacks != 0) intensityStacks = 0; if (damageDealt >= me->GetMaxHealth() * 0.02f) { me->RemoveAurasDueToSpell(SPELL_DISSIPATION); me->CastSpell(me, SPELL_INTENSITY); events.RescheduleEvent(EVENT_DISSIPATION, 4*IN_MILLISECONDS); intensityStacks++; damageDealt = 0; } if (intensityStacks == 10) { me->CastSpell(me, SPELL_ULTIMATE_POWER); me->RemoveAurasDueToSpell(SPELL_INTENSITY); intensityStacks = 0; } if (UpdateVictim()) { if (!eventAgony) { events.ScheduleEvent(EVENT_AGONY, 1*IN_MILLISECONDS); eventAgony = true; } while(uint32 eventId = events.ExecuteEvent()) { switch(eventId) { if (instance) { case EVENT_AGONY: me->CastSpell(me->getVictim(), SPELL_AGONY); events.RescheduleEvent(EVENT_AGONY, 2500); break; case EVENT_DISSIPATION: if (!me->HasAura(SPELL_ULTIMATE_POWER)) me->CastSpell(me, SPELL_DISSIPATION); if (me->HasAura(SPELL_INTENSITY)) me->RemoveAurasDueToSpell(SPELL_INTENSITY, me->GetGUID()); intensityStacks = 0; events.RescheduleEvent(EVENT_DISSIPATION, 2*IN_MILLISECONDS); break; default: break; } } } } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) { if (!pInstance) return; events.Update(diff); switch(events.GetEvent()) { case 0: break; case EVENT_SUMMON_KEEPER_OR_GUARDIAN: bKorG = true; spawned = true; if (Creature *c = DoSummon(RAND(NPC_PORTAL_GUARDIAN, NPC_PORTAL_KEEPER), me, 2.0f, 0, TEMPSUMMON_DEAD_DESPAWN)) me->CastSpell(c, SPELL_PORTAL_CHANNEL, false); events.PopEvent(); events.RescheduleEvent(EVENT_SUMMON_KEEPER_TRASH, 20000); break; case EVENT_SUMMON_KEEPER_TRASH: for (uint8 i=0; i<3+addValue; ++i) { uint32 entry = RAND(NPC_AZURE_INVADER_1, NPC_AZURE_INVADER_2, NPC_AZURE_SPELLBREAKER_1, NPC_AZURE_SPELLBREAKER_2, NPC_AZURE_MAGE_SLAYER_1, NPC_AZURE_MAGE_SLAYER_2, NPC_AZURE_BINDER_1, NPC_AZURE_BINDER_2); DoSummon(entry, me, 2.0f, 20000, TEMPSUMMON_DEAD_DESPAWN); } events.RepeatEvent(20000); break; case EVENT_SUMMON_ELITES: spawned = true; for (uint8 i=0; i<2+addValue; ++i) { uint32 entry = RAND(NPC_AZURE_CAPTAIN, NPC_AZURE_RAIDER, NPC_AZURE_STALKER, NPC_AZURE_SORCEROR); DoSummon(entry, me, 2.0f, 20000, TEMPSUMMON_DEAD_DESPAWN); } me->SetVisible(false); events.PopEvent(); break; case EVENT_SUMMON_SABOTEOUR: DoSummon(NPC_SABOTEOUR, me, 2.0f, 0, TEMPSUMMON_CORPSE_DESPAWN); me->DespawnOrUnsummon(3000); events.PopEvent(); break; } if (!spawned) return; if (bKorG) { if (!me->IsNonMeleeSpellCast(false)) // keeper/guardian died => channeled spell interrupted { // if keeper/guard lost all victims, in enterevademode linking aura is removed, restore it: if (pInstance) for (SummonList::iterator itr = listOfMobs.begin(); itr != listOfMobs.end(); ++itr) if (Creature* c = pInstance->instance->GetCreature(*itr)) if (c->IsAlive() && (c->GetEntry() == NPC_PORTAL_GUARDIAN || c->GetEntry() == NPC_PORTAL_KEEPER)) { me->CastSpell(c, SPELL_PORTAL_CHANNEL, false); return; } Unit::Kill(me, me, false); } } else { if (listOfMobs.empty()) Unit::Kill(me, me, false); } }
void EnterEvadeMode() override { StartAttackThyala(); m_events.RescheduleEvent(EVENT_CHECK_ATTACK, 1000); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; if(phase == 2 && boss_phase == 1) { events.RescheduleEvent(EVENT_CHAIN_LIGHTNING, urand(9000,17000)); events.RescheduleEvent(EVENT_OVERLOAD, urand(60000,125000)); events.RescheduleEvent(EVENT_LIGHTNING_WHIRL, urand(20000,40000)); boss_phase++; } if(phase == 3 && boss_phase == 2) { events.RescheduleEvent(EVENT_CHAIN_LIGHTNING, urand(9000,17000)); events.RescheduleEvent(EVENT_OVERLOAD, urand(60000,125000)); events.RescheduleEvent(EVENT_LIGHTNING_WHIRL, urand(20000,40000)); DoCast(me, SPELL_STORMSHIELD); events.RescheduleEvent(EVENT_LIGHTNING_TENDRILS, urand(40000,80000)); } events.Update(diff); if(!me->HasAura(SPELL_OVERLOAD) && overload == true) { DoCast(63480); overload = false; } while (uint32 eventId = events.ExecuteEvent()) { switch(eventId) { case EVENT_ENRAGE: DoScriptText(SAY_BRUNDIR_BERSERK, me); DoCast(SPELL_BERSERK); break; case EVENT_CHAIN_LIGHTNING: if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,0)) DoCast(pTarget, RAID_MODE(SPELL_CHAIN_LIGHTNING_N , SPELL_CHAIN_LIGHTNING_H)); events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, urand(9000,17000)); break; case EVENT_OVERLOAD: DoCast(SPELL_OVERLOAD); overload = true; events.ScheduleEvent(EVENT_OVERLOAD, urand(60000,125000)); break; case EVENT_LIGHTNING_WHIRL: DoCast(RAID_MODE(SPELL_LIGHTNING_WHIRL , SPELL_LIGHTNING_WHIRL_H)); DoCast(RAID_MODE(61916, 63482)); events.ScheduleEvent(EVENT_LIGHTNING_WHIRL, urand(20000,40000)); break; case EVENT_LIGHTNING_TENDRILS: DoCast(RAID_MODE(SPELL_LIGHTNING_TENDRILS, SPELL_LIGHTNING_TENDRILS_H)); DoCast(RAID_MODE(61886, 63485)); events.DelayEvents(15000, 5000); DoResetThreat(); break; } } DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; if(phase == 2 && boss_phase == 1) { events.RescheduleEvent(EVENT_SHIELD_OF_RUNES, 27000); events.RescheduleEvent(EVENT_RUNE_OF_POWER, 60000); events.RescheduleEvent(EVENT_RUNE_OF_DEATH, 30000); boss_phase++; } if(phase == 3 && boss_phase == 2) { events.RescheduleEvent(EVENT_SHIELD_OF_RUNES, 27000); events.RescheduleEvent(EVENT_RUNE_OF_POWER, 60000); events.RescheduleEvent(EVENT_RUNE_OF_DEATH, 30000); events.RescheduleEvent(EVENT_RUNE_OF_SUMMONING, urand(20000,30000)); } events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) { switch(eventId) { case EVENT_ENRAGE: DoScriptText(SAY_MOLGEIM_BERSERK, me); DoCast(SPELL_BERSERK); break; case EVENT_RUNE_OF_POWER: // Improve target selection; random alive friendly { Unit *pTarget = DoSelectLowestHpFriendly(60); if (!pTarget || (pTarget && !pTarget->isAlive())) pTarget = me; me->SummonCreature(33705, pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ() , 0 , TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 60000); // Fais pop la rune events.ScheduleEvent(EVENT_RUNE_OF_POWER, 60000); break; } case EVENT_SHIELD_OF_RUNES: DoCast(me, RAID_MODE(SPELL_SHIELD_OF_RUNES, SPELL_SHIELD_OF_RUNES_H)); events.ScheduleEvent(EVENT_SHIELD_OF_RUNES, urand(27000,34000)); break; case EVENT_RUNE_OF_DEATH: DoScriptText(SAY_MOLGEIM_RUNE_DEATH, me); if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM)) DoCast(pTarget, SPELL_RUNE_OF_DEATH); events.ScheduleEvent(EVENT_RUNE_OF_DEATH, urand(30000,40000)); break; case EVENT_RUNE_OF_SUMMONING: DoScriptText(SAY_MOLGEIM_SUMMON, me); if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM)) // DoCast(pTarget, SPELL_RUNE_OF_SUMMONING); events.ScheduleEvent(EVENT_RUNE_OF_SUMMONING, urand(20000,30000)); break; } } DoMeleeAttackIfReady(); }
void ResetTimer(uint32 inc = 0) { events.RescheduleEvent(EVENT_NEEDLE, 10000 + inc, GCD_CAST); events.RescheduleEvent(EVENT_SPINE, 20000 + inc, GCD_CAST); events.RescheduleEvent(EVENT_SHIELD, 60000 + inc); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; if (phase == PHASE_MOVE && !phaseInitiated) { me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NOT_SELECTABLE); me->RemoveAurasDueToSpell(SPELL_ENERGY_SHIELD); if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, MAX_VISIBILITY_DISTANCE, true)) me->GetMotionMaster()->MoveFollow(target, 3, 2); gravity = 0; summon = 0; creature = false; events.CancelEvent(EVENT_SEISMIC_SHARD); events.CancelEvent(EVENT_ENERGY_SHIELD); events.ScheduleEvent(EVENT_CURSE_OF_BLOOD, 1 *IN_MILLISECONDS); events.ScheduleEvent(EVENT_GRAVITY_WELL, 2 *IN_MILLISECONDS); events.ScheduleEvent(EVENT_PHASE_SHIELD, 35 *IN_MILLISECONDS); phaseInitiated = true; } if (phase == PHASE_SHIELDS && !phaseInitiated) { me->GetMotionMaster()->MovePoint(1, MeteorPosition[3]); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NOT_SELECTABLE); DoCast(me, SPELL_ENERGY_SHIELD); DoCast(me, SPELL_SEISMIC_SHARD_DUMMY); events.CancelEvent(EVENT_CURSE_OF_BLOOD); events.CancelEvent(EVENT_GRAVITY_WELL); events.ScheduleEvent(EVENT_SUMMON_GUARDS, 1 *IN_MILLISECONDS); events.ScheduleEvent(EVENT_SEISMIC_SHARD, 2 *IN_MILLISECONDS); events.ScheduleEvent(EVENT_START_METEOR, 12 *IN_MILLISECONDS); events.ScheduleEvent(EVENT_PHASE_MOVE, 35 *IN_MILLISECONDS); phaseInitiated = true; creature = true; } while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_PHASE_SHIELD: phase = PHASE_SHIELDS; phaseInitiated = false; break; case EVENT_PHASE_MOVE: phase = PHASE_MOVE; phaseInitiated = false; break; case EVENT_CURSE_OF_BLOOD: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, MAX_VISIBILITY_DISTANCE, true)) DoCast(target, SPELL_CURSE_OF_BLOOD); events.RescheduleEvent(EVENT_CURSE_OF_BLOOD, 15 *IN_MILLISECONDS); break; case EVENT_GRAVITY_WELL: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, MAX_VISIBILITY_DISTANCE, true)) DoCast(target, SPELL_GRAVITY_WELL_SUMMON); if (++gravity <= 6) events.RescheduleEvent(EVENT_GRAVITY_WELL, 5 *IN_MILLISECONDS); break; case EVENT_SUMMON_GUARDS: for (uint8 i = 0; i < 10; ++i) //summon 10 Guards me->SummonCreature(NPC_DEVOUT_FOLLOWER, MeteorPosition[4], TEMPSUMMON_CORPSE_DESPAWN); for (uint8 i = 0; i < 10; ++i) //summon 10 Guards me->SummonCreature(NPC_DEVOUT_FOLLOWER, MeteorPosition[5], TEMPSUMMON_CORPSE_DESPAWN); break; case EVENT_SEISMIC_SHARD: meteors.push_back(me->SummonCreature(NPC_SEISMIC_SHARD, MeteorPosition[0], TEMPSUMMON_CORPSE_DESPAWN)); meteors.push_back(me->SummonCreature(NPC_SEISMIC_SHARD, MeteorPosition[1], TEMPSUMMON_CORPSE_DESPAWN)); meteors.push_back(me->SummonCreature(NPC_SEISMIC_SHARD, MeteorPosition[2], TEMPSUMMON_CORPSE_DESPAWN)); break; case EVENT_START_METEOR: if (meteors.size()) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, MAX_VISIBILITY_DISTANCE, true)) { uint8 i = urand(0, meteors.size()-1); if (Unit* trigger = me->SummonCreature(NPC_SEISMIC_SHARD_TRIGGER, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0.0f, TEMPSUMMON_CORPSE_DESPAWN)) { meteors[i]->SetSpeed(MOVE_RUN, speed*3.0f, true); meteors[i]->SetSpeed(MOVE_WALK, speed*3.0f, true); meteors[i]->SetSpeed(MOVE_FLIGHT, speed*3.0f, true); meteors[i]->GetMotionMaster()->MovePoint(1, trigger->GetPositionX(), trigger->GetPositionY(), trigger->GetPositionZ()); trigger->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NOT_SELECTABLE); triggerGUID = trigger->GetGUID(); meteorGUID = meteors[i]->GetGUID(); } meteors.erase(meteors.begin() + i); if (++summon <= 3) events.ScheduleEvent(EVENT_SEND_NEXT_METEOR, 1 *IN_MILLISECONDS); if (meteors.size()) events.RescheduleEvent(EVENT_START_METEOR, 10 *IN_MILLISECONDS); } } break; case EVENT_SEND_NEXT_METEOR: if (Unit * cast = Unit::GetCreature(*me, triggerGUID)) { cast->setFaction(16); cast->CastSpell(me, SPELL_SEISMIC_SHARD_DAMAGE, true); } if (Unit * despawn = Unit::GetCreature(*me, meteorGUID)) despawn->SetVisible(false); break; case EVENT_BERSERK: DoCast(me, SPELL_BERSERK); break; } } DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; events.Update(diff); if (me->HasUnitState(UNIT_STAT_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) { switch(eventId) { case EVENT_MOVE_POS: MovePos(); events.RescheduleEvent(EVENT_MOVE_POS, 10000); break; case EVENT_ENRAGE: DoScriptText(SAY_BRUNDIR_BERSERK, me); DoCast(SPELL_BERSERK); break; case EVENT_CHAIN_LIGHTNING: if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0)) DoCast(pTarget, SPELL_CHAIN_LIGHTNING); events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, urand(4000, 6000)); break; case EVENT_OVERLOAD: me->MonsterTextEmote(EMOTE_OVERLOAD, 0, true); DoScriptText(SAY_BRUNDIR_SPECIAL, me); me->GetMotionMaster()->Initialize(); DoCast(SPELL_OVERLOAD); events.ScheduleEvent(EVENT_OVERLOAD, urand(60000, 120000)); break; case EVENT_LIGHTNING_WHIRL: me->GetMotionMaster()->Initialize(); DoCast(SPELL_LIGHTNING_WHIRL); events.ScheduleEvent(EVENT_LIGHTNING_WHIRL, urand(15000, 20000)); break; case EVENT_LIGHTNING_TENDRILS: DoScriptText(SAY_BRUNDIR_FLIGHT, me); DoCast(SPELL_LIGHTNING_TENDRILS); DoCast(SPELL_LIGHTNING_TENDRILS_SELF_VISUAL); me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); me->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), 435); events.DelayEvents(34000); events.ScheduleEvent(EVENT_FLIGHT, 2500); events.ScheduleEvent(EVENT_ENDFLIGHT, 28000); events.ScheduleEvent(EVENT_LIGHTNING_TENDRILS, 90000); break; case EVENT_FLIGHT: if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0)) me->GetMotionMaster()->MovePoint(0, pTarget->GetPositionX(), pTarget->GetPositionY(), 435); events.ScheduleEvent(EVENT_FLIGHT, 6000); break; case EVENT_ENDFLIGHT: me->GetMotionMaster()->MovePoint(0, 1586.920f, 119.849f, 435); events.CancelEvent(EVENT_FLIGHT); events.ScheduleEvent(EVENT_LAND, 4000); break; case EVENT_LAND: me->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), 427.28f); events.ScheduleEvent(EVENT_GROUND, 1500); break; case EVENT_GROUND: me->RemoveAurasDueToSpell(SPELL_LIGHTNING_TENDRILS); me->RemoveAurasDueToSpell(SPELL_LIGHTNING_TENDRILS_SELF_VISUAL); me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); me->SendMovementFlagUpdate(); break; } } }
void UpdateAI(uint32 diff) { if (!UpdateVictim()) return; if (me->GetVictim()) { float x,y,z; me->GetVictim()->GetPosition(x, y, z); if (TSDistCheckPos.GetExactDist(x,y,z) > 100.0f || z > TSDistCheckPos.GetPositionZ()+20.0f || z < TSDistCheckPos.GetPositionZ()-20.0f) { me->SetHealth(me->GetMaxHealth()); EnterEvadeMode(); return; } } events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; switch(events.GetEvent()) { case 0: break; case EVENT_SPELL_FORCEFUL_SMASH: if (me->IsWithinMeleeRange(me->GetVictim())) { me->CastSpell(me->GetVictim(), SPELL_FORCEFUL_SMASH, false); events.PopEvent(); events.RescheduleEvent(EVENT_SPELL_UNHOLY_POWER, 1000); break; } events.RepeatEvent(3000); break; case EVENT_SPELL_UNHOLY_POWER: Talk(SAY_SMASH); Talk(EMOTE_SMASH); me->CastSpell(me, SPELL_UNHOLY_POWER, false); events.PopEvent(); events.ScheduleEvent(EVENT_SPELL_FORCEFUL_SMASH, urand(40000, 48000)); break; case EVENT_SPELL_OVERLORDS_BRAND: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 95.0f, true)) me->CastSpell(target, SPELL_OVERLORDS_BRAND, false); events.RepeatEvent(urand(11000,12000)); break; case EVENT_RIMEFANG_SPELL_ICY_BLAST: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 190.0f, true)) if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_RIMEFANG_GUID))) c->CastSpell(target, RIMEFANG_SPELL_ICY_BLAST, false); events.RepeatEvent(5000); break; case EVENT_SPELL_MARK_OF_RIMEFANG: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 190.0f, true)) if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_RIMEFANG_GUID))) { Talk(SAY_MARK); c->AI()->Talk(EMOTE_RIMEFANG_ICEBOLT, target); c->CastSpell(target, RIMEFANG_SPELL_HOARFROST, false); } events.RepeatEvent(25000); events.RescheduleEvent(EVENT_RIMEFANG_SPELL_ICY_BLAST, 10000); break; } DoMeleeAttackIfReady(); }