void UpdateAI(uint32 diff) { if (_initialSelection) { _initialSelection = false; // Find victim of Summon Gargoyle spell std::list<Unit*> targets; Trinity::AnyUnfriendlyUnitInObjectRangeCheck u_check(me, me, 50); Trinity::UnitListSearcher<Trinity::AnyUnfriendlyUnitInObjectRangeCheck> searcher(me, targets, u_check); me->VisitNearbyObject(50, searcher); for (std::list<Unit*>::const_iterator iter = targets.begin(); iter != targets.end(); ++iter) if ((*iter)->GetAura(SPELL_DK_SUMMON_GARGOYLE_1, me->GetOwnerGUID())) { (*iter)->RemoveAura(SPELL_DK_SUMMON_GARGOYLE_1, me->GetOwnerGUID()); SetGazeOn(*iter); _targetGUID = (*iter)->GetGUID(); break; } } if (_despawnTimer > 4000) { _despawnTimer -= diff; if (!UpdateVictimWithGaze()) { MySelectNextTarget(); return; } _initialCastTimer += diff; _selectionTimer += diff; if (_selectionTimer >= 1000) { MySelectNextTarget(); _selectionTimer = 0; } if (_initialCastTimer >= 2000 && !me->HasUnitState(UNIT_STATE_CASTING|UNIT_STATE_LOST_CONTROL) && me->GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == NULL_MOTION_TYPE) me->CastSpell(me->GetVictim(), 51963, false); } else { if (!_despawning) FlyAway(); if (_despawnTimer > diff) _despawnTimer -= diff; else me->DespawnOrUnsummon(); } }
void UpdateAI(const uint32 diff) { if (!UpdateVictimWithGaze() || !CheckInRoom()) return; events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_WOUND: DoCast(me->getVictim(), SPELL_MORTAL_WOUND); events.ScheduleEvent(EVENT_WOUND, 10000); break; case EVENT_ENRAGE: // TODO : Add missing text DoCast(me, SPELL_ENRAGE); events.ScheduleEvent(EVENT_ENRAGE, 15000); break; case EVENT_DECIMATE: // TODO : Add missing text DoCastAOE(SPELL_DECIMATE); events.ScheduleEvent(EVENT_DECIMATE, 105000); break; case EVENT_BERSERK: DoCast(me, SPELL_BERSERK); events.ScheduleEvent(EVENT_BERSERK, 5*60000); break; case EVENT_SUMMON: for (int32 i = 0; i < RAID_MODE(1, 2); ++i) DoSummon(MOB_ZOMBIE, PosSummon[rand() % RAID_MODE(1, 3)]); events.ScheduleEvent(EVENT_SUMMON, 10000); break; } } if (me->getVictim() && me->getVictim()->GetEntry() == MOB_ZOMBIE) { if (me->IsWithinMeleeRange(me->getVictim())) { me->Kill(me->getVictim()); me->ModifyHealth(int32(me->CountPctFromMaxHealth(5))); } } else DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!UpdateVictimWithGaze() || !CheckInRoom()) return; events.Update(diff); while(uint32 eventId = events.ExecuteEvent()) { switch(eventId) { case EVENT_WOUND: DoCast(me->getVictim(), SPELL_MORTAL_WOUND); events.ScheduleEvent(EVENT_WOUND, 10000); return; case EVENT_ENRAGE: DoCast(me, SPELL_ENRAGE); events.ScheduleEvent(EVENT_ENRAGE, 30000); return; case EVENT_DECIMATE: DoCastAOE(SPELL_DECIMATE); events.ScheduleEvent(EVENT_DECIMATE, 105000); return; case EVENT_BERSERK: DoCast(me, SPELL_BERSERK); return; case EVENT_SUMMON: for(uint32 i = 0; i < HEROIC(1,2); ++i) DoSummon(MOB_ZOMBIE, triggers[rand()%3]); events.ScheduleEvent(EVENT_SUMMON, 10000); return; } } if (me->getVictim()->GetEntry() == MOB_ZOMBIE) { if (me->IsWithinMeleeRange(me->getVictim())) { me->Kill(me->getVictim()); me->ModifyHealth(me->GetMaxHealth() * 0.05f); } } else DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) override { if (!UpdateVictimWithGaze() || !CheckInRoom()) return; events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_WOUND: DoCastVictim(SPELL_MORTAL_WOUND); events.ScheduleEvent(EVENT_WOUND, 10000); break; case EVENT_ENRAGE: Talk(EMOTE_ENRAGE); DoCast(me, SPELL_ENRAGE); events.ScheduleEvent(EVENT_ENRAGE, 15000); break; case EVENT_DECIMATE: Talk(EMOTE_DECIMATE); DoCastAOE(SPELL_DECIMATE); events.ScheduleEvent(EVENT_DECIMATE, 105000); break; case EVENT_BERSERK: DoCast(me, SPELL_BERSERK); events.ScheduleEvent(EVENT_BERSERK, 5*60000); break; case EVENT_SUMMON: for (int32 i = 0; i < RAID_MODE(1, 2); ++i) DoSummon(NPC_ZOMBIE, PosSummon[rand32() % RAID_MODE(1, 3)]); // There's probably a better way to handle this for (SummonList::iterator itr = summons.begin(); itr != summons.end(); ++itr) if(Unit* unit = ObjectAccessor::GetUnit(*me, *itr)) if (unit->GetEntry() == NPC_ZOMBIE) unit->ToCreature()->AI()->AttackStart(me); events.ScheduleEvent(EVENT_SUMMON, 10000); break; } } DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if(!UpdateVictimWithGaze() || !CheckInRoom()) return; if(me->GetDistance(me->GetHomePosition()) > 80.0f) { EnterEvadeMode(); return; } events.Update(diff); while(uint32 eventId = events.ExecuteEvent()) { switch(eventId) { case EVENT_WOUND: DoCast(me->getVictim(), SPELL_MORTAL_WOUND); events.ScheduleEvent(EVENT_WOUND, 10000); break; case EVENT_ENRAGE: DoCast(me, SPELL_ENRAGE); events.ScheduleEvent(EVENT_ENRAGE, 15000); break; case EVENT_DECIMATE: DoCastAOE(SPELL_DECIMATE); events.ScheduleEvent(EVENT_DECIMATE, RAID_MODE(120000,90000)); for(std::list<uint64>::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) { Creature* minion = Unit::GetCreature(*me, *itr); if(minion && minion->isAlive()) { int32 damage = int32(minion->GetHealth()) - int32(minion->CountPctFromMaxHealth(5)); if(damage > 0) me->CastCustomSpell(28375, SPELLVALUE_BASE_POINT0, damage, minion, true); AttackGluth(minion); } } break; case EVENT_BERSERK: if(!me->HasAura(SPELL_BERSERK)) DoCast(me, SPELL_BERSERK); events.ScheduleEvent(EVENT_BERSERK, 1*60000); break; case EVENT_SUMMON: for(int32 i = 0; i < RAID_MODE(1, 2); ++i) DoSummon(MOB_ZOMBIE, PosSummon[rand() % RAID_MODE(1,3)]); events.ScheduleEvent(EVENT_SUMMON, 10000); break; } } if(me->getVictim() && me->getVictim()->GetEntry() == MOB_ZOMBIE) { if(me->IsWithinMeleeRange(me->getVictim())) { me->Kill(me->getVictim()); me->ModifyHealth(int32(me->CountPctFromMaxHealth(5))); } } else DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!UpdateVictimWithGaze() || !CheckInRoom()) return; events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_WOUND: DoCast(me->getVictim(), SPELL_MORTAL_WOUND); events.ScheduleEvent(EVENT_WOUND, 10000); break; case EVENT_ENRAGE: // TODO : Add missing text DoCast(me, SPELL_ENRAGE); events.ScheduleEvent(EVENT_ENRAGE, 15000); break; case EVENT_DECIMATE: DoCastAOE(SPELL_DECIMATE); for(SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) { if (Unit* summon = Unit::GetUnit((*me), (*itr))) { if (summon->GetEntry() == MOB_ZOMBIE) { // Set health manually to 5%, Decimate does not work since 3.3.3a summon->SetHealth(summon->CountPctFromMaxHealth(5)); summon->ToCreature()->AI()->AttackStart(me); summon->ToCreature()->SetReactState(REACT_PASSIVE); } } } events.ScheduleEvent(EVENT_DECIMATE, 105000); break; case EVENT_BERSERK: DoCast(me, SPELL_BERSERK); events.ScheduleEvent(EVENT_BERSERK, 5*60000); break; case EVENT_SUMMON: for (int32 i = 0; i < RAID_MODE(1, 2); ++i) DoSummon(MOB_ZOMBIE, PosSummon[rand() % RAID_MODE(1, 3)]); events.ScheduleEvent(EVENT_SUMMON, 10000); break; } } if (me->getVictim() && me->getVictim()->GetEntry() == MOB_ZOMBIE) { if (me->IsWithinMeleeRange(me->getVictim())) { me->Kill(me->getVictim()); me->ModifyHealth(int32(me->CountPctFromMaxHealth(5))); } } else DoMeleeAttackIfReady(); }