Core/PacketIO: Enabled CMSG_MOVE_KNOCK_BACK_ACK, SMSG_MOVE_UPDATE_KNOCK_BACK and SMSG_MOVE_UPDATE

This commit is contained in:
Shauren
2015-04-04 23:49:14 +02:00
parent 38b326d27b
commit 14b475e865
10 changed files with 62 additions and 269 deletions

View File

@@ -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

View File

@@ -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.

View File

@@ -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();
}

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);