2018-07-31 19:21:44 -04:00
// Protocol_1_13.h
/*
Declares the 1.13 protocol classes :
- cProtocol_1_13
- release 1.13 protocol ( # 393 )
2020-07-19 18:11:02 -04:00
- cProtocol_1_13_1
- release 1.13 .1 protocol ( # 401 )
- cProtocol_1_13_2
- release 1.13 .2 protocol ( # 404 )
2018-07-31 19:21:44 -04:00
*/
# pragma once
# include "Protocol_1_12.h"
2020-07-20 04:56:27 -04:00
# include "Packetizer.h"
# include "Palettes/Upgrade.h"
2020-01-03 11:31:13 -05:00
2020-04-13 12:38:06 -04:00
class cProtocol_1_13 :
2018-07-31 19:21:44 -04:00
public cProtocol_1_12_2
{
2020-04-13 12:38:06 -04:00
using Super = cProtocol_1_12_2 ;
2018-07-31 19:21:44 -04:00
public :
2020-04-13 12:38:06 -04:00
2020-07-18 19:41:29 -04:00
using Super : : cProtocol_1_12_2 ;
2018-07-31 19:21:44 -04:00
protected :
virtual void SendBlockChange ( int a_BlockX , int a_BlockY , int a_BlockZ , BLOCKTYPE a_BlockType , NIBBLETYPE a_BlockMeta ) override ;
2020-07-20 03:55:11 -04:00
template < auto Palette > void SendBlockChange ( int a_BlockX , int a_BlockY , int a_BlockZ , BLOCKTYPE a_BlockType , NIBBLETYPE a_BlockMeta ) ; // Template to avoid virtual calls in tight loops
2018-07-31 19:21:44 -04:00
virtual void SendBlockChanges ( int a_ChunkX , int a_ChunkZ , const sSetBlockVector & a_Changes ) override ;
2020-07-20 04:56:27 -04:00
/** Common implementation of multiblock change sending, templated to avoid virtual calls in tight loops. */
template < auto Palette > void SendBlockChanges ( int a_ChunkX , int a_ChunkZ , const sSetBlockVector & a_Changes )
{
ASSERT ( m_State = = 3 ) ; // In game mode?
cPacketizer Pkt ( * this , pktBlockChanges ) ;
Pkt . WriteBEInt32 ( a_ChunkX ) ;
Pkt . WriteBEInt32 ( a_ChunkZ ) ;
Pkt . WriteVarInt32 ( static_cast < UInt32 > ( a_Changes . size ( ) ) ) ;
for ( const auto & Change : a_Changes )
{
Int16 Coords = static_cast < Int16 > ( Change . m_RelY | ( Change . m_RelZ < < 8 ) | ( Change . m_RelX < < 12 ) ) ;
Pkt . WriteBEInt16 ( Coords ) ;
Pkt . WriteVarInt32 ( Palette ( PaletteUpgrade : : FromBlock ( Change . m_BlockType , Change . m_BlockMeta ) ) ) ;
} // for itr - a_Changes[]
}
2018-07-31 19:21:44 -04:00
virtual void SendMapData ( const cMap & a_Map , int a_DataStartX , int a_DataStartY ) override ;
virtual void SendPaintingSpawn ( const cPainting & a_Painting ) override ;
2020-07-17 14:33:02 -04:00
virtual void SendParticleEffect ( const AString & a_ParticleName , Vector3f a_Src , Vector3f a_Offset , float a_ParticleData , int a_ParticleAmount , std : : array < int , 2 > a_Data ) override ;
2018-07-31 19:21:44 -04:00
virtual void SendPluginMessage ( const AString & a_Channel , const AString & a_Message ) override ;
virtual void SendScoreboardObjective ( const AString & a_Name , const AString & a_DisplayName , Byte a_Mode ) override ;
virtual void SendStatistics ( const cStatManager & a_Manager ) override ;
virtual void SendTabCompletionResults ( const AStringVector & a_Results ) override ;
virtual void SendUpdateBlockEntity ( cBlockEntity & a_BlockEntity ) override ;
2020-07-20 04:56:27 -04:00
/** Translates outgoing packet types. */
2020-07-17 14:33:02 -04:00
virtual UInt32 GetPacketID ( ePacketType a_PacketType ) override ;
2020-07-20 03:55:11 -04:00
/** Returns 1.13. */
virtual Version GetProtocolVersion ( ) override ;
2020-03-29 11:54:37 -04:00
/** Converts eMonsterType to protocol-specific mob types */
virtual UInt32 GetProtocolMobType ( eMonsterType a_MobType ) override ;
2020-07-17 14:33:02 -04:00
virtual UInt8 GetEntityMetadataID ( eEntityMetadata a_Metadata ) ;
virtual UInt8 GetEntityMetadataID ( eEntityMetadataType a_FieldType ) ;
2020-07-18 19:41:29 -04:00
virtual std : : pair < short , short > GetItemFromProtocolID ( UInt32 a_ProtocolID ) ;
virtual UInt32 GetProtocolIDFromItem ( short a_ItemID , short a_ItemDamage ) ;
2020-07-17 14:33:02 -04:00
2020-07-20 03:55:11 -04:00
virtual bool HandlePacket ( cByteBuffer & a_ByteBuffer , UInt32 a_PacketType ) override ;
virtual void HandlePacketPluginMessage ( cByteBuffer & a_ByteBuffer ) override ;
2018-07-31 19:21:44 -04:00
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 ;
2020-07-17 14:33:02 -04:00
virtual void WriteEntityMetadata ( cPacketizer & a_Pkt , const eEntityMetadata a_Metadata , const eEntityMetadataType a_FieldType ) ;
2018-07-31 19:21:44 -04:00
virtual void WriteEntityMetadata ( cPacketizer & a_Pkt , const cEntity & a_Entity ) override ;
2020-07-17 14:33:02 -04:00
virtual void WriteMobMetadata ( cPacketizer & a_Pkt , const cMonster & a_Mob ) override ;
2018-07-31 19:21:44 -04:00
} ;
2020-07-18 19:41:29 -04:00
class cProtocol_1_13_1 :
public cProtocol_1_13
{
using Super = cProtocol_1_13 ;
public :
using Super : : cProtocol_1_13 ;
protected :
2020-07-19 12:02:14 -04:00
virtual void SendBlockChange ( int a_BlockX , int a_BlockY , int a_BlockZ , BLOCKTYPE a_BlockType , NIBBLETYPE a_BlockMeta ) override ;
virtual void SendBlockChanges ( int a_ChunkX , int a_ChunkZ , const sSetBlockVector & a_Changes ) override ;
2020-07-18 19:41:29 -04:00
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 :
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 ;
} ;