diff --git a/src/Protocol/Protocol.h b/src/Protocol/Protocol.h index c2b3cd3f0..817d0bef0 100644 --- a/src/Protocol/Protocol.h +++ b/src/Protocol/Protocol.h @@ -339,7 +339,9 @@ public: Version_1_12 = 335, Version_1_12_1 = 338, Version_1_12_2 = 340, - Version_1_13 = 393 + Version_1_13 = 393, + Version_1_13_1 = 401, + Version_1_13_2 = 404 // TODO: this constant should be in WebServer }; /** Called when client sends some data */ diff --git a/src/Protocol/ProtocolRecognizer.cpp b/src/Protocol/ProtocolRecognizer.cpp index 46c2d239f..a6aa901c9 100644 --- a/src/Protocol/ProtocolRecognizer.cpp +++ b/src/Protocol/ProtocolRecognizer.cpp @@ -74,6 +74,8 @@ AString cMultiVersionProtocol::GetVersionTextFromInt(cProtocol::Version a_Protoc case cProtocol::Version::Version_1_12_1: return "1.12.1"; case cProtocol::Version::Version_1_12_2: return "1.12.2"; case cProtocol::Version::Version_1_13: return "1.13"; + case cProtocol::Version::Version_1_13_1: return "1.13.1"; + case cProtocol::Version::Version_1_13_2: return "1.13.2"; } ASSERT(!"Unknown protocol version"); return Printf("Unknown protocol (%d)", a_ProtocolVersion); @@ -295,6 +297,8 @@ std::unique_ptr cMultiVersionProtocol::TryRecognizeLengthedProtocol(c case cProtocol::Version::Version_1_12_1: return std::make_unique(&a_Client, ServerAddress, ServerPort, NextState); case cProtocol::Version::Version_1_12_2: return std::make_unique(&a_Client, ServerAddress, ServerPort, NextState); case cProtocol::Version::Version_1_13: return std::make_unique(&a_Client, ServerAddress, ServerPort, NextState); + case cProtocol::Version::Version_1_13_1: return std::make_unique(&a_Client, ServerAddress, ServerPort, NextState); + case cProtocol::Version::Version_1_13_2: return std::make_unique(&a_Client, ServerAddress, ServerPort, NextState); default: { LOGD("Client \"%s\" uses an unsupported protocol (lengthed, version %u (0x%x))", diff --git a/src/Protocol/Protocol_1_13.cpp b/src/Protocol/Protocol_1_13.cpp index f26b1900a..b08622fc6 100644 --- a/src/Protocol/Protocol_1_13.cpp +++ b/src/Protocol/Protocol_1_13.cpp @@ -33,6 +33,7 @@ Implements the 1.13 protocol classes: #include "Palettes/Upgrade.h" #include "Palettes/Palette_1_13.h" +#include "Palettes/Palette_1_13_1.h" @@ -68,14 +69,8 @@ Implements the 1.13 protocol classes: -cProtocol_1_13::cProtocol_1_13(cClientHandle * a_Client, const AString & a_ServerAddress, UInt16 a_ServerPort, UInt32 a_State) : - Super(a_Client, a_ServerAddress, a_ServerPort, a_State) -{ -} - - - - +//////////////////////////////////////////////////////////////////////////////// +// cProtocol_1_13: void cProtocol_1_13::SendBlockChange(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) { @@ -562,6 +557,24 @@ UInt8 cProtocol_1_13::GetEntityMetadataID(eEntityMetadataType a_FieldType) +std::pair cProtocol_1_13::GetItemFromProtocolID(UInt32 a_ProtocolID) +{ + return PaletteUpgrade::ToItem(Palette_1_13::ToItem(a_ProtocolID)); +} + + + + + +UInt32 cProtocol_1_13::GetProtocolIDFromItem(short a_ItemID, short a_ItemDamage) +{ + return Palette_1_13::FromItem(PaletteUpgrade::FromItem(a_ItemID, a_ItemDamage)); +} + + + + + bool cProtocol_1_13::ReadItem(cByteBuffer & a_ByteBuffer, cItem & a_Item, size_t a_KeepRemainingBytes) { HANDLE_PACKET_READ(a_ByteBuffer, ReadBEInt16, Int16, ItemID); @@ -572,7 +585,7 @@ bool cProtocol_1_13::ReadItem(cByteBuffer & a_ByteBuffer, cItem & a_Item, size_t return true; } - const auto Translated = PaletteUpgrade::ToItem(Palette_1_13::ToItem(ItemID)); + const auto Translated = GetItemFromProtocolID(ItemID); a_Item.m_ItemType = Translated.first; a_Item.m_ItemDamage = Translated.second; @@ -615,8 +628,7 @@ void cProtocol_1_13::WriteItem(cPacketizer & a_Pkt, const cItem & a_Item) } // Normal item - // TODO: use new item ids - a_Pkt.WriteBEInt16(Palette_1_13::FromItem(PaletteUpgrade::FromItem(a_Item.m_ItemType, a_Item.m_ItemDamage))); + a_Pkt.WriteBEInt16(GetProtocolIDFromItem(a_Item.m_ItemType, a_Item.m_ItemDamage)); a_Pkt.WriteBEInt8(a_Item.m_ItemCount); // TODO: NBT @@ -1157,3 +1169,113 @@ void cProtocol_1_13::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_Mo } } // switch (a_Mob.GetType()) } + + + + + +//////////////////////////////////////////////////////////////////////////////// +// cProtocol_1_13_1: + +cProtocol::Version cProtocol_1_13_1::GetProtocolVersion() +{ + return Version::Version_1_13_1; +} + + + + + +std::pair cProtocol_1_13_1::GetItemFromProtocolID(UInt32 a_ProtocolID) +{ + return PaletteUpgrade::ToItem(Palette_1_13_1::ToItem(a_ProtocolID)); +} + + + + + +UInt32 cProtocol_1_13_1::GetProtocolIDFromItem(short a_ItemID, short a_ItemDamage) +{ + return Palette_1_13_1::FromItem(PaletteUpgrade::FromItem(a_ItemID, a_ItemDamage)); +} + + + + + +//////////////////////////////////////////////////////////////////////////////// +// cProtocol_1_13_2: + +cProtocol::Version cProtocol_1_13_2::GetProtocolVersion() +{ + return Version::Version_1_13_2; +} + + + + + +bool cProtocol_1_13_2::ReadItem(cByteBuffer & a_ByteBuffer, cItem & a_Item, size_t a_KeepRemainingBytes) +{ + HANDLE_PACKET_READ(a_ByteBuffer, ReadBool, bool, Present); + if (!Present) + { + // The item is empty, no more data follows + a_Item.Empty(); + return true; + } + + HANDLE_PACKET_READ(a_ByteBuffer, ReadVarInt32, UInt32, ItemID); + const auto Translated = GetItemFromProtocolID(ItemID); + a_Item.m_ItemType = Translated.first; + a_Item.m_ItemDamage = Translated.second; + + HANDLE_PACKET_READ(a_ByteBuffer, ReadBEInt8, Int8, ItemCount); + a_Item.m_ItemCount = ItemCount; + if (ItemCount <= 0) + { + a_Item.Empty(); + } + + AString Metadata; + if (!a_ByteBuffer.ReadString(Metadata, a_ByteBuffer.GetReadableSpace() - a_KeepRemainingBytes - 1) || (Metadata.size() == 0) || (Metadata[0] == 0)) + { + // No metadata + return true; + } + + ParseItemMetadata(a_Item, Metadata); + return true; +} + + + + + +void cProtocol_1_13_2::WriteItem(cPacketizer & a_Pkt, const cItem & a_Item) +{ + short ItemType = a_Item.m_ItemType; + ASSERT(ItemType >= -1); // Check validity of packets in debug runtime + if (ItemType <= 0) + { + // Fix, to make sure no invalid values are sent. + ItemType = -1; + } + + if (a_Item.IsEmpty()) + { + a_Pkt.WriteBool(false); + return; + } + + // Item present + a_Pkt.WriteBool(true); + + // Normal item + a_Pkt.WriteVarInt32(GetProtocolIDFromItem(a_Item.m_ItemType, a_Item.m_ItemDamage)); + a_Pkt.WriteBEInt8(a_Item.m_ItemCount); + + // TODO: NBT + a_Pkt.WriteBEInt8(0); +} diff --git a/src/Protocol/Protocol_1_13.h b/src/Protocol/Protocol_1_13.h index b315768ba..62f9cf2e4 100644 --- a/src/Protocol/Protocol_1_13.h +++ b/src/Protocol/Protocol_1_13.h @@ -35,7 +35,7 @@ class cProtocol_1_13: public: - cProtocol_1_13(cClientHandle * a_Client, const AString & a_ServerAddress, UInt16 a_ServerPort, UInt32 a_State); + using Super::cProtocol_1_12_2; protected: @@ -67,6 +67,8 @@ protected: virtual UInt8 GetEntityMetadataID(eEntityMetadata a_Metadata); virtual UInt8 GetEntityMetadataID(eEntityMetadataType a_FieldType); + virtual std::pair GetItemFromProtocolID(UInt32 a_ProtocolID); + virtual UInt32 GetProtocolIDFromItem(short a_ItemID, short a_ItemDamage); virtual bool ReadItem(cByteBuffer & a_ByteBuffer, cItem & a_Item, size_t a_KeepRemainingBytes) override; virtual void WriteItem(cPacketizer & a_Pkt, const cItem & a_Item) override; @@ -74,3 +76,45 @@ protected: virtual void WriteEntityMetadata(cPacketizer & a_Pkt, const cEntity & a_Entity) override; virtual void WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_Mob) override; }; + + + + + +class cProtocol_1_13_1 : + public cProtocol_1_13 +{ + using Super = cProtocol_1_13; + +public: + + using Super::cProtocol_1_13; + +protected: + + /** Returns 1.13.1 */ + virtual Version GetProtocolVersion() override; + virtual std::pair GetItemFromProtocolID(UInt32 a_ProtocolID) override; + virtual UInt32 GetProtocolIDFromItem(short a_ItemID, short a_ItemDamage) override; +}; + + + + + +class cProtocol_1_13_2 : + public cProtocol_1_13_1 +{ + using Super = cProtocol_1_13_1; + +public: + + using Super::Super; + +protected: + + /** Returns 1.13.2 */ + virtual Version GetProtocolVersion() override; + virtual bool ReadItem(cByteBuffer & a_ByteBuffer, cItem & a_Item, size_t a_KeepRemainingBytes) override; + virtual void WriteItem(cPacketizer & a_Pkt, const cItem & a_Item) override; +};