void HandleFlightSequence() { switch(uiFlightCount) { case 0: //me->AttackStop(); me->GetMotionMaster()->Clear(false); me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF); me->StopMoving(); DoScriptText(YELL_TAKEOFF, me); events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 2000); break; case 1: me->GetMotionMaster()->MovePoint(0, me->GetPositionX()+1, me->GetPositionY(), me->GetPositionZ()+10); break; case 2: { Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true); if (!pTarget) pTarget = Unit::GetUnit(*me, pInstance ? pInstance->GetData64(DATA_PLAYER_GUID) : 0); if (!pTarget) { EnterEvadeMode(); return; } Creature* Vapor = me->SummonCreature(MOB_VAPOR, pTarget->GetPositionX()-5+rand()%10, pTarget->GetPositionY()-5+rand()%10, pTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 9000); if (Vapor) { Vapor->AI()->AttackStart(pTarget); me->InterruptNonMeleeSpells(false); DoCast(Vapor, SPELL_VAPOR_CHANNEL, false); // core bug Vapor->CastSpell(Vapor, SPELL_VAPOR_TRIGGER, true); } events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 10000); break; } case 3: { DespawnSummons(MOB_VAPOR_TRAIL); //DoCast(me, SPELL_VAPOR_SELECT); need core support Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true); if (!pTarget) pTarget = Unit::GetUnit(*me, pInstance ? pInstance->GetData64(DATA_PLAYER_GUID) : 0); if (!pTarget) { EnterEvadeMode(); return; } //pTarget->CastSpell(pTarget, SPELL_VAPOR_SUMMON, true); need core support Creature* pVapor = me->SummonCreature(MOB_VAPOR, pTarget->GetPositionX()-5+rand()%10, pTarget->GetPositionY()-5+rand()%10, pTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 9000); if (pVapor) { if (pVapor->AI()) pVapor->AI()->AttackStart(pTarget); me->InterruptNonMeleeSpells(false); DoCast(pVapor, SPELL_VAPOR_CHANNEL, false); // core bug pVapor->CastSpell(pVapor, SPELL_VAPOR_TRIGGER, true); } events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 10000); break; } case 4: DespawnSummons(MOB_VAPOR_TRAIL); events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 1); break; case 5: { Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true); if (!pTarget) pTarget = Unit::GetUnit(*me, pInstance ? pInstance->GetData64(DATA_PLAYER_GUID) : 0); if (!pTarget) { EnterEvadeMode(); return; } breathX = pTarget->GetPositionX(); breathY = pTarget->GetPositionY(); float x, y, z; pTarget->GetContactPoint(me, x, y, z, 70); me->GetMotionMaster()->MovePoint(0, x, y, z+10); break; } case 6: me->SetOrientation(me->GetAngle(breathX, breathY)); me->StopMoving(); //DoTextEmote("takes a deep breath.", NULL); events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 10000); break; case 7: { DoCast(me, SPELL_FOG_BREATH, true); float x, y, z; me->GetPosition(x, y, z); x = 2 * breathX - x; y = 2 * breathY - y; me->GetMotionMaster()->MovePoint(0, x, y, z); events.ScheduleEvent(EVENT_SUMMON_FOG, 1); break; } case 8: me->CastStop(SPELL_FOG_BREATH); me->RemoveAurasDueToSpell(SPELL_FOG_BREATH); ++uiBreathCount; events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 1); if (uiBreathCount < 3) uiFlightCount = 4; break; case 9: if (Unit *pTarget = SelectTarget(SELECT_TARGET_TOPAGGRO)) DoStartMovement(pTarget); else { EnterEvadeMode(); return; } break; case 10: me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); me->HandleEmoteCommand(EMOTE_ONESHOT_LAND); EnterPhase(PHASE_GROUND); AttackStart(SelectTarget(SELECT_TARGET_TOPAGGRO)); break; } ++uiFlightCount; }
void HandleFlightSequence() { switch(FlightCount) { case 0: //m_creature->AttackStop(); error_log("prevent fly phase"); m_creature->GetMotionMaster()->Clear(false); m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF); m_creature->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING); m_creature->StopMoving(); DoScriptText(YELL_TAKEOFF, m_creature); Timer[EVENT_FLIGHT_SEQUENCE] = 2000; break; case 1: error_log("Move to Fly point"); m_creature->GetMotionMaster()->MovePoint(0, m_creature->GetPositionX()+1, m_creature->GetPositionY(), m_creature->GetPositionZ()+10); Timer[EVENT_FLIGHT_SEQUENCE] = 0; break; case 2:{ error_log("Summon Vapor case 2"); Unit* target; target = SelectUnit(SELECT_TARGET_RANDOM, 0, 150, true); if(!target) target = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_PLAYER_GUID)); if(target) { Creature* Vapor = m_creature->SummonCreature(MOB_VAPOR, target->GetPositionX()-5+rand()%10, target->GetPositionY()-5+rand()%10, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 9000); if(Vapor) { Vapor->AI()->AttackStart(target); m_creature->InterruptNonMeleeSpells(false); m_creature->CastSpell(Vapor, SPELL_VAPOR_CHANNEL, false); // core bug Vapor->CastSpell(Vapor, SPELL_VAPOR_TRIGGER, true); } } else { EnterEvadeMode(); return; } Timer[EVENT_FLIGHT_SEQUENCE] = 10000; break;} case 3: { DespawnSummons(MOB_VAPOR_TRAIL); error_log("Summon Vapor case3"); //m_creature->CastSpell(m_creature, SPELL_VAPOR_SELECT); need core support Unit* target; target = SelectUnit(SELECT_TARGET_RANDOM, 0, 150, true); if(!target) target = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_PLAYER_GUID)); if(target) { //target->CastSpell(target, SPELL_VAPOR_SUMMON, true); need core support Creature* Vapor = m_creature->SummonCreature(MOB_VAPOR, target->GetPositionX()-5+rand()%10, target->GetPositionY()-5+rand()%10, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 9000); if(Vapor) { Vapor->AI()->AttackStart(target); m_creature->InterruptNonMeleeSpells(false); m_creature->CastSpell(Vapor, SPELL_VAPOR_CHANNEL, false); // core bug Vapor->CastSpell(Vapor, SPELL_VAPOR_TRIGGER, true); } } else { EnterEvadeMode(); return; } Timer[EVENT_FLIGHT_SEQUENCE] = 10000; break;} case 4: DespawnSummons(MOB_VAPOR_TRAIL); Timer[EVENT_FLIGHT_SEQUENCE] = 1; break; case 5:{ Unit* target; target = SelectUnit(SELECT_TARGET_RANDOM, 0, 150, true); if(!target) target = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_PLAYER_GUID)); if(target) { BreathX = target->GetPositionX(); BreathY = target->GetPositionY(); float x, y, z; target->GetContactPoint(m_creature, x, y, z, 70); m_creature->GetMotionMaster()->MovePoint(0, x, y, z+10); }else { EnterEvadeMode(); return; } Timer[EVENT_FLIGHT_SEQUENCE] = 0; break;} case 6: m_creature->SetOrientation(m_creature->GetAngle(BreathX, BreathY)); m_creature->StopMoving(); //DoTextEmote("takes a deep breath.", NULL); Timer[EVENT_FLIGHT_SEQUENCE] = 10000; break; case 7: m_creature->CastSpell(m_creature, SPELL_FOG_BREATH, true); { float x, y, z; m_creature->GetPosition(x, y, z); x = 2 * BreathX - x; y = 2 * BreathY - y; m_creature->GetMotionMaster()->MovePoint(0, x, y, z); } Timer[EVENT_SUMMON_FOG] = 1; Timer[EVENT_FLIGHT_SEQUENCE] = 0; break; case 8: m_creature->RemoveAurasDueToSpell(SPELL_FOG_BREATH); BreathCount++; Timer[EVENT_SUMMON_FOG] = 0; Timer[EVENT_FLIGHT_SEQUENCE] = 1; if(BreathCount < 3) FlightCount = 4; break; case 9: if(Unit* target = SelectUnit(SELECT_TARGET_TOPAGGRO, 0)) { float x, y, z; target->GetContactPoint(m_creature, x, y, z); m_creature->GetMotionMaster()->MovePoint(0, x, y, z); } else { EnterEvadeMode(); return; } Timer[EVENT_FLIGHT_SEQUENCE] = 0; break; case 10: m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); m_creature->StopMoving(); m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LAND); EnterPhase(PHASE_GROUND); m_creature->AI()->AttackStart(SelectUnit(SELECT_TARGET_TOPAGGRO, 0)); break; default: break; } FlightCount++; }
void UpdateAI(const uint32 diff) { if(isCharging) { if(!ChargeTargetGUID) { m_creature->SetSpeed(MOVE_RUN, 1.2f); m_creature->GetMotionMaster()->Clear(); if(m_creature->getVictim()) { m_creature->Attack(m_creature->getVictim(), true); m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim()); } isCharging = false; } return; } if(!m_creature->SelectHostilTarget() && !m_creature->getVictim()) return; if(Berserk_Timer < diff) { DoScriptText(SAY_BERSERK, m_creature); DoCast(m_creature, SPELL_BERSERK, true); Berserk_Timer = 600000; }else Berserk_Timer -= diff; if(ShapeShift_Timer < diff) { if(inBearForm) { DoScriptText(SAY_TOTROLL, m_creature); m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY + 1, 5122); m_creature->RemoveAurasDueToSpell(SPELL_BEARFORM); Surge_Timer = 15000 + rand()%5000; BrutalSwipe_Timer = 7000 + rand()%5000; Mangle_Timer = 10000 + rand()%5000; ShapeShift_Timer = 45000 + rand()%5000; inBearForm = false; } else { DoScriptText(SAY_TOBEAR, m_creature); m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY + 1, 0); DoCast(m_creature, SPELL_BEARFORM, true); LaceratingSlash_Timer = 2000; // dur 18s RendFlesh_Timer = 3000; // dur 5s DeafeningRoar_Timer = 5000 + rand()%5000; // dur 2s ShapeShift_Timer = 20000 + rand()%5000; // dur 30s inBearForm = true; } }else ShapeShift_Timer -= diff; if(!inBearForm) { if(BrutalSwipe_Timer < diff) { DoCast(m_creature->getVictim(), SPELL_BRUTALSWIPE); BrutalSwipe_Timer = 7000 + rand()%5000; }else BrutalSwipe_Timer -= diff; if(Mangle_Timer < diff) { if(!m_creature->getVictim()->HasAura(SPELL_MANGLEEFFECT, 0)) { DoCast(m_creature->getVictim(), SPELL_MANGLE); Mangle_Timer = 1000; } else Mangle_Timer = 10000 + rand()%5000; }else Mangle_Timer -= diff; if(Surge_Timer < diff) { DoScriptText(SAY_SURGE, m_creature); Unit *target = SelectRandomPlayer(45); if(!target) target = m_creature->getVictim(); isCharging = true; ChargeTargetGUID = target->GetGUID(); float x, y, z; target->GetContactPoint(m_creature, x, y, z); m_creature->SetSpeed(MOVE_RUN, 5.0f); m_creature->GetMotionMaster()->Clear(); m_creature->GetMotionMaster()->MovePoint(0, x, y, z); Surge_Timer = 15000 + rand()%5000; return; }else Surge_Timer -= diff; } else { if(LaceratingSlash_Timer < diff) { if(!m_creature->getVictim()->HasAura(SPELL_MANGLEEFFECT, 0)) DoCast(m_creature->getVictim(), SPELL_LACERATINGSLASH); else { int32 bp0 = 3470; m_creature->CastCustomSpell(m_creature->getVictim(), SPELL_LACERATINGSLASH, &bp0, NULL, NULL, false); } LaceratingSlash_Timer = 18000 + rand()%5000; }else LaceratingSlash_Timer -= diff; if(RendFlesh_Timer < diff) { if(!m_creature->getVictim()->HasAura(SPELL_MANGLEEFFECT, 0)) DoCast(m_creature->getVictim(), SPELL_RENDFLESH); else { int32 bp1 = 4670; m_creature->CastCustomSpell(m_creature->getVictim(), SPELL_RENDFLESH, NULL, &bp1, NULL, false); } RendFlesh_Timer = 5000 + rand()%5000; }else RendFlesh_Timer -= diff; if(DeafeningRoar_Timer < diff) { DoCast(m_creature->getVictim(), SPELL_DEAFENINGROAR); DeafeningRoar_Timer = 15000 + rand()%5000; }else DeafeningRoar_Timer -= diff; } DoMeleeAttackIfReady(); }
void HandleFlightSequence() { switch (uiFlightCount) { case 0: //me->AttackStop(); me->GetMotionMaster()->Clear(false); me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF); me->StopMoving(); Talk(YELL_TAKEOFF); events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 2000); break; case 1: me->GetMotionMaster()->MovePoint(0, me->GetPositionX()+1, me->GetPositionY(), me->GetPositionZ()+10); break; case 2: { Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true); if (!target) target = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_PLAYER_GUID)); if (!target) { EnterEvadeMode(); return; } if (Creature* Vapor = me->SummonCreature(NPC_VAPOR, target->GetPositionX() - 5 + rand32() % 10, target->GetPositionY() - 5 + rand32() % 10, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 9000)) { Vapor->AI()->AttackStart(target); me->InterruptNonMeleeSpells(false); DoCast(Vapor, SPELL_VAPOR_CHANNEL, false); // core bug Vapor->CastSpell(Vapor, SPELL_VAPOR_TRIGGER, true); } events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 10000); break; } case 3: { DespawnSummons(NPC_VAPOR_TRAIL); //DoCast(me, SPELL_VAPOR_SELECT); need core support Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true); if (!target) target = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_PLAYER_GUID)); if (!target) { EnterEvadeMode(); return; } //target->CastSpell(target, SPELL_VAPOR_SUMMON, true); need core support if (Creature* pVapor = me->SummonCreature(NPC_VAPOR, target->GetPositionX() - 5 + rand32() % 10, target->GetPositionY() - 5 + rand32() % 10, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 9000)) { if (pVapor->AI()) pVapor->AI()->AttackStart(target); me->InterruptNonMeleeSpells(false); DoCast(pVapor, SPELL_VAPOR_CHANNEL, false); // core bug pVapor->CastSpell(pVapor, SPELL_VAPOR_TRIGGER, true); } events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 10000); break; } case 4: DespawnSummons(NPC_VAPOR_TRAIL); events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 1); break; case 5: { Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true); if (!target) target = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_PLAYER_GUID)); if (!target) { EnterEvadeMode(); return; } breathX = target->GetPositionX(); breathY = target->GetPositionY(); float x, y, z; target->GetContactPoint(me, x, y, z, 70); me->GetMotionMaster()->MovePoint(0, x, y, z+10); break; } case 6: me->SetFacingTo(me->GetAbsoluteAngle(breathX, breathY)); //DoTextEmote("takes a deep breath.", nullptr); events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 10000); break; case 7: { DoCast(me, SPELL_FOG_BREATH, true); float x, y, z; me->GetPosition(x, y, z); x = 2 * breathX - x; y = 2 * breathY - y; me->GetMotionMaster()->MovePoint(0, x, y, z); events.ScheduleEvent(EVENT_SUMMON_FOG, 1); break; } case 8: me->CastStop(SPELL_FOG_BREATH); me->RemoveAurasDueToSpell(SPELL_FOG_BREATH); ++uiBreathCount; events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 1); if (uiBreathCount < 3) uiFlightCount = 4; break; case 9: if (Unit* target = SelectTarget(SELECT_TARGET_MAXTHREAT)) DoStartMovement(target); else { EnterEvadeMode(); return; } break; case 10: me->SetDisableGravity(false); me->HandleEmoteCommand(EMOTE_ONESHOT_LAND); EnterPhase(PHASE_GROUND); AttackStart(SelectTarget(SELECT_TARGET_MAXTHREAT)); break; } ++uiFlightCount; }