1
0

1.13.1, 1.13.2 connection support

This commit is contained in:
Tiger Wang 2020-07-19 00:41:29 +01:00
parent 1b9b587734
commit c99ddbc376
4 changed files with 185 additions and 13 deletions

View File

@ -339,7 +339,9 @@ public:
Version_1_12 = 335, Version_1_12 = 335,
Version_1_12_1 = 338, Version_1_12_1 = 338,
Version_1_12_2 = 340, 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 */ /** Called when client sends some data */

View File

@ -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_1: return "1.12.1";
case cProtocol::Version::Version_1_12_2: return "1.12.2"; 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: 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"); ASSERT(!"Unknown protocol version");
return Printf("Unknown protocol (%d)", a_ProtocolVersion); return Printf("Unknown protocol (%d)", a_ProtocolVersion);
@ -295,6 +297,8 @@ std::unique_ptr<cProtocol> cMultiVersionProtocol::TryRecognizeLengthedProtocol(c
case cProtocol::Version::Version_1_12_1: return std::make_unique<cProtocol_1_12_1>(&a_Client, ServerAddress, ServerPort, NextState); case cProtocol::Version::Version_1_12_1: return std::make_unique<cProtocol_1_12_1>(&a_Client, ServerAddress, ServerPort, NextState);
case cProtocol::Version::Version_1_12_2: return std::make_unique<cProtocol_1_12_2>(&a_Client, ServerAddress, ServerPort, NextState); case cProtocol::Version::Version_1_12_2: return std::make_unique<cProtocol_1_12_2>(&a_Client, ServerAddress, ServerPort, NextState);
case cProtocol::Version::Version_1_13: return std::make_unique<cProtocol_1_13>(&a_Client, ServerAddress, ServerPort, NextState); case cProtocol::Version::Version_1_13: return std::make_unique<cProtocol_1_13>(&a_Client, ServerAddress, ServerPort, NextState);
case cProtocol::Version::Version_1_13_1: return std::make_unique<cProtocol_1_13_1>(&a_Client, ServerAddress, ServerPort, NextState);
case cProtocol::Version::Version_1_13_2: return std::make_unique<cProtocol_1_13_2>(&a_Client, ServerAddress, ServerPort, NextState);
default: default:
{ {
LOGD("Client \"%s\" uses an unsupported protocol (lengthed, version %u (0x%x))", LOGD("Client \"%s\" uses an unsupported protocol (lengthed, version %u (0x%x))",

View File

@ -33,6 +33,7 @@ Implements the 1.13 protocol classes:
#include "Palettes/Upgrade.h" #include "Palettes/Upgrade.h"
#include "Palettes/Palette_1_13.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) 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<short, short> 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) bool cProtocol_1_13::ReadItem(cByteBuffer & a_ByteBuffer, cItem & a_Item, size_t a_KeepRemainingBytes)
{ {
HANDLE_PACKET_READ(a_ByteBuffer, ReadBEInt16, Int16, ItemID); 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; 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_ItemType = Translated.first;
a_Item.m_ItemDamage = Translated.second; a_Item.m_ItemDamage = Translated.second;
@ -615,8 +628,7 @@ void cProtocol_1_13::WriteItem(cPacketizer & a_Pkt, const cItem & a_Item)
} }
// Normal item // Normal item
// TODO: use new item ids a_Pkt.WriteBEInt16(GetProtocolIDFromItem(a_Item.m_ItemType, a_Item.m_ItemDamage));
a_Pkt.WriteBEInt16(Palette_1_13::FromItem(PaletteUpgrade::FromItem(a_Item.m_ItemType, a_Item.m_ItemDamage)));
a_Pkt.WriteBEInt8(a_Item.m_ItemCount); a_Pkt.WriteBEInt8(a_Item.m_ItemCount);
// TODO: NBT // TODO: NBT
@ -1157,3 +1169,113 @@ void cProtocol_1_13::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_Mo
} }
} // switch (a_Mob.GetType()) } // switch (a_Mob.GetType())
} }
////////////////////////////////////////////////////////////////////////////////
// cProtocol_1_13_1:
cProtocol::Version cProtocol_1_13_1::GetProtocolVersion()
{
return Version::Version_1_13_1;
}
std::pair<short, short> 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);
}

View File

@ -35,7 +35,7 @@ class cProtocol_1_13:
public: public:
cProtocol_1_13(cClientHandle * a_Client, const AString & a_ServerAddress, UInt16 a_ServerPort, UInt32 a_State); using Super::cProtocol_1_12_2;
protected: protected:
@ -67,6 +67,8 @@ protected:
virtual UInt8 GetEntityMetadataID(eEntityMetadata a_Metadata); virtual UInt8 GetEntityMetadataID(eEntityMetadata a_Metadata);
virtual UInt8 GetEntityMetadataID(eEntityMetadataType a_FieldType); virtual UInt8 GetEntityMetadataID(eEntityMetadataType a_FieldType);
virtual std::pair<short, short> 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 bool ReadItem(cByteBuffer & a_ByteBuffer, cItem & a_Item, size_t a_KeepRemainingBytes) override;
virtual void WriteItem(cPacketizer & a_Pkt, const cItem & a_Item) 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 WriteEntityMetadata(cPacketizer & a_Pkt, const cEntity & a_Entity) override;
virtual void WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_Mob) 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<short, short> 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;
};