diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/server/game/Entities/Unit/Unit.cpp | 42 | ||||
-rwxr-xr-x | src/server/game/Entities/Unit/Unit.h | 23 | ||||
-rwxr-xr-x | src/server/game/Movement/MotionMaster.cpp | 106 | ||||
-rwxr-xr-x | src/server/game/Movement/MotionMaster.h | 5 | ||||
-rwxr-xr-x | src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp | 5 | ||||
-rw-r--r-- | src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp | 31 |
6 files changed, 151 insertions, 61 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 1a6e8f397e2..808a2da3a0d 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -456,29 +456,36 @@ void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint32 T AddUnitState(UNIT_STAT_MOVE); } -void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint32 MoveFlags, uint32 time, float speedZ, Player* player) +void Unit::SendMonsterMove(MonsterMoveData const& moveData, Player* player) { - WorldPacket data(SMSG_MONSTER_MOVE, 12+4+1+4+4+4+12+GetPackGUID().size()); + WorldPacket data(SMSG_MONSTER_MOVE, GetPackGUID().size() + 1 + 12 + 4 + 1 + 4 + 8 + 4 + 4 + 12); data.append(GetPackGUID()); - data << uint8(0); // new in 3.1 + data << uint8(0); // new in 3.1 data << GetPositionX() << GetPositionY() << GetPositionZ(); data << getMSTime(); data << uint8(0); - data << MoveFlags; + data << moveData.SplineFlag; - if (MoveFlags & SPLINEFLAG_TRAJECTORY) + if (moveData.SplineFlag & SPLINEFLAG_ANIMATIONTIER) { - data << time; - data << speedZ; - data << (uint32)0; // walk time after jump + data << uint8(moveData.AnimationState); + data << uint32(0); } - else - data << time; - data << uint32(1); // 1 single waypoint - data << NewPosX << NewPosY << NewPosZ; // the single waypoint Point B + data << moveData.Time; + + if (moveData.SplineFlag & SPLINEFLAG_TRAJECTORY) + { + data << moveData.SpeedZ; + data << uint32(0); // walk time after jump + } + + data << uint32(1); // waypoint count + data << moveData.DestLocation.GetPositionX(); + data << moveData.DestLocation.GetPositionY(); + data << moveData.DestLocation.GetPositionZ(); if (player) player->GetSession()->SendPacket(&data); @@ -486,6 +493,17 @@ void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint32 M SendMessageToSet(&data, true); } +void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint32 MoveFlags, uint32 time, float speedZ, Player* player) +{ + MonsterMoveData data; + data.DestLocation.Relocate(NewPosX, NewPosY, NewPosZ); + data.SplineFlag = MoveFlags; + data.Time = time; + data.SpeedZ = speedZ; + + SendMonsterMove(data, player); +} + void Unit::SendMonsterMoveExitVehicle(Position const* newPos) { WorldPacket data(SMSG_MONSTER_MOVE, 1+12+4+1+4+4+4+12+GetPackGUID().size()); diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index dac7198c61f..9f1437b7512 100755 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -667,7 +667,7 @@ enum MovementFlags // TODO: Check if PITCH_UP and PITCH_DOWN really belong here.. MOVEMENTFLAG_MASK_MOVING = MOVEMENTFLAG_FORWARD | MOVEMENTFLAG_BACKWARD | MOVEMENTFLAG_STRAFE_LEFT | MOVEMENTFLAG_STRAFE_RIGHT | - MOVEMENTFLAG_PITCH_UP | MOVEMENTFLAG_PITCH_DOWN | MOVEMENTFLAG_JUMPING | MOVEMENTFLAG_FALLING | MOVEMENTFLAG_ASCENDING | MOVEMENTFLAG_DESCENDING | + MOVEMENTFLAG_PITCH_UP | MOVEMENTFLAG_PITCH_DOWN | MOVEMENTFLAG_JUMPING | MOVEMENTFLAG_FALLING | MOVEMENTFLAG_ASCENDING | MOVEMENTFLAG_DESCENDING | MOVEMENTFLAG_SPLINE_ELEVATION, MOVEMENTFLAG_MASK_TURNING = @@ -717,7 +717,7 @@ enum SplineFlags SPLINEFLAG_CATMULL_ROM = 0x00040000, SPLINEFLAG_UNKNOWN20 = 0x00080000, SPLINEFLAG_UNKNOWN21 = 0x00100000, - SPLINEFLAG_UNKNOWN22 = 0x00200000, + SPLINEFLAG_ANIMATIONTIER = 0x00200000, SPLINEFLAG_UNKNOWN23 = 0x00400000, SPLINEFLAG_TRANSPORT = 0x00800000, SPLINEFLAG_EXIT_VEHICLE = 0x01000000, @@ -953,6 +953,24 @@ struct SpellPeriodicAuraLogInfo uint32 createProcExtendMask(SpellNonMeleeDamage *damageInfo, SpellMissInfo missCondition); +enum UnitAnimationState +{ + ANIMATION_ON_GROUND = 0, + ANIMATION_SWIMMING = 1, + ANIMATION_HOVER = 2, + ANIMATION_FLYING = 3, +}; + +struct MonsterMoveData +{ + MonsterMoveData() : SplineFlag(0), AnimationState(ANIMATION_ON_GROUND), Time(0), SpeedZ(0.0f) {} + Position DestLocation; + uint32 SplineFlag; + UnitAnimationState AnimationState; // Only used with SPLINEFLAG_ANIMATIONTIER + uint32 Time; + float SpeedZ; // Only used with SPLINEFLAG_TRAJECTORY +}; + #define MAX_DECLINED_NAME_CASES 5 struct DeclinedName @@ -1555,6 +1573,7 @@ class Unit : public WorldObject void SendMonsterStop(bool on_death = false); void SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint32 Time, Player* player = NULL); void SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint32 MoveFlags, uint32 time, float speedZ, Player* player = NULL); + void SendMonsterMove(MonsterMoveData const& moveData, Player* receiver = NULL); void SendMonsterMoveExitVehicle(Position const* newPos); //void SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 type, uint32 MovementFlags, uint32 Time, Player* player = NULL); void SendMonsterMoveTransport(Unit *vehicleOwner); diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index 6ef2e71d907..2a15eb58452 100755 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -37,8 +37,7 @@ inline bool isStatic(MovementGenerator *mv) return (mv == &si_idleMovement); } -void -MotionMaster::Initialize() +void MotionMaster::Initialize() { // clear ALL movement generators (including default) while (!empty()) @@ -76,8 +75,7 @@ MotionMaster::~MotionMaster() } } -void -MotionMaster::UpdateMotion(uint32 diff) +void MotionMaster::UpdateMotion(uint32 diff) { if (i_owner->HasUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED)) // what about UNIT_STAT_DISTRACTED? Why is this not included? return; @@ -113,8 +111,7 @@ MotionMaster::UpdateMotion(uint32 diff) } } -void -MotionMaster::DirectClean(bool reset) +void MotionMaster::DirectClean(bool reset) { while (size() > 1) { @@ -129,8 +126,7 @@ MotionMaster::DirectClean(bool reset) top()->Reset(*i_owner); } -void -MotionMaster::DelayedClean() +void MotionMaster::DelayedClean() { while (size() > 1) { @@ -141,8 +137,7 @@ MotionMaster::DelayedClean() } } -void -MotionMaster::DirectExpire(bool reset) +void MotionMaster::DirectExpire(bool reset) { if (size() > 1) { @@ -162,8 +157,7 @@ MotionMaster::DirectExpire(bool reset) top()->Reset(*i_owner); } -void -MotionMaster::DelayedExpire() +void MotionMaster::DelayedExpire() { if (size() > 1) { @@ -184,8 +178,7 @@ void MotionMaster::MoveIdle(MovementSlot slot) Mutate(&si_idleMovement, slot); } -void -MotionMaster::MoveRandom(float spawndist) +void MotionMaster::MoveRandom(float spawndist) { if (i_owner->GetTypeId() == TYPEID_UNIT) { @@ -194,8 +187,7 @@ MotionMaster::MoveRandom(float spawndist) } } -void -MotionMaster::MoveTargetedHome() +void MotionMaster::MoveTargetedHome() { //if (i_owner->HasUnitState(UNIT_STAT_FLEEING)) // return; @@ -213,8 +205,7 @@ MotionMaster::MoveTargetedHome() } } -void -MotionMaster::MoveConfused() +void MotionMaster::MoveConfused() { if (i_owner->GetTypeId() == TYPEID_PLAYER) { @@ -229,8 +220,7 @@ MotionMaster::MoveConfused() } } -void -MotionMaster::MoveChase(Unit* target, float dist, float angle) +void MotionMaster::MoveChase(Unit* target, float dist, float angle) { // ignore movement request if target not exist if (!target || target == i_owner || i_owner->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE)) @@ -255,8 +245,7 @@ MotionMaster::MoveChase(Unit* target, float dist, float angle) } } -void -MotionMaster::MoveFollow(Unit* target, float dist, float angle, MovementSlot slot) +void MotionMaster::MoveFollow(Unit* target, float dist, float angle, MovementSlot slot) { // ignore movement request if target not exist if (!target || target == i_owner || i_owner->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE)) @@ -280,8 +269,7 @@ MotionMaster::MoveFollow(Unit* target, float dist, float angle, MovementSlot slo } } -void -MotionMaster::MovePoint(uint32 id, float x, float y, float z) +void MotionMaster::MovePoint(uint32 id, float x, float y, float z) { if (i_owner->GetTypeId() == TYPEID_PLAYER) { @@ -296,6 +284,58 @@ MotionMaster::MovePoint(uint32 id, float x, float y, float z) } } +void MotionMaster::MoveLand(uint32 id, Position const& pos, float speed) +{ + if (i_owner->GetTypeId() != TYPEID_UNIT) + return; + + uint32 moveFlag = SPLINEFLAG_FLYING | SPLINEFLAG_ANIMATIONTIER; + uint32 moveTime = uint32(i_owner->GetExactDist(&pos) / speed) * IN_MILLISECONDS; + + // CHARGING state makes the unit use m_TempSpeed and JUMPING prevents sending movement packet in PointMovementGenerator + i_owner->AddUnitState(UNIT_STAT_CHARGING | UNIT_STAT_JUMPING); + i_owner->m_TempSpeed = speed; + + float x, y, z; + pos.GetPosition(x, y, z); + sLog->outStaticDebug("Creature (Entry: %u) landing point (ID: %u X: %f Y: %f Z: %f)", i_owner->GetEntry(), id, x, y, z); + Mutate(new PointMovementGenerator<Creature>(id, x, y, z), MOTION_SLOT_ACTIVE); + + MonsterMoveData data; + data.DestLocation.Relocate(pos); + data.SplineFlag = moveFlag; + data.Time = moveTime; + data.AnimationState = ANIMATION_ON_GROUND; + + i_owner->SendMonsterMove(data); +} + +void MotionMaster::MoveTakeoff(uint32 id, Position const& pos, float speed) +{ + if (i_owner->GetTypeId() != TYPEID_UNIT) + return; + + uint32 moveFlag = SPLINEFLAG_FLYING | SPLINEFLAG_ANIMATIONTIER; + uint32 moveTime = uint32(i_owner->GetExactDist(&pos) / speed) * IN_MILLISECONDS; + + // CHARGING state makes the unit use m_TempSpeed and JUMPING prevents sending movement packet in PointMovementGenerator + i_owner->AddUnitState(UNIT_STAT_CHARGING | UNIT_STAT_JUMPING); + i_owner->m_TempSpeed = speed; + + float x, y, z; + pos.GetPosition(x, y, z); + sLog->outStaticDebug("Creature (Entry: %u) landing point (ID: %u X: %f Y: %f Z: %f)", i_owner->GetEntry(), id, x, y, z); + Mutate(new PointMovementGenerator<Creature>(id, x, y, z), MOTION_SLOT_ACTIVE); + + MonsterMoveData data; + data.DestLocation.Relocate(pos); + data.SplineFlag = moveFlag; + data.Time = moveTime; + data.AnimationState = ANIMATION_FLYING; + + i_owner->SendMonsterMove(data); +} + void MotionMaster::MoveKnockbackFrom(float srcX, float srcY, float speedXY, float speedZ) { //this function may make players fall below map @@ -346,8 +386,7 @@ void MotionMaster::MoveJump(float x, float y, float z, float speedXY, float spee i_owner->SendMonsterMove(x, y, z, moveFlag, time, speedZ); } -void -MotionMaster::MoveCharge(float x, float y, float z, float speed, uint32 id) +void MotionMaster::MoveCharge(float x, float y, float z, float speed, uint32 id) { if (Impl[MOTION_SLOT_CONTROLLED] && Impl[MOTION_SLOT_CONTROLLED]->GetMovementGeneratorType() != DISTRACT_MOTION_TYPE) return; @@ -375,8 +414,7 @@ void MotionMaster::MoveFall(float z, uint32 id) MoveCharge(i_owner->GetPositionX(), i_owner->GetPositionY(), z, SPEED_CHARGE, id); } -void -MotionMaster::MoveSeekAssistance(float x, float y, float z) +void MotionMaster::MoveSeekAssistance(float x, float y, float z) { if (i_owner->GetTypeId() == TYPEID_PLAYER) { @@ -392,8 +430,7 @@ MotionMaster::MoveSeekAssistance(float x, float y, float z) } } -void -MotionMaster::MoveSeekAssistanceDistract(uint32 time) +void MotionMaster::MoveSeekAssistanceDistract(uint32 time) { if (i_owner->GetTypeId() == TYPEID_PLAYER) { @@ -407,8 +444,7 @@ MotionMaster::MoveSeekAssistanceDistract(uint32 time) } } -void -MotionMaster::MoveFleeing(Unit* enemy, uint32 time) +void MotionMaster::MoveFleeing(Unit* enemy, uint32 time) { if (!enemy) return; @@ -437,8 +473,7 @@ MotionMaster::MoveFleeing(Unit* enemy, uint32 time) } } -void -MotionMaster::MoveTaxiFlight(uint32 path, uint32 pathnode) +void MotionMaster::MoveTaxiFlight(uint32 path, uint32 pathnode) { if (i_owner->GetTypeId() == TYPEID_PLAYER) { @@ -461,8 +496,7 @@ MotionMaster::MoveTaxiFlight(uint32 path, uint32 pathnode) } } -void -MotionMaster::MoveDistract(uint32 timer) +void MotionMaster::MoveDistract(uint32 timer) { if (Impl[MOTION_SLOT_CONTROLLED]) return; diff --git a/src/server/game/Movement/MotionMaster.h b/src/server/game/Movement/MotionMaster.h index 8ea450283e6..1455493846e 100755 --- a/src/server/game/Movement/MotionMaster.h +++ b/src/server/game/Movement/MotionMaster.h @@ -152,6 +152,11 @@ class MotionMaster //: private std::stack<MovementGenerator *> void MovePoint(uint32 id, const Position &pos) { MovePoint(id, pos.m_positionX, pos.m_positionY, pos.m_positionZ); } void MovePoint(uint32 id, float x, float y, float z); + + // These two movement types should only be used with creatures having landing/takeoff animations + void MoveLand(uint32 id, Position const& pos, float speed); + void MoveTakeoff(uint32 id, Position const& pos, float speed); + void MoveCharge(float x, float y, float z, float speed = SPEED_CHARGE, uint32 id = EVENT_CHARGE); void MoveFall(float z, uint32 id = 0); void MoveKnockbackFrom(float srcX, float srcY, float speedXY, float speedZ); diff --git a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp index a75a5b64f10..c7c5ac530ff 100755 --- a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp @@ -29,8 +29,9 @@ void PointMovementGenerator<T>::Initialize(T &unit) { unit.StopMoving(); Traveller<T> traveller(unit); - // knockback effect has UNIT_STAT_JUMPING set, so if here we disable sentmonstermove there will be creature position sync problem between client and server - i_destinationHolder.SetDestination(traveller, i_x, i_y, i_z, true /* !unit.HasUnitState(UNIT_STAT_JUMPING)*/); + // OLD: knockback effect has UNIT_STAT_JUMPING set, so if here we disable sentmonstermove there will be creature position sync problem between client and server + // NEW: reactivated this check - UNIT_STAT_JUMPING is only used in MoveJump, which sends its own packet + i_destinationHolder.SetDestination(traveller, i_x, i_y, i_z, /*true*/ !unit.HasUnitState(UNIT_STAT_JUMPING)); } template<class T> diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp index 24cfae54627..e3aaba06793 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp @@ -96,6 +96,7 @@ enum Events EVENT_ICE_TOMB = 10, EVENT_FROST_BOMB = 11, EVENT_LAND = 12, + EVENT_AIR_MOVEMENT = 21, // Spinestalker EVENT_BELLOWING_ROAR = 13, @@ -129,7 +130,8 @@ enum MovementPoints POINT_FROSTWYRM_FLY_IN = 1, POINT_FROSTWYRM_LAND = 2, POINT_AIR_PHASE = 3, - POINT_LAND = 4, + POINT_TAKEOFF = 4, + POINT_LAND = 5, }; enum Shadowmourne @@ -141,9 +143,9 @@ enum Shadowmourne SPELL_FROST_IMBUED_BLADE = 72290, }; -Position const RimefangFlyPos = {4413.309f, 2456.421f, 223.3795f, 2.890186f}; +Position const RimefangFlyPos = {4413.309f, 2456.421f, 233.3795f, 2.890186f}; Position const RimefangLandPos = {4413.309f, 2456.421f, 203.3848f, 2.890186f}; -Position const SpinestalkerFlyPos = {4418.895f, 2514.233f, 220.4864f, 3.396045f}; +Position const SpinestalkerFlyPos = {4418.895f, 2514.233f, 230.4864f, 3.396045f}; Position const SpinestalkerLandPos = {4418.895f, 2514.233f, 203.3848f, 3.396045f}; Position const SindragosaSpawnPos = {4818.700f, 2483.710f, 287.0650f, 3.089233f}; Position const SindragosaFlyPos = {4475.190f, 2484.570f, 234.8510f, 3.141593f}; @@ -157,7 +159,7 @@ class FrostwyrmLandEvent : public BasicEvent bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/) { - _owner.GetMotionMaster()->MovePoint(POINT_FROSTWYRM_LAND, _dest); + _owner.GetMotionMaster()->MoveLand(POINT_FROSTWYRM_LAND, _dest, 8.247422f); return true; } @@ -245,7 +247,7 @@ class boss_sindragosa : public CreatureScript me->setActive(true); me->SetSpeed(MOVE_FLIGHT, 4.0f); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - float moveTime = me->GetExactDist(&SindragosaFlyPos)/(me->GetSpeed(MOVE_FLIGHT)*0.001f); + float moveTime = me->GetExactDist(&SindragosaFlyPos) / (me->GetSpeed(MOVE_FLIGHT) * 0.001f); me->m_Events.AddEvent(new FrostwyrmLandEvent(*me, SindragosaLandPos), me->m_Events.CalculateTime(uint64(moveTime) + 250)); me->GetMotionMaster()->MovePoint(POINT_FROSTWYRM_FLY_IN, SindragosaFlyPos); DoCast(me, SPELL_SINDRAGOSA_S_FURY); @@ -277,6 +279,9 @@ class boss_sindragosa : public CreatureScript // Sindragosa enters combat as soon as she lands DoZoneInCombat(); break; + case POINT_TAKEOFF: + events.ScheduleEvent(EVENT_AIR_MOVEMENT, 1); + break; case POINT_AIR_PHASE: me->CastCustomSpell(SPELL_ICE_TOMB_TARGET, SPELLVALUE_MAX_TARGETS, RAID_MODE<int32>(2, 5, 2, 6), false); events.ScheduleEvent(EVENT_FROST_BOMB, 8000); @@ -414,16 +419,24 @@ class boss_sindragosa : public CreatureScript Talk(SAY_BLISTERING_COLD); break; case EVENT_AIR_PHASE: + { Talk(SAY_AIR_PHASE); me->SetFlying(true); me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); me->SetReactState(REACT_PASSIVE); - me->GetMotionMaster()->MovePoint(POINT_AIR_PHASE, SindragosaAirPos); + Position pos; + pos.Relocate(me); + pos.m_positionZ += 17.0f; + me->GetMotionMaster()->MoveTakeoff(POINT_TAKEOFF, pos, 8.30078125f); events.DelayEvents(45000, EVENT_GROUP_LAND_PHASE); events.ScheduleEvent(EVENT_AIR_PHASE, 110000); events.RescheduleEvent(EVENT_UNCHAINED_MAGIC, urand(55000, 60000), EVENT_GROUP_LAND_PHASE); events.ScheduleEvent(EVENT_LAND, 45000); break; + } + case EVENT_AIR_MOVEMENT: + me->GetMotionMaster()->MovePoint(POINT_AIR_PHASE, SindragosaAirPos); + break; case EVENT_ICE_TOMB: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, -SPELL_ICE_TOMB_UNTARGETABLE)) { @@ -604,7 +617,7 @@ class npc_spinestalker : public CreatureScript me->setActive(true); me->SetSpeed(MOVE_FLIGHT, 2.0f); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - float moveTime = me->GetExactDist(&SpinestalkerFlyPos)/(me->GetSpeed(MOVE_FLIGHT)*0.001f); + float moveTime = me->GetExactDist(&SpinestalkerFlyPos) / (me->GetSpeed(MOVE_FLIGHT) * 0.001f); me->m_Events.AddEvent(new FrostwyrmLandEvent(*me, SpinestalkerLandPos), me->m_Events.CalculateTime(uint64(moveTime) + 250)); me->SetDefaultMovementType(IDLE_MOTION_TYPE); me->GetMotionMaster()->MoveIdle(MOTION_SLOT_IDLE); @@ -719,7 +732,7 @@ class npc_rimefang : public CreatureScript me->setActive(true); me->SetSpeed(MOVE_FLIGHT, 2.0f); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); - float moveTime = me->GetExactDist(&RimefangFlyPos)/(me->GetSpeed(MOVE_FLIGHT)*0.001f); + float moveTime = me->GetExactDist(&RimefangFlyPos) / (me->GetSpeed(MOVE_FLIGHT) * 0.001f); me->m_Events.AddEvent(new FrostwyrmLandEvent(*me, RimefangLandPos), me->m_Events.CalculateTime(uint64(moveTime) + 250)); me->SetDefaultMovementType(IDLE_MOTION_TYPE); me->GetMotionMaster()->MoveIdle(MOTION_SLOT_IDLE); @@ -821,12 +834,12 @@ class npc_sindragosa_trash : public CreatureScript { npc_sindragosa_trashAI(Creature* creature) : ScriptedAI(creature) { - _frostwyrmId = (creature->GetHomePosition().GetPositionY() < 2484.35f) ? DATA_RIMEFANG : DATA_SPINESTALKER; _instance = creature->GetInstanceScript(); } void InitializeAI() { + _frostwyrmId = (me->GetHomePosition().GetPositionY() < 2484.35f) ? DATA_RIMEFANG : DATA_SPINESTALKER; // Increase add count if (!me->isDead()) _instance->SetData(_frostwyrmId, 1); // this cannot be in Reset because reset also happens on evade |