void UpdateAI(uint32 const diff) { if (!UpdateVictim()) return; events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_MELEE_CHECK: if (!me->IsWithinMeleeRange(me->getVictim())) DoCast(SPELL_PETRIFY_BREATH); events.ScheduleEvent(EVENT_MELEE_CHECK, 1 * IN_MILLISECONDS); break; case EVENT_SWEEP: if (haveLeftArm) { if (Creature* target = me->FindNearestCreature(NPC_ARM_SWEEP_STALKER, 500.0f, true)) { DoCast(target, SPELL_ARM_SWEEP, true); Talk(SAY_SHOCKWAVE); } } events.ScheduleEvent(EVENT_SWEEP, 25 * IN_MILLISECONDS); break; case EVENT_SMASH: if (haveLeftArm && haveRightArm) DoCastVictim(SPELL_TWO_ARM_SMASH); else if (haveLeftArm || haveRightArm) DoCastVictim(SPELL_ONE_ARM_SMASH); events.ScheduleEvent(EVENT_SMASH, 15 * IN_MILLISECONDS); break; case EVENT_STONE_SHOUT: DoCast(SPELL_STONE_SHOUT); events.ScheduleEvent(EVENT_STONE_SHOUT, 2 * IN_MILLISECONDS); break; case EVENT_ENRAGE: DoCast(SPELL_BERSERK); Talk(SAY_BERSERK); break; case EVENT_RESPAWN_LEFT_ARM: case EVENT_RESPAWN_RIGHT_ARM: { if (vehicle) { int8 seat = eventId == EVENT_RESPAWN_LEFT_ARM ? 0 : 1; uint32 entry = eventId == EVENT_RESPAWN_LEFT_ARM ? NPC_LEFT_ARM : NPC_RIGHT_ARM; vehicle->InstallAccessory(entry, seat, true, TEMPSUMMON_MANUAL_DESPAWN, 0); } Talk(eventId == EVENT_RESPAWN_LEFT_ARM ? EMOTE_LEFT : EMOTE_RIGHT); break; } case EVENT_STONE_GRIP: { if (haveRightArm) { DoCast(SPELL_STONE_GRIP); Talk(SAY_GRAB_PLAYER); Talk(EMOTE_STONE); } events.ScheduleEvent(EVENT_STONE_GRIP, 25 * IN_MILLISECONDS); } break; case EVENT_FOCUSED_EYEBEAM: if (Unit* eyebeamTargetUnit = GetEyeBeamTarget()) { eyebeamTarget = eyebeamTargetUnit->GetGUID(); DoCast(me, SPELL_SUMMON_FOCUSED_EYEBEAM, true); } events.ScheduleEvent(EVENT_FOCUSED_EYEBEAM, urand(15, 35) * IN_MILLISECONDS); break; } } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 const diff) { if (!UpdateVictim()) return; events.Update(diff); _DoAggroPulse(diff); if (me->HasUnitState(UNIT_STAT_CASTING)) return; switch (events.GetEvent()) { case EVENT_MELEE_CHECK: if (!me->IsWithinMeleeRange(me->getVictim())) DoCast(SPELL_PETRIFY_BREATH); events.RepeatEvent(1000); break; case EVENT_SWEEP: if (left) { DoCast(SPELL_ARM_SWEEP); DoScriptText(SAY_SHOCKWAVE, me); } events.RepeatEvent(25000); break; case EVENT_SMASH: if (left && right) DoCastVictim(SPELL_TWO_ARM_SMASH); else if (left || right) DoCastVictim(SPELL_ONE_ARM_SMASH); events.RepeatEvent(15000); break; case EVENT_STONE_SHOUT: DoCast(SPELL_STONE_SHOUT); events.RepeatEvent(2000); break; case EVENT_ENRAGE: DoCast(SPELL_BERSERK); DoScriptText(SAY_BERSERK, me); events.CancelEvent(EVENT_ENRAGE); break; case EVENT_RESPAWN_LEFT_ARM: { RespawnArm(NPC_LEFT_ARM); me->MonsterTextEmote(EMOTE_LEFT, 0, true); events.CancelEvent(EVENT_RESPAWN_LEFT_ARM); break; } case EVENT_RESPAWN_RIGHT_ARM: { RespawnArm(NPC_RIGHT_ARM); me->MonsterTextEmote(EMOTE_RIGHT, 0, true); events.CancelEvent(EVENT_RESPAWN_RIGHT_ARM); break; } case EVENT_STONE_GRIP: { if (right) { DoCast(SPELL_STONE_GRIP); me->MonsterTextEmote(EMOTE_STONE, 0, true); DoScriptText(SAY_GRAB_PLAYER, me); } events.RepeatEvent(25000); break; } case EVENT_SHOCKWAVE: if (left) { DoScriptText(SAY_SHOCKWAVE, me); DoCastAOE(SPELL_SHOCKWAVE, true); DoCastAOE(SPELL_SHOCKWAVE_VISUAL, true); } events.RepeatEvent(urand(15000, 25000)); break; case EVENT_FOCUSED_EYEBEAM: Unit* eyebeamTargetUnit = GetEyeBeamTarget(); if (!eyebeamTargetUnit) eyebeamTargetUnit = SelectTarget(SELECT_TARGET_RANDOM, 0, 60.0f, true, -SPELL_STONE_GRIP_DOT); if (eyebeamTargetUnit) { eyebeamTarget = eyebeamTargetUnit->GetGUID(); me->MonsterWhisper(EMOTE_EYEBEAM, eyebeamTarget, true); eyebeamTargetUnit->CastSpell(eyebeamTargetUnit, 63343, true, NULL, NULL, me->GetGUID()); eyebeamTargetUnit->CastSpell(eyebeamTargetUnit, 63701, true, NULL, NULL, me->GetGUID()); //DoCast(SPELL_SUMMON_FOCUSED_EYEBEAM); } events.RepeatEvent(urand(15000, 35000)); break; } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 const diff) { if (!UpdateVictim()) return; events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_MELEE_CHECK: if (!me->IsWithinMeleeRange(me->getVictim())) DoCastVictim(SPELL_PETRIFY_BREATH); events.ScheduleEvent(EVENT_MELEE_CHECK, 4*IN_MILLISECONDS); return; case EVENT_PETRIFY_BREATH: DoCastVictim(SPELL_PETRIFY_BREATH); events.ScheduleEvent(EVENT_PETRIFY_BREATH, urand(8*IN_MILLISECONDS, 12*IN_MILLISECONDS)); break; case EVENT_SWEEP: // Cast for left arm if (haveLeftArm) { if (Creature* target = me->FindNearestCreature(NPC_ARM_SWEEP_STALKER, 500.0f, true)) { DoCast(target, SPELL_ARM_SWEEP, true); Talk(SAY_SHOCKWAVE); } } events.ScheduleEvent(EVENT_SWEEP, 25*IN_MILLISECONDS); return; case EVENT_STONE_GRIP: // Cast for right arm if (haveRightArm) { DoCast(SPELL_STONE_GRIP); Talk(EMOTE_STONE); Talk(SAY_GRAB_PLAYER); } events.ScheduleEvent(EVENT_STONE_GRIP, 25*IN_MILLISECONDS); return; case EVENT_SMASH: if (haveLeftArm && haveRightArm) DoCastVictim(SPELL_TWO_ARM_SMASH); else if (haveLeftArm || haveRightArm) DoCastVictim(SPELL_ONE_ARM_SMASH); events.ScheduleEvent(EVENT_SMASH, 15 * IN_MILLISECONDS); return; case EVENT_STONE_SHOUT: DoCast(SPELL_STONE_SHOUT); events.ScheduleEvent(EVENT_STONE_SHOUT, 2*IN_MILLISECONDS); return; case EVENT_ENRAGE: DoCast(SPELL_BERSERK); Talk(SAY_BERSERK); return; case EVENT_RESPAWN_LEFT_ARM: RespawnArm(NPC_LEFT_ARM); Talk(EMOTE_LEFT); events.CancelEvent(EVENT_RESPAWN_LEFT_ARM); return; case EVENT_RESPAWN_RIGHT_ARM: RespawnArm(NPC_RIGHT_ARM); Talk(EMOTE_RIGHT); events.CancelEvent(EVENT_RESPAWN_RIGHT_ARM); return; case EVENT_FOCUSED_EYEBEAM: if (Player* eyebeamTargetUnit = GetEyeBeamTarget()) { eyebeamTarget = eyebeamTargetUnit->GetGUID(); Talk(WHISPER_EYEBEAM, eyebeamTarget); eyebeamTargetUnit->CastSpell(eyebeamTargetUnit, 63343, true, NULL, NULL, me->GetGUID()); eyebeamTargetUnit->CastSpell(eyebeamTargetUnit, 63701, true, NULL, NULL, me->GetGUID()); } events.ScheduleEvent(EVENT_FOCUSED_EYEBEAM, urand(15*IN_MILLISECONDS, 35*IN_MILLISECONDS)); return; default: return; } } DoMeleeAttackIfReady(); }