void UpdateAI(uint32 diff) { // Call speach if (timer) { timer += diff; if (timer >= 4000) { Talk(SAY_SHADRON_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_SHADRON_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_SHADRON_SPECIAL); if (!isSartharion) { if (GameObject* Portal = me->GetVictim()->SummonGameObject(GO_TWILIGHT_PORTAL, portalPos[BOSS_SHADRON_EVENT].GetPositionX(), portalPos[BOSS_SHADRON_EVENT].GetPositionY(), portalPos[BOSS_SHADRON_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.PopEvent(); break; case EVENT_MINIBOSS_SPAWN_HELPERS: Talk(WHISPER_SUMMON_DICIPLE); me->CastSpell(me, (isSartharion ? SPELL_GIFT_OF_TWILIGHT_FIRE : SPELL_GIFT_OF_TWILIGHT_SHADOW), true); if (Creature* cr = me->SummonCreature((isSartharion ? NPC_ACOLYTE_OF_SHADRON : NPC_DISCIPLE_OF_SHADRON), me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation())) { summons.Summon(cr); cr->SetPhaseMask(16, true); } events.PopEvent(); 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()) 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 UpdateAI(uint32 diff) { if (spawnTimer) { spawnTimer += diff; if (spawnTimer >= 21500) { me->SetVisible(true); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); me->SetReactState(REACT_AGGRESSIVE); spawnTimer = 0; } return; } if (!IsInRoom()) return; if (!UpdateVictim()) return; events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; switch (events.GetEvent()) { case EVENT_BERSERK: Talk(EMOTE_ENRAGE); me->CastSpell(me, SPELL_BERSERK, true); events.PopEvent(); return; case EVENT_SPELL_CLEAVE: me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false); events.RepeatEvent(10000); return; case EVENT_SPELL_TAIL_SWEEP: me->CastSpell(me, RAID_MODE(SPELL_TAIL_SWEEP_10, SPELL_TAIL_SWEEP_25), false); events.RepeatEvent(10000); return; case EVENT_SPELL_LIFE_DRAIN: me->CastCustomSpell(RAID_MODE(SPELL_LIFE_DRAIN_10, SPELL_LIFE_DRAIN_25), SPELLVALUE_MAX_TARGETS, RAID_MODE(2, 5), me, false); events.RepeatEvent(24000); return; case EVENT_SPELL_BLIZZARD: { Creature* cr; if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true)) cr = me->SummonCreature(NPC_BLIZZARD, *target, TEMPSUMMON_TIMED_DESPAWN, 16000); else cr = me->SummonCreature(NPC_BLIZZARD, *me, TEMPSUMMON_TIMED_DESPAWN, 16000); if (cr) cr->GetMotionMaster()->MoveRandom(40); events.RepeatEvent(RAID_MODE(8000, 6500)); return; } case EVENT_FLIGHT_START: if (me->HealthBelowPct(11)) { events.PopEvent(); return; } events.RepeatEvent(45000); events.DelayEvents(35000); me->SetReactState(REACT_PASSIVE); me->AttackStop(); float x, y, z, o; me->GetHomePosition(x, y, z, o); me->GetMotionMaster()->MovePoint(POINT_CENTER, x, y, z); return; case EVENT_FLIGHT_LIFTOFF: me->GetMotionMaster()->MoveIdle(); me->SendMeleeAttackStop(me->GetVictim()); me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF); me->SetDisableGravity(true); currentTarget = 0; events.PopEvent(); events.ScheduleEvent(EVENT_FLIGHT_ICEBOLT, 3000); iceboltCount = RAID_MODE(2, 3); return; case EVENT_FLIGHT_ICEBOLT: { events.PopEvent(); if (currentTarget) if (Unit* target = ObjectAccessor::GetUnit(*me, currentTarget)) me->SummonGameObject(GO_ICE_BLOCK, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), target->GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, 0); std::vector<Unit*> targets; ThreatContainer::StorageType::const_iterator i = me->getThreatManager().getThreatList().begin(); for (; i != me->getThreatManager().getThreatList().end(); ++i) if ((*i)->getTarget()->GetTypeId() == TYPEID_PLAYER) { bool inList = false; if (!blockList.empty()) for (std::list<uint64>::const_iterator itr = blockList.begin(); itr != blockList.end(); ++itr) if ((*i)->getTarget()->GetGUID() == *itr) { inList = true; break; } if (!inList) targets.push_back((*i)->getTarget()); } if (!targets.empty() && iceboltCount) { std::vector<Unit*>::iterator itr = targets.begin(); advance(itr, urand(0, targets.size()-1)); me->CastSpell(*itr, SPELL_ICEBOLT_CAST, false); blockList.push_back((*itr)->GetGUID()); currentTarget = (*itr)->GetGUID(); --iceboltCount; events.ScheduleEvent(EVENT_FLIGHT_ICEBOLT, (me->GetExactDist(*itr) / 13.0f)*IN_MILLISECONDS); } else events.ScheduleEvent(EVENT_FLIGHT_BREATH, 1000); return; } case EVENT_FLIGHT_BREATH: currentTarget = 0; Talk(EMOTE_BREATH); me->CastSpell(me, SPELL_FROST_MISSILE, false); events.ScheduleEvent(EVENT_FLIGHT_SPELL_EXPLOSION, 8500); events.PopEvent(); return; case EVENT_FLIGHT_SPELL_EXPLOSION: me->CastSpell(me, SPELL_FROST_EXPLOSION, true); events.PopEvent(); events.ScheduleEvent(EVENT_FLIGHT_START_LAND, 3000); return; case EVENT_FLIGHT_START_LAND: if (!blockList.empty()) for (std::list<uint64>::const_iterator itr = blockList.begin(); itr != blockList.end(); ++itr) if (Unit* block = ObjectAccessor::GetUnit(*me, *itr)) block->RemoveAurasDueToSpell(SPELL_ICEBOLT_TRIGGER); blockList.clear(); me->RemoveAllGameObjects(); events.ScheduleEvent(EVENT_LAND, 1000); events.PopEvent(); return; case EVENT_LAND: me->HandleEmoteCommand(EMOTE_ONESHOT_LAND); me->SetDisableGravity(false); events.PopEvent(); events.ScheduleEvent(EVENT_GROUND, 1500); return; case EVENT_GROUND: me->SetReactState(REACT_AGGRESSIVE); me->SetInCombatWithZone(); events.PopEvent(); return; case EVENT_HUNDRED_CLUB: { Map::PlayerList const& pList = me->GetMap()->GetPlayers(); for(Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr) { if (itr->GetSource()->GetResistance(SPELL_SCHOOL_FROST) > 100 && pInstance) { events.PopEvent(); pInstance->SetData(DATA_HUNDRED_CLUB, 0); return; } } events.RepeatEvent(5000); return; } } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) { if (!IsInRoom()) return; if (!UpdateVictim()) return; events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; switch (events.GetEvent()) { case EVENT_SPELL_WEB_SPRAY: me->MonsterTextEmote("%s sprays strands of web everywhere!", 0, true); me->CastSpell(me, RAID_MODE(SPELL_WEB_SPRAY_10, SPELL_WEB_SPRAY_25), true); events.RepeatEvent(40000); break; case EVENT_SPELL_POISON_SHOCK: me->CastSpell(me->GetVictim(), RAID_MODE(SPELL_POISON_SHOCK_10, SPELL_POISON_SHOCK_25), false); events.RepeatEvent(40000); break; case EVENT_SPELL_NECROTIC_POISON: me->CastSpell(me->GetVictim(), RAID_MODE(SPELL_NECROTIC_POISON_10, SPELL_NECROTIC_POISON_25), false); events.RepeatEvent(30000); break; case EVENT_SUMMON_SPIDERLINGS: me->MonsterTextEmote("Spiderlings appear on the web!", 0, true); for (uint8 i = 0; i < 8; ++i) me->SummonCreature(NPC_MAEXXNA_SPIDERLING, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation()); events.RepeatEvent(40000); break; case EVENT_HEALTH_CHECK: if (me->GetHealthPct() < 30) { me->CastSpell(me, RAID_MODE(SPELL_FRENZY_10, SPELL_FRENZY_25), true); events.PopEvent(); break; } events.RepeatEvent(1000); break; case EVENT_WEB_WRAP: me->MonsterTextEmote("%s spins her web into a cocoon!", 0, true); for (uint8 i = 0; i < RAID_MODE(1,2); ++i) if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0, true, -SPELL_WEB_WRAP)) { target->RemoveAura(RAID_MODE(SPELL_WEB_SPRAY_10, SPELL_WEB_SPRAY_25)); uint8 pos = urand(0,2); target->GetMotionMaster()->MoveJump(PosWrap[pos].GetPositionX(), PosWrap[pos].GetPositionY(), PosWrap[pos].GetPositionZ(), 20, 20); if (Creature *wrap = me->SummonCreature(NPC_WEB_WRAP, PosWrap[pos].GetPositionX(), PosWrap[pos].GetPositionY(), PosWrap[pos].GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 60000)) wrap->AI()->SetGUID(target->GetGUID()); } events.RepeatEvent(40000); break; } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) { if (!IsInRoom(me)) return; if (!UpdateVictim()) return; events.Update(diff); //if (me->HasUnitState(UNIT_STATE_CASTING)) // return; switch (events.GetEvent()) { case EVENT_SPELL_SPELL_DISRUPTION: me->CastSpell(me, SPELL_SPELL_DISRUPTION, false); events.RepeatEvent(10000); break; case EVENT_SPELL_DECEPIT_FEVER: me->CastSpell(me, RAID_MODE(SPELL_DECREPIT_FEVER_10, SPELL_DECREPIT_FEVER_25), false); events.RepeatEvent(20000); break; case EVENT_SWITCH_PHASE: StartFightPhase(currentPhase == PHASE_SLOW_DANCE ? PHASE_FAST_DANCE : PHASE_SLOW_DANCE); // no pop, there is reset in start fight break; case EVENT_ERUPT_SECTION: if (pInstance) { pInstance->SetData(DATA_HEIGAN_ERUPTION, currentSection); if (currentSection == 3) moveRight = false; else if (currentSection == 0) moveRight = true; moveRight ? currentSection++ : currentSection--; } if (currentPhase == PHASE_SLOW_DANCE && !urand(0,3)) Talk(SAY_TAUNT); events.RepeatEvent(currentPhase == PHASE_SLOW_DANCE ? 10000 : 4000); break; case EVENT_SAFETY_DANCE: { Map::PlayerList const& pList = me->GetMap()->GetPlayers(); for(Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr) { if (IsInRoom(itr->GetSource()) && !itr->GetSource()->IsAlive()) { events.PopEvent(); pInstance->SetData(DATA_DANCE_FAIL, 0); pInstance->SetData(DATA_IMMORTAL_FAIL, 0); return; } } events.RepeatEvent(5000); return; } } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) { if (!UpdateVictim()) return; events.Update(diff); if( me->HasUnitState(UNIT_STATE_CASTING) ) return; switch ( events.GetEvent() ) { case EVENT_CHECK_HEALTH: { events.RepeatEvent(1000); if (HealthBelowPct(50)) { events.CancelEvent(EVENT_CHECK_HEALTH); events.ScheduleEvent(EVENT_SUMMON_GUARD, 100); } break; } case EVENT_SUMMON_GUARD: { me->MonsterTextEmote(EMOTE_HATCHES, me, true); SummonHelpers(false); events.PopEvent(); break; } case EVENT_BROOD_RAGE: { if (Creature *pSwarmer = me->FindNearestCreature(NPC_AHNKAHAR_SWARMER, 40, true)) me->CastSpell(pSwarmer, SPELL_BROOD_RAGE_H, true); events.RepeatEvent(10000); break; } case EVENT_PLAGUE: { me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_BROOD_PLAGUE, SPELL_BROOD_PLAGUE_H), false); events.RepeatEvent(12000+rand()%5000); break; } case EVENT_SWARMER: { SummonHelpers(true); events.RepeatEvent(10000); break; } case EVENT_CHECK_HOME: { if (me->HasAura(SPELL_ENRAGE)) break; if (me->GetPositionZ() < 24) { me->CastSpell(me, SPELL_ENRAGE, true); events.PopEvent(); break; } events.RepeatEvent(2000); break; } } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) { if (!me->isActiveObject()) return; UpdateVictim(); events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; switch (uint32 evId = events.GetEvent()) { case 0: break; case EVENT_CHECK_PLAYER: if (Player* p = ObjectAccessor::GetPlayer(*me, playerGUID)) if (p->GetExactDist(me) <= 50.0f) { events.RepeatEvent(5000); break; } events.PopEvent(); me->setActive(false); EnterEvadeMode(); return; case EVENT_SUMMON_SOLDIERS: for (uint8 i=0; i<SUNWELL_DEFENDER_NUM; ++i) me->SummonCreature(NPC_SUNWELL_DEFENDER, SunwellDefenderPos[i], TEMPSUMMON_TIMED_DESPAWN, 33000+(i/5)*5000); events.PopEvent(); break; case EVENT_TALK_INTRO_0: case EVENT_TALK_INTRO_1: case EVENT_TALK_INTRO_2: case EVENT_TALK_INTRO_3: Talk(SAY_INTRO_0 + (evId-EVENT_TALK_INTRO_0)); events.PopEvent(); break; case EVENT_SALUTE: me->HandleEmoteCommand(EMOTE_ONESHOT_SALUTE); for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) if (Creature* c = ObjectAccessor::GetCreature(*me, *itr)) c->HandleEmoteCommand(EMOTE_ONESHOT_SALUTE); events.PopEvent(); break; case EVENT_SOLDIERS_RUN_AWAY: { uint8 count = 0; for (SummonList::iterator itr = summons.begin(); itr != summons.end();) { ++count; if (Creature* c = ObjectAccessor::GetCreature(*me, *itr)) { c->SetWalk(false); c->GetMotionMaster()->MovePoint(0, 11863.35f, -7073.44f, 27.40f); } SummonList::iterator itr2 = itr++; summons.erase(itr2); if (count >= 5) { if (!summons.empty()) { events.RepeatEvent(5000); return; } else { events.PopEvent(); return; } } } } events.PopEvent(); break; case EVENT_GO_FIGHTPOINT: me->SetWalk(true); me->GetMotionMaster()->MovePoint(0, 11779.30f, -7065.43f, 24.92f); me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY2H); events.PopEvent(); break; case EVENT_TALK_SPAWN_0: case EVENT_TALK_SPAWN_1: Talk(SAY_SPAWN_0 + (evId-EVENT_TALK_SPAWN_0)); events.PopEvent(); break; case EVENT_SUMMON_MORLEN: if (Creature* c = me->SummonCreature(NPC_MORLEN_COLDGRIP, 11766.70f, -7050.57f, 25.17f, 5.56f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000)) morlenGUID = c->GetGUID(); events.PopEvent(); break; case EVENT_TALK_MORLEN_0: case EVENT_TALK_MORLEN_1: if (Creature* c = ObjectAccessor::GetCreature(*me, morlenGUID)) c->AI()->Talk(SAY_MORLEN_0 + (evId-EVENT_TALK_MORLEN_0)); events.PopEvent(); break; case EVENT_SPAWN_WAVE_1: case EVENT_SPAWN_WAVE_2: case EVENT_SPAWN_WAVE_3: if (Creature* c = ObjectAccessor::GetCreature(*me, morlenGUID)) { c->AI()->Talk(SAY_MORLEN_1 + (evId-EVENT_SPAWN_WAVE_1)); switch (evId) { // emerge cast tr false 66947 case EVENT_SPAWN_WAVE_1: { Position spawnPos; c->GetPosition(&spawnPos); spawnPos.m_orientation = 5.80f; spawnPos.m_positionX += 5.0f*cos(4.5f); spawnPos.m_positionY += 5.0f*sin(4.5f); for (uint8 i=0; i<5; ++i) if (Creature* s = me->SummonCreature(NPC_SCOURGE_ZOMBIE, spawnPos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2000)) { spawnPos.m_positionX += 2.5f*cos(4.5f); spawnPos.m_positionY += 2.5f*sin(4.5f); } } break; case EVENT_SPAWN_WAVE_2: { Position spawnPos; c->GetPosition(&spawnPos); spawnPos.m_orientation = 5.80f; spawnPos.m_positionX += 7.0f*cos(4.0f); spawnPos.m_positionY += 7.0f*sin(4.0f); for (uint8 i=0; i<3; ++i) if (Creature* s = me->SummonCreature(NPC_GHOUL_INVADER, spawnPos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2000)) { s->CastSpell(s, 66947, false); // emerge effect spawnPos.m_positionX += 4.0f*cos(4.5f); spawnPos.m_positionY += 4.0f*sin(4.5f); } } break; case EVENT_SPAWN_WAVE_3: { Position spawnPos; c->GetPosition(&spawnPos); spawnPos.m_orientation = 5.80f; spawnPos.m_positionX += 8.0f*cos(4.0f); spawnPos.m_positionY += 8.0f*sin(4.0f); for (uint8 i=0; i<3; ++i) if (Creature* s = me->SummonCreature(NPC_CRYPT_RAIDER, spawnPos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2000)) { s->CastSpell(s, 66947, false); // emerge effect spawnPos.m_positionX += 4.0f*cos(4.5f); spawnPos.m_positionY += 4.0f*sin(4.5f); } } break; } } events.PopEvent(); events.ScheduleEvent(EVENT_SUMMONS_ATTACK, 3000); break; case EVENT_SUMMONS_ATTACK: for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) if (Creature* c = ObjectAccessor::GetCreature(*me, *itr)) { if (c->GetEntry() == NPC_MORLEN_COLDGRIP && summons.size() != 1) continue; else c->AI()->Talk(SAY_MORLEN_4); c->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); c->AI()->AttackStart(me); } events.PopEvent(); break; case EVENT_OUTRO_0: case EVENT_OUTRO_1: case EVENT_OUTRO_2: case EVENT_OUTRO_3: Talk(SAY_OUTRO_0 + (evId-EVENT_OUTRO_0)); events.PopEvent(); if (evId == EVENT_OUTRO_3) events.ScheduleEvent(EVENT_OUTRO_KNEEL, 6000); break; case EVENT_OUTRO_KNEEL: if (Player* p = ObjectAccessor::GetPlayer(*me, playerGUID)) p->KilledMonsterCredit(NPC_THALORIEN_KILL_CREDIT, 0); me->SetStandState(UNIT_STAND_STATE_KNEEL); events.PopEvent(); events.ScheduleEvent(EVENT_DISAPPEAR, 6000); break; case EVENT_DISAPPEAR: events.PopEvent(); me->SetVisible(false); me->setActive(false); EnterEvadeMode(); break; case EVENT_SET_FACING: me->SetFacingTo(2.45f); events.PopEvent(); break; case EVENT_SPELL_BLADESTORM: if (me->GetVictim() && me->IsWithinMeleeRange(me->GetVictim())) me->CastSpell(me->GetVictim(), 67541, false); events.RepeatEvent(urand(25000, 35000)); break; case EVENT_SPELL_MORTAL_STRIKE: if (me->GetVictim() && me->IsWithinMeleeRange(me->GetVictim())) me->CastSpell(me->GetVictim(), 67542, false); events.RepeatEvent(urand(7000, 12000)); break; case EVENT_SPELL_HEROIC_STRIKE: if (me->GetVictim() && me->IsWithinMeleeRange(me->GetVictim())) me->CastSpell(me->GetVictim(), 57846, false); events.RepeatEvent(urand(5000, 10000)); break; } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) { if (!_isActive && !_attackGUID) return; events.Update(diff); uint32 eventId = events.GetEvent(); if (eventId == EVENT_UNFREEZE) { events.PopEvent(); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); me->CastSpell(me, SPELL_AWAKEN, true); me->RemoveAllAuras(); _isActive = true; if (Unit* target = ObjectAccessor::GetUnit(*me, _attackGUID)) AttackStart(target); return; } //Return since we have no target or if we are disabled from fight if (!UpdateVictim()) return; if (me->HasUnitState(UNIT_STATE_CASTING)) return; switch (eventId) { case EVENT_PIERCING_HOWL: me->CastSpell(me->GetVictim(), SPELL_PIERCING_HOWL, false); events.RepeatEvent(10000+rand()%1500); break; case EVENT_PENETRATING_STRIKE: me->CastSpell(me->GetVictim(), SPELL_PENETRATING_STRIKE, false); events.RepeatEvent(5000+rand()%5000); break; case EVENT_FRIGHTENING_SHOUT: me->CastSpell(me->GetVictim(), SPELL_FRIGHTENING_SHOUT, false); events.RepeatEvent(20000+rand()%8000); break; case EVENT_BLADE_TURNING: me->CastSpell(me->GetVictim(), me->GetMap()->IsHeroic() ? SPELL_BLADE_TURNING_H : SPELL_BLADE_TURNING_N, false); events.RepeatEvent(12000); break; case EVENT_THROW: me->CastSpell(SelectTarget(SELECT_TARGET_RANDOM,0,50.0f, true,0), me->GetMap()->IsHeroic() ? SPELL_THROW_H : SPELL_THROW_N, true); events.RepeatEvent(10000+rand()%15000); break; case EVENT_DEADLY_THROW: me->CastSpell(SelectTarget(SELECT_TARGET_RANDOM,0,50.0f, true,0), me->GetMap()->IsHeroic() ? SPELL_DEADLY_THROW_H : SPELL_DEADLY_THROW_N, true); events.RepeatEvent(15000+rand()%15000); break; case EVENT_DEFLECTION: me->CastSpell(me, me->GetMap()->IsHeroic() ? SPELL_DEFLECTION_H : SPELL_DEFLECTION_N, false); events.RepeatEvent(15000); 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 UpdateAI(uint32 diff) { if( releaseLockTimer ) { if( releaseLockTimer >= 5000 ) { lock = false; if (me->IsInCombat()) { LeaveCombat(); me->CastSpell(me, SPELL_EVOCATION, true); } releaseLockTimer = 0; } else releaseLockTimer += diff; } if( !UpdateVictim() ) return; events.Update(diff); if( me->HasUnitState(UNIT_STATE_CASTING) ) return; DoMeleeAttackIfReady(); switch( events.GetEvent() ) { case 0: break; case EVENT_FROSTBOMB: if( Unit* v = me->GetVictim() ) me->CastSpell(v, SPELL_FROSTBOMB, false); events.RepeatEvent(urand(7000,11000)); break; case EVENT_TIME_BOMB: if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true) ) me->CastSpell(target, SPELL_TIME_BOMB, false); events.RepeatEvent(urand(20000, 25000)); break; case EVENT_TELEPORT_TO_CENTER: x = me->GetPositionX(); y = me->GetPositionY(); z = me->GetPositionZ(); me->CastSpell(me, SPELL_TELEPORT, false); events.RepeatEvent(urand(25000,30000)); events.DelayEvents(10000); break; case EVENT_TELE_BACK: me->GetMotionMaster()->MoveIdle(); me->DisableSpline(); me->SetCanFly(false); me->SetDisableGravity(false); me->NearTeleportTo(x, y, z, 0.0f); me->SetControlled(false, UNIT_STATE_ROOT); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); me->GetMotionMaster()->MoveChase(me->GetVictim()); events.PopEvent(); break; } }
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_SPELL_BLOODLUST: me->CastSpell((Unit*)NULL, SPELL_BLOODLUST, false); events.RepeatEvent(urand(35000,45000)); break; case EVENT_SPELL_BREAK_BONDS: me->CastSpell((Unit*)NULL, SPELL_BREAK_BONDS, false); events.RepeatEvent(urand(16000,22000)); break; case EVENT_SPELL_CHAIN_HEAL: if (uint64 TargetGUID = GetChainHealTargetGUID()) if (pInstance) { if (Creature* target = pInstance->instance->GetCreature(TargetGUID)) me->CastSpell(target, SPELL_CHAIN_HEAL, false); Creature *pGuard1 = pInstance->instance->GetCreature(pInstance->GetData64(DATA_EREKEM_GUARD_1_GUID)); Creature *pGuard2 = pInstance->instance->GetCreature(pInstance->GetData64(DATA_EREKEM_GUARD_2_GUID)); if ((pGuard1 && !pGuard1->IsAlive()) || (pGuard2 && !pGuard2->IsAlive())) { events.RepeatEvent(urand(3000,6000)); break; } } events.RepeatEvent(urand(8000,11000)); break; case EVENT_SPELL_EARTH_SHIELD: me->CastSpell(me, SPELL_EARTH_SHIELD, false); events.RepeatEvent(20000); break; case EVENT_SPELL_EARTH_SHOCK: me->CastSpell(me->GetVictim(), SPELL_EARTH_SHOCK, false); events.RepeatEvent(urand(8000,13000)); break; case EVENT_SPELL_LIGHTNING_BOLT: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 35.0f, true)) me->CastSpell(target, SPELL_LIGHTNING_BOLT, false); events.RepeatEvent(urand(15000,25000)); break; case EVENT_SPELL_STORMSTRIKE: { Creature *pGuard1 = pInstance->instance->GetCreature(pInstance->GetData64(DATA_EREKEM_GUARD_1_GUID)); Creature *pGuard2 = pInstance->instance->GetCreature(pInstance->GetData64(DATA_EREKEM_GUARD_2_GUID)); if (pGuard1 && !pGuard1->IsAlive() && pGuard2 && !pGuard2->IsAlive()) // both dead me->CastSpell(me->GetVictim(), SPELL_STORMSTRIKE, false); events.RepeatEvent(3000); } break; } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) { if (!isActive) { IntroTimer += diff; if (IntroTimer > 5000 && IntroTimer < 10000) { if (SelectTargetFromPlayerList(60)) { Talk(SAY_INTRO_1); IntroTimer = 10000; } else IntroTimer = 0; } if (IntroTimer >= 30000 && IntroTimer < 40000) { Talk(SAY_INTRO_2); IntroTimer = 40000; } if (IntroTimer >= 60000) { isActive = true; if (m_pInstance) m_pInstance->SetData(TYPE_LOKEN_INTRO, 1); me->SetControlled(false, UNIT_STATE_STUNNED); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); if (Player* target = SelectTargetFromPlayerList(80)) AttackStart(target); } return; } //Return since we have no target if (!UpdateVictim()) return; events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; switch (events.GetEvent()) { case EVENT_CHECK_HEALTH: if (HealthBelowPct(HealthCheck)) { LokenSpeach(true); HealthCheck -= 25; } events.RepeatEvent(1000); break; case EVENT_LIGHTNING_NOVA: events.RepeatEvent(15000); me->CastSpell(me, SPELL_LIGHTNING_NOVA_VISUAL, true); me->CastSpell(me, SPELL_LIGHTNING_NOVA_THUNDERS, true); events.DelayEvents(5001); events.ScheduleEvent(EVENT_AURA_REMOVE, me->GetMap()->IsHeroic() ? 4000 : 5000); me->CastSpell(me, me->GetMap()->IsHeroic() ? SPELL_LIGHTNING_NOVA_H : SPELL_LIGHTNING_NOVA_N, false); break; case EVENT_SHOCKWAVE: me->CastSpell(me, me->GetMap()->IsHeroic() ? SPELL_PULSING_SHOCKWAVE_H : SPELL_PULSING_SHOCKWAVE_N, false); events.PopEvent(); break; case EVENT_ARC_LIGHTNING: if (Unit* target = SelectTargetFromPlayerList(100, SPELL_ARC_LIGHTNING)) me->CastSpell(target, SPELL_ARC_LIGHTNING, false); events.RepeatEvent(12000); break; case EVENT_AURA_REMOVE: me->RemoveAura(SPELL_LIGHTNING_NOVA_THUNDERS); events.PopEvent(); break; } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) { if (!UpdateVictim() || me->HasUnitState(UNIT_STATE_CASTING)) return; events.Update(diff); switch (events.GetEvent()) { case EVENT_SPELL_SONIC_BOOM: Talk(EMOTE_SONIC_BOOM); me->CastSpell(me, DUNGEON_MODE(SPELL_SONIC_BOOM_CAST_N, SPELL_SONIC_BOOM_CAST_H), false); events.RepeatEvent(28500); events.DelayEvents(1500); events.ScheduleEvent(EVENT_SPELL_SONIC_BOOM_EFFECT, 0); return; case EVENT_SPELL_SONIC_BOOM_EFFECT: me->CastSpell(me, DUNGEON_MODE(SPELL_SONIC_BOOM_EFFECT_N, SPELL_SONIC_BOOM_EFFECT_H), true); events.PopEvent(); break; case EVENT_SPELL_MURMURS_TOUCH: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 80.0f, true)) me->CastSpell(target, DUNGEON_MODE(SPELL_MURMURS_TOUCH_N, SPELL_MURMURS_TOUCH_H), false); events.RepeatEvent(urand(25000, 35000)); break; case EVENT_SPELL_RESONANCE: if (!me->IsWithinMeleeRange(me->GetVictim())) me->CastSpell(me, SPELL_RESONANCE, false); events.RepeatEvent(5000); break; case EVENT_SPELL_MAGNETIC: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 80.0f, true)) { me->CastSpell(target, SPELL_MAGNETIC_PULL, false); events.RepeatEvent(urand(15000, 30000)); return; } events.RepeatEvent(500); break; case EVENT_SPELL_THUNDERING: me->CastSpell(me, SPELL_THUNDERING_STORM, true); events.RepeatEvent(15000); break; case EVENT_SPELL_SONIC_SHOCK: me->CastSpell(me->GetVictim(), SPELL_SONIC_SHOCK, false); events.RepeatEvent(urand(10000, 20000)); break; } if (!me->isAttackReady()) return; if (!me->IsWithinMeleeRange(me->GetVictim())) { ThreatContainer::StorageType threatlist = me->getThreatManager().getThreatList(); for (ThreatContainer::StorageType::const_iterator i = threatlist.begin(); i != threatlist.end(); ++i) if (Unit* target = ObjectAccessor::GetUnit(*me, (*i)->getUnitGuid())) if (target->IsAlive() && me->IsWithinMeleeRange(target)) { me->TauntApply(target); break; } } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) { if (!UpdateVictim()) return; events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; switch (events.GetEvent()) { case EVENT_YMIRON_HEALTH_CHECK: { if (me->GetHealth() < std::max(0.0f, float(me->GetMaxHealth()*(1.0f-(IsHeroic() ? 0.2f : 0.334f)*float(BoatNum+1))))) { events.DelayEvents(12000); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); me->InterruptNonMeleeSpells(true); me->CastSpell(me, SPELL_SCREAMS_OF_THE_DEAD, true); me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MovePoint(0, BoatStructure[BoatOrder[BoatNum]].MoveX, BoatStructure[BoatOrder[BoatNum]].MoveY, BoatStructure[BoatOrder[BoatNum]].MoveZ); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE); summons.DespawnAll(); // Spawn flames in previous boat if any if (BoatNum) // different than 0 if (Creature *cr = me->SummonTrigger(BoatStructure[BoatOrder[BoatNum-1]].SpawnX, BoatStructure[BoatOrder[BoatNum-1]].SpawnY, BoatStructure[BoatOrder[BoatNum-1]].SpawnZ, 0, 1800000)) { cr->AddAura(SPELL_FLAMES, cr); summons2.Summon(cr); } BoatNum++; } events.RepeatEvent(1000); break; } case EVENT_YMIRON_BANE: { me->CastSpell(me, IsHeroic() ? SPELL_BANE_H : SPELL_BANE_N, false); events.RepeatEvent(20000+rand()%5000); break; } case EVENT_YMIRON_FETID_ROT: { me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_FETID_ROT_H : SPELL_FETID_ROT_N, false); events.RepeatEvent(10000+rand()%3000); break; } case EVENT_YMIRON_DARK_SLASH: { int32 dmg = me->GetVictim()->GetHealth() / 2; me->CastCustomSpell(me->GetVictim(), SPELL_DARK_SLASH, &dmg, 0, 0, false); events.RepeatEvent(30000+rand()%5000); break; } case EVENT_YMIRON_ACTIVATE_BOAT: { // Spawn it! if (Creature* king = me->SummonCreature(BoatStructure[BoatOrder[BoatNum-1]].npc, BoatStructure[BoatOrder[BoatNum-1]].SpawnX, BoatStructure[BoatOrder[BoatNum-1]].SpawnY, BoatStructure[BoatOrder[BoatNum-1]].SpawnZ, BoatStructure[BoatOrder[BoatNum-1]].SpawnO, TEMPSUMMON_CORPSE_DESPAWN, 0)) { me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); king->CastSpell(me, SPELL_CHANNEL_SPIRIT_TO_YMIRON, true); summons.Summon(king); king->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); king->SetDisableGravity(true); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE); me->GetMotionMaster()->MoveChase(me->GetVictim()); switch(BoatOrder[BoatNum-1]) { case 0: events.ScheduleEvent(EVENT_YMIRON_RANULF_ABILITY, 3000, 1); break; case 1: events.ScheduleEvent(EVENT_YMIRON_TORGYN_ABILITY, 3000, 1); break; case 2: events.ScheduleEvent(EVENT_YMIRON_BJORN_ABILITY, 3000, 1); break; case 3: events.ScheduleEvent(EVENT_YMIRON_HALDOR_ABILITY, 3000, 1); break; } } events.PopEvent(); break; } case EVENT_YMIRON_BJORN_ABILITY: { if (Creature* sf = me->SummonCreature(NPC_SPIRIT_FOUNT, 385+rand()%10, -330+rand()%10, 104.756f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 180000)) { summons.Summon(sf); sf->SetSpeed(MOVE_RUN, 0.4f); sf->AddAura(IsHeroic() ? SPELL_SPIRIT_FOUNT_H : SPELL_SPIRIT_FOUNT_N, sf); sf->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); sf->GetMotionMaster()->MoveFollow(me->GetVictim(), 0, rand_norm()*M_PI*2); } events.PopEvent(); break; } case EVENT_YMIRON_HALDOR_ABILITY: { me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_SPIRIT_STRIKE_H : SPELL_SPIRIT_STRIKE_N, false); events.RepeatEvent(5000); break; } case EVENT_YMIRON_RANULF_ABILITY: { me->CastSpell(me, IsHeroic() ? SPELL_SPIRIT_BURST_H : SPELL_SPIRIT_BURST_N, false); events.RepeatEvent(10000); break; } case EVENT_YMIRON_TORGYN_ABILITY: { for(uint8 i = 0; i < 4; ++i) { if (Creature* as = me->SummonCreature(NPC_AVENGING_SPIRIT, me->GetPositionX()+rand()%10, me->GetPositionY()+rand()%10, me->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000)) { summons.Summon(as); as->SetInCombatWithZone(); } } events.RepeatEvent(15000); break; } } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) { if (talkTimer) { talkTimer += diff; if (talkTimer >= 1000 && talkTimer < 10000) { Talk(SAY_ANZU_INTRO1); talkTimer = 10000; } else if (talkTimer >= 16000) { me->SetUInt32Value(UNIT_FIELD_FLAGS, 0); me->RemoveAurasDueToSpell(SPELL_SHADOWFORM); Talk(SAY_ANZU_INTRO2); talkTimer = 0; } } if (!UpdateVictim()) return; events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING|UNIT_STATE_STUNNED)) return; switch (events.GetEvent()) { case EVENT_SPELL_SCREECH: me->CastSpell(me, SPELL_PARALYZING_SCREECH, false); events.RepeatEvent(23000); events.DelayEvents(3000); break; case EVENT_SPELL_BOMB: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true)) me->CastSpell(target, SPELL_SPELL_BOMB, false); events.RepeatEvent(urand(16000, 24500)); events.DelayEvents(3000); break; case EVENT_SPELL_CYCLONE: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 45.0f, true)) me->CastSpell(target, SPELL_CYCLONE, false); events.RepeatEvent(urand(22000, 27000)); events.DelayEvents(3000); break; case EVENT_ANZU_HEALTH1: if (me->HealthBelowPct(66)) { SummonBroods(); events.PopEvent(); events.DelayEvents(10000); return; } events.RepeatEvent(1000); break; case EVENT_ANZU_HEALTH2: if (me->HealthBelowPct(33)) { SummonBroods(); events.PopEvent(); events.DelayEvents(10000); return; } events.RepeatEvent(1000); break; } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) { npc_escortAI::UpdateAI(diff); if( !UpdateVictim() ) return; events.Update(diff); if( me->HasUnitState(UNIT_STATE_CASTING) ) return; switch( events.GetEvent() ) { case 0: break; case EVENT_MONK_SPELL_FLURRY_OF_BLOWS: me->CastSpell(me, SPELL_FLURRY_OF_BLOWS, false); events.RepeatEvent(urand(12000,18000)); break; case EVENT_MONK_SPELL_PUMMEL: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_PUMMEL, false); events.RepeatEvent(urand(8000,11000)); break; case EVENT_PRIESTESS_SPELL_HOLY_SMITE: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_HOLY_SMITE, false); events.RepeatEvent(urand(6000,8000)); break; case EVENT_PRIESTESS_SPELL_SHADOW_WORD_PAIN: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_SHADOW_WORD_PAIN, false); events.RepeatEvent(urand(12000,15000)); break; case EVENT_PRIESTESS_SPELL_FOUNTAIN_OF_LIGHT: me->CastSpell((Unit*)NULL, SPELL_FOUNTAIN_OF_LIGHT, false); events.RepeatEvent(urand(35000,45000)); break; case EVENT_PRIESTESS_SPELL_MIND_CONTROL_H: if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true) ) me->CastSpell(target, SPELL_MIND_CONTROL_H, false); events.RepeatEvent(urand(22000,30000)); break; case EVENT_LIGHTWIELDER_SPELL_BLAZING_LIGHT: { Unit* target = DoSelectLowestHpFriendly(40.0f); if( !target ) target = me; me->CastSpell(target, SPELL_BLAZING_LIGHT, false); events.RepeatEvent(urand(8000,12000)); } break; case EVENT_LIGHTWIELDER_SPELL_CLEAVE: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false); events.RepeatEvent(urand(6000,8000)); break; case EVENT_LIGHTWIELDER_SPELL_UNBALANCING_STRIKE_H: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_UNBALANCING_STRIKE_H, false); events.RepeatEvent(urand(12000,15000)); break; } DoMeleeAttackIfReady(); }
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) { 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 UpdateAI(uint32 diff) { if (!UpdateVictim()) return; if (me->GetVictim()) { float x,y,z; me->GetVictim()->GetPosition(x, y, z); if (KrickCenterPos.GetExactDist(x,y,z) > 80.0f || z > KrickCenterPos.GetPositionZ()+20.0f || z < KrickCenterPos.GetPositionZ()-20.0f) { me->SetHealth(me->GetMaxHealth()); EnterEvadeMode(); return; } } events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING | UNIT_STATE_STUNNED)) return; switch(events.GetEvent()) { case 0: break; case EVENT_SPELL_TOXIC_WASTE: if (Creature* k = GetKrick()) if (!k->HasUnitState(UNIT_STATE_CASTING)) if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true)) { k->CastSpell(target, SPELL_TOXIC_WASTE); events.RepeatEvent(urand(7000,10000)); break; } events.RepeatEvent(2500); break; case EVENT_SPELL_MIGHTY_KICK: me->CastSpell(me->GetVictim(), SPELL_MIGHTY_KICK, false); events.RepeatEvent(urand(20000,25000)); break; case EVENT_SPELL_SHADOW_BOLT: if (Creature* k = GetKrick()) if (!k->HasUnitState(UNIT_STATE_CASTING)) if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 35.0f, true)) { k->CastSpell(target, SPELL_SHADOW_BOLT); events.RepeatEvent(14000); break; } events.RepeatEvent(2500); break; case EVENT_SET_REACT_AGGRESSIVE: me->SetReactState(REACT_AGGRESSIVE); if (!UpdateVictim()) return; events.PopEvent(); break; case EVENT_SPECIAL: switch(urand(0,2)) { case 0: // Pursuit if (Creature* k = GetKrick()) k->AI()->Talk(RAND(SAY_TARGET_1, SAY_TARGET_2, SAY_TARGET_3)); if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 70.0f, true)) me->CastSpell(target, SPELL_PURSUIT, false); break; case 1: // Poison Nova if (Creature* k = GetKrick()) { k->AI()->Talk(SAY_ORDER_BLOW); Talk(EMOTE_ICK_POISON); } me->CastSpell(me, SPELL_POISON_NOVA, false); break; case 2: // Explosive Barrage if (Creature* k = GetKrick()) { k->AI()->Talk(SAY_ORDER_STOP); k->AI()->Talk(EMOTE_KRICK_MINES); k->InterruptNonMeleeSpells(false); me->InterruptNonMeleeSpells(false); k->CastSpell(k, SPELL_EXPLOSIVE_BARRAGE_KRICK, false); me->CastSpell(me, SPELL_EXPLOSIVE_BARRAGE_ICK, false); } events.DelayEvents(20000); break; } events.RepeatEvent(urand(25000,30000)); break; } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) { //Return since we have no target if (!UpdateVictim()) return; if (insanityHandled) { if (!CheckPhaseMinions()) return; insanityHandled = 0; me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetControlled(false, UNIT_STATE_STUNNED); me->RemoveAurasDueToSpell(INSANITY_VISUAL); } events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; switch (events.GetEvent()) { case EVENT_HERALD_HEALTH: { if (insanityTimes == 0 && me->GetHealthPct() <= 66) { me->CastSpell(me, SPELL_INSANITY, false); insanityTimes++; } else if (insanityTimes == 1 && me->GetHealthPct() <= 33) { me->CastSpell(me, SPELL_INSANITY, false); insanityTimes++; } events.RepeatEvent(1000); break; } case EVENT_HERALD_MIND_FLAY: { me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_MIND_FLAY_H : SPELL_MIND_FLAY, false); events.RepeatEvent(20000); break; } case EVENT_HERALD_SHADOW: { me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_SHADOW_BOLT_VOLLEY_H : SPELL_SHADOW_BOLT_VOLLEY, false); events.RepeatEvent(5000); break; } case EVENT_HERALD_SHIVER: { if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0)) me->CastSpell(pTarget, IsHeroic() ? SPELL_SHIVER_H : SPELL_SHIVER, false); events.RepeatEvent(15000); break; } } DoMeleeAttackIfReady(); }
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 UpdateAI(uint32 diff) { if (!UpdateVictim()) return; if (me->GetVictim()) { float x,y,z; me->GetVictim()->GetPosition(x, y, z); if (x<600.0f || x>770.0f || y<-270.0f || y>-137.0f || z<514.0f || z>550.0f) { me->SetHealth(me->GetMaxHealth()); EnterEvadeMode(); if (CreatureGroup* f = me->GetFormation()) { const CreatureGroup::CreatureGroupMemberType& m = f->GetMembers(); for (CreatureGroup::CreatureGroupMemberType::const_iterator itr = m.begin(); itr != m.end(); ++itr) if (itr->first->IsAlive() && itr->first->IsInCombat() && !itr->first->IsInEvadeMode() && itr->first->IsAIEnabled) itr->first->AI()->EnterEvadeMode(); } return; } } events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; switch(events.GetEvent()) { case 0: break; case EVENT_SPELL_THROW_SARONITE: bCanSayBoulderHit = true; if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 140.0f, true)) { WorldPacket data; ChatHandler::BuildChatPacket(data, CHAT_MSG_RAID_BOSS_EMOTE, LANG_UNIVERSAL, me, NULL, EMOTE_THROW_SARONITE); target->ToPlayer()->GetSession()->SendPacket(&data); me->CastSpell(target, SPELL_THROW_SARONITE, false); } events.RepeatEvent(urand(12500,20000)); break; case EVENT_JUMP: me->DisableRotate(true); if (phase == 1) me->GetMotionMaster()->MoveJump(northForgePos.GetPositionX(), northForgePos.GetPositionY(), northForgePos.GetPositionZ(), 25.0f, 15.0f, 0); else if (phase == 2) me->GetMotionMaster()->MoveJump(southForgePos.GetPositionX(), southForgePos.GetPositionY(), southForgePos.GetPositionZ(), 25.0f, 15.0f, 0); events.PopEvent(); break; case EVENT_SPELL_CHILLING_WAVE: me->CastSpell(me->GetVictim(), SPELL_CHILLING_WAVE, false); events.RepeatEvent(35000); break; case EVENT_SPELL_DEEP_FREEZE: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) { Talk(EMOTE_DEEP_FREEZE, target); me->CastSpell(target, SPELL_DEEP_FREEZE, false); } events.RepeatEvent(35000); break; } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) { if (!UpdateVictim()) return; events.Update(diff); switch (events.GetEvent()) { case EVENT_CHECK: float x, y, z, o; me->GetHomePosition(x, y, z, o); if (!me->IsWithinDist3d(x, y, z, 60)) { EnterEvadeMode(); return; } events.RepeatEvent(5000); break; case EVENT_SPELL_SPORES: me->CastSpell(me, SPELL_SUMMON_SPORE_STRIDER, false); events.RepeatEvent(urand(10000, 15000)); break; case EVENT_SPELL_CHAIN: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) me->CastSpell(target, SPELL_CHAIN_LIGHTNING, false); events.DelayEvents(3000); events.RepeatEvent(9000); break; case EVENT_SPELL_STATIC: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30, true)) me->CastSpell(target, SPELL_STATIC_CHARGE, false); events.RepeatEvent(10000); break; case EVENT_LEVITATE: events.RepeatEvent(15000); if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1)) { me->CastSpell(target, SPELL_LEVITATE, false); lTarget = target->GetGUID(); events.DelayEvents(5000); events.ScheduleEvent(EVENT_LEVITATE_TARGET_1, 2000); } break; case EVENT_LEVITATE_TARGET_1: if (Unit* target = ObjectAccessor::GetUnit(*me, lTarget)) { if (!target->HasAura(SPELL_LEVITATE)) lTarget = 0; else { target->CastSpell(target, SPELL_MAGNETIC_PULL, true); events.ScheduleEvent(EVENT_LEVITATE_TARGET_2, 1500); } } events.PopEvent(); break; case EVENT_LEVITATE_TARGET_2: if (Unit* target = ObjectAccessor::GetUnit(*me, lTarget)) { if (!target->HasAura(SPELL_LEVITATE)) lTarget = 0; else { target->AddAura(SPELL_SUSPENSION, target); lTarget = 0; } } events.PopEvent(); break; } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) { if (!IsInRoom()) return; if (!UpdateVictim()) return; events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; switch (events.GetEvent()) { // GROUND case EVENT_SPELL_CURSE: me->CastCustomSpell(RAID_MODE(SPELL_CURSE_OF_THE_PLAGUEBRINGER_10, SPELL_CURSE_OF_THE_PLAGUEBRINGER_25), SPELLVALUE_MAX_TARGETS, RAID_MODE(3, 10), me, false); events.RepeatEvent(25000); break; case EVENT_SUMMON_PLAGUED_WARRIOR_ANNOUNCE: me->MonsterTextEmote("Noth the Plaguebringer summons forth Skeletal Warriors!", 0, true); Talk(SAY_SUMMON); events.RepeatEvent(25000); events.ScheduleEvent(EVENT_SUMMON_PLAGUED_WARRIOR_REAL, 4000); break; case EVENT_SUMMON_PLAGUED_WARRIOR_REAL: me->CastSpell(me, SPELL_SUMMON_PLAGUED_WARRIORS, true); SummonHelper(NPC_PLAGUED_WARRIOR, RAID_MODE(2,3)); events.PopEvent(); break; case EVENT_MOVE_TO_BALCONY: me->MonsterTextEmote("%s teleports to the balcony above!", 0, true); me->CastSpell(me, SPELL_TELEPORT, true); StartBalconyPhase(); //events.PopEvent(); events.Reset()!! break; case EVENT_SPELL_BLINK: DoResetThreat(); me->MonsterTextEmote("%s blinks away!", 0, true); me->CastSpell(me, RAID_MODE(SPELL_CRIPPLE_10, SPELL_CRIPPLE_25), false); me->CastSpell(me, SPELL_BLINK, true); events.RepeatEvent(30000); break; // BALCONY case EVENT_BALCONY_SUMMON_ANNOUNCE: me->MonsterTextEmote("%s raises more skeletons!", 0, true); events.RepeatEvent(25000); events.ScheduleEvent(EVENT_BALCONY_SUMMON_REAL, 4000); break; case EVENT_BALCONY_SUMMON_REAL: me->CastSpell(me, SPELL_SUMMON_PLAGUED_WARRIORS, true); // visual only if (totalPhase == 0) SummonHelper(NPC_PLAGUED_CHAMPION, RAID_MODE(2,4)); else if (totalPhase == 1) { SummonHelper(NPC_PLAGUED_CHAMPION, RAID_MODE(1,2)); SummonHelper(NPC_PLAGUED_GUARDIAN, RAID_MODE(1,2)); } else SummonHelper(NPC_PLAGUED_GUARDIAN, RAID_MODE(2,4)); events.PopEvent(); break; case EVENT_MOVE_TO_GROUND: me->MonsterTextEmote("%s teleports back into the battle!", 0, true); totalPhase++; StartGroundPhase(); me->NearTeleportTo(nothPosition.GetPositionX(), nothPosition.GetPositionY(), nothPosition.GetPositionZ(), nothPosition.GetOrientation(), true); events.PopEvent(); break; } if (me->HasReactState(REACT_AGGRESSIVE)) DoMeleeAttackIfReady(); }
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(); }
void UpdateAI(uint32 diff) { if (!UpdateVictim()) return; events.Update(diff); switch (events.GetEvent()) { case EVENT_UNFREEZE_MONSTER: { if (Creature *orb = ObjectAccessor::GetCreature(*me, OrbGUID)) { if (Creature *miniBoss = ObjectAccessor::GetCreature(*me, m_pInstance->GetData64(DATA_NPC_FRENZIED_WORGEN+RandomUnfreeze[Counter]))) { Counter++; miniBoss->AI()->DoAction(ACTION_UNFREEZE); orb->CastSpell(miniBoss, SPELL_AWAKEN_SUBBOSS, true); events.ScheduleEvent(EVENT_UNFREEZE_MONSTER2, 6000); } else EnterEvadeMode(); } events.PopEvent(); break; } case EVENT_UNFREEZE_MONSTER2: { if (Creature *orb = ObjectAccessor::GetCreature(*me, OrbGUID)) { if (Creature *miniBoss = ObjectAccessor::GetCreature(*me, m_pInstance->GetData64(DATA_NPC_FRENZIED_WORGEN+RandomUnfreeze[Counter-1]))) { miniBoss->AI()->DoAction(ACTION_UNFREEZE2); orb->RemoveAurasDueToSpell(SPELL_AWAKEN_SUBBOSS); } else EnterEvadeMode(); } events.PopEvent(); break; } case EVENT_PALEHOOF_START: { if (Creature *orb = ObjectAccessor::GetCreature(*me, OrbGUID)) { orb->CastSpell(me, SPELL_AWAKEN_SUBBOSS, true); events.ScheduleEvent(EVENT_PALEHOOF_START2, 6000); } events.PopEvent(); break; } case EVENT_PALEHOOF_START2: { Talk(SAY_AGGRO); if (Creature *orb = ObjectAccessor::GetCreature(*me, OrbGUID)) orb->RemoveAurasDueToSpell(SPELL_AWAKEN_SUBBOSS); me->RemoveAurasDueToSpell(SPELL_FREEZE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE); me->SetControlled(false, UNIT_STATE_STUNNED); // SETINCOMBATWITHZONE // schedule combat events events.ScheduleEvent(EVENT_PALEHOOF_WITHERING_ROAR, 10000); events.ScheduleEvent(EVENT_PALEHOOF_IMPALE, 12000); events.ScheduleEvent(EVENT_PALEHOOF_ARCING_SMASH, 15000); events.PopEvent(); break; } case EVENT_PALEHOOF_WITHERING_ROAR: { me->CastSpell(me, IsHeroic() ? SPELL_WITHERING_ROAR_H : SPELL_WITHERING_ROAR_N, false); events.RepeatEvent(8000 + rand()%4000); break; } case EVENT_PALEHOOF_IMPALE: { if (Unit *tgt = SelectTarget(SELECT_TARGET_RANDOM, 0)) me->CastSpell(tgt, IsHeroic() ? SPELL_IMPALE_H : SPELL_IMPALE_N, false); events.RepeatEvent(8000 + rand()%4000); break; } case EVENT_PALEHOOF_ARCING_SMASH: { me->CastSpell(me->GetVictim(), SPELL_ARCING_SMASH, false); events.RepeatEvent(13000 + rand()%4000); break; } } DoMeleeAttackIfReady(); }
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 (!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(); }