void SetData_trial_of_the_king(uint32 type, uint32 data) { switch (type) { case TYPE_OUTRO_05: { if (Creature* haiyan = instance->GetCreature(haiyan_guid)) if (haiyan->GetAI()) haiyan->GetAI()->DoAction(1); //ACTION_OUTRO_02 } break; case TYPE_OUTRO_04: { if (Creature* kuai = instance->GetCreature(kuai_guid)) if (kuai->GetAI()) kuai->GetAI()->DoAction(3); //ACTION_OUTRO_02 } break; case TYPE_OUTRO_03: { if (Creature* ming = instance->GetCreature(ming_guid)) if (ming->GetAI()) ming->GetAI()->DoAction(2); //ACTION_OUTRO_02 } break; case TYPE_OUTRO_02: { if (Creature* haiyan = instance->GetCreature(haiyan_guid)) if (haiyan->GetAI()) haiyan->GetAI()->DoAction(0); //ACTION_OUTRO_01 } break; case TYPE_OUTRO_01: { if (Creature* ming = instance->GetCreature(ming_guid)) if (ming->GetAI()) ming->GetAI()->DoAction(1); //ACTION_OUTRO_01 } break; case TYPE_MING_INTRO: { if (Creature* ming = instance->GetCreature(ming_guid)) if (ming->GetAI()) ming->GetAI()->DoAction(0); //ACTION_INTRO } break; case TYPE_WIPE_FIRST_BOSS: { Creature* xin = instance->GetCreature(xin_guid); if (!xin) return; xin->SetVisible(true); if (xin->GetAI()) xin->GetAI()->Reset(); switch (data) { case 0: for (auto guid : adepts) { Creature* creature = instance->GetCreature(guid); if (!creature) continue; if (creature && creature->GetAI()) creature->GetAI()->DoAction(1); //EVENT_RETIRE creature->RemoveAura(121569); } break; case 1: for (auto guid : scrappers) { Creature* creature = instance->GetCreature(guid); if (!creature) continue; if (creature && creature->GetAI()) creature->GetAI()->DoAction(1); //EVENT_RETIRE creature->RemoveAura(121569); } break; case 2: for (auto guid : grunts) { Creature* creature = instance->GetCreature(guid); if (!creature) continue; if (creature && creature->GetAI()) creature->GetAI()->DoAction(1); //EVENT_RETIRE creature->RemoveAura(121569); } break; } } break; case TYPE_MING_ATTACK: { //Move the adepts for (auto guid : adepts) { Creature* creature = instance->GetCreature(guid); if (creature && creature->GetAI()) creature->GetAI()->DoAction(0); //EVENT_ENCOURAGE } Creature* ming = instance->GetCreature(ming_guid); if (!ming) return; ming->GetMotionMaster()->MovePoint(0, -4237.658f, -2613.860f, 16.48f); ming->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); ming->SetReactState(REACT_AGGRESSIVE); } break; case TYPE_KUAI_ATTACK: { //Move the scrappers for (auto guid : scrappers) { Creature* creature = instance->GetCreature(guid); if (creature && creature->GetAI()) creature->GetAI()->DoAction(0); //EVENT_ENCOURAGE } Creature* kuai = instance->GetCreature(kuai_guid); if (!kuai) return; kuai->GetMotionMaster()->MovePoint(0, -4215.359f, -2601.283f, 16.48f); kuai->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); kuai->SetReactState(REACT_AGGRESSIVE); } break; case TYPE_HAIYAN_ATTACK: { //Move the scrappers for (auto guid : grunts) { Creature* creature = instance->GetCreature(guid); if (creature && creature->GetAI()) creature->GetAI()->DoAction(0); //EVENT_ENCOURAGE } Creature* haiyan = instance->GetCreature(haiyan_guid); if (!haiyan) return; haiyan->GetMotionMaster()->MovePoint(0, -4215.772f, -2627.216f, 16.48f); haiyan->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); haiyan->SetReactState(REACT_AGGRESSIVE); } break; case TYPE_ALL_ATTACK: { for (auto guid : adepts) { Creature* creature = instance->GetCreature(guid); if (creature && creature->GetAI()) creature->GetAI()->DoAction(2); //ACTION_ATTACK std::list<uint64>::iterator itr = grunts.begin(); std::advance(itr, urand(0, grunts.size() - 1)); Creature* grunt = instance->GetCreature(*itr); if (creature && grunt) creature->Attack(grunt, true); } for (auto guid : grunts) { Creature* creature = instance->GetCreature(guid); if (creature && creature->GetAI()) creature->GetAI()->DoAction(2); //ACTION_ATTACK std::list<uint64>::iterator itr = scrappers.begin(); std::advance(itr, urand(0, scrappers.size() - 1)); Creature* scrapper = instance->GetCreature(*itr); if (creature && scrapper) creature->Attack(scrapper, true); } for (auto guid : scrappers) { Creature* creature = instance->GetCreature(guid); if (creature && creature->GetAI()) creature->GetAI()->DoAction(2); //ACTION_ATTACK std::list<uint64>::iterator itr = adepts.begin(); std::advance(itr, urand(0, adepts.size() - 1)); Creature* adept = instance->GetCreature(*itr); if (creature && adept) creature->Attack(adept, true); } SetBossState(DATA_TRIAL_OF_THE_KING, DONE); } break; case TYPE_MING_RETIRED: //Retire the adepts for (auto guid : adepts) { Creature* creature = instance->GetCreature(guid); if (creature && creature->GetAI()) creature->GetAI()->DoAction(1); //EVENT_RETIRE } break; case TYPE_KUAI_RETIRED: //Retire the adepts for (auto guid : scrappers) { Creature* creature = instance->GetCreature(guid); if (creature && creature->GetAI()) creature->GetAI()->DoAction(1); //EVENT_RETIRE } break; case TYPE_HAIYAN_RETIRED: //Retire the adepts for (auto guid : grunts) { Creature* creature = instance->GetCreature(guid); if (creature && creature->GetAI()) creature->GetAI()->DoAction(1); //EVENT_RETIRE } break; } }
void UpdateAI(const uint32 diff) { if (!StartCombat) return; if (IsBanished) { // Akama is set in the threatlist so when we reset, we make sure that he is not included in our check if (me->getThreatManager().getThreatList().size() < 2) { EnterEvadeMode(); return; } if (DefenderTimer <= diff) { uint32 ran = rand() % 2; Creature* Defender = me->SummonCreature(CREATURE_DEFENDER, SpawnLocations[ran].x, SpawnLocations[ran].y, Z_SPAWN, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 25000); if (Defender) { Defender->SetWalk(false); bool move = true; if (AkamaGUID) { if (Creature* Akama = Unit::GetCreature(*me, AkamaGUID)) { float x, y, z; Akama->GetPosition(x, y, z); // They move towards AKama Defender->GetMotionMaster()->MovePoint(0, x, y, z); Defender->AI()->AttackStart(Akama); } else move = false; } else move = false; if (!move) Defender->GetMotionMaster()->MovePoint(0, AKAMA_X, AKAMA_Y, AKAMA_Z); } DefenderTimer = 15000; } else DefenderTimer -= diff; if (SummonTimer <= diff) { SummonCreature(); SummonTimer = 35000; } else SummonTimer -= diff; if (DeathCount >= 6) { if (AkamaGUID) { Creature* Akama = Unit::GetCreature((*me), AkamaGUID); if (Akama && Akama->IsAlive()) { IsBanished = false; me->GetMotionMaster()->Clear(false); me->GetMotionMaster()->MoveChase(Akama); Akama->GetMotionMaster()->Clear(); // Shade should move to Akama, not the other way around Akama->GetMotionMaster()->MoveIdle(); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); // Crazy amount of threat me->AddThreat(Akama, 10000000.0f); Akama->AddThreat(me, 10000000.0f); me->Attack(Akama, true); Akama->Attack(me, true); } } } } else // No longer banished, let's fight Akama now { if (ReduceHealthTimer <= diff) { if (AkamaGUID) { Creature* Akama = Unit::GetCreature((*me), AkamaGUID); if (Akama && Akama->IsAlive()) { //10 % less health every few seconds. me->DealDamage(Akama, Akama->GetMaxHealth() / 10, NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); ReduceHealthTimer = 12000; } } } else ReduceHealthTimer -= diff; if (HasKilledAkama) { if (!HasKilledAkamaAndReseting)//do not let players kill Shade if Akama is dead and Shade is waiting for ResetTimer!! event would bug { HasKilledAkamaAndReseting = true; me->RemoveAllAuras(); me->DeleteThreatList(); me->CombatStop(); //me->SetHealth(me->GetMaxHealth()); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->GetMotionMaster()->MoveTargetedHome(); } if (ResetTimer <= diff) { EnterEvadeMode();// Reset a little while after killing Akama, evade and respawn Akama return; } else ResetTimer -= diff; } 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 DoIntro() { Creature *pMadrigosa = (Creature*)me->GetUnit(pInstance->GetData64(DATA_MADRIGOSA)); if (!pMadrigosa) return; switch (IntroPhase) { case 0: DoScriptText(YELL_MADR_ICE_BARRIER, pMadrigosa); pMadrigosa->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); for (uint8 i = 0; i < 8; ++i) pMadrigosa->SetSpeed(UnitMoveType(i), 2.5); pMadrigosa->GetMotionMaster()->MovePoint(1, MADRI_FLY_X, MADRI_FLY_Y, MADRI_FLY_Z); IntroPhaseTimer = 6500; ++IntroPhase; break; case 1: pInstance->SetData(DATA_BRUTALLUS_INTRO_EVENT, IN_PROGRESS); pMadrigosa->SetLevitate(false); pMadrigosa->SetWalk(true); pMadrigosa->HandleEmoteCommand(EMOTE_ONESHOT_LAND); IntroPhaseTimer = 2500; ++IntroPhase; break; case 2: pMadrigosa->SendHeartBeat(); DoScriptText(YELL_MADR_INTRO, pMadrigosa); IntroPhaseTimer = 5000; ++IntroPhase; break; case 3: float x, y, z; pMadrigosa->GetMap()->CreatureRelocation((Creature*)pMadrigosa, MADRI_FLY_X, MADRI_FLY_Y, MADRI_FLY_Z, me->GetOrientation()); me->SetInFront(pMadrigosa); pMadrigosa->SetInFront(me); DoScriptText(YELL_INTRO, me); IntroPhaseTimer = 6000; ++IntroPhase; break; case 4: pMadrigosa->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); DoStartMovement(pMadrigosa); pMadrigosa->GetMotionMaster()->MoveChase(me); me->Attack(pMadrigosa, true); pMadrigosa->Attack(me, true); IntroPhaseTimer = 7000; ++IntroPhase; break; case 5: pMadrigosa->CastSpell(me, SPELL_INTRO_FROST_BREATH, false); me->CastSpell(me, SPELL_INTRO_FROST_BREATH, true); IntroPhaseTimer = 2500; ++IntroPhase; break; case 6: me->GetMotionMaster()->MoveIdle(); pMadrigosa->SetLevitate(true); pMadrigosa->GetPosition(x, y, z); pMadrigosa->GetMotionMaster()->MovePoint(2, x, y, z+15); pMadrigosa->setHover(true); IntroPhaseTimer = 4500; ++IntroPhase; case 7: pMadrigosa->SetInFront(me); pMadrigosa->CastSpell(me, SPELL_INTRO_FROST_BLAST, false); me->CastSpell(me, SPELL_INTRO_FROST_BLAST, true); DoScriptText(YELL_MADR_ICE_BLOCK, pMadrigosa); IntroFrostBoltTimer = 500; IntroPhaseTimer = 10000; ++IntroPhase; break; case 8: DoScriptText(YELL_INTRO_BREAK_ICE, me); IntroPhaseTimer = 2000; ++IntroPhase; break; case 9: me->GetMotionMaster()->MoveIdle(); me->AttackStop(); pMadrigosa->setHover(false); pMadrigosa->SetLevitate(false); pMadrigosa->SetWalk(true); pMadrigosa->HandleEmoteCommand(EMOTE_ONESHOT_LAND); pMadrigosa->SendHeartBeat(); IntroPhaseTimer = 1000; ++IntroPhase; break; case 10: pMadrigosa->GetMotionMaster()->MoveIdle(); IntroPhaseTimer = 2500; ++IntroPhase; break; case 11: pMadrigosa->GetMap()->CreatureRelocation((Creature*)pMadrigosa, MADRI_FLY_X, MADRI_FLY_Y, MADRI_FLY_Z, me->GetOrientation()); pMadrigosa->GetMotionMaster()->MoveIdle(); IntroPhaseTimer = 2000; ++IntroPhase; break; case 12: me->GetMotionMaster()->MoveIdle(); pMadrigosa->CastSpell(me, SPELL_INTRO_ENCAPSULATE, false); DoScriptText(YELL_MADR_TRAP, pMadrigosa); IntroPhaseTimer = 1000; ++IntroPhase; break; case 13: me->GetPosition(x, y, z); me->GetMotionMaster()->MovePoint(1, x-6, y-15, z+10); me->SetInFront(pMadrigosa); IntroPhaseTimer = 8000; ++IntroPhase; break; case 14: me->RemoveAurasDueToSpell(44883); pMadrigosa->InterruptNonMeleeSpells(false); pMadrigosa->GetMotionMaster()->MoveIdle(); DoScriptText(YELL_INTRO_CHARGE, me); me->SetInFront(pMadrigosa); me->GetPosition(x, y, z); me->GetMotionMaster()->MoveFall(); IntroPhaseTimer = 3500; ++IntroPhase; break; case 15: for(uint8 i = 0; i < 8; ++i) me->SetSpeed(UnitMoveType(i), 10.0); me->GetMotionMaster()->MoveCharge(MADRI_FLY_X-5, MADRI_FLY_Y-15, MADRI_FLY_Z); AddSpellToCast((Unit*)NULL, SPELL_INTRO_CHARGE); IntroPhaseTimer = 1000; ++IntroPhase; break; case 16: DoScriptText(YELL_MADR_DEATH, pMadrigosa); pMadrigosa->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); pMadrigosa->SetFlag(UNIT_DYNAMIC_FLAGS, (UNIT_DYNFLAG_DEAD | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_PACIFIED)); pMadrigosa->CombatStop(); pMadrigosa->DeleteThreatList(); pMadrigosa->setFaction(35); me->CombatStop(); me->RemoveFlag(UNIT_FIELD_FLAGS, (UNIT_FLAG_PET_IN_COMBAT | UNIT_FLAG_PVP_ATTACKABLE)); IntroPhaseTimer = 4000; ++IntroPhase; break; case 17: if(pInstance) me->SetFacingToObject(GameObject::GetGameObject(*me, pInstance->GetData64(DATA_BRUTALLUS_TRIGGER))); for(uint8 i = 0; i < 8; ++i) me->SetSpeed(UnitMoveType(i), 2.0); IntroPhaseTimer = 6000; ++IntroPhase; break; case 18: DoScriptText(YELL_INTRO_KILL_MADRIGOSA, me); IntroPhaseTimer = 8000; ++IntroPhase; break; case 19: DoScriptText(YELL_INTRO_TAUNT, me); AddSpellToCast(me, SPELL_INTRO_BREAK_ICE); if(pInstance) pInstance->SetData(DATA_BRUTALLUS_INTRO_EVENT, DONE); else return; if(Unit *pTrigger = me->GetUnit(pInstance->GetData64(DATA_BRUTALLUS_TRIGGER))) pTrigger->CastSpell((Unit*)NULL, SPELL_INTRO_BREAK_ICE_KNOCKBACK, false); IntroPhaseTimer = 2000; ++IntroPhase; break; case 20: EnterEvadeMode(); ++IntroPhase; break; } }
void UpdateAI(const uint32 diff) { if(!m_creature->getVictim() && !m_creature->SelectHostilTarget()) return; switch(Phase) { case 0: { // *Heroic mode only: if(Heroic) if(PyroblastTimer < diff) { DoCast(m_creature, SPELL_SHOCK_BARRIER, true); DoCast(m_creature->getVictim(), SPELL_PYROBLAST); PyroblastTimer = 60000; }else PyroblastTimer -= diff; if(FireballTimer < diff) { // *Normal/Heroic mode support if(Heroic) DoCast(m_creature->getVictim(), SPELL_FIREBALL_HEROIC); else DoCast(m_creature->getVictim(), SPELL_FIREBALL_NORMAL); FireballTimer = 2000 + rand()%4000; }else FireballTimer -= diff; if(PhoenixTimer < diff) { uint32 random = rand()%2 + 1; float x = KaelLocations[random][0]; float y = KaelLocations[random][1]; Creature* Phoenix = m_creature->SummonCreature(CREATURE_PHOENIX, x, y, LOCATION_Z, 0, TEMPSUMMON_CORPSE_DESPAWN, 60000); if(Phoenix) { Phoenix->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE + UNIT_FLAG_NON_ATTACKABLE); SetThreatList(Phoenix); Unit *target = SelectUnit(SELECT_TARGET_RANDOM,1); if(target) { Phoenix->AddThreat(target,1000); Phoenix->Attack(target,true); Phoenix->GetMotionMaster()->MoveChase(target); } else { Phoenix->AddThreat(m_creature->getVictim(),1000); Phoenix->Attack(m_creature->getVictim(),true); Phoenix->GetMotionMaster()->MoveChase(m_creature->getVictim()); } } DoYell(SAY_PHOENIX, LANG_UNIVERSAL, NULL); DoPlaySoundToSet(m_creature,SOUND_PHOENIX); PhoenixTimer = 40000; }else PhoenixTimer -= diff; if(FlameStrikeTimer < diff) { Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0); if(target) { m_creature->InterruptNonMeleeSpells(false); DoCast(target, SPELL_FLAMESTRIKE3, true); FlameStrikeTimer = 20000 + rand()%5000; DoYell(SAY_FLAMESTRIKE, LANG_UNIVERSAL, NULL); DoPlaySoundToSet(m_creature, SOUND_FLAMESTRIKE); } }else FlameStrikeTimer -= diff; // Below 50% if(m_creature->GetMaxHealth() * 0.5 > m_creature->GetHealth()) { m_creature->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, true); m_creature->StopMoving(); m_creature->GetMotionMaster()->Clear(); m_creature->GetMotionMaster()->MoveIdle(); GravityLapseTimer = 0; GravityLapsePhase = 0; Phase = 1; } DoMeleeAttackIfReady(); } break; case 1: { m_creature->StopMoving(); if(GravityLapseTimer < diff) { switch(GravityLapsePhase) { case 0: if(FirstGravityLapse) // Different yells at 50%, and at every following Gravity Lapse { DoYell(SAY_GRAVITY_LAPSE,LANG_UNIVERSAL,NULL); DoPlaySoundToSet(m_creature,SOUND_GRAVITY_LAPSE); FirstGravityLapse = false; if(pInstance) { GameObject* KaelLeft = GameObject::GetGameObject(*m_creature, pInstance->GetData64(DATA_KAEL_STATUE_LEFT)); if(KaelLeft) KaelLeft->SetGoState(0); GameObject* KaelRight = GameObject::GetGameObject(*m_creature, pInstance->GetData64(DATA_KAEL_STATUE_RIGHT)); if(KaelRight) KaelRight->SetGoState(0); } }else { DoYell(SAY_RECAST_GRAVITY,LANG_UNIVERSAL,NULL); DoPlaySoundToSet(m_creature,SOUND_RECAST_GRAVITY); } m_creature->StopMoving(); DoCast(m_creature, SPELL_GRAVITY_LAPSE_INITIAL); GravityLapseTimer = 2000 + diff;// Don't interrupt the visual spell GravityLapsePhase = 1; break; case 1: TeleportPlayersToSelf(); GravityLapseTimer = 1000; GravityLapsePhase = 2; break; case 2: CastGravityLapseKnockUp(); GravityLapseTimer = 1000; GravityLapsePhase = 3; break; case 3: CastGravityLapseFly(); GravityLapseTimer = 30000; GravityLapsePhase = 4; for(uint8 i = 0; i < 3; ++i) { Creature* Orb = m_creature->SummonCreature(CREATURE_ARCANE_SPHERE,KaelLocations[3+i][0],KaelLocations[3+i][1],LOCATION_Z,0,TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN,30000); if(Orb) { SetThreatList(Orb); Unit *target = SelectUnit(SELECT_TARGET_BOTTOMAGGRO,i); if(target) { Orb->AddThreat(target,1000); Orb->Attack(target,true); Orb->GetMotionMaster()->MoveChase(target); } else { Unit *ntarget = SelectUnit(SELECT_TARGET_RANDOM,0); if(ntarget) { Orb->AddThreat(ntarget,1000); Orb->Attack(ntarget,true); Orb->GetMotionMaster()->MoveChase(ntarget); } } } } DoCast(m_creature, SPELL_GRAVITY_LAPSE_CHANNEL); break; case 4: m_creature->InterruptNonMeleeSpells(false); DoYell(SAY_TIRED,LANG_UNIVERSAL,NULL); DoPlaySoundToSet(m_creature,SOUND_TIRED); DoCast(m_creature, SPELL_POWER_FEEDBACK); RemoveGravityLapse(); GravityLapseTimer = 10000; GravityLapsePhase = 0; break; } }else GravityLapseTimer -= diff; } break; } }
void UpdateAI(const uint32 diff) { if (currentPhase == PHASE_NONE) return; if (SummonTimer <= diff) { if (currentPhase < 5 && currentPhase >= 0) { Creature *pNext = NULL; switch (currentPhase) { case PHASE_FRENZIED_WORGEN: pNext = Unit::GetCreature( (*me), pInstance ? pInstance->GetData64( DATA_MOB_FRENZIED_WORGEN) : 0); break; case PHASE_RAVENOUS_FURLBORG: pNext = Unit::GetCreature( (*me), pInstance ? pInstance->GetData64( DATA_MOB_RAVENOUS_FURBOLG) : 0); break; case PHASE_MASSIVE_JORMUNGAR: pNext = Unit::GetCreature( (*me), pInstance ? pInstance->GetData64( DATA_MOB_MASSIVE_JORMUNGAR) : 0); break; case PHASE_FEROCIOUS_RHINO: pNext = Unit::GetCreature( (*me), pInstance ? pInstance->GetData64( DATA_MOB_FEROCIOUS_RHINO) : 0); break; case PHASE_GORTOK_PALEHOOF: pNext = Unit::GetCreature( (*me), pInstance ? pInstance->GetData64( DATA_GORTOK_PALEHOOF) : 0); break; default: break; } if (pNext) { pNext->RemoveAurasDueToSpell(SPELL_FREEZE); pNext->RemoveFlag( UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_ATTACKABLE_1 | UNIT_FLAG_OOC_NOT_ATTACKABLE); pNext->SetStandState(UNIT_STAND_STATE_STAND); pNext->SetInCombatWithZone(); pNext->Attack(pNext->SelectNearestTarget(100), true); } currentPhase = PHASE_NONE; } } else SummonTimer -= diff; }
void UpdateAI(const uint32 diff) { ReduceCD(diff); if(IAmDead()) return; if(!m_creature->isInCombat()) { DoNonCombatActions(); } if(pet && pet != NULL && pet->isDead()) { master->SetBotsPetDied(); pet = NULL; } //if we think we have a pet, but master doesn't, it means we teleported if(pet && master->m_botHasPet == false) { master->SetBotsPetDied(); pet = NULL; } DoNormalAttack(diff); ScriptedAI::UpdateAI(diff); //if low on health, drink a potion if(m_creature->GetHealth() < m_creature->GetMaxHealth()*0.6 && isTimerReady(Potion_cd)) { doCast(m_creature, HEALINGPOTION); Potion_cd = 1500; } //if low on mana, drink a potion if(m_creature->GetPower(POWER_MANA) < m_creature->GetMaxPower(POWER_MANA)*0.2) { if(isTimerReady(Potion_cd)) { doCast(m_creature, MANAPOTION); //MonsterSay("MANA POTION", LANG_UNIVERSAL, NULL); Potion_cd = 1500; } } opponent = SelectUnit(SELECT_TARGET_TOPAGGRO, 0); if(!opponent && !m_creature->getVictim()) { ResetOrGetNextTarget(); //to reduce the number of crashes, remove pet whenever we are not in combat if(pet != NULL && pet->isAlive()) { master->SetBotsPetDied(); pet = NULL; } return; } if(pet == NULL) CreatePet(); if (pet && pet->isAlive() && !pet->isInCombat() && m_creature->getVictim()) { pet->Attack (m_creature->getVictim(), true); pet->GetMotionMaster()->MoveChase(m_creature->getVictim(), 1, 0); } }
bool TargetedMovementGenerator::Update(Creature &owner, const uint32 & time_diff) { if( !&owner || !owner.isAlive() || !&i_target ) return true; if( owner.hasUnitState(UNIT_STAT_ROOT) || owner.hasUnitState(UNIT_STAT_STUNDED) || owner.hasUnitState(UNIT_STAT_FLEEING)) return true; if( !owner.isInCombat() && !owner.hasUnitState(UNIT_STAT_FOLLOW) ) { //owner.AIM_Initialize(); This case must be the one, when a creature aggroed you. By Initalized a new AI, we prevented to Ai::_stopAttack() to be executed properly. return true; } // prevent crash after creature killed pet if (!owner.hasUnitState(UNIT_STAT_FOLLOW) && owner.getVictim() != &i_target) return true; Traveller<Creature> traveller(owner); if (i_destinationHolder.UpdateTraveller(traveller, time_diff, false)) { // put targeted movement generators on a higher priority if (owner.GetObjectSize()) i_destinationHolder.ResetUpdate(50); float dist = i_target.GetObjectSize() + owner.GetObjectSize() + OBJECT_CONTACT_DISTANCE; // try to counter precision differences if( i_destinationHolder.GetDistanceFromDestSq(i_target) > dist * dist + 0.1) _setTargetLocation(owner, 0); else if ( !owner.HasInArc( 0.1f, &i_target ) ) { owner.SetInFront(&i_target); if( i_target.GetTypeId() == TYPEID_PLAYER ) owner.SendUpdateToPlayer( (Player*)&i_target ); } if( !owner.IsStopped() && i_destinationHolder.HasArrived()) { owner.StopMoving(); if(owner.canReachWithAttack(&i_target) && !owner.hasUnitState(UNIT_STAT_FOLLOW)) owner.Attack(&i_target); } } /* //SpellEntry* spellInfo; if( reach ) { if( owner.GetDistance2dSq( &i_target ) > 0.0f ) { DEBUG_LOG("MOVEMENT : Distance = %f",owner.GetDistance2dSq( &i_target )); owner.addUnitState(UNIT_STAT_CHASE); _setTargetLocation(owner, 0); } else if ( !owner.HasInArc( 0.0f, &i_target ) ) { DEBUG_LOG("MOVEMENT : Orientation = %f",owner.GetAngle(&i_target)); owner.SetInFront(&i_target); if( i_target.GetTypeId() == TYPEID_PLAYER ) owner.SendUpdateToPlayer( (Player*)&i_target ); } if( !owner.isInCombat() ) { owner.AIM_Initialize(); return; } } else if( i_target.isAlive() ) { if( !owner.hasUnitState(UNIT_STAT_FOLLOW) && owner.isInCombat() ) { if( spellInfo = owner.reachWithSpellAttack( &i_target ) ) { _spellAtack(owner, spellInfo); return; } } if( owner.GetDistance2dSq( &i_target ) > 0.0f ) { DEBUG_LOG("MOVEMENT : Distance = %f",owner.GetDistance2dSq( &i_target )); owner.addUnitState(UNIT_STAT_CHASE); _setTargetLocation(owner, 0); } } else if( !i_targetedHome ) { if( !owner.hasUnitState(UNIT_STAT_FOLLOW) && owner.isInCombat() && (spellInfo = owner.reachWithSpellAttack(&i_target)) ) { _spellAtack(owner, spellInfo); return; } _setTargetLocation(owner, 0); if(reach) { if( reach && owner.canReachWithAttack(&i_target) ) { owner.StopMoving(); if(!owner.hasUnitState(UNIT_STAT_FOLLOW)) owner.Attack(&i_target); owner.clearUnitState(UNIT_STAT_CHASE); DEBUG_LOG("UNIT IS THERE"); } else { _setTargetLocation(owner, 0); DEBUG_LOG("Continue to chase"); } } }*/ return true; }
void UpdateAI(const uint32 uiDiff) { if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) { // En cas de bug pathfinding CheckBug_Timer += uiDiff; if (CheckBug_Timer > 5000) { EnterEvadeMode(); m_creature->CombatStop(); m_creature->SetHealth(m_creature->GetMaxHealth()); } return; } else CheckBug_Timer = 0; if (m_creature->IsNonMeleeSpellCasted(false)) return; if (ManageTimer(uiDiff, &m_uiTrampleTimer, urand(9000, 14000))) DoCastSpellIfCan(m_creature, SPELL_TRAMPLE); if (ManageTimer(uiDiff, &m_uiInfectedBiteTimer, urand(8000, 12000))) DoCastSpellIfCan(m_creature->getVictim(), SPELL_INFECTED_BITE); if (ManageTimer(uiDiff, &m_uiEyeOfImmolTharTimer, urand(15000, 22000))) { Creature* tmp = m_creature->SummonCreature(14396, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ(), m_creature->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); m_creature->SendSpellGo(tmp, 25681); tmp->Attack(m_creature->getVictim(),true); } if (ManageTimer(uiDiff, &m_uiPortalOfImmolTharTimer, urand(17000, 24000))) { if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) { /** Invoque player in front of him */ float x = m_creature->GetPositionX(); float y = m_creature->GetPositionY(); float z = m_creature->GetPositionZ() + 1; float orientation = pTarget->GetOrientation(); m_creature->SendSpellGo(pTarget, 25681); pTarget->NearTeleportTo(x, y, z, orientation); m_creature->getThreatManager().modifyThreatPercent(pTarget, -100); } } if (m_uiEnrageTimer < uiDiff) { if (!m_creature->HasAura(SPELL_ENRAGE) && m_bEngage) m_creature->CastSpell(m_creature, SPELL_ENRAGE, true); } else m_uiEnrageTimer -= uiDiff; 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]; 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(); }
void UpdateAI(const uint32 diff) { if(instance->GetData(DATA_TYRANNUS_START) == IN_PROGRESS && event) { if (StartTimer <= diff) { switch (StartPhase) { case 0: if (Creature* sTyrannus = me->FindNearestCreature(NPC_TYRANNUS_EVENTS, 50.0f, true)) { sTyrannus->SetCanFly(true); DoScriptText(SAY_TYRRANUS_1, sTyrannus); int32 entryIndex; if (instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) entryIndex = 0; else entryIndex = 1; Position spawnPoint = {427.36f, 212.636f, 529.47f, 6.2564f}; for (int8 i = 0; startPositions[i].entry[entryIndex] != 0; ++i) { if (Creature* summon = me->SummonCreature(startPositions[i].entry[entryIndex], spawnPoint, TEMPSUMMON_DEAD_DESPAWN)) summon->GetMotionMaster()->MovePoint(0, startPositions[i].movePosition); } } ++StartPhase; StartTimer = 5000; break; case 1: if (Creature* sTyrannus = me->FindNearestCreature(NPC_TYRANNUS_EVENTS, 50.0f, true)) DoScriptText(SAY_TYRRANUS_2, sTyrannus); ++StartPhase; StartTimer = 15000; break; case 2: if(me->GetEntry() == NPC_SYLVANAS_PART1) DoScriptText(SAY_SYLVANAS_1, me); else if(me->GetEntry() == NPC_JAINA_PART1) DoScriptText(SAY_JAINA_1, me); if (instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) { GetCreatureListWithEntryInGrid(Champion1, me, NPC_CHAMPION_1_ALLIANCE, 150.0f); for(std::list<Creature*>::iterator itr = Champion1.begin(); itr != Champion1.end(); ++itr) { Creature *sChampions = *itr; if (!sChampions) continue; if (sChampions->isAlive()) if (Creature* sNecrolyte = me->FindNearestCreature(367880, 150.0f, true)) { sChampions->Attack(sNecrolyte, true); sChampions->GetMotionMaster()->MoveChase(sNecrolyte); } } GetCreatureListWithEntryInGrid(Champion2, me, NPC_CHAMPION_2_ALLIANCE, 150.0f); for(std::list<Creature*>::iterator itr = Champion2.begin(); itr != Champion2.end(); ++itr) { Creature *sChampions = *itr; if (!sChampions) continue; if (sChampions->isAlive()) if (Creature* sNecrolyte = me->FindNearestCreature(36788, 150.0f, true)) { sChampions->Attack(sNecrolyte, true); sChampions->GetMotionMaster()->MoveChase(sNecrolyte); } } } else { GetCreatureListWithEntryInGrid(Champion1, me, NPC_CHAMPION_1_HORDE, 150.0f); for(std::list<Creature*>::iterator itr = Champion1.begin(); itr != Champion1.end(); ++itr) { Creature *sChampions = *itr; if (!sChampions) continue; if (sChampions->isAlive()) if (Creature* sNecrolyte = me->FindNearestCreature(367880, 150.0f, true)) { sChampions->Attack(sNecrolyte, true); sChampions->GetMotionMaster()->MoveChase(sNecrolyte); } } GetCreatureListWithEntryInGrid(Champion2, me, NPC_CHAMPION_2_HORDE, 150.0f); for(std::list<Creature*>::iterator itr = Champion2.begin(); itr != Champion2.end(); ++itr) { Creature *sChampions = *itr; if (!sChampions) continue; if (sChampions->isAlive()) if (Creature* sNecrolyte = me->FindNearestCreature(36788, 150.0f, true)) { sChampions->Attack(sNecrolyte, true); sChampions->GetMotionMaster()->MoveChase(sNecrolyte); } } GetCreatureListWithEntryInGrid(Champion3, me, NPC_CHAMPION_3_HORDE, 150.0f); for(std::list<Creature*>::iterator itr = Champion3.begin(); itr != Champion3.end(); ++itr) { Creature *sChampions = *itr; if (!sChampions) continue; if (sChampions->isAlive()) if (Creature* sNecrolyte = me->FindNearestCreature(36788, 150.0f, true)) { sChampions->Attack(sNecrolyte, true); sChampions->GetMotionMaster()->MoveChase(sNecrolyte); } } } ++StartPhase; StartTimer = 1000; break; case 3: if (Creature* sTyrannus = me->FindNearestCreature(NPC_TYRANNUS_EVENTS, 150.0f, true)) DoScriptText(SAY_TYRRANUS_3, sTyrannus); ++StartPhase; StartTimer = 2000; break; case 4: if (Creature* sTyrannus = me->FindNearestCreature(NPC_TYRANNUS_EVENTS, 150.0f, true)) DoPlaySoundToSet(sTyrannus, SAY_SOUND); for(std::list<Creature*>::iterator itr = Champion1.begin(); itr != Champion1.end(); ++itr) { Creature *sChampions = *itr; if (!sChampions) continue; if (sChampions->isAlive()) { sChampions->AttackStop(); sChampions->GetMotionMaster()->MoveFall(); } } for(std::list<Creature*>::iterator itr = Champion2.begin(); itr != Champion2.end(); ++itr) { Creature *sChampions = *itr; if (!sChampions) continue; if (sChampions->isAlive()) { sChampions->AttackStop(); sChampions->GetMotionMaster()->MoveFall(); } } for(std::list<Creature*>::iterator itr = Champion3.begin(); itr != Champion3.end(); ++itr) { Creature *sChampions = *itr; if (!sChampions) continue; if (sChampions->isAlive()) { sChampions->AttackStop(); sChampions->GetMotionMaster()->MoveFall(); } } ++StartPhase; StartTimer = 5000; break; case 5: if (Creature* sTyrannus = me->FindNearestCreature(NPC_TYRANNUS_EVENTS, 50.0f, true)) sTyrannus->CastSpell(sTyrannus, SPELL_NECROMANTIC_POWER, false); for(std::list<Creature*>::iterator itr = Champion1.begin(); itr != Champion1.end(); ++itr) { Creature *sChampions = *itr; if (!sChampions) continue; if (sChampions->isAlive()) sChampions->Kill(sChampions, false); } for(std::list<Creature*>::iterator itr = Champion2.begin(); itr != Champion2.end(); ++itr) { Creature *sChampions = *itr; if (!sChampions) continue; if (sChampions->isAlive()) sChampions->Kill(sChampions, false); } for(std::list<Creature*>::iterator itr = Champion3.begin(); itr != Champion3.end(); ++itr) { Creature *sChampions = *itr; if (!sChampions) continue; if (sChampions->isAlive()) sChampions->Kill(sChampions, false); } if(me->GetEntry() == NPC_SYLVANAS_PART1) DoScriptText(SAY_SYLVANAS_2, me); else if(me->GetEntry() == NPC_JAINA_PART1) DoScriptText(SAY_JAINA_2, me); ++StartPhase; StartTimer = 5000; break; case 6: for(std::list<Creature*>::iterator itr = Champion1.begin(); itr != Champion1.end(); ++itr) { Creature *sChampions = *itr; if (!sChampions) continue; sChampions->Respawn(); sChampions->CastSpell(sChampions, SPELL_DEATH_ARMY_VISUAL, true); if(me->GetEntry() == NPC_SYLVANAS_PART1) sChampions->UpdateEntry(36796, ALLIANCE); else sChampions->UpdateEntry(36796, HORDE); sChampions->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); sChampions->SetReactState(REACT_PASSIVE); } for(std::list<Creature*>::iterator itr = Champion2.begin(); itr != Champion2.end(); ++itr) { Creature *sChampions = *itr; if (!sChampions) continue; sChampions->Respawn(); sChampions->CastSpell(sChampions, SPELL_DEATH_ARMY_VISUAL, true); if(me->GetEntry() == NPC_SYLVANAS_PART1) sChampions->UpdateEntry(36796, ALLIANCE); else sChampions->UpdateEntry(36796, HORDE); sChampions->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); sChampions->SetReactState(REACT_PASSIVE); } for(std::list<Creature*>::iterator itr = Champion3.begin(); itr != Champion3.end(); ++itr) { Creature *sChampions = *itr; if (!sChampions) continue; sChampions->Respawn(); sChampions->CastSpell(sChampions, SPELL_DEATH_ARMY_VISUAL, true); if(me->GetEntry() == NPC_SYLVANAS_PART1) sChampions->UpdateEntry(36796, ALLIANCE); else sChampions->UpdateEntry(36796, HORDE); sChampions->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); sChampions->SetReactState(REACT_PASSIVE); } if (Creature* sTyrannus = me->FindNearestCreature(NPC_TYRANNUS_EVENTS, 50.0f, true)) DoScriptText(SAY_TYRRANUS_4, sTyrannus); for(std::list<Creature*>::iterator itr = Champion1.begin(); itr != Champion1.end(); ++itr) { Creature *sChampions = *itr; if (!sChampions) continue; if (Creature* pHelper = me->FindNearestCreature(NPC_KORALEN, 150.0f, true)) { sChampions->Attack(pHelper, true); sChampions->GetMotionMaster()->MoveChase(pHelper); } else if (Creature* pHelper = me->FindNearestCreature(NPC_KORLAEN, 150.0f, true)) { sChampions->Attack(pHelper, true); sChampions->GetMotionMaster()->MoveChase(pHelper); } } for(std::list<Creature*>::iterator itr = Champion2.begin(); itr != Champion2.end(); ++itr) { Creature *sChampions = *itr; if (!sChampions) continue; if (Creature* pHelper = me->FindNearestCreature(NPC_KORALEN, 150.0f, true)) { sChampions->Attack(pHelper, true); sChampions->GetMotionMaster()->MoveChase(pHelper); } else if (Creature* pHelper = me->FindNearestCreature(NPC_KORLAEN, 150.0f, true)) { sChampions->Attack(pHelper, true); sChampions->GetMotionMaster()->MoveChase(pHelper); } } for(std::list<Creature*>::iterator itr = Champion3.begin(); itr != Champion3.end(); ++itr) { Creature *sChampions = *itr; if (!sChampions) continue; if (Creature* pHelper = me->FindNearestCreature(NPC_KORALEN, 150.0f, true)) { sChampions->Attack(pHelper, true); sChampions->GetMotionMaster()->MoveChase(pHelper); } else if (Creature* pHelper = me->FindNearestCreature(NPC_KORLAEN, 150.0f, true)) { sChampions->Attack(pHelper, true); sChampions->GetMotionMaster()->MoveChase(pHelper); } } ++StartPhase; StartTimer = 3000; break; case 7: for(std::list<Creature*>::iterator itr = Champion1.begin(); itr != Champion1.end(); ++itr) { Creature *sChampions = *itr; if (!sChampions) continue; if(me->GetEntry() == NPC_SYLVANAS_PART1) me->CastSpell(sChampions, SPELL_MULTI_SHOT_SYLVANAS, true); else me->CastSpell(sChampions, SPELL_BLIZZARD_JAINA, true); } for(std::list<Creature*>::iterator itr = Champion2.begin(); itr != Champion2.end(); ++itr) { Creature *sChampions = *itr; if (!sChampions) continue; if(me->GetEntry() == NPC_SYLVANAS_PART1) me->CastSpell(sChampions, SPELL_MULTI_SHOT_SYLVANAS, true); else me->CastSpell(sChampions, SPELL_BLIZZARD_JAINA, true); } for(std::list<Creature*>::iterator itr = Champion3.begin(); itr != Champion3.end(); ++itr) { Creature *sChampions = *itr; if (!sChampions) continue; if(me->GetEntry() == NPC_SYLVANAS_PART1) me->CastSpell(sChampions, SPELL_MULTI_SHOT_SYLVANAS, true); else me->CastSpell(sChampions, SPELL_BLIZZARD_JAINA, true); } ++StartPhase; StartTimer = 500; break; case 8: for(std::list<Creature*>::iterator itr = Champion1.begin(); itr != Champion1.end(); ++itr) { Creature *sChampions = *itr; if (!sChampions) continue; if(me->GetEntry() == NPC_SYLVANAS_PART1) me->CastSpell(sChampions, SPELL_SHADOW_BOLT_SYLVANAS, true); else me->CastSpell(sChampions, SPELL_ICE_LANCE_JAINA, true); } for(std::list<Creature*>::iterator itr = Champion2.begin(); itr != Champion2.end(); ++itr) { Creature *sChampions = *itr; if (!sChampions) continue; if(me->GetEntry() == NPC_SYLVANAS_PART1) me->CastSpell(sChampions, SPELL_SHADOW_BOLT_SYLVANAS, true); else me->CastSpell(sChampions, SPELL_ICE_LANCE_JAINA, true); } for(std::list<Creature*>::iterator itr = Champion3.begin(); itr != Champion3.end(); ++itr) { Creature *sChampions = *itr; if (!sChampions) continue; if(me->GetEntry() == NPC_SYLVANAS_PART1) me->CastSpell(sChampions, SPELL_SHADOW_BOLT_SYLVANAS, true); else me->CastSpell(sChampions, SPELL_ICE_LANCE_JAINA, true); } ++StartPhase; StartTimer = 500; break; case 9: for(std::list<Creature*>::iterator itr = Champion1.begin(); itr != Champion1.end(); ++itr) { Creature *sChampions = *itr; if (!sChampions) continue; me->Kill(sChampions, false); } for(std::list<Creature*>::iterator itr = Champion2.begin(); itr != Champion2.end(); ++itr) { Creature *sChampions = *itr; if (!sChampions) continue; me->Kill(sChampions, false); } for(std::list<Creature*>::iterator itr = Champion3.begin(); itr != Champion3.end(); ++itr) { Creature *sChampions = *itr; if (!sChampions) continue; me->Kill(sChampions, false); } ++StartPhase; StartTimer = 3000; break; case 10: if(me->GetEntry() == NPC_JAINA_PART1) DoScriptText(SAY_JAINA_3, me); else DoScriptText(SAY_SYLVANAS_3, me); ++StartPhase; StartTimer = 10000; break; case 11: if(me->GetEntry() == NPC_JAINA_PART1) DoScriptText(SAY_JAINA_4, me); else DoScriptText(SAY_SYLVANAS_4, me); ++StartPhase; StartTimer = 10000; break; case 12: if (Creature* sTyrannus = me->FindNearestCreature(NPC_TYRANNUS_EVENTS, 150.0f, true)) sTyrannus->GetMotionMaster()->MovePoint(0, 938.125f, 93.928f, 585.39f); instance->SetData(DATA_TYRANNUS_START, DONE); event = false; ++StartPhase; StartTimer = 10000; break; return; } } else StartTimer -= diff; } }
void UpdateAI(const uint32 diff) { ReduceCD(); if(IAmDead()) return; if(pet && pet != NULL && pet->isDead()) { master->SetBotsPetDied(); pet = NULL; } //if we think we have a pet, but master doesn't, it means we teleported if(pet && master->m_botHasPet == false) { master->SetBotsPetDied(); pet = NULL; } m_creature->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true); m_creature->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, true); if(m_creature->GetHealth() < m_creature->GetMaxHealth()*0.3 && isTimerReady(Potion_cd)) { doCast(m_creature, HEALINGPOTION); Potion_cd = Potion_cd; } if(m_creature->GetPower(POWER_MANA) < m_creature->GetMaxPower(POWER_MANA)*0.2) { if(isTimerReady(Potion_cd)) { doCast(m_creature, MANAPOTION); //MonsterSay("MANA POTION", LANG_UNIVERSAL, NULL); Potion_cd = Potion_cd; } else { if(oom_spam == false) { //MonsterSay("OOM", LANG_UNIVERSAL, NULL); oom_spam = true; } ScriptedAI::UpdateAI(diff); //return; //can't do anything without mana } } oom_spam = false; ScriptedAI::UpdateAI(diff); opponent = SelectUnit(SELECT_TARGET_TOPAGGRO, 0); if(!opponent && !m_creature->getVictim()) { ResetOrGetNextTarget(); //to reduce the number of crashes, remove pet whenever we are not in combat if(pet != NULL && pet->isAlive()) { master->SetBotsPetDied(); pet = NULL; } return; } if(pet == NULL) CreatePet(); if (pet && pet->isAlive() && !pet->isInCombat() && m_creature->getVictim()) { pet->Attack (m_creature->getVictim(), true); pet->GetMotionMaster()->MoveChase(m_creature->getVictim(), 1, 0); } if(m_creature->hasUnitState(UNIT_STAT_CASTING)) return; DoNormalAttack(diff); }