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 << uint32(movementInfo.flags);
80 data << uint32(movementInfo.flags2);
81 data << uint32(movementInfo.flags3);
82 data << uint32(movementInfo.time);
83 data << movementInfo.pos.PositionXYZOStream();
84 data << float(movementInfo.pitch);
85 data << float(movementInfo.stepUpStartElevation);
86
87 uint32 removeMovementForcesCount = 0;
88 data << removeMovementForcesCount;
89
90 uint32 moveIndex = 0;
91 data << moveIndex;
92
93 data << float(movementInfo.gravityModifier);
94
95 /*for (uint32 i = 0; i < removeMovementForcesCount; ++i)
96 {
97 data << ObjectGuid;
98 }*/
99
101 data << WorldPackets::Bits<1>(hasTransportData);
102 data << WorldPackets::Bits<1>(hasFallData);
103 data << WorldPackets::Bits<1>(false); // HasSpline
104 data << WorldPackets::Bits<1>(false); // HeightChangeFailed
105 data << WorldPackets::Bits<1>(false); // RemoteTimeValid
106 data << WorldPackets::OptionalInit(movementInfo.inertia);
107 data << WorldPackets::OptionalInit(movementInfo.advFlying);
108 data << WorldPackets::OptionalInit(movementInfo.driveStatus);
109
110 data.FlushBits();
111
112 if (hasTransportData)
113 data << movementInfo.transport;
114
115 if (movementInfo.standingOnGameObjectGUID)
116 data << *movementInfo.standingOnGameObjectGUID;
117
118 if (movementInfo.inertia)
119 {
120 data << uint32(movementInfo.inertia->id);
121 data << movementInfo.inertia->force.PositionXYZStream();
122 data << uint32(movementInfo.inertia->lifetime);
123 }
124
125 if (movementInfo.advFlying)
126 {
127 data << float(movementInfo.advFlying->forwardVelocity);
128 data << float(movementInfo.advFlying->upVelocity);
129 }
130
131 if (hasFallData)
132 {
133 data << uint32(movementInfo.jump.fallTime);
134 data << float(movementInfo.jump.zspeed);
135
136 data << WorldPackets::Bits<1>(hasFallDirection);
137 data.FlushBits();
138 if (hasFallDirection)
139 {
140 data << float(movementInfo.jump.sinAngle);
141 data << float(movementInfo.jump.cosAngle);
142 data << float(movementInfo.jump.xyspeed);
143 }
144 }
145
146 if (movementInfo.driveStatus)
147 {
148 data << float(movementInfo.driveStatus->speed);
149 data << float(movementInfo.driveStatus->movementAngle);
150 data << WorldPackets::Bits<1>(movementInfo.driveStatus->accelerating);
151 data << WorldPackets::Bits<1>(movementInfo.driveStatus->drifting);
152 data.FlushBits();
153 }
154
155 return data;
156}
157
159{
160 data >> movementInfo.guid;
161 data >> movementInfo.flags;
162 data >> movementInfo.flags2;
163 data >> movementInfo.flags3;
164 data >> movementInfo.time;
165 data >> movementInfo.pos.PositionXYZOStream();
166 data >> movementInfo.pitch;
167 data >> movementInfo.stepUpStartElevation;
168
169 uint32 removeMovementForcesCount;
170 data >> removeMovementForcesCount;
171
172 uint32 moveIndex;
173 data >> moveIndex;
174
175 data >> movementInfo.gravityModifier;
176
177 for (uint32 i = 0; i < removeMovementForcesCount; ++i)
178 {
179 ObjectGuid guid;
180 data >> guid;
181 }
182
184 bool hasTransport = data.ReadBit();
185 bool hasFall = data.ReadBit();
186 /*hasSpline = */data.ReadBit(); // todo 6.x read this infos
187 data.ReadBit(); // HeightChangeFailed
188 data.ReadBit(); // RemoteTimeValid
189 data >> WorldPackets::OptionalInit(movementInfo.inertia);
190 data >> WorldPackets::OptionalInit(movementInfo.advFlying);
191 data >> WorldPackets::OptionalInit(movementInfo.driveStatus);
192
193 if (hasTransport)
194 data >> movementInfo.transport;
195
196 if (movementInfo.standingOnGameObjectGUID)
197 data >> *movementInfo.standingOnGameObjectGUID;
198
199 if (movementInfo.inertia)
200 {
201 data >> movementInfo.inertia->id;
202 data >> movementInfo.inertia->force.PositionXYZStream();
203 data >> movementInfo.inertia->lifetime;
204 }
205
206 if (movementInfo.advFlying)
207 {
208 data >> movementInfo.advFlying->forwardVelocity;
209 data >> movementInfo.advFlying->upVelocity;
210 }
211
212 if (hasFall)
213 {
214 data >> movementInfo.jump.fallTime;
215 data >> movementInfo.jump.zspeed;
216
217 // ResetBitReader
218
219 bool hasFallDirection = data.ReadBit();
220 if (hasFallDirection)
221 {
222 data >> movementInfo.jump.sinAngle;
223 data >> movementInfo.jump.cosAngle;
224 data >> movementInfo.jump.xyspeed;
225 }
226 }
227
228 if (movementInfo.driveStatus)
229 {
230 data.ResetBitPos();
231
232 data >> movementInfo.driveStatus->speed;
233 data >> movementInfo.driveStatus->movementAngle;
234 movementInfo.driveStatus->accelerating = data.ReadBit();
235 movementInfo.driveStatus->drifting = data.ReadBit();
236 }
237
238 return data;
239}
240
241ByteBuffer& operator<<(ByteBuffer& data, MovementForce const& movementForce)
242{
244 return data;
245}
246
248{
253
254ByteBuffer& operator<<(ByteBuffer& data, MonsterSplineFilterKey const& monsterSplineFilterKey)
255{
256 data << int16(monsterSplineFilterKey.Idx);
257 data << uint16(monsterSplineFilterKey.Speed);
258
259 return data;
260}
261
262ByteBuffer& operator<<(ByteBuffer& data, MonsterSplineFilter const& monsterSplineFilter)
263{
264 data << Size<uint32>(monsterSplineFilter.FilterKeys);
265 data << float(monsterSplineFilter.BaseSpeed);
266 data << int16(monsterSplineFilter.StartOffset);
267 data << float(monsterSplineFilter.DistToPrevFilterKey);
268 data << int16(monsterSplineFilter.AddedToStart);
269 for (MonsterSplineFilterKey const& filterKey : monsterSplineFilter.FilterKeys)
270 data << filterKey;
271
272 data << Bits<2>(monsterSplineFilter.FilterFlags);
273 data.FlushBits();
274
275 return data;
276}
277
279{
280 data << spellEffectExtraData.TargetGUID;
281 data << uint32(spellEffectExtraData.SpellVisualID);
282 data << uint32(spellEffectExtraData.ProgressCurveID);
283 data << uint32(spellEffectExtraData.ParabolicCurveID);
284 data << float(spellEffectExtraData.JumpGravity);
285
286 return data;
287}
288
290{
291 data << float(jumpExtraData.JumpGravity);
292 data << uint32(jumpExtraData.StartTime);
293 data << uint32(jumpExtraData.Duration);
294
295 return data;
296}
297
299{
300 data << float(turnData.StartFacing);
301 data << float(turnData.TotalTurnRads);
302 data << float(turnData.RadsPerSec);
303
304 return data;
305}
306
308{
309 data << int32(animTierTransition.TierTransitionID);
310 data << uint8(animTierTransition.AnimTier);
311 data << uint32(animTierTransition.StartTime);
312 data << uint32(animTierTransition.ExtraDuration);
313
314 return data;
315}
316
318{
319 for (MonsterSplineSpellVisualNodeInfo const& nodeInfo : unk.NodeInfo)
320 {
321 data << int32(nodeInfo.SpellID);
322 data << nodeInfo.Visual;
323 data << uint32(nodeInfo.StartNodeIndex);
324 }
325
326 return data;
327}
328
329ByteBuffer& operator<<(ByteBuffer& data, MovementSpline const& movementSpline)
330{
331 data << uint32(movementSpline.Flags);
332 data << uint8(movementSpline.Face);
333 data << int32(movementSpline.Elapsed);
334 data << uint32(movementSpline.MoveTime);
335 data << uint32(movementSpline.FadeObjectTime);
336 data << uint8(movementSpline.Mode);
337 data << movementSpline.TransportGUID;
338 data << int8(movementSpline.VehicleSeat);
339
340 switch (movementSpline.Face)
341 {
342 case ::Movement::MONSTER_MOVE_FACING_SPOT:
343 data << movementSpline.FaceSpot;
344 break;
345 case ::Movement::MONSTER_MOVE_FACING_TARGET:
346 data << float(movementSpline.FaceDirection);
347 data << movementSpline.FaceGUID;
348 break;
349 case ::Movement::MONSTER_MOVE_FACING_ANGLE:
350 data << float(movementSpline.FaceDirection);
351 break;
352 }
353
354 data << BitsSize<16>(movementSpline.Points);
355 data << Bits<1>(movementSpline.VehicleExitVoluntary);
356 data << Bits<1>(movementSpline.TaxiSmoothing);
357 data << BitsSize<16>(movementSpline.PackedDeltas);
358 data << OptionalInit(movementSpline.SplineFilter);
359 data << OptionalInit(movementSpline.SpellEffectExtraData);
360 data << OptionalInit(movementSpline.JumpExtraData);
361 data << OptionalInit(movementSpline.TurnData);
362 data << OptionalInit(movementSpline.AnimTierTransition);
363 data << OptionalInit(movementSpline.SpellVisualData);
364 data.FlushBits();
365
366 if (movementSpline.SplineFilter)
367 data << *movementSpline.SplineFilter;
368
369 for (TaggedPosition<Position::XYZ> const& pos : movementSpline.Points)
370 data << pos;
371
372 for (TaggedPosition<Position::PackedXYZ> const& pos : movementSpline.PackedDeltas)
373 data << pos;
374
375 if (movementSpline.SpellEffectExtraData)
376 data << *movementSpline.SpellEffectExtraData;
377
378 if (movementSpline.JumpExtraData)
379 data << *movementSpline.JumpExtraData;
380
381 if (movementSpline.TurnData)
382 data << *movementSpline.TurnData;
383
384 if (movementSpline.AnimTierTransition)
385 data << *movementSpline.AnimTierTransition;
386
387 if (movementSpline.SpellVisualData)
388 data << *movementSpline.SpellVisualData;
389
390 return data;
391}
392
393ByteBuffer& operator<<(ByteBuffer& data, MovementMonsterSpline const& movementMonsterSpline)
394{
395 data << movementMonsterSpline.ID;
396 data << Bits<1>(movementMonsterSpline.CrzTeleport);
397 data << Bits<1>(movementMonsterSpline.StopUseFaceDirection);
398 data << Bits<3>(movementMonsterSpline.StopSplineStyle);
399
400 data << movementMonsterSpline.Move;
401
402 return data;
403}
404
406{
407 data << uint32(moveSpline.GetId()); // ID
408
409 G3D::Vector3 dest;
410 if (!moveSpline.isCyclic()) // Destination
411 dest = moveSpline.FinalDestination();
412 else
413 {
414 ::Movement::MoveSpline::MySpline const& spline = moveSpline._Spline();
415 if (spline.getPointCount() <= 1)
416 dest = G3D::Vector3::zero();
417 else
418 dest = spline.getPoint(spline.last() - 1);
419 }
420
421 data << dest.x << dest.y << dest.z;
422
423 bool hasSplineMove = !moveSpline.Finalized() && !moveSpline.splineIsFacingOnly;
424 data << Bits<1>(hasSplineMove);
425 data.FlushBits();
426
427 if (hasSplineMove) // MovementSplineMove
428 {
429 data << uint32(moveSpline.splineflags.Raw.AsUnderlyingType()); // SplineFlags
430 data << int32(moveSpline.timePassed()); // Elapsed
431 data << uint32(moveSpline.Duration()); // Duration
432 data << float(1.0f); // DurationModifier
433 data << float(1.0f); // NextDurationModifier
434 data << Bits<2>(moveSpline.facing.type); // Face
435 bool hasFadeObjectTime = moveSpline.splineflags.FadeObject && moveSpline.effect_start_time < moveSpline.Duration();
436 data << Bits<1>(hasFadeObjectTime);
437 data << BitsSize<16>(moveSpline.getPath());
438 data << Bits<1>(false); // HasSplineFilter
439 data << OptionalInit(moveSpline.spell_effect_extra); // HasSpellEffectExtraData
440 bool hasJumpExtraData = moveSpline.splineflags.Parabolic && (!moveSpline.spell_effect_extra || moveSpline.effect_start_time);
441 data << Bits<1>(hasJumpExtraData);
442 data << OptionalInit(moveSpline.turn); // HasTurnData
443 data << OptionalInit(moveSpline.anim_tier); // HasAnimTierTransition
444 data << Bits<1>(false); // HasSpellVisualData
445 data.FlushBits();
446
447 //if (HasSplineFilterKey)
448 //{
449 // data << uint32(FilterKeysCount);
450 // for (var i = 0; i < FilterKeysCount; ++i)
451 // {
452 // data << float(In);
453 // data << float(Out);
454 // }
455
456 // data << Bits<2>(FilterFlags);
457 // data.FlushBits();
458 //}
459
460 switch (moveSpline.facing.type)
461 {
462 case ::Movement::MONSTER_MOVE_FACING_SPOT:
463 {
464 // FaceSpot
465 data << float(moveSpline.facing.f.x);
466 data << float(moveSpline.facing.f.y);
467 data << float(moveSpline.facing.f.z);
468 break;
469 }
470 case ::Movement::MONSTER_MOVE_FACING_TARGET:
471 data << moveSpline.facing.target; // FaceGUID
472 break;
473 case ::Movement::MONSTER_MOVE_FACING_ANGLE:
474 data << moveSpline.facing.angle; // FaceDirection
475 break;
476 default:
477 break;
478 }
479
480 if (hasFadeObjectTime)
481 data << uint32(moveSpline.effect_start_time); // FadeObjectTime
482
483 data.append(reinterpret_cast<float const*>(moveSpline.getPath().data()), moveSpline.getPath().size() * 3);
484
485 if (moveSpline.spell_effect_extra)
486 {
487 data << moveSpline.spell_effect_extra->Target;
488 data << uint32(moveSpline.spell_effect_extra->SpellVisualId);
489 data << uint32(moveSpline.spell_effect_extra->ProgressCurveId);
490 data << uint32(moveSpline.spell_effect_extra->ParabolicCurveId);
491 data << float(moveSpline.vertical_acceleration);
492 }
493
494 if (hasJumpExtraData)
495 {
496 data << float(moveSpline.vertical_acceleration);
497 data << uint32(moveSpline.effect_start_time);
498 data << uint32(0); // Duration (override)
499 }
500
501 if (moveSpline.turn)
502 {
503 data << float(moveSpline.turn->StartFacing);
504 data << float(moveSpline.turn->TotalTurnRads);
505 data << float(moveSpline.turn->RadsPerSec);
506 }
507
508 if (moveSpline.anim_tier)
509 {
510 data << int32(moveSpline.anim_tier->TierTransitionId);
511 data << uint8(moveSpline.anim_tier->AnimTier);
512 data << uint32(moveSpline.effect_start_time);
513 data << uint32(0);
514 }
515
516 //if (HasSpellVisualData)
517 //{
518 // for (WorldPackets::Movement::MonsterSplineSpellVisualNodeInfo const& nodeInfo : SpellVisualData.NodeInfo)
519 // {
520 // data << int32(nodeInfo.SpellID);
521 // data << nodeInfo.Visual;
522 // data << uint32(nodeInfo.StartNodeIndex);
523 // }
524 //}
525 }
526}
527
528void CommonMovement::WriteMovementForceWithDirection(MovementForce const& movementForce, ByteBuffer& data, Position const* objectPosition /*= nullptr*/)
529{
530 data << movementForce.ID;
531 data << movementForce.Origin;
532 if (movementForce.Type == MovementForceType::Gravity && objectPosition)
533 {
535 if (movementForce.Magnitude != 0.0f)
536 {
537 Position tmp(movementForce.Origin.Pos.GetPositionX() - objectPosition->GetPositionX(),
538 movementForce.Origin.Pos.GetPositionY() - objectPosition->GetPositionY(),
539 movementForce.Origin.Pos.GetPositionZ() - objectPosition->GetPositionZ());
540 float lengthSquared = tmp.GetExactDistSq(0.0f, 0.0f, 0.0f);
541 if (lengthSquared > 0.0f)
542 {
543 float mult = 1.0f / std::sqrt(lengthSquared) * movementForce.Magnitude;
544 tmp.m_positionX *= mult;
545 tmp.m_positionY *= mult;
546 tmp.m_positionZ *= mult;
547 float minLengthSquared = (tmp.GetPositionX() * tmp.GetPositionX() * 0.04f) +
548 (tmp.GetPositionY() * tmp.GetPositionY() * 0.04f) +
549 (tmp.GetPositionZ() * tmp.GetPositionZ() * 0.04f);
550 if (lengthSquared > minLengthSquared)
551 direction = tmp;
552 }
553 }
554
555 data << direction;
556 }
557 else
558 data << movementForce.Direction;
559
560 data << uint32(movementForce.TransportID);
561 data << float(movementForce.Magnitude);
562 data << int32(movementForce.MovementForceID);
563 data << int32(movementForce.DurationMs);
564 data << uint32(movementForce.EndTimestamp);
565 data << uint32(movementForce.Flags);
566 data << Bits<2>(movementForce.Type);
567 data.FlushBits();
568}
569
571{
572 SplineData.ID = moveSpline.m_Id;
573 MovementSpline& movementSpline = SplineData.Move;
574
575 ::Movement::MoveSplineFlag splineFlags = moveSpline.splineflags;
577 movementSpline.Face = moveSpline.facing.type;
578 movementSpline.FaceDirection = moveSpline.facing.angle;
579 movementSpline.FaceGUID = moveSpline.facing.target;
580 movementSpline.FaceSpot = Position(moveSpline.facing.f.x, moveSpline.facing.f.y, moveSpline.facing.f.z);
581
582 if (moveSpline.anim_tier)
583 {
584 movementSpline.AnimTierTransition.emplace();
585 movementSpline.AnimTierTransition->TierTransitionID = moveSpline.anim_tier->TierTransitionId;
586 movementSpline.AnimTierTransition->StartTime = moveSpline.effect_start_time;
587 movementSpline.AnimTierTransition->AnimTier = AsUnderlyingType(moveSpline.anim_tier->AnimTier);
588 }
589
590 movementSpline.MoveTime = moveSpline.Duration();
591
592 if (splineFlags.Parabolic && (!moveSpline.spell_effect_extra || moveSpline.effect_start_time))
593 {
594 movementSpline.JumpExtraData.emplace();
595 movementSpline.JumpExtraData->JumpGravity = moveSpline.vertical_acceleration;
596 movementSpline.JumpExtraData->StartTime = moveSpline.effect_start_time;
597 }
598
599 if (moveSpline.turn)
600 {
601 MonsterSplineTurnData& turn = movementSpline.TurnData.emplace();
602 turn.StartFacing = moveSpline.turn->StartFacing;
603 turn.TotalTurnRads = moveSpline.turn->TotalTurnRads;
604 turn.RadsPerSec = moveSpline.turn->RadsPerSec;
605 }
606
607 if (splineFlags.FadeObject)
608 movementSpline.FadeObjectTime = moveSpline.effect_start_time;
609
610 if (moveSpline.spell_effect_extra)
611 {
612 movementSpline.SpellEffectExtraData.emplace();
613 movementSpline.SpellEffectExtraData->TargetGUID = moveSpline.spell_effect_extra->Target;
614 movementSpline.SpellEffectExtraData->SpellVisualID = moveSpline.spell_effect_extra->SpellVisualId;
615 movementSpline.SpellEffectExtraData->ProgressCurveID = moveSpline.spell_effect_extra->ProgressCurveId;
616 movementSpline.SpellEffectExtraData->ParabolicCurveID = moveSpline.spell_effect_extra->ParabolicCurveId;
617 movementSpline.SpellEffectExtraData->JumpGravity = moveSpline.vertical_acceleration;
618 }
619
620 ::Movement::Spline<int32> const& spline = moveSpline.spline;
621 std::vector<G3D::Vector3> const& array = spline.getPoints();
622
623 if (splineFlags.UncompressedPath)
624 {
625 uint32 count = spline.getPointCount() - (splineFlags.Cyclic ? 4 : 3);
626 for (uint32 i = 0; i < count; ++i)
627 movementSpline.Points.emplace_back(array[i + 2].x, array[i + 2].y, array[i + 2].z);
628 }
629 else
630 {
631 uint32 lastIdx = spline.getPointCount() - (splineFlags.Cyclic ? 4 : 3);
632 G3D::Vector3 const* realPath = &array[1];
633
634 movementSpline.Points.emplace_back(realPath[lastIdx].x, realPath[lastIdx].y, realPath[lastIdx].z);
635
636 if (lastIdx > 1)
637 {
638 G3D::Vector3 middle = (realPath[0] + realPath[lastIdx]) / 2.f;
639
640 // first and last points already appended
641 for (uint32 i = 1; i < lastIdx; ++i)
642 {
643 G3D::Vector3 delta = middle - realPath[i];
644 movementSpline.PackedDeltas.emplace_back(delta.x, delta.y, delta.z);
645 }
646 }
647 }
648}
649
651{
653 _worldPacket << Pos;
655
656 return &_worldPacket;
657}
658
660{
662 _worldPacket << float(SplineDist);
663
664 return &_worldPacket;
665}
666
674
683
685{
688
689 return &_worldPacket;
690}
691
700
710
712{
714
715 return &_worldPacket;
716}
717
725
727{
729
730 return &_worldPacket;
731}
732
756
758{
762 _worldPacket << Bits<6>(TransfertAbort);
764
765 return &_worldPacket;
766}
767
768ByteBuffer& operator<<(ByteBuffer& data, TeleportLocation const& teleportLocation)
769{
770 data << teleportLocation.Pos;
771 data << int32(teleportLocation.FloorDifficulty);
772 data << int32(teleportLocation.FloorIndex);
773
774 return data;
775}
776
788
790{
793 _worldPacket << Pos;
794 _worldPacket << float(Facing);
796
800
801 if (Vehicle)
802 {
803 _worldPacket << uint8(Vehicle->VehicleSeatIndex);
804 _worldPacket << Bits<1>(Vehicle->VehicleExitVoluntary);
805 _worldPacket << Bits<1>(Vehicle->VehicleExitTeleport);
807 }
808
809 if (TransportGUID)
811
812 return &_worldPacket;
813}
814
816{
817 data >> movementForce.ID;
818 data >> movementForce.Origin;
819 data >> movementForce.Direction;
820 data >> movementForce.TransportID;
821 data >> movementForce.Magnitude;
822 data >> movementForce.MovementForceID;
823 data >> movementForce.DurationMs;
824 data >> movementForce.EndTimestamp;
825 data >> movementForce.Flags;
826 data >> Bits<2>(movementForce.Type);
827
828 return data;
829}
830
880
887
889{
890 data >> ack.Status;
891 data >> ack.AckIndex;
892
893 return data;
894}
895
900
906
913
918
920{
922
923 return &_worldPacket;
924}
925
927{
928 data << float(speeds.HorzSpeed);
929 data << float(speeds.VertSpeed);
930
931 return data;
932}
933
935{
936 data >> speeds.HorzSpeed;
937 data >> speeds.VertSpeed;
938
939 return data;
940}
941
951
953{
955
956 return &_worldPacket;
957}
958
966
979
981{
983 _worldPacket << float(Height);
984 _worldPacket << float(Scale);
985
986 return &_worldPacket;
987}
988
997
1003
1012
1018
1020{
1021 _worldPacket << *Status;
1022 _worldPacket << *Force;
1023
1024 return &_worldPacket;
1025}
1026
1034
1042
1048
1050{
1053
1054 return &_worldPacket;
1055}
1056
1058{
1060 _worldPacket >> Bits<1>(Accept);
1061}
1062
1064{
1065 _worldPacket << Guid;
1066 _worldPacket << Bits<1>(On);
1068
1069 return &_worldPacket;
1070}
1071
1073{
1076}
1077
1079{
1084 _worldPacket << Bits<1>(SkipStartingArea);
1086
1087 return &_worldPacket;
1088}
1089
1091{
1093 _worldPacket << Bits<2>(Reason);
1095
1096 return &_worldPacket;
1097}
1098
1103
1105{
1107 _worldPacket << Bits<2>(Reason);
1109
1110 return &_worldPacket;
1111}
1112
1113ByteBuffer& operator<<(ByteBuffer& data, CollisionHeightInfo const& collisionHeightInfo)
1114{
1115 data << float(collisionHeightInfo.Height);
1116 data << float(collisionHeightInfo.Scale);
1117 data << uint8(collisionHeightInfo.Reason);
1118
1119 return data;
1120}
1121
1122ByteBuffer& operator<<(ByteBuffer& data, StateChangeRangeInfo const& stateChangeRangeInfo)
1123{
1124 data << float(stateChangeRangeInfo.Min);
1125 data << float(stateChangeRangeInfo.Max);
1126
1127 return data;
1128}
1129
1130ByteBuffer& operator<<(ByteBuffer& data, KnockBackInfo const& knockBackInfo)
1131{
1132 data << float(knockBackInfo.HorzSpeed);
1133 data << knockBackInfo.Direction;
1134 data << float(knockBackInfo.InitVertSpeed);
1135
1136 return data;
1137}
1138
1140{
1141 data << uint32(stateChange.MessageID);
1142 data << uint32(stateChange.SequenceIndex);
1143 data << OptionalInit(stateChange.Speed);
1144 data << OptionalInit(stateChange.Range);
1145 data << OptionalInit(stateChange.KnockBack);
1146 data << OptionalInit(stateChange.VehicleRecID);
1147 data << OptionalInit(stateChange.CollisionHeight);
1148 data << OptionalInit(stateChange.MovementForce_);
1149 data << OptionalInit(stateChange.MovementForceGUID);
1150 data << OptionalInit(stateChange.MovementInertiaID);
1151 data << OptionalInit(stateChange.MovementInertiaLifetimeMs);
1152 data << OptionalInit(stateChange.DriveCapabilityRecID);
1153 data.FlushBits();
1154
1155 if (stateChange.MovementForce_)
1156 data << *stateChange.MovementForce_;
1157
1158 if (stateChange.Speed)
1159 data << float(*stateChange.Speed);
1160
1161 if (stateChange.Range)
1162 data << *stateChange.Range;
1163
1164 if (stateChange.KnockBack)
1165 data << *stateChange.KnockBack;
1166
1167 if (stateChange.VehicleRecID)
1168 data << int32(*stateChange.VehicleRecID);
1169
1170 if (stateChange.CollisionHeight)
1171 data << *stateChange.CollisionHeight;
1172
1173 if (stateChange.MovementForceGUID)
1174 data << *stateChange.MovementForceGUID;
1175
1176 if (stateChange.MovementInertiaID)
1177 data << int32(*stateChange.MovementInertiaID);
1178
1179 if (stateChange.MovementInertiaLifetimeMs)
1180 data << uint32(*stateChange.MovementInertiaLifetimeMs);
1181
1182 if (stateChange.DriveCapabilityRecID)
1183 data << int32(*stateChange.DriveCapabilityRecID);
1184
1185 return data;
1186}
1187
1189{
1191 _worldPacket << Size<uint32>(StateChanges);
1192 for (MoveStateChange const& stateChange : StateChanges)
1193 _worldPacket << stateChange;
1194
1195 return &_worldPacket;
1196}
1197
1202}
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
ByteBuffer & operator<<(ByteBuffer &data, MovementInfo::TransportInfo const &transportInfo)
ByteBuffer & operator>>(ByteBuffer &data, MovementInfo::TransportInfo &transportInfo)
@ MOVEMENTFLAG_FALLING
@ MOVEMENTFLAG_FALLING_FAR
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
Definition Util.h:565
void append(T value)
Definition ByteBuffer.h:130
void ResetBitPos()
Definition ByteBuffer.h:152
void FlushBits()
Definition ByteBuffer.h:141
bool ReadBit()
Definition ByteBuffer.h:174
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)
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
WorldPacket const * Write() override
::MovementForces::Container 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
ObjectGuid guid
Optional< Inertia > inertia
Optional< Drive > driveStatus
float gravityModifier
Optional< ObjectGuid > standingOnGameObjectGUID
struct MovementInfo::JumpInfo jump
float stepUpStartElevation
struct MovementInfo::TransportInfo transport
bool HasMovementFlag(uint32 flag) const
Position pos
Optional< AdvFlying > advFlying
struct Movement::FacingInfo::@309 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