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 "Map.h"
20#include "MoveSpline.h"
21#include "MoveSplineFlag.h"
22#include "MovementTypedefs.h"
23#include "UnitDefines.h"
24#include "Util.h"
25
26ByteBuffer& operator<<(ByteBuffer& data, MovementInfo const& movementInfo)
27{
28 data << uint32(movementInfo.flags);
29 data << uint16(movementInfo.flags2);
30 data << uint32(movementInfo.time);
31 data << movementInfo.pos.PositionXYZOStream();
32
34 {
35 data << movementInfo.transport.guid.WriteAsPacked();
36 data << movementInfo.transport.pos.PositionXYZOStream();
37 data << uint32(movementInfo.transport.time);
38 data << int8(movementInfo.transport.seat);
39
41 data << uint32(movementInfo.transport.time2);
42 }
43
45 data << float(movementInfo.pitch);
46
47 data << uint32(movementInfo.fallTime);
48
49 if (movementInfo.HasMovementFlag(MOVEMENTFLAG_FALLING))
50 {
51 data << float(movementInfo.jump.zspeed);
52 data << float(movementInfo.jump.sinAngle);
53 data << float(movementInfo.jump.cosAngle);
54 data << float(movementInfo.jump.xyspeed);
55 }
56
58 data << float(movementInfo.splineElevation);
59
60 return data;
61}
62
64{
65 data >> movementInfo.flags;
66 data >> movementInfo.flags2;
67 data >> movementInfo.time;
68 data >> movementInfo.pos.PositionXYZOStream();
69
71 {
72 data >> movementInfo.transport.guid.ReadAsPacked();
73 data >> movementInfo.transport.pos.PositionXYZOStream();
74 data >> movementInfo.transport.time;
75 data >> movementInfo.transport.seat;
76
78 data >> movementInfo.transport.time2;
79 }
80
82 data >> movementInfo.pitch;
83
84 data >> movementInfo.fallTime;
85
86 if (movementInfo.HasMovementFlag(MOVEMENTFLAG_FALLING))
87 {
88 data >> movementInfo.jump.zspeed;
89 data >> movementInfo.jump.sinAngle;
90 data >> movementInfo.jump.cosAngle;
91 data >> movementInfo.jump.xyspeed;
92 }
93
95 data >> movementInfo.splineElevation;
96
97 return data;
98}
99
101{
107
109{
112
113 return &_worldPacket;
114}
115
117{
118 data << float(jumpExtraData.JumpGravity);
119 data << uint32(jumpExtraData.StartTime);
120
121 return data;
122}
123
125{
126 data << uint8(animTierTransition.AnimTier);
127 data << uint32(animTierTransition.StartTime);
128
129 return data;
130}
131
133{
134 switch (movementSpline.Face)
135 {
136 case ::Movement::MONSTER_MOVE_FACING_TARGET:
137 data << movementSpline.FaceGUID;
138 break;
139 case ::Movement::MONSTER_MOVE_FACING_ANGLE:
140 data << float(movementSpline.FaceDirection);
141 break;
142 case ::Movement::MONSTER_MOVE_FACING_SPOT:
143 data << movementSpline.FaceSpot;
144 break;
145 default:
146 break;
147 }
148
149 data << uint32(movementSpline.Flags);
150
151 if (movementSpline.AnimTierTransition)
152 data << *movementSpline.AnimTierTransition;
153
154 data << uint32(movementSpline.MoveTime);
155
156 if (movementSpline.JumpExtraData)
157 data << *movementSpline.JumpExtraData;
158
159 data << uint32(movementSpline.Points.size() + movementSpline.PackedDeltas.size());
160
161 for (TaggedPosition<Position::XYZ> const& pos : movementSpline.Points)
162 data << pos;
163
164 for (TaggedPosition<Position::PackedXYZ> const& pos : movementSpline.PackedDeltas)
165 data << pos;
166
167 return data;
168}
169
171{
172 data << uint32(movementMonsterSpline.ID);
173 data << uint8(movementMonsterSpline.Move.Face);
174
176 data << movementMonsterSpline.Move;
177
178 return data;
179}
180
182{
183 data << splineTransport.TransportGUID.WriteAsPacked();
184 data << int8(splineTransport.VehicleSeat);
185
186 return data;
187}
188
190{
191 G3D::Vector3 dest = moveSpline.isCyclic() ? G3D::Vector3::zero() : moveSpline.FinalDestination();
192
193 data << uint32(moveSpline.splineflags.raw()); // SplineFlags
194
195 if (moveSpline.splineflags.final_angle)
196 data << moveSpline.facing.angle; // FaceDirection
197 else if (moveSpline.splineflags.final_target)
198 data << moveSpline.facing.target; // FaceGUID
199 else if (moveSpline.splineflags.final_point)
200 {
201 data << float(moveSpline.facing.f.x); // FaceSpot
202 data << float(moveSpline.facing.f.y);
203 data << float(moveSpline.facing.f.z);
204 }
205
206 data << int32(moveSpline.timePassed()); // Elapsed
207 data << uint32(moveSpline.Duration()); // Duration
208 data << uint32(moveSpline.GetId()); // ID
209
210 data << float(1.0f); // DurationModifier
211 data << float(1.0f); // NextDurationModifier
212
213 data << float(moveSpline.vertical_acceleration);
214 data << uint32(moveSpline.effect_start_time);
215
216 data << uint32(moveSpline.getPath().size());
217 data.append(reinterpret_cast<float const*>(moveSpline.getPath().data()), moveSpline.getPath().size() * 3);
218 data << uint8(moveSpline.spline.mode()); // Mode
219 data << dest.x << dest.y << dest.z; // Destination
220}
221
223{
224 SplineData.ID = moveSpline.m_Id;
226
230 {
231 case ::Movement::MoveSplineFlag::Final_Target:
233 movementSpline.FaceGUID = moveSpline.facing.target;
234 break;
235 case ::Movement::MoveSplineFlag::Final_Angle:
237 movementSpline.FaceDirection = moveSpline.facing.angle;
238 break;
239 case ::Movement::MoveSplineFlag::Final_Point:
241 movementSpline.FaceSpot = Position(moveSpline.facing.f.x, moveSpline.facing.f.y, moveSpline.facing.f.z);
242 break;
243 default:
245 break;
246 }
247
248 if (splineFlags.animation)
249 {
250 movementSpline.AnimTierTransition.emplace();
251 movementSpline.AnimTierTransition->StartTime = moveSpline.effect_start_time;
252 movementSpline.AnimTierTransition->AnimTier = AsUnderlyingType(moveSpline.GetAnimTier());
253 }
254
255 movementSpline.MoveTime = moveSpline.Duration();
256
257 if (splineFlags.parabolic)
258 {
259 movementSpline.JumpExtraData.emplace();
260 movementSpline.JumpExtraData->JumpGravity = moveSpline.vertical_acceleration;
261 movementSpline.JumpExtraData->StartTime = moveSpline.effect_start_time;
262 }
263
264 ::Movement::Spline<int32> const& spline = moveSpline.spline;
265 std::vector<G3D::Vector3> const& array = spline.getPoints();
266
268 {
269 uint32 count = spline.getPointCount() - (splineFlags.cyclic ? 4 : 3);
270 for (uint32 i = 0; i < count; ++i)
271 movementSpline.Points.emplace_back(array[i + 2].x, array[i + 2].y, array[i + 2].z);
272 }
273 else
274 {
275 uint32 lastIdx = spline.getPointCount() - 3;
276 G3D::Vector3 const* realPath = &array[1];
277
279
280 if (lastIdx > 1)
281 {
282 G3D::Vector3 middle = (realPath[0] + realPath[lastIdx]) / 2.f;
283
284 // first and last points already appended
285 for (uint32 i = 1; i < lastIdx; ++i)
286 {
287 G3D::Vector3 delta = middle - realPath[i];
288 movementSpline.PackedDeltas.emplace_back(delta.x, delta.y, delta.z);
289 }
290 }
291 }
292}
293
309
317
325
337
346
353
361
363{
365 if (Ship)
366 {
367 _worldPacket << uint32(Ship->ID);
368 _worldPacket << int32(Ship->OriginMapID);
369 }
370
371 return &_worldPacket;
372}
373
375{
378 switch (TransfertAbort)
379 {
384 break;
385 default:
386 break;
387 }
388
389 return &_worldPacket;
390}
391
393{
396
397 return &_worldPacket;
398}
399
408
416
423}
uint8_t uint8
Definition Define.h:135
int8_t int8
Definition Define.h:131
int32_t int32
Definition Define.h:129
uint16_t uint16
Definition Define.h:134
uint32_t uint32
Definition Define.h:133
@ TRANSFER_ABORT_DIFFICULTY
Definition Map.h:83
@ TRANSFER_ABORT_UNIQUE_MESSAGE
Definition Map.h:84
@ TRANSFER_ABORT_INSUF_EXPAN_LVL
Definition Map.h:82
ByteBuffer & operator<<(ByteBuffer &data, MovementInfo const &movementInfo)
ByteBuffer & operator>>(ByteBuffer &data, MovementInfo &movementInfo)
@ MOVEMENTFLAG_ONTRANSPORT
@ MOVEMENTFLAG_FLYING
@ MOVEMENTFLAG_FALLING
@ MOVEMENTFLAG_SWIMMING
@ MOVEMENTFLAG_SPLINE_ELEVATION
@ MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING
@ MOVEMENTFLAG2_INTERPOLATED_MOVEMENT
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
Definition Util.h:554
void append(T value)
Definition ByteBuffer.h:133
ControlArray const & getPoints() const
Definition Spline.h:115
index_type getPointCount() const
Definition Spline.h:116
PackedGuidWriter WriteAsPacked() const
Definition ObjectGuid.h:152
PackedGuidReader ReadAsPacked()
Definition ObjectGuid.h:146
void SetOpcode(uint16 opcode)
Definition WorldPacket.h:59
T & emplace_back(Args &&... args)
size_type size() const
static void WriteCreateObjectSplineDataBlock(::Movement::MoveSpline const &moveSpline, ByteBuffer &data)
WorldPacket const * Write() override
WorldPacket const * Write() override
TaggedPosition< Position::XYZ > Pos
Optional< MovementSplineTransport > Transport
void InitializeSplineData(::Movement::MoveSpline const &moveSpline)
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
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
Optional< ShipTransferPending > Ship
WorldPacket const * Write() override
WorldPacket _worldPacket
Definition Packet.h:42
OpcodeServer GetOpcode() const
Definition Packet.h:56
@ SMSG_FORCE_RUN_SPEED_CHANGE
Definition Opcodes.h:255
@ SMSG_MONSTER_MOVE_TRANSPORT
Definition Opcodes.h:715
@ MONSTER_MOVE_FACING_TARGET
@ MONSTER_MOVE_FACING_ANGLE
@ MONSTER_MOVE_FACING_SPOT
ByteBuffer & operator<<(ByteBuffer &data, MonsterSplineJumpExtraData const &jumpExtraData)
ObjectGuid guid
struct MovementInfo::JumpInfo jump
uint32 fallTime
struct MovementInfo::TransportInfo transport
float splineElevation
bool HasMovementFlag(uint32 flag) const
bool HasExtraMovementFlag(uint16 flag) const
Position pos
Streamer< XYZO > PositionXYZOStream()
Definition Position.h:93