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();
34 bool hasDriveStatus = movementInfo.
driveStatus.has_value();
37 data << movementInfo.
guid;
43 data << float(movementInfo.
pitch);
46 uint32 removeMovementForcesCount = 0;
47 data << removeMovementForcesCount;
57 data.
WriteBit(hasStandingOnGameObjectGUID);
73 if (hasStandingOnGameObjectGUID)
79 data << movementInfo.
inertia->force.PositionXYZStream();
85 data << float(movementInfo.
advFlying->forwardVelocity);
86 data << float(movementInfo.
advFlying->upVelocity);
109 data << float(movementInfo.
driveStatus->movementAngle);
119 data >> movementInfo.
guid;
120 data >> movementInfo.
flags;
121 data >> movementInfo.
flags2;
122 data >> movementInfo.
flags3;
123 data >> movementInfo.
time;
125 data >> movementInfo.
pitch;
128 uint32 removeMovementForcesCount;
129 data >> removeMovementForcesCount;
134 for (
uint32 i = 0; i < removeMovementForcesCount; ++i)
140 bool hasStandingOnGameObjectGUID = data.
ReadBit();
141 bool hasTransport = data.
ReadBit();
147 bool hasInertia = data.
ReadBit();
148 bool hasAdvFlying = data.
ReadBit();
149 bool hasDriveStatus = data.
ReadBit();
154 if (hasStandingOnGameObjectGUID)
159 movementInfo.
inertia.emplace();
161 data >> movementInfo.
inertia->id;
162 data >> movementInfo.
inertia->force.PositionXYZStream();
163 data >> movementInfo.
inertia->lifetime;
170 data >> movementInfo.
advFlying->forwardVelocity;
171 data >> movementInfo.
advFlying->upVelocity;
181 bool hasFallDirection = data.
ReadBit();
182 if (hasFallDirection)
207 data >> transportInfo.
guid;
209 data >> transportInfo.
seat;
210 data >> transportInfo.
time;
212 bool hasPrevTime = data.
ReadBit();
213 bool hasVehicleId = data.
ReadBit();
226 bool hasPrevTime = transportInfo.
prevTime != 0;
227 bool hasVehicleId = transportInfo.
vehicleId != 0;
229 data << transportInfo.
guid;
234 data << transportInfo.
seat;
235 data << transportInfo.
time;
258 data <<
int16(monsterSplineFilterKey.
Idx);
267 data << float(monsterSplineFilter.
BaseSpeed);
345 switch (movementSpline.
Face)
382 data << movementMonsterSpline.
ID;
386 data << movementMonsterSpline.
Move;
402 dest = G3D::Vector3::zero();
407 data << dest.x << dest.y << dest.z;
447 data << float(moveSpline.
facing.
f.
x);
448 data << float(moveSpline.
facing.
f.
y);
449 data << float(moveSpline.
facing.
f.
z);
462 if (hasFadeObjectTime)
476 if (hasJumpExtraData)
512 data << movementForce.
ID;
513 data << movementForce.
Origin;
523 if (lengthSquared > 0.0f)
525 float mult = 1.0f / std::sqrt(lengthSquared) * movementForce.
Magnitude;
532 if (lengthSquared > minLengthSquared)
554 SplineData.ID = moveSpline.
m_Id;
558 movementSpline.
Flags =
uint32(splineFlags & ~::Movement::MoveSplineFlagEnum::Mask_No_Monster_Move);
581 if (splineFlags.FadeObject)
595 std::vector<G3D::Vector3>
const& array = spline.
getPoints();
597 if (splineFlags.UncompressedPath)
600 for (
uint32 i = 0; i < count; ++i)
601 movementSpline.
Points.emplace_back(array[i + 2].x, array[i + 2].y, array[i + 2].z);
606 G3D::Vector3
const* realPath = &array[1];
608 movementSpline.
Points.emplace_back(realPath[lastIdx].x, realPath[lastIdx].y, realPath[lastIdx].z);
612 G3D::Vector3 middle = (realPath[0] + realPath[lastIdx]) / 2.f;
615 for (
uint32 i = 1; i < lastIdx; ++i)
617 G3D::Vector3 delta = middle - realPath[i];
618 movementSpline.
PackedDeltas.emplace_back(delta.x, delta.y, delta.z);
626 _worldPacket << MoverGUID;
628 _worldPacket << SplineData;
629 return &_worldPacket;
634 _worldPacket << Guid;
635 _worldPacket << float(SplineDist);
637 return &_worldPacket;
642 _worldPacket << MoverGUID;
643 _worldPacket << Speed;
644 return &_worldPacket;
649 _worldPacket << MoverGUID;
650 _worldPacket << SequenceIndex;
651 _worldPacket << Speed;
652 return &_worldPacket;
657 _worldPacket << *Status;
658 _worldPacket << Speed;
659 return &_worldPacket;
664 _worldPacket << MoverGUID;
665 _worldPacket <<
uint32(SequenceIndex);
666 _worldPacket << float(Speed);
667 return &_worldPacket;
672 _worldPacket << MoverGUID;
673 _worldPacket <<
uint32(SequenceIndex);
674 _worldPacket << float(SpeedMin);
675 _worldPacket << float(SpeedMax);
676 return &_worldPacket;
681 _worldPacket << MoverGUID;
682 return &_worldPacket;
687 _worldPacket << MoverGUID;
688 _worldPacket << SequenceIndex;
689 return &_worldPacket;
694 _worldPacket << *Status;
696 return &_worldPacket;
701 _worldPacket <<
int32(MapID);
702 _worldPacket << OldMapPosition;
706 _worldPacket.FlushBits();
710 _worldPacket <<
uint32(Ship->ID);
711 _worldPacket <<
int32(Ship->OriginMapID);
715 _worldPacket <<
int32(*TransferSpellID);
718 _worldPacket <<
int32(*TaxiPathID);
720 return &_worldPacket;
725 _worldPacket <<
uint32(MapID);
726 _worldPacket <<
uint8(Arg);
727 _worldPacket <<
int32(MapDifficultyXConditionID);
728 _worldPacket.WriteBits(TransfertAbort, 6);
729 _worldPacket.FlushBits();
730 return &_worldPacket;
735 data << teleportLocation.
Pos;
744 _worldPacket <<
int32(MapID);
746 _worldPacket <<
uint32(Reason);
747 _worldPacket << MovementOffset;
748 _worldPacket <<
int32(Counter);
749 return &_worldPacket;
754 _worldPacket << MoverGUID;
755 _worldPacket <<
uint32(SequenceIndex);
757 _worldPacket << float(Facing);
758 _worldPacket <<
uint8(PreloadWorld);
760 _worldPacket.WriteBit(TransportGUID.has_value());
761 _worldPacket.WriteBit(
Vehicle.has_value());
762 _worldPacket.FlushBits();
767 _worldPacket.WriteBit(
Vehicle->VehicleExitVoluntary);
768 _worldPacket.WriteBit(
Vehicle->VehicleExitTeleport);
769 _worldPacket.FlushBits();
773 _worldPacket << *TransportGUID;
775 return &_worldPacket;
786 data >> movementForce.
ID;
787 data >> movementForce.
Origin;
794 data >> movementForce.
Flags;
802 _worldPacket << *Status;
805 _worldPacket.WriteBit(WalkSpeed.has_value());
806 _worldPacket.WriteBit(RunSpeed.has_value());
807 _worldPacket.WriteBit(RunBackSpeed.has_value());
808 _worldPacket.WriteBit(SwimSpeed.has_value());
809 _worldPacket.WriteBit(SwimBackSpeed.has_value());
810 _worldPacket.WriteBit(FlightSpeed.has_value());
811 _worldPacket.WriteBit(FlightBackSpeed.has_value());
812 _worldPacket.WriteBit(TurnRate.has_value());
813 _worldPacket.WriteBit(PitchRate.has_value());
814 _worldPacket.FlushBits();
818 _worldPacket << force;
821 _worldPacket << *WalkSpeed;
824 _worldPacket << *RunSpeed;
827 _worldPacket << *RunBackSpeed;
830 _worldPacket << *SwimSpeed;
833 _worldPacket << *SwimBackSpeed;
836 _worldPacket << *FlightSpeed;
839 _worldPacket << *FlightBackSpeed;
842 _worldPacket << *TurnRate;
845 _worldPacket << *PitchRate;
847 return &_worldPacket;
852 _worldPacket >> MoverGUID;
853 _worldPacket >> AckIndex;
854 _worldPacket >> MoveTime;
872 _worldPacket >> Speed;
878 _worldPacket >> SpeedMin;
879 _worldPacket >> SpeedMax;
884 _worldPacket >> ActiveMover;
889 _worldPacket << MoverGUID;
891 return &_worldPacket;
912 _worldPacket << MoverGUID;
913 _worldPacket <<
uint32(SequenceIndex);
915 _worldPacket << Speeds;
917 return &_worldPacket;
922 _worldPacket << *Status;
924 return &_worldPacket;
930 bool hasSpeeds = _worldPacket.ReadBit();
934 _worldPacket >> *Speeds;
940 _worldPacket << MoverGUID;
941 _worldPacket <<
uint32(SequenceIndex);
942 _worldPacket << float(Height);
943 _worldPacket << float(
Scale);
944 _worldPacket <<
uint8(Reason);
945 _worldPacket <<
uint32(MountDisplayID);
946 _worldPacket <<
int32(ScaleDuration);
947 _worldPacket.FlushBits();
949 return &_worldPacket;
954 _worldPacket << *Status;
955 _worldPacket << float(Height);
956 _worldPacket << float(
Scale);
958 return &_worldPacket;
963 _worldPacket << MoverGUID;
964 _worldPacket << SequenceIndex;
965 _worldPacket << *
Force;
967 return &_worldPacket;
973 _worldPacket >>
Force;
978 _worldPacket << MoverGUID;
979 _worldPacket << SequenceIndex;
982 return &_worldPacket;
993 _worldPacket << *Status;
994 _worldPacket << *
Force;
996 return &_worldPacket;
1001 _worldPacket << *Status;
1002 _worldPacket << TriggerGUID;
1004 return &_worldPacket;
1009 _worldPacket >>
Data;
1010 _worldPacket >> Height;
1011 _worldPacket >> MountDisplayID;
1012 _worldPacket >> As<uint8>(Reason);
1017 _worldPacket >> MoverGUID;
1018 _worldPacket >> TimeSkipped;
1023 _worldPacket << MoverGUID;
1024 _worldPacket << TimeSkipped;
1026 return &_worldPacket;
1031 _worldPacket >> SummonerGUID;
1032 Accept = _worldPacket.ReadBit();
1037 _worldPacket << Guid;
1039 _worldPacket.FlushBits();
1041 return &_worldPacket;
1046 _worldPacket >> Status;
1047 _worldPacket >> SplineID;
1052 _worldPacket << SummonerGUID;
1053 _worldPacket <<
uint32(SummonerVirtualRealmAddress);
1054 _worldPacket <<
int32(AreaID);
1055 _worldPacket <<
uint8(Reason);
1056 _worldPacket.WriteBit(SkipStartingArea);
1057 _worldPacket.FlushBits();
1059 return &_worldPacket;
1064 _worldPacket <<
uint32(SequenceIndex);
1065 _worldPacket.WriteBits(Reason, 2);
1066 _worldPacket.FlushBits();
1068 return &_worldPacket;
1073 _worldPacket >> SequenceIndex;
1078 _worldPacket <<
uint32(SequenceIndex);
1079 _worldPacket.WriteBits(Reason, 2);
1080 _worldPacket.FlushBits();
1082 return &_worldPacket;
1104 if (stateChange.
Speed)
1105 data << float(*stateChange.
Speed);
1107 if (stateChange.
Range)
1109 data << float(stateChange.
Range->Min);
1110 data << float(stateChange.
Range->Max);
1115 data << float(stateChange.
KnockBack->HorzSpeed);
1116 data << stateChange.
KnockBack->Direction;
1117 data << float(stateChange.
KnockBack->InitVertSpeed);
1147 _worldPacket << MoverGUID;
1148 _worldPacket <<
uint32(StateChanges.size());
1150 _worldPacket << stateChange;
1152 return &_worldPacket;
1157 _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
OptionalInitWriter< T > OptionalInit(Optional< T > const &value)
ByteBuffer & operator<<(ByteBuffer &data, Movement::MonsterSplineFilterKey const &monsterSplineFilterKey)
TaggedPosition< Position::XYZ > Origin
TaggedPosition< Position::XYZ > Direction
Optional< Inertia > inertia
Optional< Drive > driveStatus
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< KnockBackInfo > KnockBack
Optional< uint32 > MovementInertiaLifetimeMs
Optional< StateChangeRangeInfo > Range
Optional< int32 > DriveCapabilityRecID
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