ProtoProxy: Added the ENTITY-class packets handling
git-svn-id: http://mc-server.googlecode.com/svn/trunk@863 0a769ca7-a7f5-676a-18bf-c427514a06d6
This commit is contained in:
parent
13e5ee887c
commit
184d7269c1
|
@ -114,6 +114,16 @@ enum
|
||||||
PACKET_BLOCK_PLACE = 0x0f,
|
PACKET_BLOCK_PLACE = 0x0f,
|
||||||
PACKET_SLOT_SELECT = 0x10,
|
PACKET_SLOT_SELECT = 0x10,
|
||||||
PACKET_ANIMATION = 0x12,
|
PACKET_ANIMATION = 0x12,
|
||||||
|
PACKET_ENTITY = 0x1e,
|
||||||
|
PACKET_ENTITY_RELATIVE_MOVE = 0x1f,
|
||||||
|
PACKET_ENTITY_LOOK = 0x20,
|
||||||
|
PACKET_ENTITY_RELATIVE_MOVE_LOOK = 0x21,
|
||||||
|
PACKET_ENTITY_TELEPORT = 0x22,
|
||||||
|
PACKET_ENTITY_HEAD_LOOK = 0x23,
|
||||||
|
PACKET_ENTITY_STATUS = 0x24,
|
||||||
|
PACKET_ENTITY_METADATA = 0x28,
|
||||||
|
PACKET_ENTITY_EFFECT = 0x29,
|
||||||
|
PACKET_ENTITY_EFFECT_REMOVE = 0x2a,
|
||||||
PACKET_SET_EXPERIENCE = 0x2b,
|
PACKET_SET_EXPERIENCE = 0x2b,
|
||||||
PACKET_MAP_CHUNK = 0x33,
|
PACKET_MAP_CHUNK = 0x33,
|
||||||
PACKET_MULTI_BLOCK_CHANGE = 0x34,
|
PACKET_MULTI_BLOCK_CHANGE = 0x34,
|
||||||
|
@ -538,28 +548,36 @@ bool cConnection::DecodeServersPackets(const char * a_Data, int a_Size)
|
||||||
m_ServerBuffer.ReadByte(PacketType);
|
m_ServerBuffer.ReadByte(PacketType);
|
||||||
switch (PacketType)
|
switch (PacketType)
|
||||||
{
|
{
|
||||||
case PACKET_BLOCK_CHANGE: HANDLE_SERVER_READ(HandleServerBlockChange); break;
|
case PACKET_BLOCK_CHANGE: HANDLE_SERVER_READ(HandleServerBlockChange); break;
|
||||||
case PACKET_CHANGE_GAME_STATE: HANDLE_SERVER_READ(HandleServerChangeGameState); break;
|
case PACKET_CHANGE_GAME_STATE: HANDLE_SERVER_READ(HandleServerChangeGameState); break;
|
||||||
case PACKET_CHAT_MESSAGE: HANDLE_SERVER_READ(HandleServerChatMessage); break;
|
case PACKET_CHAT_MESSAGE: HANDLE_SERVER_READ(HandleServerChatMessage); break;
|
||||||
case PACKET_COMPASS: HANDLE_SERVER_READ(HandleServerCompass); break;
|
case PACKET_COMPASS: HANDLE_SERVER_READ(HandleServerCompass); break;
|
||||||
case PACKET_ENCRYPTION_KEY_REQUEST: HANDLE_SERVER_READ(HandleServerEncryptionKeyRequest); break;
|
case PACKET_ENCRYPTION_KEY_REQUEST: HANDLE_SERVER_READ(HandleServerEncryptionKeyRequest); break;
|
||||||
case PACKET_ENCRYPTION_KEY_RESPONSE: HANDLE_SERVER_READ(HandleServerEncryptionKeyResponse); break;
|
case PACKET_ENCRYPTION_KEY_RESPONSE: HANDLE_SERVER_READ(HandleServerEncryptionKeyResponse); break;
|
||||||
case PACKET_ENTITY_EQUIPMENT: HANDLE_SERVER_READ(HandleServerEntityEquipment); break;
|
case PACKET_ENTITY: HANDLE_SERVER_READ(HandleServerEntity); break;
|
||||||
case PACKET_KEEPALIVE: HANDLE_SERVER_READ(HandleServerKeepAlive); break;
|
case PACKET_ENTITY_EQUIPMENT: HANDLE_SERVER_READ(HandleServerEntityEquipment); break;
|
||||||
case PACKET_KICK: HANDLE_SERVER_READ(HandleServerKick); break;
|
case PACKET_ENTITY_HEAD_LOOK: HANDLE_SERVER_READ(HandleServerEntityHeadLook); break;
|
||||||
case PACKET_LOGIN: HANDLE_SERVER_READ(HandleServerLogin); break;
|
case PACKET_ENTITY_LOOK: HANDLE_SERVER_READ(HandleServerEntityLook); break;
|
||||||
case PACKET_MAP_CHUNK: HANDLE_SERVER_READ(HandleServerMapChunk); break;
|
case PACKET_ENTITY_METADATA: HANDLE_SERVER_READ(HandleServerEntityMetadata); break;
|
||||||
case PACKET_MAP_CHUNK_BULK: HANDLE_SERVER_READ(HandleServerMapChunkBulk); break;
|
case PACKET_ENTITY_RELATIVE_MOVE: HANDLE_SERVER_READ(HandleServerEntityRelativeMove); break;
|
||||||
case PACKET_MULTI_BLOCK_CHANGE: HANDLE_SERVER_READ(HandleServerMultiBlockChange); break;
|
case PACKET_ENTITY_RELATIVE_MOVE_LOOK: HANDLE_SERVER_READ(HandleServerEntityRelativeMoveLook); break;
|
||||||
case PACKET_PLAYER_ABILITIES: HANDLE_SERVER_READ(HandleServerPlayerAbilities); break;
|
case PACKET_ENTITY_STATUS: HANDLE_SERVER_READ(HandleServerEntityStatus); break;
|
||||||
case PACKET_PLAYER_LIST_ITEM: HANDLE_SERVER_READ(HandleServerPlayerListItem); break;
|
case PACKET_ENTITY_TELEPORT: HANDLE_SERVER_READ(HandleServerEntityTeleport); break;
|
||||||
case PACKET_PLAYER_POSITION_LOOK: HANDLE_SERVER_READ(HandleServerPlayerPositionLook); break;
|
case PACKET_KEEPALIVE: HANDLE_SERVER_READ(HandleServerKeepAlive); break;
|
||||||
case PACKET_SET_EXPERIENCE: HANDLE_SERVER_READ(HandleServerSetExperience); break;
|
case PACKET_KICK: HANDLE_SERVER_READ(HandleServerKick); break;
|
||||||
case PACKET_SET_SLOT: HANDLE_SERVER_READ(HandleServerSetSlot); break;
|
case PACKET_LOGIN: HANDLE_SERVER_READ(HandleServerLogin); break;
|
||||||
case PACKET_TIME_UPDATE: HANDLE_SERVER_READ(HandleServerTimeUpdate); break;
|
case PACKET_MAP_CHUNK: HANDLE_SERVER_READ(HandleServerMapChunk); break;
|
||||||
case PACKET_UPDATE_HEALTH: HANDLE_SERVER_READ(HandleServerUpdateHealth); break;
|
case PACKET_MAP_CHUNK_BULK: HANDLE_SERVER_READ(HandleServerMapChunkBulk); break;
|
||||||
case PACKET_UPDATE_SIGN: HANDLE_SERVER_READ(HandleServerUpdateSign); break;
|
case PACKET_MULTI_BLOCK_CHANGE: HANDLE_SERVER_READ(HandleServerMultiBlockChange); break;
|
||||||
case PACKET_WINDOW_CONTENTS: HANDLE_SERVER_READ(HandleServerWindowContents); 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_SET_EXPERIENCE: HANDLE_SERVER_READ(HandleServerSetExperience); break;
|
||||||
|
case PACKET_SET_SLOT: HANDLE_SERVER_READ(HandleServerSetSlot); break;
|
||||||
|
case PACKET_TIME_UPDATE: HANDLE_SERVER_READ(HandleServerTimeUpdate); break;
|
||||||
|
case PACKET_UPDATE_HEALTH: HANDLE_SERVER_READ(HandleServerUpdateHealth); break;
|
||||||
|
case PACKET_UPDATE_SIGN: HANDLE_SERVER_READ(HandleServerUpdateSign); break;
|
||||||
|
case PACKET_WINDOW_CONTENTS: HANDLE_SERVER_READ(HandleServerWindowContents); break;
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
if (m_ServerState == csEncryptedUnderstood)
|
if (m_ServerState == csEncryptedUnderstood)
|
||||||
|
@ -1031,6 +1049,53 @@ bool cConnection::HandleServerEncryptionKeyRequest(void)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cConnection::HandleServerEntity(void)
|
||||||
|
{
|
||||||
|
HANDLE_SERVER_PACKET_READ(ReadBEInt, int, EntityID);
|
||||||
|
Log("Received a PACKET_ENTITY from the server:");
|
||||||
|
Log(" EntityID = %d", EntityID);
|
||||||
|
COPY_TO_CLIENT();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cConnection::HandleServerEntityHeadLook(void)
|
||||||
|
{
|
||||||
|
HANDLE_SERVER_PACKET_READ(ReadBEInt, int, EntityID);
|
||||||
|
HANDLE_SERVER_PACKET_READ(ReadByte, Byte, HeadYaw);
|
||||||
|
Log("Received a PACKET_ENTITY_HEAD_LOOK from the server:");
|
||||||
|
Log(" EntityID = %d", EntityID);
|
||||||
|
Log(" HeadYaw = %d", HeadYaw);
|
||||||
|
COPY_TO_CLIENT();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cConnection::HandleServerEntityMetadata(void)
|
||||||
|
{
|
||||||
|
HANDLE_SERVER_PACKET_READ(ReadBEInt, int, EntityID);
|
||||||
|
AString Metadata;
|
||||||
|
if (!ParseMetadata(m_ServerBuffer, Metadata))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Log("Received a PACKET_ENTITY_METADATA from the server:");
|
||||||
|
Log(" EntityID = %d", EntityID);
|
||||||
|
Log(" Metadata length = %d", Metadata.length());
|
||||||
|
COPY_TO_CLIENT();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool cConnection::HandleServerEntityEquipment(void)
|
bool cConnection::HandleServerEntityEquipment(void)
|
||||||
{
|
{
|
||||||
HANDLE_SERVER_PACKET_READ(ReadBEInt, int, EntityID);
|
HANDLE_SERVER_PACKET_READ(ReadBEInt, int, EntityID);
|
||||||
|
@ -1052,6 +1117,97 @@ bool cConnection::HandleServerEntityEquipment(void)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cConnection::HandleServerEntityLook(void)
|
||||||
|
{
|
||||||
|
HANDLE_SERVER_PACKET_READ(ReadBEInt, int, EntityID);
|
||||||
|
HANDLE_SERVER_PACKET_READ(ReadByte, Byte, Yaw);
|
||||||
|
HANDLE_SERVER_PACKET_READ(ReadByte, Byte, Pitch);
|
||||||
|
Log("Received a PACKET_ENTITY_LOOK from the server:");
|
||||||
|
Log(" EntityID = %d", EntityID);
|
||||||
|
Log(" Yaw = %d", Yaw);
|
||||||
|
Log(" Pitch = %d", Pitch);
|
||||||
|
COPY_TO_CLIENT();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cConnection::HandleServerEntityRelativeMove(void)
|
||||||
|
{
|
||||||
|
HANDLE_SERVER_PACKET_READ(ReadBEInt, int, EntityID);
|
||||||
|
HANDLE_SERVER_PACKET_READ(ReadByte, Byte, dx);
|
||||||
|
HANDLE_SERVER_PACKET_READ(ReadByte, Byte, dy);
|
||||||
|
HANDLE_SERVER_PACKET_READ(ReadByte, Byte, dz);
|
||||||
|
Log("Received a PACKET_ENTITY_RELATIVE_MOVE from the server:");
|
||||||
|
Log(" EntityID = %d", EntityID);
|
||||||
|
Log(" RelMove = <%d, %d, %d>", dx, dy, dz);
|
||||||
|
COPY_TO_CLIENT();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cConnection::HandleServerEntityRelativeMoveLook(void)
|
||||||
|
{
|
||||||
|
HANDLE_SERVER_PACKET_READ(ReadBEInt, int, EntityID);
|
||||||
|
HANDLE_SERVER_PACKET_READ(ReadByte, Byte, dx);
|
||||||
|
HANDLE_SERVER_PACKET_READ(ReadByte, Byte, dy);
|
||||||
|
HANDLE_SERVER_PACKET_READ(ReadByte, Byte, dz);
|
||||||
|
HANDLE_SERVER_PACKET_READ(ReadByte, Byte, Yaw);
|
||||||
|
HANDLE_SERVER_PACKET_READ(ReadByte, Byte, Pitch);
|
||||||
|
Log("Received a PACKET_ENTITY_RELATIVE_MOVE_LOOK from the server:");
|
||||||
|
Log(" EntityID = %d", EntityID);
|
||||||
|
Log(" RelMove = <%d, %d, %d>", dx, dy, dz);
|
||||||
|
Log(" Yaw = %d", Yaw);
|
||||||
|
Log(" Pitch = %d", Pitch);
|
||||||
|
COPY_TO_CLIENT();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cConnection::HandleServerEntityStatus(void)
|
||||||
|
{
|
||||||
|
HANDLE_SERVER_PACKET_READ(ReadBEInt, int, EntityID);
|
||||||
|
HANDLE_SERVER_PACKET_READ(ReadByte, Byte, Status);
|
||||||
|
Log("Received a PACKET_ENTITY_STATUS from the server:");
|
||||||
|
Log(" EntityID = %d", EntityID);
|
||||||
|
Log(" Status = %d", Status);
|
||||||
|
COPY_TO_CLIENT();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cConnection::HandleServerEntityTeleport(void)
|
||||||
|
{
|
||||||
|
HANDLE_SERVER_PACKET_READ(ReadBEInt, int, EntityID);
|
||||||
|
HANDLE_SERVER_PACKET_READ(ReadBEInt, int, BlockX);
|
||||||
|
HANDLE_SERVER_PACKET_READ(ReadBEInt, int, BlockY);
|
||||||
|
HANDLE_SERVER_PACKET_READ(ReadBEInt, int, BlockZ);
|
||||||
|
HANDLE_SERVER_PACKET_READ(ReadByte, Byte, Yaw);
|
||||||
|
HANDLE_SERVER_PACKET_READ(ReadByte, Byte, Pitch);
|
||||||
|
Log("Received a PACKET_ENTITY_TELEPORT from the server:");
|
||||||
|
Log(" EntityID = %d", EntityID);
|
||||||
|
Log(" Pos = {%d, %d, %d}", BlockX, BlockY, BlockZ);
|
||||||
|
Log(" Yaw = %d", Yaw);
|
||||||
|
Log(" Pitch = %d", Pitch);
|
||||||
|
COPY_TO_CLIENT();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool cConnection::HandleServerKeepAlive(void)
|
bool cConnection::HandleServerKeepAlive(void)
|
||||||
{
|
{
|
||||||
HANDLE_SERVER_PACKET_READ(ReadBEInt, int, PingID);
|
HANDLE_SERVER_PACKET_READ(ReadBEInt, int, PingID);
|
||||||
|
@ -1415,6 +1571,59 @@ bool cConnection::ParseSlot(cByteBuffer & a_Buffer, AString & a_ItemDesc)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cConnection::ParseMetadata(cByteBuffer & a_Buffer, AString & a_Metadata)
|
||||||
|
{
|
||||||
|
char x;
|
||||||
|
if (!a_Buffer.ReadChar(x))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
a_Metadata.push_back(x);
|
||||||
|
while (x != 0x7f)
|
||||||
|
{
|
||||||
|
int Index = x & 0x1f; // Lower 5 bits = index
|
||||||
|
int Type = x >> 5; // Upper 3 bits = type
|
||||||
|
int Length = 0;
|
||||||
|
switch (Type)
|
||||||
|
{
|
||||||
|
case 0: Length = 1; break; // byte
|
||||||
|
case 1: Length = 2; break; // short
|
||||||
|
case 2: Length = 4; break; // int
|
||||||
|
case 3: Length = 4; break; // float
|
||||||
|
case 4: // string16
|
||||||
|
{
|
||||||
|
short Len = 0;
|
||||||
|
if (!a_Buffer.ReadBEShort(Len))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
short NetLen = htons(Len);
|
||||||
|
a_Metadata.append((char *)&NetLen, 2);
|
||||||
|
Length = Len;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 5: Length = 5; break; // short, byte, short
|
||||||
|
case 6: Length = 12; break; // 3 * int
|
||||||
|
} // switch (Type)
|
||||||
|
AString data;
|
||||||
|
if (!a_Buffer.ReadString(data, Length))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
a_Metadata.append(data);
|
||||||
|
if (!a_Buffer.ReadChar(x))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
a_Metadata.push_back(x);
|
||||||
|
} // while (x != 0x7f)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cConnection::SendEncryptionKeyResponse(const AString & a_ServerPublicKey, const AString & a_Nonce)
|
void cConnection::SendEncryptionKeyResponse(const AString & a_ServerPublicKey, const AString & a_Nonce)
|
||||||
{
|
{
|
||||||
// Generate the shared secret and encrypt using the server's public key
|
// Generate the shared secret and encrypt using the server's public key
|
||||||
|
|
|
@ -124,7 +124,15 @@ protected:
|
||||||
bool HandleServerCompass(void);
|
bool HandleServerCompass(void);
|
||||||
bool HandleServerEncryptionKeyRequest(void);
|
bool HandleServerEncryptionKeyRequest(void);
|
||||||
bool HandleServerEncryptionKeyResponse(void);
|
bool HandleServerEncryptionKeyResponse(void);
|
||||||
|
bool HandleServerEntity(void);
|
||||||
|
bool HandleServerEntityHeadLook(void);
|
||||||
|
bool HandleServerEntityMetadata(void);
|
||||||
bool HandleServerEntityEquipment(void);
|
bool HandleServerEntityEquipment(void);
|
||||||
|
bool HandleServerEntityLook(void);
|
||||||
|
bool HandleServerEntityRelativeMove(void);
|
||||||
|
bool HandleServerEntityRelativeMoveLook(void);
|
||||||
|
bool HandleServerEntityStatus(void);
|
||||||
|
bool HandleServerEntityTeleport(void);
|
||||||
bool HandleServerKeepAlive(void);
|
bool HandleServerKeepAlive(void);
|
||||||
bool HandleServerKick(void);
|
bool HandleServerKick(void);
|
||||||
bool HandleServerLogin(void);
|
bool HandleServerLogin(void);
|
||||||
|
@ -145,6 +153,9 @@ protected:
|
||||||
/// 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);
|
||||||
|
|
||||||
|
/// Parses the metadata in a_Buffer into raw metadata in an AString; returns true if successful, false if not enough data
|
||||||
|
bool ParseMetadata(cByteBuffer & a_Buffer, AString & a_Metadata);
|
||||||
|
|
||||||
/// Send EKResp to the server:
|
/// Send EKResp to the server:
|
||||||
void SendEncryptionKeyResponse(const AString & a_ServerPublicKey, const AString & a_Nonce);
|
void SendEncryptionKeyResponse(const AString & a_ServerPublicKey, const AString & a_Nonce);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user