Cuberite
A lightweight, fast and extensible game server for Minecraft
ChunkDataSerializer.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "../ByteBuffer.h"
4 #include "../ChunkData.h"
5 #include "../Defines.h"
7 #include "StringCompression.h"
8 
9 
10 
11 
12 
13 class cByteBuffer;
14 
15 
16 
17 
18 
23 {
24  using ClientHandles = std::vector<std::shared_ptr<cClientHandle>>;
25 
27  enum class CacheVersion
28  {
29  v47,
30  v107,
31  v110,
32  v393,
33  v401,
34  v477,
35 
37  };
38 
41  {
43  bool Engaged = false;
44  };
45 
46 public:
47 
48  cChunkDataSerializer(eDimension a_Dimension);
49 
52  void SendToClients(int a_ChunkX, int a_ChunkZ, const ChunkBlockData & a_BlockData, const ChunkLightData & a_LightData, const unsigned char * a_BiomeMap, const ClientHandles & a_SendTo);
53 
54 private:
55 
58  inline void Serialize(const ClientHandles::value_type & a_Client, int a_ChunkX, int a_ChunkZ, const ChunkBlockData & a_BlockData, const ChunkLightData & a_LightData, const unsigned char * a_BiomeMap, CacheVersion a_CacheVersion);
59 
60  inline void Serialize47 (int a_ChunkX, int a_ChunkZ, const ChunkBlockData & a_BlockData, const ChunkLightData & a_LightData, const unsigned char * a_BiomeMap); // Release 1.8
61  inline void Serialize107(int a_ChunkX, int a_ChunkZ, const ChunkBlockData & a_BlockData, const ChunkLightData & a_LightData, const unsigned char * a_BiomeMap); // Release 1.9
62  inline void Serialize110(int a_ChunkX, int a_ChunkZ, const ChunkBlockData & a_BlockData, const ChunkLightData & a_LightData, const unsigned char * a_BiomeMap); // Release 1.9.4
63  template <auto Palette>
64  inline void Serialize393(int a_ChunkX, int a_ChunkZ, const ChunkBlockData & a_BlockData, const ChunkLightData & a_LightData, const unsigned char * a_BiomeMap); // Release 1.13 - 1.13.2
65  inline void Serialize477(int a_ChunkX, int a_ChunkZ, const ChunkBlockData & a_BlockData, const ChunkLightData & a_LightData, const unsigned char * a_BiomeMap); // Release 1.14 - 1.14.4
66 
69  template <auto Palette>
70  inline void WriteBlockSectionSeamless(const ChunkBlockData::BlockArray * a_Blocks, const ChunkBlockData::MetaArray * a_Metas, UInt8 a_BitsPerEntry);
71 
73  inline void WriteLightSectionGrouped(const ChunkLightData::LightArray * a_BlockLights, const ChunkLightData::LightArray * a_SkyLights);
74 
76  inline void CompressPacketInto(ChunkDataCache & a_Cache);
77 
80 
83 
86 
89  std::array<ChunkDataCache, static_cast<size_t>(CacheVersion::Last) + 1> m_Cache;
90 } ;
eDimension
Dimension of a world.
Definition: Defines.h:231
unsigned char UInt8
Definition: Globals.h:159
std::basic_string< std::byte > ContiguousByteBuffer
Definition: Globals.h:375
An object that can store incoming bytes and lets its clients read the bytes sequentially The bytes ar...
Definition: ByteBuffer.h:32
decltype(m_Blocks)::Type BlockArray
Definition: ChunkData.h:75
decltype(m_Metas)::Type MetaArray
Definition: ChunkData.h:76
decltype(m_BlockLights)::Type LightArray
Definition: ChunkData.h:115
Serializes one chunk's data to (possibly multiple) protocol versions.
void WriteLightSectionGrouped(const ChunkLightData::LightArray *a_BlockLights, const ChunkLightData::LightArray *a_SkyLights)
Copies all lights in a chunk section into the packet, block light followed immediately by sky light.
void WriteBlockSectionSeamless(const ChunkBlockData::BlockArray *a_Blocks, const ChunkBlockData::MetaArray *a_Metas, UInt8 a_BitsPerEntry)
Writes all blocks in a chunk section into a series of Int64.
CircularBufferCompressor m_Compressor
A compressor used to compress the chunk data.
void Serialize47(int a_ChunkX, int a_ChunkZ, const ChunkBlockData &a_BlockData, const ChunkLightData &a_LightData, const unsigned char *a_BiomeMap)
void Serialize393(int a_ChunkX, int a_ChunkZ, const ChunkBlockData &a_BlockData, const ChunkLightData &a_LightData, const unsigned char *a_BiomeMap)
void Serialize(const ClientHandles::value_type &a_Client, int a_ChunkX, int a_ChunkZ, const ChunkBlockData &a_BlockData, const ChunkLightData &a_LightData, const unsigned char *a_BiomeMap, CacheVersion a_CacheVersion)
Serialises the given chunk, storing the result into the given cache entry, and sends the data.
cChunkDataSerializer(eDimension a_Dimension)
void Serialize110(int a_ChunkX, int a_ChunkZ, const ChunkBlockData &a_BlockData, const ChunkLightData &a_LightData, const unsigned char *a_BiomeMap)
CacheVersion
Enum to collapse protocol versions into a contiguous index.
const eDimension m_Dimension
The dimension for the World this Serializer is tied to.
std::vector< std::shared_ptr< cClientHandle > > ClientHandles
void CompressPacketInto(ChunkDataCache &a_Cache)
Finalises the data, compresses it if required, and stores it into cache.
void SendToClients(int a_ChunkX, int a_ChunkZ, const ChunkBlockData &a_BlockData, const ChunkLightData &a_LightData, const unsigned char *a_BiomeMap, const ClientHandles &a_SendTo)
For each client, serializes the chunk into their protocol version and sends it.
cByteBuffer m_Packet
A staging area used to construct the chunk packet, persistent to avoid reallocating.
void Serialize477(int a_ChunkX, int a_ChunkZ, const ChunkBlockData &a_BlockData, const ChunkLightData &a_LightData, const unsigned char *a_BiomeMap)
void Serialize107(int a_ChunkX, int a_ChunkZ, const ChunkBlockData &a_BlockData, const ChunkLightData &a_LightData, const unsigned char *a_BiomeMap)
std::array< ChunkDataCache, static_cast< size_t >CacheVersion::Last)+1 > m_Cache
A cache, mapping protocol version to a fully serialised chunk.
A single cache entry containing the raw data, compressed data, and a validity flag.