diff options
Diffstat (limited to 'src/BlockArea.cpp')
-rw-r--r-- | src/BlockArea.cpp | 75 |
1 files changed, 70 insertions, 5 deletions
diff --git a/src/BlockArea.cpp b/src/BlockArea.cpp index 89cf18d4a..eb25d624d 100644 --- a/src/BlockArea.cpp +++ b/src/BlockArea.cpp @@ -60,7 +60,7 @@ void InternalMergeBlocks( else { NIBBLETYPE FakeDestMeta = 0; - Combinator(a_DstTypes[DstIdx], a_SrcTypes[SrcIdx], FakeDestMeta, (NIBBLETYPE)0); + Combinator(a_DstTypes[DstIdx], a_SrcTypes[SrcIdx], FakeDestMeta, static_cast<NIBBLETYPE>(0)); } ++DstIdx; ++SrcIdx; @@ -336,6 +336,12 @@ void cBlockArea::Create(int a_SizeX, int a_SizeY, int a_SizeZ, int a_DataTypes) ); return; } + + // 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); + } Clear(); int BlockCount = a_SizeX * a_SizeY * a_SizeZ; @@ -540,7 +546,7 @@ bool cBlockArea::Write(cForEachChunkProvider * a_ForEachChunkProvider, int a_Min else if (a_MinBlockY > cChunkDef::Height - m_Size.y) { LOGWARNING("%s: MinBlockY + m_SizeY more than chunk height, adjusting to chunk height", __FUNCTION__); - a_MinBlockY = cChunkDef::Height - m_Size.y; + a_MinBlockY = std::max(cChunkDef::Height - m_Size.y, 0); } return a_ForEachChunkProvider->WriteBlockArea(*this, a_MinBlockX, a_MinBlockY, a_MinBlockZ, a_DataTypes); @@ -620,7 +626,7 @@ void cBlockArea::DumpToRawFile(const AString & a_FileName) f.Write(&SizeX, 4); f.Write(&SizeY, 4); f.Write(&SizeZ, 4); - unsigned char DataTypes = (unsigned char)GetDataTypes(); + unsigned char DataTypes = static_cast<unsigned char>(GetDataTypes()); f.Write(&DataTypes, 1); size_t NumBlocks = GetBlockCount(); if (HasBlockTypes()) @@ -1665,6 +1671,65 @@ size_t cBlockArea::CountNonAirBlocks(void) const +size_t cBlockArea::CountSpecificBlocks(BLOCKTYPE a_BlockType) const +{ + // If blocktypes are not valid, log a warning and return zero occurences: + if (m_BlockTypes == nullptr) + { + LOGWARNING("%s: BlockTypes not available!", __FUNCTION__); + return 0; + } + + // Count the blocks: + size_t num = GetBlockCount(); + size_t res = 0; + for (size_t i = 0; i < num; i++) + { + if (m_BlockTypes[i] == a_BlockType) + { + res++; + } + } + return res; +} + + + + + +size_t cBlockArea::CountSpecificBlocks(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) const +{ + // If blocktypes are not valid, log a warning and return zero occurences: + if (m_BlockTypes == nullptr) + { + LOGWARNING("%s: BlockTypes not available!", __FUNCTION__); + return 0; + } + + // If blockmetas are not valid, log a warning and count only blocktypes: + if (m_BlockMetas == nullptr) + { + LOGWARNING("%s: BlockMetas not available, comparing blocktypes only!", __FUNCTION__); + return CountSpecificBlocks(a_BlockType); + } + + // Count the blocks: + size_t num = GetBlockCount(); + size_t res = 0; + for (size_t i = 0; i < num; i++) + { + if ((m_BlockTypes[i] == a_BlockType) && (m_BlockMetas[i] == a_BlockMeta)) + { + res++; + } + } + return res; +} + + + + + 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: @@ -2157,7 +2222,7 @@ void cBlockArea::ExpandBlockTypes(int a_SubMinX, int a_AddMaxX, int a_SubMinY, i 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 = (size_t)(NewSizeX * NewSizeY * NewSizeZ); + size_t BlockCount = static_cast<size_t>(NewSizeX * NewSizeY * NewSizeZ); BLOCKTYPE * NewBlockTypes = new BLOCKTYPE[BlockCount]; memset(NewBlockTypes, 0, BlockCount * sizeof(BLOCKTYPE)); int OldIndex = 0; @@ -2187,7 +2252,7 @@ void cBlockArea::ExpandNibbles(NIBBLEARRAY & a_Array, int a_SubMinX, int a_AddMa 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 = (size_t)(NewSizeX * NewSizeY * NewSizeZ); + size_t BlockCount = static_cast<size_t>(NewSizeX * NewSizeY * NewSizeZ); NIBBLETYPE * NewNibbles = new NIBBLETYPE[BlockCount]; memset(NewNibbles, 0, BlockCount * sizeof(NIBBLETYPE)); int OldIndex = 0; |