diff options
author | Tiger Wang <ziwei.tiger@outlook.com> | 2021-03-06 13:59:39 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-06 13:59:39 +0100 |
commit | d9a2b8611c86252a0d080ead7d17095a54489b2d (patch) | |
tree | 372a0d91bbe655a7db98df8e40225632fe46416e | |
parent | Update Core (diff) | |
download | cuberite-d9a2b8611c86252a0d080ead7d17095a54489b2d.tar cuberite-d9a2b8611c86252a0d080ead7d17095a54489b2d.tar.gz cuberite-d9a2b8611c86252a0d080ead7d17095a54489b2d.tar.bz2 cuberite-d9a2b8611c86252a0d080ead7d17095a54489b2d.tar.lz cuberite-d9a2b8611c86252a0d080ead7d17095a54489b2d.tar.xz cuberite-d9a2b8611c86252a0d080ead7d17095a54489b2d.tar.zst cuberite-d9a2b8611c86252a0d080ead7d17095a54489b2d.zip |
Diffstat (limited to '')
-rw-r--r-- | src/ChunkData.h | 45 | ||||
-rw-r--r-- | src/Protocol/ChunkDataSerializer.cpp | 16 | ||||
-rw-r--r-- | src/WorldStorage/NBTChunkSerializer.cpp | 2 |
3 files changed, 27 insertions, 36 deletions
diff --git a/src/ChunkData.h b/src/ChunkData.h index a984b752e..69ae1d5b8 100644 --- a/src/ChunkData.h +++ b/src/ChunkData.h @@ -130,33 +130,24 @@ public: -namespace ChunkDef -{ - using cForEachSectionCallback = cFunctionRef<void( - size_t, - ChunkBlockData::BlockArray *, - ChunkBlockData::MetaArray *, - ChunkLightData::LightArray *, - ChunkLightData::LightArray *)>; - - /** Invokes the callback functor for every chunk section containing at least one present block or light section data. - This is used to collect all data for all sections. */ - inline void ForEachSection(const ChunkBlockData & a_BlockData, const ChunkLightData & a_LightData, cForEachSectionCallback a_Callback) - { - for (size_t Y = 0; Y < cChunkDef::NumSections; ++Y) - { - const auto Blocks = a_BlockData.GetSection(Y); - const auto Metas = a_BlockData.GetMetaSection(Y); - const auto BlockLights = a_LightData.GetBlockLightSection(Y); - const auto SkyLights = a_LightData.GetSkyLightSection(Y); - - if ((Blocks != nullptr) || (Metas != nullptr) || (BlockLights != nullptr) || (SkyLights != nullptr)) - { - a_Callback(Y, Blocks, Metas, BlockLights, SkyLights); - } - } - } -} +/** Invokes the callback functor for every chunk section containing at least one present block or light section data. +This is used to collect all data for all sections. +In macro form to work around a Visual Studio 2017 ICE bug. */ +#define ChunkDef_ForEachSection(BlockData, LightData, Callback) \ + do \ + { \ + for (size_t Y = 0; Y < cChunkDef::NumSections; ++Y) \ + { \ + const auto Blocks = BlockData.GetSection(Y); \ + const auto Metas = BlockData.GetMetaSection(Y); \ + const auto BlockLights = LightData.GetBlockLightSection(Y); \ + const auto SkyLights = LightData.GetSkyLightSection(Y); \ + if ((Blocks != nullptr) || (Metas != nullptr) || (BlockLights != nullptr) || (SkyLights != nullptr)) \ + { \ + Callback \ + } \ + } \ + } while (false) diff --git a/src/Protocol/ChunkDataSerializer.cpp b/src/Protocol/ChunkDataSerializer.cpp index 80a94d024..4d4b98374 100644 --- a/src/Protocol/ChunkDataSerializer.cpp +++ b/src/Protocol/ChunkDataSerializer.cpp @@ -21,7 +21,7 @@ namespace size_t Present = 0; UInt16 Mask = 0; - ChunkDef::ForEachSection(a_BlockData, a_LightData, [&Present, &Mask](const auto Y, auto, auto, auto, auto) + ChunkDef_ForEachSection(a_BlockData, a_LightData, { Present++; Mask |= (1 << Y); @@ -206,7 +206,7 @@ inline void cChunkDataSerializer::Serialize47(const int a_ChunkX, const int a_Ch // each array stores all present sections of the same kind packed together // Write the block types to the packet: - ChunkDef::ForEachSection(a_BlockData, a_LightData, [this](auto, const auto Blocks, const auto Metas, auto, auto) + ChunkDef_ForEachSection(a_BlockData, a_LightData, { const bool BlocksExist = Blocks != nullptr; const bool MetasExist = Metas != nullptr; @@ -221,7 +221,7 @@ inline void cChunkDataSerializer::Serialize47(const int a_ChunkX, const int a_Ch }); // Write the block lights: - ChunkDef::ForEachSection(a_BlockData, a_LightData, [this](auto, auto, auto, const auto BlockLights, auto) + ChunkDef_ForEachSection(a_BlockData, a_LightData, { if (BlockLights == nullptr) { @@ -234,7 +234,7 @@ inline void cChunkDataSerializer::Serialize47(const int a_ChunkX, const int a_Ch }); // Write the sky lights: - ChunkDef::ForEachSection(a_BlockData, a_LightData, [this](auto, auto, auto, auto, const auto SkyLights) + ChunkDef_ForEachSection(a_BlockData, a_LightData, { if (SkyLights == nullptr) { @@ -295,7 +295,7 @@ inline void cChunkDataSerializer::Serialize107(const int a_ChunkX, const int a_C m_Packet.WriteVarInt32(static_cast<UInt32>(ChunkSize)); // Write each chunk section... - ChunkDef::ForEachSection(a_BlockData, a_LightData, [this](auto, const auto Blocks, const auto Metas, const auto BlockLights, const auto SkyLights) + ChunkDef_ForEachSection(a_BlockData, a_LightData, { m_Packet.WriteBEUInt8(BitsPerEntry); m_Packet.WriteVarInt32(0); // Palette length is 0 @@ -353,7 +353,7 @@ inline void cChunkDataSerializer::Serialize110(const int a_ChunkX, const int a_C m_Packet.WriteVarInt32(static_cast<UInt32>(ChunkSize)); // Write each chunk section... - ChunkDef::ForEachSection(a_BlockData, a_LightData, [this](auto, const auto Blocks, const auto Metas, const auto BlockLights, const auto SkyLights) + ChunkDef_ForEachSection(a_BlockData, a_LightData, { m_Packet.WriteBEUInt8(BitsPerEntry); m_Packet.WriteVarInt32(0); // Palette length is 0 @@ -414,7 +414,7 @@ inline void cChunkDataSerializer::Serialize393(const int a_ChunkX, const int a_C m_Packet.WriteVarInt32(static_cast<UInt32>(ChunkSize)); // Write each chunk section... - ChunkDef::ForEachSection(a_BlockData, a_LightData, [this](auto, const auto Blocks, const auto Metas, const auto BlockLights, const auto SkyLights) + ChunkDef_ForEachSection(a_BlockData, a_LightData, { m_Packet.WriteBEUInt8(BitsPerEntry); m_Packet.WriteVarInt32(static_cast<UInt32>(ChunkSectionDataArraySize)); @@ -479,7 +479,7 @@ inline void cChunkDataSerializer::Serialize477(const int a_ChunkX, const int a_C m_Packet.WriteVarInt32(static_cast<UInt32>(ChunkSize)); // Write each chunk section... - ChunkDef::ForEachSection(a_BlockData, a_LightData, [this](auto, const auto Blocks, const auto Metas, auto, auto) + ChunkDef_ForEachSection(a_BlockData, a_LightData, { m_Packet.WriteBEInt16(-1); m_Packet.WriteBEUInt8(BitsPerEntry); diff --git a/src/WorldStorage/NBTChunkSerializer.cpp b/src/WorldStorage/NBTChunkSerializer.cpp index 714c65a91..30e2a7815 100644 --- a/src/WorldStorage/NBTChunkSerializer.cpp +++ b/src/WorldStorage/NBTChunkSerializer.cpp @@ -1182,7 +1182,7 @@ void NBTChunkSerializer::Serialize(const cWorld & aWorld, cChunkCoords aCoords, // Save blockdata: aWriter.BeginList("Sections", TAG_Compound); - ChunkDef::ForEachSection(serializer.m_BlockData, serializer.m_LightData, [&aWriter](const auto Y, const auto Blocks, const auto Metas, const auto BlockLights, const auto SkyLights) + ChunkDef_ForEachSection(serializer.m_BlockData, serializer.m_LightData, { aWriter.BeginCompound(""); |