Actually it seems to screw up after the Biome data
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_ChunkY, a_Chunk.m_ChunkZ, Serializer))
{
return false;
}
Serializer.Finish(); // Close NBT tags
a_Writer.AddString("TestString1", "o hai I'm string");
a_Writer.AddDouble("TestDouble1", 1.23);
a_Writer.AddFloat("TestFloat1", 1.23f);
a_Writer.AddInt("TestInt1", 2);
a_Writer.AddLong("TestLong1", 1234);
a_Writer.AddShort("TestShort1", 1234);
a_Writer.AddByte("TestByte1", 34);
// Save biomes, both MCS (IntArray) and MC-vanilla (ByteArray):
if (Serializer.m_BiomesAreValid)
{
a_Writer.AddByteArray("Biomes", (const char *)(Serializer.m_VanillaBiomes), ARRAYCOUNT(Serializer.m_VanillaBiomes));
a_Writer.AddIntArray ("MCSBiomes", (const int *)(Serializer.m_Biomes), ARRAYCOUNT(Serializer.m_Biomes));
}
a_Writer.AddString("TestString2", "o hai I'm string");
a_Writer.AddDouble("TestDouble2", 1.23);
a_Writer.AddFloat("TestFloat2", 1.23f);
a_Writer.AddInt("TestInt2", 2);
a_Writer.AddLong("TestLong2", 1234);
a_Writer.AddShort("TestShort2", 1234);
a_Writer.AddByte("TestByte2", 34);
a_Writer.AddIntArray("TestIntArray", (const int *)Serializer.m_Biomes, 2);
// Save blockdata:
a_Writer.BeginList("Sections", TAG_Compound);
int SliceSizeBlock = cChunkDef::Width * cChunkDef::Width * 16;
int SliceSizeNibble = SliceSizeBlock / 2;
const char * BlockTypes = (const char *)(Serializer.m_BlockTypes);
const char * BlockMetas = (const char *)(Serializer.m_BlockMetas);
const char * BlockLight = (const char *)(Serializer.m_BlockLight);
const char * BlockSkyLight = (const char *)(Serializer.m_BlockSkyLight);
a_Writer.AddIntArray("TestIntArray2", (const int *)Serializer.m_Biomes, 2);
for (int Y = 0; Y < 16; Y++)
{
a_Writer.BeginCompound("");
a_Writer.AddByteArray("Blocks", BlockTypes + Y * SliceSizeBlock, SliceSizeBlock);
a_Writer.AddByteArray("Data", BlockMetas + Y * SliceSizeNibble, SliceSizeNibble);
a_Writer.AddByteArray("SkyLight", BlockSkyLight + Y * SliceSizeNibble, SliceSizeNibble);
a_Writer.AddByteArray("BlockLight", BlockLight + Y * SliceSizeNibble, SliceSizeNibble);
a_Writer.AddByte("Y", (unsigned char)Y);
a_Writer.EndCompound();
}
a_Writer.EndList(); // "Sections"
a_Writer.AddIntArray("TestIntArray3", (const int *)Serializer.m_Biomes, 2);
a_Writer.AddString("TestString3", "o hai I'm string");
a_Writer.AddDouble("TestDouble3", 1.23);
a_Writer.AddFloat("TestFloat3", 1.23f);
a_Writer.AddInt("TestInt3", 2);
a_Writer.AddLong("TestLong3", 1234);
a_Writer.AddShort("TestShort3", 1234);
a_Writer.AddByte("TestByte3", 34);
// 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);
}
a_Writer.EndCompound(); // "Level"
Gives this:
![[Image: ruxiyc.png]](http://i50.tinypic.com/ruxiyc.png)