void ExecuteEvent(uint32 eventId) override { switch (eventId) { case EVENT_TWIN_SPIKE: DoCastVictim(SpikeSpellId); events.Repeat(20s); break; case EVENT_TOUCH: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 200.0f, true, true, OtherEssenceSpellId)) { CastSpellExtraArgs args; args.AddSpellMod(SPELLVALUE_MAX_TARGETS, 1); // @todo spellmgr correction instead? me->CastSpell(target, TouchSpellId, args); } events.Repeat(10s, 15s); break; case EVENT_BERSERK: DoCast(me, SPELL_BERSERK); Talk(SAY_BERSERK); break; case EVENT_START_MOVE: events.SetPhase(PHASE_COMBAT); me->GetMotionMaster()->MoveAlongSplineChain(POINT_INITIAL_MOVEMENT, SPLINE_INITIAL_MOVEMENT, false); break; default: break; } }
void OnPeriodic(AuraEffect const* aurEff) { PreventDefaultAction(); static const int32 damageForTick[8] = { 500, 500, 1000, 1000, 2000, 2000, 3000, 5000 }; CastSpellExtraArgs args; args.TriggerFlags = TRIGGERED_FULL_MASK; args.TriggeringAura = aurEff; args.AddSpellMod(SPELLVALUE_BASE_POINT0, damageForTick[aurEff->GetTickNumber() - 1]); GetTarget()->CastSpell(nullptr, SPELL_INFERNO_DMG, args); }
void UpdateAI(uint32 diff) override { _events.Update(diff); while (uint32 eventId = _events.ExecuteEvent()) { switch (eventId) { case EVENT_INFERNAL_RAIN_CAST: { std::list<Creature*> infernalrainList; Trinity::AllCreaturesOfEntryInRange checker(me, NPC_INFERNAL_RAIN, 200.0f); Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange> searcher(me, infernalrainList, checker); Cell::VisitAllObjects(me, searcher, 200.0f); if (!infernalrainList.empty()) { Creature* random = Trinity::Containers::SelectRandomContainerElement(infernalrainList); if (random->isMoving() && random->GetPositionZ() < 118.0f) { CastSpellExtraArgs args; args.AddSpellMod(SPELLVALUE_MAX_TARGETS, 1); me->CastSpell(random, SPELL_INFERNAL_RAIN, args); } } _events.ScheduleEvent(EVENT_INFERNAL_RAIN_CAST, 1s, 2s); break; } case EVENT_INFERNAL_RAIN_STOP: _events.CancelEvent(EVENT_INFERNAL_RAIN_CAST); if (Creature* watchcommanderLeonus = me->FindNearestCreature(NPC_WATCH_COMMANDER_LEONUS, 200)) watchcommanderLeonus->AI()->SetData(DATA_ACTIVE, DATA_ACTIVE); break; } } }
void HandleStormSequence(Unit* Cloud) // 1: begin, 2-9: tick, 10: end { if (StormCount < 10 && StormCount > 1) { // deal damage int32 bp0 = 800; for (uint8 i = 2; i < StormCount; ++i) bp0 *= 2; std::list<Unit*> tempUnitMap; Trinity::AnyAoETargetUnitInObjectRangeCheck u_check(me, me, SIZE_OF_GRIDS); Trinity::UnitListSearcher<Trinity::AnyAoETargetUnitInObjectRangeCheck> searcher(me, tempUnitMap, u_check); Cell::VisitAllObjects(me, searcher, SIZE_OF_GRIDS); // deal damage for (std::list<Unit*>::const_iterator i = tempUnitMap.begin(); i != tempUnitMap.end(); ++i) { if (Unit* target = (*i)) { if (Cloud && !Cloud->IsWithinDist(target, 6, false)) { CastSpellExtraArgs args; args.TriggerFlags = TRIGGERED_FULL_MASK; args.OriginalCaster = me->GetGUID(); args.AddSpellMod(SPELLVALUE_BASE_POINT0, bp0); Cloud->CastSpell(target, SPELL_ZAP, args); } } } // visual float x, y, z; z = me->GetPositionZ(); uint8 maxCount = 5 + rand32() % 5; for (uint8 i = 0; i < maxCount; ++i) { x = 343.0f + rand32() % 60; y = 1380.0f + rand32() % 60; if (Unit* trigger = me->SummonTrigger(x, y, z, 0, 2000)) { trigger->SetFaction(FACTION_FRIENDLY); trigger->SetMaxHealth(100000); trigger->SetHealth(100000); trigger->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); if (Cloud) { CastSpellExtraArgs args; args.TriggerFlags = TRIGGERED_FULL_MASK; args.OriginalCaster = Cloud->GetGUID(); args.AddSpellMod(SPELLVALUE_BASE_POINT0, bp0); Cloud->CastSpell(trigger, SPELL_ZAP, args); } } } } ++StormCount; if (StormCount > 10) { StormCount = 0; // finish events.ScheduleEvent(EVENT_SUMMON_EAGLES, 5s); me->InterruptNonMeleeSpells(false); CloudGUID.Clear(); if (Cloud) Cloud->KillSelf(); SetWeather(WEATHER_STATE_FINE, 0.0f); isRaining = false; } events.ScheduleEvent(EVENT_STORM_SEQUENCE, 1s); }
void UpdateAI(uint32 diff) override { if (!UpdateVictim() && !events.IsInPhase(PHASE_INTRO)) return; events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_INTRO_1: Talk(SAY_INTRO1); events.ScheduleEvent(EVENT_INTRO_2, Seconds(4), 0, PHASE_INTRO); break; case EVENT_INTRO_2: { EntryCheckPredicate pred(NPC_ANTAGONIST); summons.DoAction(ACTION_ANTAGONIST_SAY_1, pred); events.ScheduleEvent(EVENT_INTRO_3, Seconds(3), 0, PHASE_INTRO); break; } case EVENT_INTRO_3: { Talk(SAY_INTRO2); EntryCheckPredicate pred(NPC_ANTAGONIST); summons.DoAction(ACTION_ANTAGONIST_SAY_2, pred); break; } case EVENT_RESPAWN_ILSA: SummonSister(NPC_ILSA_DIREBREW); break; case EVENT_RESPAWN_URSULA: SummonSister(NPC_URSULA_DIREBREW); break; case EVENT_SUMMON_MOLE_MACHINE: { CastSpellExtraArgs args; args.TriggerFlags = TRIGGERED_FULL_MASK; args.AddSpellMod(SPELLVALUE_MAX_TARGETS, 1); me->CastSpell(nullptr, SPELL_MOLE_MACHINE_TARGET_PICKER, args); events.Repeat(Seconds(15)); break; } case EVENT_DIREBREW_DISARM: DoCastSelf(SPELL_DIREBREW_DISARM_PRE_CAST, true); events.Repeat(Seconds(20)); break; default: break; } if (me->HasUnitState(UNIT_STATE_CASTING)) return; } DoMeleeAttackIfReady(); }
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_SLASH: DoCastVictim(SPELL_FREEZE_SLASH); events.ScheduleEvent(EVENT_FREEZE_SLASH, 15*IN_MILLISECONDS, 0, PHASE_MELEE); return; case EVENT_PENETRATING_COLD: { CastSpellExtraArgs args; args.AddSpellMod(SPELLVALUE_MAX_TARGETS, RAID_MODE(2, 5, 2, 5)); me->CastSpell(nullptr, SPELL_PENETRATING_COLD, args); events.ScheduleEvent(EVENT_PENETRATING_COLD, 20 * IN_MILLISECONDS, 0, PHASE_MELEE); return; } case EVENT_SUMMON_NERUBIAN: if (IsHeroic() || !_reachedPhase3) { CastSpellExtraArgs args; args.AddSpellMod(SPELLVALUE_MAX_TARGETS, RAID_MODE(1, 2, 2, 4)); me->CastSpell(nullptr, SPELL_SUMMON_BURROWER, args); } events.ScheduleEvent(EVENT_SUMMON_NERUBIAN, 45*IN_MILLISECONDS, 0, PHASE_MELEE); return; case EVENT_NERUBIAN_SHADOW_STRIKE: { EntryCheckPredicate pred(NPC_BURROWER); summons.DoAction(ACTION_SHADOW_STRIKE, pred); events.ScheduleEvent(EVENT_NERUBIAN_SHADOW_STRIKE, 30*IN_MILLISECONDS, 0, PHASE_MELEE); break; } case EVENT_SUBMERGE: if (!_reachedPhase3 && !me->HasAura(SPELL_BERSERK)) { DoCast(me, SPELL_SUBMERGE_ANUBARAK); DoCast(me, SPELL_CLEAR_ALL_DEBUFFS); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); Talk(EMOTE_BURROWER); events.SetPhase(PHASE_SUBMERGED); events.ScheduleEvent(EVENT_PURSUING_SPIKE, 2*IN_MILLISECONDS, 0, PHASE_SUBMERGED); events.ScheduleEvent(EVENT_SUMMON_SCARAB, 4*IN_MILLISECONDS, 0, PHASE_SUBMERGED); events.ScheduleEvent(EVENT_EMERGE, 1*MINUTE*IN_MILLISECONDS, 0, PHASE_SUBMERGED); } break; case EVENT_PURSUING_SPIKE: DoCast(SPELL_SPIKE_CALL); break; case EVENT_SUMMON_SCARAB: { /* WORKAROUND * - The correct implementation is more likely the comment below but it needs spell knowledge */ GuidList::iterator i = _burrowGUID.begin(); uint32 at = urand(0, _burrowGUID.size()-1); for (uint32 k = 0; k < at; k++) ++i; if (Creature* pBurrow = ObjectAccessor::GetCreature(*me, *i)) pBurrow->CastSpell(pBurrow, 66340, false); events.ScheduleEvent(EVENT_SUMMON_SCARAB, 4*IN_MILLISECONDS, 0, PHASE_SUBMERGED); /*It seems that this spell have something more that needs to be taken into account //Need more sniff info DoCast(SPELL_SUMMON_BEATLES); // Just to make sure it won't happen again in this phase m_uiSummonScarabTimer = 90*IN_MILLISECONDS;*/ break; } case EVENT_EMERGE: events.ScheduleEvent(EVENT_SUBMERGE, 80*IN_MILLISECONDS, 0, PHASE_MELEE); DoCast(SPELL_SPIKE_TELE); summons.DespawnEntry(NPC_SPIKE); me->RemoveAurasDueToSpell(SPELL_SUBMERGE_ANUBARAK); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); DoCast(me, SPELL_EMERGE_ANUBARAK); Talk(EMOTE_EMERGE); events.SetPhase(PHASE_MELEE); events.ScheduleEvent(EVENT_FREEZE_SLASH, 15*IN_MILLISECONDS, 0, PHASE_MELEE); events.ScheduleEvent(EVENT_PENETRATING_COLD, 20*IN_MILLISECONDS, PHASE_MELEE); events.ScheduleEvent(EVENT_SUMMON_NERUBIAN, 10*IN_MILLISECONDS, 0, PHASE_MELEE); events.ScheduleEvent(EVENT_SUBMERGE, 80*IN_MILLISECONDS, 0, PHASE_MELEE); if (IsHeroic()) events.ScheduleEvent(EVENT_NERUBIAN_SHADOW_STRIKE, 30*IN_MILLISECONDS, 0, PHASE_MELEE); return; case EVENT_SUMMON_FROST_SPHERE: { uint8 startAt = urand(0, 5); uint8 i = startAt; do { if (Unit* pSphere = ObjectAccessor::GetCreature(*me, _sphereGUID[i])) { if (!pSphere->HasAura(SPELL_FROST_SPHERE)) { if (Creature* summon = me->SummonCreature(NPC_FROST_SPHERE, SphereSpawn[i])) _sphereGUID[i] = summon->GetGUID(); break; } } i = (i + 1) % 6; } while (i != startAt); events.ScheduleEvent(EVENT_SUMMON_FROST_SPHERE, urand(20*IN_MILLISECONDS, 30*IN_MILLISECONDS)); break; } case EVENT_BERSERK: DoCast(me, SPELL_BERSERK); break; default: break; } if (me->HasUnitState(UNIT_STATE_CASTING)) return; } if (HealthBelowPct(30) && events.IsInPhase(PHASE_MELEE) && !_reachedPhase3) { _reachedPhase3 = true; DoCastAOE(SPELL_LEECHING_SWARM); Talk(EMOTE_LEECHING_SWARM); Talk(SAY_LEECHING_SWARM); } if (events.IsInPhase(PHASE_MELEE)) DoMeleeAttackIfReady(); }