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