diff options
-rwxr-xr-x | src/server/game/Entities/Player/Player.cpp | 46 | ||||
-rwxr-xr-x | src/server/game/Entities/Player/Player.h | 1 | ||||
-rwxr-xr-x | src/server/game/Server/Protocol/Handlers/MiscHandler.cpp | 25 | ||||
-rwxr-xr-x | src/server/game/Server/Protocol/Handlers/MovementHandler.cpp | 18 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 4 | ||||
-rwxr-xr-x | src/server/game/Spells/SpellEffects.cpp | 2 |
6 files changed, 70 insertions, 26 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 61d4121c2e4..30427b2bec0 100755 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2068,20 +2068,39 @@ uint8 Player::GetChatTag() const void Player::SendTeleportPacket(Position &oldPos) { - WorldPacket data2(SMSG_MOVE_TELEPORT, 38); - data2.append(GetPackGUID()); - BuildMovementPacket(&data2); - Relocate(&oldPos); - SendMessageToSet(&data2, false); -} + WorldPacket data(SMSG_MOVE_TELEPORT, 38); + + uint64 guid = GetGUID(); + uint8* bytes = (uint8*)&guid; + + 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(); -void Player::SendTeleportAckPacket() -{ - WorldPacket data(CMSG_MOVE_TELEPORT_ACK, 41); - data.append(GetPackGUID()); - data << uint32(0); // this value increments every time - BuildMovementPacket(&data); - GetSession()->SendPacket(&data); + Relocate(&oldPos); + SendDirectMessage(&data); } bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options) @@ -2195,7 +2214,6 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati Position oldPos; GetPosition(&oldPos); Relocate(x, y, z, orientation); - SendTeleportAckPacket(); SendTeleportPacket(oldPos); // this automatically relocates to oldPos in order to broadcast the packet in the right place } } diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index f27e427b435..9c8f60b3abc 100755 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1983,7 +1983,6 @@ class Player : public Unit, public GridObject<Player> void SendMessageToSet(WorldPacket* data, Player const* skipped_rcvr); void SendTeleportPacket(Position &oldPos); - void SendTeleportAckPacket(); Corpse* GetCorpse() const; void SpawnCorpseBones(); diff --git a/src/server/game/Server/Protocol/Handlers/MiscHandler.cpp b/src/server/game/Server/Protocol/Handlers/MiscHandler.cpp index 898db683c0a..fac568b9857 100755 --- a/src/server/game/Server/Protocol/Handlers/MiscHandler.cpp +++ b/src/server/game/Server/Protocol/Handlers/MiscHandler.cpp @@ -1078,12 +1078,27 @@ void WorldSession::HandleNextCinematicCamera(WorldPacket & /*recv_data*/) void WorldSession::HandleMoveTimeSkippedOpcode(WorldPacket & recv_data) { - /* WorldSession::Update(getMSTime());*/ - sLog->outStaticDebug("WORLD: Time Lag/Synchronization Resent/Update"); + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_MOVE_TIME_SKIPPED"); + + BitStream mask = recv_data.ReadBitStream(8); + + uint32 time; + recv_data >> time; + + ByteBuffer bytes(8, true); + recv_data.ReadXorByte(mask[0], bytes[1]); + recv_data.ReadXorByte(mask[1], bytes[4]); + recv_data.ReadXorByte(mask[7], bytes[2]); + recv_data.ReadXorByte(mask[5], bytes[5]); + recv_data.ReadXorByte(mask[3], bytes[0]); + recv_data.ReadXorByte(mask[6], bytes[7]); + recv_data.ReadXorByte(mask[2], bytes[6]); + recv_data.ReadXorByte(mask[4], bytes[3]); + + uint64 guid = BitConverter::ToUInt64(bytes); + + //TODO! - uint64 guid; - recv_data.readPackGUID(guid); - recv_data.read_skip<uint32>(); /* uint64 guid; uint32 time_skipped; diff --git a/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp b/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp index 9fc429f1321..b23a73dc9bb 100755 --- a/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp +++ b/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp @@ -192,12 +192,24 @@ void WorldSession::HandleMoveWorldportAckOpcode() void WorldSession::HandleMoveTeleportAck(WorldPacket& recv_data) { sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_MOVE_TELEPORT_ACK"); - uint64 guid; - - recv_data.readPackGUID(guid); + BitStream mask = recv_data.ReadBitStream(8); + uint32 flags, time; recv_data >> flags >> time; + + ByteBuffer bytes(8, true); + recv_data.ReadXorByte(mask[6], bytes[1]); + recv_data.ReadXorByte(mask[0], bytes[3]); + recv_data.ReadXorByte(mask[1], bytes[2]); + recv_data.ReadXorByte(mask[7], bytes[0]); + recv_data.ReadXorByte(mask[5], bytes[6]); + recv_data.ReadXorByte(mask[3], bytes[4]); + recv_data.ReadXorByte(mask[2], bytes[7]); + recv_data.ReadXorByte(mask[4], bytes[5]); + + uint64 guid = BitConverter::ToUInt64(bytes); + sLog->outStaticDebug("Guid " UI64FMTD, guid); sLog->outStaticDebug("Flags %u, time %u", flags, time/IN_MILLISECONDS); diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 209099a3c7f..41ddddaaf1d 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -258,9 +258,9 @@ void InitOpcodes() DEFINE_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_RUN_MODE, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes ); DEFINE_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_WALK_MODE, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes ); //DEFINE_OPCODE_HANDLER(MSG_MOVE_TOGGLE_LOGGING, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - //DEFINE_OPCODE_HANDLER(SMSG_MOVE_TELEPORT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + DEFINE_OPCODE_HANDLER(SMSG_MOVE_TELEPORT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(CMSG_MOVE_TELEPORT_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_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveTeleportAck ); //DEFINE_OPCODE_HANDLER(MSG_MOVE_TOGGLE_FALL_LOGGING, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER(MSG_MOVE_FALL_LAND, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes ); DEFINE_OPCODE_HANDLER(MSG_MOVE_START_SWIM, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes ); diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index c417a14ccd3..86bc68e631d 100755 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -3414,7 +3414,7 @@ void Spell::EffectDistract(SpellEffIndex /*effIndex*/) { // For players just turn them unitTarget->ToPlayer()->UpdatePosition(unitTarget->GetPositionX(), unitTarget->GetPositionY(), unitTarget->GetPositionZ(), angle, false); - unitTarget->ToPlayer()->SendTeleportAckPacket(); + //unitTarget->ToPlayer()->SendTeleportAckPacket(); TODO! } else { |