| 840 | |
| 841 | |
| 842 | bool 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); |
nothing calls this directly
no test coverage detected