void HandleAnimation() { Player* player = Unit::GetPlayer(*me, PlayerGUID); if (!player) return; Creature* Fandral = player->FindNearestCreature(C_FANDRAL_STAGHELM, 100.0f, me); Creature* Arygos = player->FindNearestCreature(C_ARYGOS, 100.0f, me); Creature* Caelestrasz = player->FindNearestCreature(C_CAELESTRASZ, 100.0f, me); Creature* Merithra = player->FindNearestCreature(C_MERITHRA, 100.0f, me); if (!Fandral || !Arygos || !Caelestrasz || !Merithra) return; AnimationTimer = EventAnim[AnimationCount].Timer; if (eventEnd == false) { switch (AnimationCount) { case 0: Talk(ANACHRONOS_SAY_1, Fandral->GetGUID()); break; case 1: Fandral->SetTarget(me->GetGUID()); Fandral->AI()->Talk(FANDRAL_SAY_1, me->GetGUID()); break; case 2: Fandral->SetTarget(0); Merithra->AI()->Talk(MERITHRA_EMOTE_1); break; case 3: Merithra->AI()->Talk(MERITHRA_SAY_1); break; case 4: Arygos->AI()->Talk(ARYGOS_EMOTE_1); break; case 5: Caelestrasz->SetTarget(Fandral->GetGUID()); Caelestrasz->AI()->Talk(CAELESTRASZ_SAY_1); break; case 6: Merithra->AI()->Talk(MERITHRA_SAY_2); break; case 7: Caelestrasz->SetTarget(0); Merithra->GetMotionMaster()->MoveCharge(-8065, 1530, 2.61f, 10); break; case 8: Merithra->AI()->Talk(MERITHRA_YELL_1); break; case 9: Merithra->CastSpell(Merithra, 25105, true); break; case 10: Merithra->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF); Merithra->SetDisableGravity(true); Merithra->GetMotionMaster()->MoveCharge(-8065, 1530, 6.61f, 3); break; case 11: Merithra->CastSpell(Merithra, 24818, false); break; case 12: Merithra->GetMotionMaster()->MoveCharge(-8100, 1530, 50, 42); break; case 13: break; case 14: Arygos->AI()->Talk(ARYGOS_SAY_1); Merithra->SetVisible(false); break; case 15: Arygos->GetMotionMaster()->MoveCharge(-8065, 1530, 2.61f, 10); Merithra->GetMotionMaster()->MoveCharge(-8034.535f, 1535.14f, 2.61f, 42); break; case 16: Arygos->AI()->Talk(ARYGOS_YELL_1); break; case 17: Arygos->CastSpell(Arygos, 25107, true); break; case 18: Arygos->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF); Arygos->SetDisableGravity(true); Arygos->GetMotionMaster()->MoveCharge(-8065, 1530, 6.61f, 42); break; case 19: Arygos->CastSpell(Arygos, 50505, false); break; case 20: Arygos->GetMotionMaster()->MoveCharge(-8095, 1530, 50, 42); break; case 21: break; case 22: Caelestrasz->AI()->Talk(CAELESTRASZ_SAY_2, Fandral->GetGUID()); break; case 23: Caelestrasz->GetMotionMaster()->MoveCharge(-8065, 1530, 2.61f, 10); Arygos->SetVisible(false); Arygos->GetMotionMaster()->MoveCharge(-8034.535f, 1535.14f, 2.61f, 10); break; case 24: Caelestrasz->AI()->Talk(CAELESTRASZ_YELL_1); break; case 25: Caelestrasz->CastSpell(Caelestrasz, 25106, true); break; case 26: Caelestrasz->HandleEmoteCommand(254); Caelestrasz->SetDisableGravity(true); Caelestrasz->GetMotionMaster()->MoveCharge(-8065, 1530, 7.61f, 4); break; case 27: Caelestrasz->CastSpell(Caelestrasz, 54293, false); break; case 28: Talk(ANACHRONOS_SAY_2, Fandral->GetGUID()); break; case 29: Caelestrasz->GetMotionMaster()->MoveCharge(-8095, 1530, 50, 42); Fandral->AI()->Talk(FANDRAL_SAY_2); break; case 30: break; case 31: Talk(ANACHRONOS_SAY_3, Fandral->GetGUID()); break; case 32: Caelestrasz->SetVisible(false); Caelestrasz->GetMotionMaster()->MoveCharge(-8034.535f, 1535.14f, 2.61f, 42); Fandral->GetMotionMaster()->MoveCharge(-8108, 1529, 2.77f, 8); me->GetMotionMaster()->MoveCharge(-8113, 1525, 2.77f, 8); break;//both run to the gate case 33: Talk(ANACHRONOS_SAY_4); Caelestrasz->GetMotionMaster()->MoveCharge(-8050, 1473, 65, 15); break; //Text: sands will stop case 34: DoCast(player, 23017, true);//Arcane Channeling break; case 35: me->CastSpell(-8088, 1520.43f, 2.67f, 25158, true); break; case 36: DoCast(player, 25159, true); break; case 37: me->SummonGameObject(GO_GATE_OF_AHN_QIRAJ, -8130, 1525, 17.5f, 0, 0, 0, 0, 0, 0); break; case 38: DoCast(player, 25166, true); me->SummonGameObject(GO_GLYPH_OF_AHN_QIRAJ, -8130, 1525, 17.5f, 0, 0, 0, 0, 0, 0); break; case 39: Talk(ANACHRONOS_SAY_5, Fandral->GetGUID()); break; case 40: Fandral->CastSpell(me, 25167, true); break; case 41: Fandral->SummonGameObject(GO_ROOTS_OF_AHN_QIRAJ, -8130, 1525, 17.5f, 0, 0, 0, 0, 0, 0); Fandral->AI()->Talk(FANDRAL_SAY_3); break; case 42: me->CastStop(); Fandral->AI()->Talk(FANDRAL_EMOTE_1); break; case 43: Fandral->CastStop(); break; case 44: Talk(ANACHRONOS_SAY_6); break; case 45: Talk(ANACHRONOS_SAY_7); break; case 46: Talk(ANACHRONOS_SAY_8); me->GetMotionMaster()->MoveCharge(-8110, 1527, 2.77f, 4); break; case 47: Talk(ANACHRONOS_EMOTE_1); break; case 48: Fandral->AI()->Talk(FANDRAL_SAY_4, me->GetGUID()); break; case 49: Fandral->AI()->Talk(FANDRAL_SAY_5, me->GetGUID()); break; case 50: Fandral->AI()->Talk(FANDRAL_EMOTE_2); Fandral->CastSpell(-8127, 1525, 17.5f, 33806, true); break; case 51: { uint32 entries[4] = { 15423, 15424, 15414, 15422 }; Unit* mob = NULL; for (uint8 i = 0; i < 4; ++i) { mob = player->FindNearestCreature(entries[i], 50, me); while (mob) { mob->RemoveFromWorld(); mob = player->FindNearestCreature(15423, 50, me); } } break; } case 52: Fandral->GetMotionMaster()->MoveCharge(-8028.75f, 1538.795f, 2.61f, 4); Fandral->AI()->Talk(ANACHRONOS_SAY_9, me->GetGUID()); break; case 53: Fandral->AI()->Talk(FANDRAL_SAY_6); break; case 54: Talk(ANACHRONOS_EMOTE_2); break; case 55: Fandral->SetVisible(false); break; case 56: Talk(ANACHRONOS_EMOTE_3); me->GetMotionMaster()->MoveCharge(-8116, 1522, 3.65f, 4); break; case 57: me->GetMotionMaster()->MoveCharge(-8116.7f, 1527, 3.7f, 4); break; case 58: me->GetMotionMaster()->MoveCharge(-8112.67f, 1529.9f, 2.86f, 4); break; case 59: me->GetMotionMaster()->MoveCharge(-8117.99f, 1532.24f, 3.94f, 4); break; case 60: if (player) Talk(ANACHRONOS_SAY_10, player->GetGUID()); me->GetMotionMaster()->MoveCharge(-8113.46f, 1524.16f, 2.89f, 4); break; case 61: me->GetMotionMaster()->MoveCharge(-8057.1f, 1470.32f, 2.61f, 6); if (player->IsInRange(me, 0, 15)) player->GroupEventHappens(QUEST_A_PAWN_ON_THE_ETERNAL_BOARD, me); break; case 62: me->SetDisplayId(15500); break; case 63: me->HandleEmoteCommand(254); me->SetDisableGravity(true); break; case 64: me->GetMotionMaster()->MoveCharge(-8000, 1400, 150, 9); break; case 65: me->SetVisible(false); if (Creature* AnachronosQuestTrigger = (Unit::GetCreature(*me, AnachronosQuestTriggerGUID))) { Talk(ARYGOS_YELL_1); AnachronosQuestTrigger->AI()->EnterEvadeMode(); eventEnd=true; } break; } } ++AnimationCount; }
void RandomMovementGenerator<Creature>::_setRandomLocation(Creature& creature) { if (creature.HasUnitState(UNIT_STATE_CASTING) && !creature.CanMoveDuringChannel()) { creature.CastStop(); return; } float X, Y, Z, nx, ny, nz, ori, dist; creature.GetHomePosition(X, Y, Z, ori); Map const* map = creature.GetBaseMap(); // For 2D/3D system selection //bool is_land_ok = creature.canWalk(); //bool is_water_ok = creature.canSwim(); bool is_air_ok = creature.canFly(); const float angle = rand_norm() * (M_PI * 2); const float range = rand_norm() * wander_distance; const float distanceX = range * cos(angle); const float distanceY = range * sin(angle); nx = X + distanceX; ny = Y + distanceY; // prevent invalid coordinates generation Oregon::NormalizeMapCoord(nx); Oregon::NormalizeMapCoord(ny); dist = (nx - X) * (nx - X) + (ny - Y) * (ny - Y); if (is_air_ok) // 3D system above ground and above water (flying mode) { // Limit height change const float distanceZ = rand_norm() * sqrtf(dist) / 2.0f; nz = Z + distanceZ; float tz = map->GetHeight(nx, ny, nz - 2.0f, false); // Map check only, vmap needed here but need to alter vmaps checks for height. float wz = map->GetWaterLevel(nx, ny); // Problem here, we must fly above the ground and water, not under. Let's try on next tick if (tz >= nz || wz >= nz) return; } //else if (is_water_ok) // 3D system under water and above ground (swimming mode) else // 2D only { dist = dist >= 100.0f ? 10.0f : sqrtf(dist); // 10.0 is the max that vmap high can check (MAX_CAN_FALL_DISTANCE) // The fastest way to get an accurate result 90% of the time. // Better result can be obtained like 99% accuracy with a ray light, but the cost is too high and the code is too long. nz = map->GetHeight(nx, ny, Z + dist - 2.0f, false); if (fabs(nz - Z) > dist) // Map check { nz = map->GetHeight(nx, ny, Z - 2.0f, true); // Vmap Horizontal or above if (fabs(nz - Z) > dist) { // Vmap Higher nz = map->GetHeight(nx, ny, Z + dist - 2.0f, true); // let's forget this bad coords where a z cannot be find and retry at next tick if (fabs(nz - Z) > dist) return; } } } if (is_air_ok) i_nextMoveTime.Reset(0); else { if (roll_chance_i(MOVEMENT_RANDOM_MMGEN_CHANCE_NO_BREAK)) i_nextMoveTime.Reset(urand(5000, 10000)); else i_nextMoveTime.Reset(urand(50, 400)); } creature.AddUnitState(UNIT_STATE_ROAMING); Movement::MoveSplineInit init(creature); init.MoveTo(nx, ny, nz, true); if (creature.IsPet() && creature.GetOwner() && !creature.IsWithinDist(creature.GetOwner(), PET_FOLLOW_DIST + 2.5f)) init.SetWalk(false); else init.SetWalk(true); init.Launch(); if (roll_chance_i(MOVEMENT_RANDOM_MMGEN_CHANCE_NO_BREAK)) i_nextMoveTime.Reset(50); else i_nextMoveTime.Reset(urand(1500, 10000)); // Keep a short wait time }