1
0

ProtoProxy: Working 1.7 protocol.

Players can login, move around, dig blocks.
This commit is contained in:
madmaxoft 2013-10-29 22:55:00 +01:00
parent 9497e11ad4
commit e4906b3027
2 changed files with 160 additions and 158 deletions

View File

@ -112,7 +112,7 @@
#define HANDLE_CLIENT_READ(Proc) \ #define HANDLE_CLIENT_READ(Proc) \
{ \ { \
if (!Proc()) \ if (!Proc) \
{ \ { \
AString Leftover; \ AString Leftover; \
m_ClientBuffer.ReadAgain(Leftover); \ m_ClientBuffer.ReadAgain(Leftover); \
@ -124,7 +124,7 @@
#define HANDLE_SERVER_READ(Proc) \ #define HANDLE_SERVER_READ(Proc) \
{ \ { \
if (!Proc()) \ if (!Proc) \
{ \ { \
m_ServerBuffer.ResetRead(); \ m_ServerBuffer.ResetRead(); \
return true; \ return true; \
@ -604,8 +604,10 @@ bool cConnection::DecodeClientsPackets(const char * a_Data, int a_Size)
// Not a complete packet yet // Not a complete packet yet
break; break;
} }
UInt32 PacketType; UInt32 PacketType, PacketReadSoFar;
PacketReadSoFar = m_ClientBuffer.GetReadableSpace();
VERIFY(m_ClientBuffer.ReadVarInt(PacketType)); VERIFY(m_ClientBuffer.ReadVarInt(PacketType));
PacketReadSoFar -= m_ClientBuffer.GetReadableSpace();
Log("Decoding client's packets, there are now %d bytes in the queue; next packet is 0x%0x, %u bytes long", m_ClientBuffer.GetReadableSpace(), PacketType, PacketLen); Log("Decoding client's packets, there are now %d bytes in the queue; next packet is 0x%0x, %u bytes long", m_ClientBuffer.GetReadableSpace(), PacketType, PacketLen);
switch (m_ClientProtocolState) switch (m_ClientProtocolState)
{ {
@ -614,7 +616,8 @@ bool cConnection::DecodeClientsPackets(const char * a_Data, int a_Size)
// No initial handshake received yet // No initial handshake received yet
switch (PacketType) switch (PacketType)
{ {
case 0: HANDLE_CLIENT_READ(HandleClientHandshake); break; case 0x00: HANDLE_CLIENT_READ(HandleClientHandshake()); break;
default: HANDLE_CLIENT_READ(HandleClientUnknownPacket(PacketType, PacketLen, PacketReadSoFar)); break;
} }
break; break;
} // case -1 } // case -1
@ -624,8 +627,9 @@ bool cConnection::DecodeClientsPackets(const char * a_Data, int a_Size)
// Status query // Status query
switch (PacketType) switch (PacketType)
{ {
case 0x00: HANDLE_CLIENT_READ(HandleClientStatusRequest); break; case 0x00: HANDLE_CLIENT_READ(HandleClientStatusRequest()); break;
case 0x01: HANDLE_CLIENT_READ(HandleClientStatusPing); break; case 0x01: HANDLE_CLIENT_READ(HandleClientStatusPing()); break;
default: HANDLE_CLIENT_READ(HandleClientUnknownPacket(PacketType, PacketLen, PacketReadSoFar)); break;
} }
break; break;
} }
@ -635,8 +639,9 @@ bool cConnection::DecodeClientsPackets(const char * a_Data, int a_Size)
// Login // Login
switch (PacketType) switch (PacketType)
{ {
case 0x00: HANDLE_CLIENT_READ(HandleClientLoginStart); break; case 0x00: HANDLE_CLIENT_READ(HandleClientLoginStart()); break;
case 0x01: HANDLE_CLIENT_READ(HandleClientLoginEncryptionKeyResponse); break; case 0x01: HANDLE_CLIENT_READ(HandleClientLoginEncryptionKeyResponse()); break;
default: HANDLE_CLIENT_READ(HandleClientUnknownPacket(PacketType, PacketLen, PacketReadSoFar)); break;
} }
break; break;
} }
@ -646,62 +651,38 @@ bool cConnection::DecodeClientsPackets(const char * a_Data, int a_Size)
// Game: // Game:
switch (PacketType) switch (PacketType)
{ {
case 0x00: HANDLE_CLIENT_READ(HandleClientKeepAlive); break; case 0x00: HANDLE_CLIENT_READ(HandleClientKeepAlive()); break;
case 0x01: HANDLE_CLIENT_READ(HandleClientChatMessage()); break;
case PACKET_BLOCK_DIG: HANDLE_CLIENT_READ(HandleClientBlockDig); break; case 0x02: HANDLE_CLIENT_READ(HandleClientUseEntity()); break;
case PACKET_BLOCK_PLACE: HANDLE_CLIENT_READ(HandleClientBlockPlace); break; case 0x03: HANDLE_CLIENT_READ(HandleClientPlayerOnGround()); break;
case PACKET_S_CHAT_MESSAGE: HANDLE_CLIENT_READ(HandleClientChatMessage); break; case 0x04: HANDLE_CLIENT_READ(HandleClientPlayerPosition()); break;
case PACKET_CLIENT_STATUSES: HANDLE_CLIENT_READ(HandleClientClientStatuses); break; case 0x05: HANDLE_CLIENT_READ(HandleClientPlayerLook()); break;
case PACKET_CREATIVE_INVENTORY_ACTION: HANDLE_CLIENT_READ(HandleClientCreativeInventoryAction); break; case 0x06: HANDLE_CLIENT_READ(HandleClientPlayerPositionLook()); break;
case PACKET_DISCONNECT: HANDLE_CLIENT_READ(HandleClientDisconnect); break; case 0x07: HANDLE_CLIENT_READ(HandleClientBlockDig()); break;
case PACKET_ENTITY_ACTION: HANDLE_CLIENT_READ(HandleClientEntityAction); break; case 0x08: HANDLE_CLIENT_READ(HandleClientBlockPlace()); break;
case PACKET_LOCALE_AND_VIEW: HANDLE_CLIENT_READ(HandleClientLocaleAndView); break; case 0x09: HANDLE_CLIENT_READ(HandleClientSlotSelect()); break;
case PACKET_PING: HANDLE_CLIENT_READ(HandleClientPing); break; case 0x0a: HANDLE_CLIENT_READ(HandleClientAnimation()); break;
case PACKET_PLAYER_ABILITIES: HANDLE_CLIENT_READ(HandleClientPlayerAbilities); break; case 0x0b: HANDLE_CLIENT_READ(HandleClientEntityAction()); break;
case PACKET_PLAYER_ANIMATION: HANDLE_CLIENT_READ(HandleClientAnimation); break; case 0x0d: HANDLE_CLIENT_READ(HandleClientWindowClose()); break;
case PACKET_PLAYER_LOOK: HANDLE_CLIENT_READ(HandleClientPlayerLook); break; case 0x0e: HANDLE_CLIENT_READ(HandleClientWindowClick()); break;
case PACKET_PLAYER_ON_GROUND: HANDLE_CLIENT_READ(HandleClientPlayerOnGround); break; case 0x10: HANDLE_CLIENT_READ(HandleClientCreativeInventoryAction()); break;
case PACKET_PLAYER_POSITION: HANDLE_CLIENT_READ(HandleClientPlayerPosition); break; case 0x12: HANDLE_CLIENT_READ(HandleClientUpdateSign()); break;
case PACKET_PLAYER_POSITION_LOOK: HANDLE_CLIENT_READ(HandleClientPlayerPositionLook); break; case 0x13: HANDLE_CLIENT_READ(HandleClientPlayerAbilities()); break;
case PACKET_PLUGIN_MESSAGE: HANDLE_CLIENT_READ(HandleClientPluginMessage); break; case 0x14: HANDLE_CLIENT_READ(HandleClientTabCompletion()); break;
case PACKET_SLOT_SELECT: HANDLE_CLIENT_READ(HandleClientSlotSelect); break; case 0x15: HANDLE_CLIENT_READ(HandleClientLocaleAndView()); break;
case PACKET_TAB_COMPLETION: HANDLE_CLIENT_READ(HandleClientTabCompletion); break; case 0x16: HANDLE_CLIENT_READ(HandleClientClientStatuses()); break;
case PACKET_UPDATE_SIGN: HANDLE_CLIENT_READ(HandleClientUpdateSign); break; case 0x17: HANDLE_CLIENT_READ(HandleClientPluginMessage()); break;
case PACKET_USE_ENTITY: HANDLE_CLIENT_READ(HandleClientUseEntity); break; default: HANDLE_CLIENT_READ(HandleClientUnknownPacket(PacketType, PacketLen, PacketReadSoFar)); break;
case PACKET_WINDOW_CLICK: HANDLE_CLIENT_READ(HandleClientWindowClick); break;
case PACKET_WINDOW_CLOSE: HANDLE_CLIENT_READ(HandleClientWindowClose); break;
} }
break; break;
} // case 3 - Game } // case 3 - Game
default: default:
{ {
// TODO: Move this elsewhere Log("Receiving server packets while in an unknown protocol state (%d)!", m_ClientProtocolState);
if (m_ClientState == csEncryptedUnderstood) HANDLE_CLIENT_READ(HandleClientUnknownPacket(PacketType, PacketLen, PacketReadSoFar));
{ break;
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)
{
SERVERSEND(m_ClientBuffer);
}
else
{
SERVERENCRYPTSEND(m_ClientBuffer);
}
return true;
}
else
{
Log("Unknown packet 0x%02x from the client while unencrypted; aborting connection", PacketType);
return false;
}
} // default
} // switch (m_ProtocolState) } // switch (m_ProtocolState)
m_ClientBuffer.CommitRead(); m_ClientBuffer.CommitRead();
} // while (true) } // while (true)
@ -739,8 +720,10 @@ bool cConnection::DecodeServersPackets(const char * a_Data, int a_Size)
// Not a complete packet yet // Not a complete packet yet
break; break;
} }
UInt32 PacketType; UInt32 PacketType, PacketReadSoFar;
PacketReadSoFar = m_ServerBuffer.GetReadableSpace();
VERIFY(m_ServerBuffer.ReadVarInt(PacketType)); VERIFY(m_ServerBuffer.ReadVarInt(PacketType));
PacketReadSoFar -= m_ServerBuffer.GetReadableSpace();
Log("Decoding server's packets, there are now %d bytes in the queue; next packet is 0x%0x, %u bytes long", m_ServerBuffer.GetReadableSpace(), PacketType, PacketLen); Log("Decoding server's packets, there are now %d bytes in the queue; next packet is 0x%0x, %u bytes long", m_ServerBuffer.GetReadableSpace(), PacketType, PacketLen);
LogFlush(); LogFlush();
switch (m_ServerProtocolState) switch (m_ServerProtocolState)
@ -748,6 +731,7 @@ bool cConnection::DecodeServersPackets(const char * a_Data, int a_Size)
case -1: case -1:
{ {
Log("Receiving data from the server without an initial handshake message!"); Log("Receiving data from the server without an initial handshake message!");
HANDLE_SERVER_READ(HandleServerUnknownPacket(PacketType, PacketLen, PacketReadSoFar));
break; break;
} }
@ -756,8 +740,9 @@ bool cConnection::DecodeServersPackets(const char * a_Data, int a_Size)
// Status query: // Status query:
switch (PacketType) switch (PacketType)
{ {
case 0: HANDLE_SERVER_READ(HandleServerStatusResponse); break; case 0x00: HANDLE_SERVER_READ(HandleServerStatusResponse()); break;
case 1: HANDLE_SERVER_READ(HandleServerStatusPing); break; case 0x01: HANDLE_SERVER_READ(HandleServerStatusPing()); break;
default: HANDLE_SERVER_READ(HandleServerUnknownPacket(PacketType, PacketLen, PacketReadSoFar)); break;
} }
break; break;
} }
@ -767,9 +752,10 @@ bool cConnection::DecodeServersPackets(const char * a_Data, int a_Size)
// Login: // Login:
switch (PacketType) switch (PacketType)
{ {
case 0x00: HANDLE_SERVER_READ(HandleServerLoginDisconnect); break; case 0x00: HANDLE_SERVER_READ(HandleServerLoginDisconnect()); break;
case 0x01: HANDLE_SERVER_READ(HandleServerLoginEncryptionKeyRequest); break; case 0x01: HANDLE_SERVER_READ(HandleServerLoginEncryptionKeyRequest()); break;
case 0x02: HANDLE_SERVER_READ(HandleServerLoginSuccess); break; case 0x02: HANDLE_SERVER_READ(HandleServerLoginSuccess()); break;
default: HANDLE_SERVER_READ(HandleServerUnknownPacket(PacketType, PacketLen, PacketReadSoFar)); break;
} }
break; break;
} }
@ -779,57 +765,59 @@ bool cConnection::DecodeServersPackets(const char * a_Data, int a_Size)
// Game: // Game:
switch (PacketType) switch (PacketType)
{ {
case 0x00: HANDLE_SERVER_READ(HandleServerKeepAlive); break; case 0x00: HANDLE_SERVER_READ(HandleServerKeepAlive()); break;
case 0x01: HANDLE_SERVER_READ(HandleServerJoinGame); break; case 0x01: HANDLE_SERVER_READ(HandleServerJoinGame()); break;
case 0x02: HANDLE_SERVER_READ(HandleServerChatMessage); break; case 0x02: HANDLE_SERVER_READ(HandleServerChatMessage()); break;
case 0x04: HANDLE_SERVER_READ(HandleServerEntityEquipment); break; case 0x03: HANDLE_SERVER_READ(HandleServerTimeUpdate()); break;
case 0x05: HANDLE_SERVER_READ(HandleServerCompass); break; case 0x04: HANDLE_SERVER_READ(HandleServerEntityEquipment()); break;
case 0x06: HANDLE_SERVER_READ(HandleServerUpdateHealth); break; case 0x05: HANDLE_SERVER_READ(HandleServerCompass()); break;
case 0x07: HANDLE_SERVER_READ(HandleServerRespawn); break; case 0x06: HANDLE_SERVER_READ(HandleServerUpdateHealth()); break;
case 0x08: HANDLE_SERVER_READ(HandleServerPlayerPositionLook); break; case 0x07: HANDLE_SERVER_READ(HandleServerRespawn()); break;
case 0x09: HANDLE_SERVER_READ(HandleServerSlotSelect); break; case 0x08: HANDLE_SERVER_READ(HandleServerPlayerPositionLook()); break;
case 0x0a: HANDLE_SERVER_READ(HandleServerUseBed); break; case 0x09: HANDLE_SERVER_READ(HandleServerSlotSelect()); break;
case 0x0b: HANDLE_SERVER_READ(HandleServerPlayerAnimation); break; case 0x0a: HANDLE_SERVER_READ(HandleServerUseBed()); break;
case 0x0c: HANDLE_SERVER_READ(HandleServerSpawnNamedEntity); break; case 0x0b: HANDLE_SERVER_READ(HandleServerPlayerAnimation()); break;
case 0x0d: HANDLE_SERVER_READ(HandleServerCollectPickup); break; case 0x0c: HANDLE_SERVER_READ(HandleServerSpawnNamedEntity()); break;
case 0x0e: HANDLE_SERVER_READ(HandleServerSpawnObjectVehicle); break; case 0x0d: HANDLE_SERVER_READ(HandleServerCollectPickup()); break;
case 0x0f: HANDLE_SERVER_READ(HandleServerSpawnMob); break; case 0x0e: HANDLE_SERVER_READ(HandleServerSpawnObjectVehicle()); break;
case 0x10: HANDLE_SERVER_READ(HandleServerSpawnPainting); break; case 0x0f: HANDLE_SERVER_READ(HandleServerSpawnMob()); break;
case 0x11: HANDLE_SERVER_READ(HandleServerSpawnExperienceOrbs); break; case 0x10: HANDLE_SERVER_READ(HandleServerSpawnPainting()); break;
case 0x12: HANDLE_SERVER_READ(HandleServerEntityVelocity); break; case 0x11: HANDLE_SERVER_READ(HandleServerSpawnExperienceOrbs()); break;
case 0x13: HANDLE_SERVER_READ(HandleServerDestroyEntities); break; case 0x12: HANDLE_SERVER_READ(HandleServerEntityVelocity()); break;
case 0x14: HANDLE_SERVER_READ(HandleServerEntity); break; case 0x13: HANDLE_SERVER_READ(HandleServerDestroyEntities()); break;
case 0x15: HANDLE_SERVER_READ(HandleServerEntityRelativeMove); break; case 0x14: HANDLE_SERVER_READ(HandleServerEntity()); break;
case 0x16: HANDLE_SERVER_READ(HandleServerEntityLook); break; case 0x15: HANDLE_SERVER_READ(HandleServerEntityRelativeMove()); break;
case 0x17: HANDLE_SERVER_READ(HandleServerEntityRelativeMoveLook); break; case 0x16: HANDLE_SERVER_READ(HandleServerEntityLook()); break;
case 0x18: HANDLE_SERVER_READ(HandleServerEntityTeleport); break; case 0x17: HANDLE_SERVER_READ(HandleServerEntityRelativeMoveLook()); break;
case 0x19: HANDLE_SERVER_READ(HandleServerEntityHeadLook); break; case 0x18: HANDLE_SERVER_READ(HandleServerEntityTeleport()); break;
case 0x1a: HANDLE_SERVER_READ(HandleServerEntityStatus); break; case 0x19: HANDLE_SERVER_READ(HandleServerEntityHeadLook()); break;
case 0x1b: HANDLE_SERVER_READ(HandleServerAttachEntity); break; case 0x1a: HANDLE_SERVER_READ(HandleServerEntityStatus()); break;
case 0x1c: HANDLE_SERVER_READ(HandleServerEntityMetadata); break; case 0x1b: HANDLE_SERVER_READ(HandleServerAttachEntity()); break;
case 0x1f: HANDLE_SERVER_READ(HandleServerSetExperience); break; case 0x1c: HANDLE_SERVER_READ(HandleServerEntityMetadata()); break;
case 0x20: HANDLE_SERVER_READ(HandleServerEntityProperties); break; case 0x1f: HANDLE_SERVER_READ(HandleServerSetExperience()); break;
case 0x21: HANDLE_SERVER_READ(HandleServerMapChunk); break; case 0x20: HANDLE_SERVER_READ(HandleServerEntityProperties()); break;
case 0x22: HANDLE_SERVER_READ(HandleServerMultiBlockChange); break; case 0x21: HANDLE_SERVER_READ(HandleServerMapChunk()); break;
case 0x23: HANDLE_SERVER_READ(HandleServerBlockChange); break; case 0x22: HANDLE_SERVER_READ(HandleServerMultiBlockChange()); break;
case 0x24: HANDLE_SERVER_READ(HandleServerBlockAction); break; case 0x23: HANDLE_SERVER_READ(HandleServerBlockChange()); break;
case 0x26: HANDLE_SERVER_READ(HandleServerMapChunkBulk); break; case 0x24: HANDLE_SERVER_READ(HandleServerBlockAction()); break;
case 0x27: HANDLE_SERVER_READ(HandleServerExplosion); break; case 0x26: HANDLE_SERVER_READ(HandleServerMapChunkBulk()); break;
case 0x28: HANDLE_SERVER_READ(HandleServerSoundEffect); break; case 0x27: HANDLE_SERVER_READ(HandleServerExplosion()); break;
case 0x29: HANDLE_SERVER_READ(HandleServerNamedSoundEffect); break; case 0x28: HANDLE_SERVER_READ(HandleServerSoundEffect()); break;
case 0x2b: HANDLE_SERVER_READ(HandleServerChangeGameState); break; case 0x29: HANDLE_SERVER_READ(HandleServerNamedSoundEffect()); break;
case 0x2d: HANDLE_SERVER_READ(HandleServerWindowOpen); break; case 0x2b: HANDLE_SERVER_READ(HandleServerChangeGameState()); break;
case 0x2e: HANDLE_SERVER_READ(HandleServerWindowClose); break; case 0x2d: HANDLE_SERVER_READ(HandleServerWindowOpen()); break;
case 0x2f: HANDLE_SERVER_READ(HandleServerSetSlot); break; case 0x2e: HANDLE_SERVER_READ(HandleServerWindowClose()); break;
case 0x30: HANDLE_SERVER_READ(HandleServerWindowContents); break; case 0x2f: HANDLE_SERVER_READ(HandleServerSetSlot()); break;
case 0x33: HANDLE_SERVER_READ(HandleServerUpdateSign); break; case 0x30: HANDLE_SERVER_READ(HandleServerWindowContents()); break;
case 0x35: HANDLE_SERVER_READ(HandleServerUpdateTileEntity); break; case 0x33: HANDLE_SERVER_READ(HandleServerUpdateSign()); break;
case 0x37: HANDLE_SERVER_READ(HandleServerStatistics); break; case 0x35: HANDLE_SERVER_READ(HandleServerUpdateTileEntity()); break;
case 0x38: HANDLE_SERVER_READ(HandleServerPlayerListItem); break; case 0x37: HANDLE_SERVER_READ(HandleServerStatistics()); break;
case 0x39: HANDLE_SERVER_READ(HandleServerPlayerAbilities); break; case 0x38: HANDLE_SERVER_READ(HandleServerPlayerListItem()); break;
case 0x3a: HANDLE_SERVER_READ(HandleServerTabCompletion); break; case 0x39: HANDLE_SERVER_READ(HandleServerPlayerAbilities()); break;
case 0x3f: HANDLE_SERVER_READ(HandleServerPluginMessage); break; case 0x3a: HANDLE_SERVER_READ(HandleServerTabCompletion()); break;
case 0x40: HANDLE_SERVER_READ(HandleServerKick); break; case 0x3f: HANDLE_SERVER_READ(HandleServerPluginMessage()); break;
case 0x40: HANDLE_SERVER_READ(HandleServerKick()); break;
default: HANDLE_SERVER_READ(HandleServerUnknownPacket(PacketType, PacketLen, PacketReadSoFar)); break;
} // switch (PacketType) } // switch (PacketType)
break; break;
} // case 3 - Game } // case 3 - Game
@ -837,30 +825,9 @@ bool cConnection::DecodeServersPackets(const char * a_Data, int a_Size)
// TODO: Move this elsewhere // TODO: Move this elsewhere
default: default:
{ {
if (m_ServerState == csEncryptedUnderstood) Log("Received a packet from the server while in an unknown state: %d", m_ServerProtocolState);
{ HANDLE_SERVER_READ(HandleServerUnknownPacket(PacketType, PacketLen, PacketReadSoFar));
Log("********************** Unknown packet 0x%02x from the server while encrypted; continuing to relay blind only", PacketType); break;
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)
{
CLIENTSEND(m_ServerBuffer);
}
else
{
CLIENTENCRYPTSEND(m_ServerBuffer);
}
return true;
}
else
{
Log("Unknown packet 0x%02x from the server while unencrypted; aborting connection", PacketType);
return false;
}
} }
} // switch (m_ProtocolState) } // switch (m_ProtocolState)
@ -1067,11 +1034,11 @@ bool cConnection::HandleClientEntityAction(void)
{ {
HANDLE_CLIENT_PACKET_READ(ReadBEInt, int, PlayerID); HANDLE_CLIENT_PACKET_READ(ReadBEInt, int, PlayerID);
HANDLE_CLIENT_PACKET_READ(ReadByte, Byte, ActionType); HANDLE_CLIENT_PACKET_READ(ReadByte, Byte, ActionType);
HANDLE_CLIENT_PACKET_READ(ReadBEInt, int, UnknownHorseVal); HANDLE_CLIENT_PACKET_READ(ReadBEInt, int, HorseJumpBoost);
Log("Received a PACKET_ENTITY_ACTION from the client:"); Log("Received a PACKET_ENTITY_ACTION from the client:");
Log(" PlayerID = %d", PlayerID); Log(" PlayerID = %d", PlayerID);
Log(" ActionType = %d", ActionType); Log(" ActionType = %d", ActionType);
Log(" UnknownHorseVal = %d (0x%08x)", UnknownHorseVal, UnknownHorseVal); Log(" HorseJumpBoost = %d (0x%08x)", HorseJumpBoost, HorseJumpBoost);
COPY_TO_SERVER(); COPY_TO_SERVER();
return true; return true;
} }
@ -1095,10 +1062,11 @@ bool cConnection::HandleClientKeepAlive(void)
bool cConnection::HandleClientLocaleAndView(void) bool cConnection::HandleClientLocaleAndView(void)
{ {
HANDLE_CLIENT_PACKET_READ(ReadVarUTF8String, AString, Locale); HANDLE_CLIENT_PACKET_READ(ReadVarUTF8String, AString, Locale);
HANDLE_CLIENT_PACKET_READ(ReadChar, char, ViewDistance); HANDLE_CLIENT_PACKET_READ(ReadChar, char, ViewDistance);
HANDLE_CLIENT_PACKET_READ(ReadChar, char, ChatFlags); HANDLE_CLIENT_PACKET_READ(ReadChar, char, ChatFlags);
HANDLE_CLIENT_PACKET_READ(ReadChar, char, Difficulty); HANDLE_CLIENT_PACKET_READ(ReadChar, char, Unused);
HANDLE_CLIENT_PACKET_READ(ReadChar, char, ShowCape); HANDLE_CLIENT_PACKET_READ(ReadChar, char, Difficulty);
HANDLE_CLIENT_PACKET_READ(ReadChar, char, ShowCape);
Log("Received a PACKET_LOCALE_AND_VIEW from the client"); Log("Received a PACKET_LOCALE_AND_VIEW from the client");
COPY_TO_SERVER(); COPY_TO_SERVER();
return true; return true;
@ -1123,7 +1091,7 @@ bool cConnection::HandleClientPing(void)
bool cConnection::HandleClientPlayerAbilities(void) bool cConnection::HandleClientPlayerAbilities(void)
{ {
HANDLE_CLIENT_PACKET_READ(ReadChar, char, Flags); HANDLE_CLIENT_PACKET_READ(ReadChar, char, Flags);
HANDLE_CLIENT_PACKET_READ(ReadBEFloat, float, FlyingSpeed); HANDLE_CLIENT_PACKET_READ(ReadBEFloat, float, FlyingSpeed);
HANDLE_CLIENT_PACKET_READ(ReadBEFloat, float, WalkingSpeed); HANDLE_CLIENT_PACKET_READ(ReadBEFloat, float, WalkingSpeed);
Log("Receives a PACKET_PLAYER_ABILITIES from the client:"); Log("Receives a PACKET_PLAYER_ABILITIES from the client:");
@ -1154,7 +1122,7 @@ bool cConnection::HandleClientPlayerLook(void)
bool cConnection::HandleClientPlayerOnGround(void) bool cConnection::HandleClientPlayerOnGround(void)
{ {
HANDLE_CLIENT_PACKET_READ(ReadChar, char, OnGround); HANDLE_CLIENT_PACKET_READ(ReadChar, char, OnGround);
Log("Received a PACKET_PLAYER_ON_GROUND from the client"); Log("Received a PACKET_PLAYER_ON_GROUND from the client");
COPY_TO_SERVER(); COPY_TO_SERVER();
return true; return true;
@ -1167,8 +1135,8 @@ bool cConnection::HandleClientPlayerOnGround(void)
bool cConnection::HandleClientPlayerPosition(void) bool cConnection::HandleClientPlayerPosition(void)
{ {
HANDLE_CLIENT_PACKET_READ(ReadBEDouble, double, PosX); 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, PosY);
HANDLE_CLIENT_PACKET_READ(ReadBEDouble, double, Stance);
HANDLE_CLIENT_PACKET_READ(ReadBEDouble, double, PosZ); HANDLE_CLIENT_PACKET_READ(ReadBEDouble, double, PosZ);
HANDLE_CLIENT_PACKET_READ(ReadChar, char, IsOnGround); HANDLE_CLIENT_PACKET_READ(ReadChar, char, IsOnGround);
Log("Received a PACKET_PLAYER_POSITION from the client"); Log("Received a PACKET_PLAYER_POSITION from the client");
@ -1186,8 +1154,8 @@ bool cConnection::HandleClientPlayerPosition(void)
bool cConnection::HandleClientPlayerPositionLook(void) bool cConnection::HandleClientPlayerPositionLook(void)
{ {
HANDLE_CLIENT_PACKET_READ(ReadBEDouble, double, PosX); 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, PosY);
HANDLE_CLIENT_PACKET_READ(ReadBEDouble, double, Stance);
HANDLE_CLIENT_PACKET_READ(ReadBEDouble, double, PosZ); HANDLE_CLIENT_PACKET_READ(ReadBEDouble, double, PosZ);
HANDLE_CLIENT_PACKET_READ(ReadBEFloat, float, Yaw); HANDLE_CLIENT_PACKET_READ(ReadBEFloat, float, Yaw);
HANDLE_CLIENT_PACKET_READ(ReadBEFloat, float, Pitch); HANDLE_CLIENT_PACKET_READ(ReadBEFloat, float, Pitch);
@ -1195,7 +1163,7 @@ bool cConnection::HandleClientPlayerPositionLook(void)
Log("Received a PACKET_PLAYER_POSITION_LOOK from the client"); Log("Received a PACKET_PLAYER_POSITION_LOOK from the client");
Log(" Pos = {%.03f, %.03f, %.03f}", PosX, PosY, PosZ); Log(" Pos = {%.03f, %.03f, %.03f}", PosX, PosY, PosZ);
Log(" Stance = %.03f", Stance); Log(" Stance = %.03f", Stance);
Log(" Y, P = %.03f, %.03f", Yaw, Pitch); Log(" Yaw, Pitch = <%.03f, %.03f>", Yaw, Pitch);
Log(" IsOnGround = %s", IsOnGround ? "true" : "false"); Log(" IsOnGround = %s", IsOnGround ? "true" : "false");
COPY_TO_SERVER(); COPY_TO_SERVER();
@ -1278,9 +1246,9 @@ bool cConnection::HandleClientTabCompletion(void)
bool cConnection::HandleClientUpdateSign(void) bool cConnection::HandleClientUpdateSign(void)
{ {
HANDLE_CLIENT_PACKET_READ(ReadBEInt, int, BlockX); HANDLE_CLIENT_PACKET_READ(ReadBEInt, int, BlockX);
HANDLE_CLIENT_PACKET_READ(ReadBEShort, short, BlockY); HANDLE_CLIENT_PACKET_READ(ReadBEShort, short, BlockY);
HANDLE_CLIENT_PACKET_READ(ReadBEInt, int, BlockZ); HANDLE_CLIENT_PACKET_READ(ReadBEInt, int, BlockZ);
HANDLE_CLIENT_PACKET_READ(ReadVarUTF8String, AString, Line1); HANDLE_CLIENT_PACKET_READ(ReadVarUTF8String, AString, Line1);
HANDLE_CLIENT_PACKET_READ(ReadVarUTF8String, AString, Line2); HANDLE_CLIENT_PACKET_READ(ReadVarUTF8String, AString, Line2);
HANDLE_CLIENT_PACKET_READ(ReadVarUTF8String, AString, Line3); HANDLE_CLIENT_PACKET_READ(ReadVarUTF8String, AString, Line3);
@ -1298,11 +1266,9 @@ bool cConnection::HandleClientUpdateSign(void)
bool cConnection::HandleClientUseEntity(void) bool cConnection::HandleClientUseEntity(void)
{ {
HANDLE_CLIENT_PACKET_READ(ReadBEInt, int, PlayerID);
HANDLE_CLIENT_PACKET_READ(ReadBEInt, int, EntityID); HANDLE_CLIENT_PACKET_READ(ReadBEInt, int, EntityID);
HANDLE_CLIENT_PACKET_READ(ReadChar, char, MouseButton); HANDLE_CLIENT_PACKET_READ(ReadChar, char, MouseButton);
Log("Received a PACKET_USE_ENTITY from the client:"); Log("Received a PACKET_USE_ENTITY from the client:");
Log(" PlayerID = %d", PlayerID);
Log(" EntityID = %d", EntityID); Log(" EntityID = %d", EntityID);
Log(" MouseButton = %d", MouseButton); Log(" MouseButton = %d", MouseButton);
COPY_TO_SERVER(); COPY_TO_SERVER();
@ -1317,9 +1283,9 @@ bool cConnection::HandleClientWindowClick(void)
{ {
HANDLE_CLIENT_PACKET_READ(ReadChar, char, WindowID); HANDLE_CLIENT_PACKET_READ(ReadChar, char, WindowID);
HANDLE_CLIENT_PACKET_READ(ReadBEShort, short, SlotNum); HANDLE_CLIENT_PACKET_READ(ReadBEShort, short, SlotNum);
HANDLE_CLIENT_PACKET_READ(ReadChar, char, IsRightClick); HANDLE_CLIENT_PACKET_READ(ReadChar, char, Button);
HANDLE_CLIENT_PACKET_READ(ReadBEShort, short, TransactionID); HANDLE_CLIENT_PACKET_READ(ReadBEShort, short, TransactionID);
HANDLE_CLIENT_PACKET_READ(ReadChar, char, IsShiftClick); HANDLE_CLIENT_PACKET_READ(ReadChar, char, Mode);
AString Item; AString Item;
if (!ParseSlot(m_ClientBuffer, Item)) if (!ParseSlot(m_ClientBuffer, Item))
{ {
@ -1328,7 +1294,7 @@ bool cConnection::HandleClientWindowClick(void)
Log("Received a PACKET_WINDOW_CLICK from the client"); Log("Received a PACKET_WINDOW_CLICK from the client");
Log(" WindowID = %d", WindowID); Log(" WindowID = %d", WindowID);
Log(" SlotNum = %d", SlotNum); Log(" SlotNum = %d", SlotNum);
Log(" IsRclk = %d, IsShift = %d", IsRightClick, IsShiftClick); Log(" Button = %d, Mode = %d", Button, Mode);
Log(" TransactionID = 0x%x", TransactionID); Log(" TransactionID = 0x%x", TransactionID);
Log(" ClickedItem = %s", Item.c_str()); Log(" ClickedItem = %s", Item.c_str());
COPY_TO_SERVER(); COPY_TO_SERVER();
@ -1352,6 +1318,22 @@ bool cConnection::HandleClientWindowClose(void)
bool cConnection::HandleClientUnknownPacket(UInt32 a_PacketType, UInt32 a_PacketLen, UInt32 a_PacketReadSoFar)
{
AString Data;
if (!m_ClientBuffer.ReadString(Data, a_PacketLen - a_PacketReadSoFar))
{
return false;
}
DataLog(Data.data(), Data.size(), "****************** Unknown packet 0x%x from the client; relaying and ignoring", a_PacketType);
COPY_TO_SERVER();
return true;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// packet handling, server-side, login: // packet handling, server-side, login:
@ -2698,6 +2680,22 @@ bool cConnection::HandleServerWindowOpen(void)
bool cConnection::HandleServerUnknownPacket(UInt32 a_PacketType, UInt32 a_PacketLen, UInt32 a_PacketReadSoFar)
{
AString Data;
if (!m_ServerBuffer.ReadString(Data, a_PacketLen - a_PacketReadSoFar))
{
return false;
}
DataLog(Data.data(), Data.size(), "****************** Unknown packet 0x%x from the server; relaying and ignoring", a_PacketType);
COPY_TO_CLIENT();
return true;
}
bool cConnection::ParseSlot(cByteBuffer & a_Buffer, AString & a_ItemDesc) bool cConnection::ParseSlot(cByteBuffer & a_Buffer, AString & a_ItemDesc)
{ {
short ItemType; short ItemType;

View File

@ -157,6 +157,8 @@ protected:
bool HandleClientUseEntity(void); bool HandleClientUseEntity(void);
bool HandleClientWindowClick(void); bool HandleClientWindowClick(void);
bool HandleClientWindowClose(void); bool HandleClientWindowClose(void);
bool HandleClientUnknownPacket(UInt32 a_PacketType, UInt32 a_PacketLen, UInt32 a_PacketReadSoFar);
// Packet handling, server-side, login: // Packet handling, server-side, login:
bool HandleServerLoginDisconnect(void); bool HandleServerLoginDisconnect(void);
@ -222,6 +224,8 @@ protected:
bool HandleServerWindowContents(void); bool HandleServerWindowContents(void);
bool HandleServerWindowOpen(void); bool HandleServerWindowOpen(void);
bool HandleServerUnknownPacket(UInt32 a_PacketType, UInt32 a_PacketLen, UInt32 a_PacketReadSoFar);
/// Parses the slot data in a_Buffer into item description; returns true if successful, false if not enough data /// Parses the slot data in a_Buffer into item description; returns true if successful, false if not enough data
bool ParseSlot(cByteBuffer & a_Buffer, AString & a_ItemDesc); bool ParseSlot(cByteBuffer & a_Buffer, AString & a_ItemDesc);