| 941 | |
| 942 | |
| 943 | bool cWSSCompact::cPAKFile::SaveChunkToData(const cChunkCoords & a_Chunk, cWorld * a_World) |
| 944 | { |
| 945 | // Serialize the chunk: |
| 946 | cJsonChunkSerializer Serializer; |
| 947 | if (!a_World->GetChunkData(a_Chunk.m_ChunkX, a_Chunk.m_ChunkZ, Serializer)) |
| 948 | { |
| 949 | // Chunk not valid |
| 950 | LOG("cWSSCompact: Trying to save chunk [%d, %d, %d] that has no data, ignoring request.", a_Chunk.m_ChunkX, a_Chunk.m_ChunkY, a_Chunk.m_ChunkZ); |
| 951 | return false; |
| 952 | } |
| 953 | |
| 954 | AString Data; |
| 955 | Data.assign((const char *)Serializer.GetBlockData(), cChunkDef::BlockDataSize); |
| 956 | if (Serializer.HasJsonData()) |
| 957 | { |
| 958 | AString JsonData; |
| 959 | Json::StyledWriter writer; |
| 960 | JsonData = writer.write(Serializer.GetRoot()); |
| 961 | Data.append(JsonData); |
| 962 | } |
| 963 | |
| 964 | // Compress the data: |
| 965 | AString CompressedData; |
| 966 | int errorcode = CompressString(Data.data(), Data.size(), CompressedData, m_CompressionFactor); |
| 967 | if ( errorcode != Z_OK ) |
| 968 | { |
| 969 | LOGERROR("Error %i compressing data for chunk [%d, %d, %d]", errorcode, a_Chunk.m_ChunkX, a_Chunk.m_ChunkY, a_Chunk.m_ChunkZ); |
| 970 | return false; |
| 971 | } |
| 972 | |
| 973 | // Erase any existing data for the chunk: |
| 974 | EraseChunkData(a_Chunk); |
| 975 | |
| 976 | // Save the header: |
| 977 | sChunkHeader * Header = new sChunkHeader; |
| 978 | if (Header == NULL) |
| 979 | { |
| 980 | LOGWARNING("Cannot create a new chunk header to save chunk [%d, %d, %d]", a_Chunk.m_ChunkX, a_Chunk.m_ChunkY, a_Chunk.m_ChunkZ); |
| 981 | return false; |
| 982 | } |
| 983 | Header->m_CompressedSize = (int)CompressedData.size(); |
| 984 | Header->m_ChunkX = a_Chunk.m_ChunkX; |
| 985 | Header->m_ChunkZ = a_Chunk.m_ChunkZ; |
| 986 | Header->m_UncompressedSize = (int)Data.size(); |
| 987 | m_ChunkHeaders.push_back(Header); |
| 988 | |
| 989 | m_DataContents.append(CompressedData.data(), CompressedData.size()); |
| 990 | |
| 991 | m_NumDirty++; |
| 992 | return true; |
| 993 | } |
| 994 | |
| 995 | |
| 996 |
nothing calls this directly
no test coverage detected