aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRat <gmstreetrat@gmail.com>2012-01-20 14:34:04 +0100
committerRat <gmstreetrat@gmail.com>2012-01-20 14:34:04 +0100
commit6cd52e7e027c325fad16c295dc83bd70da9d2ded (patch)
tree2a10ef948a9dc14f8fad2e1894c71f1daa40c185
parent7d2c5d263d5a8b5681cb1f900e4519712f090468 (diff)
Core/Movement: Fixed short-range teleportation, needs more testing
-added structure for CMSG_MOVE_TIME_SKIPPED, still need to implement the time synch
-rwxr-xr-xsrc/server/game/Entities/Player/Player.cpp46
-rwxr-xr-xsrc/server/game/Entities/Player/Player.h1
-rwxr-xr-xsrc/server/game/Server/Protocol/Handlers/MiscHandler.cpp25
-rwxr-xr-xsrc/server/game/Server/Protocol/Handlers/MovementHandler.cpp18
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp4
-rwxr-xr-xsrc/server/game/Spells/SpellEffects.cpp2
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
{