MCPcopy Create free account
hub / github.com/cuberite/cuberite / LoadChunkFromData

Method LoadChunkFromData

src/WorldStorage/WSSCompact.cpp:842–913  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

840
841
842bool cWSSCompact::LoadChunkFromData(const cChunkCoords & a_Chunk, int & a_UncompressedSize, const AString & a_Data, cWorld * a_World)
843{
844 // Crude data integrity check:
845 if (a_UncompressedSize < cChunkDef::BlockDataSize)
846 {
847 LOGWARNING("Chunk [%d, %d] has too short decompressed data (%d bytes out of %d needed), erasing",
848 a_Chunk.m_ChunkX, a_Chunk.m_ChunkZ,
849 a_UncompressedSize, cChunkDef::BlockDataSize
850 );
851 EraseChunkData(a_Chunk);
852 return false;
853 }
854
855 // Decompress the data:
856 AString UncompressedData;
857 int errorcode = UncompressString(a_Data.data(), a_Data.size(), UncompressedData, a_UncompressedSize);
858 if (errorcode != Z_OK)
859 {
860 LOGERROR("Error %d decompressing data for chunk [%d, %d]",
861 errorcode,
862 a_Chunk.m_ChunkX, a_Chunk.m_ChunkZ
863 );
864 return false;
865 }
866
867 if (a_UncompressedSize != (int)UncompressedData.size())
868 {
869 LOGWARNING("Uncompressed data size differs (exp %d bytes, got " SIZE_T_FMT ") for chunk [%d, %d]",
870 a_UncompressedSize, UncompressedData.size(),
871 a_Chunk.m_ChunkX, a_Chunk.m_ChunkZ
872 );
873 return false;
874 }
875
876 cEntityList Entities;
877 cBlockEntityList BlockEntities;
878 bool IsLightValid = false;
879
880 if (a_UncompressedSize > cChunkDef::BlockDataSize)
881 {
882 Json::Value root; // will contain the root value after parsing.
883 Json::Reader reader;
884 if ( !reader.parse( UncompressedData.data() + cChunkDef::BlockDataSize, root, false ) )
885 {
886 LOGERROR("Failed to parse trailing JSON in chunk [%d, %d]!",
887 a_Chunk.m_ChunkX, a_Chunk.m_ChunkZ
888 );
889 }
890 else
891 {
892 LoadEntitiesFromJson(root, Entities, BlockEntities, a_World);
893 IsLightValid = root.get("IsLightValid", false).asBool();
894 }
895 }
896
897 BLOCKTYPE * BlockData = (BLOCKTYPE *)UncompressedData.data();
898 NIBBLETYPE * MetaData = (NIBBLETYPE *)(BlockData + MetaOffset);
899 NIBBLETYPE * BlockLight = (NIBBLETYPE *)(BlockData + LightOffset);

Callers

nothing calls this directly

Calls 7

UncompressStringFunction · 0.85
LOGERRORFunction · 0.85
sizeMethod · 0.80
parseMethod · 0.80
asBoolMethod · 0.80
getMethod · 0.80
SetChunkDataMethod · 0.45

Tested by

no test coverage detected