1
0

Handle Teleport Confirmation Packet (#3884)

+ Added code to drop incoming client position packets until the most recent teleport was confirmed.
This commit is contained in:
Lane Kolbly 2017-08-02 09:46:29 -05:00 committed by Tiger Wang
parent 0d0323608d
commit dc49092ae5
2 changed files with 26 additions and 4 deletions

View File

@ -118,6 +118,8 @@ cProtocol_1_9_0::cProtocol_1_9_0(cClientHandle * a_Client, const AString & a_Ser
m_ServerAddress(a_ServerAddress),
m_ServerPort(a_ServerPort),
m_State(a_State),
m_IsTeleportIdConfirmed(true),
m_OutstandingTeleportId(0),
m_ReceivedData(32 KiB),
m_IsEncrypted(false)
{
@ -1043,7 +1045,10 @@ void cProtocol_1_9_0::SendPlayerMoveLook(void)
Pkt.WriteBEFloat(static_cast<float>(Player->GetYaw()));
Pkt.WriteBEFloat(static_cast<float>(Player->GetPitch()));
Pkt.WriteBEUInt8(0);
Pkt.WriteVarInt32(0); // Teleport ID - not implemented here
Pkt.WriteVarInt32(++m_OutstandingTeleportId);
// This teleport ID hasn't been confirmed yet
m_IsTeleportIdConfirmed = false;
}
@ -2413,7 +2418,12 @@ void cProtocol_1_9_0::HandlePacketClientStatus(cByteBuffer & a_ByteBuffer)
void cProtocol_1_9_0::HandleConfirmTeleport(cByteBuffer & a_ByteBuffer)
{
HANDLE_READ(a_ByteBuffer, ReadVarInt32, UInt32, TeleportID);
// We don't actually validate that this packet is sent or anything yet, but it still needs to be read.
// Can we stop throwing away incoming player position packets?
if (TeleportID == m_OutstandingTeleportId)
{
m_IsTeleportIdConfirmed = true;
}
}
@ -2517,7 +2527,11 @@ void cProtocol_1_9_0::HandlePacketPlayerPos(cByteBuffer & a_ByteBuffer)
HANDLE_READ(a_ByteBuffer, ReadBEDouble, double, PosY);
HANDLE_READ(a_ByteBuffer, ReadBEDouble, double, PosZ);
HANDLE_READ(a_ByteBuffer, ReadBool, bool, IsOnGround);
m_Client->HandlePlayerPos(PosX, PosY, PosZ, PosY + (m_Client->GetPlayer()->IsCrouched() ? 1.54 : 1.62), IsOnGround);
if (m_IsTeleportIdConfirmed)
{
m_Client->HandlePlayerPos(PosX, PosY, PosZ, PosY + (m_Client->GetPlayer()->IsCrouched() ? 1.54 : 1.62), IsOnGround);
}
}
@ -2532,7 +2546,11 @@ void cProtocol_1_9_0::HandlePacketPlayerPosLook(cByteBuffer & a_ByteBuffer)
HANDLE_READ(a_ByteBuffer, ReadBEFloat, float, Yaw);
HANDLE_READ(a_ByteBuffer, ReadBEFloat, float, Pitch);
HANDLE_READ(a_ByteBuffer, ReadBool, bool, IsOnGround);
m_Client->HandlePlayerMoveLook(PosX, PosY, PosZ, PosY + 1.62, Yaw, Pitch, IsOnGround);
if (m_IsTeleportIdConfirmed)
{
m_Client->HandlePlayerMoveLook(PosX, PosY, PosZ, PosY + 1.62, Yaw, Pitch, IsOnGround);
}
}

View File

@ -173,6 +173,10 @@ protected:
/** State of the protocol. 1 = status, 2 = login, 3 = game */
UInt32 m_State;
/** The current teleport ID, and whether it has been confirmed by the client */
bool m_IsTeleportIdConfirmed;
UInt32 m_OutstandingTeleportId;
/** Buffer for the received data */
cByteBuffer m_ReceivedData;