void UpdateAI(uint32 diff) override { if (!UpdateVictim()) return; events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_FREEZE: DoCastAOE(SPELL_FREEZE); events.ScheduleEvent(EVENT_FREEZE, 30s, 45s); break; case EVENT_ICICLE: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) DoCast(target, SPELL_ICICLE); events.ScheduleEvent(EVENT_ICICLE, RAID_MODE(5500, 3500)); break; case EVENT_FLASH_FREEZE: Talk(SAY_FLASH_FREEZE); Talk(EMOTE_FREEZE); for (uint8 n = 0; n < RAID_MODE(2, 3); ++n) if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) target->CastSpell(target, SPELL_ICICLE_SNOWDRIFT, true); DoCast(SPELL_FLASH_FREEZE); events.ScheduleEvent(EVENT_FLASH_FREEZE_EFFECT, 500ms); break; case EVENT_FLASH_FREEZE_EFFECT: { std::list<Creature*> IcicleSnowdriftList; GetCreatureListWithEntryInGrid(IcicleSnowdriftList, me, NPC_SNOWPACKED_ICICLE, 100.0f); for (std::list<Creature*>::iterator itr = IcicleSnowdriftList.begin(); itr != IcicleSnowdriftList.end(); ++itr) (*itr)->CastSpell(me, SPELL_FLASH_FREEZE_VISUAL, true); FlashFreeze(); events.CancelEvent(EVENT_FLASH_FREEZE_EFFECT); events.ScheduleEvent(EVENT_FLASH_FREEZE, 25s, 35s); break; } case EVENT_BLOWS: Talk(SAY_STALACTITE); Talk(EMOTE_BLOWS); DoCast(me, SPELL_FROZEN_BLOWS); events.ScheduleEvent(EVENT_BLOWS, 60s, 65s); break; case EVENT_RARE_CACHE: Talk(SAY_HARD_MODE_FAILED); iCouldSayThatThisCacheWasRare = false; instance->SetData(DATA_HODIR_RARE_CACHE, 0); events.CancelEvent(EVENT_RARE_CACHE); break; case EVENT_BERSERK: Talk(SAY_BERSERK); DoCast(me, SPELL_BERSERK, true); events.CancelEvent(EVENT_BERSERK); break; } if (me->HasUnitState(UNIT_STATE_CASTING)) return; } if (gettingColdInHereTimer <= diff && gettingColdInHere) { for (auto const& pair : me->GetCombatManager().GetPvECombatRefs()) if (Player* target = pair.second->GetOther(me)->ToPlayer()) if (Aura* BitingColdAura = target->GetAura(SPELL_BITING_COLD_TRIGGERED)) if (BitingColdAura->GetStackAmount() > 2) SetData(DATA_GETTING_COLD_IN_HERE, 0); gettingColdInHereTimer = 1000; } else gettingColdInHereTimer -= diff; DoMeleeAttackIfReady(); }
void UpdateAI(uint32 const diff) { if (!UpdateVictim()) return; events.Update(diff); if (me->HasUnitState(UNIT_STAT_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_FREEZE: DoCastAOE(SPELL_FREEZE); events.ScheduleEvent(EVENT_FREEZE, urand(30000, 45000)); break; case EVENT_ICICLE: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) DoCast(target, SPELL_ICICLE); events.ScheduleEvent(EVENT_ICICLE, RAID_MODE(5500, 3500)); break; case EVENT_FLASH_FREEZE: DoScriptText(SAY_FLASH_FREEZE, me); DoScriptText(EMOTE_FREEZE, me); for (uint8 n = 0; n < RAID_MODE(2, 3); ++n) if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) target->CastSpell(target, SPELL_ICICLE_SNOWDRIFT, true); DoCast(SPELL_FLASH_FREEZE); events.ScheduleEvent(EVENT_FLASH_FREEZE_EFFECT, 500); break; case EVENT_FLASH_FREEZE_EFFECT: { std::list<Creature*> IcicleSnowdriftList; GetCreatureListWithEntryInGrid(IcicleSnowdriftList, me, NPC_SNOWPACKED_ICICLE, 100.0f); for (std::list<Creature*>::iterator itr = IcicleSnowdriftList.begin(); itr != IcicleSnowdriftList.end(); ++itr) (*itr)->CastSpell(me, SPELL_FLASH_FREEZE_VISUAL, true); FlashFreeze(); events.CancelEvent(EVENT_FLASH_FREEZE_EFFECT); events.ScheduleEvent(EVENT_FLASH_FREEZE, urand(25000, 35000)); break; } case EVENT_BLOWS: DoScriptText(SAY_STALACTITE, me); DoScriptText(EMOTE_BLOWS, me); DoCast(me, SPELL_FROZEN_BLOWS); events.ScheduleEvent(EVENT_BLOWS, urand(60000, 65000)); break; case EVENT_RARE_CACHE: DoScriptText(SAY_HARD_MODE_FAILED, me); iCouldSayThatThisCacheWasRare = false; events.CancelEvent(EVENT_RARE_CACHE); break; case EVENT_BERSERK: DoScriptText(SAY_BERSERK, me); DoCast(me, SPELL_BERSERK, true); events.CancelEvent(EVENT_BERSERK); break; } } if (gettingColdInHereTimer <= diff && gettingColdInHere) { std::list<HostileReference*> ThreatList = me->getThreatManager().getThreatList(); for (std::list<HostileReference*>::const_iterator itr = ThreatList.begin(); itr != ThreatList.end(); ++itr) if (Unit* target = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid())) if (Aura* BitingColdAura = target->GetAura(SPELL_BITING_COLD_TRIGGERED)) if ((target->GetTypeId() == TYPEID_PLAYER) && (BitingColdAura->GetStackAmount() > 2)) me->AI()->SetData(DATA_GETTING_COLD_IN_HERE, 0); gettingColdInHereTimer = 1000; } else gettingColdInHereTimer -= diff; DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; if (me->getVictim() && !me->getVictim()->GetCharmerOrOwnerPlayerOrPlayerItself()) me->Kill(me->getVictim()); events.Update(diff); if (me->hasUnitState(UNIT_STAT_CASTING)) return; if (uiCheckIntenseColdTimer < diff && !bMoreThanTwoIntenseCold) { std::list<HostileReference*> ThreatList = me->getThreatManager().getThreatList(); for (std::list<HostileReference*>::const_iterator itr = ThreatList.begin(); itr != ThreatList.end(); ++itr) { Unit *pTarget = Unit::GetUnit(*me, (*itr)->getUnitGuid()); if (!pTarget || pTarget->GetTypeId() != TYPEID_PLAYER) continue; Aura *AuraIntenseCold = pTarget->GetAura(SPELL_BITING_COLD_TRIGGERED); if (AuraIntenseCold && AuraIntenseCold->GetStackAmount() > 2) { bMoreThanTwoIntenseCold = true; break; } } uiCheckIntenseColdTimer = 2000; } else uiCheckIntenseColdTimer -= diff; while(uint32 eventId = events.ExecuteEvent()) { switch(eventId) { case EVENT_FREEZE: DoCastAOE(SPELL_FREEZE); events.ScheduleEvent(EVENT_FREEZE, urand(30000, 35000)); break; case EVENT_ICICLE: if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) if (pTarget->isAlive()) DoCast(pTarget, SPELL_ICICLE); events.ScheduleEvent(EVENT_ICICLE, 2000); break; case EVENT_FLASH_CAST: DoScriptText(SAY_FLASH_FREEZE, me); me->MonsterTextEmote(EMOTE_FREEZE, 0, true); for (uint32 i = 0; i < RAID_MODE(2,3); ++i) if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) if (pTarget->isAlive()) pTarget->CastSpell(pTarget, SPELL_ICICLE_SNOWDRIFT, true); DoCast(SPELL_FLASH_FREEZE); events.RescheduleEvent(EVENT_ICICLE, 15000); events.ScheduleEvent(EVENT_FLASH_CAST, 50000); events.ScheduleEvent(EVENT_FLASH_EFFECT, 9000); break; case EVENT_FLASH_EFFECT: DoCast(SPELL_FLASH_FREEZE_VISUAL); FlashFreeze(); events.CancelEvent(EVENT_FLASH_EFFECT); break; case EVENT_BLOWS: DoScriptText(SAY_STALACTITE, me); me->MonsterTextEmote(EMOTE_BLOWS, 0, true); DoCast(me, RAID_MODE(SPELL_FROZEN_BLOWS_10, SPELL_FROZEN_BLOWS_25)); events.ScheduleEvent(EVENT_BLOWS, urand(60000, 65000)); break; case EVENT_RARE_CACHE: DoScriptText(SAY_HARD_MODE_MISSED, me); RareCache = false; events.CancelEvent(EVENT_RARE_CACHE); break; case EVENT_BERSERK: DoCast(me, SPELL_BERSERK, true); DoScriptText(SAY_BERSERK, me); events.CancelEvent(EVENT_BERSERK); break; } } DoMeleeAttackIfReady(); }