Core/Movement: Implemented methods to animate creatures landing and takeoff and use them in Sindragosa script
This commit is contained in:
@@ -456,9 +456,9 @@ void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint32 T
|
|||||||
AddUnitState(UNIT_STAT_MOVE);
|
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.append(GetPackGUID());
|
||||||
|
|
||||||
data << uint8(0); // new in 3.1
|
data << uint8(0); // new in 3.1
|
||||||
@@ -466,19 +466,26 @@ void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint32 M
|
|||||||
data << getMSTime();
|
data << getMSTime();
|
||||||
|
|
||||||
data << uint8(0);
|
data << uint8(0);
|
||||||
data << MoveFlags;
|
data << moveData.SplineFlag;
|
||||||
|
|
||||||
if (MoveFlags & SPLINEFLAG_TRAJECTORY)
|
if (moveData.SplineFlag & SPLINEFLAG_ANIMATIONTIER)
|
||||||
{
|
{
|
||||||
data << time;
|
data << uint8(moveData.AnimationState);
|
||||||
data << speedZ;
|
data << uint32(0);
|
||||||
data << (uint32)0; // walk time after jump
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
data << time;
|
|
||||||
|
|
||||||
data << uint32(1); // 1 single waypoint
|
data << moveData.Time;
|
||||||
data << NewPosX << NewPosY << NewPosZ; // the single waypoint Point B
|
|
||||||
|
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)
|
if (player)
|
||||||
player->GetSession()->SendPacket(&data);
|
player->GetSession()->SendPacket(&data);
|
||||||
@@ -486,6 +493,17 @@ void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint32 M
|
|||||||
SendMessageToSet(&data, true);
|
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)
|
void Unit::SendMonsterMoveExitVehicle(Position const* newPos)
|
||||||
{
|
{
|
||||||
WorldPacket data(SMSG_MONSTER_MOVE, 1+12+4+1+4+4+4+12+GetPackGUID().size());
|
WorldPacket data(SMSG_MONSTER_MOVE, 1+12+4+1+4+4+4+12+GetPackGUID().size());
|
||||||
|
|||||||
@@ -717,7 +717,7 @@ enum SplineFlags
|
|||||||
SPLINEFLAG_CATMULL_ROM = 0x00040000,
|
SPLINEFLAG_CATMULL_ROM = 0x00040000,
|
||||||
SPLINEFLAG_UNKNOWN20 = 0x00080000,
|
SPLINEFLAG_UNKNOWN20 = 0x00080000,
|
||||||
SPLINEFLAG_UNKNOWN21 = 0x00100000,
|
SPLINEFLAG_UNKNOWN21 = 0x00100000,
|
||||||
SPLINEFLAG_UNKNOWN22 = 0x00200000,
|
SPLINEFLAG_ANIMATIONTIER = 0x00200000,
|
||||||
SPLINEFLAG_UNKNOWN23 = 0x00400000,
|
SPLINEFLAG_UNKNOWN23 = 0x00400000,
|
||||||
SPLINEFLAG_TRANSPORT = 0x00800000,
|
SPLINEFLAG_TRANSPORT = 0x00800000,
|
||||||
SPLINEFLAG_EXIT_VEHICLE = 0x01000000,
|
SPLINEFLAG_EXIT_VEHICLE = 0x01000000,
|
||||||
@@ -953,6 +953,24 @@ struct SpellPeriodicAuraLogInfo
|
|||||||
|
|
||||||
uint32 createProcExtendMask(SpellNonMeleeDamage *damageInfo, SpellMissInfo missCondition);
|
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
|
#define MAX_DECLINED_NAME_CASES 5
|
||||||
|
|
||||||
struct DeclinedName
|
struct DeclinedName
|
||||||
@@ -1555,6 +1573,7 @@ class Unit : public WorldObject
|
|||||||
void SendMonsterStop(bool on_death = false);
|
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 Time, Player* player = NULL);
|
||||||
void SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint32 MoveFlags, uint32 time, float speedZ, 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 SendMonsterMoveExitVehicle(Position const* newPos);
|
||||||
//void SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 type, uint32 MovementFlags, uint32 Time, Player* player = NULL);
|
//void SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 type, uint32 MovementFlags, uint32 Time, Player* player = NULL);
|
||||||
void SendMonsterMoveTransport(Unit *vehicleOwner);
|
void SendMonsterMoveTransport(Unit *vehicleOwner);
|
||||||
|
|||||||
@@ -37,8 +37,7 @@ inline bool isStatic(MovementGenerator *mv)
|
|||||||
return (mv == &si_idleMovement);
|
return (mv == &si_idleMovement);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void MotionMaster::Initialize()
|
||||||
MotionMaster::Initialize()
|
|
||||||
{
|
{
|
||||||
// clear ALL movement generators (including default)
|
// clear ALL movement generators (including default)
|
||||||
while (!empty())
|
while (!empty())
|
||||||
@@ -76,8 +75,7 @@ MotionMaster::~MotionMaster()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void MotionMaster::UpdateMotion(uint32 diff)
|
||||||
MotionMaster::UpdateMotion(uint32 diff)
|
|
||||||
{
|
{
|
||||||
if (i_owner->HasUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED)) // what about UNIT_STAT_DISTRACTED? Why is this not included?
|
if (i_owner->HasUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED)) // what about UNIT_STAT_DISTRACTED? Why is this not included?
|
||||||
return;
|
return;
|
||||||
@@ -113,8 +111,7 @@ MotionMaster::UpdateMotion(uint32 diff)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void MotionMaster::DirectClean(bool reset)
|
||||||
MotionMaster::DirectClean(bool reset)
|
|
||||||
{
|
{
|
||||||
while (size() > 1)
|
while (size() > 1)
|
||||||
{
|
{
|
||||||
@@ -129,8 +126,7 @@ MotionMaster::DirectClean(bool reset)
|
|||||||
top()->Reset(*i_owner);
|
top()->Reset(*i_owner);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void MotionMaster::DelayedClean()
|
||||||
MotionMaster::DelayedClean()
|
|
||||||
{
|
{
|
||||||
while (size() > 1)
|
while (size() > 1)
|
||||||
{
|
{
|
||||||
@@ -141,8 +137,7 @@ MotionMaster::DelayedClean()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void MotionMaster::DirectExpire(bool reset)
|
||||||
MotionMaster::DirectExpire(bool reset)
|
|
||||||
{
|
{
|
||||||
if (size() > 1)
|
if (size() > 1)
|
||||||
{
|
{
|
||||||
@@ -162,8 +157,7 @@ MotionMaster::DirectExpire(bool reset)
|
|||||||
top()->Reset(*i_owner);
|
top()->Reset(*i_owner);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void MotionMaster::DelayedExpire()
|
||||||
MotionMaster::DelayedExpire()
|
|
||||||
{
|
{
|
||||||
if (size() > 1)
|
if (size() > 1)
|
||||||
{
|
{
|
||||||
@@ -184,8 +178,7 @@ void MotionMaster::MoveIdle(MovementSlot slot)
|
|||||||
Mutate(&si_idleMovement, slot);
|
Mutate(&si_idleMovement, slot);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void MotionMaster::MoveRandom(float spawndist)
|
||||||
MotionMaster::MoveRandom(float spawndist)
|
|
||||||
{
|
{
|
||||||
if (i_owner->GetTypeId() == TYPEID_UNIT)
|
if (i_owner->GetTypeId() == TYPEID_UNIT)
|
||||||
{
|
{
|
||||||
@@ -194,8 +187,7 @@ MotionMaster::MoveRandom(float spawndist)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void MotionMaster::MoveTargetedHome()
|
||||||
MotionMaster::MoveTargetedHome()
|
|
||||||
{
|
{
|
||||||
//if (i_owner->HasUnitState(UNIT_STAT_FLEEING))
|
//if (i_owner->HasUnitState(UNIT_STAT_FLEEING))
|
||||||
// return;
|
// return;
|
||||||
@@ -213,8 +205,7 @@ MotionMaster::MoveTargetedHome()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void MotionMaster::MoveConfused()
|
||||||
MotionMaster::MoveConfused()
|
|
||||||
{
|
{
|
||||||
if (i_owner->GetTypeId() == TYPEID_PLAYER)
|
if (i_owner->GetTypeId() == TYPEID_PLAYER)
|
||||||
{
|
{
|
||||||
@@ -229,8 +220,7 @@ MotionMaster::MoveConfused()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void MotionMaster::MoveChase(Unit* target, float dist, float angle)
|
||||||
MotionMaster::MoveChase(Unit* target, float dist, float angle)
|
|
||||||
{
|
{
|
||||||
// ignore movement request if target not exist
|
// ignore movement request if target not exist
|
||||||
if (!target || target == i_owner || i_owner->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE))
|
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
|
void MotionMaster::MoveFollow(Unit* target, float dist, float angle, MovementSlot slot)
|
||||||
MotionMaster::MoveFollow(Unit* target, float dist, float angle, MovementSlot slot)
|
|
||||||
{
|
{
|
||||||
// ignore movement request if target not exist
|
// ignore movement request if target not exist
|
||||||
if (!target || target == i_owner || i_owner->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE))
|
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
|
void MotionMaster::MovePoint(uint32 id, float x, float y, float z)
|
||||||
MotionMaster::MovePoint(uint32 id, float x, float y, float z)
|
|
||||||
{
|
{
|
||||||
if (i_owner->GetTypeId() == TYPEID_PLAYER)
|
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)
|
void MotionMaster::MoveKnockbackFrom(float srcX, float srcY, float speedXY, float speedZ)
|
||||||
{
|
{
|
||||||
//this function may make players fall below map
|
//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);
|
i_owner->SendMonsterMove(x, y, z, moveFlag, time, speedZ);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void MotionMaster::MoveCharge(float x, float y, float z, float speed, uint32 id)
|
||||||
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)
|
if (Impl[MOTION_SLOT_CONTROLLED] && Impl[MOTION_SLOT_CONTROLLED]->GetMovementGeneratorType() != DISTRACT_MOTION_TYPE)
|
||||||
return;
|
return;
|
||||||
@@ -375,8 +414,7 @@ void MotionMaster::MoveFall(float z, uint32 id)
|
|||||||
MoveCharge(i_owner->GetPositionX(), i_owner->GetPositionY(), z, SPEED_CHARGE, id);
|
MoveCharge(i_owner->GetPositionX(), i_owner->GetPositionY(), z, SPEED_CHARGE, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void MotionMaster::MoveSeekAssistance(float x, float y, float z)
|
||||||
MotionMaster::MoveSeekAssistance(float x, float y, float z)
|
|
||||||
{
|
{
|
||||||
if (i_owner->GetTypeId() == TYPEID_PLAYER)
|
if (i_owner->GetTypeId() == TYPEID_PLAYER)
|
||||||
{
|
{
|
||||||
@@ -392,8 +430,7 @@ MotionMaster::MoveSeekAssistance(float x, float y, float z)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void MotionMaster::MoveSeekAssistanceDistract(uint32 time)
|
||||||
MotionMaster::MoveSeekAssistanceDistract(uint32 time)
|
|
||||||
{
|
{
|
||||||
if (i_owner->GetTypeId() == TYPEID_PLAYER)
|
if (i_owner->GetTypeId() == TYPEID_PLAYER)
|
||||||
{
|
{
|
||||||
@@ -407,8 +444,7 @@ MotionMaster::MoveSeekAssistanceDistract(uint32 time)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void MotionMaster::MoveFleeing(Unit* enemy, uint32 time)
|
||||||
MotionMaster::MoveFleeing(Unit* enemy, uint32 time)
|
|
||||||
{
|
{
|
||||||
if (!enemy)
|
if (!enemy)
|
||||||
return;
|
return;
|
||||||
@@ -437,8 +473,7 @@ MotionMaster::MoveFleeing(Unit* enemy, uint32 time)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void MotionMaster::MoveTaxiFlight(uint32 path, uint32 pathnode)
|
||||||
MotionMaster::MoveTaxiFlight(uint32 path, uint32 pathnode)
|
|
||||||
{
|
{
|
||||||
if (i_owner->GetTypeId() == TYPEID_PLAYER)
|
if (i_owner->GetTypeId() == TYPEID_PLAYER)
|
||||||
{
|
{
|
||||||
@@ -461,8 +496,7 @@ MotionMaster::MoveTaxiFlight(uint32 path, uint32 pathnode)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void MotionMaster::MoveDistract(uint32 timer)
|
||||||
MotionMaster::MoveDistract(uint32 timer)
|
|
||||||
{
|
{
|
||||||
if (Impl[MOTION_SLOT_CONTROLLED])
|
if (Impl[MOTION_SLOT_CONTROLLED])
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -152,6 +152,11 @@ class MotionMaster //: private std::stack<MovementGenerator *>
|
|||||||
void MovePoint(uint32 id, const Position &pos)
|
void MovePoint(uint32 id, const Position &pos)
|
||||||
{ MovePoint(id, pos.m_positionX, pos.m_positionY, pos.m_positionZ); }
|
{ MovePoint(id, pos.m_positionX, pos.m_positionY, pos.m_positionZ); }
|
||||||
void MovePoint(uint32 id, float x, float y, float z);
|
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 MoveCharge(float x, float y, float z, float speed = SPEED_CHARGE, uint32 id = EVENT_CHARGE);
|
||||||
void MoveFall(float z, uint32 id = 0);
|
void MoveFall(float z, uint32 id = 0);
|
||||||
void MoveKnockbackFrom(float srcX, float srcY, float speedXY, float speedZ);
|
void MoveKnockbackFrom(float srcX, float srcY, float speedXY, float speedZ);
|
||||||
|
|||||||
@@ -29,8 +29,9 @@ void PointMovementGenerator<T>::Initialize(T &unit)
|
|||||||
{
|
{
|
||||||
unit.StopMoving();
|
unit.StopMoving();
|
||||||
Traveller<T> traveller(unit);
|
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
|
// 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
|
||||||
i_destinationHolder.SetDestination(traveller, i_x, i_y, i_z, true /* !unit.HasUnitState(UNIT_STAT_JUMPING)*/);
|
// 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>
|
template<class T>
|
||||||
|
|||||||
@@ -96,6 +96,7 @@ enum Events
|
|||||||
EVENT_ICE_TOMB = 10,
|
EVENT_ICE_TOMB = 10,
|
||||||
EVENT_FROST_BOMB = 11,
|
EVENT_FROST_BOMB = 11,
|
||||||
EVENT_LAND = 12,
|
EVENT_LAND = 12,
|
||||||
|
EVENT_AIR_MOVEMENT = 21,
|
||||||
|
|
||||||
// Spinestalker
|
// Spinestalker
|
||||||
EVENT_BELLOWING_ROAR = 13,
|
EVENT_BELLOWING_ROAR = 13,
|
||||||
@@ -129,7 +130,8 @@ enum MovementPoints
|
|||||||
POINT_FROSTWYRM_FLY_IN = 1,
|
POINT_FROSTWYRM_FLY_IN = 1,
|
||||||
POINT_FROSTWYRM_LAND = 2,
|
POINT_FROSTWYRM_LAND = 2,
|
||||||
POINT_AIR_PHASE = 3,
|
POINT_AIR_PHASE = 3,
|
||||||
POINT_LAND = 4,
|
POINT_TAKEOFF = 4,
|
||||||
|
POINT_LAND = 5,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum Shadowmourne
|
enum Shadowmourne
|
||||||
@@ -141,9 +143,9 @@ enum Shadowmourne
|
|||||||
SPELL_FROST_IMBUED_BLADE = 72290,
|
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 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 SpinestalkerLandPos = {4418.895f, 2514.233f, 203.3848f, 3.396045f};
|
||||||
Position const SindragosaSpawnPos = {4818.700f, 2483.710f, 287.0650f, 3.089233f};
|
Position const SindragosaSpawnPos = {4818.700f, 2483.710f, 287.0650f, 3.089233f};
|
||||||
Position const SindragosaFlyPos = {4475.190f, 2484.570f, 234.8510f, 3.141593f};
|
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*/)
|
bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/)
|
||||||
{
|
{
|
||||||
_owner.GetMotionMaster()->MovePoint(POINT_FROSTWYRM_LAND, _dest);
|
_owner.GetMotionMaster()->MoveLand(POINT_FROSTWYRM_LAND, _dest, 8.247422f);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -245,7 +247,7 @@ class boss_sindragosa : public CreatureScript
|
|||||||
me->setActive(true);
|
me->setActive(true);
|
||||||
me->SetSpeed(MOVE_FLIGHT, 4.0f);
|
me->SetSpeed(MOVE_FLIGHT, 4.0f);
|
||||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
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->m_Events.AddEvent(new FrostwyrmLandEvent(*me, SindragosaLandPos), me->m_Events.CalculateTime(uint64(moveTime) + 250));
|
||||||
me->GetMotionMaster()->MovePoint(POINT_FROSTWYRM_FLY_IN, SindragosaFlyPos);
|
me->GetMotionMaster()->MovePoint(POINT_FROSTWYRM_FLY_IN, SindragosaFlyPos);
|
||||||
DoCast(me, SPELL_SINDRAGOSA_S_FURY);
|
DoCast(me, SPELL_SINDRAGOSA_S_FURY);
|
||||||
@@ -277,6 +279,9 @@ class boss_sindragosa : public CreatureScript
|
|||||||
// Sindragosa enters combat as soon as she lands
|
// Sindragosa enters combat as soon as she lands
|
||||||
DoZoneInCombat();
|
DoZoneInCombat();
|
||||||
break;
|
break;
|
||||||
|
case POINT_TAKEOFF:
|
||||||
|
events.ScheduleEvent(EVENT_AIR_MOVEMENT, 1);
|
||||||
|
break;
|
||||||
case POINT_AIR_PHASE:
|
case POINT_AIR_PHASE:
|
||||||
me->CastCustomSpell(SPELL_ICE_TOMB_TARGET, SPELLVALUE_MAX_TARGETS, RAID_MODE<int32>(2, 5, 2, 6), false);
|
me->CastCustomSpell(SPELL_ICE_TOMB_TARGET, SPELLVALUE_MAX_TARGETS, RAID_MODE<int32>(2, 5, 2, 6), false);
|
||||||
events.ScheduleEvent(EVENT_FROST_BOMB, 8000);
|
events.ScheduleEvent(EVENT_FROST_BOMB, 8000);
|
||||||
@@ -414,16 +419,24 @@ class boss_sindragosa : public CreatureScript
|
|||||||
Talk(SAY_BLISTERING_COLD);
|
Talk(SAY_BLISTERING_COLD);
|
||||||
break;
|
break;
|
||||||
case EVENT_AIR_PHASE:
|
case EVENT_AIR_PHASE:
|
||||||
|
{
|
||||||
Talk(SAY_AIR_PHASE);
|
Talk(SAY_AIR_PHASE);
|
||||||
me->SetFlying(true);
|
me->SetFlying(true);
|
||||||
me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
|
me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
|
||||||
me->SetReactState(REACT_PASSIVE);
|
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.DelayEvents(45000, EVENT_GROUP_LAND_PHASE);
|
||||||
events.ScheduleEvent(EVENT_AIR_PHASE, 110000);
|
events.ScheduleEvent(EVENT_AIR_PHASE, 110000);
|
||||||
events.RescheduleEvent(EVENT_UNCHAINED_MAGIC, urand(55000, 60000), EVENT_GROUP_LAND_PHASE);
|
events.RescheduleEvent(EVENT_UNCHAINED_MAGIC, urand(55000, 60000), EVENT_GROUP_LAND_PHASE);
|
||||||
events.ScheduleEvent(EVENT_LAND, 45000);
|
events.ScheduleEvent(EVENT_LAND, 45000);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
case EVENT_AIR_MOVEMENT:
|
||||||
|
me->GetMotionMaster()->MovePoint(POINT_AIR_PHASE, SindragosaAirPos);
|
||||||
|
break;
|
||||||
case EVENT_ICE_TOMB:
|
case EVENT_ICE_TOMB:
|
||||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, -SPELL_ICE_TOMB_UNTARGETABLE))
|
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->setActive(true);
|
||||||
me->SetSpeed(MOVE_FLIGHT, 2.0f);
|
me->SetSpeed(MOVE_FLIGHT, 2.0f);
|
||||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
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->m_Events.AddEvent(new FrostwyrmLandEvent(*me, SpinestalkerLandPos), me->m_Events.CalculateTime(uint64(moveTime) + 250));
|
||||||
me->SetDefaultMovementType(IDLE_MOTION_TYPE);
|
me->SetDefaultMovementType(IDLE_MOTION_TYPE);
|
||||||
me->GetMotionMaster()->MoveIdle(MOTION_SLOT_IDLE);
|
me->GetMotionMaster()->MoveIdle(MOTION_SLOT_IDLE);
|
||||||
@@ -719,7 +732,7 @@ class npc_rimefang : public CreatureScript
|
|||||||
me->setActive(true);
|
me->setActive(true);
|
||||||
me->SetSpeed(MOVE_FLIGHT, 2.0f);
|
me->SetSpeed(MOVE_FLIGHT, 2.0f);
|
||||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
|
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->m_Events.AddEvent(new FrostwyrmLandEvent(*me, RimefangLandPos), me->m_Events.CalculateTime(uint64(moveTime) + 250));
|
||||||
me->SetDefaultMovementType(IDLE_MOTION_TYPE);
|
me->SetDefaultMovementType(IDLE_MOTION_TYPE);
|
||||||
me->GetMotionMaster()->MoveIdle(MOTION_SLOT_IDLE);
|
me->GetMotionMaster()->MoveIdle(MOTION_SLOT_IDLE);
|
||||||
@@ -821,12 +834,12 @@ class npc_sindragosa_trash : public CreatureScript
|
|||||||
{
|
{
|
||||||
npc_sindragosa_trashAI(Creature* creature) : ScriptedAI(creature)
|
npc_sindragosa_trashAI(Creature* creature) : ScriptedAI(creature)
|
||||||
{
|
{
|
||||||
_frostwyrmId = (creature->GetHomePosition().GetPositionY() < 2484.35f) ? DATA_RIMEFANG : DATA_SPINESTALKER;
|
|
||||||
_instance = creature->GetInstanceScript();
|
_instance = creature->GetInstanceScript();
|
||||||
}
|
}
|
||||||
|
|
||||||
void InitializeAI()
|
void InitializeAI()
|
||||||
{
|
{
|
||||||
|
_frostwyrmId = (me->GetHomePosition().GetPositionY() < 2484.35f) ? DATA_RIMEFANG : DATA_SPINESTALKER;
|
||||||
// Increase add count
|
// Increase add count
|
||||||
if (!me->isDead())
|
if (!me->isDead())
|
||||||
_instance->SetData(_frostwyrmId, 1); // this cannot be in Reset because reset also happens on evade
|
_instance->SetData(_frostwyrmId, 1); // this cannot be in Reset because reset also happens on evade
|
||||||
|
|||||||
Reference in New Issue
Block a user