Core/PacketIO: Updated and enabled MSG_MOVE_TELEPORT, MSG_MOVE_TELEPORT_ACK, MSG_MOVE_WORLDPORT_ACK, SMSG_NEW_WORLD and SMSG_TRANSFER_PENDING

This commit is contained in:
Shauren
2012-07-17 19:29:18 +02:00
parent 19759a139c
commit 953f093920
6 changed files with 102 additions and 116 deletions
+63 -88
View File
@@ -2039,89 +2039,64 @@ uint8 Player::GetChatTag() const
void Player::SendTeleportPacket(Position &oldPos)
{
WorldPacket data(SMSG_MOVE_TELEPORT, 38);
ObjectGuid guid = GetGUID();
ObjectGuid transGuid = GetTransGUID();
uint64 guid = GetGUID();
uint8* bytes = (uint8*)&guid;
WorldPacket data(MSG_MOVE_TELEPORT, 38);
data.WriteBit(guid[6]);
data.WriteBit(guid[0]);
data.WriteBit(guid[3]);
data.WriteBit(guid[2]);
data.WriteBit(0); // unknown
data.WriteBit(uint64(transGuid));
data.WriteBit(guid[1]);
if (transGuid)
{
data.WriteBit(transGuid[1]);
data.WriteBit(transGuid[3]);
data.WriteBit(transGuid[2]);
data.WriteBit(transGuid[5]);
data.WriteBit(transGuid[0]);
data.WriteBit(transGuid[7]);
data.WriteBit(transGuid[6]);
data.WriteBit(transGuid[4]);
}
data.WriteBit(GetTransGUID());
data.WriteBit(bytes[0]);
data.WriteBit(bytes[2]);
data.WriteBit(bytes[6]);
data.WriteBit(bytes[7]);
data.WriteBit(bytes[4]);
data.WriteBit(bytes[5]);
data.WriteBit(bytes[3]);
data.WriteBit(bytes[1]);
data.WriteBit(0); //unk byte's bit
data << GetPositionX();
data << GetPositionY();
data << GetPositionZ();
data.WriteByteSeq(bytes[5]);
data.WriteByteSeq(bytes[4]);
if (GetTransGUID()) data << GetTransGUID();
data.WriteByteSeq(bytes[2]);
data.WriteByteSeq(bytes[7]);
data << uint32(0); //unk int
data.WriteByteSeq(bytes[1]);
data.WriteByteSeq(bytes[0]);
data.WriteByteSeq(bytes[6]);
data.WriteByteSeq(bytes[3]);
// unk byte, only if bit is set
data << GetOrientation();
data.WriteBit(guid[4]);
data.WriteBit(guid[7]);
data.WriteBit(guid[5]);
data.FlushBits();
if (transGuid)
{
data.WriteByteSeq(transGuid[6]);
data.WriteByteSeq(transGuid[5]);
data.WriteByteSeq(transGuid[1]);
data.WriteByteSeq(transGuid[7]);
data.WriteByteSeq(transGuid[0]);
data.WriteByteSeq(transGuid[2]);
data.WriteByteSeq(transGuid[4]);
data.WriteByteSeq(transGuid[3]);
}
data << uint32(0); // counter
data.WriteByteSeq(guid[1]);
data.WriteByteSeq(guid[2]);
data.WriteByteSeq(guid[3]);
data.WriteByteSeq(guid[5]);
data << float(GetPositionX());
data.WriteByteSeq(guid[4]);
data << float(GetOrientation());
data.WriteByteSeq(guid[7]);
data << float(GetPositionZMinusOffset());
data.WriteByteSeq(guid[0]);
data.WriteByteSeq(guid[6]);
data << float(GetPositionY());
Relocate(&oldPos);
SendDirectMessage(&data);
}
void Player::SendSetFlyPacket(bool apply)
{
WorldPacket data(apply ? SMSG_MOVE_SET_CAN_FLY : SMSG_MOVE_UNSET_CAN_FLY, 12);
uint64 guid = GetGUID();
uint8* bytes = (uint8*)&guid;
if (apply)
{
data.WriteBit(bytes[4]);
data.WriteBit(bytes[3]);
data.WriteBit(bytes[6]);
data.WriteBit(bytes[0]);
data.WriteBit(bytes[1]);
data.WriteBit(bytes[2]);
data.WriteBit(bytes[7]);
data.WriteBit(bytes[5]);
data.WriteByteSeq(bytes[3]);
data.WriteByteSeq(bytes[7]);
data.WriteByteSeq(bytes[5]);
data.WriteByteSeq(bytes[0]);
data.WriteByteSeq(bytes[1]);
data.WriteByteSeq(bytes[4]);
data << uint32(sWorld->GetGameTime());
data.WriteByteSeq(bytes[6]);
data.WriteByteSeq(bytes[2]);
}
else
{
data.WriteBit(bytes[1]);
data.WriteBit(bytes[6]);
data.WriteBit(bytes[0]);
data.WriteBit(bytes[2]);
data.WriteBit(bytes[4]);
data.WriteBit(bytes[5]);
data.WriteBit(bytes[7]);
data.WriteBit(bytes[3]);
data.WriteByteSeq(bytes[7]);
data.WriteByteSeq(bytes[6]);
data.WriteByteSeq(bytes[5]);
data.WriteByteSeq(bytes[0]);
data << uint32(sWorld->GetGameTime());
data.WriteByteSeq(bytes[3]);
data.WriteByteSeq(bytes[1]);
data.WriteByteSeq(bytes[2]);
data.WriteByteSeq(bytes[4]);
}
SendDirectMessage(&data);
}
bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options)
{
if (!MapManager::IsValidMapCoord(mapid, x, y, z, orientation))
@@ -2316,10 +2291,16 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati
{
// send transfer packets
WorldPacket data(SMSG_TRANSFER_PENDING, 4 + 4 + 4);
data << uint32(mapid);
data.WriteBit(0); // unknown
if (m_transport)
data << m_transport->GetEntry() << GetMapId();
{
data.WriteBit(1); // has transport
data << GetMapId() << m_transport->GetEntry();
}
else
data.WriteBit(0); // has transport
data << uint32(mapid);
GetSession()->SendPacket(&data);
}
@@ -2349,17 +2330,11 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati
if (!GetSession()->PlayerLogout())
{
WorldPacket data(SMSG_NEW_WORLD, 4 + 4 + 4 + 4 + 4);
if (m_transport)
data << m_movementInfo.t_pos.PositionXYZStream();
else
data << m_teleport_dest.PositionXYZStream();
data << float(m_teleport_dest.GetPositionX());
data << float(m_teleport_dest.GetOrientation());
data << float(m_teleport_dest.GetPositionZ());
data << uint32(mapid);
if (m_transport)
data << m_movementInfo.t_pos.GetOrientation();
else
data << m_teleport_dest.GetOrientation();
data << float(m_teleport_dest.GetPositionY());
GetSession()->SendPacket(&data);
SendSavedInstances();
-1
View File
@@ -2024,7 +2024,6 @@ class Player : public Unit, public GridObject<Player>
void SendMessageToSet(WorldPacket* data, Player const* skipped_rcvr);
void SendTeleportPacket(Position &oldPos);
void SendSetFlyPacket(bool apply);
Corpse* GetCorpse() const;
void SpawnCorpseBones();
+30 -17
View File
@@ -32,9 +32,9 @@
#include "ObjectMgr.h"
#include "MovementStructures.h"
void WorldSession::HandleMoveWorldportAckOpcode(WorldPacket & /*recv_data*/)
void WorldSession::HandleMoveWorldportAckOpcode(WorldPacket& /*recvPacket*/)
{
sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: got CMSG_WORLD_PORT_RESPONSE.");
sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: got MSG_MOVE_WORLDPORT_ACK.");
HandleMoveWorldportAckOpcode();
}
@@ -188,20 +188,33 @@ void WorldSession::HandleMoveWorldportAckOpcode()
GetPlayer()->ProcessDelayedOperations();
}
void WorldSession::HandleMoveTeleportAck(WorldPacket& recv_data)
void WorldSession::HandleMoveTeleportAck(WorldPacket& recvPacket)
{
sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_MOVE_TELEPORT_ACK");
recv_data.rfinish();
return;
sLog->outDebug(LOG_FILTER_NETWORKIO, "MSG_MOVE_TELEPORT_ACK");
ObjectGuid guid;
uint32 flags, time;
recv_data >> flags >> time;
recvPacket >> flags >> time;
guid[5] = recvPacket.ReadBit();
guid[0] = recvPacket.ReadBit();
guid[1] = recvPacket.ReadBit();
guid[6] = recvPacket.ReadBit();
guid[3] = recvPacket.ReadBit();
guid[7] = recvPacket.ReadBit();
guid[2] = recvPacket.ReadBit();
guid[4] = recvPacket.ReadBit();
uint64 guid = 0;
recvPacket.ReadByteSeq(guid[4]);
recvPacket.ReadByteSeq(guid[2]);
recvPacket.ReadByteSeq(guid[7]);
recvPacket.ReadByteSeq(guid[6]);
recvPacket.ReadByteSeq(guid[5]);
recvPacket.ReadByteSeq(guid[1]);
recvPacket.ReadByteSeq(guid[3]);
recvPacket.ReadByteSeq(guid[0]);
sLog->outStaticDebug("Guid " UI64FMTD, guid);
sLog->outStaticDebug("Guid " UI64FMTD, uint64(guid));
sLog->outStaticDebug("Flags %u, time %u", flags, time/IN_MILLISECONDS);
Player* plMover = _player->m_mover->ToPlayer();
@@ -243,9 +256,9 @@ void WorldSession::HandleMoveTeleportAck(WorldPacket& recv_data)
GetPlayer()->ProcessDelayedOperations();
}
void WorldSession::HandleMovementOpcodes(WorldPacket & recvData)
void WorldSession::HandleMovementOpcodes(WorldPacket& recvPacket)
{
uint16 opcode = recvData.GetOpcode();
uint16 opcode = recvPacket.GetOpcode();
Unit* mover = _player->m_mover;
@@ -256,13 +269,13 @@ void WorldSession::HandleMovementOpcodes(WorldPacket & recvData)
// ignore, waiting processing in WorldSession::HandleMoveWorldportAckOpcode and WorldSession::HandleMoveTeleportAck
if (plrMover && plrMover->IsBeingTeleported())
{
recvData.rfinish(); // prevent warnings spam
recvPacket.rfinish(); // prevent warnings spam
return;
}
/* extract packet */
MovementInfo movementInfo;
ReadMovementInfo(recvData, &movementInfo);
ReadMovementInfo(recvPacket, &movementInfo);
// prevent tampered movement data
if (movementInfo.guid != mover->GetGUID())
@@ -283,14 +296,14 @@ void WorldSession::HandleMovementOpcodes(WorldPacket & recvData)
// (also received at zeppelin leave by some reason with t_* as absolute in continent coordinates, can be safely skipped)
if (movementInfo.t_pos.GetPositionX() > 50 || movementInfo.t_pos.GetPositionY() > 50 || movementInfo.t_pos.GetPositionZ() > 50)
{
recvData.rfinish(); // prevent warnings spam
recvPacket.rfinish(); // prevent warnings spam
return;
}
if (!Trinity::IsValidMapCoord(movementInfo.pos.GetPositionX() + movementInfo.t_pos.GetPositionX(), movementInfo.pos.GetPositionY() + movementInfo.t_pos.GetPositionY(),
movementInfo.pos.GetPositionZ() + movementInfo.t_pos.GetPositionZ(), movementInfo.pos.GetOrientation() + movementInfo.t_pos.GetOrientation()))
{
recvData.rfinish(); // prevent warnings spam
recvPacket.rfinish(); // prevent warnings spam
return;
}
@@ -364,7 +377,7 @@ void WorldSession::HandleMovementOpcodes(WorldPacket & recvData)
/*----------------------*/
/* process position-change */
WorldPacket data(SMSG_PLAYER_MOVE, recvData.size());
WorldPacket data(SMSG_PLAYER_MOVE, recvPacket.size());
movementInfo.time = getMSTime();
movementInfo.guid = mover->GetGUID();
WriteMovementInfo(data, &movementInfo);
+6 -5
View File
@@ -455,8 +455,6 @@ void InitOpcodes()
//DEFINE_OPCODE_HANDLER(CMSG_MOVE_SPLINE_DONE, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveSplineDoneOpcode );
//DEFINE_OPCODE_HANDLER(CMSG_MOVE_START_SWIM_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(CMSG_MOVE_STOP_SWIM_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(CMSG_MOVE_TELEPORT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveTeleportAck );
//DEFINE_OPCODE_HANDLER(CMSG_MOVE_TELEPORT_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(CMSG_MOVE_TIME_SKIPPED, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleMoveTimeSkippedOpcode );
//DEFINE_OPCODE_HANDLER(CMSG_MOVE_WATER_WALK_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveWaterWalkAck );
//DEFINE_OPCODE_HANDLER(CMSG_NAME_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleNameQueryOpcode );
@@ -682,7 +680,6 @@ void InitOpcodes()
//DEFINE_OPCODE_HANDLER(CMSG_WEATHER_SPEED_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(CMSG_WHO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleWhoOpcode );
//DEFINE_OPCODE_HANDLER(CMSG_WHOIS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleWhoisOpcode );
//DEFINE_OPCODE_HANDLER(CMSG_WORLD_PORT_RESPONSE, STATUS_TRANSFER, PROCESS_THREADUNSAFE, &WorldSession::HandleMoveWorldportAckOpcode );
//DEFINE_OPCODE_HANDLER(CMSG_WORLD_STATE_UI_TIMER_UPDATE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleWorldStateUITimerUpdate );
//DEFINE_OPCODE_HANDLER(CMSG_WORLD_TELEPORT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleWorldTeleportOpcode );
//DEFINE_OPCODE_HANDLER(CMSG_WRAP_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleWrapItemOpcode );
@@ -750,6 +747,9 @@ void InitOpcodes()
DEFINE_OPCODE_HANDLER(MSG_MOVE_STOP_SWIM, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
//DEFINE_OPCODE_HANDLER(MSG_MOVE_STOP_SWIM_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER(MSG_MOVE_STOP_TURN, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
DEFINE_OPCODE_HANDLER(MSG_MOVE_TELEPORT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER(MSG_MOVE_TELEPORT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveTeleportAck );
//DEFINE_OPCODE_HANDLER(MSG_MOVE_TELEPORT_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(MSG_MOVE_TOGGLE_COLLISION_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(MSG_MOVE_TOGGLE_FALL_LOGGING, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(MSG_MOVE_TOGGLE_LOGGING, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
@@ -757,6 +757,7 @@ void InitOpcodes()
//DEFINE_OPCODE_HANDLER(MSG_MOVE_UPDATE_CAN_FLY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(MSG_MOVE_UPDATE_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(MSG_MOVE_WATER_WALK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER(MSG_MOVE_WORLDPORT_ACK, STATUS_TRANSFER, PROCESS_THREADUNSAFE, &WorldSession::HandleMoveWorldportAckOpcode );
//DEFINE_OPCODE_HANDLER(MSG_NOTIFY_PARTY_SQUELCH, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(MSG_NULL_ACTION, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(MSG_PARTY_ASSIGNMENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePartyAssignmentOpcode );
@@ -1129,7 +1130,7 @@ void InitOpcodes()
//DEFINE_OPCODE_HANDLER(SMSG_MULTIPLE_PACKETS, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_NAME_QUERY_RESPONSE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_NEW_TAXI_PATH, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_NEW_WORLD, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
DEFINE_OPCODE_HANDLER(SMSG_NEW_WORLD, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
DEFINE_OPCODE_HANDLER(SMSG_NOTIFICATION, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_NOTIFY_DANCE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_NOTIFY_DEST_LOC_SPELL_CAST, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
@@ -1352,7 +1353,7 @@ void InitOpcodes()
//DEFINE_OPCODE_HANDLER(SMSG_TRAINER_BUY_SUCCEEDED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_TRAINER_LIST, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_TRANSFER_ABORTED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_TRANSFER_PENDING, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
DEFINE_OPCODE_HANDLER(SMSG_TRANSFER_PENDING, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_TRIGGER_CINEMATIC, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_TRIGGER_MOVIE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_TURN_IN_PETITION_RESULTS, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
+1 -3
View File
@@ -316,8 +316,6 @@ enum Opcodes
CMSG_MOVE_SET_RELATIVE_POSITION = 0x0000,
CMSG_MOVE_SET_VEHICLE_REC_ID_ACK = 0x0000,
CMSG_MOVE_SPLINE_DONE = 0x790E,
CMSG_MOVE_TELEPORT_ACK = 0x0000,
CMSG_MOVE_TELEPORT_CHEAT = 0x0000,
CMSG_MOVE_TIME_SKIPPED = 0x7A0A,
CMSG_MOVE_TOGGLE_COLLISION_ACK = 0x0000,
CMSG_MOVE_WATER_WALK_ACK = 0x0000,
@@ -479,7 +477,6 @@ enum Opcodes
CMSG_WARDEN_DATA = 0x25A2,
CMSG_WHO = 0x6C15,
CMSG_WHOIS = 0x6B05,
CMSG_WORLD_PORT_RESPONSE = 0x2411,
CMSG_WORLD_STATE_UI_TIMER_UPDATE = 0x4605,
CMSG_WORLD_TELEPORT = 0x3330,
CMSG_WRAP_ITEM = 0x0000,
@@ -550,6 +547,7 @@ enum Opcodes
MSG_MOVE_UPDATE_RUN_SPEED = 0x14A6,
MSG_MOVE_UPDATE_TELEPORT = 0x50B2,
MSG_MOVE_WATER_WALK = 0x0000,
MSG_MOVE_WORLDPORT_ACK = 0x2411,
MSG_NOTIFY_PARTY_SQUELCH = 0x0000,
MSG_PARTY_ASSIGNMENT = 0x0000,
MSG_PETITION_DECLINE = 0x31E0,
+2 -2
View File
@@ -98,9 +98,9 @@ public:
WorldPacket data;
if (strncmp(args, "on", 3) == 0)
target->SendSetFlyPacket(true);
target->SendMovementSetCanFly(true);
else if (strncmp(args, "off", 4) == 0)
target->SendSetFlyPacket(false);
target->SendMovementSetCanFly(false);
else
{
handler->SendSysMessage(LANG_USE_BOL);