Core/Movement: Fixed short-range teleportation, needs more testing

-added structure for CMSG_MOVE_TIME_SKIPPED, still need to implement the time synch
This commit is contained in:
Rat
2012-01-20 14:34:04 +01:00
parent 7d2c5d263d
commit 6cd52e7e02
6 changed files with 70 additions and 26 deletions
+32 -14
View File
@@ -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
}
}
-1
View File
@@ -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();
@@ -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;
@@ -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);
+2 -2
View File
@@ -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 );
+1 -1
View File
@@ -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
{