mirror of
https://github.com/araxiaonline/TrinityCore.git
synced 2026-06-13 03:32:28 -04:00
Core/PacketIO: Enabled CMSG_MOVE_KNOCK_BACK_ACK, SMSG_MOVE_UPDATE_KNOCK_BACK and SMSG_MOVE_UPDATE
This commit is contained in:
@@ -26270,221 +26270,8 @@ bool Player::CanUseMastery() const
|
||||
return HasSpell(MasterySpells[getClass()]);
|
||||
}
|
||||
|
||||
void Player::ReadMovementInfo(WorldPacket& data, MovementInfo* mi, Movement::ExtraMovementStatusElement* extras /*= NULL*/)
|
||||
void Player::ValidateMovementInfo(MovementInfo* mi)
|
||||
{
|
||||
MovementStatusElements const* sequence = GetMovementStatusElementsSequence(data.GetOpcode());
|
||||
if (!sequence)
|
||||
{
|
||||
TC_LOG_ERROR("network", "Player::ReadMovementInfo: No movement sequence found for opcode %s", GetOpcodeNameForLogging(static_cast<OpcodeClient>(data.GetOpcode())).c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
bool hasMovementFlags = false;
|
||||
bool hasMovementFlags2 = false;
|
||||
bool hasTimestamp = false;
|
||||
bool hasOrientation = false;
|
||||
bool hasTransportData = false;
|
||||
bool hasTransportPrevTime = false;
|
||||
bool hasTransportVehicleId = false;
|
||||
bool hasPitch = false;
|
||||
bool hasFallData = false;
|
||||
bool hasFallDirection = false;
|
||||
bool hasSplineElevation = false;
|
||||
|
||||
ObjectGuid guid;
|
||||
ObjectGuid tguid;
|
||||
|
||||
for (; *sequence != MSEEnd; ++sequence)
|
||||
{
|
||||
MovementStatusElements const& element = *sequence;
|
||||
|
||||
switch (element)
|
||||
{
|
||||
case MSEHasGuidByte0:
|
||||
case MSEHasGuidByte1:
|
||||
case MSEHasGuidByte2:
|
||||
case MSEHasGuidByte3:
|
||||
case MSEHasGuidByte4:
|
||||
case MSEHasGuidByte5:
|
||||
case MSEHasGuidByte6:
|
||||
case MSEHasGuidByte7:
|
||||
guid[element - MSEHasGuidByte0] = data.ReadBit();
|
||||
break;
|
||||
case MSEHasTransportGuidByte0:
|
||||
case MSEHasTransportGuidByte1:
|
||||
case MSEHasTransportGuidByte2:
|
||||
case MSEHasTransportGuidByte3:
|
||||
case MSEHasTransportGuidByte4:
|
||||
case MSEHasTransportGuidByte5:
|
||||
case MSEHasTransportGuidByte6:
|
||||
case MSEHasTransportGuidByte7:
|
||||
if (hasTransportData)
|
||||
tguid[element - MSEHasTransportGuidByte0] = data.ReadBit();
|
||||
break;
|
||||
case MSEGuidByte0:
|
||||
case MSEGuidByte1:
|
||||
case MSEGuidByte2:
|
||||
case MSEGuidByte3:
|
||||
case MSEGuidByte4:
|
||||
case MSEGuidByte5:
|
||||
case MSEGuidByte6:
|
||||
case MSEGuidByte7:
|
||||
data.ReadByteSeq(guid[element - MSEGuidByte0]);
|
||||
break;
|
||||
case MSETransportGuidByte0:
|
||||
case MSETransportGuidByte1:
|
||||
case MSETransportGuidByte2:
|
||||
case MSETransportGuidByte3:
|
||||
case MSETransportGuidByte4:
|
||||
case MSETransportGuidByte5:
|
||||
case MSETransportGuidByte6:
|
||||
case MSETransportGuidByte7:
|
||||
if (hasTransportData)
|
||||
data.ReadByteSeq(tguid[element - MSETransportGuidByte0]);
|
||||
break;
|
||||
case MSEHasMovementFlags:
|
||||
hasMovementFlags = !data.ReadBit();
|
||||
break;
|
||||
case MSEHasMovementFlags2:
|
||||
hasMovementFlags2 = !data.ReadBit();
|
||||
break;
|
||||
case MSEHasTimestamp:
|
||||
hasTimestamp = !data.ReadBit();
|
||||
break;
|
||||
case MSEHasOrientation:
|
||||
hasOrientation = !data.ReadBit();
|
||||
break;
|
||||
case MSEHasTransportData:
|
||||
hasTransportData = data.ReadBit();
|
||||
break;
|
||||
case MSEHasTransportPrevTime:
|
||||
if (hasTransportData)
|
||||
hasTransportPrevTime = data.ReadBit();
|
||||
break;
|
||||
case MSEHasTransportVehicleId:
|
||||
if (hasTransportData)
|
||||
hasTransportVehicleId = data.ReadBit();
|
||||
break;
|
||||
case MSEHasPitch:
|
||||
hasPitch = !data.ReadBit();
|
||||
break;
|
||||
case MSEHasFallData:
|
||||
hasFallData = data.ReadBit();
|
||||
break;
|
||||
case MSEHasFallDirection:
|
||||
if (hasFallData)
|
||||
hasFallDirection = data.ReadBit();
|
||||
break;
|
||||
case MSEHasSplineElevation:
|
||||
hasSplineElevation = !data.ReadBit();
|
||||
break;
|
||||
case MSEHasSpline:
|
||||
data.ReadBit();
|
||||
break;
|
||||
case MSEMovementFlags:
|
||||
if (hasMovementFlags)
|
||||
mi->flags = data.ReadBits(30);
|
||||
break;
|
||||
case MSEMovementFlags2:
|
||||
if (hasMovementFlags2)
|
||||
mi->flags2 = data.ReadBits(12);
|
||||
break;
|
||||
case MSETimestamp:
|
||||
if (hasTimestamp)
|
||||
data >> mi->time;
|
||||
break;
|
||||
case MSEPositionX:
|
||||
data >> mi->pos.m_positionX;
|
||||
break;
|
||||
case MSEPositionY:
|
||||
data >> mi->pos.m_positionY;
|
||||
break;
|
||||
case MSEPositionZ:
|
||||
data >> mi->pos.m_positionZ;
|
||||
break;
|
||||
case MSEOrientation:
|
||||
if (hasOrientation)
|
||||
mi->pos.SetOrientation(data.read<float>());
|
||||
break;
|
||||
case MSETransportPositionX:
|
||||
if (hasTransportData)
|
||||
data >> mi->transport.pos.m_positionX;
|
||||
break;
|
||||
case MSETransportPositionY:
|
||||
if (hasTransportData)
|
||||
data >> mi->transport.pos.m_positionY;
|
||||
break;
|
||||
case MSETransportPositionZ:
|
||||
if (hasTransportData)
|
||||
data >> mi->transport.pos.m_positionZ;
|
||||
break;
|
||||
case MSETransportOrientation:
|
||||
if (hasTransportData)
|
||||
mi->transport.pos.SetOrientation(data.read<float>());
|
||||
break;
|
||||
case MSETransportSeat:
|
||||
if (hasTransportData)
|
||||
data >> mi->transport.seat;
|
||||
break;
|
||||
case MSETransportTime:
|
||||
if (hasTransportData)
|
||||
data >> mi->transport.time;
|
||||
break;
|
||||
case MSETransportPrevTime:
|
||||
if (hasTransportData && hasTransportPrevTime)
|
||||
data >> mi->transport.prevTime;
|
||||
break;
|
||||
case MSETransportVehicleId:
|
||||
if (hasTransportData && hasTransportVehicleId)
|
||||
data >> mi->transport.vehicleId;
|
||||
break;
|
||||
case MSEPitch:
|
||||
if (hasPitch)
|
||||
mi->pitch = G3D::wrap(data.read<float>(), float(-M_PI), float(M_PI));
|
||||
break;
|
||||
case MSEFallTime:
|
||||
if (hasFallData)
|
||||
data >> mi->jump.fallTime;
|
||||
break;
|
||||
case MSEFallVerticalSpeed:
|
||||
if (hasFallData)
|
||||
data >> mi->jump.zspeed;
|
||||
break;
|
||||
case MSEFallCosAngle:
|
||||
if (hasFallData && hasFallDirection)
|
||||
data >> mi->jump.cosAngle;
|
||||
break;
|
||||
case MSEFallSinAngle:
|
||||
if (hasFallData && hasFallDirection)
|
||||
data >> mi->jump.sinAngle;
|
||||
break;
|
||||
case MSEFallHorizontalSpeed:
|
||||
if (hasFallData && hasFallDirection)
|
||||
data >> mi->jump.xyspeed;
|
||||
break;
|
||||
case MSESplineElevation:
|
||||
if (hasSplineElevation)
|
||||
data >> mi->splineElevation;
|
||||
break;
|
||||
case MSECounter:
|
||||
data.read_skip<uint32>(); /// @TODO: Maybe compare it with m_movementCounter to verify that packets are sent & received in order?
|
||||
break;
|
||||
case MSEZeroBit:
|
||||
case MSEOneBit:
|
||||
data.ReadBit();
|
||||
break;
|
||||
case MSEExtraElement:
|
||||
extras->ReadNextElement(data);
|
||||
break;
|
||||
default:
|
||||
ASSERT(Movement::PrintInvalidSequenceElement(element, __FUNCTION__));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
mi->guid = guid;
|
||||
mi->transport.guid = tguid;
|
||||
|
||||
//! Anti-cheat checks. Please keep them in seperate if () blocks to maintain a clear overview.
|
||||
//! Might be subject to latency, so just remove improper flags.
|
||||
#ifdef TRINITY_DEBUG
|
||||
@@ -26492,7 +26279,7 @@ void Player::ReadMovementInfo(WorldPacket& data, MovementInfo* mi, Movement::Ext
|
||||
{ \
|
||||
if (check) \
|
||||
{ \
|
||||
TC_LOG_DEBUG("entities.unit", "Player::ReadMovementInfo: Violation of MovementFlags found (%s). " \
|
||||
TC_LOG_DEBUG("entities.unit", "Player::ValidateMovementInfo: Violation of MovementFlags found (%s). " \
|
||||
"MovementFlags: %u, MovementFlags2: %u for player %s. Mask %u will be removed.", \
|
||||
STRINGIZE(check), mi->GetMovementFlags(), mi->GetExtraMovementFlags(), GetGUID().ToString().c_str(), maskToRemove); \
|
||||
mi->RemoveMovementFlag((maskToRemove)); \
|
||||
@@ -26549,21 +26336,18 @@ void Player::ReadMovementInfo(WorldPacket& data, MovementInfo* mi, Movement::Ext
|
||||
e.g. aerial combat.
|
||||
*/
|
||||
|
||||
REMOVE_VIOLATING_FLAGS(mi->HasMovementFlag(MOVEMENTFLAG_FLYING | MOVEMENTFLAG_CAN_FLY) && ToPlayer()->GetSession()->GetSecurity() == SEC_PLAYER &&
|
||||
!ToPlayer()->m_mover->HasAuraType(SPELL_AURA_FLY) &&
|
||||
!ToPlayer()->m_mover->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED),
|
||||
REMOVE_VIOLATING_FLAGS(mi->HasMovementFlag(MOVEMENTFLAG_FLYING | MOVEMENTFLAG_CAN_FLY) && GetSession()->GetSecurity() == SEC_PLAYER &&
|
||||
!m_mover->HasAuraType(SPELL_AURA_FLY) &&
|
||||
!m_mover->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED),
|
||||
MOVEMENTFLAG_FLYING | MOVEMENTFLAG_CAN_FLY);
|
||||
|
||||
REMOVE_VIOLATING_FLAGS(mi->HasMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY | MOVEMENTFLAG_CAN_FLY) && mi->HasMovementFlag(MOVEMENTFLAG_FALLING),
|
||||
MOVEMENTFLAG_FALLING);
|
||||
|
||||
REMOVE_VIOLATING_FLAGS(mi->HasMovementFlag(MOVEMENTFLAG_FALLING) && (!hasFallData || !hasFallDirection), MOVEMENTFLAG_FALLING);
|
||||
|
||||
REMOVE_VIOLATING_FLAGS(mi->HasMovementFlag(MOVEMENTFLAG_SPLINE_ELEVATION) &&
|
||||
(!hasSplineElevation || G3D::fuzzyEq(mi->splineElevation, 0.0f)), MOVEMENTFLAG_SPLINE_ELEVATION);
|
||||
REMOVE_VIOLATING_FLAGS(mi->HasMovementFlag(MOVEMENTFLAG_SPLINE_ELEVATION) && G3D::fuzzyEq(mi->splineElevation, 0.0f), MOVEMENTFLAG_SPLINE_ELEVATION);
|
||||
|
||||
// Client first checks if spline elevation != 0, then verifies flag presence
|
||||
if (hasSplineElevation)
|
||||
if (G3D::fuzzyNe(mi->splineElevation, 0.0f))
|
||||
mi->AddMovementFlag(MOVEMENTFLAG_SPLINE_ELEVATION);
|
||||
|
||||
#undef REMOVE_VIOLATING_FLAGS
|
||||
|
||||
@@ -2593,7 +2593,7 @@ class Player : public Unit, public GridObject<Player>
|
||||
bool IsInWhisperWhiteList(ObjectGuid guid);
|
||||
void RemoveFromWhisperWhiteList(ObjectGuid guid) { WhisperList.remove(guid); }
|
||||
|
||||
void ReadMovementInfo(WorldPacket& data, MovementInfo* mi, Movement::ExtraMovementStatusElement* extras = NULL);
|
||||
void ValidateMovementInfo(MovementInfo* mi);
|
||||
|
||||
/*! These methods send different packets to the client in apply and unapply case.
|
||||
These methods are only sent to the current unit.
|
||||
|
||||
@@ -887,7 +887,7 @@ void WorldSession::HandleMoveUnRootAck(WorldPacket& recvData)
|
||||
|
||||
MovementInfo movementInfo;
|
||||
movementInfo.guid = guid;
|
||||
ReadMovementInfo(recvData, &movementInfo);
|
||||
ValidateMovementInfo(recvData, &movementInfo);
|
||||
recvData.read_skip<float>(); // unk2
|
||||
*/
|
||||
}
|
||||
@@ -912,7 +912,7 @@ void WorldSession::HandleMoveRootAck(WorldPacket& recvData)
|
||||
recvData.read_skip<uint32>(); // unk
|
||||
|
||||
MovementInfo movementInfo;
|
||||
ReadMovementInfo(recvData, &movementInfo);
|
||||
ValidateMovementInfo(recvData, &movementInfo);
|
||||
*/
|
||||
}
|
||||
|
||||
@@ -1346,7 +1346,7 @@ void WorldSession::HandleMoveSetCanFlyAckOpcode(WorldPacket& recvData)
|
||||
TC_LOG_DEBUG("network", "WORLD: CMSG_MOVE_SET_CAN_FLY_ACK");
|
||||
|
||||
MovementInfo movementInfo;
|
||||
_player->ReadMovementInfo(recvData, &movementInfo);
|
||||
_player->ValidateMovementInfo(&movementInfo);
|
||||
|
||||
_player->m_mover->m_movementInfo.flags = movementInfo.GetMovementFlags();
|
||||
}
|
||||
|
||||
@@ -38,7 +38,6 @@
|
||||
|
||||
void WorldSession::HandleMoveWorldportAckOpcode(WorldPackets::Movement::WorldPortResponse& /*packet*/)
|
||||
{
|
||||
TC_LOG_DEBUG("network", "WORLD: got MSG_MOVE_WORLDPORT_ACK.");
|
||||
HandleMoveWorldportAckOpcode();
|
||||
}
|
||||
|
||||
@@ -252,9 +251,9 @@ void WorldSession::HandleMovementOpcodes(WorldPackets::Movement::ClientPlayerMov
|
||||
|
||||
// ignore, waiting processing in WorldSession::HandleMoveWorldportAckOpcode and WorldSession::HandleMoveTeleportAck
|
||||
if (plrMover && plrMover->IsBeingTeleported())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
GetPlayer()->ValidateMovementInfo(&packet.movementInfo);
|
||||
|
||||
MovementInfo& movementInfo = packet.movementInfo;
|
||||
|
||||
@@ -264,6 +263,7 @@ void WorldSession::HandleMovementOpcodes(WorldPackets::Movement::ClientPlayerMov
|
||||
TC_LOG_ERROR("network", "HandleMovementOpcodes: guid error");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!movementInfo.pos.IsPositionValid())
|
||||
{
|
||||
TC_LOG_ERROR("network", "HandleMovementOpcodes: Invalid Position");
|
||||
@@ -394,6 +394,8 @@ void WorldSession::HandleForceSpeedChangeAck(WorldPackets::Movement::MovementSpe
|
||||
{
|
||||
OpcodeClient opcode = packet.GetOpcode();
|
||||
|
||||
GetPlayer()->ValidateMovementInfo(&packet.movementInfo);
|
||||
|
||||
// now can skip not our packet
|
||||
if (_player->GetGUID() != packet.movementInfo.guid)
|
||||
{
|
||||
@@ -465,8 +467,6 @@ void WorldSession::HandleForceSpeedChangeAck(WorldPackets::Movement::MovementSpe
|
||||
|
||||
void WorldSession::HandleSetActiveMoverOpcode(WorldPackets::Movement::SetActiveMover& packet)
|
||||
{
|
||||
TC_LOG_DEBUG("network", "WORLD: Recvd CMSG_SET_ACTIVE_MOVER");
|
||||
|
||||
if (GetPlayer()->IsInWorld())
|
||||
if (_player->m_mover->GetGUID() != packet.ActiveMover)
|
||||
TC_LOG_DEBUG("network", "HandleSetActiveMoverOpcode: incorrect mover guid: mover is %s and should be %s" , packet.ActiveMover.ToString().c_str(), _player->m_mover->GetGUID().ToString().c_str());
|
||||
@@ -480,49 +480,42 @@ void WorldSession::HandleMountSpecialAnimOpcode(WorldPacket& /*recvData*/)
|
||||
GetPlayer()->SendMessageToSet(&data, false);
|
||||
}
|
||||
|
||||
void WorldSession::HandleMoveKnockBackAck(WorldPacket& recvData)
|
||||
void WorldSession::HandleMoveKnockBackAck(WorldPackets::Movement::MovementAck& movementAck)
|
||||
{
|
||||
TC_LOG_DEBUG("network", "CMSG_MOVE_KNOCK_BACK_ACK");
|
||||
GetPlayer()->ValidateMovementInfo(&movementAck.movementInfo);
|
||||
|
||||
MovementInfo movementInfo;
|
||||
GetPlayer()->ReadMovementInfo(recvData, &movementInfo);
|
||||
|
||||
if (_player->m_mover->GetGUID() != movementInfo.guid)
|
||||
if (_player->m_mover->GetGUID() != movementAck.movementInfo.guid)
|
||||
return;
|
||||
|
||||
_player->m_movementInfo = movementInfo;
|
||||
_player->m_movementInfo = movementAck.movementInfo;
|
||||
|
||||
WorldPacket data(SMSG_MOVE_UPDATE_KNOCK_BACK, 66);
|
||||
_player->WriteMovementInfo(data);
|
||||
_player->SendMessageToSet(&data, false);
|
||||
WorldPackets::Movement::MoveUpdateKnockBack updateKnockBack;
|
||||
updateKnockBack.movementInfo = &_player->m_movementInfo;
|
||||
_player->SendMessageToSet(updateKnockBack.Write(), false);
|
||||
}
|
||||
|
||||
void WorldSession::HandleMoveHoverAck(WorldPacket& recvData)
|
||||
{
|
||||
TC_LOG_DEBUG("network", "CMSG_MOVE_HOVER_ACK");
|
||||
|
||||
ObjectGuid guid; // guid - unused
|
||||
recvData >> guid.ReadAsPacked();
|
||||
|
||||
recvData.read_skip<uint32>(); // unk
|
||||
|
||||
MovementInfo movementInfo;
|
||||
GetPlayer()->ReadMovementInfo(recvData, &movementInfo);
|
||||
GetPlayer()->ValidateMovementInfo(&movementInfo);
|
||||
|
||||
recvData.read_skip<uint32>(); // unk2
|
||||
}
|
||||
|
||||
void WorldSession::HandleMoveWaterWalkAck(WorldPacket& recvData)
|
||||
{
|
||||
TC_LOG_DEBUG("network", "CMSG_MOVE_WATER_WALK_ACK");
|
||||
|
||||
ObjectGuid guid; // guid - unused
|
||||
recvData >> guid.ReadAsPacked();
|
||||
|
||||
recvData.read_skip<uint32>(); // unk
|
||||
|
||||
MovementInfo movementInfo;
|
||||
GetPlayer()->ReadMovementInfo(recvData, &movementInfo);
|
||||
GetPlayer()->ValidateMovementInfo(&movementInfo);
|
||||
|
||||
recvData.read_skip<uint32>(); // unk2
|
||||
}
|
||||
@@ -542,10 +535,8 @@ void WorldSession::HandleSummonResponseOpcode(WorldPacket& recvData)
|
||||
|
||||
void WorldSession::HandleSetCollisionHeightAck(WorldPacket& recvPacket)
|
||||
{
|
||||
TC_LOG_DEBUG("network", "CMSG_MOVE_SET_COLLISION_HEIGHT_ACK");
|
||||
|
||||
static MovementStatusElements const heightElement = MSEExtraFloat;
|
||||
Movement::ExtraMovementStatusElement extra(&heightElement);
|
||||
MovementInfo movementInfo;
|
||||
GetPlayer()->ReadMovementInfo(recvPacket, &movementInfo, &extra);
|
||||
GetPlayer()->ValidateMovementInfo(&movementInfo);
|
||||
}
|
||||
|
||||
@@ -210,7 +210,7 @@ void WorldSession::HandleMoveSplineDoneOpcode(WorldPacket& recvData)
|
||||
recvData.read_skip<uint32>(); // unk
|
||||
|
||||
MovementInfo movementInfo; // used only for proper packet read
|
||||
_player->ReadMovementInfo(recvData, &movementInfo);
|
||||
_player->ValidateMovementInfo(&movementInfo);
|
||||
|
||||
// in taxi flight packet received in 2 case:
|
||||
// 1) end taxi path in far (multi-node) flight
|
||||
|
||||
@@ -37,7 +37,7 @@ void WorldSession::HandleDismissControlledVehicle(WorldPacket &recvData)
|
||||
}
|
||||
|
||||
MovementInfo mi;
|
||||
_player->ReadMovementInfo(recvData, &mi);
|
||||
_player->ValidateMovementInfo(&mi);
|
||||
|
||||
_player->m_movementInfo = mi;
|
||||
|
||||
@@ -97,7 +97,7 @@ void WorldSession::HandleChangeSeatsOnControlledVehicle(WorldPacket& recvData)
|
||||
|
||||
Movement::ExtraMovementStatusElement extra(accessoryGuid);
|
||||
MovementInfo movementInfo;
|
||||
GetPlayer()->ReadMovementInfo(recvData, &movementInfo, &extra);
|
||||
GetPlayer()->ValidateMovementInfo(&movementInfo);
|
||||
vehicle_base->m_movementInfo = movementInfo;
|
||||
|
||||
ObjectGuid accessory = extra.Data.guid;
|
||||
|
||||
@@ -56,6 +56,8 @@ ByteBuffer& operator<<(ByteBuffer& data, MovementInfo& movementInfo)
|
||||
data.WriteBit(0); // HeightChangeFailed
|
||||
data.WriteBit(0); // RemoteTimeValid
|
||||
|
||||
data.FlushBits();
|
||||
|
||||
if (hasTransportData)
|
||||
data << movementInfo.transport;
|
||||
|
||||
@@ -65,6 +67,7 @@ ByteBuffer& operator<<(ByteBuffer& data, MovementInfo& movementInfo)
|
||||
data << movementInfo.jump.zspeed;
|
||||
|
||||
data.WriteBit(hasFallDirection);
|
||||
data.FlushBits();
|
||||
if (hasFallDirection)
|
||||
{
|
||||
data << movementInfo.jump.sinAngle;
|
||||
@@ -73,8 +76,6 @@ ByteBuffer& operator<<(ByteBuffer& data, MovementInfo& movementInfo)
|
||||
}
|
||||
}
|
||||
|
||||
data.FlushBits();
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
@@ -167,14 +168,14 @@ ByteBuffer& operator<<(ByteBuffer& data, MovementInfo::TransportInfo const& tran
|
||||
data.WriteBit(hasPrevTime);
|
||||
data.WriteBit(hasVehicleId);
|
||||
|
||||
data.FlushBits();
|
||||
|
||||
if (hasPrevTime)
|
||||
data << transportInfo.prevTime; // PrevMoveTime
|
||||
|
||||
if (hasVehicleId)
|
||||
data << transportInfo.vehicleId; // VehicleRecID
|
||||
|
||||
data.FlushBits();
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
@@ -620,3 +621,10 @@ WorldPacket const* WorldPackets::Movement::MoveSetActiveMover::Write()
|
||||
|
||||
return &_worldPacket;
|
||||
}
|
||||
|
||||
WorldPacket const* WorldPackets::Movement::MoveUpdateKnockBack::Write()
|
||||
{
|
||||
_worldPacket << *movementInfo;
|
||||
|
||||
return &_worldPacket;
|
||||
}
|
||||
|
||||
@@ -328,6 +328,16 @@ namespace WorldPackets
|
||||
|
||||
ObjectGuid MoverGUID;
|
||||
};
|
||||
|
||||
class MoveUpdateKnockBack final : public ServerPacket
|
||||
{
|
||||
public:
|
||||
MoveUpdateKnockBack() : ServerPacket(SMSG_MOVE_UPDATE_KNOCK_BACK) { }
|
||||
|
||||
WorldPacket const* Write() override;
|
||||
|
||||
MovementInfo* movementInfo = nullptr;
|
||||
};
|
||||
}
|
||||
|
||||
ByteBuffer& operator<<(ByteBuffer& data, Movement::MonsterSplineFilterKey const& monsterSplineFilterKey);
|
||||
|
||||
@@ -498,13 +498,13 @@ void OpcodeTable::Initialize()
|
||||
DEFINE_HANDLER(CMSG_LOOT_UNIT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Loot::LootUnit, &WorldSession::HandleLootOpcode);
|
||||
DEFINE_OPCODE_HANDLER_OLD(CMSG_LOW_LEVEL_RAID1, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
|
||||
DEFINE_OPCODE_HANDLER_OLD(CMSG_LOW_LEVEL_RAID2, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
|
||||
DEFINE_HANDLER(CMSG_MAIL_CREATE_TEXT_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailCreateTextItem, &WorldSession::HandleMailCreateTextItem);
|
||||
DEFINE_HANDLER(CMSG_MAIL_DELETE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailDelete, &WorldSession::HandleMailDelete);
|
||||
DEFINE_HANDLER(CMSG_MAIL_GET_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailGetList, &WorldSession::HandleGetMailList);
|
||||
DEFINE_HANDLER(CMSG_MAIL_MARK_AS_READ, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailMarkAsRead, &WorldSession::HandleMailMarkAsRead);
|
||||
DEFINE_HANDLER(CMSG_MAIL_RETURN_TO_SENDER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailReturnToSender, &WorldSession::HandleMailReturnToSender);
|
||||
DEFINE_HANDLER(CMSG_MAIL_TAKE_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailTakeItem, &WorldSession::HandleMailTakeItem);
|
||||
DEFINE_HANDLER(CMSG_MAIL_TAKE_MONEY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailTakeMoney, &WorldSession::HandleMailTakeMoney);
|
||||
DEFINE_HANDLER(CMSG_MAIL_CREATE_TEXT_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailCreateTextItem, &WorldSession::HandleMailCreateTextItem);
|
||||
DEFINE_HANDLER(CMSG_MAIL_DELETE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailDelete, &WorldSession::HandleMailDelete);
|
||||
DEFINE_HANDLER(CMSG_MAIL_GET_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailGetList, &WorldSession::HandleGetMailList);
|
||||
DEFINE_HANDLER(CMSG_MAIL_MARK_AS_READ, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailMarkAsRead, &WorldSession::HandleMailMarkAsRead);
|
||||
DEFINE_HANDLER(CMSG_MAIL_RETURN_TO_SENDER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailReturnToSender, &WorldSession::HandleMailReturnToSender);
|
||||
DEFINE_HANDLER(CMSG_MAIL_TAKE_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailTakeItem, &WorldSession::HandleMailTakeItem);
|
||||
DEFINE_HANDLER(CMSG_MAIL_TAKE_MONEY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailTakeMoney, &WorldSession::HandleMailTakeMoney);
|
||||
DEFINE_OPCODE_HANDLER_OLD(CMSG_MASTER_LOOT_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLootMasterGiveOpcode );
|
||||
DEFINE_OPCODE_HANDLER_OLD(CMSG_MINIMAP_PING, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMinimapPingOpcode );
|
||||
DEFINE_OPCODE_HANDLER_OLD(CMSG_MISSILE_TRAJECTORY_COLLISION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateProjectilePosition );
|
||||
@@ -535,7 +535,7 @@ void OpcodeTable::Initialize()
|
||||
DEFINE_HANDLER(CMSG_MOVE_HEARTBEAT, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes);
|
||||
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_HOVER_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleMoveHoverAck );
|
||||
DEFINE_HANDLER(CMSG_MOVE_JUMP, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes);
|
||||
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_KNOCK_BACK_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleMoveKnockBackAck );
|
||||
DEFINE_HANDLER(CMSG_MOVE_KNOCK_BACK_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::MovementAck, &WorldSession::HandleMoveKnockBackAck);
|
||||
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_REMOVE_MOVEMENT_FORCES, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL );
|
||||
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_REMOVE_MOVEMENT_FORCE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL );
|
||||
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_SET_CAN_FLY_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleMoveSetCanFlyAckOpcode );
|
||||
@@ -1386,12 +1386,12 @@ void OpcodeTable::Initialize()
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_CAN_TURN_WHILE_FALLING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_HOVERING, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_IGNORE_MOVEMENT_FORCES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_APPLY_MOVEMENT_FORCE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_COLLISION_HEIGHT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_FLIGHT_BACK_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_FLIGHT_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_KNOCK_BACK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_KNOCK_BACK, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_PITCH_RATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_REMOVE_MOVEMENT_FORCE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_RUN_BACK_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
|
||||
|
||||
@@ -863,7 +863,7 @@ class WorldSession
|
||||
void HandleRepairItemOpcode(WorldPackets::Item::RepairItem& packet);
|
||||
|
||||
// Knockback
|
||||
void HandleMoveKnockBackAck(WorldPacket& recvPacket);
|
||||
void HandleMoveKnockBackAck(WorldPackets::Movement::MovementAck& movementAck);
|
||||
|
||||
void HandleMoveTeleportAck(WorldPackets::Movement::MoveTeleportAck& packet);
|
||||
void HandleForceSpeedChangeAck(WorldPackets::Movement::MovementSpeedAck& packet);
|
||||
|
||||
Reference in New Issue
Block a user