From 692afbca689176dc685c469cd15b9aaa9b906563 Mon Sep 17 00:00:00 2001 From: "madmaxoft@gmail.com" Date: Wed, 5 Sep 2012 19:06:40 +0000 Subject: ProtoProxy: Added about 10 new packet types parsed git-svn-id: http://mc-server.googlecode.com/svn/trunk@835 0a769ca7-a7f5-676a-18bf-c427514a06d6 --- ProtoProxy/Connection.cpp | 110 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 96 insertions(+), 14 deletions(-) (limited to 'ProtoProxy/Connection.cpp') diff --git a/ProtoProxy/Connection.cpp b/ProtoProxy/Connection.cpp index 7898e4170..42b725ece 100644 --- a/ProtoProxy/Connection.cpp +++ b/ProtoProxy/Connection.cpp @@ -102,7 +102,14 @@ enum PACKET_TIME_UPDATE = 0x04, PACKET_ENTITY_EQUIPMENT = 0x05, PACKET_COMPASS = 0x06, + PACKET_UPDATE_HEALTH = 0x08, + PACKET_PLAYER_ON_GROUND = 0x0a, + PACKET_PLAYER_POSITION = 0x0b, + PACKET_PLAYER_LOOK = 0x0c, PACKET_PLAYER_POSITION_LOOK = 0x0d, + PACKET_MAP_CHUNK = 0x33, + PACKET_WINDOW_CONTENTS = 0x68, + PACKET_PLAYER_LIST_ITEM = 0xc9, PACKET_PLAYER_ABILITIES = 0xca, PACKET_LOCALE_AND_VIEW = 0xcc, PACKET_CLIENT_STATUSES = 0xcd, @@ -127,8 +134,8 @@ cConnection::cConnection(SOCKET a_ClientSocket, cServer & a_Server) : m_BeginTick(clock()), m_ClientState(csUnencrypted), m_ServerState(csUnencrypted), - m_ClientBuffer(64 KiB), - m_ServerBuffer(64 KiB), + m_ClientBuffer(1024 KiB), + m_ServerBuffer(1024 KiB), m_Nonce(0) { AString fnam; @@ -267,7 +274,7 @@ bool cConnection::ConnectToServer(void) bool cConnection::RelayFromServer(void) { - char Buffer[1024]; + char Buffer[64 KiB]; int res = recv(m_ServerSocket, Buffer, sizeof(Buffer), 0); if (res <= 0) { @@ -307,7 +314,7 @@ bool cConnection::RelayFromServer(void) bool cConnection::RelayFromClient(void) { - char Buffer[1024]; + char Buffer[64 KiB]; int res = recv(m_ClientSocket, Buffer, sizeof(Buffer), 0); if (res <= 0) { @@ -386,11 +393,11 @@ bool cConnection::SendData(SOCKET a_Socket, cByteBuffer & a_Data, const char * a bool cConnection::SendEncryptedData(SOCKET a_Socket, Encryptor & a_Encryptor, const char * a_Data, int a_Size, const char * a_Peer) { - DataLog(a_Data, a_Size, "Sending encrypted %d bytes to %s", a_Size, a_Peer); + DataLog(a_Data, a_Size, "Encrypting %d bytes to %s", a_Size, a_Peer); const byte * Data = (const byte *)a_Data; while (a_Size > 0) { - byte Buffer[512]; + byte Buffer[64 KiB]; int NumBytes = (a_Size > sizeof(Buffer)) ? sizeof(Buffer) : a_Size; a_Encryptor.ProcessData(Buffer, Data, NumBytes); bool res = SendData(a_Socket, (const char *)Buffer, NumBytes, a_Peer); @@ -440,11 +447,19 @@ bool cConnection::DecodeClientsPackets(const char * a_Data, int a_Size) case PACKET_HANDSHAKE: HANDLE_CLIENT_READ(HandleClientHandshake); break; case PACKET_LOCALE_AND_VIEW: HANDLE_CLIENT_READ(HandleClientLocaleAndView); break; case PACKET_PING: HANDLE_CLIENT_READ(HandleClientPing); break; + case PACKET_PLAYER_LOOK: HANDLE_CLIENT_READ(HandleClientPlayerLook); break; + case PACKET_PLAYER_ON_GROUND: HANDLE_CLIENT_READ(HandleClientPlayerOnGround); break; + case PACKET_PLAYER_POSITION: HANDLE_CLIENT_READ(HandleClientPlayerPosition); break; + case PACKET_PLAYER_POSITION_LOOK: HANDLE_CLIENT_READ(HandleClientPlayerPositionLook); break; default: { if (m_ClientState == csEncryptedUnderstood) { Log("Unknown packet 0x%02x from the client while encrypted; continuing to relay blind only", PacketType); + AString Data; + m_ClientBuffer.ResetRead(); + m_ClientBuffer.ReadAll(Data); + DataLog(Data.data(), Data.size(), "Current data in the client packet queue: %d bytes", Data.size()); m_ClientState = csEncryptedUnknown; m_ClientBuffer.ResetRead(); if (m_ServerState == csUnencrypted) @@ -496,22 +511,30 @@ bool cConnection::DecodeServersPackets(const char * a_Data, int a_Size) m_ServerBuffer.ReadByte(PacketType); switch (PacketType) { - case PACKET_KEEPALIVE: HANDLE_SERVER_READ(HandleServerKeepAlive); break; - case PACKET_LOGIN: HANDLE_SERVER_READ(HandleServerLogin); break; case PACKET_CHAT_MESSAGE: HANDLE_SERVER_READ(HandleServerChatMessage); break; - case PACKET_TIME_UPDATE: HANDLE_SERVER_READ(HandleServerTimeUpdate); break; - case PACKET_ENTITY_EQUIPMENT: HANDLE_SERVER_READ(HandleServerEntityEquipment); break; case PACKET_COMPASS: HANDLE_SERVER_READ(HandleServerCompass); break; - case PACKET_PLAYER_POSITION_LOOK: HANDLE_SERVER_READ(HandleServerPlayerPositionLook); break; - case PACKET_PLAYER_ABILITIES: HANDLE_SERVER_READ(HandleServerPlayerAbilities); break; case PACKET_ENCRYPTION_KEY_REQUEST: HANDLE_SERVER_READ(HandleServerEncryptionKeyRequest); break; case PACKET_ENCRYPTION_KEY_RESPONSE: HANDLE_SERVER_READ(HandleServerEncryptionKeyResponse); break; + case PACKET_ENTITY_EQUIPMENT: HANDLE_SERVER_READ(HandleServerEntityEquipment); break; + case PACKET_KEEPALIVE: HANDLE_SERVER_READ(HandleServerKeepAlive); break; case PACKET_KICK: HANDLE_SERVER_READ(HandleServerKick); break; + case PACKET_LOGIN: HANDLE_SERVER_READ(HandleServerLogin); break; + case PACKET_MAP_CHUNK: HANDLE_SERVER_READ(HandleServerMapChunk); break; + case PACKET_PLAYER_ABILITIES: HANDLE_SERVER_READ(HandleServerPlayerAbilities); break; + case PACKET_PLAYER_LIST_ITEM: HANDLE_SERVER_READ(HandleServerPlayerListItem); break; + case PACKET_PLAYER_POSITION_LOOK: HANDLE_SERVER_READ(HandleServerPlayerPositionLook); break; + case PACKET_TIME_UPDATE: HANDLE_SERVER_READ(HandleServerTimeUpdate); break; + case PACKET_UPDATE_HEALTH: HANDLE_SERVER_READ(HandleServerUpdateHealth); break; + case PACKET_WINDOW_CONTENTS: HANDLE_SERVER_READ(HandleServerWindowContents); break; default: { if (m_ServerState == csEncryptedUnderstood) { Log("Unknown packet 0x%02x from the server while encrypted; continuing to relay blind only", PacketType); + AString Data; + m_ServerBuffer.ResetRead(); + m_ServerBuffer.ReadAll(Data); + DataLog(Data.data(), Data.size(), "Current data in the server packet queue: %d bytes", Data.size()); m_ServerState = csEncryptedUnknown; m_ServerBuffer.ResetRead(); if (m_ClientState == csUnencrypted) @@ -622,7 +645,7 @@ bool cConnection::HandleClientLocaleAndView(void) bool cConnection::HandleClientPing(void) { - Log("Received a PACKET_PING from the CLIENT"); + Log("Received a PACKET_PING from the client"); m_ClientBuffer.ResetRead(); SERVERSEND(m_ClientBuffer); return true; @@ -632,6 +655,51 @@ bool cConnection::HandleClientPing(void) +bool cConnection::HandleClientPlayerLook(void) +{ + HANDLE_CLIENT_PACKET_READ(ReadBEFloat, float, Yaw); + HANDLE_CLIENT_PACKET_READ(ReadBEFloat, float, Pitch); + HANDLE_CLIENT_PACKET_READ(ReadChar, char, OnGround); + Log("Received a PACKET_PLAYER_LOOK from the client"); + COPY_TO_SERVER(); + return true; +} + + + + + +bool cConnection::HandleClientPlayerOnGround(void) +{ + HANDLE_CLIENT_PACKET_READ(ReadChar, char, OnGround); + Log("Received a PACKET_PLAYER_ON_GROUND from the client"); + COPY_TO_SERVER(); + return true; +} + + + + + +bool cConnection::HandleClientPlayerPosition(void) +{ + HANDLE_CLIENT_PACKET_READ(ReadBEDouble, double, PosX); + HANDLE_CLIENT_PACKET_READ(ReadBEDouble, double, Stance); + HANDLE_CLIENT_PACKET_READ(ReadBEDouble, double, PosY); + HANDLE_CLIENT_PACKET_READ(ReadBEDouble, double, PosZ); + HANDLE_CLIENT_PACKET_READ(ReadChar, char, IsOnGround); + Log("Received a PACKET_PLAYER_POSITION from the client"); + + // TODO: list packet contents + + COPY_TO_CLIENT(); + return true; +} + + + + + bool cConnection::HandleClientPlayerPositionLook(void) { HANDLE_CLIENT_PACKET_READ(ReadBEDouble, double, PosX); @@ -827,7 +895,7 @@ bool cConnection::HandleServerMapChunk(void) } Log("Received a PACKET_MAP_CHUNK from the server:"); Log(" ChunkPos = [%d, %d]", ChunkX, ChunkZ); - Log(" Compressed size = %d", CompressedSize); + Log(" Compressed size = %d (0x%x)", CompressedSize, CompressedSize); // TODO: Save the compressed data into a file for later analysis @@ -905,6 +973,20 @@ bool cConnection::HandleServerTimeUpdate(void) +bool cConnection::HandleServerUpdateHealth(void) +{ + HANDLE_SERVER_PACKET_READ(ReadBEShort, short, Health); + HANDLE_SERVER_PACKET_READ(ReadBEShort, short, Food); + HANDLE_SERVER_PACKET_READ(ReadBEFloat, float, Saturation); + Log("Received a PACKET_UPDATE_HEALTH from the server"); + COPY_TO_CLIENT(); + return true; +} + + + + + bool cConnection::HandleServerWindowContents(void) { HANDLE_SERVER_PACKET_READ(ReadChar, char, WindowID); -- cgit v1.2.3