30 bool hasFallData = hasFallDirection || movementInfo.
jump.
fallTime != 0;
31 bool hasSpline =
false;
32 bool hasInertia = movementInfo.
inertia.has_value();
33 bool hasAdvFlying = movementInfo.
advFlying.has_value();
36 data << movementInfo.
guid;
42 data << float(movementInfo.
pitch);
45 uint32 removeMovementForcesCount = 0;
46 data << removeMovementForcesCount;
56 data.
WriteBit(hasStandingOnGameObjectGUID);
71 if (hasStandingOnGameObjectGUID)
77 data << movementInfo.
inertia->force.PositionXYZStream();
83 data << float(movementInfo.
advFlying->forwardVelocity);
84 data << float(movementInfo.
advFlying->upVelocity);
109 data >> movementInfo.
guid;
110 data >> movementInfo.
flags;
111 data >> movementInfo.
flags2;
112 data >> movementInfo.
flags3;
113 data >> movementInfo.
time;
115 data >> movementInfo.
pitch;
118 uint32 removeMovementForcesCount;
119 data >> removeMovementForcesCount;
124 for (
uint32 i = 0; i < removeMovementForcesCount; ++i)
130 bool hasStandingOnGameObjectGUID = data.
ReadBit();
131 bool hasTransport = data.
ReadBit();
137 bool hasInertia = data.
ReadBit();
138 bool hasAdvFlying = data.
ReadBit();
143 if (hasStandingOnGameObjectGUID)
148 movementInfo.
inertia.emplace();
150 data >> movementInfo.
inertia->id;
151 data >> movementInfo.
inertia->force.PositionXYZStream();
152 data >> movementInfo.
inertia->lifetime;
159 data >> movementInfo.
advFlying->forwardVelocity;
160 data >> movementInfo.
advFlying->upVelocity;
170 bool hasFallDirection = data.
ReadBit();
171 if (hasFallDirection)
184 data >> transportInfo.
guid;
186 data >> transportInfo.
seat;
187 data >> transportInfo.
time;
189 bool hasPrevTime = data.
ReadBit();
190 bool hasVehicleId = data.
ReadBit();
203 bool hasPrevTime = transportInfo.
prevTime != 0;
204 bool hasVehicleId = transportInfo.
vehicleId != 0;
206 data << transportInfo.
guid;
211 data << transportInfo.
seat;
212 data << transportInfo.
time;
235 data <<
int16(monsterSplineFilterKey.
Idx);
244 data << float(monsterSplineFilter.
BaseSpeed);
322 switch (movementSpline.
Face)
359 data << movementMonsterSpline.
ID;
363 data << movementMonsterSpline.
Move;
379 dest = G3D::Vector3::zero();
384 data << dest.x << dest.y << dest.z;
424 data << float(moveSpline.
facing.
f.
x);
425 data << float(moveSpline.
facing.
f.
y);
426 data << float(moveSpline.
facing.
f.
z);
439 if (hasFadeObjectTime)
453 if (hasJumpExtraData)
489 data << movementForce.
ID;
490 data << movementForce.
Origin;
500 if (lengthSquared > 0.0f)
502 float mult = 1.0f / std::sqrt(lengthSquared) * movementForce.
Magnitude;
509 if (lengthSquared > minLengthSquared)
528 SplineData.ID = moveSpline.
m_Id;
532 movementSpline.
Flags =
uint32(splineFlags & ~::Movement::MoveSplineFlagEnum::Mask_No_Monster_Move);
555 if (splineFlags.FadeObject)
569 std::vector<G3D::Vector3>
const& array = spline.
getPoints();
571 if (splineFlags.UncompressedPath)
574 for (
uint32 i = 0; i < count; ++i)
575 movementSpline.
Points.emplace_back(array[i + 2].x, array[i + 2].y, array[i + 2].z);
580 G3D::Vector3
const* realPath = &array[1];
582 movementSpline.
Points.emplace_back(realPath[lastIdx].x, realPath[lastIdx].y, realPath[lastIdx].z);
586 G3D::Vector3 middle = (realPath[0] + realPath[lastIdx]) / 2.f;
589 for (
uint32 i = 1; i < lastIdx; ++i)
591 G3D::Vector3 delta = middle - realPath[i];
592 movementSpline.
PackedDeltas.emplace_back(delta.x, delta.y, delta.z);
600 _worldPacket << MoverGUID;
602 _worldPacket << SplineData;
603 return &_worldPacket;
608 _worldPacket << Guid;
609 _worldPacket << float(SplineDist);
611 return &_worldPacket;
616 _worldPacket << MoverGUID;
617 _worldPacket << Speed;
618 return &_worldPacket;
623 _worldPacket << MoverGUID;
624 _worldPacket << SequenceIndex;
625 _worldPacket << Speed;
626 return &_worldPacket;
631 _worldPacket << *Status;
632 _worldPacket << Speed;
633 return &_worldPacket;
638 _worldPacket << MoverGUID;
639 _worldPacket <<
uint32(SequenceIndex);
640 _worldPacket << float(Speed);
641 return &_worldPacket;
646 _worldPacket << MoverGUID;
647 _worldPacket <<
uint32(SequenceIndex);
648 _worldPacket << float(SpeedMin);
649 _worldPacket << float(SpeedMax);
650 return &_worldPacket;
655 _worldPacket << MoverGUID;
656 return &_worldPacket;
661 _worldPacket << MoverGUID;
662 _worldPacket << SequenceIndex;
663 return &_worldPacket;
668 _worldPacket << *Status;
670 return &_worldPacket;
675 _worldPacket <<
int32(MapID);
676 _worldPacket << OldMapPosition;
677 _worldPacket.WriteBit(Ship.has_value());
678 _worldPacket.WriteBit(TransferSpellID.has_value());
681 _worldPacket <<
uint32(Ship->ID);
682 _worldPacket <<
int32(Ship->OriginMapID);
686 _worldPacket <<
int32(*TransferSpellID);
688 _worldPacket.FlushBits();
690 return &_worldPacket;
695 _worldPacket <<
uint32(MapID);
696 _worldPacket <<
uint8(Arg);
697 _worldPacket <<
int32(MapDifficultyXConditionID);
698 _worldPacket.WriteBits(TransfertAbort, 6);
699 _worldPacket.FlushBits();
700 return &_worldPacket;
705 data << teleportLocation.
Pos;
714 _worldPacket <<
int32(MapID);
716 _worldPacket <<
uint32(Reason);
717 _worldPacket << MovementOffset;
718 _worldPacket <<
int32(Counter);
719 return &_worldPacket;
724 _worldPacket << MoverGUID;
725 _worldPacket <<
uint32(SequenceIndex);
727 _worldPacket << float(Facing);
728 _worldPacket <<
uint8(PreloadWorld);
730 _worldPacket.WriteBit(TransportGUID.has_value());
731 _worldPacket.WriteBit(
Vehicle.has_value());
732 _worldPacket.FlushBits();
737 _worldPacket.WriteBit(
Vehicle->VehicleExitVoluntary);
738 _worldPacket.WriteBit(
Vehicle->VehicleExitTeleport);
739 _worldPacket.FlushBits();
743 _worldPacket << *TransportGUID;
745 return &_worldPacket;
756 data >> movementForce.
ID;
757 data >> movementForce.
Origin;
769 _worldPacket << *Status;
772 _worldPacket.WriteBit(WalkSpeed.has_value());
773 _worldPacket.WriteBit(RunSpeed.has_value());
774 _worldPacket.WriteBit(RunBackSpeed.has_value());
775 _worldPacket.WriteBit(SwimSpeed.has_value());
776 _worldPacket.WriteBit(SwimBackSpeed.has_value());
777 _worldPacket.WriteBit(FlightSpeed.has_value());
778 _worldPacket.WriteBit(FlightBackSpeed.has_value());
779 _worldPacket.WriteBit(TurnRate.has_value());
780 _worldPacket.WriteBit(PitchRate.has_value());
781 _worldPacket.FlushBits();
785 _worldPacket << force;
788 _worldPacket << *WalkSpeed;
791 _worldPacket << *RunSpeed;
794 _worldPacket << *RunBackSpeed;
797 _worldPacket << *SwimSpeed;
800 _worldPacket << *SwimBackSpeed;
803 _worldPacket << *FlightSpeed;
806 _worldPacket << *FlightBackSpeed;
809 _worldPacket << *TurnRate;
812 _worldPacket << *PitchRate;
814 return &_worldPacket;
819 _worldPacket >> MoverGUID;
820 _worldPacket >> AckIndex;
821 _worldPacket >> MoveTime;
839 _worldPacket >> Speed;
845 _worldPacket >> SpeedMin;
846 _worldPacket >> SpeedMax;
851 _worldPacket >> ActiveMover;
856 _worldPacket << MoverGUID;
858 return &_worldPacket;
879 _worldPacket << MoverGUID;
880 _worldPacket <<
uint32(SequenceIndex);
882 _worldPacket << Speeds;
884 return &_worldPacket;
889 _worldPacket << *Status;
891 return &_worldPacket;
897 bool hasSpeeds = _worldPacket.ReadBit();
901 _worldPacket >> *Speeds;
907 _worldPacket << MoverGUID;
908 _worldPacket <<
uint32(SequenceIndex);
909 _worldPacket << float(Height);
910 _worldPacket << float(
Scale);
911 _worldPacket <<
uint8(Reason);
912 _worldPacket <<
uint32(MountDisplayID);
913 _worldPacket <<
int32(ScaleDuration);
914 _worldPacket.FlushBits();
916 return &_worldPacket;
921 _worldPacket << *Status;
922 _worldPacket << float(Height);
923 _worldPacket << float(
Scale);
925 return &_worldPacket;
930 _worldPacket << MoverGUID;
931 _worldPacket << SequenceIndex;
932 _worldPacket << *
Force;
934 return &_worldPacket;
940 _worldPacket >>
Force;
945 _worldPacket << MoverGUID;
946 _worldPacket << SequenceIndex;
949 return &_worldPacket;
960 _worldPacket << *Status;
961 _worldPacket << *
Force;
963 return &_worldPacket;
968 _worldPacket << *Status;
969 _worldPacket << TriggerGUID;
971 return &_worldPacket;
976 _worldPacket >>
Data;
977 _worldPacket >> Height;
978 _worldPacket >> MountDisplayID;
979 _worldPacket >> As<uint8>(Reason);
984 _worldPacket >> MoverGUID;
985 _worldPacket >> TimeSkipped;
990 _worldPacket << MoverGUID;
991 _worldPacket << TimeSkipped;
993 return &_worldPacket;
998 _worldPacket >> SummonerGUID;
999 Accept = _worldPacket.ReadBit();
1004 _worldPacket << Guid;
1006 _worldPacket.FlushBits();
1008 return &_worldPacket;
1013 _worldPacket >> Status;
1014 _worldPacket >> SplineID;
1019 _worldPacket << SummonerGUID;
1020 _worldPacket <<
uint32(SummonerVirtualRealmAddress);
1021 _worldPacket <<
int32(AreaID);
1022 _worldPacket <<
uint8(Reason);
1023 _worldPacket.WriteBit(SkipStartingArea);
1024 _worldPacket.FlushBits();
1026 return &_worldPacket;
1031 _worldPacket <<
uint32(SequenceIndex);
1032 _worldPacket.WriteBits(Reason, 2);
1033 _worldPacket.FlushBits();
1035 return &_worldPacket;
1040 _worldPacket >> SequenceIndex;
1045 _worldPacket <<
uint32(SequenceIndex);
1046 _worldPacket.WriteBits(Reason, 2);
1047 _worldPacket.FlushBits();
1049 return &_worldPacket;
1070 if (stateChange.
Speed)
1071 data << float(*stateChange.
Speed);
1081 data << float(stateChange.
KnockBack->HorzSpeed);
1082 data << stateChange.
KnockBack->Direction;
1083 data << float(stateChange.
KnockBack->InitVertSpeed);
1110 _worldPacket << MoverGUID;
1111 _worldPacket <<
uint32(StateChanges.size());
1113 _worldPacket << stateChange;
1115 return &_worldPacket;
1120 _worldPacket >> Ticks;
ByteBuffer & operator<<(ByteBuffer &data, MovementInfo const &movementInfo)
ByteBuffer & operator>>(ByteBuffer &data, MovementInfo &movementInfo)
@ MOVEMENTFLAG_FALLING_FAR
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
uint32 ReadBits(int32 bits)
void WriteBits(uint64 value, int32 bits)
constexpr std::underlying_type_t< T > AsUnderlyingType() const
MySpline::ControlArray const & getPath() const
Optional< AnimTierTransition > anim_tier
MySpline const & _Spline() const
float vertical_acceleration
Vector3 const & FinalDestination() const
MoveSplineFlag splineflags
Optional< SpellEffectExtraData > spell_effect_extra
ControlArray const & getPoints() const
Vector3 const & getPoint(index_type i) const
index_type getPointCount() const
static void WriteCreateObjectSplineDataBlock(::Movement::MoveSpline const &moveSpline, ByteBuffer &data)
static void WriteCreateObjectAreaTriggerSpline(::Movement::Spline< int32 > const &spline, ByteBuffer &data)
static void WriteMovementForceWithDirection(MovementForce const &movementForce, ByteBuffer &data, Position const *objectPosition=nullptr)
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
void InitializeSplineData(::Movement::MoveSpline const &moveSpline)
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
@ MONSTER_MOVE_FACING_TARGET
@ MONSTER_MOVE_FACING_ANGLE
@ MONSTER_MOVE_FACING_SPOT
ByteBuffer & operator<<(ByteBuffer &data, Movement::MonsterSplineFilterKey const &monsterSplineFilterKey)
TaggedPosition< Position::XYZ > Origin
TaggedPosition< Position::XYZ > Direction
Optional< Inertia > inertia
Optional< ObjectGuid > standingOnGameObjectGUID
struct MovementInfo::JumpInfo jump
float stepUpStartElevation
struct MovementInfo::TransportInfo transport
bool HasMovementFlag(uint32 flag) const
Optional< AdvFlying > advFlying
struct Movement::FacingInfo::@313 f
Streamer< XYZO > PositionXYZOStream()
constexpr float GetPositionX() const
constexpr float GetPositionY() const
constexpr float GetExactDistSq(float x, float y, float z) const
constexpr float GetOrientation() const
constexpr float GetPositionZ() const
float DistToPrevFilterKey
std::vector< MonsterSplineFilterKey > FilterKeys
Spells::SpellCastVisual Visual
std::array< Inner, 16 > Data
Optional< MovementForce > MovementForce_
Optional< int32 > MovementInertiaID
Optional< int32 > VehicleRecID
Optional< MoveSetCompoundState::SpeedRange > SpeedRange
Optional< KnockBackInfo > KnockBack
Optional< uint32 > MovementInertiaLifetimeMs
Optional< CollisionHeightInfo > CollisionHeight
Optional< ObjectGuid > MovementForceGUID
std::vector< TaggedPosition< Position::XYZ > > Points
Optional< MonsterSplineSpellEffectExtraData > SpellEffectExtraData
Optional< MonsterSplineJumpExtraData > JumpExtraData
bool VehicleExitVoluntary
std::vector< TaggedPosition< Position::PackedXYZ > > PackedDeltas
Optional< MonsterSplineAnimTierTransition > AnimTierTransition
Optional< MonsterSplineUnknown901 > Unknown901
Optional< MonsterSplineFilter > SplineFilter
TaggedPosition< Position::XYZ > FaceSpot
TaggedPosition< Position::XYZO > Pos
EnumFlag< MoveSplineFlagEnum > Raw