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