TrinityCore
Loading...
Searching...
No Matches
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 "PacketOperators.h"
23#include "UnitDefines.h"
24#include "Util.h"
25
27{
28 bool hasPrevTime = transportInfo.prevTime != 0;
29 bool hasVehicleId = transportInfo.vehicleId != 0;
30
31 data << transportInfo.guid; // Transport Guid
32 data << transportInfo.pos.GetPositionX();
33 data << transportInfo.pos.GetPositionY();
34 data << transportInfo.pos.GetPositionZ();
35 data << transportInfo.pos.GetOrientation();
36 data << transportInfo.seat; // VehicleSeatIndex
37 data << transportInfo.time; // MoveTime
38
39 data << WorldPackets::Bits<1>(hasPrevTime);
40 data << WorldPackets::Bits<1>(hasVehicleId);
41
42 data.FlushBits();
43
44 if (hasPrevTime)
45 data << transportInfo.prevTime; // PrevMoveTime
46
47 if (hasVehicleId)
48 data << transportInfo.vehicleId; // VehicleRecID
49
50 return data;
51}
52
54{
55 data >> transportInfo.guid; // Transport Guid
56 data >> transportInfo.pos.PositionXYZOStream();
57 data >> transportInfo.seat; // VehicleSeatIndex
58 data >> transportInfo.time; // MoveTime
59
60 bool hasPrevTime = data.ReadBit();
61 bool hasVehicleId = data.ReadBit();
62
63 if (hasPrevTime)
64 data >> transportInfo.prevTime; // PrevMoveTime
65
66 if (hasVehicleId)
67 data >> transportInfo.vehicleId; // VehicleRecID
68
69 return data;
70}
71
72ByteBuffer& operator<<(ByteBuffer& data, MovementInfo const& movementInfo)
73{
74 bool hasTransportData = !movementInfo.transport.guid.IsEmpty();
75 bool hasFallDirection = movementInfo.HasMovementFlag(MOVEMENTFLAG_FALLING | MOVEMENTFLAG_FALLING_FAR);
76 bool hasFallData = hasFallDirection || movementInfo.jump.fallTime != 0;
77
78 data << movementInfo.guid;
79 data << WorldPackets::As<uint64>(movementInfo.flags);
80 data << uint32(movementInfo.time);
81 data << movementInfo.pos.PositionXYZOStream();
82 data << float(movementInfo.pitch);
83 data << float(movementInfo.stepUpStartElevation);
84
85 uint32 removeMovementForcesCount = 0;
86 data << removeMovementForcesCount;
87
88 uint32 moveIndex = 0;
89 data << moveIndex;
90
91 data << float(movementInfo.gravityModifier);
92
93 /*for (uint32 i = 0; i < removeMovementForcesCount; ++i)
94 {
95 data << ObjectGuid;
96 }*/
97
99 data << WorldPackets::Bits<1>(hasTransportData);
100 data << WorldPackets::Bits<1>(hasFallData);
101 data << WorldPackets::Bits<1>(false); // HasSpline
102 data << WorldPackets::Bits<1>(false); // HeightChangeFailed
103 data << WorldPackets::Bits<1>(false); // RemoteTimeValid
104 data << WorldPackets::OptionalInit(movementInfo.inertia);
105 data << WorldPackets::OptionalInit(movementInfo.advFlying);
106 data << WorldPackets::OptionalInit(movementInfo.driveStatus);
107
108 data.FlushBits();
109
110 if (movementInfo.standingOnGameObjectGUID)
111 data << *movementInfo.standingOnGameObjectGUID;
112
113 if (hasTransportData)
114 data << movementInfo.transport;
115
116 if (hasFallData)
117 {
118 data << uint32(movementInfo.jump.fallTime);
119 data << float(movementInfo.jump.zspeed);
120
121 data << WorldPackets::Bits<1>(hasFallDirection);
122 data.FlushBits();
123 if (hasFallDirection)
124 {
125 data << float(movementInfo.jump.sinAngle);
126 data << float(movementInfo.jump.cosAngle);
127 data << float(movementInfo.jump.xyspeed);
128 }
129 }
130
131 if (movementInfo.inertia)
132 {
133 data << uint32(movementInfo.inertia->id);
134 data << movementInfo.inertia->force.PositionXYZStream();
135 data << uint32(movementInfo.inertia->lifetime);
136 }
137
138 if (movementInfo.advFlying)
139 {
140 data << float(movementInfo.advFlying->forwardVelocity);
141 data << float(movementInfo.advFlying->upVelocity);
142 }
143
144 if (movementInfo.driveStatus)
145 {
146 data << float(movementInfo.driveStatus->speed);
147 data << float(movementInfo.driveStatus->movementAngle);
148 data << WorldPackets::Bits<1>(movementInfo.driveStatus->accelerating);
149 data << WorldPackets::Bits<1>(movementInfo.driveStatus->drifting);
150 data.FlushBits();
151 }
152
153 return data;
154}
155
157{
158 data >> movementInfo.guid;
159 data >> WorldPackets::As<uint64>(movementInfo.flags);
160 data >> movementInfo.time;
161 data >> movementInfo.pos.PositionXYZOStream();
162 data >> movementInfo.pitch;
163 data >> movementInfo.stepUpStartElevation;
164
165 uint32 removeMovementForcesCount;
166 data >> removeMovementForcesCount;
167
168 uint32 moveIndex;
169 data >> moveIndex;
170
171 data >> movementInfo.gravityModifier;
172
173 for (uint32 i = 0; i < removeMovementForcesCount; ++i)
174 data >> WorldPackets::Ignored<ObjectGuid>;
175
177 bool hasTransport = data.ReadBit();
178 bool hasFall = data.ReadBit();
179 /*hasSpline = */data.ReadBit(); // todo 6.x read this infos
180 data.ReadBit(); // HeightChangeFailed
181 data.ReadBit(); // RemoteTimeValid
182 data >> WorldPackets::OptionalInit(movementInfo.inertia);
183 data >> WorldPackets::OptionalInit(movementInfo.advFlying);
184 data >> WorldPackets::OptionalInit(movementInfo.driveStatus);
185
186 if (movementInfo.standingOnGameObjectGUID)
187 data >> *movementInfo.standingOnGameObjectGUID;
188
189 if (hasTransport)
190 data >> movementInfo.transport;
191
192 if (hasFall)
193 {
194 data >> movementInfo.jump.fallTime;
195 data >> movementInfo.jump.zspeed;
196
197 // ResetBitReader
198
199 bool hasFallDirection = data.ReadBit();
200 if (hasFallDirection)
201 {
202 data >> movementInfo.jump.sinAngle;
203 data >> movementInfo.jump.cosAngle;
204 data >> movementInfo.jump.xyspeed;
205 }
206 }
207
208 if (movementInfo.inertia)
209 {
210 data >> movementInfo.inertia->id;
211 data >> movementInfo.inertia->force.PositionXYZStream();
212 data >> movementInfo.inertia->lifetime;
213 }
214
215 if (movementInfo.advFlying)
216 {
217 data >> movementInfo.advFlying->forwardVelocity;
218 data >> movementInfo.advFlying->upVelocity;
219 }
220
221 if (movementInfo.driveStatus)
222 {
223 data.ResetBitPos();
224
225 data >> movementInfo.driveStatus->speed;
226 data >> movementInfo.driveStatus->movementAngle;
227 movementInfo.driveStatus->accelerating = data.ReadBit();
228 movementInfo.driveStatus->drifting = data.ReadBit();
229 }
230
231 return data;
232}
233
234ByteBuffer& operator<<(ByteBuffer& data, MovementForce const& movementForce)
235{
237 return data;
238}
239
241{
246
247ByteBuffer& operator<<(ByteBuffer& data, MonsterSplineFilterKey const& monsterSplineFilterKey)
248{
249 data << int16(monsterSplineFilterKey.Idx);
250 data << uint16(monsterSplineFilterKey.Speed);
251
252 return data;
253}
254
255ByteBuffer& operator<<(ByteBuffer& data, MonsterSplineFilter const& monsterSplineFilter)
256{
257 data << Size<uint32>(monsterSplineFilter.FilterKeys);
258 data << float(monsterSplineFilter.BaseSpeed);
259 data << int16(monsterSplineFilter.StartOffset);
260 data << float(monsterSplineFilter.DistToPrevFilterKey);
261 data << int16(monsterSplineFilter.AddedToStart);
262 for (MonsterSplineFilterKey const& filterKey : monsterSplineFilter.FilterKeys)
263 data << filterKey;
264
265 data << Bits<2>(monsterSplineFilter.FilterFlags);
266 data.FlushBits();
267
268 return data;
269}
270
272{
273 data << spellEffectExtraData.TargetGUID;
274 data << uint32(spellEffectExtraData.SpellVisualID);
275 data << uint32(spellEffectExtraData.ProgressCurveID);
276 data << uint32(spellEffectExtraData.ParabolicCurveID);
277 data << float(spellEffectExtraData.JumpGravity);
278
279 return data;
280}
281
283{
284 data << float(jumpExtraData.JumpGravity);
285 data << uint32(jumpExtraData.StartTime);
286 data << uint32(jumpExtraData.Duration);
287
288 return data;
289}
290
292{
293 data << float(turnData.StartFacing);
294 data << float(turnData.TotalTurnRads);
295 data << float(turnData.RadsPerSec);
296
297 return data;
298}
299
301{
302 data << int32(animTierTransition.TierTransitionID);
303 data << uint8(animTierTransition.AnimTier);
304 data << uint32(animTierTransition.StartTime);
305 data << uint32(animTierTransition.ExtraDuration);
306
307 return data;
308}
309
311{
312 for (MonsterSplineSpellVisualNodeInfo const& nodeInfo : unk.NodeInfo)
313 {
314 data << int32(nodeInfo.SpellID);
315 data << nodeInfo.Visual;
316 data << uint32(nodeInfo.StartNodeIndex);
317 }
318
319 return data;
320}
321
322ByteBuffer& operator<<(ByteBuffer& data, MovementSpline const& movementSpline)
323{
324 data << uint32(movementSpline.Flags);
325 data << uint8(movementSpline.Face);
326 data << int32(movementSpline.Elapsed);
327 data << uint32(movementSpline.MoveTime);
328 data << uint32(movementSpline.FadeObjectTime);
329 data << uint8(movementSpline.Mode);
330 data << movementSpline.TransportGUID;
331 data << int8(movementSpline.VehicleSeat);
332
333 switch (movementSpline.Face)
334 {
335 case ::Movement::MONSTER_MOVE_FACING_SPOT:
336 data << movementSpline.FaceSpot;
337 break;
338 case ::Movement::MONSTER_MOVE_FACING_TARGET:
339 data << float(movementSpline.FaceDirection);
340 data << movementSpline.FaceGUID;
341 break;
342 case ::Movement::MONSTER_MOVE_FACING_ANGLE:
343 data << float(movementSpline.FaceDirection);
344 break;
345 }
346
347 data << BitsSize<16>(movementSpline.Points);
348 data << Bits<1>(movementSpline.VehicleExitVoluntary);
349 data << Bits<1>(movementSpline.TaxiSmoothing);
350 data << BitsSize<16>(movementSpline.PackedDeltas);
351 data << OptionalInit(movementSpline.SplineFilter);
352 data << OptionalInit(movementSpline.SpellEffectExtraData);
353 data << OptionalInit(movementSpline.JumpExtraData);
354 data << OptionalInit(movementSpline.TurnData);
355 data << OptionalInit(movementSpline.AnimTierTransition);
356 data << OptionalInit(movementSpline.SpellVisualData);
357 data.FlushBits();
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.SplineFilter)
366 data << *movementSpline.SplineFilter;
367
368 if (movementSpline.SpellEffectExtraData)
369 data << *movementSpline.SpellEffectExtraData;
370
371 if (movementSpline.JumpExtraData)
372 data << *movementSpline.JumpExtraData;
373
374 if (movementSpline.TurnData)
375 data << *movementSpline.TurnData;
376
377 if (movementSpline.AnimTierTransition)
378 data << *movementSpline.AnimTierTransition;
379
380 if (movementSpline.SpellVisualData)
381 data << *movementSpline.SpellVisualData;
382
383 return data;
384}
385
386ByteBuffer& operator<<(ByteBuffer& data, MovementMonsterSpline const& movementMonsterSpline)
387{
388 data << movementMonsterSpline.ID;
389 data << movementMonsterSpline.Move;
390 data << Bits<1>(movementMonsterSpline.CrzTeleport);
391 data << Bits<1>(movementMonsterSpline.StopUseFaceDirection);
392 data << Bits<3>(movementMonsterSpline.StopSplineStyle);
393 data.FlushBits();
394
395 return data;
396}
397
399{
400 data << uint32(moveSpline.GetId()); // ID
401
402 G3D::Vector3 dest;
403 if (!moveSpline.isCyclic()) // Destination
404 dest = moveSpline.FinalDestination();
405 else
406 {
407 ::Movement::MoveSpline::MySpline const& spline = moveSpline._Spline();
408 if (spline.getPointCount() <= 1)
409 dest = G3D::Vector3::zero();
410 else
411 dest = spline.getPoint(spline.last() - 1);
412 }
413
414 data << dest.x << dest.y << dest.z;
415
416 bool hasSplineMove = !moveSpline.Finalized() && !moveSpline.splineIsFacingOnly;
417 data << Bits<1>(hasSplineMove);
418 data.FlushBits();
419
420 if (hasSplineMove) // MovementSplineMove
421 {
422 data << uint32(moveSpline.splineflags.Raw.AsUnderlyingType()); // SplineFlags
423 data << uint8(moveSpline.facing.type); // Face
424 data << int32(moveSpline.timePassed()); // Elapsed
425 data << uint32(moveSpline.Duration()); // Duration
426 data << float(1.0f); // DurationModifier
427 data << float(1.0f); // NextDurationModifier
428
429 switch (moveSpline.facing.type)
430 {
431 case ::Movement::MONSTER_MOVE_FACING_SPOT:
432 {
433 // FaceSpot
434 data << float(moveSpline.facing.f.x);
435 data << float(moveSpline.facing.f.y);
436 data << float(moveSpline.facing.f.z);
437 break;
438 }
439 case ::Movement::MONSTER_MOVE_FACING_TARGET:
440 data << moveSpline.facing.target; // FaceGUID
441 break;
442 case ::Movement::MONSTER_MOVE_FACING_ANGLE:
443 data << moveSpline.facing.angle; // FaceDirection
444 break;
445 default:
446 break;
447 }
448
449 bool hasFadeObjectTime = moveSpline.splineflags.FadeObject && moveSpline.effect_start_time < moveSpline.Duration();
450 data << Bits<1>(hasFadeObjectTime);
451 data << BitsSize<16>(moveSpline.getPath());
452 data << Bits<1>(false); // HasSplineFilter
453 data << OptionalInit(moveSpline.spell_effect_extra); // HasSpellEffectExtraData
454 bool hasJumpExtraData = moveSpline.splineflags.Parabolic && (!moveSpline.spell_effect_extra || moveSpline.effect_start_time);
455 data << Bits<1>(hasJumpExtraData);
456 data << OptionalInit(moveSpline.turn); // HasTurnData
457 data << OptionalInit(moveSpline.anim_tier); // HasAnimTierTransition
458 data << Bits<1>(false); // HasSpellVisualData
459 data.FlushBits();
460
461 if (hasFadeObjectTime)
462 data << uint32(moveSpline.effect_start_time); // FadeObjectTime
463
464 data.append(reinterpret_cast<float const*>(moveSpline.getPath().data()), moveSpline.getPath().size() * 3);
465
466 //if (HasSplineFilterKey)
467 //{
468 // data << uint32(FilterKeysCount);
469 // for (var i = 0; i < FilterKeysCount; ++i)
470 // {
471 // data << float(In);
472 // data << float(Out);
473 // }
474
475 // data << Bits<2>(FilterFlags);
476 // data.FlushBits();
477 //}
478
479 if (moveSpline.spell_effect_extra)
480 {
481 data << moveSpline.spell_effect_extra->Target;
482 data << uint32(moveSpline.spell_effect_extra->SpellVisualId);
483 data << uint32(moveSpline.spell_effect_extra->ProgressCurveId);
484 data << uint32(moveSpline.spell_effect_extra->ParabolicCurveId);
485 data << float(moveSpline.vertical_acceleration);
486 }
487
488 if (hasJumpExtraData)
489 {
490 data << float(moveSpline.vertical_acceleration);
491 data << uint32(moveSpline.effect_start_time);
492 data << uint32(0); // Duration (override)
493 }
494
495 if (moveSpline.turn)
496 {
497 data << float(moveSpline.turn->StartFacing);
498 data << float(moveSpline.turn->TotalTurnRads);
499 data << float(moveSpline.turn->RadsPerSec);
500 }
501
502 if (moveSpline.anim_tier)
503 {
504 data << int32(moveSpline.anim_tier->TierTransitionId);
505 data << uint8(moveSpline.anim_tier->AnimTier);
506 data << uint32(moveSpline.effect_start_time);
507 data << uint32(0);
508 }
509
510 //if (HasSpellVisualData)
511 //{
512 // for (WorldPackets::Movement::MonsterSplineSpellVisualNodeInfo const& nodeInfo : SpellVisualData.NodeInfo)
513 // {
514 // data << int32(nodeInfo.SpellID);
515 // data << nodeInfo.Visual;
516 // data << uint32(nodeInfo.StartNodeIndex);
517 // }
518 //}
519 }
520}
521
522void CommonMovement::WriteMovementForceWithDirection(MovementForce const& movementForce, ByteBuffer& data, Position const* objectPosition /*= nullptr*/)
523{
524 data << movementForce.ID;
525 data << movementForce.Origin;
526 if (movementForce.Type == MovementForceType::Gravity && objectPosition)
527 {
529 if (movementForce.Magnitude != 0.0f)
530 {
531 Position tmp(movementForce.Origin.Pos.GetPositionX() - objectPosition->GetPositionX(),
532 movementForce.Origin.Pos.GetPositionY() - objectPosition->GetPositionY(),
533 movementForce.Origin.Pos.GetPositionZ() - objectPosition->GetPositionZ());
534 float lengthSquared = tmp.GetExactDistSq(0.0f, 0.0f, 0.0f);
535 if (lengthSquared > 0.0f)
536 {
537 float mult = 1.0f / std::sqrt(lengthSquared) * movementForce.Magnitude;
538 tmp.m_positionX *= mult;
539 tmp.m_positionY *= mult;
540 tmp.m_positionZ *= mult;
541 float minLengthSquared = (tmp.GetPositionX() * tmp.GetPositionX() * 0.04f) +
542 (tmp.GetPositionY() * tmp.GetPositionY() * 0.04f) +
543 (tmp.GetPositionZ() * tmp.GetPositionZ() * 0.04f);
544 if (lengthSquared > minLengthSquared)
545 direction = tmp;
546 }
547 }
548
549 data << direction;
550 }
551 else
552 data << movementForce.Direction;
553
554 data << uint32(movementForce.TransportID);
555 data << float(movementForce.Magnitude);
556 data << int32(movementForce.MovementForceID);
557 data << int32(movementForce.DurationMs);
558 data << uint32(movementForce.EndTimestamp);
559 data << uint32(movementForce.Flags);
560 data << Bits<2>(movementForce.Type);
561 data.FlushBits();
562}
563
565{
566 SplineData.ID = moveSpline.m_Id;
567 MovementSpline& movementSpline = SplineData.Move;
568
569 ::Movement::MoveSplineFlag splineFlags = moveSpline.splineflags;
571 movementSpline.Face = moveSpline.facing.type;
572 movementSpline.FaceDirection = moveSpline.facing.angle;
573 movementSpline.FaceGUID = moveSpline.facing.target;
574 movementSpline.FaceSpot = Position(moveSpline.facing.f.x, moveSpline.facing.f.y, moveSpline.facing.f.z);
575
576 if (moveSpline.anim_tier)
577 {
578 movementSpline.AnimTierTransition.emplace();
579 movementSpline.AnimTierTransition->TierTransitionID = moveSpline.anim_tier->TierTransitionId;
580 movementSpline.AnimTierTransition->StartTime = moveSpline.effect_start_time;
581 movementSpline.AnimTierTransition->AnimTier = AsUnderlyingType(moveSpline.anim_tier->AnimTier);
582 }
583
584 movementSpline.MoveTime = moveSpline.Duration();
585
586 if (splineFlags.Parabolic && (!moveSpline.spell_effect_extra || moveSpline.effect_start_time))
587 {
588 movementSpline.JumpExtraData.emplace();
589 movementSpline.JumpExtraData->JumpGravity = moveSpline.vertical_acceleration;
590 movementSpline.JumpExtraData->StartTime = moveSpline.effect_start_time;
591 }
592
593 if (moveSpline.turn)
594 {
595 MonsterSplineTurnData& turn = movementSpline.TurnData.emplace();
596 turn.StartFacing = moveSpline.turn->StartFacing;
597 turn.TotalTurnRads = moveSpline.turn->TotalTurnRads;
598 turn.RadsPerSec = moveSpline.turn->RadsPerSec;
599 }
600
601 if (splineFlags.FadeObject)
602 movementSpline.FadeObjectTime = moveSpline.effect_start_time;
603
604 if (moveSpline.spell_effect_extra)
605 {
606 movementSpline.SpellEffectExtraData.emplace();
607 movementSpline.SpellEffectExtraData->TargetGUID = moveSpline.spell_effect_extra->Target;
608 movementSpline.SpellEffectExtraData->SpellVisualID = moveSpline.spell_effect_extra->SpellVisualId;
609 movementSpline.SpellEffectExtraData->ProgressCurveID = moveSpline.spell_effect_extra->ProgressCurveId;
610 movementSpline.SpellEffectExtraData->ParabolicCurveID = moveSpline.spell_effect_extra->ParabolicCurveId;
611 movementSpline.SpellEffectExtraData->JumpGravity = moveSpline.vertical_acceleration;
612 }
613
614 ::Movement::Spline<int32> const& spline = moveSpline.spline;
615 std::vector<G3D::Vector3> const& array = spline.getPoints();
616
617 if (splineFlags.UncompressedPath)
618 {
619 uint32 count = spline.getPointCount() - (splineFlags.Cyclic ? 4 : 3);
620 for (uint32 i = 0; i < count; ++i)
621 movementSpline.Points.emplace_back(array[i + 2].x, array[i + 2].y, array[i + 2].z);
622 }
623 else
624 {
625 uint32 lastIdx = spline.getPointCount() - (splineFlags.Cyclic ? 4 : 3);
626 G3D::Vector3 const* realPath = &array[1];
627
628 movementSpline.Points.emplace_back(realPath[lastIdx].x, realPath[lastIdx].y, realPath[lastIdx].z);
629
630 if (lastIdx > 1)
631 {
632 G3D::Vector3 middle = (realPath[0] + realPath[lastIdx]) / 2.f;
633
634 // first and last points already appended
635 for (uint32 i = 1; i < lastIdx; ++i)
636 {
637 G3D::Vector3 delta = middle - realPath[i];
638 movementSpline.PackedDeltas.emplace_back(delta.x, delta.y, delta.z);
639 }
640 }
641 }
642}
643
645{
648 _worldPacket << Pos;
649
650 return &_worldPacket;
651}
652
654{
656 _worldPacket << float(SplineDist);
657
658 return &_worldPacket;
659}
660
668
677
679{
682
683 return &_worldPacket;
684}
685
694
704
706{
708
709 return &_worldPacket;
710}
711
719
721{
723
724 return &_worldPacket;
725}
726
750
752{
756 _worldPacket << Bits<6>(TransfertAbort);
758
759 return &_worldPacket;
760}
761
762ByteBuffer& operator<<(ByteBuffer& data, TeleportLocation const& teleportLocation)
763{
764 data << teleportLocation.Pos;
765 data << int32(teleportLocation.FloorDifficulty);
766 data << int32(teleportLocation.FloorIndex);
767
768 return data;
769}
770
782
784{
787 _worldPacket << Pos;
788 _worldPacket << float(Facing);
789
792 _worldPacket << Bits<1>(PreloadWorld);
794
795 if (TransportGUID)
797
798 if (Vehicle)
799 {
800 _worldPacket << uint8(Vehicle->VehicleSeatIndex);
801 _worldPacket << Bits<1>(Vehicle->VehicleExitVoluntary);
802 _worldPacket << Bits<1>(Vehicle->VehicleExitTeleport);
804 }
805
806 return &_worldPacket;
807}
808
810{
811 data >> movementForce.ID;
812 data >> movementForce.Origin;
813 data >> movementForce.Direction;
814 data >> movementForce.TransportID;
815 data >> movementForce.Magnitude;
816 data >> movementForce.MovementForceID;
817 data >> movementForce.DurationMs;
818 data >> movementForce.EndTimestamp;
819 data >> movementForce.Flags;
820 data >> Bits<2>(movementForce.Type);
821
822 return data;
823}
824
874
881
883{
884 data >> ack.Status;
885 data >> ack.AckIndex;
886
887 return data;
888}
889
894
900
907
912
914{
916
917 return &_worldPacket;
918}
919
921{
922 data << float(speeds.HorzSpeed);
923 data << float(speeds.VertSpeed);
924
925 return data;
926}
927
929{
930 data >> speeds.HorzSpeed;
931 data >> speeds.VertSpeed;
932
933 return data;
934}
935
945
947{
949
950 return &_worldPacket;
951}
952
960
973
975{
977 _worldPacket << float(Height);
978 _worldPacket << float(Scale);
979
980 return &_worldPacket;
981}
982
991
997
1006
1012
1014{
1015 _worldPacket << *Status;
1016 _worldPacket << *Force;
1017
1018 return &_worldPacket;
1019}
1020
1028
1036
1042
1044{
1047
1048 return &_worldPacket;
1049}
1050
1052{
1054 _worldPacket >> Bits<1>(Accept);
1055}
1056
1058{
1059 _worldPacket << Guid;
1060 _worldPacket << Bits<1>(On);
1062
1063 return &_worldPacket;
1064}
1065
1067{
1070}
1071
1073{
1078 _worldPacket << Bits<1>(SkipStartingArea);
1080
1081 return &_worldPacket;
1082}
1083
1085{
1087 _worldPacket << Bits<2>(Reason);
1089
1090 return &_worldPacket;
1091}
1092
1097
1099{
1101 _worldPacket << Bits<2>(Reason);
1103
1104 return &_worldPacket;
1105}
1106
1107ByteBuffer& operator<<(ByteBuffer& data, CollisionHeightInfo const& collisionHeightInfo)
1108{
1109 data << float(collisionHeightInfo.Height);
1110 data << float(collisionHeightInfo.Scale);
1111 data << uint8(collisionHeightInfo.Reason);
1112
1113 return data;
1114}
1115
1116ByteBuffer& operator<<(ByteBuffer& data, StateChangeRangeInfo const& stateChangeRangeInfo)
1117{
1118 data << float(stateChangeRangeInfo.Min);
1119 data << float(stateChangeRangeInfo.Max);
1120
1121 return data;
1122}
1123
1124ByteBuffer& operator<<(ByteBuffer& data, KnockBackInfo const& knockBackInfo)
1125{
1126 data << float(knockBackInfo.HorzSpeed);
1127 data << knockBackInfo.Direction;
1128 data << float(knockBackInfo.InitVertSpeed);
1129
1130 return data;
1131}
1132
1134{
1135 data << uint32(stateChange.MessageID);
1136 data << uint32(stateChange.SequenceIndex);
1137 data << OptionalInit(stateChange.Speed);
1138 data << OptionalInit(stateChange.Range);
1139 data << OptionalInit(stateChange.KnockBack);
1140 data << OptionalInit(stateChange.VehicleRecID);
1141 data << OptionalInit(stateChange.CollisionHeight);
1142 data << OptionalInit(stateChange.MovementForce_);
1143 data << OptionalInit(stateChange.MovementForceGUID);
1144 data << OptionalInit(stateChange.MovementInertiaID);
1145 data << OptionalInit(stateChange.MovementInertiaLifetimeMs);
1146 data << OptionalInit(stateChange.DriveCapabilityRecID);
1147 data.FlushBits();
1148
1149 if (stateChange.Speed)
1150 data << float(*stateChange.Speed);
1151
1152 if (stateChange.Range)
1153 data << *stateChange.Range;
1154
1155 if (stateChange.KnockBack)
1156 data << *stateChange.KnockBack;
1157
1158 if (stateChange.VehicleRecID)
1159 data << int32(*stateChange.VehicleRecID);
1160
1161 if (stateChange.CollisionHeight)
1162 data << *stateChange.CollisionHeight;
1163
1164 if (stateChange.MovementForce_)
1165 data << *stateChange.MovementForce_;
1166
1167 if (stateChange.MovementForceGUID)
1168 data << *stateChange.MovementForceGUID;
1169
1170 if (stateChange.MovementInertiaID)
1171 data << int32(*stateChange.MovementInertiaID);
1172
1173 if (stateChange.MovementInertiaLifetimeMs)
1174 data << uint32(*stateChange.MovementInertiaLifetimeMs);
1175
1176 if (stateChange.DriveCapabilityRecID)
1177 data << int32(*stateChange.DriveCapabilityRecID);
1178
1179 return data;
1180}
1181
1183{
1185 _worldPacket << Size<uint32>(StateChanges);
1186 for (MoveStateChange const& stateChange : StateChanges)
1187 _worldPacket << stateChange;
1188
1189 return &_worldPacket;
1190}
1191
1196
1206
1215
1222
1228
1237
1239{
1240 _worldPacket << *Status;
1242
1243 return &_worldPacket;
1244}
1245
1251
1260
1262{
1263 _worldPacket << *Status;
1264 _worldPacket << float(GravityModifier);
1265
1266 return &_worldPacket;
1267}
1268}
uint8_t uint8
Definition Define.h:156
int16_t int16
Definition Define.h:151
int8_t int8
Definition Define.h:152
int32_t int32
Definition Define.h:150
uint64_t uint64
Definition Define.h:153
uint16_t uint16
Definition Define.h:155
uint32_t uint32
Definition Define.h:154
@ MOVEMENTFLAG_FALLING
@ MOVEMENTFLAG_FALLING_FAR
ByteBuffer & operator<<(ByteBuffer &data, MovementInfo::TransportInfo const &transportInfo)
ByteBuffer & operator>>(ByteBuffer &data, MovementInfo::TransportInfo &transportInfo)
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
Definition Util.h:565
void append(T value)
Definition ByteBuffer.h:131
void ResetBitPos()
Definition ByteBuffer.h:153
void FlushBits()
Definition ByteBuffer.h:142
bool ReadBit()
Definition ByteBuffer.h:175
constexpr std::underlying_type_t< T > AsUnderlyingType() const
Definition EnumFlag.h:122
bool isCyclic() const
Definition MoveSpline.h:140
Optional< TurnData > turn
Definition MoveSpline.h:87
uint32 GetId() const
Definition MoveSpline.h:138
bool Finalized() const
Definition MoveSpline.h:139
MySpline::ControlArray const & getPath() const
Definition MoveSpline.h:93
int32 timePassed() const
Definition MoveSpline.h:105
Optional< AnimTierTransition > anim_tier
Definition MoveSpline.h:88
MySpline const & _Spline() const
Definition MoveSpline.h:107
Vector3 const & FinalDestination() const
Definition MoveSpline.h:143
int32 Duration() const
Definition MoveSpline.h:106
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:362
static void WriteCreateObjectSplineDataBlock(::Movement::MoveSpline const &moveSpline, 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
TaggedPosition< Position::XYZ > Pos
void InitializeSplineData(::Movement::MoveSpline const &moveSpline)
Duration< Milliseconds, uint32 > LifetimeMs
Duration< Milliseconds, uint32 > LifetimeMs
Optional< MoveKnockBackSpeeds > Speeds
TaggedPosition< Position::XY > Direction
WorldPacket const * Write() override
std::vector< MoveStateChange > StateChanges
uint32 SequenceIndex
Unit movement packet index, incremented each time.
WorldPacket const * Write() override
uint32 SequenceIndex
Unit movement packet index, incremented each time.
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
TaggedPosition< Position::XYZ > Pos
Duration< Milliseconds, uint32 > LifetimeMs
WorldPacket const * Write() override
std::span< MovementForce const > MovementForces
WorldPacket const * Write() override
TaggedPosition< Position::XYZ > MovementOffset
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
TaggedPosition< Position::XYZ > OldMapPosition
Optional< ShipTransferPending > Ship
WorldPacket const * Write() override
WorldPacket _worldPacket
Definition Packet.h:43
ByteBuffer & operator<<(ByteBuffer &data, MonsterSplineFilterKey const &monsterSplineFilterKey)
ByteBuffer & operator>>(ByteBuffer &data, MovementForce &movementForce)
OptionalInitWriter< T > OptionalInit(Optional< T > const &value)
MovementForceType Type
TaggedPosition< Position::XYZ > Origin
uint32 EndTimestamp
ObjectGuid ID
int32 MovementForceID
TaggedPosition< Position::XYZ > Direction
bool HasMovementFlag(MovementFlags flag) const
ObjectGuid guid
Optional< Inertia > inertia
Optional< Drive > driveStatus
float gravityModifier
Optional< ObjectGuid > standingOnGameObjectGUID
struct MovementInfo::JumpInfo jump
float stepUpStartElevation
struct MovementInfo::TransportInfo transport
MovementFlags flags
Optional< AdvFlying > advFlying
struct Movement::FacingInfo::@311 f
Streamer< XYZO > PositionXYZOStream()
Definition Position.h:101
constexpr float GetPositionX() const
Definition Position.h:87
float m_positionZ
Definition Position.h:66
constexpr float GetPositionY() const
Definition Position.h:88
float m_positionX
Definition Position.h:64
float m_positionY
Definition Position.h:65
constexpr float GetExactDistSq(float x, float y, float z) const
Definition Position.h:121
constexpr float GetOrientation() const
Definition Position.h:90
constexpr float GetPositionZ() const
Definition Position.h:89
Position Pos
Definition Position.h:254
TaggedPosition< Position::XY > Direction
uint32 ExtraDuration
Duration of the transition (unit does not move during this time)
std::array< MonsterSplineSpellVisualNodeInfo, 16 > NodeInfo
std::vector< MonsterSplineFilterKey > FilterKeys
Optional< StateChangeRangeInfo > Range
Optional< CollisionHeightInfo > CollisionHeight
Optional< MovementForce > MovementForce_
std::vector< TaggedPosition< Position::XYZ > > Points
Optional< MonsterSplineTurnData > TurnData
Optional< MonsterSplineClientSpellVisualData > SpellVisualData
Optional< MonsterSplineSpellEffectExtraData > SpellEffectExtraData
Optional< MonsterSplineJumpExtraData > JumpExtraData
std::vector< TaggedPosition< Position::PackedXYZ > > PackedDeltas
Optional< MonsterSplineAnimTierTransition > AnimTierTransition
Optional< MonsterSplineFilter > SplineFilter
TaggedPosition< Position::XYZ > FaceSpot
TaggedPosition< Position::XYZO > Pos
EnumFlag< MoveSplineFlagEnum > Raw