diff --git a/src/Chunk.cpp b/src/Chunk.cpp index adbe94cd0..a73bf7ca9 100644 --- a/src/Chunk.cpp +++ b/src/Chunk.cpp @@ -239,17 +239,15 @@ void cChunk::MarkLoadFailed(void) void cChunk::GetAllData(cChunkDataCallback & a_Callback) { a_Callback.HeightMap (&m_HeightMap); - a_Callback.BiomeData(&m_BiomeMap); + a_Callback.BiomeData (&m_BiomeMap); std::vector Blocks; Blocks.reserve(cChunkDef::NumBlocks); for (std::vector>::const_iterator itr = m_BlockTypes.begin(); itr != m_BlockTypes.end(); ++itr) { - for (std::vector::const_iterator dataitr = itr->begin(); dataitr != itr->end(); ++dataitr) - { - Blocks.push_back(*dataitr); - } + Blocks.insert(Blocks.end(), itr->begin(), itr->end()); } + a_Callback.BlockTypes (Blocks.data()); a_Callback.BlockMeta (m_BlockMeta); a_Callback.LightIsValid (m_IsLightValid); @@ -272,56 +270,63 @@ void cChunk::GetAllData(cChunkDataCallback & a_Callback) void cChunk::SetAllData( - const BLOCKTYPE * a_BlockTypes, + const BLOCKTYPE * a_BlockTypes, const NIBBLETYPE * a_BlockMeta, const NIBBLETYPE * a_BlockLight, const NIBBLETYPE * a_BlockSkyLight, const HeightMap * a_HeightMap, const BiomeMap & a_BiomeMap, cBlockEntityList & a_BlockEntities -) + ) { memcpy(m_BiomeMap, a_BiomeMap, sizeof(m_BiomeMap)); - + if (a_HeightMap != NULL) { memcpy(m_HeightMap, a_HeightMap, sizeof(m_HeightMap)); } bool FoundNonAir = false; + int PosYWhereNonEmptyStarts = 0; m_BlockTypes.clear(); - for (int y = cChunkDef::Height - 1; y >= 0; y--) - { - if (!FoundNonAir) - { - for (int x = 0; x < cChunkDef::Width; x++) - { - for (int z = 0; z < cChunkDef::Width; z++) - { - int Index = cChunkDef::MakeIndexNoCheck(x, y, z); + m_BlockTypes.reserve(Height / 2); - if (!FoundNonAir && (a_BlockTypes[Index] != E_BLOCK_AIR)) - { - FoundNonAir = true; - } + for (int y = Height; y >= 0; y--) + { + for (int z = 0; z < Width; z++) + { + for (int x = 0; x < Width; x++) + { + int Index = MakeIndexNoCheck(x, y, z); + + if (!FoundNonAir && (a_BlockTypes[Index] != E_BLOCK_AIR)) + { + FoundNonAir = true; + PosYWhereNonEmptyStarts = y; + goto foundair; } } } + } - if (FoundNonAir) +foundair: + if (FoundNonAir) + { + for (int y = 0; y <= PosYWhereNonEmptyStarts; y++) { std::vector Blocks; - for (int x = 0; x < cChunkDef::Width; x++) + Blocks.reserve(Width * Width); + for (int z = 0; z < Width; z++) { - for (int z = 0; z < cChunkDef::Width; z++) + for (int x = 0; x < Width; x++) { - int Index = cChunkDef::MakeIndexNoCheck(x, y, z); - Blocks.insert(Blocks.begin(), a_BlockTypes[Index]); + int Index = MakeIndexNoCheck(x, y, z); + Blocks.push_back(a_BlockTypes[Index]); } } - m_BlockTypes.insert(m_BlockTypes.begin(), Blocks); - } - } // for y + m_BlockTypes.push_back(Blocks); + } // for y + } memcpy(m_BlockMeta, a_BlockMeta, sizeof(m_BlockMeta)); if (a_BlockLight != NULL) @@ -391,10 +396,7 @@ void cChunk::GetBlockTypes(BLOCKTYPE * a_BlockTypes) Blocks.reserve(cChunkDef::NumBlocks); for (std::vector>::const_iterator itr = m_BlockTypes.begin(); itr != m_BlockTypes.end(); ++itr) { - for (std::vector::const_iterator dataitr = itr->begin(); dataitr != itr->end(); ++dataitr) - { - Blocks.push_back(*dataitr); - } + Blocks.insert(Blocks.end(), itr->begin(), itr->end()); } memcpy(a_BlockTypes, Blocks.data(), NumBlocks);