diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 63 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Object.h | 23 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 190 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 21 | ||||
-rw-r--r-- | src/server/game/Handlers/MovementHandler.cpp | 10 | ||||
-rw-r--r-- | src/server/game/Movement/Spline/MovementTypedefs.h | 2 | ||||
-rw-r--r-- | src/server/game/Movement/Spline/MovementUtil.cpp | 70 |
7 files changed, 177 insertions, 202 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index c1eb9821935..ac3cf34024d 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -357,6 +357,8 @@ void Object::_BuildMovementUpdate(ByteBuffer* data, uint16 flags) const uint32 movementFlags = 0; uint16 movementFlagsExtra = 0; + bool hasTransportTime2 = false; + bool hasTransportTime3 = false; bool hasFallDirection = false; bool hasFallData = false; bool hasPitch = false; @@ -386,15 +388,28 @@ void Object::_BuildMovementUpdate(ByteBuffer* data, uint16 flags) const self = ToUnit(); movementFlags = self->m_movementInfo.GetMovementFlags(); movementFlagsExtra = self->m_movementInfo.GetExtraMovementFlags(); - hasPitch = ((movementFlags & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING)) || - (movementFlagsExtra & MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING)); hasSpline = self->IsSplineEnabled(); - hasSplineElevation = movementFlags & MOVEMENTFLAG_SPLINE_ELEVATION; - hasFallData = movementFlagsExtra & MOVEMENTFLAG2_INTERPOLATED_TURNING; - hasFallDirection = movementFlags & MOVEMENTFLAG_FALLING; - if (GetTypeId() == TYPEID_UNIT) + if (GetTypeId() == TYPEID_PLAYER) + { + hasTransportTime2 = self->m_movementInfo.bits.hasTransportTime2; + hasTransportTime3 = self->m_movementInfo.bits.hasTransportTime3; + hasPitch = self->m_movementInfo.bits.hasPitch; + hasFallData = self->m_movementInfo.bits.hasFallData; + hasFallDirection = self->m_movementInfo.bits.hasFallDirection; + hasSplineElevation = self->m_movementInfo.bits.hasSplineElevation; + } + else + { + hasTransportTime2 = self->HasExtraUnitMovementFlag(MOVEMENTFLAG2_INTERPOLATED_MOVEMENT); + hasPitch = ((movementFlags & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING)) || + (movementFlagsExtra & MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING)); + hasFallDirection = movementFlags & MOVEMENTFLAG_FALLING; + hasFallData = hasFallDirection; // FallDirection implies that FallData is set as well + hasSplineElevation = movementFlags & MOVEMENTFLAG_SPLINE_ELEVATION; + movementFlags &= MOVEMENTFLAG_MASK_CREATURE_ALLOWED; + } data->WriteBit(!movementFlags); data->WriteBit(G3D::fuzzyEq(self->GetOrientation(), 0.0f)); // Has Orientation @@ -524,16 +539,16 @@ void Object::_BuildMovementUpdate(ByteBuffer* data, uint16 flags) const data->WriteByteSeq(transGuid[7]); *data << uint32(self->GetTransTime()); *data << float(self->GetTransOffsetO()); - //if (hasTransportTime2) - // *data << uint32(0); + if (hasTransportTime2) + *data << uint32(self->m_movementInfo.t_time2); *data << float(self->GetTransOffsetY()); *data << float(self->GetTransOffsetX()); data->WriteByteSeq(transGuid[3]); *data << float(self->GetTransOffsetZ()); data->WriteByteSeq(transGuid[0]); - //if (hasTransportTime3) - // *data << uint32(0); + if (hasTransportTime3) + *data << uint32(self->m_movementInfo.t_time3); *data << int8(self->GetTransSeat()); data->WriteByteSeq(transGuid[1]); @@ -582,8 +597,8 @@ void Object::_BuildMovementUpdate(ByteBuffer* data, uint16 flags) const data->WriteBit(transGuid[0]); data->WriteBit(transGuid[5]); - //if (hasTransportTime3) - // *data << uint32(0); + if (hasTransportTime3) + *data << uint32(self->m_movementInfo.t_time3); data->WriteBit(transGuid[3]); *data << float(self->GetTransOffsetX()); @@ -597,8 +612,8 @@ void Object::_BuildMovementUpdate(ByteBuffer* data, uint16 flags) const *data << float(self->GetTransOffsetZ()); *data << int8(self->GetTransSeat()); *data << float(self->GetTransOffsetO()); - //if (hasTransportTime2) - // *data << uint32(0); + if (hasTransportTime2) + *data << uint32(self->m_movementInfo.t_time2); } if (flags & UPDATEFLAG_ROTATION) @@ -1521,9 +1536,9 @@ void MovementInfo::OutDebug() { sLog->outInfo(LOG_FILTER_GENERAL, "MOVEMENT INFO"); sLog->outInfo(LOG_FILTER_GENERAL, "guid " UI64FMTD, guid); - sLog->outInfo(LOG_FILTER_GENERAL, "flags %u", flags); - sLog->outInfo(LOG_FILTER_GENERAL, "flags2 %u", flags2); - sLog->outInfo(LOG_FILTER_GENERAL, "time %u current time " UI64FMTD "", flags2, uint64(::time(NULL))); + sLog->outInfo(LOG_FILTER_GENERAL, "flags %s (%u)", Movement::MovementFlags_ToString(flags).c_str(), flags); + sLog->outInfo(LOG_FILTER_GENERAL, "flags2 %s (%u)", Movement::MovementFlagsExtra_ToString(flags2).c_str(), flags2); + sLog->outInfo(LOG_FILTER_GENERAL, "time %u current time %u", time, getMSTime()); sLog->outInfo(LOG_FILTER_GENERAL, "position: `%s`", pos.ToString().c_str()); if (t_guid) { @@ -1534,14 +1549,19 @@ void MovementInfo::OutDebug() sLog->outInfo(LOG_FILTER_GENERAL, "time: %u", t_time); if (flags2 & MOVEMENTFLAG2_INTERPOLATED_MOVEMENT) sLog->outInfo(LOG_FILTER_GENERAL, "time2: %u", t_time2); + if (bits.hasTransportTime3) + sLog->outInfo(LOG_FILTER_GENERAL, "time3: %u", t_time3); } if ((flags & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING)) || (flags2 & MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING)) sLog->outInfo(LOG_FILTER_GENERAL, "pitch: %f", pitch); - sLog->outInfo(LOG_FILTER_GENERAL, "fallTime: %u", fallTime); - if (flags & MOVEMENTFLAG_FALLING) - sLog->outInfo(LOG_FILTER_GENERAL, "j_zspeed: %f j_sinAngle: %f j_cosAngle: %f j_xyspeed: %f", j_zspeed, j_sinAngle, j_cosAngle, j_xyspeed); + if (flags & MOVEMENTFLAG_FALLING || bits.hasFallData) + { + sLog->outInfo(LOG_FILTER_GENERAL, "fallTime: %u j_zspeed: %f", fallTime, j_zspeed); + if (flags & MOVEMENTFLAG_FALLING) + sLog->outInfo(LOG_FILTER_GENERAL, "j_sinAngle: %f j_cosAngle: %f j_xyspeed: %f", j_sinAngle, j_cosAngle, j_xyspeed); + } if (flags & MOVEMENTFLAG_SPLINE_ELEVATION) sLog->outInfo(LOG_FILTER_GENERAL, "splineElevation: %f", splineElevation); @@ -2522,8 +2542,7 @@ void WorldObject::BuildMonsterChat(WorldPacket* data, uint8 msgtype, char const* void Unit::BuildHeartBeatMsg(WorldPacket* data) const { data->Initialize(MSG_MOVE_HEARTBEAT, 32); - data->append(GetPackGUID()); - BuildMovementPacket(data); + WriteMovementInfo(*data); } void WorldObject::SendMessageToSet(WorldPacket* data, bool self) diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 66d8f533a09..324a454de55 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -480,11 +480,26 @@ struct MovementInfo // spline float splineElevation; + // bit markers + struct MovementElementMarkers + { + bool hasTransportTime2; + bool hasTransportTime3; + bool hasPitch; + bool hasFallData; + bool hasFallDirection; + bool hasSplineElevation; + } bits; + MovementInfo() : - guid(), flags(), flags2(), pos(), time(), t_guid(), t_pos(), - t_seat(-1), t_time(), t_time2(), pitch(), fallTime(), - j_zspeed(), j_sinAngle(), j_cosAngle(), j_xyspeed() - { } + guid(0), flags(0), flags2(0), time(0), t_guid(0), + t_seat(-1), t_time(0), t_time2(0), t_time3(0), pitch(0.0f), fallTime(0), + j_zspeed(0.0f), j_sinAngle(0.0f), j_cosAngle(0.0f), j_xyspeed(0.0f) + { + pos.Relocate(0.0f, 0.0f, 0.0f, 0.0f); + t_pos.Relocate(0.0f, 0.0f, 0.0f, 0.0f); + memset(&bits, 0, sizeof(bits)); + } uint32 GetMovementFlags() const { return flags; } void SetMovementFlags(uint32 flag) { flags = flag; } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 6c03808fea6..dcc36aa8e08 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -16421,92 +16421,6 @@ void Unit::_ExitVehicle(Position const* exitPosition) } } -void Unit::BuildMovementPacket(ByteBuffer *data) const -{ - *data << uint32(GetUnitMovementFlags()); // movement flags - *data << uint16(GetExtraUnitMovementFlags()); // 2.3.0 - *data << uint32(getMSTime()); // time / counter - *data << GetPositionX(); - *data << GetPositionY(); - *data << GetPositionZMinusOffset(); - *data << GetOrientation(); - - bool onTransport = m_movementInfo.t_guid != 0; - bool hasInterpolatedMovement = m_movementInfo.flags2 & MOVEMENTFLAG2_INTERPOLATED_MOVEMENT; - bool time3 = false; - bool swimming = ((GetUnitMovementFlags() & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING)) - || (m_movementInfo.flags2 & MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING)); - bool interPolatedTurning = m_movementInfo.flags2 & MOVEMENTFLAG2_INTERPOLATED_TURNING; - bool jumping = GetUnitMovementFlags() & MOVEMENTFLAG_FALLING; - bool splineElevation = GetUnitMovementFlags() & MOVEMENTFLAG_SPLINE_ELEVATION; - bool splineData = false; - - data->WriteBits(GetUnitMovementFlags(), 30); - data->WriteBits(m_movementInfo.flags2, 12); - data->WriteBit(onTransport); - if (onTransport) - { - data->WriteBit(hasInterpolatedMovement); - data->WriteBit(time3); - } - - data->WriteBit(swimming); - data->WriteBit(interPolatedTurning); - if (interPolatedTurning) - data->WriteBit(jumping); - - data->WriteBit(splineElevation); - data->WriteBit(splineData); - - data->FlushBits(); // reset bit stream - - *data << uint64(GetGUID()); - *data << uint32(getMSTime()); - *data << float(GetPositionX()); - *data << float(GetPositionY()); - *data << float(GetPositionZ()); - *data << float(GetOrientation()); - - if (onTransport) - { - if (m_vehicle) - *data << uint64(m_vehicle->GetBase()->GetGUID()); - else if (GetTransport()) - *data << uint64(GetTransport()->GetGUID()); - else // probably should never happen - *data << (uint64)0; - - *data << float (GetTransOffsetX()); - *data << float (GetTransOffsetY()); - *data << float (GetTransOffsetZ()); - *data << float (GetTransOffsetO()); - *data << uint8 (GetTransSeat()); - *data << uint32(GetTransTime()); - if (hasInterpolatedMovement) - *data << int32(0); // Transport Time 2 - if (time3) - *data << int32(0); // Transport Time 3 - } - - if (swimming) - *data << (float)m_movementInfo.pitch; - - if (interPolatedTurning) - { - *data << (uint32)m_movementInfo.fallTime; - *data << (float)m_movementInfo.j_zspeed; - if (jumping) - { - *data << (float)m_movementInfo.j_sinAngle; - *data << (float)m_movementInfo.j_cosAngle; - *data << (float)m_movementInfo.j_xyspeed; - } - } - - if (splineElevation) - *data << (float)m_movementInfo.splineElevation; -} - void Unit::SetCanFly(bool apply) { if (apply) @@ -16539,13 +16453,6 @@ void Unit::ReadMovementInfo(WorldPacket& data, MovementInfo* mi) bool hasTimestamp = false; bool hasOrientation = false; bool hasTransportData = false; - bool hasTransportTime2 = false; - bool hasTransportTime3 = false; - bool hasPitch = false; - bool hasFallData = false; - bool hasFallDirection = false; - bool hasSplineElevation = false; - bool hasSpline = false; MovementStatusElements* sequence = GetMovementStatusElementsSequence(data.GetOpcode()); if (sequence == NULL) @@ -16610,27 +16517,27 @@ void Unit::ReadMovementInfo(WorldPacket& data, MovementInfo* mi) break; case MSEHasTransportTime2: if (hasTransportData) - hasTransportTime2 = data.ReadBit(); + mi->bits.hasTransportTime2 = data.ReadBit(); break; case MSEHasTransportTime3: if (hasTransportData) - hasTransportTime3 = data.ReadBit(); + mi->bits.hasTransportTime3 = data.ReadBit(); break; case MSEHasPitch: - hasPitch = !data.ReadBit(); + mi->bits.hasPitch = !data.ReadBit(); break; case MSEHasFallData: - hasFallData = data.ReadBit(); + mi->bits.hasFallData = data.ReadBit(); break; case MSEHasFallDirection: - if (hasFallData) - hasFallDirection = data.ReadBit(); + if (mi->bits.hasFallData) + mi->bits.hasFallDirection = data.ReadBit(); break; case MSEHasSplineElevation: - hasSplineElevation = !data.ReadBit(); + mi->bits.hasSplineElevation = !data.ReadBit(); break; case MSEHasSpline: - hasSpline = data.ReadBit(); + data.ReadBit(); break; case MSEMovementFlags: if (hasMovementFlags) @@ -16682,39 +16589,39 @@ void Unit::ReadMovementInfo(WorldPacket& data, MovementInfo* mi) data >> mi->t_time; break; case MSETransportTime2: - if (hasTransportData && hasTransportTime2) + if (hasTransportData && mi->bits.hasTransportTime2) data >> mi->t_time2; break; case MSETransportTime3: - if (hasTransportData && hasTransportTime3) + if (hasTransportData && mi->bits.hasTransportTime3) data >> mi->t_time3; break; case MSEPitch: - if (hasPitch) + if (mi->bits.hasPitch) data >> mi->pitch; break; case MSEFallTime: - if (hasFallData) + if (mi->bits.hasFallData) data >> mi->fallTime; break; case MSEFallVerticalSpeed: - if (hasFallData) + if (mi->bits.hasFallData) data >> mi->j_zspeed; break; case MSEFallCosAngle: - if (hasFallData && hasFallDirection) + if (mi->bits.hasFallData && mi->bits.hasFallDirection) data >> mi->j_cosAngle; break; case MSEFallSinAngle: - if (hasFallData && hasFallDirection) + if (mi->bits.hasFallData && mi->bits.hasFallDirection) data >> mi->j_sinAngle; break; case MSEFallHorizontalSpeed: - if (hasFallData && hasFallDirection) + if (mi->bits.hasFallData && mi->bits.hasFallDirection) data >> mi->j_xyspeed; break; case MSESplineElevation: - if (hasSplineElevation) + if (mi->bits.hasSplineElevation) data >> mi->splineElevation; break; case MSEZeroBit: @@ -16741,7 +16648,7 @@ void Unit::ReadMovementInfo(WorldPacket& data, MovementInfo* mi) { \ if (check) \ { \ - sLog->outDebug(LOG_FILTER_UNITS, "WorldSession::ReadMovementInfo: Violation of MovementFlags found (%s). " \ + sLog->outDebug(LOG_FILTER_UNITS, "Unit::ReadMovementInfo: Violation of MovementFlags found (%s). " \ "MovementFlags: %u, MovementFlags2: %u for player GUID: %u. Mask %u will be removed.", \ STRINGIZE(check), mi->GetMovementFlags(), mi->GetExtraMovementFlags(), GetGUIDLow(), maskToRemove); \ mi->RemoveMovementFlag((maskToRemove)); \ @@ -16807,22 +16714,46 @@ void Unit::ReadMovementInfo(WorldPacket& data, MovementInfo* mi) #undef REMOVE_VIOLATING_FLAGS } -void Unit::WriteMovementInfo(WorldPacket& data) +void Unit::WriteMovementInfo(WorldPacket& data) const { - Unit* mover = GetCharmerGUID() ? GetCharmer() : this; + Unit const* mover = GetCharmerGUID() ? GetCharmer() : this; + if (Player const* player = ToPlayer()) + mover = player->m_mover; bool hasMovementFlags = mover->GetUnitMovementFlags() != 0; bool hasMovementFlags2 = mover->GetExtraUnitMovementFlags() != 0; bool hasTimestamp = GetTypeId() == TYPEID_PLAYER ? (mover->m_movementInfo.time != 0) : true; bool hasOrientation = !G3D::fuzzyEq(mover->GetOrientation(), 0.0f); - bool hasTransportData = mover->GetTransport() != NULL; - bool hasTransportTime2 = mover->HasExtraUnitMovementFlag(MOVEMENTFLAG2_INTERPOLATED_MOVEMENT); - bool hasTransportTime3 = false; - bool hasPitch = mover->HasUnitMovementFlag(MovementFlags(MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING)) || mover->HasExtraUnitMovementFlag(MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING); - bool hasFallData = mover->HasExtraUnitMovementFlag(MOVEMENTFLAG2_INTERPOLATED_TURNING); - bool hasFallDirection = mover->HasUnitMovementFlag(MOVEMENTFLAG_FALLING); - bool hasSplineElevation = mover->HasUnitMovementFlag(MOVEMENTFLAG_SPLINE_ELEVATION); - bool hasSpline = false; + bool hasTransportData = GetTransGUID() != 0; + bool hasSpline = mover->IsSplineEnabled(); + + bool hasTransportTime2; + bool hasTransportTime3; + bool hasPitch; + bool hasFallData; + bool hasFallDirection; + bool hasSplineElevation; + + if (GetTypeId() == TYPEID_PLAYER) + { + hasTransportTime2 = mover->m_movementInfo.bits.hasTransportTime2; + hasTransportTime3 = mover->m_movementInfo.bits.hasTransportTime3; + hasPitch = mover->m_movementInfo.bits.hasPitch; + hasFallData = mover->m_movementInfo.bits.hasFallData; + hasFallDirection = mover->m_movementInfo.bits.hasFallDirection; + hasSplineElevation = mover->m_movementInfo.bits.hasSplineElevation; + } + else + { + hasTransportTime2 = mover->HasExtraUnitMovementFlag(MOVEMENTFLAG2_INTERPOLATED_MOVEMENT); + hasTransportTime3 = false; + hasPitch = mover->HasUnitMovementFlag(MovementFlags(MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING)) || mover->HasExtraUnitMovementFlag(MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING); + hasFallDirection = mover->HasUnitMovementFlag(MOVEMENTFLAG_FALLING); + hasFallData = hasFallDirection; // FallDirection implies that FallData is set as well + // the only case when hasFallData = 1 && hasFallDirection = 0 + // is for MSG_MOVE_LAND, which is handled above, in player case + hasSplineElevation = mover->HasUnitMovementFlag(MOVEMENTFLAG_SPLINE_ELEVATION); + } MovementStatusElements* sequence = GetMovementStatusElementsSequence(data.GetOpcode()); if (!sequence) @@ -16832,7 +16763,7 @@ void Unit::WriteMovementInfo(WorldPacket& data) } ObjectGuid guid = mover->GetGUID(); - ObjectGuid tguid = hasTransportData ? GetTransport()->GetGUID() : 0; + ObjectGuid tguid = hasTransportData ? GetTransGUID() : 0; for (uint32 i = 0; i < MSE_COUNT; ++i) { @@ -17484,8 +17415,7 @@ void Unit::SendMovementHover() ToPlayer()->SendMovementSetHover(HasUnitMovementFlag(MOVEMENTFLAG_HOVER)); WorldPacket data(MSG_MOVE_HOVER, 64); - data.append(GetPackGUID()); - BuildMovementPacket(&data); + WriteMovementInfo(data); SendMessageToSet(&data, false); } @@ -17495,8 +17425,7 @@ void Unit::SendMovementWaterWalking() ToPlayer()->SendMovementSetWaterWalking(HasUnitMovementFlag(MOVEMENTFLAG_WATERWALKING)); WorldPacket data(MSG_MOVE_WATER_WALK, 64); - data.append(GetPackGUID()); - BuildMovementPacket(&data); + WriteMovementInfo(data); SendMessageToSet(&data, false); } @@ -17506,16 +17435,14 @@ void Unit::SendMovementFeatherFall() ToPlayer()->SendMovementSetFeatherFall(HasUnitMovementFlag(MOVEMENTFLAG_FALLING_SLOW)); WorldPacket data(MSG_MOVE_FEATHER_FALL, 64); - data.append(GetPackGUID()); - BuildMovementPacket(&data); + WriteMovementInfo(data); SendMessageToSet(&data, false); } void Unit::SendMovementGravityChange() { WorldPacket data(MSG_MOVE_GRAVITY_CHNG, 64); - data.append(GetPackGUID()); - BuildMovementPacket(&data); + WriteMovementInfo(data); SendMessageToSet(&data, false); } @@ -17539,8 +17466,7 @@ void Unit::SendMovementCanFlyChange() ToPlayer()->SendMovementSetCanFly(CanFly()); WorldPacket data(MSG_MOVE_UPDATE_CAN_FLY, 64); - data.append(GetPackGUID()); - BuildMovementPacket(&data); + WriteMovementInfo(data); SendMessageToSet(&data, false); } diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 11e36ad5150..b2031794d89 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -758,13 +758,17 @@ enum MovementFlags2 MOVEMENTFLAG2_FULL_SPEED_TURNING = 0x00000004, MOVEMENTFLAG2_FULL_SPEED_PITCHING = 0x00000008, MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING = 0x00000010, - MOVEMENTFLAG2_UNK7 = 0x00000020, - MOVEMENTFLAG2_UNK8 = 0x00000040, - MOVEMENTFLAG2_UNK9 = 0x00000080, - MOVEMENTFLAG2_UNK10 = 0x00000100, - MOVEMENTFLAG2_INTERPOLATED_MOVEMENT = 0x00000200, - MOVEMENTFLAG2_INTERPOLATED_TURNING = 0x00000400, - MOVEMENTFLAG2_INTERPOLATED_PITCHING = 0x00000800 + MOVEMENTFLAG2_UNK5 = 0x00000020, + MOVEMENTFLAG2_UNK6 = 0x00000040, + MOVEMENTFLAG2_UNK7 = 0x00000080, + MOVEMENTFLAG2_UNK8 = 0x00000100, + MOVEMENTFLAG2_UNK9 = 0x00000200, + MOVEMENTFLAG2_UNK10 = 0x00000400, + MOVEMENTFLAG2_UNK11 = 0x00000800, + MOVEMENTFLAG2_UNK12 = 0x00001000, + MOVEMENTFLAG2_INTERPOLATED_MOVEMENT = 0x00002000, + MOVEMENTFLAG2_INTERPOLATED_TURNING = 0x00004000, + MOVEMENTFLAG2_INTERPOLATED_PITCHING = 0x00008000 }; enum UnitTypeMask @@ -2107,9 +2111,8 @@ class Unit : public WorldObject void _ExitVehicle(Position const* exitPosition = NULL); void _EnterVehicle(Vehicle* vehicle, int8 seatId, AuraApplication const* aurApp = NULL); - void BuildMovementPacket(ByteBuffer *data) const; void ReadMovementInfo(WorldPacket& data, MovementInfo* mi); - void WriteMovementInfo(WorldPacket& data); + void WriteMovementInfo(WorldPacket& data) const; bool isMoving() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_MASK_MOVING); } bool isTurning() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_MASK_TURNING); } diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index d4ba2ec7b7b..08819c8c8d4 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -563,15 +563,7 @@ void WorldSession::HandleMoveKnockBackAck(WorldPacket& recvData) _player->m_movementInfo = movementInfo; WorldPacket data(SMSG_MOVE_UPDATE_KNOCK_BACK, 66); - data.appendPackGUID(movementInfo.guid); - _player->BuildMovementPacket(&data); - - // knockback specific info - data << movementInfo.j_sinAngle; - data << movementInfo.j_cosAngle; - data << movementInfo.j_xyspeed; - data << movementInfo.j_zspeed; - + _player->WriteMovementInfo(data); _player->SendMessageToSet(&data, false); } diff --git a/src/server/game/Movement/Spline/MovementTypedefs.h b/src/server/game/Movement/Spline/MovementTypedefs.h index 51679260ebb..f044d249fcb 100644 --- a/src/server/game/Movement/Spline/MovementTypedefs.h +++ b/src/server/game/Movement/Spline/MovementTypedefs.h @@ -77,6 +77,8 @@ namespace Movement extern double gravity; extern float computeFallElevation(float t_passed, bool isSafeFall, float start_velocity); extern UInt32Counter splineIdGen; + extern std::string MovementFlags_ToString(uint32 flags); + extern std::string MovementFlagsExtra_ToString(uint32 flags); } #endif // TRINITYSERVER_TYPEDEFS_H diff --git a/src/server/game/Movement/Spline/MovementUtil.cpp b/src/server/game/Movement/Spline/MovementUtil.cpp index 7a380478ee2..7841828d44a 100644 --- a/src/server/game/Movement/Spline/MovementUtil.cpp +++ b/src/server/game/Movement/Spline/MovementUtil.cpp @@ -113,18 +113,18 @@ namespace Movement STR(Pitch_Up ), // 0x00000040, STR(Pitch_Down ), // 0x00000080, - STR(Walk ), // 0x00000100, // Walking - STR(Levitation ), // 0x00000200, + STR(Walking ), // 0x00000100, // Walking + STR(DisableGravity ), // 0x00000200, STR(Root ), // 0x00000400, STR(Falling ), // 0x00000800, - STR(Fallingfar ), // 0x00001000, - STR(Pendingstop ), // 0x00002000, - STR(PendingSTRafestop ), // 0x00004000, - STR(Pendingforward ), // 0x00008000, - STR(Pendingbackward ), // 0x00010000, - STR(PendingSTRafeleft ), // 0x00020000, - STR(PendingSTRaferight ), // 0x00040000, - STR(Pendingroot ), // 0x00080000, + STR(FallingFar ), // 0x00001000, + STR(PendingStop ), // 0x00002000, + STR(PendingStrafeStop ), // 0x00004000, + STR(PendingForward ), // 0x00008000, + STR(PendingBackward ), // 0x00010000, + STR(PendingStrafeReft ), // 0x00020000, + STR(PendingStrafeRight ), // 0x00040000, + STR(PendingRoot ), // 0x00080000, STR(Swimming ), // 0x00100000, // Appears With Fly Flag Also STR(Ascending ), // 0x00200000, // Swim Up Also STR(Descending ), // 0x00400000, // Swim Down Also @@ -137,22 +137,26 @@ namespace Movement STR(Local_Dirty ), // 0x20000000 STR(None31 ), // 0x40000000 STR(None32 ), // 0x80000000 - STR(Unk1 ), - STR(Unk2 ), - STR(Unk3 ), - STR(Fullspeedturning ), - STR(Fullspeedpitching ), - STR(Allow_Pitching ), - STR(Unk4 ), - STR(Unk5 ), - STR(Unk6 ), - STR(Unk7 ), - STR(Interp_Move ), - STR(Interp_Turning ), - STR(Interp_Pitching ), - STR(None8 ), - STR(None9 ), - STR(None10 ), + }; + + char const* g_MovementFlagExtra_names[] = + { + STR(NoStrafe ), + STR(NoJump ), + STR(FullSpeedTurning ), + STR(FullSpeedPitching ), + STR(Allow_Pitching ), + STR(Unk6 ), + STR(Unk7 ), + STR(Unk8 ), + STR(Unk9 ), + STR(Unk10 ), + STR(Unk11 ), + STR(Unk12 ), + STR(Unk13 ), + STR(Interpolated_Movement), + STR(Interpolated_Turning ), + STR(Interpolated_Pitching), }; char const* g_SplineFlag_names[32] = @@ -207,4 +211,18 @@ namespace Movement print_flags(raw(), g_SplineFlag_names, str); return str; } + + std::string MovementFlags_ToString(uint32 flags) + { + std::string str; + print_flags(flags, g_MovementFlag_names, str); + return str; + } + + std::string MovementFlagsExtra_ToString(uint32 flags) + { + std::string str; + print_flags(flags, g_MovementFlagExtra_names, str); + return str; + } } |