Protocol 1.7: Added more server-bound packets.
This commit is contained in:
parent
cc54f4f836
commit
edc848439a
@ -26,7 +26,7 @@ Implements the 1.7.x protocol classes:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define HANDLE_PACKET_READ(Proc, Type, Var) \
|
#define HANDLE_READ(Proc, Type, Var) \
|
||||||
Type Var; \
|
Type Var; \
|
||||||
m_ReceivedData.Proc(Var);
|
m_ReceivedData.Proc(Var);
|
||||||
|
|
||||||
@ -34,6 +34,21 @@ Implements the 1.7.x protocol classes:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define HANDLE_PACKET_READ(Proc, Type, Var) \
|
||||||
|
Type Var; \
|
||||||
|
{ \
|
||||||
|
if (!m_ReceivedData.Proc(Var)) \
|
||||||
|
{ \
|
||||||
|
m_ReceivedData.CheckValid(); \
|
||||||
|
return false; \
|
||||||
|
} \
|
||||||
|
m_ReceivedData.CheckValid(); \
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
cProtocol172::cProtocol172(cClientHandle * a_Client, const AString & a_ServerAddress, UInt16 a_ServerPort, UInt32 a_State) :
|
cProtocol172::cProtocol172(cClientHandle * a_Client, const AString & a_ServerAddress, UInt16 a_ServerPort, UInt32 a_State) :
|
||||||
super(a_Client),
|
super(a_Client),
|
||||||
m_ServerAddress(a_ServerAddress),
|
m_ServerAddress(a_ServerAddress),
|
||||||
@ -1060,8 +1075,8 @@ void cProtocol172::HandlePacketLoginStart(UInt32 a_RemainingBytes)
|
|||||||
|
|
||||||
void cProtocol172::HandlePacketAnimation(UInt32 a_RemainingBytes)
|
void cProtocol172::HandlePacketAnimation(UInt32 a_RemainingBytes)
|
||||||
{
|
{
|
||||||
HANDLE_PACKET_READ(ReadBEInt, int, EntityID);
|
HANDLE_READ(ReadBEInt, int, EntityID);
|
||||||
HANDLE_PACKET_READ(ReadByte, Byte, Animation);
|
HANDLE_READ(ReadByte, Byte, Animation);
|
||||||
m_Client->HandleAnimation(Animation);
|
m_Client->HandleAnimation(Animation);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1071,11 +1086,11 @@ void cProtocol172::HandlePacketAnimation(UInt32 a_RemainingBytes)
|
|||||||
|
|
||||||
void cProtocol172::HandlePacketBlockDig(UInt32 a_RemainingBytes)
|
void cProtocol172::HandlePacketBlockDig(UInt32 a_RemainingBytes)
|
||||||
{
|
{
|
||||||
HANDLE_PACKET_READ(ReadByte, Byte, Status);
|
HANDLE_READ(ReadByte, Byte, Status);
|
||||||
HANDLE_PACKET_READ(ReadBEInt, int, BlockX);
|
HANDLE_READ(ReadBEInt, int, BlockX);
|
||||||
HANDLE_PACKET_READ(ReadByte, Byte, BlockY);
|
HANDLE_READ(ReadByte, Byte, BlockY);
|
||||||
HANDLE_PACKET_READ(ReadBEInt, int, BlockZ);
|
HANDLE_READ(ReadBEInt, int, BlockZ);
|
||||||
HANDLE_PACKET_READ(ReadByte, Byte, Face);
|
HANDLE_READ(ReadByte, Byte, Face);
|
||||||
m_Client->HandleLeftClick(BlockX, BlockY, BlockZ, Face, Status);
|
m_Client->HandleLeftClick(BlockX, BlockY, BlockZ, Face, Status);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1085,13 +1100,13 @@ void cProtocol172::HandlePacketBlockDig(UInt32 a_RemainingBytes)
|
|||||||
|
|
||||||
void cProtocol172::HandlePacketBlockPlace(UInt32 a_RemainingBytes)
|
void cProtocol172::HandlePacketBlockPlace(UInt32 a_RemainingBytes)
|
||||||
{
|
{
|
||||||
HANDLE_PACKET_READ(ReadBEInt, int, BlockX);
|
HANDLE_READ(ReadBEInt, int, BlockX);
|
||||||
HANDLE_PACKET_READ(ReadByte, Byte, BlockY);
|
HANDLE_READ(ReadByte, Byte, BlockY);
|
||||||
HANDLE_PACKET_READ(ReadBEInt, int, BlockZ);
|
HANDLE_READ(ReadBEInt, int, BlockZ);
|
||||||
HANDLE_PACKET_READ(ReadByte, Byte, Face);
|
HANDLE_READ(ReadByte, Byte, Face);
|
||||||
HANDLE_PACKET_READ(ReadByte, Byte, CursorX);
|
HANDLE_READ(ReadByte, Byte, CursorX);
|
||||||
HANDLE_PACKET_READ(ReadByte, Byte, CursorY);
|
HANDLE_READ(ReadByte, Byte, CursorY);
|
||||||
HANDLE_PACKET_READ(ReadByte, Byte, CursorZ);
|
HANDLE_READ(ReadByte, Byte, CursorZ);
|
||||||
m_Client->HandleRightClick(BlockX, BlockY, BlockZ, Face, CursorX, CursorY, CursorZ, m_Client->GetPlayer()->GetEquippedItem());
|
m_Client->HandleRightClick(BlockX, BlockY, BlockZ, Face, CursorX, CursorY, CursorZ, m_Client->GetPlayer()->GetEquippedItem());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1101,7 +1116,7 @@ void cProtocol172::HandlePacketBlockPlace(UInt32 a_RemainingBytes)
|
|||||||
|
|
||||||
void cProtocol172::HandlePacketChatMessage(UInt32 a_RemainingBytes)
|
void cProtocol172::HandlePacketChatMessage(UInt32 a_RemainingBytes)
|
||||||
{
|
{
|
||||||
HANDLE_PACKET_READ(ReadVarUTF8String, AString, Message);
|
HANDLE_READ(ReadVarUTF8String, AString, Message);
|
||||||
m_Client->HandleChat(Message);
|
m_Client->HandleChat(Message);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1111,12 +1126,12 @@ void cProtocol172::HandlePacketChatMessage(UInt32 a_RemainingBytes)
|
|||||||
|
|
||||||
void cProtocol172::HandlePacketClientSettings(UInt32 a_RemainingBytes)
|
void cProtocol172::HandlePacketClientSettings(UInt32 a_RemainingBytes)
|
||||||
{
|
{
|
||||||
HANDLE_PACKET_READ(ReadVarUTF8String, AString, Locale);
|
HANDLE_READ(ReadVarUTF8String, AString, Locale);
|
||||||
HANDLE_PACKET_READ(ReadByte, Byte, ViewDistance);
|
HANDLE_READ(ReadByte, Byte, ViewDistance);
|
||||||
HANDLE_PACKET_READ(ReadByte, Byte, ChatFlags);
|
HANDLE_READ(ReadByte, Byte, ChatFlags);
|
||||||
HANDLE_PACKET_READ(ReadByte, Byte, Unused);
|
HANDLE_READ(ReadByte, Byte, Unused);
|
||||||
HANDLE_PACKET_READ(ReadByte, Byte, Difficulty);
|
HANDLE_READ(ReadByte, Byte, Difficulty);
|
||||||
HANDLE_PACKET_READ(ReadByte, Byte, ShowCape);
|
HANDLE_READ(ReadByte, Byte, ShowCape);
|
||||||
// TODO: handle in m_Client
|
// TODO: handle in m_Client
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1126,7 +1141,7 @@ void cProtocol172::HandlePacketClientSettings(UInt32 a_RemainingBytes)
|
|||||||
|
|
||||||
void cProtocol172::HandlePacketClientStatus(UInt32 a_RemainingBytes)
|
void cProtocol172::HandlePacketClientStatus(UInt32 a_RemainingBytes)
|
||||||
{
|
{
|
||||||
HANDLE_PACKET_READ(ReadByte, Byte, ActionID);
|
HANDLE_READ(ReadByte, Byte, ActionID);
|
||||||
switch (ActionID)
|
switch (ActionID)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
@ -1156,7 +1171,13 @@ void cProtocol172::HandlePacketClientStatus(UInt32 a_RemainingBytes)
|
|||||||
|
|
||||||
void cProtocol172::HandlePacketCreativeInventoryAction(UInt32 a_RemainingBytes)
|
void cProtocol172::HandlePacketCreativeInventoryAction(UInt32 a_RemainingBytes)
|
||||||
{
|
{
|
||||||
// TODO
|
HANDLE_READ(ReadBEShort, short, SlotNum);
|
||||||
|
cItem Item;
|
||||||
|
if (!ReadItem(Item))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_Client->HandleCreativeInventory(SlotNum, Item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1165,7 +1186,10 @@ void cProtocol172::HandlePacketCreativeInventoryAction(UInt32 a_RemainingBytes)
|
|||||||
|
|
||||||
void cProtocol172::HandlePacketEntityAction(UInt32 a_RemainingBytes)
|
void cProtocol172::HandlePacketEntityAction(UInt32 a_RemainingBytes)
|
||||||
{
|
{
|
||||||
// TODO
|
HANDLE_READ(ReadBEInt, int, PlayerID);
|
||||||
|
HANDLE_READ(ReadByte, Byte, Action);
|
||||||
|
HANDLE_READ(ReadBEInt, int, JumpBoost);
|
||||||
|
m_Client->HandleEntityAction(PlayerID, Action);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1337,6 +1361,89 @@ void cProtocol172::SendData(const char * a_Data, int a_Size)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cProtocol172::ReadItem(cItem & a_Item)
|
||||||
|
{
|
||||||
|
HANDLE_PACKET_READ(ReadBEShort, short, ItemType);
|
||||||
|
if (ItemType == -1)
|
||||||
|
{
|
||||||
|
// The item is empty, no more data follows
|
||||||
|
a_Item.Empty();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
a_Item.m_ItemType = ItemType;
|
||||||
|
|
||||||
|
HANDLE_PACKET_READ(ReadChar, char, ItemCount);
|
||||||
|
HANDLE_PACKET_READ(ReadBEShort, short, ItemDamage);
|
||||||
|
a_Item.m_ItemCount = ItemCount;
|
||||||
|
a_Item.m_ItemDamage = ItemDamage;
|
||||||
|
if (ItemCount <= 0)
|
||||||
|
{
|
||||||
|
a_Item.Empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
HANDLE_PACKET_READ(ReadBEShort, short, MetadataLength);
|
||||||
|
if (MetadataLength <= 0)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read the metadata
|
||||||
|
AString Metadata;
|
||||||
|
if (!m_ReceivedData.ReadString(Metadata, MetadataLength))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ParseItemMetadata(a_Item, Metadata);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cProtocol172::ParseItemMetadata(cItem & a_Item, const AString & a_Metadata)
|
||||||
|
{
|
||||||
|
// Uncompress the GZIPped data:
|
||||||
|
AString Uncompressed;
|
||||||
|
if (UncompressStringGZIP(a_Metadata.data(), a_Metadata.size(), Uncompressed) != Z_OK)
|
||||||
|
{
|
||||||
|
AString HexDump;
|
||||||
|
CreateHexDump(HexDump, a_Metadata.data(), a_Metadata.size(), 16);
|
||||||
|
LOGWARNING("Cannot unGZIP item metadata (%u bytes):\n%s", a_Metadata.size(), HexDump.c_str());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parse into NBT:
|
||||||
|
cParsedNBT NBT(Uncompressed.data(), Uncompressed.size());
|
||||||
|
if (!NBT.IsValid())
|
||||||
|
{
|
||||||
|
AString HexDump;
|
||||||
|
CreateHexDump(HexDump, Uncompressed.data(), Uncompressed.size(), 16);
|
||||||
|
LOGWARNING("Cannot parse NBT item metadata: (%u bytes)\n%s", Uncompressed.size(), HexDump.c_str());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load enchantments from the NBT:
|
||||||
|
for (int tag = NBT.GetFirstChild(NBT.GetRoot()); tag >= 0; tag = NBT.GetNextSibling(tag))
|
||||||
|
{
|
||||||
|
if (
|
||||||
|
(NBT.GetType(tag) == TAG_List) &&
|
||||||
|
(
|
||||||
|
(NBT.GetName(tag) == "ench") ||
|
||||||
|
(NBT.GetName(tag) == "StoredEnchantments")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
a_Item.m_Enchantments.ParseFromNBT(NBT, tag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// cProtocol172::cPacketizer:
|
// cProtocol172::cPacketizer:
|
||||||
|
|
||||||
|
@ -244,6 +244,12 @@ protected:
|
|||||||
virtual void SendData(const char * a_Data, int a_Size) override;
|
virtual void SendData(const char * a_Data, int a_Size) override;
|
||||||
|
|
||||||
void SendCompass(const cWorld & a_World);
|
void SendCompass(const cWorld & a_World);
|
||||||
|
|
||||||
|
/// Reads an item out of the received data, sets a_Item to the values read. Returns false if not enough received data
|
||||||
|
bool ReadItem(cItem & a_Item);
|
||||||
|
|
||||||
|
/// Parses item metadata as read by ReadItem(), into the item enchantments.
|
||||||
|
void ParseItemMetadata(cItem & a_Item, const AString & a_Metadata);
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user