From 66e73a2d682f02224a2c84319f6db03964ecbac2 Mon Sep 17 00:00:00 2001 From: Mattes D Date: Tue, 24 Sep 2019 14:20:50 +0200 Subject: NBTChunkSerializer: Cleaned up interface. Removed dependency on cChunkDataCallback. Moved all the serializing code into a worker class. Changed the serialization into a single-call action. --- src/WorldStorage/WSSAnvil.cpp | 61 ++----------------------------------------- 1 file changed, 2 insertions(+), 59 deletions(-) (limited to 'src/WorldStorage/WSSAnvil.cpp') diff --git a/src/WorldStorage/WSSAnvil.cpp b/src/WorldStorage/WSSAnvil.cpp index d2f3284f5..8c6c9fb67 100755 --- a/src/WorldStorage/WSSAnvil.cpp +++ b/src/WorldStorage/WSSAnvil.cpp @@ -491,68 +491,11 @@ void cWSSAnvil::CopyNBTData(const cParsedNBT & a_NBT, int a_Tag, const AString & bool cWSSAnvil::SaveChunkToNBT(const cChunkCoords & a_Chunk, cFastNBTWriter & a_Writer) { - a_Writer.BeginCompound("Level"); - a_Writer.AddInt("xPos", a_Chunk.m_ChunkX); - a_Writer.AddInt("zPos", a_Chunk.m_ChunkZ); - - cNBTChunkSerializer Serializer(a_Writer); - if (!m_World->GetChunkData(a_Chunk.m_ChunkX, a_Chunk.m_ChunkZ, Serializer)) + if (!NBTChunkSerializer::serialize(*m_World, a_Chunk, a_Writer)) { - LOGWARNING("Cannot get chunk [%d, %d] data for NBT saving", a_Chunk.m_ChunkX, a_Chunk.m_ChunkZ); + LOGWARNING("Failed to save chunk %s.", a_Chunk.ToString()); return false; } - Serializer.Finish(); // Close NBT tags - - // Save biomes, both MCS (IntArray) and MC-vanilla (ByteArray): - if (Serializer.m_BiomesAreValid) - { - a_Writer.AddByteArray("Biomes", reinterpret_cast(Serializer.m_VanillaBiomes), ARRAYCOUNT(Serializer.m_VanillaBiomes)); - a_Writer.AddIntArray ("MCSBiomes", reinterpret_cast(Serializer.m_Biomes), ARRAYCOUNT(Serializer.m_Biomes)); - } - - // Save heightmap (Vanilla require this): - a_Writer.AddIntArray("HeightMap", reinterpret_cast(Serializer.m_VanillaHeightMap), ARRAYCOUNT(Serializer.m_VanillaHeightMap)); - - // Save blockdata: - a_Writer.BeginList("Sections", TAG_Compound); - for (size_t Y = 0; Y != cChunkData::NumSections; ++Y) - { - auto Section = Serializer.m_Data.GetSection(Y); - if (Section == nullptr) - { - continue; - } - - a_Writer.BeginCompound(""); - a_Writer.AddByteArray("Blocks", reinterpret_cast(Section->m_BlockTypes), ARRAYCOUNT(Section->m_BlockTypes)); - a_Writer.AddByteArray("Data", reinterpret_cast(Section->m_BlockMetas), ARRAYCOUNT(Section->m_BlockMetas)); - - #ifdef DEBUG_SKYLIGHT - a_Writer.AddByteArray("BlockLight", reinterpret_cast(Section->m_BlockSkyLight), ARRAYCOUNT(Section->m_BlockSkyLight)); - #else - a_Writer.AddByteArray("BlockLight", reinterpret_cast(Section->m_BlockLight), ARRAYCOUNT(Section->m_BlockLight)); - #endif - - a_Writer.AddByteArray("SkyLight", reinterpret_cast(Section->m_BlockSkyLight), ARRAYCOUNT(Section->m_BlockSkyLight)); - a_Writer.AddByte("Y", static_cast(Y)); - a_Writer.EndCompound(); - } - a_Writer.EndList(); // "Sections" - - // Store the information that the lighting is valid. - // For compatibility reason, the default is "invalid" (missing) - this means older data is re-lighted upon loading. - if (Serializer.IsLightValid()) - { - a_Writer.AddByte("MCSIsLightValid", 1); - } - - // Save the world age to the chunk data. Required by vanilla and mcedit. - a_Writer.AddLong("LastUpdate", m_World->GetWorldAge()); - - // Store the flag that the chunk has all the ores, trees, dungeons etc. MCS chunks are always complete. - a_Writer.AddByte("TerrainPopulated", 1); - - a_Writer.EndCompound(); // "Level" return true; } -- cgit v1.2.3