void UpdateAI(const uint32 uiDiff) override { // Return since we have no target if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; // MightyBlow_Timer if (m_uiMightyBlowTimer < uiDiff) { DoCastSpellIfCan(m_creature->getVictim(), SPELL_MIGHTYBLOW); m_uiMightyBlowTimer = 18000; } else m_uiMightyBlowTimer -= uiDiff; // HamString_Timer if (m_uiHamStringTimer < uiDiff) { DoCastSpellIfCan(m_creature->getVictim(), SPELL_HAMSTRING); m_uiHamStringTimer = 15000; } else m_uiHamStringTimer -= uiDiff; // Cleave_Timer if (m_uiCleaveTimer < uiDiff) { DoCastSpellIfCan(m_creature->getVictim(), SPELL_CLEAVE); m_uiCleaveTimer = 9000; } else m_uiCleaveTimer -= uiDiff; // Adds_Timer if (m_creature->GetHealthPercent() < 21.0f) { if (m_uiAddsTimer < uiDiff) { // summon 3 Adds every 25s SummonAdd(NPC_ANVILRAGE_RESERVIST); SummonAdd(NPC_ANVILRAGE_RESERVIST); SummonAdd(NPC_ANVILRAGE_RESERVIST); m_uiAddsTimer = 25000; } else m_uiAddsTimer -= uiDiff; } // Summon Medics if (!m_bSummonedMedics && m_creature->GetHealthPercent() < 21.0f) { SummonAdd(NPC_ANVILRAGE_MEDIC); SummonAdd(NPC_ANVILRAGE_MEDIC); m_bSummonedMedics = true; } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) override { if (!UpdateVictim()) return; _events.Update(diff); while (uint32 eventId = _events.ExecuteEvent()) { switch (eventId) { case EVENT_MIGHTYBLOW: DoCastVictim(SPELL_MIGHTYBLOW); _events.ScheduleEvent(EVENT_MIGHTYBLOW, 18000); break; case EVENT_HAMSTRING: DoCastVictim(SPELL_HAMSTRING); _events.ScheduleEvent(EVENT_HAMSTRING, 15000); break; case EVENT_CLEAVE: DoCastVictim(SPELL_CLEAVE); _events.ScheduleEvent(EVENT_CLEAVE, 9000); break; case EVENT_MEDIC: for (uint8 i = 0; i < 2; ++i) SummonMedic(me->GetVictim()); break; case EVENT_ADDS: for (uint8 i = 0; i < 3; ++i) SummonAdd(me->GetVictim()); _events.ScheduleEvent(EVENT_ADDS, 25000, 0, PHASE_TWO); break; default: break; } } DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!InProgress) return; if (phase == PHASE_FILTHY_INVADERS_1) { me->SetOrientation(0.166467f); phase = PHASE_FILTHY_INVADERS_2; me->MonsterSay(SAY_1, LANG_UNIVERSAL, NULL); } if (summonMurlocTimer <= diff) { if (phase == PHASE_FILTHY_INVADERS_2) SummonAdd(NPC_DEEP_MURLOC, 6); if (sumMurlocs.size() >= 6*3) phase = PHASE_NULL; summonMurlocTimer = 5000; } else summonMurlocTimer -= diff; if (MindlasherTimer <= diff) { if (phase == PHASE_FILTHY_INVADERS_3) { SummonAdd(NPC_MINDLASHER, 1); } if (sumMindlasher.size() >= 3 && !slasherphased) { me->MonsterYell(SAY_2, LANG_UNIVERSAL, NULL); phase = PHASE_NULL; slasherphased = true; } if (phase != PHASE_FILTHY_INVADERS_3 && !sumonslasher) { SummonAdd(NPC_MINDLASHER, 1); phase = PHASE_FILTHY_INVADERS_3; sumonslasher = true; } MindlasherTimer = 12000; } else MindlasherTimer -= diff; if (behemontTimer <= diff) { if (summonbehemont == false) { SummonAdd(NPC_BEHEMOTH, 1); summonbehemont = true; } } else behemontTimer -= diff; if (phase2_timer <= diff && phase != PHASE_BEAST_RETURN) { phase = PHASE_BEAST_RETURN; me->MonsterYell(SAY_3, LANG_UNIVERSAL, NULL); } else phase2_timer -= diff; if (phase == PHASE_BEAST_RETURN) { if (ozumatSummoned == false) { SummonAdd(NPC_SAPPER, 3); phase = PHASE_NULL; ozumatSummoned = true; } } if (deadSappers >= 3 && phase != PHASE_TIDAL_SURGE) phase = PHASE_TIDAL_SURGE; if (phase == PHASE_TIDAL_SURGE) { if (flagged == false) { SummonAdd(BOSS_OZUMAT, 1); Ozumat->setFaction(14); if (instance) instance->DoCastSpellOnPlayers(76133); me->MonsterYell(SAY_CLEANSED,LANG_UNIVERSAL, NULL); flagged = true; } } }
void UpdateAI(const uint32 diff) { if (!InProgress) return; if (_wipeCheckTimer <= diff) { _wipeCheckTimer = 5000; Player* player = NULL; Trinity::AnyPlayerInObjectRangeCheck check(me, 60.0f); Trinity::PlayerSearcher<Trinity::AnyPlayerInObjectRangeCheck> searcher(me, player, check); me->VisitNearbyWorldObject(60.0f, searcher); if (!player) Reset(); } else _wipeCheckTimer -= diff; if (phase == PHASE_FILTHY_INVADERS_1) { me->SetFacingTo(0.166467f); phase = PHASE_FILTHY_INVADERS_2; Talk(2); me->AddAura(SPELL_AURA_PURIFIED, me); } if (_ph == 0) { if (mui_event <= diff) { switch (event) { case 0: SummonAdd(NPC_DEEP_MURLOC, 6); mui_event = 6000; break; case 1: SummonAdd(NPC_MINDLASHER, 1); mui_event = 15000; break; case 2: SummonAdd(NPC_BEHEMOTH, 1); mui_event = 10000; break; case 3: SummonAdd(NPC_DEEP_MURLOC, 6); mui_event = 9000; break; case 4: SummonAdd(NPC_MINDLASHER, 1); mui_event = 20000; break; case 5: SummonAdd(NPC_DEEP_MURLOC, 6); mui_event = 15000; break; case 6: Talk(3); SummonAdd(NPC_MINDLASHER, 1); mui_event = 1000; break; case 7: mui_event = 1000; break; case 8: mui_event = 5000; break; case 9: SummonAdd(NPC_SAPPER, 3); me->RemoveAura(SPELL_AURA_PURIFIED); mui_event = 9000; Talk(4); break; case 10: SummonAdd(NPC_BEAST, 1); mui_event = 1000; _ph = 1; SummonAdd(BOSS_OZUMAT, 1); Talk(5); break; default : mui_event = 1000; break; } if (event <= 11 && event != 7) event++; } else mui_event -= diff; } else if (_ph == 1) { if (mui_beast <= diff) { SummonAdd(NPC_BEAST, 1); mui_beast = 20000; } else mui_beast -= diff; } else if (_ph == 2) { if (mui_beast <= diff) { if (Creature *Ozumat = Unit::GetCreature(*me, instance->GetData64(DATA_OZUMAT))) Ozumat->AI()->DoAction(ACTION_CHANGE_PHASE); _ph = 3; mui_beast = 6000; } else mui_beast -= diff; } else if (_ph == 3) { if (mui_beast <= diff) { Talk(7); if (instance) instance->DoCastSpellOnPlayers(SPELL_MAREE_POWER); me->RemoveAura(83463); _ph = 4; mui_beast = 6000; } else mui_beast -= diff; } }
void UpdateAI(const uint32 diff) { if (!m_creature->SelectHostileTarget() || !m_creature->getVictim() ) return; m_creature->GetMotionMaster()->Clear(false); //Phase Switcher if (Phase2Timer < diff) { Phase1 = false; Spawned = false; Phase2Timer = 180000; }Phase2Timer -= diff; if (Phase1Timer < diff) { SpoutNow = true; Phase1 = true; Phase1Timer = 180000; }Phase1Timer -= diff; //Phase 1 if (Phase1) { m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); if (!m_creature->SelectHostileTarget() || !m_creature->getVictim() ) return; m_creature->GetMotionMaster()->Clear(false); // anty ranged high aggro if(BugTimer < diff) { if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM,0)) if(!m_creature->IsWithinDistInMap(pTarget, 3)) DoResetThreat(); BugTimer = 5000; }BugTimer -= diff; // when switching 2phase 1 cast spout if (SpoutNow) { DoCast(m_creature->getVictim(), SPELL_SPOUT); SpoutNow = false; WhirlTimer = 14000; } if (SpoutTimer < diff) { DoCast(m_creature->getVictim(), SPELL_SPOUT); SpoutTimer = 35000; WhirlTimer = 14000; } else SpoutTimer -= diff; // inwater Coilfang Frenzy Summon if (CoilfangFrenzyTimer < diff) { Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM,0); if(pTarget && !m_creature->IsWithinDistInMap(pTarget, 3)) if(pTarget->IsInWater()) SummonAdd(MOBID_COILFANG_FRENZY, pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ()); CoilfangFrenzyTimer = 1000; }else CoilfangFrenzyTimer -= diff; if (WhirlTimer < diff) { DoCast(m_creature, SPELL_WHIRL); WhirlTimer = 90000; }WhirlTimer -= diff; if(GeyserTimer < diff) { if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM,0)) DoCastSpellIfCan(pTarget, SPELL_GEYSER); GeyserTimer = urand(10000, 15000); }GeyserTimer -= diff; //melee range checker if(WaterBoltTimer < diff) { Unit* target = NULL; int i = 0; bool meleeTarget = false; target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM,0); if (!target) target = m_creature->getVictim(); while (target) { if( m_creature->IsWithinDistInMap(target, 3)) { meleeTarget = true; break; } target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM,i); i++; } if(!meleeTarget) { if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM,0)) DoCastSpellIfCan(pTarget,SPELL_WATER_BOLT); else DoCast(m_creature->getVictim(),SPELL_WATER_BOLT); WaterBoltTimer = 3000; } else DoMeleeAttackIfReady(); }else WaterBoltTimer -= diff; DoMeleeAttackIfReady(); } //Phase 2 if(!Spawned) { m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); SummonAdd(MOBID_COILFANG_AMBUSHER,AddPos[0][0],AddPos[0][1],AddPos[0][2]); SummonAdd(MOBID_COILFANG_AMBUSHER,AddPos[1][0],AddPos[1][1],AddPos[1][2]); SummonAdd(MOBID_COILFANG_AMBUSHER,AddPos[2][0],AddPos[2][1],AddPos[2][2]); SummonAdd(MOBID_COILFANG_AMBUSHER,AddPos[3][0],AddPos[3][1],AddPos[3][2]); SummonAdd(MOBID_COILFANG_AMBUSHER,AddPos[4][0],AddPos[4][1],AddPos[4][2]); SummonAdd(MOBID_COILFANG_AMBUSHER,AddPos[5][0],AddPos[5][1],AddPos[5][2]); SummonAdd(MOBID_COILFANG_GUARDIAN,AddPos[6][0],AddPos[6][1],AddPos[6][2]); SummonAdd(MOBID_COILFANG_GUARDIAN,AddPos[7][0],AddPos[7][1],AddPos[7][2]); SummonAdd(MOBID_COILFANG_GUARDIAN,AddPos[8][0],AddPos[8][1],AddPos[8][2]); Spawned = true; } }
void UpdateAI(const uint32 diff) { if (WaterTimer < diff) // every 1000ms { Map *map = m_creature->GetMap(); if(!map->IsDungeon()) return; Map::PlayerList const &players = map->GetPlayers(); if(players.getSize()==0) return; for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) { Player* plr = itr->getSource(); if (!plr) continue; if (!(plr)->GetSession() || !(plr)->isAlive()) continue; if (!InCombat && plr->GetDistance(m_creature) < 2.25 && (plr->HasAura(33095, 2))) { if (TimeToSpawn%40 == 0) { DoYell(EMOTE_STOPFISHING, LANG_UNIVERSAL, NULL); } if (FirstVictim == 0) FirstVictim = plr; // Remember the first player who started fishing // the player is trying to catch fish TimeToSpawn--; // Time to spawn reduced for every fishing player by 1 per second } // --> more fishermen(and-women): faster spawn if (!InCombat && (TimeToSpawn<=1)) // effective up to TimeToSpawn seconds of fishing { if (pInstance) pInstance->SetData(DATA_THELURKERBELOWEVENT, IN_PROGRESS); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); m_creature->RemoveFlag(UNIT_NPC_EMOTESTATE, EMOTE_STATE_SUBMERGED); DoCast(m_creature, SPELL_EMERGE); m_creature->setFaction(14); InCombat = true; if (FirstVictim) { if (FirstVictim->GetSession() && FirstVictim->isAlive()) m_creature->AddThreat(FirstVictim, 1.0f); // guarantee, that first fisher is first in ThreatList } Aggro(NULL); // Put anybody else into the fight (with 0.0 aggro) } if(plr && plr->GetDistance(m_creature ) > 5625) { if (plr->HasAura(SCALDING_WATER,0)) plr->RemoveAurasDueToSpell(SCALDING_WATER); if (plr->IsInWater() && !plr->isGameMaster() && !InCombat) { Fishy = plr->SummonCreature(MOB_COILFANG_FRENZY,plr->GetPositionX(),plr->GetPositionY(),plr->GetPositionZ(),plr->GetOrientation(),TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,15000); if (Fishy) Fishy->AI()->AttackStart(plr); } }else{ if (plr->IsInWater()) { if (!plr->HasAura(SCALDING_WATER,0)) plr->CastSpell(plr,SCALDING_WATER,true); }else{ if (plr->HasAura(SCALDING_WATER,0)) plr->RemoveAurasDueToSpell(SCALDING_WATER); } } } WaterTimer = 1000; }else WaterTimer -= diff; //Return since we have no target if (!m_creature->SelectHostilTarget() || !m_creature->getVictim() ) return; if(!Submerged) { if(SpoutTimer < diff) { //Turning while spouting ;) bit fuzzy but working if (OrientationUpdated == -1) { OrientationUpdated = 0; Unit* target = NULL; target = SelectUnit(SELECT_TARGET_TOPAGGRO,0); m_creature->SetUInt64Value(UNIT_FIELD_TARGET, 0); //DoTextEmote(EMOTE_SPOUT,NULL); SpoutTimer = 5000; switch(rand()%2) { case 0: Clockwise = true; break; case 1: Clockwise = false; break; } guids.clear(); //clear targets return; } else { if(Clockwise) SpoutAngle += PI/100; else SpoutAngle -= PI/100; if(SpoutAngle > 2*PI) SpoutAngle -= 2*PI; if(SpoutAngle < 0) SpoutAngle += 2*PI; //So spin around ya evil fish m_creature->SetUInt64Value(UNIT_FIELD_TARGET, 0); m_creature->SetOrientation(SpoutAngle); m_creature->StopMoving(); //Spout part if(SVTimer < diff) { DoCast(m_creature, SPELL_SPOUT); SVTimer = 850; } SVTimer -= diff; OrientationUpdated++; SpoutTimer = 100; if (OrientationUpdated == 200) { SpoutTimer = 45000; OrientationUpdated = -1; WhirlTimer = 5000; Unit *victim = m_creature->getVictim(); if(victim) { m_creature->SetUInt64Value(UNIT_FIELD_TARGET, victim->GetGUID()); } } } }else SpoutTimer -= diff; if(PhaseTimer >= diff) PhaseTimer -= diff; //need to count the phase timer while spouting too if(OrientationUpdated != -1) return; //Whirl directly after a Spout and at random times if(WhirlTimer < diff) { WhirlTimer = rand()%5000 + 15000; DoCast(m_creature,SPELL_WHIRL); }else WhirlTimer -= diff; if(PhaseTimer < diff) { DoCast(m_creature,SPELL_SUBMERGE); PhaseTimer = 60000; Submerged = true; }else PhaseTimer -= diff; if(GeyserTimer < diff) { Unit* target = NULL; target = SelectUnit(SELECT_TARGET_RANDOM,1); GeyserTimer = rand()%15000 + 10000; if(target) DoCast(target,SPELL_GEYSER); }else GeyserTimer -= diff; if(WaterboltTimer < diff) { Unit* target = NULL; int i = 0; bool meleeTarget = false; target = SelectUnit(SELECT_TARGET_TOPAGGRO,0); if (!target) target = m_creature->getVictim(); while (target) { if( m_creature->IsWithinDistInMap(target, 6)) { meleeTarget = true; break; } target = SelectUnit(SELECT_TARGET_TOPAGGRO,i); i++; } if(!meleeTarget) { DoCast(m_creature->getVictim(),SPELL_WATERBOLT); WaterboltTimer = 3000; } else DoMeleeAttackIfReady(); // WTF ? (1) }else WaterboltTimer -= diff; DoMeleeAttackIfReady(); //(1) } else { if(PhaseTimer < diff) { Submerged = false; m_creature->RemoveAllAuras(); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); m_creature->RemoveFlag(UNIT_NPC_EMOTESTATE, EMOTE_STATE_SUBMERGED); m_creature->RemoveFlag(UNIT_FIELD_BYTES_1,9); DoCast(m_creature, SPELL_EMERGE); Spawned = false; SpoutTimer = 5000; PhaseTimer = 120000; return; } else { /*if(!m_creature->isInCombat()) m_creature->SetInCombat();*/ PhaseTimer -= diff; } if(!Spawned) { m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); SummonAdd(MOBID_COILFANG_AMBUSHER,AddPos[0][0],AddPos[0][1],AddPos[0][2]); SummonAdd(MOBID_COILFANG_AMBUSHER,AddPos[1][0],AddPos[1][1],AddPos[1][2]); SummonAdd(MOBID_COILFANG_AMBUSHER,AddPos[2][0],AddPos[2][1],AddPos[2][2]); SummonAdd(MOBID_COILFANG_AMBUSHER,AddPos[3][0],AddPos[3][1],AddPos[3][2]); SummonAdd(MOBID_COILFANG_AMBUSHER,AddPos[4][0],AddPos[4][1],AddPos[4][2]); SummonAdd(MOBID_COILFANG_AMBUSHER,AddPos[5][0],AddPos[5][1],AddPos[5][2]); SummonAdd(MOBID_COILFANG_GUARDIAN,AddPos[6][0],AddPos[6][1],AddPos[6][2]); SummonAdd(MOBID_COILFANG_GUARDIAN,AddPos[7][0],AddPos[7][1],AddPos[7][2]); SummonAdd(MOBID_COILFANG_GUARDIAN,AddPos[8][0],AddPos[8][1],AddPos[8][2]); Spawned = true; } } }