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:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user