TrinityCore
MovementPackets.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "MovementPackets.h"
19#include "MoveSpline.h"
20#include "MoveSplineFlag.h"
21#include "MovementTypedefs.h"
22#include "Unit.h"
23#include "Util.h"
24
25ByteBuffer& operator<<(ByteBuffer& data, MovementInfo const& movementInfo)
26{
27 bool hasTransportData = !movementInfo.transport.guid.IsEmpty();
28 bool hasFallDirection = movementInfo.HasMovementFlag(MOVEMENTFLAG_FALLING | MOVEMENTFLAG_FALLING_FAR);
29 bool hasFallData = hasFallDirection || movementInfo.jump.fallTime != 0;
30 bool hasSpline = false; // todo 6.x send this infos
31 bool hasInertia = movementInfo.inertia.has_value();
32 bool hasAdvFlying = movementInfo.advFlying.has_value();
33 bool hasStandingOnGameObjectGUID = movementInfo.standingOnGameObjectGUID.has_value();
34
35 data << movementInfo.guid;
36 data << uint32(movementInfo.flags);
37 data << uint32(movementInfo.flags2);
38 data << uint32(movementInfo.flags3);
39 data << uint32(movementInfo.time);
40 data << movementInfo.pos.PositionXYZOStream();
41 data << float(movementInfo.pitch);
42 data << float(movementInfo.stepUpStartElevation);
43
44 uint32 removeMovementForcesCount = 0;
45 data << removeMovementForcesCount;
46
47 uint32 moveIndex = 0;
48 data << moveIndex;
49
50 /*for (uint32 i = 0; i < removeMovementForcesCount; ++i)
51 {
52 data << ObjectGuid;
53 }*/
54
55 data.WriteBit(hasStandingOnGameObjectGUID);
56 data.WriteBit(hasTransportData);
57 data.WriteBit(hasFallData);
58 data.WriteBit(hasSpline);
59
60 data.WriteBit(false); // HeightChangeFailed
61 data.WriteBit(false); // RemoteTimeValid
62 data.WriteBit(hasInertia);
63 data.WriteBit(hasAdvFlying);
64
65 data.FlushBits();
66
67 if (hasTransportData)
68 data << movementInfo.transport;
69
70 if (hasStandingOnGameObjectGUID)
71 data << *movementInfo.standingOnGameObjectGUID;
72
73 if (hasInertia)
74 {
75 data << uint32(movementInfo.inertia->id);
76 data << movementInfo.inertia->force.PositionXYZStream();
77 data << uint32(movementInfo.inertia->lifetime);
78 }
79
80 if (hasAdvFlying)
81 {
82 data << float(movementInfo.advFlying->forwardVelocity);
83 data << float(movementInfo.advFlying->upVelocity);
84 }
85
86 if (hasFallData)
87 {
88 data << uint32(movementInfo.jump.fallTime);
89 data << float(movementInfo.jump.zspeed);
90
91 data.WriteBit(hasFallDirection);
92 data.FlushBits();
93 if (hasFallDirection)
94 {
95 data << float(movementInfo.jump.sinAngle);
96 data << float(movementInfo.jump.cosAngle);
97 data << float(movementInfo.jump.xyspeed);
98 }
99 }
100
101 return data;
102}
103
105{
106 //bool hasSpline = false;
107
108 data >> movementInfo.guid;
109 data >> movementInfo.flags;
110 data >> movementInfo.flags2;
111 data >> movementInfo.flags3;
112 data >> movementInfo.time;
113 data >> movementInfo.pos.PositionXYZOStream();
114 data >> movementInfo.pitch;
115 data >> movementInfo.stepUpStartElevation;
116
117 uint32 removeMovementForcesCount;
118 data >> removeMovementForcesCount;
119
120 uint32 moveIndex;
121 data >> moveIndex;
122
123 for (uint32 i = 0; i < removeMovementForcesCount; ++i)
124 {
125 ObjectGuid guid;
126 data >> guid;
127 }
128
129 bool hasStandingOnGameObjectGUID = data.ReadBit();
130 bool hasTransport = data.ReadBit();
131 bool hasFall = data.ReadBit();
132 /*hasSpline = */data.ReadBit(); // todo 6.x read this infos
133
134 data.ReadBit(); // HeightChangeFailed
135 data.ReadBit(); // RemoteTimeValid
136 bool hasInertia = data.ReadBit();
137 bool hasAdvFlying = data.ReadBit();
138
139 if (hasTransport)
140 data >> movementInfo.transport;
141
142 if (hasStandingOnGameObjectGUID)
143 data >> movementInfo.standingOnGameObjectGUID.emplace();
144
145 if (hasInertia)
146 {
147 movementInfo.inertia.emplace();
148
149 data >> movementInfo.inertia->id;
150 data >> movementInfo.inertia->force.PositionXYZStream();
151 data >> movementInfo.inertia->lifetime;
152 }
153
154 if (hasAdvFlying)
155 {
156 movementInfo.advFlying.emplace();
157
158 data >> movementInfo.advFlying->forwardVelocity;
159 data >> movementInfo.advFlying->upVelocity;
160 }
161
162 if (hasFall)
163 {
164 data >> movementInfo.jump.fallTime;
165 data >> movementInfo.jump.zspeed;
166
167 // ResetBitReader
168
169 bool hasFallDirection = data.ReadBit();
170 if (hasFallDirection)
171 {
172 data >> movementInfo.jump.sinAngle;
173 data >> movementInfo.jump.cosAngle;
174 data >> movementInfo.jump.xyspeed;
175 }
176 }
177
178 return data;
179}
180
182{
183 data >> transportInfo.guid; // Transport Guid
184 data >> transportInfo.pos.PositionXYZOStream();
185 data >> transportInfo.seat; // VehicleSeatIndex
186 data >> transportInfo.time; // MoveTime
187
188 bool hasPrevTime = data.ReadBit();
189 bool hasVehicleId = data.ReadBit();
190
191 if (hasPrevTime)
192 data >> transportInfo.prevTime; // PrevMoveTime
193
194 if (hasVehicleId)
195 data >> transportInfo.vehicleId; // VehicleRecID
196
197 return data;
198}
199
201{
202 bool hasPrevTime = transportInfo.prevTime != 0;
203 bool hasVehicleId = transportInfo.vehicleId != 0;
204
205 data << transportInfo.guid; // Transport Guid
206 data << transportInfo.pos.GetPositionX();
207 data << transportInfo.pos.GetPositionY();
208 data << transportInfo.pos.GetPositionZ();
209 data << transportInfo.pos.GetOrientation();
210 data << transportInfo.seat; // VehicleSeatIndex
211 data << transportInfo.time; // MoveTime
212
213 data.WriteBit(hasPrevTime);
214 data.WriteBit(hasVehicleId);
215
216 data.FlushBits();
217
218 if (hasPrevTime)
219 data << transportInfo.prevTime; // PrevMoveTime
220
221 if (hasVehicleId)
222 data << transportInfo.vehicleId; // VehicleRecID
223
224 return data;
225}
226
228{
230}
231
233{
234 data << int16(monsterSplineFilterKey.Idx);
235 data << uint16(monsterSplineFilterKey.Speed);
236
237 return data;
238}
239
241{
242 data << uint32(monsterSplineFilter.FilterKeys.size());
243 data << float(monsterSplineFilter.BaseSpeed);
244 data << int16(monsterSplineFilter.StartOffset);
245 data << float(monsterSplineFilter.DistToPrevFilterKey);
246 data << int16(monsterSplineFilter.AddedToStart);
247 for (WorldPackets::Movement::MonsterSplineFilterKey const& filterKey : monsterSplineFilter.FilterKeys)
248 data << filterKey;
249 data.WriteBits(monsterSplineFilter.FilterFlags, 2);
250 data.FlushBits();
251
252 return data;
253}
254
256{
257 data << spellEffectExtraData.TargetGUID;
258 data << uint32(spellEffectExtraData.SpellVisualID);
259 data << uint32(spellEffectExtraData.ProgressCurveID);
260 data << uint32(spellEffectExtraData.ParabolicCurveID);
261 data << float(spellEffectExtraData.JumpGravity);
262
263 return data;
264}
265
267{
268 data << float(jumpExtraData.JumpGravity);
269 data << uint32(jumpExtraData.StartTime);
270 data << uint32(jumpExtraData.Duration);
271
272 return data;
273}
274
276{
277 data << int32(animTierTransition.TierTransitionID);
278 data << uint32(animTierTransition.StartTime);
279 data << uint32(animTierTransition.EndTime);
280 data << uint8(animTierTransition.AnimTier);
281
282 return data;
283}
284
286{
288 {
289 data << int32(unkInner.Unknown_1);
290 data << unkInner.Visual;
291 data << uint32(unkInner.Unknown_4);
292 }
293
294 return data;
295}
296
298{
299 data << uint32(movementSpline.Flags);
300 data << int32(movementSpline.Elapsed);
301 data << uint32(movementSpline.MoveTime);
302 data << uint32(movementSpline.FadeObjectTime);
303 data << uint8(movementSpline.Mode);
304 data << movementSpline.TransportGUID;
305 data << int8(movementSpline.VehicleSeat);
306 data.WriteBits(movementSpline.Face, 2);
307 data.WriteBits(movementSpline.Points.size(), 16);
308 data.WriteBit(movementSpline.VehicleExitVoluntary);
309 data.WriteBit(movementSpline.Interpolate);
310 data.WriteBits(movementSpline.PackedDeltas.size(), 16);
311 data.WriteBit(movementSpline.SplineFilter.has_value());
312 data.WriteBit(movementSpline.SpellEffectExtraData.has_value());
313 data.WriteBit(movementSpline.JumpExtraData.has_value());
314 data.WriteBit(movementSpline.AnimTierTransition.has_value());
315 data.WriteBit(movementSpline.Unknown901.has_value());
316 data.FlushBits();
317
318 if (movementSpline.SplineFilter)
319 data << *movementSpline.SplineFilter;
320
321 switch (movementSpline.Face)
322 {
324 data << movementSpline.FaceSpot;
325 break;
327 data << float(movementSpline.FaceDirection);
328 data << movementSpline.FaceGUID;
329 break;
331 data << float(movementSpline.FaceDirection);
332 break;
333 }
334
335 for (TaggedPosition<Position::XYZ> const& pos : movementSpline.Points)
336 data << pos;
337
338 for (TaggedPosition<Position::PackedXYZ> const& pos : movementSpline.PackedDeltas)
339 data << pos;
340
341 if (movementSpline.SpellEffectExtraData)
342 data << *movementSpline.SpellEffectExtraData;
343
344 if (movementSpline.JumpExtraData)
345 data << *movementSpline.JumpExtraData;
346
347 if (movementSpline.AnimTierTransition)
348 data << *movementSpline.AnimTierTransition;
349
350 if (movementSpline.Unknown901)
351 data << *movementSpline.Unknown901;
352
353 return data;
354}
355
357{
358 data << movementMonsterSpline.ID;
359 data.WriteBit(movementMonsterSpline.CrzTeleport);
360 data.WriteBits(movementMonsterSpline.StopDistanceTolerance, 3);
361
362 data << movementMonsterSpline.Move;
363
364 return data;
365}
366
368{
369 data << uint32(moveSpline.GetId()); // ID
370
371 G3D::Vector3 dest;
372 if (!moveSpline.isCyclic()) // Destination
373 dest = moveSpline.FinalDestination();
374 else
375 dest = G3D::Vector3::zero();
376
377 data << dest.x << dest.y << dest.z;
378
379 bool hasSplineMove = data.WriteBit(!moveSpline.Finalized() && !moveSpline.splineIsFacingOnly);
380 data.FlushBits();
381
382 if (hasSplineMove) // MovementSplineMove
383 {
384 data << uint32(moveSpline.splineflags.raw()); // SplineFlags
385 data << int32(moveSpline.timePassed()); // Elapsed
386 data << uint32(moveSpline.Duration()); // Duration
387 data << float(1.0f); // DurationModifier
388 data << float(1.0f); // NextDurationModifier
389 data.WriteBits(moveSpline.facing.type, 2); // Face
390 bool hasFadeObjectTime = data.WriteBit(moveSpline.splineflags.fadeObject && moveSpline.effect_start_time < moveSpline.Duration());
391 data.WriteBits(moveSpline.getPath().size(), 16);
392 data.WriteBit(false); // HasSplineFilter
393 data.WriteBit(moveSpline.spell_effect_extra.has_value()); // HasSpellEffectExtraData
394 bool hasJumpExtraData = data.WriteBit(moveSpline.splineflags.parabolic && (!moveSpline.spell_effect_extra || moveSpline.effect_start_time));
395 data.WriteBit(moveSpline.anim_tier.has_value()); // HasAnimTierTransition
396 data.WriteBit(false); // HasUnknown901
397 data.FlushBits();
398
399 //if (HasSplineFilterKey)
400 //{
401 // data << uint32(FilterKeysCount);
402 // for (var i = 0; i < FilterKeysCount; ++i)
403 // {
404 // data << float(In);
405 // data << float(Out);
406 // }
407
408 // data.WriteBits(FilterFlags, 2);
409 // data.FlushBits();
410 //}
411
412 switch (moveSpline.facing.type)
413 {
415 {
416 // FaceSpot
417 data << float(moveSpline.facing.f.x);
418 data << float(moveSpline.facing.f.y);
419 data << float(moveSpline.facing.f.z);
420 break;
421 }
423 data << moveSpline.facing.target; // FaceGUID
424 break;
426 data << moveSpline.facing.angle; // FaceDirection
427 break;
428 default:
429 break;
430 }
431
432 if (hasFadeObjectTime)
433 data << uint32(moveSpline.effect_start_time); // FadeObjectTime
434
435 data.append(moveSpline.getPath().data(), moveSpline.getPath().size());
436
437 if (moveSpline.spell_effect_extra)
438 {
439 data << moveSpline.spell_effect_extra->Target;
440 data << uint32(moveSpline.spell_effect_extra->SpellVisualId);
441 data << uint32(moveSpline.spell_effect_extra->ProgressCurveId);
442 data << uint32(moveSpline.spell_effect_extra->ParabolicCurveId);
443 data << float(moveSpline.vertical_acceleration);
444 }
445
446 if (hasJumpExtraData)
447 {
448 data << float(moveSpline.vertical_acceleration);
449 data << uint32(moveSpline.effect_start_time);
450 data << uint32(0); // Duration (override)
451 }
452
453 if (moveSpline.anim_tier)
454 {
455 data << int32(moveSpline.anim_tier->TierTransitionId);
456 data << uint32(moveSpline.effect_start_time);
457 data << uint32(0);
458 data << uint8(moveSpline.anim_tier->AnimTier);
459 }
460
461 //if (HasUnknown901)
462 //{
463 // for (WorldPackets::Movement::MonsterSplineUnknown901::Inner const& unkInner : unk.Data) size = 16
464 // {
465 // data << int32(unkInner.Unknown_1);
466 // data << int32(unkInner.Unknown_2);
467 // data << int32(unkInner.Unknown_3);
468 // data << uint32(unkInner.Unknown_4);
469 // }
470 //}
471 }
472}
473
475{
476 data.WriteBits(spline.getPoints().size(), 16);
477 data.append<G3D::Vector3>(spline.getPoints().data(), spline.getPoints().size());
478}
479
480void WorldPackets::Movement::CommonMovement::WriteMovementForceWithDirection(MovementForce const& movementForce, ByteBuffer& data, Position const* objectPosition /*= nullptr*/)
481{
482 data << movementForce.ID;
483 data << movementForce.Origin;
484 if (movementForce.Type == MovementForceType::Gravity && objectPosition)
485 {
487 if (movementForce.Magnitude != 0.0f)
488 {
489 Position tmp(movementForce.Origin.Pos.GetPositionX() - objectPosition->GetPositionX(),
490 movementForce.Origin.Pos.GetPositionY() - objectPosition->GetPositionY(),
491 movementForce.Origin.Pos.GetPositionZ() - objectPosition->GetPositionZ());
492 float lengthSquared = tmp.GetExactDistSq(0.0f, 0.0f, 0.0f);
493 if (lengthSquared > 0.0f)
494 {
495 float mult = 1.0f / std::sqrt(lengthSquared) * movementForce.Magnitude;
496 tmp.m_positionX *= mult;
497 tmp.m_positionY *= mult;
498 tmp.m_positionZ *= mult;
499 float minLengthSquared = (tmp.GetPositionX() * tmp.GetPositionX() * 0.04f) +
500 (tmp.GetPositionY() * tmp.GetPositionY() * 0.04f) +
501 (tmp.GetPositionZ() * tmp.GetPositionZ() * 0.04f);
502 if (lengthSquared > minLengthSquared)
503 direction = tmp;
504 }
505 }
506
507 data << direction;
508 }
509 else
510 data << movementForce.Direction;
511
512 data << uint32(movementForce.TransportID);
513 data << float(movementForce.Magnitude);
514 data << int32(movementForce.Unused910);
515 data.WriteBits(AsUnderlyingType(movementForce.Type), 2);
516 data.FlushBits();
517}
518
520{
521 SplineData.ID = moveSpline.m_Id;
522 WorldPackets::Movement::MovementSpline& movementSpline = SplineData.Move;
523
524 ::Movement::MoveSplineFlag splineFlags = moveSpline.splineflags;
525 splineFlags.enter_cycle = moveSpline.isCyclic();
527 movementSpline.Face = moveSpline.facing.type;
528 movementSpline.FaceDirection = moveSpline.facing.angle;
529 movementSpline.FaceGUID = moveSpline.facing.target;
530 movementSpline.FaceSpot = Position(moveSpline.facing.f.x, moveSpline.facing.f.y, moveSpline.facing.f.z);
531
532 if (splineFlags.animation)
533 {
534 movementSpline.AnimTierTransition.emplace();
535 movementSpline.AnimTierTransition->TierTransitionID = moveSpline.anim_tier->TierTransitionId;
536 movementSpline.AnimTierTransition->StartTime = moveSpline.effect_start_time;
537 movementSpline.AnimTierTransition->AnimTier = AsUnderlyingType(moveSpline.anim_tier->AnimTier);
538 }
539
540 movementSpline.MoveTime = moveSpline.Duration();
541
542 if (splineFlags.parabolic && (!moveSpline.spell_effect_extra || moveSpline.effect_start_time))
543 {
544 movementSpline.JumpExtraData.emplace();
545 movementSpline.JumpExtraData->JumpGravity = moveSpline.vertical_acceleration;
546 movementSpline.JumpExtraData->StartTime = moveSpline.effect_start_time;
547 }
548
549 if (splineFlags.fadeObject)
550 movementSpline.FadeObjectTime = moveSpline.effect_start_time;
551
552 if (moveSpline.spell_effect_extra)
553 {
554 movementSpline.SpellEffectExtraData.emplace();
555 movementSpline.SpellEffectExtraData->TargetGUID = moveSpline.spell_effect_extra->Target;
556 movementSpline.SpellEffectExtraData->SpellVisualID = moveSpline.spell_effect_extra->SpellVisualId;
557 movementSpline.SpellEffectExtraData->ProgressCurveID = moveSpline.spell_effect_extra->ProgressCurveId;
558 movementSpline.SpellEffectExtraData->ParabolicCurveID = moveSpline.spell_effect_extra->ParabolicCurveId;
559 movementSpline.SpellEffectExtraData->JumpGravity = moveSpline.vertical_acceleration;
560 }
561
562 ::Movement::Spline<int32> const& spline = moveSpline.spline;
563 std::vector<G3D::Vector3> const& array = spline.getPoints();
564
566 {
567 if (!splineFlags.cyclic)
568 {
569 uint32 count = spline.getPointCount() - 3;
570 for (uint32 i = 0; i < count; ++i)
571 movementSpline.Points.emplace_back(array[i + 2].x, array[i + 2].y, array[i + 2].z);
572 }
573 else
574 {
575 uint32 count = spline.getPointCount() - 3;
576 movementSpline.Points.emplace_back(array[1].x, array[1].y, array[1].z);
577 for (uint32 i = 0; i < count; ++i)
578 movementSpline.Points.emplace_back(array[i + 1].x, array[i + 1].y, array[i + 1].z);
579 }
580 }
581 else
582 {
583 uint32 lastIdx = spline.getPointCount() - 3;
584 G3D::Vector3 const* realPath = &spline.getPoint(1);
585
586 movementSpline.Points.emplace_back(realPath[lastIdx].x, realPath[lastIdx].y, realPath[lastIdx].z);
587
588 if (lastIdx > 1)
589 {
590 G3D::Vector3 middle = (realPath[0] + realPath[lastIdx]) / 2.f;
591
592 // first and last points already appended
593 for (uint32 i = 1; i < lastIdx; ++i)
594 {
595 G3D::Vector3 delta = middle - realPath[i];
596 movementSpline.PackedDeltas.emplace_back(delta.x, delta.y, delta.z);
597 }
598 }
599 }
600}
601
603{
604 _worldPacket << MoverGUID;
605 _worldPacket << Pos;
606 _worldPacket << SplineData;
607 return &_worldPacket;
608}
609
611{
612 _worldPacket << Guid;
613 _worldPacket << float(SplineDist);
614
615 return &_worldPacket;
616}
617
619{
620 _worldPacket << MoverGUID;
621 _worldPacket << Speed;
622 return &_worldPacket;
623}
624
626{
627 _worldPacket << MoverGUID;
628 _worldPacket << SequenceIndex;
629 _worldPacket << Speed;
630 return &_worldPacket;
631}
632
634{
635 _worldPacket << *Status;
636 _worldPacket << Speed;
637 return &_worldPacket;
638}
639
641{
642 _worldPacket << MoverGUID;
643 return &_worldPacket;
644}
645
647{
648 _worldPacket << MoverGUID;
649 _worldPacket << SequenceIndex;
650 return &_worldPacket;
651}
652
654{
655 _worldPacket << *Status;
656
657 return &_worldPacket;
658}
659
661{
662 _worldPacket << int32(MapID);
663 _worldPacket << OldMapPosition;
664 _worldPacket.WriteBit(Ship.has_value());
665 _worldPacket.WriteBit(TransferSpellID.has_value());
666 if (Ship)
667 {
668 _worldPacket << uint32(Ship->ID);
669 _worldPacket << int32(Ship->OriginMapID);
670 }
671
672 if (TransferSpellID)
673 _worldPacket << int32(*TransferSpellID);
674
675 _worldPacket.FlushBits();
676
677 return &_worldPacket;
678}
679
681{
682 _worldPacket << uint32(MapID);
683 _worldPacket << uint8(Arg);
684 _worldPacket << int32(MapDifficultyXConditionID);
685 _worldPacket.WriteBits(TransfertAbort, 6);
686 _worldPacket.FlushBits();
687 return &_worldPacket;
688}
689
691{
692 data << teleportLocation.Pos;
693 data << int32(teleportLocation.Unused901_1);
694 data << int32(teleportLocation.Unused901_2);
695
696 return data;
697}
698
700{
701 _worldPacket << int32(MapID);
702 _worldPacket << Loc;
703 _worldPacket << uint32(Reason);
704 _worldPacket << MovementOffset;
705 return &_worldPacket;
706}
707
709{
710 _worldPacket << MoverGUID;
711 _worldPacket << uint32(SequenceIndex);
712 _worldPacket << Pos;
713 _worldPacket << float(Facing);
714 _worldPacket << uint8(PreloadWorld);
715
716 _worldPacket.WriteBit(TransportGUID.has_value());
717 _worldPacket.WriteBit(Vehicle.has_value());
718 _worldPacket.FlushBits();
719
720 if (Vehicle)
721 {
722 _worldPacket << uint8(Vehicle->VehicleSeatIndex);
723 _worldPacket.WriteBit(Vehicle->VehicleExitVoluntary);
724 _worldPacket.WriteBit(Vehicle->VehicleExitTeleport);
725 _worldPacket.FlushBits();
726 }
727
728 if (TransportGUID)
729 _worldPacket << *TransportGUID;
730
731 return &_worldPacket;
732}
733
734ByteBuffer& operator<<(ByteBuffer& data, MovementForce const& movementForce)
735{
737 return data;
738}
739
741{
742 data >> movementForce.ID;
743 data >> movementForce.Origin;
744 data >> movementForce.Direction;
745 data >> movementForce.TransportID;
746 data >> movementForce.Magnitude;
747 data >> movementForce.Unused910;
748 movementForce.Type = MovementForceType(data.ReadBits(2));
749
750 return data;
751}
752
754{
755 _worldPacket << *Status;
756
757 _worldPacket << uint32(MovementForces ? MovementForces->size() : 0);
758 _worldPacket.WriteBit(WalkSpeed.has_value());
759 _worldPacket.WriteBit(RunSpeed.has_value());
760 _worldPacket.WriteBit(RunBackSpeed.has_value());
761 _worldPacket.WriteBit(SwimSpeed.has_value());
762 _worldPacket.WriteBit(SwimBackSpeed.has_value());
763 _worldPacket.WriteBit(FlightSpeed.has_value());
764 _worldPacket.WriteBit(FlightBackSpeed.has_value());
765 _worldPacket.WriteBit(TurnRate.has_value());
766 _worldPacket.WriteBit(PitchRate.has_value());
767 _worldPacket.FlushBits();
768
769 if (MovementForces)
770 for (MovementForce const& force : *MovementForces)
771 _worldPacket << force;
772
773 if (WalkSpeed)
774 _worldPacket << *WalkSpeed;
775
776 if (RunSpeed)
777 _worldPacket << *RunSpeed;
778
779 if (RunBackSpeed)
780 _worldPacket << *RunBackSpeed;
781
782 if (SwimSpeed)
783 _worldPacket << *SwimSpeed;
784
785 if (SwimBackSpeed)
786 _worldPacket << *SwimBackSpeed;
787
788 if (FlightSpeed)
789 _worldPacket << *FlightSpeed;
790
791 if (FlightBackSpeed)
792 _worldPacket << *FlightBackSpeed;
793
794 if (TurnRate)
795 _worldPacket << *TurnRate;
796
797 if (PitchRate)
798 _worldPacket << *PitchRate;
799
800 return &_worldPacket;
801}
802
804{
805 _worldPacket >> MoverGUID;
806 _worldPacket >> AckIndex;
807 _worldPacket >> MoveTime;
808}
809
811{
812 data >> ack.Status;
813 data >> ack.AckIndex;
814 return data;
815}
816
818{
819 _worldPacket >> Ack;
820}
821
823{
824 _worldPacket >> Ack;
825 _worldPacket >> Speed;
826}
827
829{
830 _worldPacket >> ActiveMover;
831}
832
834{
835 _worldPacket << MoverGUID;
836
837 return &_worldPacket;
838}
839
841{
842 data << float(speeds.HorzSpeed);
843 data << float(speeds.VertSpeed);
844
845 return data;
846}
847
849{
850 data >> speeds.HorzSpeed;
851 data >> speeds.VertSpeed;
852
853 return data;
854}
855
857{
858 _worldPacket << MoverGUID;
859 _worldPacket << uint32(SequenceIndex);
860 _worldPacket << Direction;
861 _worldPacket << Speeds;
862
863 return &_worldPacket;
864}
865
867{
868 _worldPacket << *Status;
869
870 return &_worldPacket;
871}
872
874{
875 _worldPacket >> Ack;
876 bool hasSpeeds = _worldPacket.ReadBit();
877 if (hasSpeeds)
878 {
879 Speeds.emplace();
880 _worldPacket >> *Speeds;
881 }
882}
883
885{
886 _worldPacket << MoverGUID;
887 _worldPacket << uint32(SequenceIndex);
888 _worldPacket << float(Height);
889 _worldPacket << float(Scale);
890 _worldPacket << uint8(Reason);
891 _worldPacket << uint32(MountDisplayID);
892 _worldPacket << int32(ScaleDuration);
893 _worldPacket.FlushBits();
894
895 return &_worldPacket;
896}
897
899{
900 _worldPacket << *Status;
901 _worldPacket << float(Height);
902 _worldPacket << float(Scale);
903
904 return &_worldPacket;
905}
906
908{
909 _worldPacket << MoverGUID;
910 _worldPacket << SequenceIndex;
911 _worldPacket << *Force;
912
913 return &_worldPacket;
914}
915
917{
918 _worldPacket >> Ack;
919 _worldPacket >> Force;
920}
921
923{
924 _worldPacket << MoverGUID;
925 _worldPacket << SequenceIndex;
926 _worldPacket << ID;
927
928 return &_worldPacket;
929}
930
932{
933 _worldPacket >> Ack;
934 _worldPacket >> ID;
935}
936
938{
939 _worldPacket << *Status;
940 _worldPacket << *Force;
941
942 return &_worldPacket;
943}
944
946{
947 _worldPacket << *Status;
948 _worldPacket << TriggerGUID;
949
950 return &_worldPacket;
951}
952
954{
955 _worldPacket >> Data;
956 _worldPacket >> Height;
957 _worldPacket >> MountDisplayID;
958 Reason = _worldPacket.read<UpdateCollisionHeightReason, uint8>();
959}
960
962{
963 _worldPacket >> MoverGUID;
964 _worldPacket >> TimeSkipped;
965}
966
968{
969 _worldPacket << MoverGUID;
970 _worldPacket << TimeSkipped;
971
972 return &_worldPacket;
973}
974
976{
977 _worldPacket >> SummonerGUID;
978 Accept = _worldPacket.ReadBit();
979}
980
982{
983 _worldPacket << Guid;
984 _worldPacket.WriteBit(On);
985 _worldPacket.FlushBits();
986
987 return &_worldPacket;
988}
989
991{
992 _worldPacket >> Status;
993 _worldPacket >> SplineID;
994}
995
997{
998 _worldPacket << SummonerGUID;
999 _worldPacket << uint32(SummonerVirtualRealmAddress);
1000 _worldPacket << int32(AreaID);
1001 _worldPacket << uint8(Reason);
1002 _worldPacket.WriteBit(SkipStartingArea);
1003 _worldPacket.FlushBits();
1004
1005 return &_worldPacket;
1006}
1007
1009{
1010 _worldPacket << uint32(SequenceIndex);
1011 _worldPacket.WriteBits(Reason, 2);
1012 _worldPacket.FlushBits();
1013
1014 return &_worldPacket;
1015}
1016
1018{
1019 _worldPacket >> SequenceIndex;
1020}
1021
1023{
1024 _worldPacket << uint32(SequenceIndex);
1025 _worldPacket.WriteBits(Reason, 2);
1026 _worldPacket.FlushBits();
1027
1028 return &_worldPacket;
1029}
1030
1032{
1033 data << uint16(stateChange.MessageID);
1034 data << uint32(stateChange.SequenceIndex);
1035 data.WriteBit(stateChange.Speed.has_value());
1036 data.WriteBit(stateChange.SpeedRange.has_value());
1037 data.WriteBit(stateChange.KnockBack.has_value());
1038 data.WriteBit(stateChange.VehicleRecID.has_value());
1039 data.WriteBit(stateChange.CollisionHeight.has_value());
1040 data.WriteBit(stateChange.MovementForce_.has_value());
1041 data.WriteBit(stateChange.MovementForceGUID.has_value());
1042 data.WriteBit(stateChange.MovementInertiaID.has_value());
1043 data.WriteBit(stateChange.MovementInertiaLifetimeMs.has_value());
1044 data.FlushBits();
1045
1046 if (stateChange.MovementForce_)
1047 data << *stateChange.MovementForce_;
1048
1049 if (stateChange.Speed)
1050 data << float(*stateChange.Speed);
1051
1052 if (stateChange.SpeedRange)
1053 {
1054 data << float(stateChange.SpeedRange->Min);
1055 data << float(stateChange.SpeedRange->Max);
1056 }
1057
1058 if (stateChange.KnockBack)
1059 {
1060 data << float(stateChange.KnockBack->HorzSpeed);
1061 data << stateChange.KnockBack->Direction;
1062 data << float(stateChange.KnockBack->InitVertSpeed);
1063 }
1064
1065 if (stateChange.VehicleRecID)
1066 data << int32(*stateChange.VehicleRecID);
1067
1068 if (stateChange.CollisionHeight)
1069 {
1070 data << float(stateChange.CollisionHeight->Height);
1071 data << float(stateChange.CollisionHeight->Scale);
1072 data << uint8(stateChange.CollisionHeight->Reason);
1073 }
1074
1075 if (stateChange.MovementForceGUID)
1076 data << *stateChange.MovementForceGUID;
1077
1078 if (stateChange.MovementInertiaID)
1079 data << int32(*stateChange.MovementInertiaID);
1080
1081 if (stateChange.MovementInertiaLifetimeMs)
1082 data << uint32(*stateChange.MovementInertiaLifetimeMs);
1083
1084 return data;
1085}
1086
1088{
1089 _worldPacket << MoverGUID;
1090 _worldPacket << uint32(StateChanges.size());
1091 for (MoveStateChange const& stateChange : StateChanges)
1092 _worldPacket << stateChange;
1093
1094 return &_worldPacket;
1095}
1096
1098{
1099 _worldPacket >> Ticks;
1100}
uint8_t uint8
Definition: Define.h:144
int16_t int16
Definition: Define.h:139
int8_t int8
Definition: Define.h:140
int32_t int32
Definition: Define.h:138
uint16_t uint16
Definition: Define.h:143
uint32_t uint32
Definition: Define.h:142
MovementForceType
Definition: MovementInfo.h:143
ByteBuffer & operator<<(ByteBuffer &data, MovementInfo const &movementInfo)
ByteBuffer & operator>>(ByteBuffer &data, MovementInfo &movementInfo)
Direction
Definition: PacketLog.h:25
@ MOVEMENTFLAG_FALLING
Definition: UnitDefines.h:369
@ MOVEMENTFLAG_FALLING_FAR
Definition: UnitDefines.h:370
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
Definition: Util.h:491
uint32 ReadBits(int32 bits)
Definition: ByteBuffer.h:209
void append(T value)
Definition: ByteBuffer.h:143
bool WriteBit(bool bit)
Definition: ByteBuffer.h:175
void WriteBits(std::size_t value, int32 bits)
Definition: ByteBuffer.h:203
void FlushBits()
Definition: ByteBuffer.h:155
bool ReadBit()
Definition: ByteBuffer.h:191
bool isCyclic() const
Definition: MoveSpline.h:138
uint32 GetId() const
Definition: MoveSpline.h:136
bool Finalized() const
Definition: MoveSpline.h:137
MySpline::ControlArray const & getPath() const
Definition: MoveSpline.h:92
int32 timePassed() const
Definition: MoveSpline.h:103
Optional< AnimTierTransition > anim_tier
Definition: MoveSpline.h:87
float vertical_acceleration
Definition: MoveSpline.h:80
Vector3 const & FinalDestination() const
Definition: MoveSpline.h:140
int32 Duration() const
Definition: MoveSpline.h:104
FacingInfo facing
Definition: MoveSpline.h:70
MoveSplineFlag splineflags
Definition: MoveSpline.h:74
Optional< SpellEffectExtraData > spell_effect_extra
Definition: MoveSpline.h:86
ControlArray const & getPoints() const
Definition: Spline.h:117
Vector3 const & getPoint(index_type i) const
Definition: Spline.h:119
index_type getPointCount() const
Definition: Spline.h:118
bool IsEmpty() const
Definition: ObjectGuid.h:319
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 _worldPacket
Definition: Packet.h:43
@ MONSTER_MOVE_FACING_TARGET
@ MONSTER_MOVE_FACING_ANGLE
@ MONSTER_MOVE_FACING_SPOT
ByteBuffer & operator<<(ByteBuffer &data, Movement::MonsterSplineFilterKey const &monsterSplineFilterKey)
MovementForceType Type
Definition: MovementInfo.h:155
uint32 TransportID
Definition: MovementInfo.h:153
TaggedPosition< Position::XYZ > Origin
Definition: MovementInfo.h:151
ObjectGuid ID
Definition: MovementInfo.h:150
TaggedPosition< Position::XYZ > Direction
Definition: MovementInfo.h:152
ObjectGuid guid
Definition: MovementInfo.h:30
Optional< Inertia > inertia
Definition: MovementInfo.h:70
uint32 flags3
Definition: MovementInfo.h:33
Optional< ObjectGuid > standingOnGameObjectGUID
Definition: MovementInfo.h:98
struct MovementInfo::JumpInfo jump
float stepUpStartElevation
Definition: MovementInfo.h:87
uint32 flags
Definition: MovementInfo.h:31
struct MovementInfo::TransportInfo transport
bool HasMovementFlag(uint32 flag) const
Definition: MovementInfo.h:112
uint32 flags2
Definition: MovementInfo.h:32
Position pos
Definition: MovementInfo.h:34
Optional< AdvFlying > advFlying
Definition: MovementInfo.h:96
struct Movement::FacingInfo::@323 f
Streamer< XYZO > PositionXYZOStream()
Definition: Position.h:90
constexpr float GetPositionX() const
Definition: Position.h:76
float m_positionZ
Definition: Position.h:55
constexpr float GetPositionY() const
Definition: Position.h:77
float m_positionX
Definition: Position.h:53
float m_positionY
Definition: Position.h:54
constexpr float GetExactDistSq(float x, float y, float z) const
Definition: Position.h:110
constexpr float GetOrientation() const
Definition: Position.h:79
constexpr float GetPositionZ() const
Definition: Position.h:78
Position Pos
Definition: Position.h:236
std::vector< MonsterSplineFilterKey > FilterKeys
Optional< MoveSetCompoundState::SpeedRange > SpeedRange
std::vector< TaggedPosition< Position::XYZ > > Points
Optional< MonsterSplineSpellEffectExtraData > SpellEffectExtraData
Optional< MonsterSplineJumpExtraData > JumpExtraData
std::vector< TaggedPosition< Position::PackedXYZ > > PackedDeltas
Optional< MonsterSplineAnimTierTransition > AnimTierTransition
Optional< MonsterSplineUnknown901 > Unknown901
Optional< MonsterSplineFilter > SplineFilter
TaggedPosition< Position::XYZ > FaceSpot
TaggedPosition< Position::XYZO > Pos