void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; if (CloseDoorTimer) { if (CloseDoorTimer <= diff) { if (instance) { instance->HandleGameObject(instance->GetData64(DATA_GO_LIBRARY_DOOR), false); CloseDoorTimer = 0; } } else CloseDoorTimer -= diff; } //Cooldowns for casts if (ArcaneCooldown) { if (ArcaneCooldown >= diff) ArcaneCooldown -= diff; else ArcaneCooldown = 0; } if (FireCooldown) { if (FireCooldown >= diff) FireCooldown -= diff; else FireCooldown = 0; } if (FrostCooldown) { if (FrostCooldown >= diff) FrostCooldown -= diff; else FrostCooldown = 0; } if (!Drinking && me->GetMaxPower(POWER_MANA) && (me->GetPower(POWER_MANA)*100 / me->GetMaxPower(POWER_MANA)) < 20) { Drinking = true; me->InterruptNonMeleeSpells(false); Talk(SAY_DRINK); if (!DrinkInturrupted) { DoCast(me, SPELL_MASS_POLY, true); DoCast(me, SPELL_CONJURE, false); DoCast(me, SPELL_DRINK, false); me->SetStandState(UNIT_STAND_STATE_SIT); DrinkInterruptTimer = 10000; } } //Drink Interrupt if (Drinking && DrinkInturrupted) { Drinking = false; me->RemoveAurasDueToSpell(SPELL_DRINK); me->SetStandState(UNIT_STAND_STATE_STAND); me->SetPower(POWER_MANA, me->GetMaxPower(POWER_MANA)-32000); DoCast(me, SPELL_POTION, false); } //Drink Interrupt Timer if (Drinking && !DrinkInturrupted) { if (DrinkInterruptTimer >= diff) DrinkInterruptTimer -= diff; else { me->SetStandState(UNIT_STAND_STATE_STAND); DoCast(me, SPELL_POTION, true); DoCast(me, SPELL_AOE_PYROBLAST, false); DrinkInturrupted = true; Drinking = false; } } //Don't execute any more code if we are drinking if (Drinking) return; //Normal casts if (NormalCastTimer <= diff) { if (!me->IsNonMeleeSpellCasted(false)) { Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true); if (!target) return; uint32 Spells[3]; uint8 AvailableSpells = 0; //Check for what spells are not on cooldown if (!ArcaneCooldown) { Spells[AvailableSpells] = SPELL_ARCMISSLE; ++AvailableSpells; } if (!FireCooldown) { Spells[AvailableSpells] = SPELL_FIREBALL; ++AvailableSpells; } if (!FrostCooldown) { Spells[AvailableSpells] = SPELL_FROSTBOLT; ++AvailableSpells; } //If no available spells wait 1 second and try again if (AvailableSpells) { CurrentNormalSpell = Spells[rand() % AvailableSpells]; DoCast(target, CurrentNormalSpell); } } NormalCastTimer = 1000; } else NormalCastTimer -= diff; if (SecondarySpellTimer <= diff) { switch (urand(0, 1)) { case 0: DoCast(me, SPELL_AOE_CS); break; case 1: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(target, SPELL_CHAINSOFICE); break; } SecondarySpellTimer = urand(5000, 20000); } else SecondarySpellTimer -= diff; if (SuperCastTimer <= diff) { uint8 Available[2]; switch (LastSuperSpell) { case SUPER_AE: Available[0] = SUPER_FLAME; Available[1] = SUPER_BLIZZARD; break; case SUPER_FLAME: Available[0] = SUPER_AE; Available[1] = SUPER_BLIZZARD; break; case SUPER_BLIZZARD: Available[0] = SUPER_FLAME; Available[1] = SUPER_AE; break; } LastSuperSpell = Available[urand(0, 1)]; switch (LastSuperSpell) { case SUPER_AE: Talk(SAY_EXPLOSION); DoCast(me, SPELL_BLINK_CENTER, true); DoCast(me, SPELL_PLAYERPULL, true); DoCast(me, SPELL_MASSSLOW, true); DoCast(me, SPELL_AEXPLOSION, false); break; case SUPER_FLAME: Talk(SAY_FLAMEWREATH); FlameWreathTimer = 20000; FlameWreathCheckTime = 500; FlameWreathTarget[0] = 0; FlameWreathTarget[1] = 0; FlameWreathTarget[2] = 0; FlameWreathEffect(); break; case SUPER_BLIZZARD: Talk(SAY_BLIZZARD); if (Creature* pSpawn = me->SummonCreature(CREATURE_ARAN_BLIZZARD, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 25000)) { pSpawn->setFaction(me->getFaction()); pSpawn->CastSpell(pSpawn, SPELL_CIRCULAR_BLIZZARD, false); } break; } SuperCastTimer = urand(35000, 40000); } else SuperCastTimer -= diff; if (!ElementalsSpawned && HealthBelowPct(40)) { ElementalsSpawned = true; for (uint32 i = 0; i < 4; ++i) { if (Creature* unit = me->SummonCreature(CREATURE_WATER_ELEMENTAL, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 90000)) { unit->Attack(me->getVictim(), true); unit->setFaction(me->getFaction()); } } Talk(SAY_ELEMENTALS); } if (BerserkTimer <= diff) { for (uint32 i = 0; i < 5; ++i) { if (Creature* unit = me->SummonCreature(CREATURE_SHADOW_OF_ARAN, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000)) { unit->Attack(me->getVictim(), true); unit->setFaction(me->getFaction()); } } Talk(SAY_TIMEOVER); BerserkTimer = 60000; } else BerserkTimer -= diff; //Flame Wreath check if (FlameWreathTimer) { if (FlameWreathTimer >= diff) FlameWreathTimer -= diff; else FlameWreathTimer = 0; if (FlameWreathCheckTime <= diff) { for (uint8 i = 0; i < 3; ++i) { if (!FlameWreathTarget[i]) continue; Unit* unit = Unit::GetUnit(*me, FlameWreathTarget[i]); if (unit && !unit->IsWithinDist2d(FWTargPosX[i], FWTargPosY[i], 3)) { unit->CastSpell(unit, 20476, true, 0, 0, me->GetGUID()); unit->CastSpell(unit, 11027, true); FlameWreathTarget[i] = 0; } } FlameWreathCheckTime = 500; } else FlameWreathCheckTime -= diff; } if (ArcaneCooldown && FireCooldown && FrostCooldown) DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim() ) return; if(CloseDoorTimer) { if(CloseDoorTimer <= diff) { if(pInstance) { if(GameObject* Door = GameObject::GetGameObject(*m_creature, pInstance->GetData64(DATA_GAMEOBJECT_LIBRARY_DOOR))) Door->SetGoState(1); CloseDoorTimer = 0; } }else CloseDoorTimer -= diff; } //Cooldowns for casts if (ArcaneCooldown) { if (ArcaneCooldown >= diff) ArcaneCooldown -= diff; else ArcaneCooldown = 0; } if (FireCooldown) { if (FireCooldown >= diff) FireCooldown -= diff; else FireCooldown = 0; } if (FrostCooldown) { if (FrostCooldown >= diff) FrostCooldown -= diff; else FrostCooldown = 0; } if(!Drinking && m_creature->GetMaxPower(POWER_MANA) && (m_creature->GetPower(POWER_MANA)*100 / m_creature->GetMaxPower(POWER_MANA)) < 20) { Drinking = true; m_creature->InterruptNonMeleeSpells(false); DoScriptText(SAY_DRINK, m_creature); if (!DrinkInturrupted) { m_creature->CastSpell(m_creature, SPELL_MASS_POLY, true); m_creature->CastSpell(m_creature, SPELL_CONJURE, false); m_creature->CastSpell(m_creature, SPELL_DRINK, false); //Sitting down m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, 1); DrinkInturruptTimer = 10000; } } //Drink Inturrupt if (Drinking && DrinkInturrupted) { Drinking = false; m_creature->RemoveAurasDueToSpell(SPELL_DRINK); m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); m_creature->SetPower(POWER_MANA, m_creature->GetMaxPower(POWER_MANA)-32000); m_creature->CastSpell(m_creature, SPELL_POTION, false); } //Drink Inturrupt Timer if (Drinking && !DrinkInturrupted) if (DrinkInturruptTimer >= diff) DrinkInturruptTimer -= diff; else { m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); m_creature->CastSpell(m_creature, SPELL_POTION, true); m_creature->CastSpell(m_creature, SPELL_AOE_PYROBLAST, false); DrinkInturrupted = true; Drinking = false; } //Don't execute any more code if we are drinking if (Drinking) return; //Normal casts if(NormalCastTimer < diff) { if (!m_creature->IsNonMeleeSpellCasted(false)) { Unit* target = NULL; target = SelectUnit(SELECT_TARGET_RANDOM, 0); if (!target) return; uint32 Spells[3]; uint8 AvailableSpells = 0; //Check for what spells are not on cooldown if (!ArcaneCooldown) { Spells[AvailableSpells] = SPELL_ARCMISSLE; AvailableSpells++; } if (!FireCooldown) { Spells[AvailableSpells] = SPELL_FIREBALL; AvailableSpells++; } if (!FrostCooldown) { Spells[AvailableSpells] = SPELL_FROSTBOLT; AvailableSpells++; } //If no available spells wait 1 second and try again if (AvailableSpells) { CurrentNormalSpell = Spells[rand() % AvailableSpells]; if(!m_creature->hasUnitState(UNIT_STAT_CASTING)) { m_creature->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, false); m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_INTERRUPT, false); } DoCast(target, CurrentNormalSpell); } } NormalCastTimer = 1000; }else NormalCastTimer -= diff; if(SecondarySpellTimer < diff) { switch (rand()%2) { case 0: DoCast(m_creature, SPELL_AOE_CS); break; case 1: if (Unit* pUnit = SelectUnit(SELECT_TARGET_RANDOM, 0)) DoCast(pUnit, SPELL_CHAINSOFICE); break; } SecondarySpellTimer = 5000 + (rand()%15000); }else SecondarySpellTimer -= diff; if(SuperCastTimer < diff) { uint8 Available[2]; switch (LastSuperSpell) { case SUPER_AE: Available[0] = SUPER_FLAME; Available[1] = SUPER_BLIZZARD; break; case SUPER_FLAME: Available[0] = SUPER_AE; Available[1] = SUPER_BLIZZARD; break; case SUPER_BLIZZARD: Available[0] = SUPER_FLAME; Available[1] = SUPER_AE; break; } LastSuperSpell = Available[rand()%2]; Map::PlayerList const &PlayerList = pInstance->instance->GetPlayers(); WorldPacket data; switch (LastSuperSpell) { case SUPER_AE: if (rand()%2) DoScriptText(SAY_EXPLOSION1, m_creature); else DoScriptText(SAY_EXPLOSION2, m_creature); m_creature->CastSpell(m_creature, SPELL_BLINK_CENTER, true); x_cord = -11165.07; y_cord = -1912.07; z_cord = 232; m_creature->Relocate(x_cord,y_cord,z_cord,0); m_creature->BuildTeleportAckMsg(&data, x_cord, y_cord, z_cord, 0); m_creature->SendMessageToSet(&data, false); for(Map::PlayerList::const_iterator x = PlayerList.begin(); x != PlayerList.end(); ++x) { if (Player* i_pl = x->getSource()) { if (i_pl->isAlive() && i_pl->GetDistance2d(m_creature->GetPositionX(),m_creature->GetPositionY())<80) { i_pl->TeleportTo(m_creature->GetMapId(),x_cord,y_cord,z_cord,i_pl->GetOrientation(),TELE_TO_NOT_LEAVE_COMBAT | TELE_TO_NOT_UNSUMMON_PET); } } } m_creature->ApplySpellImmune(0, IMMUNITY_EFFECT , SPELL_EFFECT_INTERRUPT_CAST, true); m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_INTERRUPT, true); m_creature->CastSpell(m_creature, SPELL_PLAYERPULL, true); m_creature->CastSpell(m_creature, SPELL_MASSSLOW, true); AETimer = 1500; CastAE = true; break; case SUPER_FLAME: if (rand()%2) DoScriptText(SAY_FLAMEWREATH1, m_creature); else DoScriptText(SAY_FLAMEWREATH2, m_creature); FlameWreathTimer = 20000; FlameWreathCheckTime = 500; FlameWreathTarget[0] = 0; FlameWreathTarget[1] = 0; FlameWreathTarget[2] = 0; FlameWreathEffect(); break; case SUPER_BLIZZARD: if (rand()%2) DoScriptText(SAY_BLIZZARD1, m_creature); else DoScriptText(SAY_BLIZZARD2, m_creature); Creature* Spawn = NULL; Spawn = DoSpawnCreature(CREATURE_ARAN_BLIZZARD, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 25000); if (Spawn) { Spawn->setFaction(m_creature->getFaction()); Spawn->CastSpell(Spawn, SPELL_CIRCULAR_BLIZZARD, false); } break; } SuperCastTimer = 35000 + (rand()%5000); }else SuperCastTimer -= diff; if(!ElementalsSpawned && m_creature->GetHealth()*100 / m_creature->GetMaxHealth() < 40) { ElementalsSpawned = true; for (uint32 i = 0; i < 4; i++) { float xm,ym = 0; switch(i) { case 0: xm = -11191.08; ym = -1909.36; break; case 1: xm = -11167.75; ym = -1938.19; break; case 2: xm = -11138.91; ym = -1914.5; break; case 3: xm = -11162.14; ym = -1886.025; break; } Creature* pUnit = m_creature->SummonCreature(CREATURE_WATER_ELEMENTAL, xm, ym, m_creature->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 90000); if (pUnit) { pUnit->Attack(m_creature->getVictim(), true); pUnit->setFaction(m_creature->getFaction()); } } DoScriptText(SAY_ELEMENTALS, m_creature); } if(BerserkTimer < diff) { for (uint32 i = 0; i < 5; i++) { Creature* pUnit = DoSpawnCreature(CREATURE_SHADOW_OF_ARAN, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); if (pUnit) { pUnit->Attack(m_creature->getVictim(), true); pUnit->setFaction(m_creature->getFaction()); } } DoScriptText(SAY_TIMEOVER, m_creature); BerserkTimer = 60000; }else BerserkTimer -= diff; //Flame Wreath check if (FlameWreathTimer) { if (FlameWreathTimer >= diff) FlameWreathTimer -= diff; else FlameWreathTimer = 0; if (FlameWreathCheckTime < diff) { for (uint32 i = 0; i < 3; i++) { if (!FlameWreathTarget[i]) continue; Unit* pUnit = Unit::GetUnit(*m_creature, FlameWreathTarget[i]); if (pUnit && pUnit->GetDistance2d(FWTargPosX[i], FWTargPosY[i]) > 3) { pUnit->CastSpell(pUnit, 20476, true, 0, 0, m_creature->GetGUID()); pUnit->CastSpell(pUnit, 11027, true); FlameWreathTarget[i] = 0; } } FlameWreathCheckTime = 500; }else FlameWreathCheckTime -= diff; } if (ArcaneCooldown && FireCooldown && FrostCooldown) DoMeleeAttackIfReady(); if(CastAE) if(AETimer < diff) { m_creature->CastSpell(m_creature, SPELL_AEXPLOSION, false); AETimer = 1500; CastAE = false; }else AETimer -= diff; }
void UpdateAI(const uint32 uiDiff) { if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; if (m_uiCloseDoor_Timer) { if (m_uiCloseDoor_Timer <= uiDiff) { if (m_pInstance) { if (GameObject* pDoor = m_pInstance->instance->GetGameObject(m_pInstance->GetData64(DATA_GO_LIBRARY_DOOR))) pDoor->SetGoState(GO_STATE_READY); m_uiCloseDoor_Timer = 0; } } else m_uiCloseDoor_Timer -= uiDiff; } //Cooldowns for casts if (m_uiArcaneCooldown) { if (m_uiArcaneCooldown >= uiDiff) m_uiArcaneCooldown -= uiDiff; else m_uiArcaneCooldown = 0; } if (m_uiFireCooldown) { if (m_uiFireCooldown >= uiDiff) m_uiFireCooldown -= uiDiff; else m_uiFireCooldown = 0; } if (m_uiFrostCooldown) { if (m_uiFrostCooldown >= uiDiff) m_uiFrostCooldown -= uiDiff; else m_uiFrostCooldown = 0; } if (!m_bDrinking && m_creature->GetMaxPower(POWER_MANA) && (m_creature->GetPower(POWER_MANA)*100 / m_creature->GetMaxPower(POWER_MANA)) < 20) { m_bDrinking = true; m_creature->InterruptNonMeleeSpells(false); DoScriptText(SAY_DRINK, m_creature); if (!m_bDrinkInturrupted) { m_creature->CastSpell(m_creature, SPELL_MASS_POLY, true); m_creature->CastSpell(m_creature, SPELL_CONJURE, false); m_creature->CastSpell(m_creature, SPELL_DRINK, false); m_creature->SetStandState(UNIT_STAND_STATE_SIT); m_uiDrinkInturrupt_Timer = 10000; } } //Drink Inturrupt if (m_bDrinking && m_bDrinkInturrupted) { m_bDrinking = false; m_creature->RemoveAurasDueToSpell(SPELL_DRINK); m_creature->SetStandState(UNIT_STAND_STATE_STAND); m_creature->SetPower(POWER_MANA, m_creature->GetMaxPower(POWER_MANA)-32000); m_creature->CastSpell(m_creature, SPELL_POTION, false); } //Drink Inturrupt Timer if (m_bDrinking && !m_bDrinkInturrupted) { if (m_uiDrinkInturrupt_Timer >= uiDiff) m_uiDrinkInturrupt_Timer -= uiDiff; else { m_creature->SetStandState(UNIT_STAND_STATE_STAND); m_creature->CastSpell(m_creature, SPELL_POTION, true); m_creature->CastSpell(m_creature, SPELL_AOE_PYROBLAST, false); m_bDrinkInturrupted = true; m_bDrinking = false; } } //Don't execute any more code if we are drinking if (m_bDrinking) return; //Normal casts if (m_uiNormalCast_Timer < uiDiff) { if (!m_creature->IsNonMeleeSpellCasted(false)) { Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0); if (!pTarget) return; uint32 auiSpells[3]; uint8 uiAvailableSpells = 0; //Check for what spells are not on cooldown if (!m_uiArcaneCooldown) auiSpells[uiAvailableSpells++] = SPELL_ARCMISSLE; if (!m_uiFireCooldown) auiSpells[uiAvailableSpells++] = SPELL_FIREBALL; if (!m_uiFrostCooldown) auiSpells[uiAvailableSpells++] = SPELL_FROSTBOLT; //If no available spells wait 1 second and try again if (uiAvailableSpells) { m_uiCurrentNormalSpell = auiSpells[rand() % uiAvailableSpells]; DoCastSpellIfCan(pTarget, m_uiCurrentNormalSpell); } } m_uiNormalCast_Timer = 1000; } else m_uiNormalCast_Timer -= uiDiff; if (m_uiSecondarySpell_Timer < uiDiff) { switch(urand(0, 1)) { case 0: DoCastSpellIfCan(m_creature, SPELL_AOE_CS); break; case 1: if (Unit* pUnit = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) DoCastSpellIfCan(pUnit, SPELL_CHAINSOFICE); break; } m_uiSecondarySpell_Timer = urand(5000, 20000); } else m_uiSecondarySpell_Timer -= uiDiff; if (m_uiSuperCast_Timer < uiDiff) { uint8 auiAvailable[2]; switch (m_uiLastSuperSpell) { case SUPER_AE: auiAvailable[0] = SUPER_FLAME; auiAvailable[1] = SUPER_BLIZZARD; break; case SUPER_FLAME: auiAvailable[0] = SUPER_AE; auiAvailable[1] = SUPER_BLIZZARD; break; case SUPER_BLIZZARD: auiAvailable[0] = SUPER_FLAME; auiAvailable[1] = SUPER_AE; break; } m_uiLastSuperSpell = auiAvailable[urand(0, 2)]; switch (m_uiLastSuperSpell) { case SUPER_AE: DoScriptText(urand(0, 1) ? SAY_EXPLOSION1 : SAY_EXPLOSION2, m_creature); m_creature->CastSpell(m_creature, SPELL_BLINK_CENTER, true); m_creature->CastSpell(m_creature, SPELL_PLAYERPULL, true); m_creature->CastSpell(m_creature, SPELL_MASSSLOW, true); m_creature->CastSpell(m_creature, SPELL_AEXPLOSION, false); break; case SUPER_FLAME: DoScriptText(urand(0, 1) ? SAY_FLAMEWREATH1 : SAY_FLAMEWREATH2, m_creature); m_uiFlameWreath_Timer = 20000; m_uiFlameWreathCheck_Timer = 500; memset(&m_uiFlameWreathTarget, 0, sizeof(m_uiFlameWreathTarget)); FlameWreathEffect(); break; case SUPER_BLIZZARD: DoScriptText(urand(0, 1) ? SAY_BLIZZARD1 : SAY_BLIZZARD2, m_creature); if (Creature* pSpawn = m_creature->SummonCreature(NPC_ARAN_BLIZZARD, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 25000)) { pSpawn->setFaction(m_creature->getFaction()); pSpawn->CastSpell(pSpawn, SPELL_CIRCULAR_BLIZZARD, false); } break; } m_uiSuperCast_Timer = urand(35000, 40000); } else m_uiSuperCast_Timer -= uiDiff; if (!m_bElementalsSpawned && m_creature->GetHealthPercent() < 40.0f) { m_bElementalsSpawned = true; for (uint32 i = 0; i < 4; ++i) { if (Creature* pElemental = m_creature->SummonCreature(NPC_WATER_ELEMENTAL, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 90000)) { pElemental->Attack(m_creature->getVictim(), true); pElemental->setFaction(m_creature->getFaction()); } } DoScriptText(SAY_ELEMENTALS, m_creature); } if (m_uiBerserk_Timer < uiDiff) { for (uint32 i = 0; i < 5; ++i) { if (Creature* pShadow = m_creature->SummonCreature(NPC_SHADOW_OF_ARAN, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000)) { pShadow->Attack(m_creature->getVictim(), true); pShadow->setFaction(m_creature->getFaction()); } } DoScriptText(SAY_TIMEOVER, m_creature); m_uiBerserk_Timer = 60000; } else m_uiBerserk_Timer -= uiDiff; //Flame Wreath check if (m_uiFlameWreath_Timer) { if (m_uiFlameWreath_Timer >= uiDiff) m_uiFlameWreath_Timer -= uiDiff; else m_uiFlameWreath_Timer = 0; if (m_uiFlameWreathCheck_Timer < uiDiff) { for (uint32 i = 0; i < 3; ++i) { if (!m_uiFlameWreathTarget[i]) continue; Player* pPlayer = m_creature->GetMap()->GetPlayer(m_uiFlameWreathTarget[i]); if (pPlayer && !pPlayer->IsWithinDist2d(m_fFWTargPosX[i], m_fFWTargPosY[i], 3.0f)) { pPlayer->CastSpell(pPlayer, SPELL_EXPLOSION, true, 0, 0, m_creature->GetGUID()); pPlayer->CastSpell(pPlayer, SPELL_KNOCKBACK_500, true); m_uiFlameWreathTarget[i] = 0; } } m_uiFlameWreathCheck_Timer = 500; } else m_uiFlameWreathCheck_Timer -= uiDiff; } if (m_uiArcaneCooldown && m_uiFireCooldown && m_uiFrostCooldown) DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; if (CloseDoorTimer) { if (CloseDoorTimer <= diff) { if (pInstance) { pInstance->HandleGameObject(pInstance->GetData64(DATA_GO_LIBRARY_DOOR), false); CloseDoorTimer = 0; } } else CloseDoorTimer -= diff; } //Cooldowns for casts if (ArcaneCooldown) { if (ArcaneCooldown >= diff) ArcaneCooldown -= diff; else ArcaneCooldown = 2000; } if (FireCooldown) { if (FireCooldown >= diff) FireCooldown -= diff; else FireCooldown = 2000; } if (FrostCooldown) { if (FrostCooldown >= diff) FrostCooldown -= diff; else FrostCooldown = 2000; } if (!Drinking && me->GetMaxPower(POWER_MANA) && (me->GetPower(POWER_MANA) * 100 / me->GetMaxPower(POWER_MANA)) < 20) { Drinking = true; me->InterruptNonMeleeSpells(false); DoScriptText(SAY_DRINK, me); if (!DrinkInturrupted) { DoCast(me, SPELL_MASS_POLY, true); DoCast(me, SPELL_CONJURE, false); DoCast(me, SPELL_DRINK, false); me->SetStandState(UNIT_STAND_STATE_SIT); DrinkInturruptTimer = 10000; } } //Drink Inturrupt if (Drinking && DrinkInturrupted) { Drinking = false; me->RemoveAurasDueToSpell(SPELL_DRINK); me->SetStandState(UNIT_STAND_STATE_STAND); me->SetPower(POWER_MANA, me->GetMaxPower(POWER_MANA) - 32000); DoCast(me, SPELL_POTION, false); } //Drink Inturrupt Timer if (Drinking && !DrinkInturrupted) if (DrinkInturruptTimer >= diff) DrinkInturruptTimer -= diff; else { me->SetStandState(UNIT_STAND_STATE_STAND); DoCast(me, SPELL_POTION, true); DoCast(me, SPELL_AOE_PYROBLAST, false); DrinkInturrupted = true; Drinking = false; } //Don't execute any more code if we are drinking if (Drinking) return; //Normal casts if (NormalCastTimer <= diff) { if (!me->IsNonMeleeSpellCast(false)) { Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true); if (!target) return; uint32 Spells[3]; uint8 AvailableSpells = 0; //Check for what spells are not on cooldown if (!ArcaneCooldown) { Spells[AvailableSpells] = SPELL_ARCMISSLE; ++AvailableSpells; } if (!FireCooldown) { Spells[AvailableSpells] = SPELL_FIREBALL; ++AvailableSpells; } if (!FrostCooldown) { Spells[AvailableSpells] = SPELL_FROSTBOLT; ++AvailableSpells; } //If no available spells wait 1 second and try again if (AvailableSpells) { CurrentNormalSpell = Spells[rand() % AvailableSpells]; SetImmune(false); DoCast(target, CurrentNormalSpell); } } NormalCastTimer = 2500; } else NormalCastTimer -= diff; if (SecondarySpellTimer <= diff) { switch (urand(0, 1)) { case 0: DoCast(me, SPELL_AOE_CS); break; case 1: if (Unit* pUnit = SelectUnit(SELECT_TARGET_RANDOM, 0)) DoCast(pUnit, SPELL_CHAINSOFICE); break; case 2: if (Unit* pUnit = SelectUnit(SELECT_TARGET_RANDOM, 0)) DoCast(pUnit, SPELL_DRAGONSBREATH); break; } SecondarySpellTimer = urand(3000, 8000); } else SecondarySpellTimer -= diff; if (SuperCastTimer <= diff) { uint8 Available[2]; switch (LastSuperSpell) { case SUPER_AE: Available[0] = SUPER_FLAME; Available[1] = SUPER_BLIZZARD; break; case SUPER_FLAME: Available[0] = SUPER_AE; Available[1] = SUPER_BLIZZARD; break; case SUPER_BLIZZARD: Available[0] = SUPER_FLAME; Available[1] = SUPER_AE; break; } LastSuperSpell = Available[urand(0, 1)]; SetImmune(true); Map::PlayerList const &PlayerList = pInstance->instance->GetPlayers(); WorldPacket data; switch (LastSuperSpell) { case SUPER_AE: DoScriptText(RAND(SAY_EXPLOSION1, SAY_EXPLOSION2), me); DoCast(me, SPELL_BLINK_CENTER, true); DoCast(me, SPELL_PLAYERPULL, true); DoCast(me, SPELL_MASSSLOW, true); DoCast(me, SPELL_ARCANE_BUBBLE, true); me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, true); me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_INTERRUPT, true); AETimer = 1500; CastAE = true; break; case SUPER_FLAME: DoScriptText(RAND(SAY_FLAMEWREATH1, SAY_FLAMEWREATH2), me); FlameWreathTimer = 20000; FlameWreathCheckTime = 500; FlameWreathTarget[0] = 0; FlameWreathTarget[1] = 0; FlameWreathTarget[2] = 0; FlameWreathEffect(); SecondarySpellTimer = 20500; break; case SUPER_BLIZZARD: DoScriptText(RAND(SAY_BLIZZARD1, SAY_BLIZZARD2), me); Creature* Blizzard = NULL; Blizzard = me->SummonCreature(NPC_ARAN_BLIZZARD, -11179.080f, -1905.279f, 232.008f, 2.9f, TEMPSUMMON_TIMED_DESPAWN, 25000); if (Blizzard) { Blizzard->SetInCombatWithZone(); Blizzard->SetFaction(me->GetFaction()); me->CastSpell(Blizzard, SPELL_SUMMON_BLIZZ, false); Blizzard->CastSpell(Blizzard, SPELL_CIRCULAR_BLIZZARD, false); Blizzard->GetMotionMaster()->MovePath(110110101, false); } break; } SuperCastTimer = urand(35000, 40000); } else SuperCastTimer -= diff; if (!ElementalsSpawned && HealthBelowPct(40)) { ElementalsSpawned = true; Creature* ElementalOne = NULL; Creature* ElementalTwo = NULL; Creature* ElementalThree = NULL; Creature* ElementalFour = NULL; ElementalOne = me->SummonCreature(NPC_WATER_ELEMENTAL, -11168.1f, -1939.29f, 232.092f, 1.46f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 90000); ElementalTwo = me->SummonCreature(NPC_WATER_ELEMENTAL, -11138.2f, -1915.38f, 232.092f, 3.00f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 90000); ElementalThree = me->SummonCreature(NPC_WATER_ELEMENTAL, -11161.7f, -1885.36f, 232.092f, 4.59f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 90000); ElementalFour = me->SummonCreature(NPC_WATER_ELEMENTAL, -11192.4f, -1909.36f, 232.092f, 6.19f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 90000); if (ElementalOne) { Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0); if (!pTarget) return; DoStartNoMovement(pTarget); ElementalOne->SetInCombatWithZone(); ElementalOne->CombatStart(pTarget); ElementalOne->SetFaction(me->GetFaction()); ElementalOne->SetRooted(true); ElementalOne->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, true); ElementalOne->SetModifierValue(UNIT_MOD_RESISTANCE_FROST, BASE_VALUE, 0); } if (ElementalTwo) { Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0); if (!pTarget) return; DoStartNoMovement(pTarget); ElementalTwo->SetInCombatWithZone(); ElementalTwo->CombatStart(pTarget); ElementalTwo->SetFaction(me->GetFaction()); ElementalTwo->SetRooted(true); ElementalTwo->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, true); ElementalTwo->SetModifierValue(UNIT_MOD_RESISTANCE_FROST, BASE_VALUE, 0); } if (ElementalThree) { Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0); if (!pTarget) return; DoStartNoMovement(pTarget); ElementalThree->SetInCombatWithZone(); ElementalThree->CombatStart(pTarget); ElementalThree->SetFaction(me->GetFaction()); ElementalThree->SetRooted(true); ElementalThree->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, true); ElementalThree->SetModifierValue(UNIT_MOD_RESISTANCE_FROST, BASE_VALUE, 0); } if (ElementalFour) { Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0); if (!pTarget) return; DoStartNoMovement(pTarget); ElementalFour->SetInCombatWithZone(); ElementalFour->CombatStart(pTarget); ElementalFour->SetFaction(me->GetFaction()); ElementalFour->SetRooted(true); ElementalFour->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, true); ElementalFour->SetModifierValue(UNIT_MOD_RESISTANCE_FROST, BASE_VALUE, 0); } DoScriptText(SAY_ELEMENTALS, me); DoScriptText(SAY_TIMEOVER, me); BerserkTimer = 60000; } else BerserkTimer -= diff; //Flame Wreath check if (FlameWreathTimer) { if (FlameWreathTimer >= diff) FlameWreathTimer -= diff; else FlameWreathTimer = 0; if (FlameWreathCheckTime <= diff) { for (uint8 i = 0; i < 3; ++i) { if (!FlameWreathTarget[i]) continue; Unit* unit = Unit::GetUnit(*me, FlameWreathTarget[i]); if (unit && !unit->IsWithinDist2d(FWTargPosX[i], FWTargPosY[i], 3)) { unit->CastSpell(unit, 20476, true, 0, 0, me->GetGUID()); unit->CastSpell(unit, 11027, true); FlameWreathTarget[i] = 0; } } FlameWreathCheckTime = 500; } else FlameWreathCheckTime -= diff; } if (ArcaneCooldown && FireCooldown && FrostCooldown && DragonsbreathCooldown) DoMeleeAttackIfReady(); if (CastAE) if (AETimer < diff) { me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, true); me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_INTERRUPT, true); me->CastSpell(me, SPELL_AEXPLOSION, false); AETimer = 1500; CastAE = false; } else AETimer -= diff; }
void UpdateAI(const uint32 diff) { if (!UpdateVictim() ) return; if(CloseDoorTimer) { if(CloseDoorTimer <= diff) { if(pInstance) { if(GameObject* Door = GameObject::GetGameObject(*m_creature, pInstance->GetData64(DATA_GAMEOBJECT_LIBRARY_DOOR))) Door->SetGoState(1); CloseDoorTimer = 0; } }else CloseDoorTimer -= diff; } //Cooldowns for casts if (ArcaneCooldown) { if (ArcaneCooldown >= diff) ArcaneCooldown -= diff; else ArcaneCooldown = 0; } if (FireCooldown) { if (FireCooldown >= diff) FireCooldown -= diff; else FireCooldown = 0; } if (FrostCooldown) { if (FrostCooldown >= diff) FrostCooldown -= diff; else FrostCooldown = 0; } if(!Drinking && m_creature->GetMaxPower(POWER_MANA) && (m_creature->GetPower(POWER_MANA)*100 / m_creature->GetMaxPower(POWER_MANA)) < 20) { Drinking = true; m_creature->InterruptNonMeleeSpells(false); DoScriptText(SAY_DRINK, m_creature); if (!DrinkInturrupted) { m_creature->CastSpell(m_creature, SPELL_MASS_POLY, true); m_creature->CastSpell(m_creature, SPELL_CONJURE, false); m_creature->CastSpell(m_creature, SPELL_DRINK, false); //Sitting down m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, 1); DrinkInturruptTimer = 10000; } } //Drink Inturrupt if (Drinking && DrinkInturrupted) { Drinking = false; m_creature->RemoveAurasDueToSpell(SPELL_DRINK); m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); m_creature->SetPower(POWER_MANA, m_creature->GetMaxPower(POWER_MANA)-32000); m_creature->CastSpell(m_creature, SPELL_POTION, false); } //Drink Inturrupt Timer if (Drinking && !DrinkInturrupted) if (DrinkInturruptTimer >= diff) DrinkInturruptTimer -= diff; else { m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); m_creature->CastSpell(m_creature, SPELL_POTION, true); m_creature->CastSpell(m_creature, SPELL_AOE_PYROBLAST, false); DrinkInturrupted = true; Drinking = false; } //Don't execute any more code if we are drinking if (Drinking) return; //Normal casts if(NormalCastTimer < diff) { if (!m_creature->IsNonMeleeSpellCasted(false)) { Unit* target = NULL; target = SelectUnit(SELECT_TARGET_RANDOM, 0); if (!target) return; uint32 Spells[3]; uint8 AvailableSpells = 0; //Check for what spells are not on cooldown if (!ArcaneCooldown) { Spells[AvailableSpells] = SPELL_ARCMISSLE; AvailableSpells++; } if (!FireCooldown) { Spells[AvailableSpells] = SPELL_FIREBALL; AvailableSpells++; } if (!FrostCooldown) { Spells[AvailableSpells] = SPELL_FROSTBOLT; AvailableSpells++; } //If no available spells wait 1 second and try again if (AvailableSpells) { CurrentNormalSpell = Spells[rand() % AvailableSpells]; DoCast(target, CurrentNormalSpell); } } NormalCastTimer = 1000; }else NormalCastTimer -= diff; if(SecondarySpellTimer < diff) { switch (rand()%2) { case 0: DoCast(m_creature, SPELL_AOE_CS); break; case 1: if (Unit* pUnit = SelectUnit(SELECT_TARGET_RANDOM, 0)) DoCast(pUnit, SPELL_CHAINSOFICE); break; } SecondarySpellTimer = 5000 + (rand()%15000); }else SecondarySpellTimer -= diff; if(SuperCastTimer < diff) { uint8 Available[2]; switch (LastSuperSpell) { case SUPER_AE: Available[0] = SUPER_FLAME; Available[1] = SUPER_BLIZZARD; break; case SUPER_FLAME: Available[0] = SUPER_AE; Available[1] = SUPER_BLIZZARD; break; case SUPER_BLIZZARD: Available[0] = SUPER_FLAME; Available[1] = SUPER_AE; break; } LastSuperSpell = Available[rand()%2]; switch (LastSuperSpell) { case SUPER_AE: if (rand()%2) DoScriptText(SAY_EXPLOSION1, m_creature); else DoScriptText(SAY_EXPLOSION2, m_creature); m_creature->CastSpell(m_creature, SPELL_BLINK_CENTER, true); m_creature->CastSpell(m_creature, SPELL_PLAYERPULL, true); m_creature->CastSpell(m_creature, SPELL_MASSSLOW, true); m_creature->CastSpell(m_creature, SPELL_AEXPLOSION, false); break; case SUPER_FLAME: if (rand()%2) DoScriptText(SAY_FLAMEWREATH1, m_creature); else DoScriptText(SAY_FLAMEWREATH2, m_creature); FlameWreathTimer = 20000; FlameWreathCheckTime = 500; FlameWreathTarget[0] = 0; FlameWreathTarget[1] = 0; FlameWreathTarget[2] = 0; FlameWreathEffect(); break; case SUPER_BLIZZARD: if (rand()%2) DoScriptText(SAY_BLIZZARD1, m_creature); else DoScriptText(SAY_BLIZZARD2, m_creature); Creature* Spawn = NULL; Spawn = DoSpawnCreature(CREATURE_ARAN_BLIZZARD, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 25000); if (Spawn) { Spawn->setFaction(m_creature->getFaction()); Spawn->CastSpell(Spawn, SPELL_CIRCULAR_BLIZZARD, false); } break; } SuperCastTimer = 35000 + (rand()%5000); }else SuperCastTimer -= diff; if(!ElementalsSpawned && m_creature->GetHealth()*100 / m_creature->GetMaxHealth() < 40) { ElementalsSpawned = true; for (uint32 i = 0; i < 4; i++) { Creature* pUnit = DoSpawnCreature(CREATURE_WATER_ELEMENTAL, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 90000); if (pUnit) { pUnit->Attack(m_creature->getVictim(), true); pUnit->setFaction(m_creature->getFaction()); } } DoScriptText(SAY_ELEMENTALS, m_creature); } if(BerserkTimer < diff) { for (uint32 i = 0; i < 5; i++) { Creature* pUnit = DoSpawnCreature(CREATURE_SHADOW_OF_ARAN, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); if (pUnit) { pUnit->Attack(m_creature->getVictim(), true); pUnit->setFaction(m_creature->getFaction()); } } DoScriptText(SAY_TIMEOVER, m_creature); BerserkTimer = 60000; }else BerserkTimer -= diff; //Flame Wreath check if (FlameWreathTimer) { if (FlameWreathTimer >= diff) FlameWreathTimer -= diff; else FlameWreathTimer = 0; if (FlameWreathCheckTime < diff) { for (uint32 i = 0; i < 3; i++) { if (!FlameWreathTarget[i]) continue; Unit* pUnit = Unit::GetUnit(*m_creature, FlameWreathTarget[i]); if (pUnit && pUnit->GetDistance2d(FWTargPosX[i], FWTargPosY[i]) > 3) { pUnit->CastSpell(pUnit, 20476, true, 0, 0, m_creature->GetGUID()); pUnit->CastSpell(pUnit, 11027, true); FlameWreathTarget[i] = 0; } } FlameWreathCheckTime = 500; }else FlameWreathCheckTime -= diff; } if (ArcaneCooldown && FireCooldown && FrostCooldown) DoMeleeAttackIfReady(); }