From 868cd94ee9a5a0638c014a4cc42224f01ff234c8 Mon Sep 17 00:00:00 2001 From: Tiger Wang Date: Fri, 5 Mar 2021 13:03:55 +0000 Subject: Prepare ChunkData for BlockState storage (#5105) * Rename ChunkData Creatable test * Add missing Y-check in RedstoneWireHandler * Remove ChunkDef.h dependency in Scoreboard * Prepare ChunkData for BlockState storage + Split chunk block, meta, block & sky light storage + Load the height map from disk - Reduce duplicated code in ChunkData - Remove saving MCSBiomes, there aren't any - Remove the allocation pool, ref #4315, #3864 * fixed build * fixed test * fixed the debug compile Co-authored-by: 12xx12 <44411062+12xx12@users.noreply.github.com> --- src/SetChunkData.cpp | 157 --------------------------------------------------- 1 file changed, 157 deletions(-) delete mode 100644 src/SetChunkData.cpp (limited to 'src/SetChunkData.cpp') diff --git a/src/SetChunkData.cpp b/src/SetChunkData.cpp deleted file mode 100644 index 8f850dec4..000000000 --- a/src/SetChunkData.cpp +++ /dev/null @@ -1,157 +0,0 @@ - -// SetChunkData.cpp - -// Implements the cSetChunkData class used for sending loaded / generated chunk - -#include "Globals.h" -#include "SetChunkData.h" -#include "BlockEntities/BlockEntity.h" -#include "Entities/Entity.h" - -namespace -{ -struct sMemCallbacks: - cAllocationPool::cStarvationCallbacks -{ - virtual void OnStartUsingReserve() override {} - virtual void OnEndUsingReserve() override {} - virtual void OnOutOfReserve() override {} -}; -} // namespace (anonymous) - - - - - -cSetChunkData::cSetChunkData(int a_ChunkX, int a_ChunkZ, bool a_ShouldMarkDirty) : - m_ChunkX(a_ChunkX), - m_ChunkZ(a_ChunkZ), - m_Pool(std::make_unique(), 0u, cChunkData::NumSections), - m_ChunkData(m_Pool), - m_IsLightValid(false), - m_IsHeightMapValid(false), - m_AreBiomesValid(false), - m_ShouldMarkDirty(a_ShouldMarkDirty) -{ -} - - - - - -cSetChunkData::cSetChunkData( - int a_ChunkX, int a_ChunkZ, - const BLOCKTYPE * a_BlockTypes, - const NIBBLETYPE * a_BlockMetas, - const NIBBLETYPE * a_BlockLight, - const NIBBLETYPE * a_SkyLight, - const cChunkDef::HeightMap * a_HeightMap, - const cChunkDef::BiomeMap * a_Biomes, - cEntityList && a_Entities, - cBlockEntities && a_BlockEntities, - bool a_ShouldMarkDirty -) : - cSetChunkData(a_ChunkX, a_ChunkZ, a_ShouldMarkDirty) -{ - // Check the params' validity: - ASSERT(a_BlockTypes != nullptr); - ASSERT(a_BlockMetas != nullptr); - - // Copy block types and metas: - m_ChunkData.SetBlockTypes(a_BlockTypes); - m_ChunkData.SetMetas(a_BlockMetas); - - // Copy lights, if both given: - if ((a_BlockLight != nullptr) && (a_SkyLight != nullptr)) - { - m_ChunkData.SetBlockLight(a_BlockLight); - m_ChunkData.SetSkyLight(a_SkyLight); - m_IsLightValid = true; - } - - // Copy the heightmap, if available: - if (a_HeightMap != nullptr) - { - memcpy(m_HeightMap, a_HeightMap, sizeof(m_HeightMap)); - m_IsHeightMapValid = true; - } - - // Copy biomes, if available: - if (a_Biomes != nullptr) - { - memcpy(m_Biomes, a_Biomes, sizeof(m_Biomes)); - m_AreBiomesValid = true; - } - - // Move entities and blockentities: - m_Entities = std::move(a_Entities); - m_BlockEntities = std::move(a_BlockEntities); -} - - - - - -void cSetChunkData::CalculateHeightMap(void) -{ - // Find the heighest present section in the chunk - size_t MaxSection = 0; - for (size_t i = cChunkData::NumSections - 1; i != 0; --i) - { - if (m_ChunkData.GetSection(i) != nullptr) - { - MaxSection = i; - break; - } - } - const int MaxHeight = static_cast(MaxSection + 1) * cChunkData::SectionHeight - 1; - - for (int x = 0; x < cChunkDef::Width; x++) - { - for (int z = 0; z < cChunkDef::Width; z++) - { - for (int y = MaxHeight; y > -1; y--) - { - if (m_ChunkData.GetBlock({x, y, z}) != E_BLOCK_AIR) - { - m_HeightMap[x + z * cChunkDef::Width] = static_cast(y); - break; - } - } // for y - } // for z - } // for x - m_IsHeightMapValid = true; -} - - - - - -void cSetChunkData::RemoveInvalidBlockEntities(void) -{ - for (cBlockEntities::iterator itr = m_BlockEntities.begin(); itr != m_BlockEntities.end();) - { - auto & BlockEntity = itr->second; - BLOCKTYPE EntityBlockType = BlockEntity->GetBlockType(); - BLOCKTYPE WorldBlockType = m_ChunkData.GetBlock({BlockEntity->GetRelX(), BlockEntity->GetPosY(), BlockEntity->GetRelZ()}); - if (EntityBlockType != WorldBlockType) - { - // Bad blocktype, remove the block entity: - FLOGD("Block entity blocktype mismatch at {0}: entity for blocktype {1}({2}) in block {3}({4}). Deleting the block entity.", - BlockEntity->GetPos(), - ItemTypeToString(EntityBlockType), EntityBlockType, - ItemTypeToString(WorldBlockType), WorldBlockType - ); - itr = m_BlockEntities.erase(itr); - } - else - { - // Good blocktype, keep the block entity: - ++itr; - } - } // for itr - m_BlockEntities[] -} - - - - -- cgit v1.2.3