summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTiger Wang <ziwei.tiger@outlook.com>2021-03-06 13:59:39 +0100
committerGitHub <noreply@github.com>2021-03-06 13:59:39 +0100
commitd9a2b8611c86252a0d080ead7d17095a54489b2d (patch)
tree372a0d91bbe655a7db98df8e40225632fe46416e
parentUpdate Core (diff)
downloadcuberite-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
-rw-r--r--src/ChunkData.h45
-rw-r--r--src/Protocol/ChunkDataSerializer.cpp16
-rw-r--r--src/WorldStorage/NBTChunkSerializer.cpp2
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("");