void UpdateAI(const uint32 uiDiff) { npc_escortAI::UpdateAI(uiDiff); if (!UpdateVictim()) return; if (uiBuffTimer <= uiDiff) { if (!me->HasAura(SPELL_SHIELD)) DoCastSpellShield(); uiBuffTimer = urand(30000,45000); } else uiBuffTimer -= uiDiff; if (uiChargeTimer <= uiDiff) { Map::PlayerList const& players = me->GetMap()->GetPlayers(); if (me->GetMap()->IsDungeon() && !players.isEmpty()) { for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) { Player* pPlayer = itr->getSource(); if (pPlayer && !pPlayer->isGameMaster() && me->IsInRange(pPlayer,8.0f,25.0f,false)) { DoResetThreat(); me->AddThreat(pPlayer,1.0f); DoCast(pPlayer, SPELL_CHARGE); break; } } } uiChargeTimer = 5000; } else uiChargeTimer -= uiDiff; //dosen't work at all if (uiShieldBreakerTimer <= uiDiff) { Vehicle *pVehicle = me->GetVehicleKit(); if (!pVehicle) return; if (Unit* pPassenger = pVehicle->GetPassenger(SEAT_ID_0)) { Map::PlayerList const& players = me->GetMap()->GetPlayers(); if (me->GetMap()->IsDungeon() && !players.isEmpty()) { for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) { Player* pPlayer = itr->getSource(); if (pPlayer && !pPlayer->isGameMaster() && me->IsInRange(pPlayer,10.0f,30.0f,false)) { pPassenger->CastSpell(pPlayer,SPELL_SHIELD_BREAKER,true); break; } } } } uiShieldBreakerTimer = 7000; } else uiShieldBreakerTimer -= uiDiff; DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; if(CheckTimer <= diff) { if (((me->GetHealth()*100 / me->GetMaxHealth()) < 10) && !isEnraged) { Unit* Kalecgos = Unit::GetUnit(*me, KalecgosGUID); if(Kalecgos) { Kalecgos->CastSpell(Kalecgos, SPELL_ENRAGE, true); CAST_AI(boss_kalecgos::boss_kalecgosAI,((Creature*)Kalecgos)->AI())->isEnraged = true; } DoCast(me, SPELL_ENRAGE, true); isEnraged = true; } if(!isBanished && (me->GetHealth()*100)/me->GetMaxHealth() < 1) { if(Unit *Kalecgos = Unit::GetUnit(*me, KalecgosGUID)) { if(CAST_AI(boss_kalecgos::boss_kalecgosAI,((Creature*)Kalecgos)->AI())->isBanished) { me->DealDamage(me, me->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); return; } else { DoCast(me, SPELL_BANISH); isBanished = true; } } else { sLog->outError("Sathrovarr is unable to find Kalecgos"); EnterEvadeMode(); return; } } CheckTimer = 1000; }else CheckTimer -= diff; if(ResetThreat <= diff) { if ( ( me->getVictim()->HasAuraEffect(AURA_SPECTRAL_EXHAUSTION,0)) && (me->getVictim()->GetTypeId() == TYPEID_PLAYER) ) { for(std::list<HostileReference*>::iterator itr = me->getThreatManager().getThreatList().begin(); itr != me->getThreatManager().getThreatList().end(); ++itr) { if(((*itr)->getUnitGuid()) == (me->getVictim()->GetGUID())) { (*itr)->removeReference(); break; } } } ResetThreat = 1000; }else ResetThreat -= diff; if(ShadowBoltTimer <= diff) { if(TryDoCast(me, SPELL_SHADOW_BOLT)) { DoScriptText(SAY_SATH_SPELL1, me); ShadowBoltTimer = 7000+(rand()%3000); } }else ShadowBoltTimer -= diff; if(AgonyCurseTimer <= diff) { Unit *ptarget = SelectTarget(SELECT_TARGET_RANDOM, 0); if(!ptarget) ptarget = me->getVictim(); if(TryDoCast(ptarget, SPELL_AGONY_CURSE)) AgonyCurseTimer = 20000; }else AgonyCurseTimer -= diff; if(CorruptionStrikeTimer <= diff) { if(TryDoCast(me->getVictim(), SPELL_CORRUPTION_STRIKE)) { DoScriptText(SAY_SATH_SPELL2, me); CorruptionStrikeTimer = 13000; } }else CorruptionStrikeTimer -= diff; DoMeleeAttackIfReady(); }
//*** HANDLED FUNCTION *** //Update AI is called Every single map update (roughly once every 50ms if a player is within the grid) void UpdateAI(const uint32 uiDiff) { //Out of combat timers if (!me->getVictim()) { //Random Say timer if (m_uiSayTimer <= uiDiff) { //Random switch between 5 outcomes DoScriptText(RAND(SAY_RANDOM_0,SAY_RANDOM_1,SAY_RANDOM_2,SAY_RANDOM_3,SAY_RANDOM_4), me); m_uiSayTimer = 45000; //Say something agian in 45 seconds } else m_uiSayTimer -= uiDiff; //Rebuff timer if (m_uiRebuffTimer <= uiDiff) { DoCast(me, SPELL_BUFF); m_uiRebuffTimer = 900000; //Rebuff agian in 15 minutes } else m_uiRebuffTimer -= uiDiff; } //Return since we have no target if (!UpdateVictim()) return; //Spell 1 timer if (m_uiSpell1Timer <= uiDiff) { //Cast spell one on our current target. if (rand()%50 > 10) DoCast(me->getVictim(), SPELL_ONE_ALT); else if (me->IsWithinDist(me->getVictim(), 25.0f)) DoCast(me->getVictim(), SPELL_ONE); m_uiSpell1Timer = 5000; } else m_uiSpell1Timer -= uiDiff; //Spell 2 timer if (m_uiSpell2Timer <= uiDiff) { //Cast spell two on our current target. DoCast(me->getVictim(), SPELL_TWO); m_uiSpell2Timer = 37000; } else m_uiSpell2Timer -= uiDiff; //Beserk timer if (m_uiPhase > 1) { //Spell 3 timer if (m_uiSpell3Timer <= uiDiff) { //Cast spell one on our current target. DoCast(me->getVictim(), SPELL_THREE); m_uiSpell3Timer = 19000; } else m_uiSpell3Timer -= uiDiff; if (m_uiBeserkTimer <= uiDiff) { //Say our line then cast uber death spell DoScriptText(SAY_BERSERK, me, me->getVictim()); DoCast(me->getVictim(), SPELL_BERSERK); //Cast our beserk spell agian in 12 seconds if we didn't kill everyone m_uiBeserkTimer = 12000; } else m_uiBeserkTimer -= uiDiff; } else if (m_uiPhase == 1) //Phase timer { if (m_uiPhaseTimer <= uiDiff) { //Go to next phase ++m_uiPhase; DoScriptText(SAY_PHASE, me); DoCast(me, SPELL_FRENZY); } else m_uiPhaseTimer -= uiDiff; } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 uiDiff) override { if (!UpdateVictim()) return; /*START ACID-AI*/ if (uiTrashTimer <= uiDiff) { if (bCheckChances()) DoCast(me, SPELL_TRASH); uiTrashTimer = urand(6000, 15500); } else uiTrashTimer -= uiDiff; if (uiSlamTimer <= uiDiff) { if (bCheckChances()) DoCastVictim(SPELL_SMITE_SLAM); uiSlamTimer = 11000; } else uiSlamTimer -= uiDiff; if (uiNimbleReflexesTimer <= uiDiff) { if (bCheckChances()) DoCast(me, SPELL_NIMBLE_REFLEXES); uiNimbleReflexesTimer = urand(27300, 60100); } else uiNimbleReflexesTimer -= uiDiff; /*END ACID-AI*/ if ((uiHealth == 0 && !HealthAbovePct(66)) || (uiHealth == 1 && !HealthAbovePct(33))) { ++uiHealth; DoCastAOE(SPELL_SMITE_STOMP, false); SetCombatMovement(false); if (GameObject* go = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_SMITE_CHEST))) { me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MovePoint(1, go->GetPositionX() - 3.0f, go->GetPositionY(), go->GetPositionZ()); } } if (uiPhase) { if (uiTimer <= uiDiff) { switch (uiPhase) { case 1: me->HandleEmoteCommand(EMOTE_STATE_KNEEL); //dosen't work? uiTimer = 1000; uiPhase = 2; break; case 2: if (uiHealth == 1) SetEquipmentSlots(false, EQUIP_SWORD, EQUIP_SWORD, EQUIP_NO_CHANGE); else SetEquipmentSlots(false, EQUIP_MACE, EQUIP_UNEQUIP, EQUIP_NO_CHANGE); uiTimer = 500; uiPhase = 3; break; case 3: SetCombatMovement(true); me->GetMotionMaster()->MoveChase(me->GetVictim(), me->m_CombatDistance); uiPhase = 0; break; } } else uiTimer -= uiDiff; } DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (ghost) { if (pInstance && pInstance->GetData(DATA_SKARVALD_DALRONN_EVENT) != IN_PROGRESS) me->DealDamage(me, me->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); } if (!UpdateVictim()) return; if (AggroYell_Timer) { if (AggroYell_Timer <= diff) { DoScriptText(YELL_DALRONN_AGGRO,me); AggroYell_Timer = 0; } else AggroYell_Timer -= diff; } if (!ghost) { if (Check_Timer) { if (Check_Timer <= diff) { Check_Timer = 5000; Unit* skarvald = Unit::GetUnit(*me, pInstance ? pInstance->GetData64(DATA_SKARVALD) : 0); if (skarvald && skarvald->isDead()) { Skarvald_isDead = true; Response_Timer = 2000; Check_Timer = 0; } } else Check_Timer -= diff; } if (Response_Timer && Skarvald_isDead) { if (Response_Timer <= diff) { DoScriptText(YELL_DALRONN_SKA_DIEDFIRST,me); Response_Timer = 0; } else Response_Timer -= diff; } } if (ShadowBolt_Timer <= diff) { if (!me->IsNonMeleeSpellCasted(false)) { DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0), SPELL_SHADOW_BOLT); ShadowBolt_Timer = 2100;//give a 100ms pause to try cast other spells } } else ShadowBolt_Timer -= diff; if (Debilitate_Timer <= diff) { if (!me->IsNonMeleeSpellCasted(false)) { DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0), SPELL_DEBILITATE); Debilitate_Timer = 5000+rand()%5000; } } else Debilitate_Timer -= diff; if (IsHeroic()) { if (Summon_Timer <= diff) { if (!me->IsNonMeleeSpellCasted(false)) { DoCast(me, H_SPELL_SUMMON_SKELETONS); Summon_Timer = (rand()%10000) + 20000; } } else Summon_Timer -= diff; } DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim() || me->HasUnitState(UNIT_STAT_CASTING)) return; if(chainsOfWoe != NULL) if(chainsOfWoe->isAlive()) { /* Buggy! Map::PlayerList const &PlayerList = me->GetMap()->GetPlayers(); if (!PlayerList.isEmpty()) { for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) if (!i->getSource()->HasAura(SPELL_CHAINS_OF_WOE_AURA)) me->CastSpell(i->getSource(),SPELL_CHAINS_OF_WOE_AURA,true); }*/ }else { chainsOfWoe->DespawnOrUnsummon(); chainsOfWoe = NULL; } if(castSkullCracker) { me->MonsterYell("Stand still! Rom'ogg crack your skulls!", LANG_UNIVERSAL, NULL); castSkullCracker = false; DoCastAOE(SPELL_THE_SKULLCRACKER); return; } events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_QUAKE: DoCastAOE(SPELL_QUAKE); if(me->GetMap()->IsHeroic()) { // Summon Angered Earth Position myPos; me->GetPosition(&myPos); for(uint8 i=1; i<=5; i++) me->SummonCreature(NPC_ANGERED_EARTH,myPos,TEMPSUMMON_CORPSE_DESPAWN); } events.ScheduleEvent(EVENT_QUAKE, 25000); break; case EVENT_CHAINS_OF_WOE: DoCastAOE(SPELL_CHAINS_OF_WOE); castSkullCracker = true; events.ScheduleEvent(EVENT_CHAINS_OF_WOE, 20000); break; case EVENT_WOUNDING_STRIKE: DoCastVictim(SPELL_WOUNDING_STRIKE); events.ScheduleEvent(EVENT_WOUNDING_STRIKE, 15000); break; } } DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { switch (phase) { case PHASE_CHAINED: if (!anchorGUID) { if (Creature* anchor = me->FindNearestCreature(29521, 30)) { anchor->AI()->SetGUID(me->GetGUID()); anchor->CastSpell(me, SPELL_SOUL_PRISON_CHAIN, true); anchorGUID = anchor->GetGUID(); } else sLog->outError("npc_unworthy_initiateAI: unable to find anchor!"); float dist = 99.0f; GameObject* prison = NULL; for (uint8 i = 0; i < 12; ++i) { if (GameObject* temp_prison = me->FindNearestGameObject(acherus_soul_prison[i], 30)) { if (me->IsWithinDist(temp_prison, dist, false)) { dist = me->GetDistance2d(temp_prison); prison = temp_prison; } } } if (prison) prison->ResetDoorOrButton(); else sLog->outError("npc_unworthy_initiateAI: unable to find prison!"); } break; case PHASE_TO_EQUIP: if (wait_timer) { if (wait_timer > diff) wait_timer -= diff; else { me->GetMotionMaster()->MovePoint(1, anchorX, anchorY, me->GetPositionZ()); //sLog->outDebug(LOG_FILTER_TSCR, "npc_unworthy_initiateAI: move to %f %f %f", anchorX, anchorY, me->GetPositionZ()); phase = PHASE_EQUIPING; wait_timer = 0; } } break; case PHASE_TO_ATTACK: if (wait_timer) { if (wait_timer > diff) wait_timer -= diff; else { me->setFaction(14); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); phase = PHASE_ATTACKING; if (Player* target = Unit::GetPlayer(*me, playerGUID)) me->AI()->AttackStart(target); wait_timer = 0; } } break; case PHASE_ATTACKING: if (!UpdateVictim()) return; events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_ICY_TOUCH: DoCast(me->getVictim(), SPELL_ICY_TOUCH); events.DelayEvents(1000, GCD_CAST); events.ScheduleEvent(EVENT_ICY_TOUCH, 5000, GCD_CAST); break; case EVENT_PLAGUE_STRIKE: DoCast(me->getVictim(), SPELL_PLAGUE_STRIKE); events.DelayEvents(1000, GCD_CAST); events.ScheduleEvent(SPELL_PLAGUE_STRIKE, 5000, GCD_CAST); break; case EVENT_BLOOD_STRIKE: DoCast(me->getVictim(), SPELL_BLOOD_STRIKE); events.DelayEvents(1000, GCD_CAST); events.ScheduleEvent(EVENT_BLOOD_STRIKE, 5000, GCD_CAST); break; case EVENT_DEATH_COIL: DoCast(me->getVictim(), SPELL_DEATH_COIL); events.DelayEvents(1000, GCD_CAST); events.ScheduleEvent(EVENT_DEATH_COIL, 5000, GCD_CAST); break; } } DoMeleeAttackIfReady(); break; default: break; } }
void UpdateAI (const uint32 diff) { if (!UpdateVictim()) return; //Shield_Timer if (Shield_Timer <= diff) { DoCast(me, SPELL_SHIELD); Shield_Timer = 61000; } else Shield_Timer -= diff; //BloodLust_Timer if (BloodLust_Timer <= diff) { DoCast(me, SPELL_BLOODLUST); BloodLust_Timer = 20000+rand()%8000; } else BloodLust_Timer -= diff; //Casting Greaterheal to Thekal or Zath if they are in meele range. if (GreaterHeal_Timer <= diff) { if (instance) { Unit* pThekal = Unit::GetUnit(*me, instance->GetData64(DATA_THEKAL)); Unit* pZath = Unit::GetUnit(*me, instance->GetData64(DATA_ZATH)); if (!pThekal || !pZath) return; switch (urand(0, 1)) { case 0: if (me->IsWithinMeleeRange(pThekal)) DoCast(pThekal, SPELL_GREATERHEAL); break; case 1: if (me->IsWithinMeleeRange(pZath)) DoCast(pZath, SPELL_GREATERHEAL); break; } } GreaterHeal_Timer = 15000+rand()%5000; } else GreaterHeal_Timer -= diff; //Disarm_Timer if (Disarm_Timer <= diff) { DoCast(me->getVictim(), SPELL_DISARM); Disarm_Timer = 15000+rand()%10000; } else Disarm_Timer -= diff; //Check_Timer for the death of LorKhan and Zath. if (!FakeDeath && Check_Timer <= diff) { if (instance) { if (instance->GetData(DATA_THEKAL) == SPECIAL) { //Resurrect Thekal if (Unit* pThekal = Unit::GetUnit(*me, instance->GetData64(DATA_THEKAL))) { pThekal->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); pThekal->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); pThekal->setFaction(14); pThekal->SetFullHealth(); } } if (instance->GetData(DATA_ZATH) == SPECIAL) { //Resurrect Zath if (Unit* pZath = Unit::GetUnit(*me, instance->GetData64(DATA_ZATH))) { pZath->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); pZath->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); pZath->setFaction(14); pZath->SetFullHealth(); } } } Check_Timer = 5000; } else Check_Timer -= diff; if (!HealthAbovePct(5)) { me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT); me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE); me->RemoveAurasByType(SPELL_AURA_PERIODIC_LEECH); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetStandState(UNIT_STAND_STATE_SLEEP); me->setFaction(35); me->AttackStop(); if (instance) instance->SetData(DATA_LORKHAN, SPECIAL); FakeDeath = true; } DoMeleeAttackIfReady(); }
void UpdateAI (const uint32 diff) { if (!UpdateVictim()) return; //SweepingStrikes_Timer if (SweepingStrikes_Timer <= diff) { DoCast(me->getVictim(), SPELL_SWEEPINGSTRIKES); SweepingStrikes_Timer = 22000+rand()%4000; } else SweepingStrikes_Timer -= diff; //SinisterStrike_Timer if (SinisterStrike_Timer <= diff) { DoCast(me->getVictim(), SPELL_SINISTERSTRIKE); SinisterStrike_Timer = 8000+rand()%8000; } else SinisterStrike_Timer -= diff; //Gouge_Timer if (Gouge_Timer <= diff) { DoCast(me->getVictim(), SPELL_GOUGE); if (DoGetThreat(me->getVictim())) DoModifyThreatPercent(me->getVictim(), -100); Gouge_Timer = 17000+rand()%10000; } else Gouge_Timer -= diff; //Kick_Timer if (Kick_Timer <= diff) { DoCast(me->getVictim(), SPELL_KICK); Kick_Timer = 15000+rand()%10000; } else Kick_Timer -= diff; //Blind_Timer if (Blind_Timer <= diff) { DoCast(me->getVictim(), SPELL_BLIND); Blind_Timer = 10000+rand()%10000; } else Blind_Timer -= diff; //Check_Timer for the death of LorKhan and Zath. if (!FakeDeath && Check_Timer <= diff) { if (instance) { if (instance->GetData(DATA_LORKHAN) == SPECIAL) { //Resurrect LorKhan if (Unit* pLorKhan = Unit::GetUnit(*me, instance->GetData64(DATA_LORKHAN))) { pLorKhan->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); pLorKhan->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); pLorKhan->setFaction(14); pLorKhan->SetFullHealth(); } } if (instance->GetData(DATA_THEKAL) == SPECIAL) { //Resurrect Thekal if (Unit* pThekal = Unit::GetUnit(*me, instance->GetData64(DATA_THEKAL))) { pThekal->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); pThekal->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); pThekal->setFaction(14); pThekal->SetFullHealth(); } } } Check_Timer = 5000; } else Check_Timer -= diff; if (!HealthAbovePct(5)) { me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT); me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE); me->RemoveAurasByType(SPELL_AURA_PERIODIC_LEECH); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetStandState(UNIT_STAND_STATE_SLEEP); me->setFaction(35); me->AttackStop(); if (instance) instance->SetData(DATA_ZATH, SPECIAL); FakeDeath = true; } DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 uiDiff) { if (!bDone && GrandChampionsOutVehicle(me)) { bDone = true; if (pInstance && me->GetGUID() == pInstance->GetData64(DATA_GRAND_CHAMPION_1)) me->SetHomePosition(739.678f,662.541f,412.393f,4.49f); else if (pInstance && me->GetGUID() == pInstance->GetData64(DATA_GRAND_CHAMPION_2)) me->SetHomePosition(746.71f,661.02f,411.69f,4.6f); else if (pInstance && me->GetGUID() == pInstance->GetData64(DATA_GRAND_CHAMPION_3)) me->SetHomePosition(754.34f,660.70f,412.39f,4.79f); if (pInstance) pInstance->SetData(BOSS_GRAND_CHAMPIONS, IN_PROGRESS); EnterEvadeMode(); bHome = true; } if (uiPhaseTimer <= uiDiff) { if (uiPhase == 1) { AggroAllPlayers(me); uiPhase = 0; } } else uiPhaseTimer -= uiDiff; if (!UpdateVictim() || me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT)) return; if (uiLightningArrowsTimer <= uiDiff) { DoCastAOE(SPELL_LIGHTNING_ARROWS,false); uiLightningArrowsTimer = 7000; } else uiLightningArrowsTimer -= uiDiff; if (uiShootTimer <= uiDiff) { if (Unit* pTarget = SelectTarget(SELECT_TARGET_FARTHEST,0,30.0f)) { uiTargetGUID = pTarget->GetGUID(); DoCast(pTarget, SPELL_SHOOT); } uiShootTimer = 12000; uiMultiShotTimer = 3000; bShoot = true; } else uiShootTimer -= uiDiff; if (bShoot && uiMultiShotTimer <= uiDiff) { me->InterruptNonMeleeSpells(true); Unit* pTarget = Unit::GetUnit(*me, uiTargetGUID); if (pTarget && me->IsInRange(pTarget,5.0f,30.0f,false)) { DoCast(pTarget,SPELL_MULTI_SHOT); } else { Map::PlayerList const& players = me->GetMap()->GetPlayers(); if (me->GetMap()->IsDungeon() && !players.isEmpty()) { for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) { Player* pPlayer = itr->getSource(); if (pPlayer && !pPlayer->isGameMaster() && me->IsInRange(pPlayer,5.0f,30.0f,false)) { DoCast(pTarget,SPELL_MULTI_SHOT); break; } } } } bShoot = false; } else uiMultiShotTimer -= uiDiff; DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; //Check_Timer for the death of LorKhan and Zath. if (!WasDead && Check_Timer <= diff) { if (instance) { if (instance->GetData(DATA_LORKHAN) == SPECIAL) { //Resurrect LorKhan if (Unit* pLorKhan = Unit::GetUnit(*me, instance->GetData64(DATA_LORKHAN))) { pLorKhan->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); pLorKhan->setFaction(14); pLorKhan->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); pLorKhan->SetFullHealth(); instance->SetData(DATA_LORKHAN, DONE); } } if (instance->GetData(DATA_ZATH) == SPECIAL) { //Resurrect Zath Unit* pZath = Unit::GetUnit(*me, instance->GetData64(DATA_ZATH)); if (pZath) { pZath->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); pZath->setFaction(14); pZath->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); pZath->SetFullHealth(); instance->SetData(DATA_ZATH, DONE); } } } Check_Timer = 5000; } else Check_Timer -= diff; if (!PhaseTwo && MortalCleave_Timer <= diff) { DoCast(me->getVictim(), SPELL_MORTALCLEAVE); MortalCleave_Timer = urand(15000, 20000); } else MortalCleave_Timer -= diff; if (!PhaseTwo && Silence_Timer <= diff) { DoCast(me->getVictim(), SPELL_SILENCE); Silence_Timer = urand(20000, 25000); } else Silence_Timer -= diff; if (!PhaseTwo && !WasDead && !HealthAbovePct(5)) { me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT); me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE); me->RemoveAurasByType(SPELL_AURA_PERIODIC_LEECH); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetStandState(UNIT_STAND_STATE_SLEEP); me->AttackStop(); if (instance) instance->SetData(DATA_THEKAL, SPECIAL); WasDead=true; } //Thekal will transform to Tiger if he died and was not resurrected after 10 seconds. if (!PhaseTwo && WasDead) { if (Resurrect_Timer <= diff) { DoCast(me, SPELL_TIGER_FORM); me->SetObjectScale(2.00f); me->SetStandState(UNIT_STAND_STATE_STAND); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetFullHealth(); const CreatureTemplate* cinfo = me->GetCreatureTemplate(); me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 40))); me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 40))); me->UpdateDamagePhysical(BASE_ATTACK); DoResetThreat(); PhaseTwo = true; } else Resurrect_Timer -= diff; } if (me->IsFullHealth() && WasDead) { WasDead = false; } if (PhaseTwo) { if (Charge_Timer <= diff) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) { DoCast(target, SPELL_CHARGE); DoResetThreat(); AttackStart(target); } Charge_Timer = urand(15000, 22000); } else Charge_Timer -= diff; if (Frenzy_Timer <= diff) { DoCast(me, SPELL_FRENZY); Frenzy_Timer = 30000; } else Frenzy_Timer -= diff; if (ForcePunch_Timer <= diff) { DoCast(me->getVictim(), SPELL_SILENCE); ForcePunch_Timer = urand(16000, 21000); } else ForcePunch_Timer -= diff; if (SummonTigers_Timer <= diff) { DoCast(me->getVictim(), SPELL_SUMMONTIGERS); SummonTigers_Timer = urand(10000, 14000); } else SummonTigers_Timer -= diff; if (HealthBelowPct(11) && !Enraged) { DoCast(me, SPELL_ENRAGE); Enraged = true; } } DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 uiDiff) { if (!bDone && GrandChampionsOutVehicle(me)) { bDone = true; if (pInstance && me->GetGUID() == pInstance->GetData64(DATA_GRAND_CHAMPION_1)) me->SetHomePosition(739.678f,662.541f,412.393f,4.49f); else if (pInstance && me->GetGUID() == pInstance->GetData64(DATA_GRAND_CHAMPION_2)) me->SetHomePosition(746.71f,661.02f,411.69f,4.6f); else if (pInstance && me->GetGUID() == pInstance->GetData64(DATA_GRAND_CHAMPION_3)) me->SetHomePosition(754.34f,660.70f,412.39f,4.79f); if (pInstance) pInstance->SetData(BOSS_GRAND_CHAMPIONS, IN_PROGRESS); EnterEvadeMode(); bHome = true; } if (uiPhaseTimer <= uiDiff) { if (uiPhase == 1) { AggroAllPlayers(me); uiPhase = 0; } } else uiPhaseTimer -= uiDiff; if (!UpdateVictim() || me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT)) return; if (uiChainLightningTimer <= uiDiff) { if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,0)) DoCast(pTarget,SPELL_CHAIN_LIGHTNING); uiChainLightningTimer = 16000; } else uiChainLightningTimer -= uiDiff; if (uiHealingWaveTimer <= uiDiff) { bool bChance = urand(0,1); if (!bChance) { if (Unit* pFriend = DoSelectLowestHpFriendly(40)) DoCast(pFriend,SPELL_HEALING_WAVE); } else DoCast(me,SPELL_HEALING_WAVE); uiHealingWaveTimer = 12000; } else uiHealingWaveTimer -= uiDiff; if (uiEartShieldTimer <= uiDiff) { DoCast(me,SPELL_EARTH_SHIELD); uiEartShieldTimer = urand(30000,35000); } else uiEartShieldTimer -= uiDiff; if (uiHexMendingTimer <= uiDiff) { DoCastVictim(SPELL_HEX_OF_MENDING,true); uiHexMendingTimer = urand(20000,25000); } else uiHexMendingTimer -= uiDiff; DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 uiDiff) { if (!bDone && GrandChampionsOutVehicle(me)) { bDone = true; if (pInstance && me->GetGUID() == pInstance->GetData64(DATA_GRAND_CHAMPION_1)) me->SetHomePosition(739.678f,662.541f,412.393f,4.49f); else if (pInstance && me->GetGUID() == pInstance->GetData64(DATA_GRAND_CHAMPION_2)) me->SetHomePosition(746.71f,661.02f,411.69f,4.6f); else if (pInstance && me->GetGUID() == pInstance->GetData64(DATA_GRAND_CHAMPION_3)) me->SetHomePosition(754.34f,660.70f,412.39f,4.79f); if (pInstance) pInstance->SetData(BOSS_GRAND_CHAMPIONS, IN_PROGRESS); EnterEvadeMode(); bHome = true; } if (uiPhaseTimer <= uiDiff) { if (uiPhase == 1) { AggroAllPlayers(me); uiPhase = 0; } } else uiPhaseTimer -= uiDiff; if (uiFireBallTimer <= uiDiff) { if (me->getVictim()) DoCastVictim(SPELL_FIREBALL); uiFireBallTimer = 5000; } else uiFireBallTimer -= uiDiff; if (!UpdateVictim() || me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT)) return; if (uiFireBallTimer <= uiDiff) { DoCastVictim(SPELL_FIREBALL); uiFireBallTimer = 5000; } else uiFireBallTimer -= uiDiff; if (uiPolymorphTimer <= uiDiff) { if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,0)) DoCast(pTarget, SPELL_POLYMORPH); uiPolymorphTimer = 8000; } else uiPolymorphTimer -= uiDiff; if (uiBlastWaveTimer <= uiDiff) { DoCastAOE(SPELL_BLAST_WAVE,false); uiBlastWaveTimer = 13000; } else uiBlastWaveTimer -= uiDiff; if (uiHasteTimer <= uiDiff) { me->InterruptNonMeleeSpells(true); DoCast(me,SPELL_HASTE); uiHasteTimer = 22000; } else uiHasteTimer -= uiDiff; DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 uiDiff) { if (!bDone && GrandChampionsOutVehicle(me)) { bDone = true; if (pInstance && me->GetGUID() == pInstance->GetData64(DATA_GRAND_CHAMPION_1)) me->SetHomePosition(739.678f,662.541f,412.393f,4.49f); else if (pInstance && me->GetGUID() == pInstance->GetData64(DATA_GRAND_CHAMPION_2)) me->SetHomePosition(746.71f,661.02f,411.69f,4.6f); else if (pInstance && me->GetGUID() == pInstance->GetData64(DATA_GRAND_CHAMPION_3)) me->SetHomePosition(754.34f,660.70f,412.39f,4.79f); EnterEvadeMode(); bHome = true; } if (uiPhaseTimer <= uiDiff) { if (uiPhase == 1) { AggroAllPlayers(me); uiPhase = 0; } } else uiPhaseTimer -= uiDiff; if (!UpdateVictim() || me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT)) return; if (uiInterceptTimer <= uiDiff) { Map::PlayerList const& players = me->GetMap()->GetPlayers(); if (me->GetMap()->IsDungeon() && !players.isEmpty()) { for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) { Player* pPlayer = itr->getSource(); if (pPlayer && !pPlayer->isGameMaster() && me->IsInRange(pPlayer,8.0f,25.0f,false)) { DoResetThreat(); me->AddThreat(pPlayer,5.0f); DoCast(pPlayer,SPELL_INTERCEPT); break; } } } uiInterceptTimer = 7000; } else uiInterceptTimer -= uiDiff; if (uiBladeStormTimer <= uiDiff) { DoCastVictim(SPELL_BLADESTORM); uiBladeStormTimer = urand(15000,20000); } else uiBladeStormTimer -= uiDiff; if (uiMortalStrikeTimer <= uiDiff) { DoCastVictim(SPELL_MORTAL_STRIKE); uiMortalStrikeTimer = urand(8000,12000); } else uiMortalStrikeTimer -= uiDiff; DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) override { if (TalkTimer) { if (!TalkSequence) { me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE + UNIT_FLAG_NOT_SELECTABLE); me->InterruptNonMeleeSpells(true); me->RemoveAllAuras(); me->DeleteThreatList(); me->CombatStop(); ++TalkSequence; } if (TalkTimer <= diff) { if (isFriendly) GoodEnding(); else BadEnding(); ++TalkSequence; } else TalkTimer -= diff; } else { if (bJustReset) { if (ResetTimer <= diff) { me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE); me->SetDisableGravity(false); me->SetVisible(true); me->SetStandState(UNIT_STAND_STATE_SLEEP); ResetTimer = 10000; bJustReset = false; } else ResetTimer -= diff; return; } if (!UpdateVictim()) return; if (CheckTimer <= diff) { if (me->GetDistance(CENTER_X, CENTER_Y, DRAGON_REALM_Z) >= 75) { EnterEvadeMode(EVADE_REASON_BOUNDARY); return; } if (HealthBelowPct(10) && !isEnraged) { if (Creature* Sath = ObjectAccessor::GetCreature(*me, SathGUID)) Sath->AI()->DoAction(DO_ENRAGE); DoAction(DO_ENRAGE); } if (!isBanished && HealthBelowPct(1)) { if (Creature* Sath = ObjectAccessor::GetCreature(*me, SathGUID)) { if (Sath->HasAura(SPELL_BANISH)) { Sath->DealDamage(Sath, Sath->GetHealth()); return; } else DoAction(DO_BANISH); } else { TC_LOG_ERROR("scripts", "Didn't find Shathrowar. Kalecgos event reseted."); EnterEvadeMode(EVADE_REASON_OTHER); return; } } CheckTimer = 1000; } else CheckTimer -= diff; if (ArcaneBuffetTimer <= diff) { DoCastAOE(SPELL_ARCANE_BUFFET); ArcaneBuffetTimer = 8000; } else ArcaneBuffetTimer -= diff; if (FrostBreathTimer <= diff) { DoCastAOE(SPELL_FROST_BREATH); FrostBreathTimer = 15000; } else FrostBreathTimer -= diff; if (TailLashTimer <= diff) { DoCastAOE(SPELL_TAIL_LASH); TailLashTimer = 15000; } else TailLashTimer -= diff; if (WildMagicTimer <= diff) { DoCastAOE(WildMagic[rand32() % 6]); WildMagicTimer = 20000; } else WildMagicTimer -= diff; if (SpectralBlastTimer <= diff) { ThreatContainer::StorageType const& m_threatlist = me->getThreatManager().getThreatList(); std::list<Unit*> targetList; for (ThreatContainer::StorageType::const_iterator itr = m_threatlist.begin(); itr!= m_threatlist.end(); ++itr) { Unit* target = (*itr)->getTarget(); if (target && target->GetTypeId() == TYPEID_PLAYER && (!target->GetVictim() || target->GetGUID() != me->EnsureVictim()->GetGUID()) && target->GetPositionZ() > me->GetPositionZ() - 5 && !target->HasAura(AURA_SPECTRAL_EXHAUSTION)) { targetList.push_back(target); } } if (targetList.empty()) { SpectralBlastTimer = 1000; return; } std::list<Unit*>::const_iterator i = targetList.begin(); advance(i, rand32() % targetList.size()); if ((*i)) { (*i)->CastSpell((*i), SPELL_SPECTRAL_BLAST, true); SpectralBlastTimer = 20000 + rand32() % 5000; } else SpectralBlastTimer = 1000; } else SpectralBlastTimer -= diff; DoMeleeAttackIfReady(); } }
void hyjalAI::UpdateAI(uint32 diff) { if (IsDummy) { if (MassTeleportTimer < diff && DoMassTeleport) { DoCast(me, SPELL_MASS_TELEPORT, false); DoMassTeleport = false; } else MassTeleportTimer -= diff; return; } if (DoHide) { DoHide = false; switch (me->GetEntry()) { case JAINA: if (instance->GetData(DATA_ALLIANCE_RETREAT)) { me->SetVisible(false); HideNearPos(me->GetPositionX(), me->GetPositionY()); HideNearPos(5037.76f, -1889.71f); for (uint8 i = 0; i < 92; ++i)//summon fires me->SummonGameObject(GO_ROARING_FLAME, AllianceFirePos[i][0], AllianceFirePos[i][1], AllianceFirePos[i][2], AllianceFirePos[i][3], AllianceFirePos[i][4], AllianceFirePos[i][5], AllianceFirePos[i][6], AllianceFirePos[i][7], 0); } else me->SetVisible(true); break; case THRALL: //thrall if (instance->GetData(DATA_HORDE_RETREAT)) { me->SetVisible(false); HideNearPos(me->GetPositionX(), me->GetPositionY()); HideNearPos(5563, -2763.19f); HideNearPos(5542.2f, -2629.36f); for (uint8 i = 0; i < 65; ++i)//summon fires me->SummonGameObject(GO_ROARING_FLAME, HordeFirePos[i][0], HordeFirePos[i][1], HordeFirePos[i][2], HordeFirePos[i][3], HordeFirePos[i][4], HordeFirePos[i][5], HordeFirePos[i][6], HordeFirePos[i][7], 0); } else me->SetVisible(true); break; } } if (DoRespawn) { if (RespawnTimer <= diff) { DoRespawn = false; RespawnNearPos(me->GetPositionX(), me->GetPositionY()); if (Faction == 0) { RespawnNearPos(5037.76f, -1889.71f); } else if (Faction == 1) { RespawnNearPos(5563, -2763.19f); RespawnNearPos(5542.2f, -2629.36f); } me->SetVisible(true); }else{ RespawnTimer -= diff; me->SetVisible(false); } return; } if (Overrun) DoOverrun(Faction, diff); if (bRetreat) { if (RetreatTimer <= diff) { IsDummy = true; bRetreat = false; HideNearPos(me->GetPositionX(), me->GetPositionY()); switch (me->GetEntry()) { case JAINA://jaina HideNearPos(5037.76f, -1889.71f); break; case THRALL://thrall HideNearPos(5563, -2763.19f); HideNearPos(5542.2f, -2629.36f); HideNearPos(5603.75f, -2853.12f); break; } me->SetVisible(false); } else RetreatTimer -= diff; } if (!EventBegun) return; if (Summon) { if (EnemyCount) { EnemyCount = instance->GetData(DATA_TRASH); if (!EnemyCount) NextWaveTimer = 5000; } if (NextWaveTimer <= diff) { if (Faction == 0) SummonNextWave(AllianceWaves, WaveCount, AllianceBase); else if (Faction == 1) SummonNextWave(HordeWaves, WaveCount, HordeBase); ++WaveCount; } else NextWaveTimer -= diff; } if (CheckTimer <= diff) { for (uint8 i = 0; i < 2; ++i) { if (BossGUID[i]) { Unit* unit = Unit::GetUnit(*me, BossGUID[i]); if (unit && (!unit->IsAlive())) { if (BossGUID[i] == BossGUID[0]) { Talk(INCOMING); FirstBossDead = true; } else if (BossGUID[i] == BossGUID[1]) { Talk(SUCCESS); SecondBossDead = true; } EventBegun = false; CheckTimer = 0; me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); BossGUID[i] = 0; instance->DoUpdateWorldState(WORLD_STATE_ENEMY, 0); // Reset world state for enemies to disable it } } } CheckTimer = 5000; } else CheckTimer -= diff; if (!UpdateVictim()) return; for (uint8 i = 0; i < HYJAL_AI_MAX_SPELLS; ++i) { if (Spells[i].SpellId) { if (SpellTimer[i] <= diff) { if (me->IsNonMeleeSpellCast(false)) me->InterruptNonMeleeSpells(false); Unit* target = NULL; switch (Spells[i].TargetType) { case TARGETTYPE_SELF: target = me; break; case TARGETTYPE_RANDOM: target = SelectTarget(SELECT_TARGET_RANDOM, 0); break; case TARGETTYPE_VICTIM: target = me->GetVictim(); break; } if (target && target->IsAlive()) { DoCast(target, Spells[i].SpellId); SpellTimer[i] = Spells[i].Cooldown; } } else SpellTimer[i] -= diff; } } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) override { if (!me->HasAura(AURA_SPECTRAL_INVISIBILITY)) me->CastSpell(me, AURA_SPECTRAL_INVISIBILITY, true); if (!UpdateVictim()) return; if (CheckTimer <= diff) { Creature* Kalec = ObjectAccessor::GetCreature(*me, KalecGUID); if (!Kalec || !Kalec->IsAlive()) { if (Creature* Kalecgos = ObjectAccessor::GetCreature(*me, KalecgosGUID)) Kalecgos->AI()->EnterEvadeMode(); return; } if (HealthBelowPct(10) && !isEnraged) { if (Creature* Kalecgos = ObjectAccessor::GetCreature(*me, KalecgosGUID)) Kalecgos->AI()->DoAction(DO_ENRAGE); DoAction(DO_ENRAGE); } Creature* Kalecgos = ObjectAccessor::GetCreature(*me, KalecgosGUID); if (Kalecgos && !Kalecgos->IsInCombat()) { EnterEvadeMode(); return; } if (!isBanished && HealthBelowPct(1)) { if (Kalecgos) { if (Kalecgos->HasAura(SPELL_BANISH)) { me->DealDamage(me, me->GetHealth()); return; } DoAction(DO_BANISH); } else { me->TextEmote(EMOTE_UNABLE_TO_FIND); EnterEvadeMode(); return; } } CheckTimer = 1000; } else CheckTimer -= diff; if (ResetThreat <= diff) { ThreatContainer::StorageType threatlist = me->getThreatManager().getThreatList(); for (ThreatContainer::StorageType::const_iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr) { if (Unit* unit = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid())) if (unit->GetPositionZ() > me->GetPositionZ() + 5) me->getThreatManager().modifyThreatPercent(unit, -100); } ResetThreat = 1000; } else ResetThreat -= diff; if (ShadowBoltTimer <= diff) { if (!(rand32() % 5)) Talk(SAY_SATH_SPELL1); DoCast(me, SPELL_SHADOW_BOLT); ShadowBoltTimer = 7000 + (rand32() % 3000); } else ShadowBoltTimer -= diff; if (AgonyCurseTimer <= diff) { Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1); if (!target) target = me->GetVictim(); DoCast(target, SPELL_AGONY_CURSE); AgonyCurseTimer = 20000; } else AgonyCurseTimer -= diff; if (CorruptionStrikeTimer <= diff) { if (!(rand32() % 5))Talk(SAY_SATH_SPELL2); DoCastVictim(SPELL_CORRUPTION_STRIKE); CorruptionStrikeTimer = 13000; } else CorruptionStrikeTimer -= diff; DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (IsEvent) { //Must update npc_escortAI npc_escortAI::UpdateAI(diff); if (!pGo) { pGo = true; if (pInstance) { AddWaypoint(0, 4896.08, -1576.35, 1333.65); AddWaypoint(1, 4898.68, -1615.02, 1329.48); AddWaypoint(2, 4907.12, -1667.08, 1321.00); AddWaypoint(3, 4963.18, -1699.35, 1340.51); AddWaypoint(4, 4989.16, -1716.67, 1335.74); AddWaypoint(5, 5026.27, -1736.89, 1323.02); AddWaypoint(6, 5037.77, -1770.56, 1324.36); AddWaypoint(7, 5067.23, -1789.95, 1321.17); Start(false, true); SetDespawnAtEnd(false); } } } //Return since we have no target if (!UpdateVictim()) return; if (SwarmTimer <= diff) { if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(pTarget, SPELL_CARRION_SWARM); SwarmTimer = urand(45000,60000); switch (urand(0,1)) { case 0: DoPlaySoundToSet(m_creature, SOUND_SWARM1); m_creature->MonsterYell(SAY_SWARM1, LANG_UNIVERSAL, 0); break; case 1: DoPlaySoundToSet(m_creature, SOUND_SWARM2); m_creature->MonsterYell(SAY_SWARM2, LANG_UNIVERSAL, 0); break; } } else SwarmTimer -= diff; if (SleepTimer <= diff) { for (uint8 i = 0; i < 3; ++i) { if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) pTarget->CastSpell(pTarget,SPELL_SLEEP,true); } SleepTimer = 60000; switch (urand(0,1)) { case 0: DoPlaySoundToSet(m_creature, SOUND_SLEEP1); m_creature->MonsterYell(SAY_SLEEP1, LANG_UNIVERSAL, 0); break; case 1: DoPlaySoundToSet(m_creature, SOUND_SLEEP2); m_creature->MonsterYell(SAY_SLEEP2, LANG_UNIVERSAL, 0); break; } } else SleepTimer -= diff; if (AuraTimer <= diff) { DoCast(m_creature, SPELL_VAMPIRIC_AURA, true); AuraTimer = urand(10000,20000); } else AuraTimer -= diff; if (InfernoTimer <= diff) { DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_INFERNO); InfernoTimer = 45000; switch (urand(0,1)) { case 0: DoPlaySoundToSet(m_creature, SOUND_INFERNO1); m_creature->MonsterYell(SAY_INFERNO1, LANG_UNIVERSAL, 0); break; case 1: DoPlaySoundToSet(m_creature, SOUND_INFERNO2); m_creature->MonsterYell(SAY_INFERNO2, LANG_UNIVERSAL, 0); break; } } else InfernoTimer -= diff; DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { //char buf[200]; //Return since we have no target if (!UpdateVictim()) return; if (!RootSelf) { //me->m_canMove = true; DoCast(me, 33356); RootSelf = true; } if (!bAggro && Line1Count == 0 && Line2Count == 0) { if (Aggro_Timer <= diff) { bAggro = true; // Visible now! me->SetDisplayId(9723); me->setFaction(14); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } else Aggro_Timer -= diff; } // Summon Dragon pack. 2 Dragons and 3 Whelps if (!bAggro && !SummonedRend && Line1Count > 0) { if (Dragons_Timer <= diff) { SummonCreatureWithRandomTarget(10372); SummonCreatureWithRandomTarget(10372); SummonCreatureWithRandomTarget(10442); SummonCreatureWithRandomTarget(10442); SummonCreatureWithRandomTarget(10442); Line1Count = Line1Count - 1; Dragons_Timer = 60000; } else Dragons_Timer -= diff; } //Summon Orc pack. 1 Orc Handler 1 Elite Dragonkin and 3 Whelps if (!bAggro && !SummonedRend && Line1Count == 0 && Line2Count > 0) { if (Orc_Timer <= diff) { SummonCreatureWithRandomTarget(10447); SummonCreatureWithRandomTarget(10317); SummonCreatureWithRandomTarget(10442); SummonCreatureWithRandomTarget(10442); SummonCreatureWithRandomTarget(10442); Line2Count = Line2Count - 1; Orc_Timer = 60000; } else Orc_Timer -= diff; } // we take part in the fight if (bAggro) { // CorrosiveAcid_Timer if (CorrosiveAcid_Timer <= diff) { DoCast(me->getVictim(), SPELL_CORROSIVEACID); CorrosiveAcid_Timer = 7000; } else CorrosiveAcid_Timer -= diff; // Freeze_Timer if (Freeze_Timer <= diff) { DoCast(me->getVictim(), SPELL_FREEZE); Freeze_Timer = 16000; } else Freeze_Timer -= diff; // Flamebreath_Timer if (Flamebreath_Timer <= diff) { DoCast(me->getVictim(), SPELL_FLAMEBREATH); Flamebreath_Timer = 10500; } else Flamebreath_Timer -= diff; //Summon Rend if (!SummonedRend && HealthBelowPct(11) && me->GetHealth() > 0) { //summon Rend and Change model to normal Gyth //Interrupt any spell casting me->InterruptNonMeleeSpells(false); //Gyth model me->SetDisplayId(9806); me->SummonCreature(10429, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 900000); SummonedRend = true; } DoMeleeAttackIfReady(); } // end if Aggro }
void UpdateAI(uint32 const /*diff*/) { UpdateVictim(); }
void UpdateAI(uint32 diff) override { if (IsIntroEvent) { if (instance->GetBossState(DATA_NETHEKURSE) == IN_PROGRESS) { if (IntroEvent_Timer <= diff) DoTauntPeons(); else IntroEvent_Timer -= diff; } } if (!UpdateVictim()) return; if (!IsMainEvent) return; if (Phase) { if (!SpinOnce) { DoCastVictim(SPELL_DARK_SPIN); SpinOnce = true; } if (Cleave_Timer <= diff) { DoCastVictim(SPELL_SHADOW_CLEAVE); Cleave_Timer = 6000 + rand32() % 2500; } else Cleave_Timer -= diff; } else { if (ShadowFissure_Timer <= diff) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) DoCast(target, SPELL_SHADOW_FISSURE); ShadowFissure_Timer = urand(7500, 15000); } else ShadowFissure_Timer -= diff; if (DeathCoil_Timer <= diff) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) DoCast(target, SPELL_DEATH_COIL); DeathCoil_Timer = urand(15000, 20000); } else DeathCoil_Timer -= diff; if (!HealthAbovePct(20)) Phase = true; DoMeleeAttackIfReady(); } }
void UpdateAI(const uint32 uiDiff) { if (!UpdateVictim()) return; if (!m_bIsPhaseTwo) { if (m_uiShadowWordPain_Timer <= uiDiff) { DoCast(me->getVictim(), SPELL_SHADOWWORDPAIN); m_uiShadowWordPain_Timer = 15000; } else m_uiShadowWordPain_Timer -= uiDiff; if (m_uiMark_Timer <= uiDiff) { Unit* pMarkedTarget = SelectTarget(SELECT_TARGET_RANDOM, 0); if (pMarkedTarget) { DoCast(pMarkedTarget, SPELL_MARK); MarkedTargetGUID = pMarkedTarget->GetGUID(); } else sLog->outError(LOG_FILTER_TSCR, "boss_arlokk could not accuire pMarkedTarget."); m_uiMark_Timer = 15000; } else m_uiMark_Timer -= uiDiff; } else { //Cleave_Timer if (m_uiCleave_Timer <= uiDiff) { DoCast(me->getVictim(), SPELL_CLEAVE); m_uiCleave_Timer = 16000; } else m_uiCleave_Timer -= uiDiff; //Gouge_Timer if (m_uiGouge_Timer <= uiDiff) { DoCast(me->getVictim(), SPELL_GOUGE); DoModifyThreatPercent(me->getVictim(), -80); m_uiGouge_Timer = 17000+rand()%10000; } else m_uiGouge_Timer -= uiDiff; } if (m_uiSummonCount <= 30) { if (m_uiSummon_Timer <= uiDiff) { DoSummonPhanters(); m_uiSummon_Timer = 5000; } else m_uiSummon_Timer -= uiDiff; } if (m_uiVanish_Timer <= uiDiff) { //Invisble Model me->SetDisplayId(MODEL_ID_BLANK); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->AttackStop(); DoResetThreat(); m_bIsVanished = true; m_uiVanish_Timer = 45000; m_uiVisible_Timer = 6000; } else m_uiVanish_Timer -= uiDiff; if (m_bIsVanished) { if (m_uiVisible_Timer <= uiDiff) { //The Panther Model me->SetDisplayId(MODEL_ID_PANTHER); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); const CreatureTemplate* cinfo = me->GetCreatureTemplate(); me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 35))); me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 35))); me->UpdateDamagePhysical(BASE_ATTACK); if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) AttackStart(target); m_bIsPhaseTwo = true; m_bIsVanished = false; } else m_uiVisible_Timer -= uiDiff; } else DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 uiDiff) { //Return since we have no target if (!UpdateVictim()) return; if (m_bIsAura) { // workaround for PULSING_SHOCKWAVE if (m_uiPulsingShockwave_Timer <= uiDiff) { Map* pMap = me->GetMap(); if (pMap->IsDungeon()) { Map::PlayerList const &PlayerList = pMap->GetPlayers(); if (PlayerList.isEmpty()) return; float fDist=0; for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) if (i->getSource() && i->getSource()->isAlive() && i->getSource()->isTargetableForAttack()) { float fDistTemp = me->GetExactDist(i->getSource()->GetPositionX(), i->getSource()->GetPositionY(), i->getSource()->GetPositionZ()); if (fDistTemp>fDist) fDist=fDistTemp; } int32 dmg= int32(DUNGEON_MODE(100, 150)*fDist); int32 range=200; me->CastCustomSpell(me->getVictim(), DUNGEON_MODE(52942, 59837), &dmg, &range, 0, false); } m_uiPulsingShockwave_Timer = 2000; } else m_uiPulsingShockwave_Timer -= uiDiff; } else { if (m_uiResumePulsingShockwave_Timer <= uiDiff) { //breaks at movement, can we assume when it's time, this spell is casted and also must stop movement? DoCast(me, SPELL_PULSING_SHOCKWAVE_AURA, true); DoCast(me, DUNGEON_MODE(SPELL_PULSING_SHOCKWAVE_N,SPELL_PULSING_SHOCKWAVE_H)); // need core support m_bIsAura = true; m_uiResumePulsingShockwave_Timer = 0; } else m_uiResumePulsingShockwave_Timer -= uiDiff; } if (m_uiArcLightning_Timer <= uiDiff) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) DoCast(target, SPELL_ARC_LIGHTNING); bHit=true; m_uiArcLightning_Timer = 15000 + rand()%1000; } else m_uiArcLightning_Timer -= uiDiff; if (m_uiLightningNova_Timer <= uiDiff) { DoScriptText(RAND(SAY_NOVA_1, SAY_NOVA_2, SAY_NOVA_3), me); DoScriptText(EMOTE_NOVA, me); DoCast(me, DUNGEON_MODE(SPELL_LIGHTNING_NOVA_N,SPELL_LIGHTNING_NOVA_H)); m_bIsAura = false; m_uiResumePulsingShockwave_Timer = DUNGEON_MODE(5000, 4000); // Pause Pulsing Shockwave aura m_uiLightningNova_Timer = 20000 + rand()%1000; } else m_uiLightningNova_Timer -= uiDiff; // Health check if (HealthBelowPct(100 - 25 * m_uiHealthAmountModifier)) { switch (m_uiHealthAmountModifier) { case 1: DoScriptText(SAY_75HEALTH, me); break; case 2: DoScriptText(SAY_50HEALTH, me); break; case 3: DoScriptText(SAY_25HEALTH, me); break; } ++m_uiHealthAmountModifier; } DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; // Evade if too far if (check_Timer <= diff) { float x, y, z, o; me->GetHomePosition(x, y, z, o); if (!me->IsWithinDist3d(x, y, z, 60)) { EnterEvadeMode(); return; } check_Timer = 1000; } else check_Timer -= diff; // Spore Striders if (IsHeroic() && SporeStriders_Timer <= diff) { DoCast(me, SPELL_SUMMON_SPORE_STRIDER); SporeStriders_Timer = 10000+rand()%5000; } else SporeStriders_Timer -= diff; // Levitate if (LevitatedTarget) { if (LevitatedTarget_Timer <= diff) { if (Unit *pTarget = Unit::GetUnit(*me, LevitatedTarget)) { if (!pTarget->HasAura(SPELL_LEVITATE)) { LevitatedTarget = 0; return; } if (InAir) { pTarget->AddAura(SPELL_SUSPENSION, pTarget); LevitatedTarget = 0; } else { pTarget->CastSpell(pTarget, SPELL_MAGNETIC_PULL, true); InAir = true; LevitatedTarget_Timer = 1500; } } else LevitatedTarget = 0; } else LevitatedTarget_Timer -= diff; } if (Levitate_Timer <= diff) { if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 1)) { DoCast(pTarget, SPELL_LEVITATE); LevitatedTarget = pTarget->GetGUID(); LevitatedTarget_Timer = 2000; InAir = false; } Levitate_Timer = 12000+rand()%3000; } else Levitate_Timer -= diff; // Chain Lightning if (ChainLightning_Timer <= diff) { if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0)) DoCast(pTarget, SPELL_CHAIN_LIGHTNING); ChainLightning_Timer = 7000; } else ChainLightning_Timer -= diff; // Static Charge if (StaticCharge_Timer <= diff) { if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 30, true)) DoCast(pTarget, SPELL_STATIC_CHARGE); StaticCharge_Timer = 10000; } else StaticCharge_Timer -= diff; DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) override { events.Update(diff); // Speech if (!UpdateVictim()) { while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_SPEECH_1: Talk(SAY_LINE1); me->SetStandState(UNIT_STAND_STATE_STAND); me->HandleEmoteCommand(EMOTE_ONESHOT_TALK); events.ScheduleEvent(EVENT_SPEECH_2, 12000); break; case EVENT_SPEECH_2: Talk(SAY_LINE2); me->HandleEmoteCommand(EMOTE_ONESHOT_TALK); events.ScheduleEvent(EVENT_SPEECH_3, 12000); break; case EVENT_SPEECH_3: Talk(SAY_LINE3); me->HandleEmoteCommand(EMOTE_ONESHOT_TALK); events.ScheduleEvent(EVENT_SPEECH_4, 16000); break; case EVENT_SPEECH_4: me->setFaction(103); if (PlayerGUID && ObjectAccessor::GetUnit(*me, PlayerGUID)) AttackStart(ObjectAccessor::GetUnit(*me, PlayerGUID));; break; } } return; } if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_CLEAVE: events.ScheduleEvent(EVENT_CLEAVE, 15000); DoCastVictim(SPELL_CLEAVE); break; case EVENT_FLAMEBREATH: DoCastVictim(SPELL_FLAMEBREATH); events.ScheduleEvent(EVENT_FLAMEBREATH, urand(8000, 14000)); break; case EVENT_FIRENOVA: DoCastVictim(SPELL_FIRENOVA); events.ScheduleEvent(EVENT_FIRENOVA, 15000); break; case EVENT_TAILSWIPE: //Only cast if we are behind /*if (!me->HasInArc(M_PI, me->GetVictim())) { DoCast(me->GetVictim(), SPELL_TAILSWIPE); }*/ events.ScheduleEvent(EVENT_TAILSWIPE, 15000); break; case EVENT_BURNINGADRENALINE_CASTER: { Unit* target = NULL; uint8 i = 0; while (i < 3) // max 3 tries to get a random target with power_mana { ++i; target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true); // not aggro leader if (target && target->getPowerType() == POWER_MANA) i = 3; } if (target) // cast on self (see below) target->CastSpell(target, SPELL_BURNINGADRENALINE, true); } events.ScheduleEvent(EVENT_BURNINGADRENALINE_CASTER, 15000); break; case EVENT_BURNINGADRENALINE_TANK: // have the victim cast the spell on himself otherwise the third effect aura will be applied to Vael instead of the player me->EnsureVictim()->CastSpell(me->GetVictim(), SPELL_BURNINGADRENALINE, true); events.ScheduleEvent(EVENT_BURNINGADRENALINE_TANK, 45000); break; } } // Yell if hp lower than 15% if (HealthBelowPct(15) && !HasYelled) { Talk(SAY_HALFLIFE); HasYelled = true; } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) { if(!UpdateVictim()) return; ThreatContainer::StorageType threatlist = me->getThreatManager().getThreatList(); ThreatContainer::StorageType::const_iterator i = threatlist.begin(); events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; while(uint32 eventId = events.ExecuteEvent()) { switch(eventId) { case EVENT_DISTANCE: distanceMelee = true; for (i = threatlist.begin(); i != threatlist.end(); ++i) { if (Unit* player = Unit::GetUnit(*me, (*i)->getUnitGuid())) if (player && (player->GetTypeId() == TYPEID_PLAYER) && me->IsWithinMeleeRange(player, 5.0f)) { distanceMelee = false; break; } } if (distanceMelee) events.ScheduleEvent(EVENT_SEETHE, 2*IN_MILLISECONDS); events.ScheduleEvent(EVENT_DISTANCE, 200); break; case EVENT_SEETHE: me->CastSpell(me->getVictim(), SPELL_SEETHE); distanceMelee = false; break; case EVENT_ENDLESS_RAGE: me->CastSpell(me->getVictim(), SPELL_ENDLESS_RAGE); Talk(SAY_ENDLESS_RAGE); break; case EVENT_GROWING_ANGER: me->CastSpell(me, SPELL_GROWING_ANGER); Talk(SAY_GROWING_ANGER); break; case EVENT_PHASE_GROWING_ANGER: events.SetPhase(PHASE_GROWING_ANGER); events.ScheduleEvent(EVENT_ENDLESS_RAGE, 20*IN_MILLISECONDS); events.ScheduleEvent(EVENT_GROWING_ANGER, urand(30*IN_MILLISECONDS, 35*IN_MILLISECONDS)); events.ScheduleEvent(EVENT_UNLEASHED_WRATH, 50*IN_MILLISECONDS); break; case EVENT_UNLEASHED_WRATH: DoCast(SPELL_UNLEASHED_WRATH); events.SetPhase(PHASE_UNLEASHED_WRATH); events.ScheduleEvent(EVENT_PHASE_GROWING_ANGER, 25*IN_MILLISECONDS, 0, PHASE_GROWING_ANGER); events.ScheduleEvent(EVENT_ENDLESS_RAGE, 15*IN_MILLISECONDS); break; case EVENT_BERSERK: DoCast(SPELL_BERSERK); break; default: break; } } DoMeleeAttackIfReady(); }
void boss_kalecgos::boss_kalecgosAI::UpdateAI(const uint32 diff) { if(TalkTimer) { if(!TalkSequence) { me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE + UNIT_FLAG_NOT_SELECTABLE); me->InterruptNonMeleeSpells(true); me->RemoveAllAuras(); me->DeleteThreatList(); me->CombatStop(); TalkSequence++; if(pInstance) { pInstance->HandleGameObject(pInstance->GetData64(DATA_GO_FORECEFIELD_COLL_1),true); pInstance->HandleGameObject(pInstance->GetData64(DATA_GO_FORECEFIELD_COLL_2),true); } } if(TalkTimer <= diff) { if(isFriendly) GoodEnding(); else BadEnding(); TalkSequence++; }else TalkTimer -= diff; } else { if (!UpdateVictim()) return; if(!doorClosed) { if(Close_Timer <= diff) { if(pInstance) { pInstance->HandleGameObject(pInstance->GetData64(DATA_GO_FORECEFIELD_COLL_1),false); pInstance->HandleGameObject(pInstance->GetData64(DATA_GO_FORECEFIELD_COLL_2),false); doorClosed = true; } Close_Timer = 10000; }else Close_Timer -= diff; } if(ResetThreat <= diff) { if ( ( me->getVictim()->HasAuraEffect(AURA_SPECTRAL_REALM,0)) && (me->getVictim()->GetTypeId() == TYPEID_PLAYER) ) { for(std::list<HostileReference*>::iterator itr = me->getThreatManager().getThreatList().begin(); itr != me->getThreatManager().getThreatList().end(); ++itr) { if(((*itr)->getUnitGuid()) == (me->getVictim()->GetGUID())) { (*itr)->removeReference(); break; } } } if(me->getVictim() && (me->getVictim()->HasAuraEffect(AURA_SPECTRAL_REALM,0) || me->GetPositionZ() < DRAGON_REALM_Z-10)) me->getThreatManager().modifyThreatPercent(me->getVictim(), -100); ResetThreat = 1000; }else ResetThreat -= diff; if(CheckTimer <= diff) { if (((me->GetHealth()*100 / me->GetMaxHealth()) < 10) && !isEnraged) { Unit* Sath = Unit::GetUnit(*me, SathGUID); if(Sath) { Sath->CastSpell(Sath, SPELL_ENRAGE, true); CAST_AI(boss_sathrovarr::boss_sathrovarrAI,((Creature*)Sath)->AI())->isEnraged = true; } DoCast(me, SPELL_ENRAGE, true); isEnraged = true; } if(!isBanished && (me->GetHealth()*100)/me->GetMaxHealth() < 1) { if(Unit *Sath = Unit::GetUnit(*me, SathGUID)) { if(CAST_AI(boss_sathrovarr::boss_sathrovarrAI,((Creature*)Sath)->AI())->isBanished) { Sath->DealDamage(Sath, Sath->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); return; } else { DoCast(me, SPELL_BANISH); isBanished = true; } } else { sLog->outError("TSCR: Didn't find Shathrowar. Kalecgos event reseted."); EnterEvadeMode(); return; } } CheckTimer = 1000; }else CheckTimer -= diff; if(ArcaneBuffetTimer <= diff) { if(TryDoCastAOE(SPELL_ARCANE_BUFFET)) ArcaneBuffetTimer = 8000; }else ArcaneBuffetTimer -= diff; if(FrostBreathTimer <= diff) { if(TryDoCastAOE(SPELL_FROST_BREATH)) FrostBreathTimer = 15000; }else FrostBreathTimer -= diff; if(TailLashTimer <= diff) { if(TryDoCastAOE(SPELL_TAIL_LASH)) TailLashTimer = 15000; }else TailLashTimer -= diff; if(WildMagicTimer <= diff) { if(TryDoCastAOE(WildMagic[rand()%6])) WildMagicTimer = 20000; }else WildMagicTimer -= diff; if(SpectralBlastTimer <= diff) { //this is a hack. we need to find a victim without aura in core Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true); if( target && target->isAlive() && !(target->HasAuraEffect(AURA_SPECTRAL_EXHAUSTION, 0)) ) { if(TryDoCast(target, SPELL_SPECTRAL_BLAST)) SpectralBlastTimer = 20000+(rand()%5000); } else { SpectralBlastTimer = 1000; } }else SpectralBlastTimer -= diff; DoMeleeAttackIfReady(); } };
void UpdateAI(const uint32 diff) { if (!UpdateVictim() ) return; //Shimmer_Timer Timer if (Shimmer_Timer < diff) { //Remove old vurlnability spell if (CurrentVurln_Spell) m_creature->RemoveAurasDueToSpell(CurrentVurln_Spell); //Cast new random vurlnabilty on self uint32 spell; switch (rand()%5) { case 0: spell = SPELL_FIRE_VURNALBILTY; break; case 1: spell = SPELL_FROST_VURNALBILTY; break; case 2: spell = SPELL_SHADOW_VURNALBILTY; break; case 3: spell = SPELL_NATURE_VURNALBILTY; break; case 4: spell = SPELL_ARCANE_VURNALBILTY; break; } DoCast(m_creature,spell); CurrentVurln_Spell = spell; DoScriptText(EMOTE_SHIMMER, m_creature); Shimmer_Timer = 45000; }else Shimmer_Timer -= diff; //Breath1_Timer if (Breath1_Timer < diff) { DoCast(m_creature->getVictim(),Breath1_Spell); Breath1_Timer = 60000; }else Breath1_Timer -= diff; //Breath2_Timer if (Breath2_Timer < diff) { DoCast(m_creature->getVictim(),Breath2_Spell); Breath2_Timer = 60000; }else Breath2_Timer -= diff; //Affliction_Timer if (Affliction_Timer < diff) { uint32 SpellAfflict = 0; switch (rand()%5) { case 0: SpellAfflict = SPELL_BROODAF_BLUE; break; case 1: SpellAfflict = SPELL_BROODAF_BLACK; break; case 2: SpellAfflict = SPELL_BROODAF_RED; break; case 3: SpellAfflict = SPELL_BROODAF_BRONZE; break; case 4: SpellAfflict = SPELL_BROODAF_GREEN; break; } std::list<HostilReference*>::iterator i; for (i = m_creature->getThreatManager().getThreatList().begin();i != m_creature->getThreatManager().getThreatList().end();) { Unit* pUnit = NULL; pUnit = Unit::GetUnit((*m_creature), (*i)->getUnitGuid()); ++i; if (pUnit) { //Cast affliction DoCast(pUnit, SpellAfflict, true); //Chromatic mutation if target is effected by all afflictions if (pUnit->HasAura(SPELL_BROODAF_BLUE,0) && pUnit->HasAura(SPELL_BROODAF_BLACK,0) && pUnit->HasAura(SPELL_BROODAF_RED,0) && pUnit->HasAura(SPELL_BROODAF_BRONZE,0) && pUnit->HasAura(SPELL_BROODAF_GREEN,0)) { //target->RemoveAllAuras(); //DoCast(target,SPELL_CHROMATIC_MUT_1); //Chromatic mutation is causing issues //Assuming it is caused by a lack of core support for Charm //So instead we instant kill our target //WORKAROUND if (pUnit->GetTypeId() == TYPEID_PLAYER) pUnit->CastSpell(pUnit, 5, false); } } } Affliction_Timer = 10000; }else Affliction_Timer -= diff; //Frenzy_Timer if (Frenzy_Timer < diff) { DoCast(m_creature,SPELL_FRENZY); DoScriptText(EMOTE_FRENZY, m_creature); Frenzy_Timer = 10000 + (rand() % 5000); }else Frenzy_Timer -= diff; //Enrage if not already enraged and below 20% if (!Enraged && (m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 20) { DoCast(m_creature,SPELL_ENRAGE); Enraged = true; } 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_PHANTOM_BLAST: DoCastVictim(SPELL_PHANTOM_BLAST); events.ScheduleEvent(EVENT_PHANTOM_BLAST, 5000); break; case EVENT_MIRRORED_SOUL: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0, true)) { mirroredSoulTarget = target->GetGUID(); DoCast(target, SPELL_MIRRORED_SOUL); DoScriptText(EMOTE_MIRRORED_SOUL, me); } events.ScheduleEvent(EVENT_MIRRORED_SOUL, urand(15000, 30000)); break; case EVENT_WELL_OF_SOULS: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) DoCast(target, SPELL_WELL_OF_SOULS); events.ScheduleEvent(EVENT_WELL_OF_SOULS, 20000); break; case EVENT_UNLEASHED_SOULS: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) DoCast(target, SPELL_UNLEASHED_SOULS); me->SetDisplayId(DISPLAY_SORROW); DoScriptText(RAND(SAY_FACE_ANGER_UNLEASH_SOUL, SAY_FACE_SORROW_UNLEASH_SOUL, SAY_FACE_DESIRE_UNLEASH_SOUL), me); DoScriptText(EMOTE_UNLEASH_SOUL, me); events.ScheduleEvent(EVENT_UNLEASHED_SOULS, 30000); events.ScheduleEvent(EVENT_FACE_ANGER, 5000); break; case EVENT_FACE_ANGER: me->SetDisplayId(DISPLAY_ANGER); break; case EVENT_WAILING_SOULS: me->SetDisplayId(DISPLAY_DESIRE); DoScriptText(RAND(SAY_FACE_ANGER_WAILING_SOUL, SAY_FACE_DESIRE_WAILING_SOUL), me); DoScriptText(EMOTE_WAILING_SOUL, me); DoCast(me, SPELL_WAILING_SOULS_STARTING); if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) { me->SetOrientation(me->GetAngle(target)); DoCast(me, SPELL_WAILING_SOULS_BEAM); } beamAngle = me->GetOrientation(); beamAngleDiff = M_PI/30.0f; // PI/2 in 15 sec = PI/30 per tick if (RAND(true, false)) beamAngleDiff = -beamAngleDiff; me->InterruptNonMeleeSpells(false); me->SetReactState(REACT_PASSIVE); //Remove any target me->SetTarget(0); me->GetMotionMaster()->Clear(); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE); wailingSoulTick = 15; events.DelayEvents(18000); // no other events during wailing souls events.ScheduleEvent(EVENT_WAILING_SOULS_TICK, 3000); // first one after 3 secs. break; case EVENT_WAILING_SOULS_TICK: beamAngle += beamAngleDiff; me->SetOrientation(beamAngle); me->StopMoving(); DoCast(me, SPELL_WAILING_SOULS); if (--wailingSoulTick) events.ScheduleEvent(EVENT_WAILING_SOULS_TICK, 1000); else { me->SetReactState(REACT_AGGRESSIVE); me->SetDisplayId(DISPLAY_ANGER); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE); me->GetMotionMaster()->MoveChase(me->getVictim()); events.ScheduleEvent(EVENT_WAILING_SOULS, urand(60000, 70000)); } break; } } DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; if (me->getVictim() && me->isAlive()) { if (HealthAbovePct(50)) { if (Charge_Timer <= diff) { if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) { DoCast(pTarget, SPELL_CHARGE); AttackStart(pTarget); } Charge_Timer = 15000 + rand()%15000; } else Charge_Timer -= diff; if (SonicBurst_Timer <= diff) { DoCast(me->getVictim(), SPELL_SONICBURST); SonicBurst_Timer = 8000 + rand()%5000; } else SonicBurst_Timer -= diff; if (Screech_Timer <= diff) { DoCast(me->getVictim(), SPELL_SCREECH); Screech_Timer = 18000 + rand()%8000; } else Screech_Timer -= diff; if (SpawnBats_Timer <= diff) { Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0); Creature* Bat = NULL; Bat = me->SummonCreature(11368, -12291.6220f, -1380.2640f, 144.8304f, 5.483f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (pTarget && Bat) Bat ->AI()->AttackStart(pTarget); Bat = me->SummonCreature(11368, -12289.6220f, -1380.2640f, 144.8304f, 5.483f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (pTarget && Bat) Bat ->AI()->AttackStart(pTarget); Bat = me->SummonCreature(11368, -12293.6220f, -1380.2640f, 144.8304f, 5.483f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (pTarget && Bat) Bat ->AI()->AttackStart(pTarget); Bat = me->SummonCreature(11368, -12291.6220f, -1380.2640f, 144.8304f, 5.483f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (pTarget && Bat) Bat ->AI()->AttackStart(pTarget); Bat = me->SummonCreature(11368, -12289.6220f, -1380.2640f, 144.8304f, 5.483f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (pTarget && Bat) Bat ->AI()->AttackStart(pTarget); Bat = me->SummonCreature(11368, -12293.6220f, -1380.2640f, 144.8304f, 5.483f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (pTarget && Bat) Bat ->AI()->AttackStart(pTarget); SpawnBats_Timer = 60000; } else SpawnBats_Timer -= diff; } else { if (PhaseTwo) { if (PhaseTwo && ShadowWordPain_Timer <= diff) { if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) { DoCast(pTarget, SPELL_SHADOW_WORD_PAIN); ShadowWordPain_Timer = 12000 + rand()%6000; } }ShadowWordPain_Timer -=diff; if (MindFlay_Timer <= diff) { DoCast(me->getVictim(), SPELL_MIND_FLAY); MindFlay_Timer = 16000; }MindFlay_Timer -=diff; if (ChainMindFlay_Timer <= diff) { me->InterruptNonMeleeSpells(false); DoCast(me->getVictim(), SPELL_CHAIN_MIND_FLAY); ChainMindFlay_Timer = 15000 + rand()%15000; }ChainMindFlay_Timer -=diff; if (GreaterHeal_Timer <= diff) { me->InterruptNonMeleeSpells(false); DoCast(me, SPELL_GREATERHEAL); GreaterHeal_Timer = 25000 + rand()%10000; }GreaterHeal_Timer -=diff; if (SpawnFlyingBats_Timer <= diff) { Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0); if (!pTarget) return; Creature* FlyingBat = me->SummonCreature(14965, pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ()+15, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (FlyingBat) FlyingBat->AI()->AttackStart(pTarget); SpawnFlyingBats_Timer = 10000 + rand()%5000; } else SpawnFlyingBats_Timer -=diff; } else { me->SetDisplayId(15219); DoResetThreat(); PhaseTwo = true; } } DoMeleeAttackIfReady(); } }