void MovementInform(uint32 type, uint32 id) { if (type != POINT_MOTION_TYPE) return; if (uiSpawnCounter >= DUNGEON_MODE(4, 5)) { uiWaypointId = 200; uiMovementTimer = 3000; } else { switch(id) { case 0: SpawnMobs(uiSpawnCounter); uiWaypointId = 1; ++uiSpawnCounter; uiMovementTimer = 3000; break; case 1: SpawnMobs(uiSpawnCounter); uiWaypointId = 0; ++uiSpawnCounter; uiMovementTimer = 3000; break; } } }
void UpdateAI(const uint32 diff) { switch (Phase) { case FLYING: if (!UpdateVictim()) return; if (me->GetPositionX() >= 515) { me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); if (!m_bSaidEmote) { DoScriptText(EMOTE_RANGE, me); m_bSaidEmote = true; } } else { me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); m_bSaidEmote = false; } if (m_uiMountTimer && m_uiMountTimer <= diff) { me->Mount(DATA_MOUNT); me->SetFlying(true); m_uiMountTimer = 0; } else m_uiMountTimer -= diff; if (m_uiSummonTimer <= diff) { SpawnMobs(); m_uiSummonTimer = 25000; } else m_uiSummonTimer -= diff; if (BreathSide != NONE) if (m_uiSpawnTriggerTimer <= diff) { me->SummonCreature(CREATURE_TRIGGER,Location[m_LocCount]); m_uiSpawnTriggerTimer = 125; m_LocCount++; if (m_LocCount > m_End) BreathSide = NONE; } else m_uiSpawnTriggerTimer -= diff; if (m_uiMovementTimer <= diff) { switch (m_uiWaypointId) { case 0: me->GetMotionMaster()->MovePoint(0, Location[1].GetPositionX(), Location[1].GetPositionY(), Location[1].GetPositionZ()); m_uiMovementTimer = 5000; break; case 1: me->GetMotionMaster()->MovePoint(0, Location[2].GetPositionX(), Location[2].GetPositionY(), Location[2].GetPositionZ()); m_uiMovementTimer = 2000; break; case 2: me->GetMotionMaster()->MovePoint(0, Location[3].GetPositionX(), Location[3].GetPositionY(), Location[3].GetPositionZ()); m_uiMovementTimer = 15000; break; case 3: switch (urand(0,1)) { case 0: BreathSide = LEFT; m_Start = 8; m_End = 37; m_LocNr = 69; break; case 1: BreathSide = RIGHT; m_Start = 38; m_End = 68; m_LocNr = 70; break; } me->GetMotionMaster()->MovePoint(0, Location[m_LocNr].GetPositionX(), Location[m_LocNr].GetPositionY(), Location[m_LocNr].GetPositionZ()); DoScriptText(RAND(SAY_DRAKE_BREATH_1, SAY_DRAKE_BREATH_2, SAY_DRAKE_BREATH_3), me); //DoScriptText(EMOTE_BREATH, me); m_uiMovementTimer = 2500; m_uiSpawnTriggerTimer = 3000; m_LocCount = m_Start; break; case 4: me->GetMotionMaster()->MovePoint(0, Location[71].GetPositionX(), Location[71].GetPositionY(), Location[71].GetPositionZ()); m_uiMovementTimer = 2000; //SpawnTrigger(); // if there are harpoon hits at this point, disable achievement if (m_uiSpellHitCount) m_bAchiev = false; break; case 5: me->GetMotionMaster()->MovePoint(0, Location[72].GetPositionX(), Location[72].GetPositionY(), Location[72].GetPositionZ()); m_uiMovementTimer = 15000; break; case 6: me->GetMotionMaster()->MovePoint(0, Location[3].GetPositionX(), Location[3].GetPositionY(), Location[3].GetPositionZ()); m_uiWaypointId = 2; m_uiMovementTimer = 15000; break; } m_uiWaypointId++; } else m_uiMovementTimer -= diff; break; case SKADI: //Return since we have no target if (!UpdateVictim()) return; if (!me->HasAura(DUNGEON_MODE(SPELL_WHIRLWIND, H_SPELL_WHIRLWIND))) { if (m_isWhirling) { m_isWhirling = false; me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MoveChase(me->getVictim()); m_uiWhirlwindTimer = 13000; } if (m_uiCrushTimer <= diff) { if(!me->IsNonMeleeSpellCasted(false)) { DoCastVictim(DUNGEON_MODE(SPELL_CRUSH, H_SPELL_CRUSH)); m_uiCrushTimer = urand(8000, 12000); } } else m_uiCrushTimer -= diff; if (m_uiPoisonedSpearTimer <= diff) { if(!me->IsNonMeleeSpellCasted(false)) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) DoCast(target, DUNGEON_MODE(SPELL_POISONED_SPEAR, H_SPELL_POISONED_SPEAR)); m_uiPoisonedSpearTimer = urand(10000, 12000); } } else m_uiPoisonedSpearTimer -= diff; } if (!m_isWhirling) { if (m_uiWhirlwindTimer <= diff) { if(!me->IsNonMeleeSpellCasted(false)) { if (Unit *newTarget = SelectTarget(SELECT_TARGET_RANDOM, 1)) m_uiWhirlGUID = newTarget->GetGUID(); DoCast(DUNGEON_MODE(SPELL_WHIRLWIND, H_SPELL_WHIRLWIND)); m_isWhirling = true; } } else m_uiWhirlwindTimer -= diff; } if (m_isWhirling) //somewhat hacky to get skadi move during whirlwind { if (m_uiWhirlwindTimer <= diff) { Unit *whirlTarget = Unit::GetUnit(*me, m_uiWhirlGUID); if (whirlTarget && whirlTarget->isAlive()) { me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MovePoint(0,whirlTarget->GetPositionX(),whirlTarget->GetPositionY(),whirlTarget->GetPositionZ()); } else if (Unit *newTarget = SelectTarget(SELECT_TARGET_RANDOM, 1)) //whirl target died { me->GetMotionMaster()->Clear(); m_uiWhirlGUID = newTarget->GetGUID(); me->GetMotionMaster()->MovePoint(0,newTarget->GetPositionX(),newTarget->GetPositionY(),newTarget->GetPositionZ()); } else //only 1 target left { me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MoveChase(me->getVictim()); } m_uiWhirlwindTimer = 500; } else m_uiWhirlwindTimer -= diff; } DoMeleeAttackIfReady(); break; } }
void UpdateAI(const uint32 diff) { switch (Phase) { case FLYING: if (!UpdateVictim()) return; if (me->GetPositionX() >= 519) { me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); if (!m_bSaidEmote) { DoScriptText(EMOTE_RANGE, me); m_bSaidEmote = true; } } else { me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); m_bSaidEmote = false; } if (m_uiMountTimer && m_uiMountTimer <= diff) { me->Mount(DATA_MOUNT); me->SetCanFly(true); m_uiMountTimer = 0; } else m_uiMountTimer -= diff; if (m_uiSummonTimer <= diff) { SpawnMobs(); m_uiSummonTimer = 25000; } else m_uiSummonTimer -= diff; if (m_uiMovementTimer <= diff) { switch (m_uiWaypointId) { case 0: me->GetMotionMaster()->MovePoint(0, Location[1].GetPositionX(), Location[1].GetPositionY(), Location[1].GetPositionZ()); m_uiMovementTimer = 5000; break; case 1: me->GetMotionMaster()->MovePoint(0, Location[2].GetPositionX(), Location[2].GetPositionY(), Location[2].GetPositionZ()); m_uiMovementTimer = 2000; break; case 2: me->GetMotionMaster()->MovePoint(0, Location[3].GetPositionX(), Location[3].GetPositionY(), Location[3].GetPositionZ()); m_uiMovementTimer = 15000; break; case 3: me->GetMotionMaster()->MovePoint(0, Location[69].GetPositionX(), Location[69].GetPositionY(), Location[69].GetPositionZ()); DoScriptText(RAND(SAY_DRAKE_BREATH_1, SAY_DRAKE_BREATH_2), me); DoScriptText(EMOTE_BREATH, me); m_uiMovementTimer = 2500; break; case 4: me->GetMotionMaster()->MovePoint(0, Location[70].GetPositionX(), Location[70].GetPositionY(), Location[70].GetPositionZ()); m_uiMovementTimer = 2000; SpawnTrigger(); break; case 5: me->GetMotionMaster()->MovePoint(0, Location[71].GetPositionX(), Location[71].GetPositionY(), Location[71].GetPositionZ()); m_uiMovementTimer = 3000; break; case 6: me->GetMotionMaster()->MovePoint(0, Location[3].GetPositionX(), Location[3].GetPositionY(), Location[3].GetPositionZ()); m_uiWaypointId = 2; m_uiMovementTimer = 15000; break; } m_uiWaypointId++; } else m_uiMovementTimer -= diff; break; case SKADI: //Return since we have no target if (!UpdateVictim()) return; if (m_uiCrushTimer <= diff) { DoCastVictim(SPELL_CRUSH); m_uiCrushTimer = 8000; } else m_uiCrushTimer -= diff; if (m_uiPoisonedSpearTimer <= diff) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) DoCast(target, SPELL_POISONED_SPEAR); m_uiPoisonedSpearTimer = 10000; } else m_uiPoisonedSpearTimer -= diff; if (m_uiWhirlwindTimer <= diff) { DoCastAOE(SPELL_WHIRLWIND); m_uiWhirlwindTimer = 20000; } else m_uiWhirlwindTimer -= diff; DoMeleeAttackIfReady(); break; } }
void UpdateAI(uint32 diff) override { switch (Phase) { case FLYING: if (!UpdateVictim()) return; if (me->GetPositionX() >= 519) { me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); if (!m_bSaidEmote) { Talk(EMOTE_RANGE); m_bSaidEmote = true; } } else { me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); m_bSaidEmote = false; } if (m_uiMountTimer && m_uiMountTimer <= diff) { me->Mount(DATA_MOUNT); me->SetCanFly(true); m_uiMountTimer = 0; } else m_uiMountTimer -= diff; if (m_uiSummonTimer <= diff) { SpawnMobs(); m_uiSummonTimer = 25000; } else m_uiSummonTimer -= diff; if (m_uiMovementTimer <= diff) { switch (m_uiWaypointId) { case 0: me->GetMotionMaster()->MovePoint(0, Location[1].GetPositionX(), Location[1].GetPositionY(), Location[1].GetPositionZ()); m_uiMovementTimer = 5000; break; case 1: me->GetMotionMaster()->MovePoint(0, Location[2].GetPositionX(), Location[2].GetPositionY(), Location[2].GetPositionZ()); m_uiMovementTimer = 2000; break; case 2: me->GetMotionMaster()->MovePoint(0, Location[3].GetPositionX(), Location[3].GetPositionY(), Location[3].GetPositionZ()); m_uiMovementTimer = 15000; break; case 3: me->GetMotionMaster()->MovePoint(0, Location[69].GetPositionX(), Location[69].GetPositionY(), Location[69].GetPositionZ()); Talk(SAY_DRAKE_BREATH); Talk(EMOTE_BREATH); m_uiMovementTimer = 2500; break; case 4: me->GetMotionMaster()->MovePoint(0, Location[70].GetPositionX(), Location[70].GetPositionY(), Location[70].GetPositionZ()); m_uiMovementTimer = 2000; // ! Hack - Because the encounter doesn't work as it should, should check Grauf's health instead! if (me->HealthBelowPct(100)) m_myGirlLovesToSkadi = false; SpawnTrigger(); break; case 5: me->GetMotionMaster()->MovePoint(0, Location[71].GetPositionX(), Location[71].GetPositionY(), Location[71].GetPositionZ()); m_uiMovementTimer = 3000; break; case 6: me->GetMotionMaster()->MovePoint(0, Location[3].GetPositionX(), Location[3].GetPositionY(), Location[3].GetPositionZ()); m_uiWaypointId = 2; m_uiMovementTimer = 15000; break; } m_uiWaypointId++; } else m_uiMovementTimer -= diff; break; case SKADI: //Return since we have no target if (!UpdateVictim()) return; if (m_uiCrushTimer <= diff) { DoCastVictim(SPELL_CRUSH); m_uiCrushTimer = 8000; } else m_uiCrushTimer -= diff; if (m_uiPoisonedSpearTimer <= diff) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) DoCast(target, SPELL_POISONED_SPEAR); m_uiPoisonedSpearTimer = 10000; } else m_uiPoisonedSpearTimer -= diff; if (m_uiWhirlwindTimer <= diff) { DoCastAOE(SPELL_WHIRLWIND); m_uiWhirlwindTimer = 20000; } else m_uiWhirlwindTimer -= diff; DoMeleeAttackIfReady(); break; } }