summaryrefslogtreecommitdiffstats
path: root/src/BlockArea.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/BlockArea.cpp')
-rw-r--r--src/BlockArea.cpp838
1 files changed, 567 insertions, 271 deletions
diff --git a/src/BlockArea.cpp b/src/BlockArea.cpp
index 65ada4682..3980b3b10 100644
--- a/src/BlockArea.cpp
+++ b/src/BlockArea.cpp
@@ -5,8 +5,8 @@
// Please modify compile.sh if you want to rename or remove this file.
// This file was chosen arbitrarily and it's a good enough indicator we're in the Cuberite folder.
-// Implements the cBlockArea object representing an area of block data that can be queried from cWorld and then accessed again without further queries
-// The object also supports writing the blockdata back into cWorld, even into other coords
+// Implements the cBlockArea object representing an area of block data that can be queried from cWorld and then accessed
+// again without further queries The object also supports writing the blockdata back into cWorld, even into other coords
#include "Globals.h"
#include "BlockArea.h"
@@ -23,27 +23,39 @@
// Disable MSVC warnings: "conditional expression is constant"
#ifdef _MSC_VER
- #pragma warning(push)
- #pragma warning(disable:4127)
+#pragma warning(push)
+#pragma warning(disable : 4127)
#endif
-typedef void (CombinatorFunc)(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, NIBBLETYPE & a_DstMeta, NIBBLETYPE a_SrcMeta);
+typedef void(CombinatorFunc)(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, NIBBLETYPE & a_DstMeta, NIBBLETYPE a_SrcMeta);
/** Merges two blocktypes and blockmetas of the specified sizes and offsets using the specified combinator function
This wild construct allows us to pass a function argument and still have it inlined by the compiler. */
template <bool MetasValid, CombinatorFunc Combinator>
void InternalMergeBlocks(
- BLOCKTYPE * a_DstTypes, const BLOCKTYPE * a_SrcTypes,
- NIBBLETYPE * a_DstMetas, const NIBBLETYPE * a_SrcMetas,
- int a_SizeX, int a_SizeY, int a_SizeZ,
- int a_SrcOffX, int a_SrcOffY, int a_SrcOffZ,
- int a_DstOffX, int a_DstOffY, int a_DstOffZ,
- int a_SrcSizeX, int a_SrcSizeY, int a_SrcSizeZ,
- int a_DstSizeX, int a_DstSizeY, int a_DstSizeZ
+ BLOCKTYPE * a_DstTypes,
+ const BLOCKTYPE * a_SrcTypes,
+ NIBBLETYPE * a_DstMetas,
+ const NIBBLETYPE * a_SrcMetas,
+ int a_SizeX,
+ int a_SizeY,
+ int a_SizeZ,
+ int a_SrcOffX,
+ int a_SrcOffY,
+ int a_SrcOffZ,
+ int a_DstOffX,
+ int a_DstOffY,
+ int a_DstOffZ,
+ int a_SrcSizeX,
+ int a_SrcSizeY,
+ int a_SrcSizeZ,
+ int a_DstSizeX,
+ int a_DstSizeY,
+ int a_DstSizeZ
)
{
UNUSED(a_SrcSizeY);
@@ -209,7 +221,12 @@ void MergeCombinatorLake(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, NIBBLETYPE
/** Combinator used for cBlockArea::msSpongePrint merging */
template <bool MetaValid>
-void MergeCombinatorSpongePrint(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, NIBBLETYPE & a_DstMeta, NIBBLETYPE a_SrcMeta)
+void MergeCombinatorSpongePrint(
+ BLOCKTYPE & a_DstType,
+ BLOCKTYPE a_SrcType,
+ NIBBLETYPE & a_DstMeta,
+ NIBBLETYPE a_SrcMeta
+)
{
// Sponge overwrites nothing, everything else overwrites anything
if (a_SrcType != E_BLOCK_SPONGE)
@@ -254,7 +271,12 @@ void MergeCombinatorDifference(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, NIBBL
/** Combinator used for cBlockArea::msSimpleCompare merging */
template <bool MetaValid>
-void MergeCombinatorSimpleCompare(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, NIBBLETYPE & a_DstMeta, NIBBLETYPE a_SrcMeta)
+void MergeCombinatorSimpleCompare(
+ BLOCKTYPE & a_DstType,
+ BLOCKTYPE a_SrcType,
+ NIBBLETYPE & a_DstMeta,
+ NIBBLETYPE a_SrcMeta
+)
{
if ((a_DstType == a_SrcType) && (!MetaValid || (a_DstMeta == a_SrcMeta)))
{
@@ -289,7 +311,7 @@ void MergeCombinatorMask(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, NIBBLETYPE
// Re-enable previously disabled MSVC warnings
#ifdef _MSC_VER
- #pragma warning(pop)
+#pragma warning(pop)
#endif
@@ -345,7 +367,10 @@ void cBlockArea::Create(int a_SizeX, int a_SizeY, int a_SizeZ, int a_DataTypes)
// Warn if the height is too much, but proceed with the creation:
if (a_SizeY > cChunkDef::Height)
{
- LOGWARNING("Creating a cBlockArea with height larger than world height (%d). Continuing, but the area may misbehave.", a_SizeY);
+ LOGWARNING(
+ "Creating a cBlockArea with height larger than world height (%d). Continuing, but the area may misbehave.",
+ a_SizeY
+ );
}
Clear();
@@ -405,9 +430,8 @@ void cBlockArea::SetOrigin(const Vector3i & a_Origin)
bool cBlockArea::IsValidRelCoords(int a_RelX, int a_RelY, int a_RelZ) const
{
return (
- (a_RelX >= 0) && (a_RelX < m_Size.x) &&
- (a_RelY >= 0) && (a_RelY < m_Size.y) &&
- (a_RelZ >= 0) && (a_RelZ < m_Size.z)
+ (a_RelX >= 0) && (a_RelX < m_Size.x) && (a_RelY >= 0) && (a_RelY < m_Size.y) && (a_RelZ >= 0) &&
+ (a_RelZ < m_Size.z)
);
}
@@ -442,7 +466,16 @@ bool cBlockArea::IsValidCoords(const Vector3i & a_Coords) const
-bool cBlockArea::Read(cForEachChunkProvider & a_ForEachChunkProvider, int a_MinBlockX, int a_MaxBlockX, int a_MinBlockY, int a_MaxBlockY, int a_MinBlockZ, int a_MaxBlockZ, int a_DataTypes)
+bool cBlockArea::Read(
+ cForEachChunkProvider & a_ForEachChunkProvider,
+ int a_MinBlockX,
+ int a_MaxBlockX,
+ int a_MinBlockY,
+ int a_MaxBlockY,
+ int a_MinBlockZ,
+ int a_MaxBlockZ,
+ int a_DataTypes
+)
{
ASSERT(IsValidDataTypeCombination(a_DataTypes));
ASSERT(cChunkDef::IsValidHeight({a_MinBlockX, a_MinBlockY, a_MinBlockZ}));
@@ -489,9 +522,12 @@ bool cBlockArea::Read(cForEachChunkProvider & a_ForEachChunkProvider, const cCub
{
return Read(
a_ForEachChunkProvider,
- a_Bounds.p1.x, a_Bounds.p2.x,
- a_Bounds.p1.y, a_Bounds.p2.y,
- a_Bounds.p1.z, a_Bounds.p2.z,
+ a_Bounds.p1.x,
+ a_Bounds.p2.x,
+ a_Bounds.p1.y,
+ a_Bounds.p2.y,
+ a_Bounds.p1.z,
+ a_Bounds.p2.z,
a_DataTypes
);
}
@@ -500,13 +536,21 @@ bool cBlockArea::Read(cForEachChunkProvider & a_ForEachChunkProvider, const cCub
-bool cBlockArea::Read(cForEachChunkProvider & a_ForEachChunkProvider, const Vector3i & a_Point1, const Vector3i & a_Point2, int a_DataTypes)
+bool cBlockArea::Read(
+ cForEachChunkProvider & a_ForEachChunkProvider,
+ const Vector3i & a_Point1,
+ const Vector3i & a_Point2,
+ int a_DataTypes
+)
{
return Read(
a_ForEachChunkProvider,
- a_Point1.x, a_Point2.x,
- a_Point1.y, a_Point2.y,
- a_Point1.z, a_Point2.z,
+ a_Point1.x,
+ a_Point2.x,
+ a_Point1.y,
+ a_Point2.y,
+ a_Point1.z,
+ a_Point2.z,
a_DataTypes
);
}
@@ -515,7 +559,13 @@ bool cBlockArea::Read(cForEachChunkProvider & a_ForEachChunkProvider, const Vect
-bool cBlockArea::Write(cForEachChunkProvider & a_ForEachChunkProvider, int a_MinBlockX, int a_MinBlockY, int a_MinBlockZ, int a_DataTypes)
+bool cBlockArea::Write(
+ cForEachChunkProvider & a_ForEachChunkProvider,
+ int a_MinBlockX,
+ int a_MinBlockY,
+ int a_MinBlockZ,
+ int a_DataTypes
+)
{
ASSERT((a_DataTypes & GetDataTypes()) == a_DataTypes); // Are you requesting only the data that I have?
ASSERT(cChunkDef::IsValidHeight({a_MinBlockX, a_MinBlockY, a_MinBlockZ}));
@@ -530,11 +580,7 @@ bool cBlockArea::Write(cForEachChunkProvider & a_ForEachChunkProvider, int a_Min
bool cBlockArea::Write(cForEachChunkProvider & a_ForEachChunkProvider, const Vector3i & a_MinCoords, int a_DataTypes)
{
- return Write(
- a_ForEachChunkProvider,
- a_MinCoords.x, a_MinCoords.y, a_MinCoords.z,
- a_DataTypes
- );
+ return Write(a_ForEachChunkProvider, a_MinCoords.x, a_MinCoords.y, a_MinCoords.z, a_DataTypes);
}
@@ -572,7 +618,7 @@ void cBlockArea::CopyTo(cBlockArea & a_Into) const
if (HasBlockEntities())
{
a_Into.m_BlockEntities->clear();
- for (const auto & keyPair: *m_BlockEntities)
+ for (const auto & keyPair : *m_BlockEntities)
{
const auto & pos = keyPair.second->GetPos();
a_Into.m_BlockEntities->emplace(keyPair.first, keyPair.second->Clone(pos));
@@ -634,15 +680,17 @@ void cBlockArea::DumpToRawFile(const AString & a_FileName)
void cBlockArea::Crop(int a_AddMinX, int a_SubMaxX, int a_AddMinY, int a_SubMaxY, int a_AddMinZ, int a_SubMaxZ)
{
- if (
- (a_AddMinX + a_SubMaxX >= m_Size.x) ||
- (a_AddMinY + a_SubMaxY >= m_Size.y) ||
- (a_AddMinZ + a_SubMaxZ >= m_Size.z)
- )
- {
- LOGWARNING("cBlockArea:Crop called with more croping than the dimensions: %d x %d x %d with cropping %d, %d and %d",
- m_Size.x, m_Size.y, m_Size.z,
- a_AddMinX + a_SubMaxX, a_AddMinY + a_SubMaxY, a_AddMinZ + a_SubMaxZ
+ if ((a_AddMinX + a_SubMaxX >= m_Size.x) || (a_AddMinY + a_SubMaxY >= m_Size.y) ||
+ (a_AddMinZ + a_SubMaxZ >= m_Size.z))
+ {
+ LOGWARNING(
+ "cBlockArea:Crop called with more croping than the dimensions: %d x %d x %d with cropping %d, %d and %d",
+ m_Size.x,
+ m_Size.y,
+ m_Size.z,
+ a_AddMinX + a_SubMaxX,
+ a_AddMinY + a_SubMaxY,
+ a_AddMinZ + a_SubMaxZ
);
return;
}
@@ -665,13 +713,13 @@ void cBlockArea::Crop(int a_AddMinX, int a_SubMaxX, int a_AddMinY, int a_SubMaxY
}
if (HasBlockEntities())
{
- const Vector3i AddMin{ a_AddMinX, a_AddMinY, a_AddMinZ };
- const cCuboid CropBox{ AddMin, m_Size - Vector3i{a_SubMaxX, a_SubMaxY, a_SubMaxZ} };
+ const Vector3i AddMin {a_AddMinX, a_AddMinY, a_AddMinZ};
+ const cCuboid CropBox {AddMin, m_Size - Vector3i {a_SubMaxX, a_SubMaxY, a_SubMaxZ}};
// Move and crop block Entities:
cBlockEntities oldBE;
std::swap(oldBE, *m_BlockEntities);
- for (auto & keyPair: oldBE)
+ for (auto & keyPair : oldBE)
{
auto & be = keyPair.second;
auto Pos = be->GetPos();
@@ -718,7 +766,7 @@ void cBlockArea::Expand(int a_SubMinX, int a_AddMaxX, int a_SubMinY, int a_AddMa
// Move block entities:
cBlockEntities oldBE;
std::swap(oldBE, *m_BlockEntities);
- for (auto & keyPair: oldBE)
+ for (auto & keyPair : oldBE)
{
auto & be = keyPair.second;
auto posX = be->GetPosX() + a_SubMinX;
@@ -770,12 +818,22 @@ void cBlockArea::Merge(const cBlockArea & a_Src, const Vector3i & a_RelMinCoords
-void cBlockArea::Fill(int a_DataTypes, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, NIBBLETYPE a_BlockLight, NIBBLETYPE a_BlockSkyLight)
+void cBlockArea::Fill(
+ int a_DataTypes,
+ BLOCKTYPE a_BlockType,
+ NIBBLETYPE a_BlockMeta,
+ NIBBLETYPE a_BlockLight,
+ NIBBLETYPE a_BlockSkyLight
+)
{
if ((a_DataTypes & GetDataTypes()) != a_DataTypes)
{
- LOGWARNING("%s: requested datatypes that are not present in the BlockArea object, trimming those away (req 0x%x, stor 0x%x)",
- __FUNCTION__, a_DataTypes, GetDataTypes()
+ LOGWARNING(
+ "%s: requested datatypes that are not present in the BlockArea object, trimming those away (req 0x%x, stor "
+ "0x%x)",
+ __FUNCTION__,
+ a_DataTypes,
+ GetDataTypes()
);
a_DataTypes = a_DataTypes & GetDataTypes();
}
@@ -810,7 +868,8 @@ void cBlockArea::Fill(int a_DataTypes, BLOCKTYPE a_BlockType, NIBBLETYPE a_Block
}
}
- // If the area contains block entities, remove those not matching and replace with whatever block entity block was filled
+ // If the area contains block entities, remove those not matching and replace with whatever block entity block was
+ // filled
if (HasBlockEntities() && ((a_DataTypes & baTypes) != 0))
{
if (cBlockEntity::IsBlockEntityBlockType(a_BlockType))
@@ -828,49 +887,71 @@ void cBlockArea::Fill(int a_DataTypes, BLOCKTYPE a_BlockType, NIBBLETYPE a_Block
-void cBlockArea::FillRelCuboid(int a_MinRelX, int a_MaxRelX, int a_MinRelY, int a_MaxRelY, int a_MinRelZ, int a_MaxRelZ,
- int a_DataTypes, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta,
- NIBBLETYPE a_BlockLight, NIBBLETYPE a_BlockSkyLight
+void cBlockArea::FillRelCuboid(
+ int a_MinRelX,
+ int a_MaxRelX,
+ int a_MinRelY,
+ int a_MaxRelY,
+ int a_MinRelZ,
+ int a_MaxRelZ,
+ int a_DataTypes,
+ BLOCKTYPE a_BlockType,
+ NIBBLETYPE a_BlockMeta,
+ NIBBLETYPE a_BlockLight,
+ NIBBLETYPE a_BlockSkyLight
)
{
if ((a_DataTypes & GetDataTypes()) != a_DataTypes)
{
- LOGWARNING("%s: requested datatypes that are not present in the BlockArea object, trimming those away (req 0x%x, stor 0x%x)",
- __FUNCTION__, a_DataTypes, GetDataTypes()
+ LOGWARNING(
+ "%s: requested datatypes that are not present in the BlockArea object, trimming those away (req 0x%x, stor "
+ "0x%x)",
+ __FUNCTION__,
+ a_DataTypes,
+ GetDataTypes()
);
a_DataTypes = a_DataTypes & GetDataTypes();
}
if ((a_DataTypes & baTypes) != 0)
{
- for (int y = a_MinRelY; y <= a_MaxRelY; y++) for (int z = a_MinRelZ; z <= a_MaxRelZ; z++) for (int x = a_MinRelX; x <= a_MaxRelX; x++)
- {
- m_BlockTypes[MakeIndex(x, y, z)] = a_BlockType;
- } // for x, z, y
+ for (int y = a_MinRelY; y <= a_MaxRelY; y++)
+ for (int z = a_MinRelZ; z <= a_MaxRelZ; z++)
+ for (int x = a_MinRelX; x <= a_MaxRelX; x++)
+ {
+ m_BlockTypes[MakeIndex(x, y, z)] = a_BlockType;
+ } // for x, z, y
}
if ((a_DataTypes & baMetas) != 0)
{
- for (int y = a_MinRelY; y <= a_MaxRelY; y++) for (int z = a_MinRelZ; z <= a_MaxRelZ; z++) for (int x = a_MinRelX; x <= a_MaxRelX; x++)
- {
- m_BlockMetas[MakeIndex(x, y, z)] = a_BlockMeta;
- } // for x, z, y
+ for (int y = a_MinRelY; y <= a_MaxRelY; y++)
+ for (int z = a_MinRelZ; z <= a_MaxRelZ; z++)
+ for (int x = a_MinRelX; x <= a_MaxRelX; x++)
+ {
+ m_BlockMetas[MakeIndex(x, y, z)] = a_BlockMeta;
+ } // for x, z, y
}
if ((a_DataTypes & baLight) != 0)
{
- for (int y = a_MinRelY; y <= a_MaxRelY; y++) for (int z = a_MinRelZ; z <= a_MaxRelZ; z++) for (int x = a_MinRelX; x <= a_MaxRelX; x++)
- {
- m_BlockLight[MakeIndex(x, y, z)] = a_BlockLight;
- } // for x, z, y
+ for (int y = a_MinRelY; y <= a_MaxRelY; y++)
+ for (int z = a_MinRelZ; z <= a_MaxRelZ; z++)
+ for (int x = a_MinRelX; x <= a_MaxRelX; x++)
+ {
+ m_BlockLight[MakeIndex(x, y, z)] = a_BlockLight;
+ } // for x, z, y
}
if ((a_DataTypes & baSkyLight) != 0)
{
- for (int y = a_MinRelY; y <= a_MaxRelY; y++) for (int z = a_MinRelZ; z <= a_MaxRelZ; z++) for (int x = a_MinRelX; x <= a_MaxRelX; x++)
- {
- m_BlockSkyLight[MakeIndex(x, y, z)] = a_BlockSkyLight;
- } // for x, z, y
+ for (int y = a_MinRelY; y <= a_MaxRelY; y++)
+ for (int z = a_MinRelZ; z <= a_MaxRelZ; z++)
+ for (int x = a_MinRelX; x <= a_MaxRelX; x++)
+ {
+ m_BlockSkyLight[MakeIndex(x, y, z)] = a_BlockSkyLight;
+ } // for x, z, y
}
- // If the area contains block entities, remove those in the affected cuboid and replace with whatever block entity block was filled:
+ // If the area contains block entities, remove those in the affected cuboid and replace with whatever block entity
+ // block was filled:
if (HasBlockEntities() && ((a_DataTypes & baTypes) != 0))
{
if (cBlockEntity::IsBlockEntityBlockType(a_BlockType))
@@ -888,16 +969,27 @@ void cBlockArea::FillRelCuboid(int a_MinRelX, int a_MaxRelX, int a_MinRelY, int
-void cBlockArea::FillRelCuboid(const cCuboid & a_RelCuboid,
- int a_DataTypes, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta,
- NIBBLETYPE a_BlockLight, NIBBLETYPE a_BlockSkyLight
+void cBlockArea::FillRelCuboid(
+ const cCuboid & a_RelCuboid,
+ int a_DataTypes,
+ BLOCKTYPE a_BlockType,
+ NIBBLETYPE a_BlockMeta,
+ NIBBLETYPE a_BlockLight,
+ NIBBLETYPE a_BlockSkyLight
)
{
FillRelCuboid(
- a_RelCuboid.p1.x, a_RelCuboid.p2.x,
- a_RelCuboid.p1.y, a_RelCuboid.p2.y,
- a_RelCuboid.p1.z, a_RelCuboid.p2.z,
- a_DataTypes, a_BlockType, a_BlockMeta, a_BlockLight, a_BlockSkyLight
+ a_RelCuboid.p1.x,
+ a_RelCuboid.p2.x,
+ a_RelCuboid.p1.y,
+ a_RelCuboid.p2.y,
+ a_RelCuboid.p1.z,
+ a_RelCuboid.p2.z,
+ a_DataTypes,
+ a_BlockType,
+ a_BlockMeta,
+ a_BlockLight,
+ a_BlockSkyLight
);
}
@@ -905,9 +997,18 @@ void cBlockArea::FillRelCuboid(const cCuboid & a_RelCuboid,
-void cBlockArea::RelLine(int a_RelX1, int a_RelY1, int a_RelZ1, int a_RelX2, int a_RelY2, int a_RelZ2,
- int a_DataTypes, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta,
- NIBBLETYPE a_BlockLight, NIBBLETYPE a_BlockSkyLight
+void cBlockArea::RelLine(
+ int a_RelX1,
+ int a_RelY1,
+ int a_RelZ1,
+ int a_RelX2,
+ int a_RelY2,
+ int a_RelZ2,
+ int a_DataTypes,
+ BLOCKTYPE a_BlockType,
+ NIBBLETYPE a_BlockMeta,
+ NIBBLETYPE a_BlockLight,
+ NIBBLETYPE a_BlockSkyLight
)
{
// Bresenham-3D algorithm for drawing lines:
@@ -945,7 +1046,7 @@ void cBlockArea::RelLine(int a_RelX1, int a_RelY1, int a_RelZ1, int a_RelX2, int
}
// move along x
- a_RelX1 += sx;
+ a_RelX1 += sx;
yd += dy;
zd += dz;
}
@@ -1022,15 +1123,28 @@ void cBlockArea::RelLine(int a_RelX1, int a_RelY1, int a_RelZ1, int a_RelX2, int
-void cBlockArea::RelLine(const Vector3i & a_Point1, const Vector3i & a_Point2,
- int a_DataTypes, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta,
- NIBBLETYPE a_BlockLight, NIBBLETYPE a_BlockSkyLight
+void cBlockArea::RelLine(
+ const Vector3i & a_Point1,
+ const Vector3i & a_Point2,
+ int a_DataTypes,
+ BLOCKTYPE a_BlockType,
+ NIBBLETYPE a_BlockMeta,
+ NIBBLETYPE a_BlockLight,
+ NIBBLETYPE a_BlockSkyLight
)
{
RelLine(
- a_Point1.x, a_Point1.y, a_Point1.z,
- a_Point2.x, a_Point2.y, a_Point2.z,
- a_DataTypes, a_BlockType, a_BlockMeta, a_BlockLight, a_BlockSkyLight
+ a_Point1.x,
+ a_Point1.y,
+ a_Point1.z,
+ a_Point2.x,
+ a_Point2.y,
+ a_Point2.z,
+ a_DataTypes,
+ a_BlockType,
+ a_BlockMeta,
+ a_BlockLight,
+ a_BlockSkyLight
);
}
@@ -1054,8 +1168,8 @@ void cBlockArea::RotateCCW(void)
}
// We are guaranteed that both blocktypes and blockmetas exist; rotate both at the same time:
- BLOCKARRAY NewTypes{ new BLOCKTYPE[GetBlockCount()] };
- NIBBLEARRAY NewMetas{ new NIBBLETYPE[GetBlockCount()] };
+ BLOCKARRAY NewTypes {new BLOCKTYPE[GetBlockCount()]};
+ NIBBLEARRAY NewMetas {new NIBBLETYPE[GetBlockCount()]};
for (int x = 0; x < m_Size.x; x++)
{
int NewZ = m_Size.x - x - 1;
@@ -1064,7 +1178,7 @@ void cBlockArea::RotateCCW(void)
int NewX = z;
for (int y = 0; y < m_Size.y; y++)
{
- auto NewIdx = MakeIndexForSize({ NewX, y, NewZ }, { m_Size.z, m_Size.y, m_Size.x });
+ auto NewIdx = MakeIndexForSize({NewX, y, NewZ}, {m_Size.z, m_Size.y, m_Size.x});
auto OldIdx = MakeIndex(x, y, z);
NewTypes[NewIdx] = m_BlockTypes[OldIdx];
NewMetas[NewIdx] = cBlockHandler::For(m_BlockTypes[OldIdx]).MetaRotateCCW(m_BlockMetas[OldIdx]);
@@ -1079,7 +1193,7 @@ void cBlockArea::RotateCCW(void)
{
cBlockEntities oldBE;
std::swap(oldBE, *m_BlockEntities);
- for (auto & keyPair: oldBE)
+ for (auto & keyPair : oldBE)
{
auto & be = keyPair.second;
auto newX = be->GetPosZ();
@@ -1114,8 +1228,8 @@ void cBlockArea::RotateCW(void)
}
// We are guaranteed that both blocktypes and blockmetas exist; rotate both at the same time:
- BLOCKARRAY NewTypes{ new BLOCKTYPE[GetBlockCount()] };
- NIBBLEARRAY NewMetas{ new NIBBLETYPE[GetBlockCount()] };
+ BLOCKARRAY NewTypes {new BLOCKTYPE[GetBlockCount()]};
+ NIBBLEARRAY NewMetas {new NIBBLETYPE[GetBlockCount()]};
for (int x = 0; x < m_Size.x; x++)
{
int NewZ = x;
@@ -1124,7 +1238,7 @@ void cBlockArea::RotateCW(void)
int NewX = m_Size.z - z - 1;
for (int y = 0; y < m_Size.y; y++)
{
- auto NewIdx = MakeIndexForSize({ NewX, y, NewZ }, { m_Size.z, m_Size.y, m_Size.x });
+ auto NewIdx = MakeIndexForSize({NewX, y, NewZ}, {m_Size.z, m_Size.y, m_Size.x});
auto OldIdx = MakeIndex(x, y, z);
NewTypes[NewIdx] = m_BlockTypes[OldIdx];
NewMetas[NewIdx] = cBlockHandler::For(m_BlockTypes[OldIdx]).MetaRotateCW(m_BlockMetas[OldIdx]);
@@ -1139,7 +1253,7 @@ void cBlockArea::RotateCW(void)
{
cBlockEntities oldBE;
std::swap(oldBE, *m_BlockEntities);
- for (auto & keyPair: oldBE)
+ for (auto & keyPair : oldBE)
{
auto & be = keyPair.second;
auto newX = m_Size.z - be->GetPosZ() - 1;
@@ -1198,7 +1312,7 @@ void cBlockArea::MirrorXY(void)
{
cBlockEntities oldBE;
std::swap(oldBE, *m_BlockEntities);
- for (auto & keyPair: oldBE)
+ for (auto & keyPair : oldBE)
{
auto & be = keyPair.second;
auto newX = be->GetPosX();
@@ -1255,7 +1369,7 @@ void cBlockArea::MirrorXZ(void)
{
cBlockEntities oldBE;
std::swap(oldBE, *m_BlockEntities);
- for (auto & keyPair: oldBE)
+ for (auto & keyPair : oldBE)
{
auto & be = keyPair.second;
auto newX = be->GetPosX();
@@ -1312,7 +1426,7 @@ void cBlockArea::MirrorYZ(void)
{
cBlockEntities oldBE;
std::swap(oldBE, *m_BlockEntities);
- for (auto & keyPair: oldBE)
+ for (auto & keyPair : oldBE)
{
auto & be = keyPair.second;
auto newX = MaxX - be->GetPosX();
@@ -1333,7 +1447,7 @@ void cBlockArea::RotateCCWNoMeta(void)
{
if (HasBlockTypes())
{
- BLOCKARRAY NewTypes{ new BLOCKTYPE[GetBlockCount()] };
+ BLOCKARRAY NewTypes {new BLOCKTYPE[GetBlockCount()]};
for (int x = 0; x < m_Size.x; x++)
{
int NewZ = m_Size.x - x - 1;
@@ -1342,7 +1456,8 @@ void cBlockArea::RotateCCWNoMeta(void)
int NewX = z;
for (int y = 0; y < m_Size.y; y++)
{
- NewTypes[MakeIndexForSize({ NewX, y, NewZ }, { m_Size.z, m_Size.y, m_Size.x })] = m_BlockTypes[MakeIndex(x, y, z)];
+ NewTypes[MakeIndexForSize({NewX, y, NewZ}, {m_Size.z, m_Size.y, m_Size.x})] =
+ m_BlockTypes[MakeIndex(x, y, z)];
} // for y
} // for z
} // for x
@@ -1350,7 +1465,7 @@ void cBlockArea::RotateCCWNoMeta(void)
}
if (HasBlockMetas())
{
- NIBBLEARRAY NewMetas{ new NIBBLETYPE[GetBlockCount()] };
+ NIBBLEARRAY NewMetas {new NIBBLETYPE[GetBlockCount()]};
for (int x = 0; x < m_Size.x; x++)
{
int NewZ = m_Size.x - x - 1;
@@ -1359,7 +1474,8 @@ void cBlockArea::RotateCCWNoMeta(void)
int NewX = z;
for (int y = 0; y < m_Size.y; y++)
{
- NewMetas[MakeIndexForSize({ NewX, y, NewZ }, { m_Size.z, m_Size.y, m_Size.x })] = m_BlockMetas[MakeIndex(x, y, z)];
+ NewMetas[MakeIndexForSize({NewX, y, NewZ}, {m_Size.z, m_Size.y, m_Size.x})] =
+ m_BlockMetas[MakeIndex(x, y, z)];
} // for y
} // for z
} // for x
@@ -1371,7 +1487,7 @@ void cBlockArea::RotateCCWNoMeta(void)
{
cBlockEntities oldBE;
std::swap(oldBE, *m_BlockEntities);
- for (auto & keyPair: oldBE)
+ for (auto & keyPair : oldBE)
{
auto & be = keyPair.second;
auto newX = be->GetPosZ();
@@ -1394,7 +1510,7 @@ void cBlockArea::RotateCWNoMeta(void)
{
if (HasBlockTypes())
{
- BLOCKARRAY NewTypes{ new BLOCKTYPE[GetBlockCount()] };
+ BLOCKARRAY NewTypes {new BLOCKTYPE[GetBlockCount()]};
for (int z = 0; z < m_Size.z; z++)
{
int NewX = m_Size.z - z - 1;
@@ -1403,7 +1519,8 @@ void cBlockArea::RotateCWNoMeta(void)
int NewZ = x;
for (int y = 0; y < m_Size.y; y++)
{
- NewTypes[MakeIndexForSize({ NewX, y, NewZ }, { m_Size.z, m_Size.y, m_Size.x })] = m_BlockTypes[MakeIndex(x, y, z)];
+ NewTypes[MakeIndexForSize({NewX, y, NewZ}, {m_Size.z, m_Size.y, m_Size.x})] =
+ m_BlockTypes[MakeIndex(x, y, z)];
} // for y
} // for x
} // for z
@@ -1411,7 +1528,7 @@ void cBlockArea::RotateCWNoMeta(void)
}
if (HasBlockMetas())
{
- NIBBLEARRAY NewMetas{ new NIBBLETYPE[GetBlockCount()] };
+ NIBBLEARRAY NewMetas {new NIBBLETYPE[GetBlockCount()]};
for (int z = 0; z < m_Size.z; z++)
{
int NewX = m_Size.z - z - 1;
@@ -1420,7 +1537,8 @@ void cBlockArea::RotateCWNoMeta(void)
int NewZ = x;
for (int y = 0; y < m_Size.y; y++)
{
- NewMetas[MakeIndexForSize({ NewX, y, NewZ }, { m_Size.z, m_Size.y, m_Size.x })] = m_BlockMetas[MakeIndex(x, y, z)];
+ NewMetas[MakeIndexForSize({NewX, y, NewZ}, {m_Size.z, m_Size.y, m_Size.x})] =
+ m_BlockMetas[MakeIndex(x, y, z)];
} // for y
} // for x
} // for z
@@ -1432,7 +1550,7 @@ void cBlockArea::RotateCWNoMeta(void)
{
cBlockEntities oldBE;
std::swap(oldBE, *m_BlockEntities);
- for (auto & keyPair: oldBE)
+ for (auto & keyPair : oldBE)
{
auto & be = keyPair.second;
auto newX = m_Size.z - be->GetPosZ() - 1;
@@ -1488,7 +1606,7 @@ void cBlockArea::MirrorXYNoMeta(void)
{
cBlockEntities oldBE;
std::swap(oldBE, *m_BlockEntities);
- for (auto & keyPair: oldBE)
+ for (auto & keyPair : oldBE)
{
auto & be = keyPair.second;
auto newX = be->GetPosX();
@@ -1542,7 +1660,7 @@ void cBlockArea::MirrorXZNoMeta(void)
{
cBlockEntities oldBE;
std::swap(oldBE, *m_BlockEntities);
- for (auto & keyPair: oldBE)
+ for (auto & keyPair : oldBE)
{
auto & be = keyPair.second;
auto newX = be->GetPosX();
@@ -1596,7 +1714,7 @@ void cBlockArea::MirrorYZNoMeta(void)
{
cBlockEntities oldBE;
std::swap(oldBE, *m_BlockEntities);
- for (auto & keyPair: oldBE)
+ for (auto & keyPair : oldBE)
{
auto & be = keyPair.second;
auto newX = MaxX - be->GetPosX();
@@ -1784,7 +1902,13 @@ NIBBLETYPE cBlockArea::GetBlockSkyLight(int a_BlockX, int a_BlockY, int a_BlockZ
-void cBlockArea::SetBlockTypeMeta(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)
+void cBlockArea::SetBlockTypeMeta(
+ int a_BlockX,
+ int a_BlockY,
+ int a_BlockZ,
+ BLOCKTYPE a_BlockType,
+ NIBBLETYPE a_BlockMeta
+)
{
SetRelBlockTypeMeta(a_BlockX - m_Origin.x, a_BlockY - m_Origin.y, a_BlockZ - m_Origin.z, a_BlockType, a_BlockMeta);
}
@@ -1793,7 +1917,7 @@ void cBlockArea::SetBlockTypeMeta(int a_BlockX, int a_BlockY, int a_BlockZ, BLOC
-void cBlockArea::SetRelBlockTypeMeta(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)
+void cBlockArea::SetRelBlockTypeMeta(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)
{
auto idx = MakeIndex(a_RelX, a_RelY, a_RelZ);
if (m_BlockTypes == nullptr)
@@ -1828,7 +1952,10 @@ void cBlockArea::SetRelBlockTypeMeta(int a_RelX, int a_RelY, int a_RelZ, B
}
if (cBlockEntity::IsBlockEntityBlockType(a_BlockType))
{
- m_BlockEntities->emplace(idx, cBlockEntity::CreateByBlockType(a_BlockType, a_BlockMeta, {a_RelX, a_RelY, a_RelZ}));
+ m_BlockEntities->emplace(
+ idx,
+ cBlockEntity::CreateByBlockType(a_BlockType, a_BlockMeta, {a_RelX, a_RelY, a_RelZ})
+ );
}
}
}
@@ -1837,16 +1964,34 @@ void cBlockArea::SetRelBlockTypeMeta(int a_RelX, int a_RelY, int a_RelZ, B
-void cBlockArea::GetBlockTypeMeta(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta) const
+void cBlockArea::GetBlockTypeMeta(
+ int a_BlockX,
+ int a_BlockY,
+ int a_BlockZ,
+ BLOCKTYPE & a_BlockType,
+ NIBBLETYPE & a_BlockMeta
+) const
{
- return GetRelBlockTypeMeta(a_BlockX - m_Origin.x, a_BlockY - m_Origin.y, a_BlockZ - m_Origin.z, a_BlockType, a_BlockMeta);
+ return GetRelBlockTypeMeta(
+ a_BlockX - m_Origin.x,
+ a_BlockY - m_Origin.y,
+ a_BlockZ - m_Origin.z,
+ a_BlockType,
+ a_BlockMeta
+ );
}
-void cBlockArea::GetRelBlockTypeMeta(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta) const
+void cBlockArea::GetRelBlockTypeMeta(
+ int a_RelX,
+ int a_RelY,
+ int a_RelZ,
+ BLOCKTYPE & a_BlockType,
+ NIBBLETYPE & a_BlockMeta
+) const
{
auto idx = MakeIndex(a_RelX, a_RelY, a_RelZ);
if (m_BlockTypes == nullptr)
@@ -1876,10 +2021,7 @@ void cBlockArea::GetRelBlockTypeMeta(int a_RelX, int a_RelY, int a_RelZ, BLOCKTY
cCuboid cBlockArea::GetBounds(void) const
{
- return cCuboid(
- m_Origin,
- m_Origin + m_Size - Vector3i(1, 1, 1)
- );
+ return cCuboid(m_Origin, m_Origin + m_Size - Vector3i(1, 1, 1));
}
@@ -1976,7 +2118,15 @@ size_t cBlockArea::CountSpecificBlocks(BLOCKTYPE a_BlockType, NIBBLETYPE a_Block
-void cBlockArea::GetNonAirCropRelCoords(int & a_MinRelX, int & a_MinRelY, int & a_MinRelZ, int & a_MaxRelX, int & a_MaxRelY, int & a_MaxRelZ, BLOCKTYPE a_IgnoreBlockType)
+void cBlockArea::GetNonAirCropRelCoords(
+ int & a_MinRelX,
+ int & a_MinRelY,
+ int & a_MinRelZ,
+ int & a_MaxRelX,
+ int & a_MaxRelY,
+ int & a_MaxRelZ,
+ BLOCKTYPE a_IgnoreBlockType
+)
{
// Check if blocktypes are valid:
if (m_BlockTypes == nullptr)
@@ -2190,7 +2340,7 @@ bool cBlockArea::ForEachBlockEntity(cBlockEntityCallback a_Callback)
{
return true;
}
- for (auto & keyPair: *m_BlockEntities)
+ for (auto & keyPair : *m_BlockEntities)
{
if (a_Callback(*keyPair.second))
{
@@ -2250,12 +2400,19 @@ NIBBLETYPE cBlockArea::GetNibble(int a_BlockX, int a_BlockY, int a_BlockZ, NIBBL
-void cBlockArea::CropBlockTypes(int a_AddMinX, int a_SubMaxX, int a_AddMinY, int a_SubMaxY, int a_AddMinZ, int a_SubMaxZ)
+void cBlockArea::CropBlockTypes(
+ int a_AddMinX,
+ int a_SubMaxX,
+ int a_AddMinY,
+ int a_SubMaxY,
+ int a_AddMinZ,
+ int a_SubMaxZ
+)
{
int NewSizeX = GetSizeX() - a_AddMinX - a_SubMaxX;
int NewSizeY = GetSizeY() - a_AddMinY - a_SubMaxY;
int NewSizeZ = GetSizeZ() - a_AddMinZ - a_SubMaxZ;
- BLOCKARRAY NewBlockTypes{ new BLOCKTYPE[ToUnsigned(NewSizeX * NewSizeY * NewSizeZ)] };
+ BLOCKARRAY NewBlockTypes {new BLOCKTYPE[ToUnsigned(NewSizeX * NewSizeY * NewSizeZ)]};
size_t idx = 0;
for (int y = 0; y < NewSizeY; y++)
{
@@ -2275,12 +2432,20 @@ void cBlockArea::CropBlockTypes(int a_AddMinX, int a_SubMaxX, int a_AddMinY, int
-void cBlockArea::CropNibbles(NIBBLEARRAY & a_Array, int a_AddMinX, int a_SubMaxX, int a_AddMinY, int a_SubMaxY, int a_AddMinZ, int a_SubMaxZ)
+void cBlockArea::CropNibbles(
+ NIBBLEARRAY & a_Array,
+ int a_AddMinX,
+ int a_SubMaxX,
+ int a_AddMinY,
+ int a_SubMaxY,
+ int a_AddMinZ,
+ int a_SubMaxZ
+)
{
int NewSizeX = GetSizeX() - a_AddMinX - a_SubMaxX;
int NewSizeY = GetSizeY() - a_AddMinY - a_SubMaxY;
int NewSizeZ = GetSizeZ() - a_AddMinZ - a_SubMaxZ;
- NIBBLEARRAY NewNibbles{ new NIBBLETYPE[ToUnsigned(NewSizeX * NewSizeY * NewSizeZ)] };
+ NIBBLEARRAY NewNibbles {new NIBBLETYPE[ToUnsigned(NewSizeX * NewSizeY * NewSizeZ)]};
size_t idx = 0;
for (int y = 0; y < NewSizeY; y++)
{
@@ -2299,13 +2464,20 @@ void cBlockArea::CropNibbles(NIBBLEARRAY & a_Array, int a_AddMinX, int a_SubMaxX
-void cBlockArea::ExpandBlockTypes(int a_SubMinX, int a_AddMaxX, int a_SubMinY, int a_AddMaxY, int a_SubMinZ, int a_AddMaxZ)
+void cBlockArea::ExpandBlockTypes(
+ int a_SubMinX,
+ int a_AddMaxX,
+ int a_SubMinY,
+ int a_AddMaxY,
+ int a_SubMinZ,
+ int a_AddMaxZ
+)
{
int NewSizeX = m_Size.x + a_SubMinX + a_AddMaxX;
int NewSizeY = m_Size.y + a_SubMinY + a_AddMaxY;
int NewSizeZ = m_Size.z + a_SubMinZ + a_AddMaxZ;
size_t BlockCount = static_cast<size_t>(NewSizeX * NewSizeY * NewSizeZ);
- BLOCKARRAY NewBlockTypes{ new BLOCKTYPE[BlockCount] };
+ BLOCKARRAY NewBlockTypes {new BLOCKTYPE[BlockCount]};
memset(NewBlockTypes.get(), 0, BlockCount * sizeof(BLOCKTYPE));
size_t OldIndex = 0;
for (int y = 0; y < m_Size.y; y++)
@@ -2328,13 +2500,21 @@ void cBlockArea::ExpandBlockTypes(int a_SubMinX, int a_AddMaxX, int a_SubMinY, i
-void cBlockArea::ExpandNibbles(NIBBLEARRAY & a_Array, int a_SubMinX, int a_AddMaxX, int a_SubMinY, int a_AddMaxY, int a_SubMinZ, int a_AddMaxZ)
+void cBlockArea::ExpandNibbles(
+ NIBBLEARRAY & a_Array,
+ int a_SubMinX,
+ int a_AddMaxX,
+ int a_SubMinY,
+ int a_AddMaxY,
+ int a_SubMinZ,
+ int a_AddMaxZ
+)
{
int NewSizeX = m_Size.x + a_SubMinX + a_AddMaxX;
int NewSizeY = m_Size.y + a_SubMinY + a_AddMaxY;
int NewSizeZ = m_Size.z + a_SubMinZ + a_AddMaxZ;
size_t BlockCount = static_cast<size_t>(NewSizeX * NewSizeY * NewSizeZ);
- NIBBLEARRAY NewNibbles{ new NIBBLETYPE[BlockCount] };
+ NIBBLEARRAY NewNibbles {new NIBBLETYPE[BlockCount]};
memset(NewNibbles.get(), 0, BlockCount * sizeof(NIBBLETYPE));
size_t OldIndex = 0;
for (int y = 0; y < m_Size.y; y++)
@@ -2358,9 +2538,14 @@ void cBlockArea::ExpandNibbles(NIBBLEARRAY & a_Array, int a_SubMinX, int a_AddMa
void cBlockArea::RelSetData(
- int a_RelX, int a_RelY, int a_RelZ,
- int a_DataTypes, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta,
- NIBBLETYPE a_BlockLight, NIBBLETYPE a_BlockSkyLight
+ int a_RelX,
+ int a_RelY,
+ int a_RelZ,
+ int a_DataTypes,
+ BLOCKTYPE a_BlockType,
+ NIBBLETYPE a_BlockMeta,
+ NIBBLETYPE a_BlockLight,
+ NIBBLETYPE a_BlockSkyLight
)
{
if (!IsValidCoords(a_RelX, a_RelY, a_RelZ))
@@ -2403,7 +2588,10 @@ void cBlockArea::RelSetData(
if (cBlockEntity::IsBlockEntityBlockType(a_BlockType))
{
// The block type should have a block entity attached to it, create an empty one:
- m_BlockEntities->emplace(Index, cBlockEntity::CreateByBlockType(a_BlockType, a_BlockMeta, {a_RelX, a_RelY, a_RelZ}));
+ m_BlockEntities->emplace(
+ Index,
+ cBlockEntity::CreateByBlockType(a_BlockType, a_BlockMeta, {a_RelX, a_RelY, a_RelZ})
+ );
}
}
}
@@ -2413,7 +2601,15 @@ void cBlockArea::RelSetData(
template <bool MetasValid>
-void cBlockArea::MergeByStrategy(const cBlockArea & a_Src, int a_RelX, int a_RelY, int a_RelZ, eMergeStrategy a_Strategy, const NIBBLETYPE * SrcMetas, NIBBLETYPE * DstMetas)
+void cBlockArea::MergeByStrategy(
+ const cBlockArea & a_Src,
+ int a_RelX,
+ int a_RelY,
+ int a_RelZ,
+ eMergeStrategy a_Strategy,
+ const NIBBLETYPE * SrcMetas,
+ NIBBLETYPE * DstMetas
+)
{
// Block types are compulsory, block metas are optional
if (!HasBlockTypes() || !a_Src.HasBlockTypes())
@@ -2424,16 +2620,16 @@ void cBlockArea::MergeByStrategy(const cBlockArea & a_Src, int a_RelX, int a_Rel
// Dst is *this, Src is a_Src
int SrcOffX = std::max(0, -a_RelX); // Offset in Src where to start reading
- int DstOffX = std::max(0, a_RelX); // Offset in Dst where to start writing
- int SizeX = std::min(a_Src.GetSizeX() - SrcOffX, GetSizeX() - DstOffX); // How many blocks to copy
+ int DstOffX = std::max(0, a_RelX); // Offset in Dst where to start writing
+ int SizeX = std::min(a_Src.GetSizeX() - SrcOffX, GetSizeX() - DstOffX); // How many blocks to copy
int SrcOffY = std::max(0, -a_RelY); // Offset in Src where to start reading
- int DstOffY = std::max(0, a_RelY); // Offset in Dst where to start writing
- int SizeY = std::min(a_Src.GetSizeY() - SrcOffY, GetSizeY() - DstOffY); // How many blocks to copy
+ int DstOffY = std::max(0, a_RelY); // Offset in Dst where to start writing
+ int SizeY = std::min(a_Src.GetSizeY() - SrcOffY, GetSizeY() - DstOffY); // How many blocks to copy
int SrcOffZ = std::max(0, -a_RelZ); // Offset in Src where to start reading
- int DstOffZ = std::max(0, a_RelZ); // Offset in Dst where to start writing
- int SizeZ = std::min(a_Src.GetSizeZ() - SrcOffZ, GetSizeZ() - DstOffZ); // How many blocks to copy
+ int DstOffZ = std::max(0, a_RelZ); // Offset in Dst where to start writing
+ int SizeZ = std::min(a_Src.GetSizeZ() - SrcOffZ, GetSizeZ() - DstOffZ); // How many blocks to copy
[&]
{
@@ -2441,112 +2637,208 @@ void cBlockArea::MergeByStrategy(const cBlockArea & a_Src, int a_RelX, int a_Rel
{
case cBlockArea::msOverwrite:
{
- InternalMergeBlocks<MetasValid, MergeCombinatorOverwrite<MetasValid> >(
- GetBlockTypes(), a_Src.GetBlockTypes(),
- DstMetas, SrcMetas,
- SizeX, SizeY, SizeZ,
- SrcOffX, SrcOffY, SrcOffZ,
- DstOffX, DstOffY, DstOffZ,
- a_Src.GetSizeX(), a_Src.GetSizeY(), a_Src.GetSizeZ(),
- m_Size.x, m_Size.y, m_Size.z
+ InternalMergeBlocks<MetasValid, MergeCombinatorOverwrite<MetasValid>>(
+ GetBlockTypes(),
+ a_Src.GetBlockTypes(),
+ DstMetas,
+ SrcMetas,
+ SizeX,
+ SizeY,
+ SizeZ,
+ SrcOffX,
+ SrcOffY,
+ SrcOffZ,
+ DstOffX,
+ DstOffY,
+ DstOffZ,
+ a_Src.GetSizeX(),
+ a_Src.GetSizeY(),
+ a_Src.GetSizeZ(),
+ m_Size.x,
+ m_Size.y,
+ m_Size.z
);
return;
} // case msOverwrite
case cBlockArea::msFillAir:
{
- InternalMergeBlocks<MetasValid, MergeCombinatorFillAir<MetasValid> >(
- GetBlockTypes(), a_Src.GetBlockTypes(),
- DstMetas, SrcMetas,
- SizeX, SizeY, SizeZ,
- SrcOffX, SrcOffY, SrcOffZ,
- DstOffX, DstOffY, DstOffZ,
- a_Src.GetSizeX(), a_Src.GetSizeY(), a_Src.GetSizeZ(),
- m_Size.x, m_Size.y, m_Size.z
+ InternalMergeBlocks<MetasValid, MergeCombinatorFillAir<MetasValid>>(
+ GetBlockTypes(),
+ a_Src.GetBlockTypes(),
+ DstMetas,
+ SrcMetas,
+ SizeX,
+ SizeY,
+ SizeZ,
+ SrcOffX,
+ SrcOffY,
+ SrcOffZ,
+ DstOffX,
+ DstOffY,
+ DstOffZ,
+ a_Src.GetSizeX(),
+ a_Src.GetSizeY(),
+ a_Src.GetSizeZ(),
+ m_Size.x,
+ m_Size.y,
+ m_Size.z
);
return;
} // case msFillAir
case cBlockArea::msImprint:
{
- InternalMergeBlocks<MetasValid, MergeCombinatorImprint<MetasValid> >(
- GetBlockTypes(), a_Src.GetBlockTypes(),
- DstMetas, SrcMetas,
- SizeX, SizeY, SizeZ,
- SrcOffX, SrcOffY, SrcOffZ,
- DstOffX, DstOffY, DstOffZ,
- a_Src.GetSizeX(), a_Src.GetSizeY(), a_Src.GetSizeZ(),
- m_Size.x, m_Size.y, m_Size.z
+ InternalMergeBlocks<MetasValid, MergeCombinatorImprint<MetasValid>>(
+ GetBlockTypes(),
+ a_Src.GetBlockTypes(),
+ DstMetas,
+ SrcMetas,
+ SizeX,
+ SizeY,
+ SizeZ,
+ SrcOffX,
+ SrcOffY,
+ SrcOffZ,
+ DstOffX,
+ DstOffY,
+ DstOffZ,
+ a_Src.GetSizeX(),
+ a_Src.GetSizeY(),
+ a_Src.GetSizeZ(),
+ m_Size.x,
+ m_Size.y,
+ m_Size.z
);
return;
} // case msImprint
case cBlockArea::msLake:
{
- InternalMergeBlocks<MetasValid, MergeCombinatorLake<MetasValid> >(
- GetBlockTypes(), a_Src.GetBlockTypes(),
- DstMetas, SrcMetas,
- SizeX, SizeY, SizeZ,
- SrcOffX, SrcOffY, SrcOffZ,
- DstOffX, DstOffY, DstOffZ,
- a_Src.GetSizeX(), a_Src.GetSizeY(), a_Src.GetSizeZ(),
- m_Size.x, m_Size.y, m_Size.z
+ InternalMergeBlocks<MetasValid, MergeCombinatorLake<MetasValid>>(
+ GetBlockTypes(),
+ a_Src.GetBlockTypes(),
+ DstMetas,
+ SrcMetas,
+ SizeX,
+ SizeY,
+ SizeZ,
+ SrcOffX,
+ SrcOffY,
+ SrcOffZ,
+ DstOffX,
+ DstOffY,
+ DstOffZ,
+ a_Src.GetSizeX(),
+ a_Src.GetSizeY(),
+ a_Src.GetSizeZ(),
+ m_Size.x,
+ m_Size.y,
+ m_Size.z
);
return;
} // case msLake
case cBlockArea::msSpongePrint:
{
- InternalMergeBlocks<MetasValid, MergeCombinatorSpongePrint<MetasValid> >(
- GetBlockTypes(), a_Src.GetBlockTypes(),
- DstMetas, SrcMetas,
- SizeX, SizeY, SizeZ,
- SrcOffX, SrcOffY, SrcOffZ,
- DstOffX, DstOffY, DstOffZ,
- a_Src.GetSizeX(), a_Src.GetSizeY(), a_Src.GetSizeZ(),
- m_Size.x, m_Size.y, m_Size.z
+ InternalMergeBlocks<MetasValid, MergeCombinatorSpongePrint<MetasValid>>(
+ GetBlockTypes(),
+ a_Src.GetBlockTypes(),
+ DstMetas,
+ SrcMetas,
+ SizeX,
+ SizeY,
+ SizeZ,
+ SrcOffX,
+ SrcOffY,
+ SrcOffZ,
+ DstOffX,
+ DstOffY,
+ DstOffZ,
+ a_Src.GetSizeX(),
+ a_Src.GetSizeY(),
+ a_Src.GetSizeZ(),
+ m_Size.x,
+ m_Size.y,
+ m_Size.z
);
return;
} // case msSpongePrint
case cBlockArea::msDifference:
{
- InternalMergeBlocks<MetasValid, MergeCombinatorDifference<MetasValid> >(
- GetBlockTypes(), a_Src.GetBlockTypes(),
- DstMetas, SrcMetas,
- SizeX, SizeY, SizeZ,
- SrcOffX, SrcOffY, SrcOffZ,
- DstOffX, DstOffY, DstOffZ,
- a_Src.GetSizeX(), a_Src.GetSizeY(), a_Src.GetSizeZ(),
- m_Size.x, m_Size.y, m_Size.z
+ InternalMergeBlocks<MetasValid, MergeCombinatorDifference<MetasValid>>(
+ GetBlockTypes(),
+ a_Src.GetBlockTypes(),
+ DstMetas,
+ SrcMetas,
+ SizeX,
+ SizeY,
+ SizeZ,
+ SrcOffX,
+ SrcOffY,
+ SrcOffZ,
+ DstOffX,
+ DstOffY,
+ DstOffZ,
+ a_Src.GetSizeX(),
+ a_Src.GetSizeY(),
+ a_Src.GetSizeZ(),
+ m_Size.x,
+ m_Size.y,
+ m_Size.z
);
return;
} // case msDifference
case cBlockArea::msSimpleCompare:
{
- InternalMergeBlocks<MetasValid, MergeCombinatorSimpleCompare<MetasValid> >(
- GetBlockTypes(), a_Src.GetBlockTypes(),
- DstMetas, SrcMetas,
- SizeX, SizeY, SizeZ,
- SrcOffX, SrcOffY, SrcOffZ,
- DstOffX, DstOffY, DstOffZ,
- a_Src.GetSizeX(), a_Src.GetSizeY(), a_Src.GetSizeZ(),
- m_Size.x, m_Size.y, m_Size.z
+ InternalMergeBlocks<MetasValid, MergeCombinatorSimpleCompare<MetasValid>>(
+ GetBlockTypes(),
+ a_Src.GetBlockTypes(),
+ DstMetas,
+ SrcMetas,
+ SizeX,
+ SizeY,
+ SizeZ,
+ SrcOffX,
+ SrcOffY,
+ SrcOffZ,
+ DstOffX,
+ DstOffY,
+ DstOffZ,
+ a_Src.GetSizeX(),
+ a_Src.GetSizeY(),
+ a_Src.GetSizeZ(),
+ m_Size.x,
+ m_Size.y,
+ m_Size.z
);
return;
} // case msSimpleCompare
case cBlockArea::msMask:
{
- InternalMergeBlocks<MetasValid, MergeCombinatorMask<MetasValid> >(
- GetBlockTypes(), a_Src.GetBlockTypes(),
- DstMetas, SrcMetas,
- SizeX, SizeY, SizeZ,
- SrcOffX, SrcOffY, SrcOffZ,
- DstOffX, DstOffY, DstOffZ,
- a_Src.GetSizeX(), a_Src.GetSizeY(), a_Src.GetSizeZ(),
- m_Size.x, m_Size.y, m_Size.z
+ InternalMergeBlocks<MetasValid, MergeCombinatorMask<MetasValid>>(
+ GetBlockTypes(),
+ a_Src.GetBlockTypes(),
+ DstMetas,
+ SrcMetas,
+ SizeX,
+ SizeY,
+ SizeZ,
+ SrcOffX,
+ SrcOffY,
+ SrcOffZ,
+ DstOffX,
+ DstOffY,
+ DstOffZ,
+ a_Src.GetSizeX(),
+ a_Src.GetSizeY(),
+ a_Src.GetSizeZ(),
+ m_Size.x,
+ m_Size.y,
+ m_Size.z
);
return;
} // case msMask
@@ -2583,41 +2875,43 @@ void cBlockArea::MergeBlockEntities(int a_RelX, int a_RelY, int a_RelZ, const cB
RemoveNonMatchingBlockEntities();
// Clone BEs from a_Src wherever a BE is missing:
- for (int y = 0; y < m_Size.y; ++y) for (int z = 0; z < m_Size.z; ++z) for (int x = 0; x < m_Size.x; ++x)
- {
- auto idx = MakeIndex(x, y, z);
- auto type = m_BlockTypes[idx];
- if (!cBlockEntity::IsBlockEntityBlockType(type))
- {
- continue;
- }
+ for (int y = 0; y < m_Size.y; ++y)
+ for (int z = 0; z < m_Size.z; ++z)
+ for (int x = 0; x < m_Size.x; ++x)
+ {
+ auto idx = MakeIndex(x, y, z);
+ auto type = m_BlockTypes[idx];
+ if (!cBlockEntity::IsBlockEntityBlockType(type))
+ {
+ continue;
+ }
- // This block should have a block entity, check that there is one:
- auto itr = m_BlockEntities->find(idx);
- if (itr != m_BlockEntities->end())
- {
- // There is one already
- continue;
- }
+ // This block should have a block entity, check that there is one:
+ auto itr = m_BlockEntities->find(idx);
+ if (itr != m_BlockEntities->end())
+ {
+ // There is one already
+ continue;
+ }
- // Copy a BE from a_Src, if it exists there:
- auto srcX = x + a_RelX;
- auto srcY = y + a_RelY;
- auto srcZ = z + a_RelZ;
- if (a_Src.IsValidRelCoords(srcX, srcY, srcZ))
- {
- auto srcIdx = a_Src.MakeIndex(srcX, srcY, srcZ);
- auto itrSrc = a_Src.m_BlockEntities->find(srcIdx);
- if (itrSrc != a_Src.m_BlockEntities->end())
- {
- m_BlockEntities->emplace(idx, itrSrc->second->Clone({x, y, z}));
- continue;
- }
- }
- // No BE found in a_Src, insert a new empty one:
- NIBBLETYPE meta = HasBlockMetas() ? m_BlockMetas[idx] : 0;
- m_BlockEntities->emplace(idx, cBlockEntity::CreateByBlockType(type, meta, {x, y, z}));
- } // for x, z, y
+ // Copy a BE from a_Src, if it exists there:
+ auto srcX = x + a_RelX;
+ auto srcY = y + a_RelY;
+ auto srcZ = z + a_RelZ;
+ if (a_Src.IsValidRelCoords(srcX, srcY, srcZ))
+ {
+ auto srcIdx = a_Src.MakeIndex(srcX, srcY, srcZ);
+ auto itrSrc = a_Src.m_BlockEntities->find(srcIdx);
+ if (itrSrc != a_Src.m_BlockEntities->end())
+ {
+ m_BlockEntities->emplace(idx, itrSrc->second->Clone({x, y, z}));
+ continue;
+ }
+ }
+ // No BE found in a_Src, insert a new empty one:
+ NIBBLETYPE meta = HasBlockMetas() ? m_BlockMetas[idx] : 0;
+ m_BlockEntities->emplace(idx, cBlockEntity::CreateByBlockType(type, meta, {x, y, z}));
+ } // for x, z, y
}
@@ -2636,24 +2930,26 @@ void cBlockArea::RescanBlockEntities(void)
RemoveNonMatchingBlockEntities();
// Add block entities for all block types that should have a BE assigned to them:
- for (int y = 0; y < m_Size.y; ++y) for (int z = 0; z < m_Size.z; ++z) for (int x = 0; x < m_Size.x; ++x)
- {
- auto idx = MakeIndex(x, y, z);
- auto type = m_BlockTypes[idx];
- if (!cBlockEntity::IsBlockEntityBlockType(type))
- {
- continue;
- }
- // This block should have a block entity, check that there is one:
- auto itr = m_BlockEntities->find(idx);
- if (itr != m_BlockEntities->end())
- {
- continue;
- }
- // Create a new BE for this block:
- NIBBLETYPE meta = HasBlockMetas() ? m_BlockMetas[idx] : 0;
- m_BlockEntities->emplace(idx, cBlockEntity::CreateByBlockType(type, meta, {x, y, z}));
- } // for x, z, y
+ for (int y = 0; y < m_Size.y; ++y)
+ for (int z = 0; z < m_Size.z; ++z)
+ for (int x = 0; x < m_Size.x; ++x)
+ {
+ auto idx = MakeIndex(x, y, z);
+ auto type = m_BlockTypes[idx];
+ if (!cBlockEntity::IsBlockEntityBlockType(type))
+ {
+ continue;
+ }
+ // This block should have a block entity, check that there is one:
+ auto itr = m_BlockEntities->find(idx);
+ if (itr != m_BlockEntities->end())
+ {
+ continue;
+ }
+ // Create a new BE for this block:
+ NIBBLETYPE meta = HasBlockMetas() ? m_BlockMetas[idx] : 0;
+ m_BlockEntities->emplace(idx, cBlockEntity::CreateByBlockType(type, meta, {x, y, z}));
+ } // for x, z, y
}
@@ -2668,7 +2964,7 @@ void cBlockArea::RemoveNonMatchingBlockEntities(void)
cBlockEntities oldBE;
std::swap(oldBE, *m_BlockEntities);
- for (auto & keyPair: oldBE)
+ for (auto & keyPair : oldBE)
{
auto type = m_BlockTypes[static_cast<size_t>(keyPair.first)];
if (type == keyPair.second->GetBlockType())
@@ -2768,7 +3064,8 @@ void cBlockArea::cChunkReader::CopyNibbles(NIBBLETYPE * a_AreaDst, const NIBBLET
{
int ChunkX = BaseX + x;
int AreaX = OffX + x;
- a_AreaDst[m_Area.MakeIndex(AreaX, AreaY, AreaZ)] = cChunkDef::GetNibble(a_ChunkSrc, ChunkX, ChunkY, ChunkZ);
+ a_AreaDst[m_Area.MakeIndex(AreaX, AreaY, AreaZ)] =
+ cChunkDef::GetNibble(a_ChunkSrc, ChunkX, ChunkY, ChunkZ);
} // for x
} // for z
} // for y
@@ -2848,7 +3145,8 @@ void cBlockArea::cChunkReader::ChunkData(const ChunkBlockData & a_BlockData, con
{
int InChunkX = BaseX + x;
int AreaX = OffX + x;
- m_Area.m_BlockTypes[m_Area.MakeIndex(AreaX, AreaY, AreaZ)] = a_BlockData.GetBlock({ InChunkX, InChunkY, InChunkZ });
+ m_Area.m_BlockTypes[m_Area.MakeIndex(AreaX, AreaY, AreaZ)] =
+ a_BlockData.GetBlock({InChunkX, InChunkY, InChunkZ});
} // for x
} // for z
} // for y
@@ -2869,7 +3167,8 @@ void cBlockArea::cChunkReader::ChunkData(const ChunkBlockData & a_BlockData, con
{
int InChunkX = BaseX + x;
int AreaX = OffX + x;
- m_Area.m_BlockMetas[m_Area.MakeIndex(AreaX, AreaY, AreaZ)] = a_BlockData.GetMeta({ InChunkX, InChunkY, InChunkZ });
+ m_Area.m_BlockMetas[m_Area.MakeIndex(AreaX, AreaY, AreaZ)] =
+ a_BlockData.GetMeta({InChunkX, InChunkY, InChunkZ});
} // for x
} // for z
} // for y
@@ -2890,7 +3189,8 @@ void cBlockArea::cChunkReader::ChunkData(const ChunkBlockData & a_BlockData, con
{
int InChunkX = BaseX + x;
int AreaX = OffX + x;
- m_Area.m_BlockLight[m_Area.MakeIndex(AreaX, AreaY, AreaZ)] = a_LightData.GetBlockLight({ InChunkX, InChunkY, InChunkZ });
+ m_Area.m_BlockLight[m_Area.MakeIndex(AreaX, AreaY, AreaZ)] =
+ a_LightData.GetBlockLight({InChunkX, InChunkY, InChunkZ});
} // for x
} // for z
} // for y
@@ -2911,7 +3211,8 @@ void cBlockArea::cChunkReader::ChunkData(const ChunkBlockData & a_BlockData, con
{
int InChunkX = BaseX + x;
int AreaX = OffX + x;
- m_Area.m_BlockSkyLight[m_Area.MakeIndex(AreaX, AreaY, AreaZ)] = a_LightData.GetSkyLight({ InChunkX, InChunkY, InChunkZ });
+ m_Area.m_BlockSkyLight[m_Area.MakeIndex(AreaX, AreaY, AreaZ)] =
+ a_LightData.GetSkyLight({InChunkX, InChunkY, InChunkZ});
} // for x
} // for z
} // for y
@@ -2936,8 +3237,3 @@ void cBlockArea::cChunkReader::BlockEntity(cBlockEntity * a_BlockEntity)
auto Idx = m_Area.MakeIndex(areaPos);
m_Area.m_BlockEntities->emplace(Idx, a_BlockEntity->Clone(areaPos));
}
-
-
-
-
-